worldorbit 2.5.16 → 2.5.17

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 (34) hide show
  1. package/README.md +1 -1
  2. package/dist/browser/core/dist/index.js +750 -73
  3. package/dist/browser/editor/dist/index.js +1303 -135
  4. package/dist/browser/markdown/dist/index.js +631 -72
  5. package/dist/browser/viewer/dist/index.js +658 -77
  6. package/dist/unpkg/core/dist/index.js +750 -73
  7. package/dist/unpkg/editor/dist/index.js +1303 -135
  8. package/dist/unpkg/markdown/dist/index.js +631 -72
  9. package/dist/unpkg/viewer/dist/index.js +658 -77
  10. package/dist/unpkg/worldorbit-core.min.js +12 -12
  11. package/dist/unpkg/worldorbit-editor.min.js +284 -202
  12. package/dist/unpkg/worldorbit-markdown.min.js +66 -58
  13. package/dist/unpkg/worldorbit-viewer.min.js +76 -68
  14. package/dist/unpkg/worldorbit.js +797 -78
  15. package/dist/unpkg/worldorbit.min.js +80 -72
  16. package/package.json +1 -1
  17. package/packages/core/dist/atlas-edit.js +74 -0
  18. package/packages/core/dist/atlas-validate.js +122 -8
  19. package/packages/core/dist/draft-parse.js +212 -8
  20. package/packages/core/dist/draft.d.ts +5 -2
  21. package/packages/core/dist/draft.js +59 -3
  22. package/packages/core/dist/format.js +63 -1
  23. package/packages/core/dist/normalize.js +1 -0
  24. package/packages/core/dist/scene.js +248 -46
  25. package/packages/core/dist/types.d.ts +41 -2
  26. package/packages/editor/dist/editor.js +597 -61
  27. package/packages/editor/dist/types.d.ts +3 -1
  28. package/packages/viewer/dist/atlas-state.js +6 -0
  29. package/packages/viewer/dist/atlas-viewer.js +1 -0
  30. package/packages/viewer/dist/render.js +31 -2
  31. package/packages/viewer/dist/theme.js +1 -0
  32. package/packages/viewer/dist/tooltip.js +9 -0
  33. package/packages/viewer/dist/types.d.ts +8 -1
  34. package/packages/viewer/dist/viewer.js +12 -1
@@ -1,12 +1,12 @@
1
- "use strict";var WorldOrbitCore=(()=>{var Ye=Object.defineProperty;var Dn=Object.getOwnPropertyDescriptor;var Sn=Object.getOwnPropertyNames;var Fn=Object.prototype.hasOwnProperty;var Mn=(e,t)=>{for(var n in t)Ye(e,n,{get:t[n],enumerable:!0})},Rn=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Sn(t))!Fn.call(e,i)&&i!==n&&Ye(e,i,{get:()=>t[i],enumerable:!(r=Dn(t,i))||r.enumerable});return e};var Pn=e=>Rn(Ye({},"__esModule",{value:!0}),e);var Yo={};Mn(Yo,{WORLDORBIT_FIELD_KEYS:()=>ht,WORLDORBIT_FIELD_SCHEMAS:()=>Ge,WORLDORBIT_OBJECT_TYPES:()=>ie,WorldOrbitError:()=>d,cloneAtlasDocument:()=>Ue,createDiagnostic:()=>vt,createEmptyAtlasDocument:()=>ot,detectWorldOrbitSchemaVersion:()=>dt,diagnosticFromError:()=>D,extractWorldOrbitBlocks:()=>kn,formatAtlasDocument:()=>Pe,formatDocument:()=>Ee,formatDraftDocument:()=>Qe,getAtlasDocumentNode:()=>at,getFieldSchema:()=>L,isKnownFieldKey:()=>He,listAtlasDocumentPaths:()=>mn,load:()=>Uo,loadWorldOrbitSource:()=>We,loadWorldOrbitSourceWithDiagnostics:()=>ft,materializeAtlasDocument:()=>pe,materializeDraftDocument:()=>Ct,normalizeDocument:()=>C,normalizeWithDiagnostics:()=>It,parse:()=>xn,parseSafe:()=>Wo,parseWithDiagnostics:()=>je,parseWorldOrbit:()=>q,parseWorldOrbitAtlas:()=>Ve,parseWorldOrbitDraft:()=>an,removeAtlasDocumentNode:()=>yn,render:()=>Vo,renderDocumentToScene:()=>H,resolveAtlasDiagnosticPath:()=>ct,resolveAtlasDiagnostics:()=>lt,rotatePoint:()=>Dt,stringify:()=>qo,supportsObjectType:()=>Ke,tokenizeLine:()=>yt,tokenizeLineDetailed:()=>G,unitFamilyAllowsUnit:()=>oe,updateAtlasDocumentNode:()=>hn,upgradeDocumentToDraftV2:()=>Re,upgradeDocumentToV2:()=>fe,upsertAtlasDocumentNode:()=>st,validateAtlasDocumentWithDiagnostics:()=>gn,validateDocument:()=>z,validateDocumentWithDiagnostics:()=>$t});var d=class e extends Error{line;column;constructor(t,n,r){let i=n===void 0?"":` (line ${n}${r===void 0?"":`, column ${r}`})`;super(`${t}${i}`),this.name="WorldOrbitError",this.line=n,this.column=r}static fromLocation(t,n){return new e(t,n?.line,n?.column)}};var re=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],R=re.filter(e=>e!=="system"),_n=["star","planet","moon","asteroid","comet","structure","phenomenon"],mt=["structure","phenomenon"],W=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],En=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function g(e,t){return{key:e,...t}}var ie=new Set(re),Ge=new Map([g("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:W}),g("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:W,unitFamily:"distance"}),g("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:W,unitFamily:"distance"}),g("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:W}),g("period",{kind:"unit",placement:!0,arity:"single",objectTypes:W,unitFamily:"duration"}),g("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:W,unitFamily:"angle"}),g("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:W,unitFamily:"angle"}),g("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:W,unitFamily:"angle"}),g("at",{kind:"string",placement:!0,arity:"single",objectTypes:mt}),g("surface",{kind:"string",placement:!0,arity:"single",objectTypes:mt}),g("free",{kind:"string",placement:!0,arity:"single",objectTypes:En}),g("kind",{kind:"string",placement:!1,arity:"single",objectTypes:R}),g("class",{kind:"string",placement:!1,arity:"single",objectTypes:R}),g("culture",{kind:"string",placement:!1,arity:"single",objectTypes:R}),g("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:re}),g("color",{kind:"string",placement:!1,arity:"single",objectTypes:re}),g("image",{kind:"string",placement:!1,arity:"single",objectTypes:_n}),g("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:re}),g("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"radius"}),g("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"mass"}),g("density",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"generic"}),g("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"generic"}),g("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"generic"}),g("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:R}),g("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),g("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),g("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),g("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),g("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),g("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),g("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),g("on",{kind:"string",placement:!1,arity:"single",objectTypes:R}),g("source",{kind:"string",placement:!1,arity:"single",objectTypes:R}),g("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"duration"})].map(e=>[e.key,e])),ht=new Set(Ge.keys());function L(e){return Ge.get(e)}function He(e){return ht.has(e)}function Ke(e,t){return e.objectTypes.includes(t)}function oe(e,t){switch(e){case"distance":return t===null||["au","km","m","ly","pc","kpc","re","sol"].includes(t);case"radius":return t===null||["km","m","re","rj","sol"].includes(t);case"mass":return t===null||["me","mj","sol"].includes(t);case"duration":return t===null||["s","min","h","d","y","ky","my","gy"].includes(t);case"angle":return t===null||t==="deg";case"generic":return!0}}function yt(e){return G(e).map(t=>t.value)}function G(e,t={}){let n=[],r=t.columnOffset??0,i="",a=null,s=!1,o=!1,l=null,c=()=>{a!==null&&(n.push({value:i,column:a,quoted:s}),i="",a=null,s=!1)};for(let u=0;u<e.length;u++){let f=e[u],m=r+u+1;if(o&&f==="\\"){let p=e[u+1];if(p==='"'||p==="\\"){i+=p,u++;continue}}if(f==='"'){o?o=!1:(a===null&&(a=m),s=!0,l=m,o=!0);continue}if(!o&&/\s/.test(f)){c();continue}a===null&&(a=m),i+=f}if(o)throw new d("Unclosed quote in line",t.line,l??r+e.length);return c(),n}function $e(e){return e.match(/^\s*/)?.[0].length??0}function q(e){let t=e.split(/\r?\n/),n=[],r=null,i=!1,a=null;for(let s=0;s<t.length;s++){let o=t[s],l=s+1;if(!o.trim())continue;let c=$e(o),u=G(o.slice(c),{line:l,columnOffset:c});if(u.length!==0){if(c===0){i=!1,a=null;let f=Nn(u,l);n.push(f),r=f;continue}if(!r)throw new d("Indented line without parent object",l,c+1);if(u.length===1&&u[0].value==="info"){i=!0,a=c;continue}i&&c<=(a??0)&&(i=!1),i?r.infoEntries.push(zn(u,l)):r.blockFields.push(Cn(u,l))}}return{type:"document",objects:n}}function Nn(e,t){if(e.length<2)throw new d("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!ie.has(n.value))throw new d(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:Bn(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function Bn(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],a=L(i.value);if(!a)throw new d(`Unknown field "${i.value}"`,t,i.column);r++;let s=[];if(a.arity==="multiple")for(;r<e.length&&!He(e[r].value);)s.push(e[r]),r++;else{let o=e[r];o&&(s.push(o),r++)}if(s.length===0)throw new d(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:s.map(o=>o.value),location:{line:t,column:i.column}})}return n}function Cn(e,t){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);if(!L(e[0].value))throw new d(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function zn(e,t){if(e.length<2)throw new d("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}var gt=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Vn=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Un=/^[A-Za-z][A-Za-z0-9+.-]*:/;function C(e){let t=null,n=[];for(let r of e.objects){let i=Wn(r);if(r.objectType==="system"){if(t)throw d.fromLocation("Only one system object is allowed",r.location);t=i}else n.push(i)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",system:t,groups:[],relations:[],objects:n}}function Wn(e){let t=[...e.inlineFields,...e.blockFields];qn(e.objectType,t);let n=Yn(t),r=Gn(e.objectType,n),i=Hn(n),a=Xn(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof i.title=="string"?i.title:null,description:null,epoch:null,referencePlane:null,properties:i,info:a}:{type:e.objectType,id:e.name,properties:i,placement:r,info:a}}function qn(e,t){for(let n of t){let r=L(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(!Ke(r,e))throw d.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw d.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function Yn(e){let t=new Map;for(let n of e){if(t.has(n.key))throw d.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function Gn(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),a=t.has("free"),s=[n,r,i,a].filter(Boolean).length;if(s>1){let o=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw d.fromLocation("Object has multiple placement modes",o?.location)}if(e==="system"&&s>0)throw d.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:ke(t,"orbit"),distance:J(t,"distance"),semiMajor:J(t,"semiMajor"),eccentricity:er(t,"eccentricity"),period:J(t,"period"),angle:J(t,"angle"),inclination:J(t,"inclination"),phase:J(t,"phase")};if(r){let o=xe(t,"at"),l=ke(t,"at");return{mode:"at",target:l,reference:Jn(l,o.location)}}if(i)return{mode:"surface",target:ke(t,"surface")};if(a){let o=ke(t,"free"),l=Qn(o);return{mode:"free",distance:l??void 0,descriptor:l?void 0:o}}return null}function Hn(e){let t={};for(let[n,r]of e.entries()){let i=L(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=tr(r);break;case"number":t[n]=wt(Q(r),n,r.location);break;case"unit":t[n]=bt(Q(r),r.location,n);break;case"string":t[n]=Kn(n,r);break}}return t}function Kn(e,t){let n=t.values.join(" ").trim();return e==="image"&&Zn(n,t.location),n}function Zn(e,t){if(!e)throw d.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw d.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Un);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw d.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Xn(e){let t={};for(let n of e){if(n.key in t)throw d.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function Jn(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function bt(e,t,n){let r=e.match(gt);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let a=L(n);if(a?.unitFamily&&!oe(a.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Qn(e){let t=e.match(gt);return t?{value:Number(t[1]),unit:t[2]??null}:null}function J(e,t){if(!e.has(t))return;let n=xe(e,t);return bt(Q(n),n.location,t)}function er(e,t){if(!e.has(t))return;let n=xe(e,t);return wt(Q(n),t,n.location)}function wt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function tr(e){let t=Q(e).toLowerCase(),n=Vn.get(t);if(n===void 0)throw d.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function xe(e,t){let n=e.get(t);if(!n)throw new d(`Missing value for key "${t}"`);return n}function ke(e,t){return Q(xe(e,t))}function Q(e){if(e.values.length!==1)throw d.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var nr=new Set(["star","planet","moon","asteroid","comet"]);function z(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new d(`Duplicate object id "${r.id}"`);t.add(r.id),n.set(r.id,r)}for(let r of e.objects)if(r.placement){if((r.placement.mode==="orbit"||r.placement.mode==="surface")&&!t.has(r.placement.target))throw new d(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!nr.has(i.type))throw new d(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&rr(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&ir(r,r.placement.reference,t))}}function rr(e,t,n){if(!n.has(t.primary))throw new d(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new d(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function ir(e,t,n){if(!n.has(t.objectId))throw new d(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function vt(e){return{...e}}function D(e,t,n=`${t}.failed`){return e instanceof d?{code:n,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:n,severity:"error",source:t,message:e.message}:{code:n,severity:"error",source:t,message:String(e)}}function je(e){let t;try{t=q(e)}catch(r){return{ok:!1,value:null,diagnostics:[D(r,"parse")]}}let n;try{n=C(t)}catch(r){return{ok:!1,value:null,diagnostics:[D(r,"normalize")]}}try{z(n)}catch(r){return{ok:!1,value:null,diagnostics:[D(r,"validate")]}}return{ok:!0,value:{ast:t,document:n},diagnostics:[]}}function It(e){try{return{ok:!0,value:C(e),diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[D(t,"normalize")]}}}function $t(e){try{return z(e),{ok:!0,value:e,diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[D(t,"validate")]}}}var ae=1495978707e-1,or=6371,ar=71492,sr=695700,lr=63241.077,cr=206264.806,ur=206264806,At=.68,dr=.2,Lt=28;function H(e,t={}){let n=pr(t),r=n.width,i=n.height,a=n.padding,s=fr(e),o=hr(e,t.projection),l=yr(s,t.scaleModel),c=br(s),u=e.system?.id??null,f=new Map(e.objects.map(h=>[h.id,h])),m=Jr(e.objects,f),p=new Map,b=[],v=[],j=[],A=[],y=[],I=new Map,P=new Map;for(let h of e.objects){let M=h.placement;if(!M){j.push(h);continue}if(M.mode==="orbit"){jt(P,M.target,h);continue}if(M.mode==="surface"){jt(I,M.target,h);continue}if(M.mode==="at"){y.push(h);continue}A.push(h)}let N=A.length>0?r*.42:r/2,$=i/2,_={orbitChildren:P,surfaceChildren:I,objectMap:f,spacingFactor:c,projection:o,scaleModel:l},S=j.find(h=>h.type==="star")??j[0]??null;S&&Ze(S,N,$,0,p,b,v,_);let B=j.filter(h=>h.id!==S?.id);if(B.length>0){let h=Math.min(r,i)*.28*c*l.orbitDistanceMultiplier;B.forEach((M,k)=>{let qe=ce(k,B.length,-Math.PI/2),Y=ue(qe,h,o,1);Ze(M,N+Y.x,$+Y.y,0,p,b,v,_)})}A.forEach((h,M)=>{let k=r-a-140-ii(h.placement?.mode==="free"?h.placement.distance:void 0,l),qe=Math.max(76,(i-a*2-180)/Math.max(1,A.length)*c)*l.freePlacementMultiplier,Y=a+92+M*qe;p.set(h.id,{object:h,x:k,y:Y,radius:Le(h,0,l),sortKey:Se(k,Y,0)}),v.push({object:h,groupId:m.groupIds.get(h.id)??null,x1:k-60,y1:Y,x2:k-18,y2:Y,mode:"free"}),Te(h,p,b,v,_,1)}),y.forEach((h,M)=>{if(p.has(h.id)||!h.placement||h.placement.mode!=="at")return;let k=Zr(h.placement.reference,p,f,M,y.length,r,i,a,_);p.set(h.id,{object:h,x:k.x,y:k.y,radius:Le(h,2,l),sortKey:Se(k.x,k.y,2),anchorX:k.anchorX,anchorY:k.anchorY}),k.anchorX!==void 0&&k.anchorY!==void 0&&v.push({object:h,groupId:m.groupIds.get(h.id)??null,x1:k.anchorX,y1:k.anchorY,x2:k.x,y2:k.y,mode:"at"}),Te(h,p,b,v,_,2)});let F=[...p.values()].map(h=>wr(h,l,m)),we=b.map(h=>vr(h,m.groupIds.get(h.object.id)??null)),ve=v.map(h=>Ir(h)),Ie=$r(F,i,l.labelMultiplier),pt=Or(e,F),jn=kr(we,pt,ve,F,Ie),On=xr(F,we,ve,Ie,m),Tn=jr(e,F),An=Tr(e,o,n.preset,m,f),Ln=zr(r,i,F,we,ve,Ie);return{width:r,height:i,padding:a,renderPreset:n.preset,projection:o,scaleModel:l,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:`${Ot(o)} view - ${Ot(s)} layout`,systemId:u,viewMode:o,layoutPreset:s,metadata:{format:e.format,version:e.version,view:o,scale:String(e.system?.properties.scale??s),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom"},contentBounds:Ln,layers:jn,groups:On,semanticGroups:Tn,viewpoints:An,objects:F,orbitVisuals:we,relations:pt,leaders:ve,labels:Ie}}function Dt(e,t,n){let r=Me(n),i=Math.cos(r),a=Math.sin(r),s=e.x-t.x,o=e.y-t.y;return{x:t.x+s*i-o*a,y:t.y+s*a+o*i}}function fr(e){switch(String(e.system?.properties.scale??"balanced").toLowerCase()){case"compressed":case"compact":return"compact";case"expanded":case"presentation":return"presentation";default:return"balanced"}}function pr(e){let t=mr(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function mr(e){switch(e){case"presentation":return{width:1440,height:900,padding:88};case"atlas-card":return{width:960,height:560,padding:56};case"markdown":return{width:920,height:540,padding:48};default:return{width:1200,height:780,padding:72}}}function hr(e,t){return t==="topdown"||t==="isometric"?t:String(e.system?.properties.view??"topdown").toLowerCase()==="isometric"?"isometric":"topdown"}function yr(e,t){return{...gr(e),...t}}function gr(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40}}}function br(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function wr(e,t,n){let{object:r,x:i,y:a,radius:s,sortKey:o,anchorX:l,anchorY:c}=e,u=r.renderHints?.renderPriority??0;return{renderId:de(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:i,y:a,radius:s,visualRadius:ri(r,s,t),sortKey:o+u*.001,anchorX:l,anchorY:c,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:ai(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function vr(e,t){return{renderId:`${de(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,semanticGroupIds:[...e.object.groups??[]],kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0||e.object.renderHints?.renderOrbit===!1}}function Ir(e){return{renderId:`${de(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,semanticGroupIds:[...e.object.groups??[]],x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function $r(e,t,n){let r=[],i=[],a=[...e].filter(s=>!s.hidden&&s.object.renderHints?.renderLabel!==!1).sort((s,o)=>s.sortKey-o.sortKey);for(let s of a){let o=s.y>t*.62?-1:1,l=si(s,n),c=s.y+o*(s.radius+18*n),u=c+o*(16*n),f=kt(s.x,c,u,l,o),m=0;for(;i.some(p=>ti(p,f))&&m<10;)c+=o*14*n,u+=o*14*n,f=kt(s.x,c,u,l,o),m+=1;i.push(f),r.push({renderId:`${s.renderId}-label`,objectId:s.objectId,object:s.object,groupId:s.groupId,semanticGroupIds:[...s.semanticGroupIds],label:s.label,secondaryLabel:s.secondaryLabel,x:s.x,y:c,secondaryY:u,textAnchor:"middle",direction:o<0?"above":"below",hidden:s.hidden})}return r}function kr(e,t,n,r,i){let a=e.filter(o=>!o.hidden&&!!o.backArcPath).map(o=>o.renderId),s=e.filter(o=>!o.hidden).map(o=>o.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:n.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"orbits-back",renderIds:a},{id:"orbits-front",renderIds:s},{id:"relations",renderIds:t.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"objects",renderIds:r.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"labels",renderIds:i.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function xr(e,t,n,r,i){let a=new Map,s=o=>{if(!o)return null;let l=a.get(o);if(l)return l;let c=i.groupRoots.get(o)??null,u={renderId:o,rootObjectId:c,label:c??o,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:le(0,0,0,0)};return a.set(o,u),u};for(let o of e){let l=s(o.groupId);l&&!o.hidden&&l.objectIds.push(o.objectId)}for(let o of t){let l=s(o.groupId);l&&!o.hidden&&l.orbitIds.push(o.objectId)}for(let o of n){let l=s(o.groupId);l&&!o.hidden&&l.leaderIds.push(o.objectId)}for(let o of r){let l=s(o.groupId);l&&!o.hidden&&l.labelIds.push(o.objectId)}for(let o of a.values())o.contentBounds=Qr(o,e,t,n,r);return[...a.values()].sort((o,l)=>o.label.localeCompare(l.label))}function jr(e,t){return[...e.groups].map(n=>({id:n.id,label:n.label,summary:n.summary,color:n.color,tags:[...n.tags],hidden:n.hidden,objectIds:t.filter(r=>!r.hidden&&r.semanticGroupIds.includes(n.id)).map(r=>r.objectId)})).sort((n,r)=>n.label.localeCompare(r.label))}function Or(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),a=n.get(r.to);return{renderId:`${de(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:i?.x??0,y1:i?.y??0,x2:a?.x??0,y2:a?.y??0,hidden:r.hidden||!i||!a||i.hidden||a.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function Tr(e,t,n,r,i){let a=Ar(e,t,n),s=new Map;for(let[c,u]of Object.entries(e.system?.info??{})){if(!c.startsWith("viewpoint."))continue;let[f,m,...p]=c.split(".");if(f!=="viewpoint"||!m||p.length===0)continue;let b=Nr(m);if(!b)continue;let v=p.join(".").toLowerCase(),j=s.get(b)??{id:b};Lr(j,v,u,e,t,n,r,i),s.set(b,j)}let o=[...s.values()].map(c=>Dr(c,t,n,i)).filter(Boolean),l=o.findIndex(c=>c.id===a.id);return l>=0?o.splice(l,1,{...a,...o[l],layers:{...a.layers,...o[l].layers},filter:o[l].filter??a.filter,generated:!1}):o.unshift(a),o.sort((c,u)=>c.id==="overview"?-1:u.id==="overview"?1:c.label.localeCompare(u.label))}function Ar(e,t,n){let r=e.system?.title??e.system?.properties.title;return{id:"overview",label:r?`${String(r)} Overview`:"Overview",summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,projection:t,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function Lr(e,t,n,r,i,a,s,o){let l=n.trim();switch(t){case"label":case"title":l&&(e.label=l);return;case"summary":case"description":l&&(e.summary=l);return;case"focus":case"object":l&&(e.focus=l);return;case"select":case"selection":l&&(e.select=l);return;case"projection":case"view":e.projection=Fr(l)??i;return;case"preset":e.preset=Mr(l)??a;return;case"rotation":case"angle":e.rotationDeg=St(l)??e.rotationDeg??0;return;case"zoom":case"scale":e.scale=Rr(l);return;case"layers":e.layers=Pr(l);return;case"query":e.filter={...e.filter??Oe(),query:l||null};return;case"types":case"objecttypes":e.filter={...e.filter??Oe(),objectTypes:_r(l)};return;case"tags":e.filter={...e.filter??Oe(),tags:Fe(l)};return;case"groups":e.filter={...e.filter??Oe(),groupIds:Er(l,r,s,o)};return}}function Dr(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,a=e.select&&r.has(e.select)?e.select:i,s=Sr(e.filter),o=e.label?.trim()||Br(e.id);return{id:e.id,label:o,summary:e.summary?.trim()||Cr(o,i,s),objectId:i,selectedObjectId:a,projection:e.projection??t,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:s,generated:!1}}function Oe(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Sr(e){if(!e)return null;let t={query:e.query?.trim()||null,objectTypes:[...new Set(e.objectTypes)],tags:[...new Set(e.tags)],groupIds:[...new Set(e.groupIds)]};return t.query||t.objectTypes.length>0||t.tags.length>0||t.groupIds.length>0?t:null}function Fr(e){return e.toLowerCase()==="isometric"?"isometric":e.toLowerCase()==="topdown"?"topdown":null}function Mr(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function St(e){let t=Number(e);return Number.isFinite(t)?t:null}function Rr(e){let t=St(e);return t!==null&&t>0?t:null}function Pr(e){let t={};for(let n of Fe(e)){let r=!n.startsWith("-")&&!n.startsWith("!"),i=n.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){t["orbits-back"]=r,t["orbits-front"]=r;continue}(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="relations"||i==="objects"||i==="labels"||i==="metadata")&&(t[i]=r)}return t}function _r(e){return Fe(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function Er(e,t,n,r){return Fe(e).map(i=>t.schemaVersion==="2.1"||t.groups.some(a=>a.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??se(i):(r.has(i),se(i)))}function Fe(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Nr(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Br(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Cr(e,t,n){let r=[e];return t&&r.push(`focus ${t}`),n?.objectTypes.length&&r.push(n.objectTypes.join("/")),n?.tags.length&&r.push(`tags ${n.tags.join(", ")}`),n?.query&&r.push(`query "${n.query}"`),r.join(" - ")}function zr(e,t,n,r,i,a){let s=Number.POSITIVE_INFINITY,o=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=(f,m)=>{s=Math.min(s,f),o=Math.min(o,m),l=Math.max(l,f),c=Math.max(c,m)};for(let f of r)f.hidden||Ft(f,u);for(let f of i)f.hidden||(u(f.x1,f.y1),u(f.x2,f.y2));for(let f of n)f.hidden||Mt(f,u);for(let f of a)f.hidden||Rt(f,u);return!Number.isFinite(s)||!Number.isFinite(o)?le(0,0,e,t):le(s,o,l,c)}function Ft(e,t){let n=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-n,e.cy-e.radius-n),t(e.cx+e.radius+n,e.cy+e.radius+n);return}let r=e.rx??e.radius??0,i=e.ry??e.radius??0,a=_t(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,Lt*2);for(let s of a)t(s.x-n,s.y-n),t(s.x+n,s.y+n)}function le(e,t,n,r){return{minX:e,minY:t,maxX:n,maxY:r,width:n-e,height:r-t,centerX:e+(n-e)/2,centerY:t+(r-t)/2}}function Mt(e,t){t(e.x-e.visualRadius-24,e.y-e.visualRadius-16),t(e.x+e.visualRadius+24,e.y+e.visualRadius+36)}function Rt(e,t){let r=li(e.label,e.secondaryLabel,1);t(e.x-r,e.y-18),t(e.x+r,e.y+8),t(e.x-r,e.secondaryY-14),t(e.x+r,e.secondaryY+8)}function Ze(e,t,n,r,i,a,s,o){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:Le(e,r,o.scaleModel),sortKey:Se(t,n,r)}),Te(e,i,a,s,o,r+1))}function Te(e,t,n,r,i,a){let s=t.get(e.id);if(!s)return;let o=[...i.orbitChildren.get(e.id)??[]].sort(Vr),l=Ur(o,s.radius,i.spacingFactor,i.scaleModel),c=Yr(o,l);o.forEach((f,m)=>{let p=Wr(f,m,o.length,s,l,c[m]??l.innerPx,i);n.push({object:f,parentId:e.id,kind:p.kind,cx:p.cx,cy:p.cy,radius:p.radius,rx:p.rx,ry:p.ry,rotationDeg:p.rotationDeg,band:p.band,bandThickness:p.bandThickness,frontArcPath:p.frontArcPath,backArcPath:p.backArcPath}),Ze(f,p.objectX,p.objectY,a,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((f,m)=>{let p=ce(m,u.length,-Math.PI/3),b=28*i.spacingFactor,v=ue(p,s.radius,i.projection,i.projection==="isometric"?.9:1),j=ue(p,s.radius+b,i.projection,i.projection==="isometric"?.9:1),A=s.x+v.x,y=s.y+v.y,I=s.x+j.x,P=s.y+j.y;t.set(f.id,{object:f,x:I,y:P,radius:Le(f,a+1,i.scaleModel),sortKey:Se(I,P,a+1),anchorX:A,anchorY:y}),r.push({object:f,groupId:i.objectMap.has(f.id)?se(ei(f,i.objectMap)):null,x1:A,y1:y,x2:I,y2:P,mode:"surface"}),Te(f,t,n,r,i,a+1)})}function Vr(e,t){let n=Ae(e),r=Ae(t);return n!==null&&r!==null&&n!==r?n-r:n!==null&&r===null?-1:n===null&&r!==null?1:e.id.localeCompare(t.id)}function Ur(e,t,n,r){let i=e.map(f=>Ae(f)),a=i.filter(f=>f!==null),s=t+56*n*r.orbitDistanceMultiplier,o=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(a.length===0)return{metrics:i,minMetric:0,maxMetric:0,metricSpread:0,innerPx:s,stepPx:o,pixelSpread:Math.max(o*Math.max(e.length-1,1),o),minimumGapPx:o*.42};let l=Math.min(...a),c=Math.max(...a),u=c-l;return{metrics:i,minMetric:l,maxMetric:c,metricSpread:u,innerPx:s,stepPx:o,pixelSpread:Math.max(o*Math.max(e.length-1,1),o),minimumGapPx:o*.42}}function Wr(e,t,n,r,i,a,s){let o=e.placement,l=e.type==="belt"||e.type==="ring";if(!o||o.mode!=="orbit"){let S=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:S,rotationDeg:0,band:l,bandThickness:l?12*s.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-S}}let c=x(typeof o.eccentricity=="number"?o.eccentricity:0,0,.92),u=a,f=Math.max(u*Math.sqrt(1-c*c),u*.18),m=Je(o.inclination)??0,p=s.projection==="isometric"?Math.max(dr,Math.cos(Me(m)))*At:1,b=Math.max(f*p,u*.14),v=Je(o.angle)??0,j=u*c,A=Nt(-j,0,v),y=r.x+A.x,I=r.y+A.y,P=Hr(o.phase,t,n),N=Et(y,I,u,b,v,P),$=s.projection==="topdown"&&c<=1e-4&&Math.abs(v)<=1e-4,_=l?Kr(e,u,i,s.scaleModel):void 0;return{kind:$?"circle":"ellipse",cx:$?r.x:y,cy:$?r.y:I,radius:$?u:void 0,rx:$?void 0:u,ry:$?void 0:b,rotationDeg:v,band:l,bandThickness:_,frontArcPath:s.projection==="isometric"||l?xt(y,I,u,b,v,0,Math.PI):void 0,backArcPath:s.projection==="isometric"||l?xt(y,I,u,b,v,Math.PI,Math.PI*2):void 0,objectX:N.x,objectY:N.y}}function qr(e,t){return t.innerPx+t.stepPx*Gr(Math.max(e,0)+1)}function Yr(e,t){let n=[];return e.forEach((r,i)=>{let a=Ae(r),s=t.innerPx+i*t.stepPx,o=a===null?s:qr(a,t),l=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(o,l))}),n}function Ae(e){return!e.placement||e.placement.mode!=="orbit"?null:De(e.placement.semiMajor??e.placement.distance??null)}function Gr(e){return Math.log(e)/Math.log(2)}function Hr(e,t,n){let r=e?Je(e):null;return r!==null?Me(r-90):ce(t,n,-Math.PI/2)}function Kr(e,t,n,r){let i=De(Xe(e.properties.inner)),a=De(Xe(e.properties.outer));if(i!==null&&a!==null){let o=Math.abs(a-i);if(n.metricSpread>0)return x(o/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let l=Math.max(Math.max(i,a),1e-4);return x(o/l*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function Zr(e,t,n,r,i,a,s,o,l){if(e.kind==="lagrange")return Xr(e,t,n,a,s);if(e.kind==="anchor"){let c=t.get(e.objectId);if(c){let u=ce(r,i,Math.PI/5),f=(c.radius+36)*l.scaleModel.labelMultiplier,m=ue(u,f,l.projection,l.projection==="isometric"?.92:1);return{x:c.x+m.x,y:c.y+m.y,anchorX:c.x,anchorY:c.y}}}if(e.kind==="named"){let c=t.get(e.name);if(c){let u=ce(r,i,Math.PI/6),f=(c.radius+36)*l.scaleModel.labelMultiplier,m=ue(u,f,l.projection,l.projection==="isometric"?.92:1);return{x:c.x+m.x,y:c.y+m.y,anchorX:c.x,anchorY:c.y}}}return{x:a-o-170,y:s-o-86-r*58*l.scaleModel.freePlacementMultiplier}}function Xr(e,t,n,r,i){let a=e.secondary?t.get(e.primary):ni(e.primary,t,n),s=t.get(e.secondary??e.primary);if(!a||!s)return{x:r*.7,y:i*.25};let o=s.x-a.x,l=s.y-a.y,c=Math.hypot(o,l)||1,u=o/c,f=l/c,m=-f,p=u,b=x(c*.25,24,68);switch(e.point){case"L1":return{x:s.x-u*b,y:s.y-f*b,anchorX:s.x,anchorY:s.y};case"L2":return{x:s.x+u*b,y:s.y+f*b,anchorX:s.x,anchorY:s.y};case"L3":return{x:a.x-u*b,y:a.y-f*b,anchorX:a.x,anchorY:a.y};case"L4":return{x:s.x+(u*.5-m*.8660254)*b,y:s.y+(f*.5-p*.8660254)*b,anchorX:s.x,anchorY:s.y};case"L5":return{x:s.x+(u*.5+m*.8660254)*b,y:s.y+(f*.5+p*.8660254)*b,anchorX:s.x,anchorY:s.y}}}function Jr(e,t){let n=new Map,r=new Map;for(let c of e){let u=Pt(c,t);if(n.set(c.id,u),u){let f=r.get(u);f?f.push(c.id):r.set(u,[c.id])}r.has(c.id)||r.set(c.id,[])}let i=new Map,a=new Map,s=new Map,o=c=>{let u=i.get(c);if(u)return u;let f=new Set,m=[],p=n.get(c)??null;for(;p&&!f.has(p);)m.push(p),f.add(p),p=n.get(p)??null;return i.set(c,m),m},l=c=>{let u=s.get(a.get(c)??"");if(u)return u;let f=n.get(c)??null,m=t.get(c),p=c;return m?.placement&&m.placement.mode!=="free"&&f&&(p=l(f)),p};for(let c of e){o(c.id);let u=l(c.id),f=se(u);a.set(c.id,f),s.set(f,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:a,groupRoots:s}}function Pt(e,t){let n=e.placement;if(!n)return null;switch(n.mode){case"orbit":case"surface":return t.has(n.target)?n.target:null;case"at":switch(n.reference.kind){case"anchor":return t.has(n.reference.objectId)?n.reference.objectId:null;case"named":return t.has(n.reference.name)?n.reference.name:null;case"lagrange":return n.reference.secondary&&t.has(n.reference.secondary)?n.reference.secondary:t.has(n.reference.primary)?n.reference.primary:null}case"free":return null}}function Qr(e,t,n,r,i){let a=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,o=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,c=(u,f)=>{a=Math.min(a,u),s=Math.min(s,f),o=Math.max(o,u),l=Math.max(l,f)};for(let u of t)!u.hidden&&e.objectIds.includes(u.objectId)&&Mt(u,c);for(let u of n)!u.hidden&&e.orbitIds.includes(u.objectId)&&Ft(u,c);for(let u of r)!u.hidden&&e.leaderIds.includes(u.objectId)&&(c(u.x1,u.y1),c(u.x2,u.y2));for(let u of i)!u.hidden&&e.labelIds.includes(u.objectId)&&Rt(u,c);return!Number.isFinite(a)||!Number.isFinite(s)?le(0,0,0,0):le(a,s,o,l)}function ei(e,t){let n=e,r=new Set;for(;n.placement&&n.placement.mode!=="free"&&!r.has(n.id);){r.add(n.id);let i=Pt(n,t);if(!i)break;let a=t.get(i);if(!a)break;n=a}return n.id}function kt(e,t,n,r,i){return{left:e-r,right:e+r,top:Math.min(t,n)-(i<0?18:12),bottom:Math.max(t,n)+(i<0?8:12)}}function ti(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function ni(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Le(e,t,n){let r=oi(e.properties.radius,n);if(r!==null)return r;let i=n.bodyRadiusMultiplier;switch(e.type){case"star":return x((t===0?28:20)*i,n.minBodyRadius,n.maxBodyRadius);case"planet":return x(12*i,n.minBodyRadius,n.maxBodyRadius);case"moon":return x(7*i,n.minBodyRadius,n.maxBodyRadius);case"belt":return x(5*i,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return x(5*i,n.minBodyRadius,n.maxBodyRadius);case"comet":return x(6*i,n.minBodyRadius,n.maxBodyRadius);case"ring":return x(5*i,n.minBodyRadius,n.maxBodyRadius);case"structure":return x(6*i,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return x(8*i,n.minBodyRadius,n.maxBodyRadius)}}function ri(e,t,n){let r=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"structure":return t+2;default:return Math.min(t+r,n.maxBodyRadius+10)}}function De(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/ae;case"m":return e.value/1e3/ae;case"ly":return e.value*lr;case"pc":return e.value*cr;case"kpc":return e.value*ur;case"re":return e.value*or/ae;case"rj":return e.value*ar/ae;case"sol":return e.value*sr/ae;default:return e.value}}function ii(e,t){let n=De(e??null);return n===null||n<=0?0:x(n*96*t.freePlacementMultiplier,0,420)}function oi(e,t){let n=Xe(e);if(!n)return null;let r;switch(n.unit){case"sol":r=x(n.value*22,14,40);break;case"re":r=x(n.value*10,6,18);break;case"km":r=x(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=x(n.value*4,4,20);break}return x(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function Xe(e){return!e||typeof e!="object"||!("value"in e)?null:e}function Je(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function ce(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function xt(e,t,n,r,i,a,s){let o=_t(e,t,n,r,i,a,s,Lt);return o.length===0?"":o.map((l,c)=>`${c===0?"M":"L"} ${Tt(l.x)} ${Tt(l.y)}`).join(" ")}function _t(e,t,n,r,i,a,s,o){let l=[];for(let c=0;c<=o;c+=1){let u=a+(s-a)*c/o;l.push(Et(e,t,n,r,i,u))}return l}function Et(e,t,n,r,i,a){let s=n*Math.cos(a),o=r*Math.sin(a),l=Nt(s,o,i);return{x:e+l.x,y:t+l.y}}function Nt(e,t,n){let r=Me(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function ue(e,t,n,r){let i=n==="isometric"?At*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function Se(e,t,n){return t*1e3+e+n*.01}function x(e,t,n){return Math.min(Math.max(e,t),n)}function jt(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function de(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function se(e){return`${de(e)}-group`}function ai(e){return typeof e=="string"&&e.trim()?e:void 0}function si(e,t){let n=e.label.length*4.6*t+18,r=e.secondaryLabel.length*3.9*t+18;return Math.max(n,r,e.visualRadius+18)}function li(e,t,n){let r=e.length*4.6*n+18,i=t.length*3.9*n+18;return Math.max(r,i,24)}function Ot(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Me(e){return e*Math.PI/180}function Tt(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function fe(e,t={}){let n=H(e,t),r=[],i=di(e,r),a=fi(e,r),s=ui(e,n.renderPreset??t.preset??null,n.projection),o=e.system?ci(e,s,i,a,r,n.renderPreset??t.preset??null):null;return n.viewpoints.some(l=>!l.generated)&&r.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${n.viewpoints.filter(l=>!l.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"2.0",schemaVersion:"2.0",sourceVersion:e.version,system:o,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),objects:e.objects.map(zt),diagnostics:r}}function Re(e,t={}){return vi(fe(e,t))}function pe(e){let t=e.system?{type:"system",id:e.system.id,title:e.system.title,description:e.system.description,epoch:e.system.epoch,referencePlane:e.system.referencePlane,properties:gi(e.system),info:bi(e.system)}:null;return{format:"worldorbit",version:"1.0",schemaVersion:e.version,system:t,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),objects:e.objects.map(zt)}}function Ct(e){return pe(e)}function ci(e,t,n,r,i,a){let s=H(e,{preset:a??void 0,projection:t.view});return{type:"system",id:e.system?.id??"WorldOrbit",title:e.system?.title??(typeof e.system?.properties.title=="string"?e.system.properties.title:null),description:e.system?.description??null,epoch:e.system?.epoch??null,referencePlane:e.system?.referencePlane??null,defaults:t,atlasMetadata:n,viewpoints:s.viewpoints.map(pi),annotations:r}}function ui(e,t,n){return{view:typeof e.system?.properties.view=="string"&&e.system.properties.view.toLowerCase()==="topdown"?"topdown":n,scale:typeof e.system?.properties.scale=="string"?e.system.properties.scale:null,units:typeof e.system?.properties.units=="string"?e.system.properties.units:null,preset:t,theme:typeof e.system?.info["atlas.theme"]=="string"?e.system.info["atlas.theme"]:null}}function di(e,t){let n={};for(let[i,a]of Object.entries(e.system?.info??{}))i.startsWith("viewpoint.")||i.startsWith("annotation.")||(n[i]=a);let r=Object.keys(n);return r.length>0&&t.push({code:"upgrade.atlasMetadata.preserved",severity:"warning",source:"upgrade",message:`Preserved ${r.length} system info entr${r.length===1?"y":"ies"} as atlas metadata in the 2.0 atlas document.`}),n}function fi(e,t){let n=new Map;for(let[r,i]of Object.entries(e.system?.info??{})){if(!r.startsWith("annotation."))continue;let[,a,...s]=r.split(".");if(!a||s.length===0)continue;let o=Bt(a);if(!o)continue;let l=n.get(o)??{id:o};switch(s.join(".").toLowerCase()){case"label":l.label=i;break;case"target":case"object":l.targetObjectId=i.trim()||null;break;case"body":case"text":case"description":l.body=i;break;case"tags":l.tags=hi(i);break}n.set(o,l)}for(let r of e.objects){let i=r.info.description;if(!i)continue;let a=Bt(`${r.id}-notes`);n.has(a)||(n.set(a,{id:a,label:`${r.id} Notes`,targetObjectId:r.id,body:i,tags:Array.isArray(r.properties.tags)?r.properties.tags.filter(s=>typeof s=="string"):[]}),t.push({code:"upgrade.annotation.objectDescription",severity:"info",source:"upgrade",message:`Lifted ${r.id}.info.description into structured atlas annotation "${a}".`,objectId:r.id,field:"description"}))}return[...n.values()].filter(r=>r.body||r.label).map(r=>({id:r.id,label:r.label??yi(r.id),targetObjectId:r.targetObjectId??null,body:r.body??"",tags:r.tags??[],sourceObjectId:r.targetObjectId??null})).sort((r,i)=>r.label.localeCompare(i.label))}function pi(e){return{id:e.id,label:e.label,summary:e.summary,focusObjectId:e.objectId,selectedObjectId:e.selectedObjectId,projection:e.projection,preset:e.preset,zoom:e.scale,rotationDeg:e.rotationDeg,layers:{...e.layers},filter:e.filter?{query:e.filter.query,objectTypes:[...e.filter.objectTypes],tags:[...e.filter.tags],groupIds:[...e.filter.groupIds]}:null}}function zt(e){return{...e,groups:e.groups?[...e.groups]:void 0,resonance:e.resonance?{...e.resonance}:e.resonance,renderHints:e.renderHints?{...e.renderHints}:e.renderHints,deriveRules:e.deriveRules?e.deriveRules.map(t=>({...t})):void 0,validationRules:e.validationRules?e.validationRules.map(t=>({...t})):void 0,lockedFields:e.lockedFields?[...e.lockedFields]:void 0,tolerances:e.tolerances?e.tolerances.map(t=>({field:t.field,value:t.value&&typeof t.value=="object"&&"value"in t.value?{value:t.value.value,unit:t.value.unit}:Array.isArray(t.value)?[...t.value]:t.value})):void 0,typedBlocks:e.typedBlocks?Object.fromEntries(Object.entries(e.typedBlocks).map(([t,n])=>[t,{...n??{}}])):void 0,properties:mi(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function mi(e){let t={};for(let[n,r]of Object.entries(e)){if(Array.isArray(r)){t[n]=[...r];continue}if(r&&typeof r=="object"&&"value"in r){t[n]={value:r.value,unit:r.unit};continue}t[n]=r}return t}function hi(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Bt(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function yi(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function gi(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),e.description&&(t.description=e.description),e.epoch&&(t.epoch=e.epoch),e.referencePlane&&(t.referencePlane=e.referencePlane),t}function bi(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let n of e.viewpoints){let r=`viewpoint.${n.id}`;t[`${r}.label`]=n.label,n.summary&&(t[`${r}.summary`]=n.summary),n.focusObjectId&&(t[`${r}.focus`]=n.focusObjectId),n.selectedObjectId&&(t[`${r}.select`]=n.selectedObjectId),n.projection&&(t[`${r}.projection`]=n.projection),n.preset&&(t[`${r}.preset`]=n.preset),n.zoom!==null&&(t[`${r}.zoom`]=String(n.zoom)),n.rotationDeg!==0&&(t[`${r}.rotation`]=String(n.rotationDeg));let i=wi(n.layers);i&&(t[`${r}.layers`]=i),n.filter?.query&&(t[`${r}.query`]=n.filter.query),(n.filter?.objectTypes.length??0)>0&&(t[`${r}.types`]=n.filter?.objectTypes.join(" ")??""),(n.filter?.tags.length??0)>0&&(t[`${r}.tags`]=n.filter?.tags.join(" ")??""),(n.filter?.groupIds.length??0)>0&&(t[`${r}.groups`]=n.filter?.groupIds.join(" ")??"")}for(let n of e.annotations){let r=`annotation.${n.id}`;t[`${r}.label`]=n.label,n.targetObjectId&&(t[`${r}.target`]=n.targetObjectId),t[`${r}.body`]=n.body,n.tags.length>0&&(t[`${r}.tags`]=n.tags.join(" ")),n.sourceObjectId&&(t[`${r}.source`]=n.sourceObjectId)}return t}function wi(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t.join(" ")}function vi(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var Vt=["title","view","scale","units","kind","class","tags","color","image","hidden","orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"];function Ee(e,t={}){let n=t.schema??"auto";if(n==="2.0"||n==="2.1"||n==="2.0-draft"||e.version==="2.0"||e.version==="2.1"||e.version==="2.0-draft"){if(n==="2.0-draft"){let l=e.version==="2.0-draft"?e:e.version==="2.0"||e.version==="2.1"?{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}:Re(e);return Qe(l)}let o=e.version==="2.0"||e.version==="2.1"?e:e.version==="2.0-draft"?{...e,version:"2.0",schemaVersion:"2.0"}:fe(e);return n==="2.1"&&o.version!=="2.1"?Pe({...o,version:"2.1",schemaVersion:"2.1"}):Pe(o)}let i=[],a=e;a.system&&i.push(...Ii(a.system));let s=[...a.objects].sort(tt);for(let o of s)i.length>0&&i.push(""),i.push(...ki(o));return i.join(`
2
- `)}function Pe(e){let t=[`schema ${e.version}`,""];e.system&&t.push(...Wt(e.system));for(let r of[...e.groups].sort(_e))t.push(""),t.push(...Kt(r));for(let r of[...e.relations].sort(_e))t.push(""),t.push(...Zt(r));let n=[...e.objects].sort(tt);return n.length>0&&t.at(-1)!==""&&t.push(""),n.forEach((r,i)=>{i>0&&t.push(""),t.push(...qt(r))}),t.join(`
3
- `)}function Qe(e){let t=e.version==="2.0-draft"?e:{...e,version:"2.0-draft",schemaVersion:"2.0-draft"},n=["schema 2.0-draft",""];t.system&&n.push(...Wt(t.system));for(let i of[...t.groups].sort(_e))n.push(""),n.push(...Kt(i));for(let i of[...t.relations].sort(_e))n.push(""),n.push(...Zt(i));let r=[...t.objects].sort(tt);return r.length>0&&n.at(-1)!==""&&n.push(""),r.forEach((i,a)=>{a>0&&n.push(""),n.push(...qt(i))}),n.join(`
4
- `)}function Ii(e){return $i("system",e.id,e.properties,null,e.info)}function $i(e,t,n,r,i){let a=[`${e} ${t}`],s=[...Gt(r),...Ht(n)];for(let l of s)a.push(` ${l}`);let o=Object.entries(i).sort(([l],[c])=>l.localeCompare(c));if(o.length>0){s.length>0&&a.push(""),a.push(" info");for(let[l,c]of o)a.push(` ${l} ${w(c)}`)}return a}function Wt(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${w(e.title)}`),e.description&&t.push(` description ${w(e.description)}`),e.epoch&&t.push(` epoch ${w(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${w(e.referencePlane)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${w(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${w(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${w(e.defaults.theme)}`),Object.keys(e.atlasMetadata).length>0){t.push(""),t.push("atlas"),t.push(" metadata");for(let[n,r]of Object.entries(e.atlasMetadata).sort(([i],[a])=>i.localeCompare(a)))t.push(` ${n} ${w(r)}`)}for(let n of e.viewpoints)t.push(""),t.push(...ji(n));for(let n of e.annotations)t.push(""),t.push(...Oi(n));return t}function ki(e){return Yt(e.type,e.id,e)}function qt(e){return Yt(`object ${e.type}`,e.id,e)}function Yt(e,t,n){let r=[`${e} ${t}`],i=[...Gt(n.placement),...Ht(n.properties),...xi(n)];for(let s of i)r.push(` ${s}`);let a=Object.entries(n.info).sort(([s],[o])=>s.localeCompare(o));if(a.length>0){i.length>0&&r.push(""),r.push(" info");for(let[s,o]of a)r.push(` ${s} ${w(o)}`)}for(let s of["climate","habitability","settlement"]){let o=Object.entries(n.typedBlocks?.[s]??{}).sort(([l],[c])=>l.localeCompare(c));if(o.length>0){r.push(""),r.push(` ${s}`);for(let[l,c]of o)r.push(` ${l} ${w(c)}`)}}return r}function Gt(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...ee("distance",e.distance),...ee("semiMajor",e.semiMajor),...Ti("eccentricity",e.eccentricity),...ee("period",e.period),...ee("angle",e.angle),...ee("inclination",e.inclination),...ee("phase",e.phase)];case"at":return[`at ${Ai(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?et(e.distance):e.descriptor??""}`.trim()]}}function Ht(e){return Object.keys(e).sort(Di).map(t=>`${t} ${Xt(e[t])}`)}function xi(e){let t=[];e.groups?.length&&t.push(`groups ${e.groups.join(" ")}`),e.epoch&&t.push(`epoch ${w(e.epoch)}`),e.referencePlane&&t.push(`referencePlane ${w(e.referencePlane)}`),e.tidalLock!==void 0&&t.push(`tidalLock ${e.tidalLock?"true":"false"}`),e.renderHints?.renderLabel!==void 0&&t.push(`renderLabel ${e.renderHints.renderLabel?"true":"false"}`),e.renderHints?.renderOrbit!==void 0&&t.push(`renderOrbit ${e.renderHints.renderOrbit?"true":"false"}`),e.renderHints?.renderPriority!==void 0&&t.push(`renderPriority ${e.renderHints.renderPriority}`),e.resonance&&t.push(`resonance ${e.resonance.targetObjectId} ${e.resonance.ratio}`);for(let n of e.deriveRules??[])t.push(`derive ${n.field} ${n.strategy}`);for(let n of e.validationRules??[])t.push(`validate ${n.rule}`);e.lockedFields?.length&&t.push(`locked ${e.lockedFields.join(" ")}`);for(let n of e.tolerances??[])t.push(`tolerance ${n.field} ${Xt(n.value)}`);return t}function ji(e){let t=[`viewpoint ${e.id}`,` label ${w(e.label)}`];e.focusObjectId&&t.push(` focus ${e.focusObjectId}`),e.selectedObjectId&&e.selectedObjectId!==e.focusObjectId&&t.push(` select ${e.selectedObjectId}`),e.summary&&t.push(` summary ${w(e.summary)}`),e.projection&&t.push(` projection ${e.projection}`),e.preset&&t.push(` preset ${e.preset}`),e.zoom!==null&&t.push(` zoom ${e.zoom}`),e.rotationDeg!==0&&t.push(` rotation ${e.rotationDeg}`);let n=Li(e.layers);return n.length>0&&t.push(` layers ${n.join(" ")}`),e.filter&&(t.push(" filter"),e.filter.query&&t.push(` query ${w(e.filter.query)}`),e.filter.objectTypes.length>0&&t.push(` objectTypes ${e.filter.objectTypes.join(" ")}`),e.filter.tags.length>0&&t.push(` tags ${e.filter.tags.map(w).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function Oi(e){let t=[`annotation ${e.id}`,` label ${w(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${w(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(w).join(" ")}`),t}function Kt(e){let t=[`group ${e.id}`,` label ${w(e.label)}`];return e.summary&&t.push(` summary ${w(e.summary)}`),e.color&&t.push(` color ${w(e.color)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(w).join(" ")}`),e.hidden&&t.push(" hidden true"),t}function Zt(e){let t=[`relation ${e.id}`];return e.from&&t.push(` from ${w(e.from)}`),e.to&&t.push(` to ${w(e.to)}`),e.kind&&t.push(` kind ${w(e.kind)}`),e.label&&t.push(` label ${w(e.label)}`),e.summary&&t.push(` summary ${w(e.summary)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(w).join(" ")}`),e.color&&t.push(` color ${w(e.color)}`),e.hidden&&t.push(" hidden true"),t}function Xt(e){return Array.isArray(e)?e.map(t=>w(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?w(e):et(e)}function et(e){return`${e.value}${e.unit??""}`}function ee(e,t){return t?[`${e} ${et(t)}`]:[]}function Ti(e,t){return t===void 0?[]:[`${e} ${t}`]}function Ai(e){switch(e.kind){case"lagrange":return e.secondary?`${e.primary}-${e.secondary}:${e.point}`:`${e.primary}:${e.point}`;case"anchor":return`${e.objectId}:${e.anchor}`;case"named":return e.name}}function Li(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t}function Di(e,t){let n=Vt.indexOf(e),r=Vt.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function tt(e,t){let n=Ut(e.type),r=Ut(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function _e(e,t){return e.id.localeCompare(t.id)}function Ut(e){switch(e){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":return 3;case"asteroid":return 4;case"comet":return 5;case"ring":return 6;case"structure":return 7;case"phenomenon":return 8}}function w(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}var Jt=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Si=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Fi=/^[A-Za-z][A-Za-z0-9+.-]*:/;function he(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Ne(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function nt(e,t,n){let r=e.match(Jt);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let a=L(n);if(a?.unitFamily&&!oe(a.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function rt(e){let t=e.match(Jt);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Be(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function K(e,t,n){let r=Si.get(e.toLowerCase());if(r===void 0)throw d.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function Qt(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function Mi(e,t){if(!e)throw d.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw d.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Fi);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw d.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function en(e,t,n){let r=L(e);if(!r)throw d.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw d.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return K(me(t,e,n),e,n);case"number":return Be(me(t,e,n),e,n);case"unit":return nt(me(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&Mi(i,n),i}}}function it(e,t,n){let r=L(e);if(!r)throw d.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw d.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function me(e,t,n){if(e.length!==1)throw d.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var Ri=new Set(["star","planet","moon","asteroid","comet"]),Pi=332946.0487,_i=1047.3486,Ce=1495978707e-1,Ei=6371,Ni=695700,Bi=63241.077,Ci=206264.806,zi=206264806;function ye(e,t){let n=[],r=new Map(e.objects.map(s=>[s.id,s])),i=new Set(e.groups.map(s=>s.id));e.system||n.push(O("validate.system.required","Atlas documents must declare exactly one system."));let a=new Map;for(let[s,o]of[["group",e.groups.map(l=>l.id)],["viewpoint",e.system?.viewpoints.map(l=>l.id)??[]],["annotation",e.system?.annotations.map(l=>l.id)??[]],["relation",e.relations.map(l=>l.id)],["object",e.objects.map(l=>l.id)]])for(let l of o){let c=a.get(l);c?n.push(O("validate.id.duplicate",`Duplicate ${s} id "${l}" already used by ${c}.`)):a.set(l,s)}for(let s of e.relations)Vi(s,r,n);for(let s of e.system?.viewpoints??[])Ui(s.filter,i,t,n,s.id);for(let s of e.objects)Wi(s,e.system,r,i,n);return n}function Vi(e,t,n){e.from?t.has(e.from)||n.push(O("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(O("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(O("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(O("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(O("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function Ui(e,t,n,r,i){if(!(!e||n!=="2.1"))for(let a of e.groupIds)t.has(a)||r.push(V("validate.viewpoint.group.unknown",`Unknown group "${a}" in viewpoint "${i}".`))}function Wi(e,t,n,r,i){let a=e.placement,s=a?.mode==="orbit"?a:null,o=a?.mode==="orbit"?n.get(a.target)??null:null;if(e.groups)for(let l of e.groups)r.has(l)||i.push(V("validate.group.unknown",`Unknown group "${l}" on "${e.id}".`,e.id,"groups"));if(s&&(n.has(s.target)||i.push(O("validate.orbit.target.unknown",`Unknown placement target "${s.target}" on "${e.id}".`,e.id,"orbit")),s.distance&&s.semiMajor&&i.push(O("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),s.phase&&!e.epoch&&!t?.epoch&&i.push(V("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),s.inclination&&!e.referencePlane&&!t?.referencePlane&&i.push(V("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),s.period&&!nn(o?.properties.mass)&&i.push(V("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),a?.mode==="surface"){let l=n.get(a.target);l?Ri.has(l.type)||i.push(O("validate.surface.target.invalid",`Surface target "${a.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):i.push(O("validate.surface.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"surface"))}if(a?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&i.push(O("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),qi(e,n,i)||i.push(O("validate.at.target.unknown",`Unknown at-reference target "${a.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let l=n.get(e.resonance.targetObjectId);l?(e.placement?.mode!=="orbit"||l.placement?.mode!=="orbit"||e.placement.target!==l.placement.target)&&i.push(V("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):i.push(O("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let l of e.deriveRules??[]){if(l.field!=="period"||l.strategy!=="kepler"){i.push(V("validate.derive.unsupported",`Unsupported derive rule "${l.field} ${l.strategy}" on "${e.id}".`,e.id,"derive"));continue}let c=tn(e,o);if(c===null){i.push(V("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}s?.period||i.push(Ki("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Hi(c)}.`,e.id,"derive"))}for(let l of e.validationRules??[]){if(l.rule!=="kepler"){i.push(V("validate.rule.unsupported",`Unsupported validation rule "${l.rule}" on "${e.id}".`,e.id,"validate"));continue}let c=rn(s?.period),u=tn(e,o);if(c===null||u===null)continue;let f=Gi(e,"period");Math.abs(c-u)>f&&i.push(O("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function qi(e,t,n){let r=e.placement?.mode==="at"?e.placement.reference:null;return r?r.kind==="named"?t.has(r.name):r.kind==="anchor"?t.has(r.objectId)?!0:(n.push(O("validate.anchor.target.unknown",`Unknown anchor target "${r.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(r.primary)?r.secondary&&!t.has(r.secondary)?(n.push(O("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(O("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function tn(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=Yi(n.semiMajor??n.distance),i=nn(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function Yi(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Ce;case"m":return e.value/(Ce*1e3);case"ly":return e.value*Bi;case"pc":return e.value*Ci;case"kpc":return e.value*zi;case"re":return e.value*Ei/Ce;case"sol":return e.value*Ni/Ce;default:return null}}function nn(e){if(!e||typeof e!="object"||!("value"in e))return null;let t=e;switch(t.unit){case null:case"sol":return t.value;case"me":return t.value/Pi;case"mj":return t.value/_i;default:return null}}function rn(e){if(!e)return null;switch(e.unit){case null:case"d":return e.value;case"s":return e.value/86400;case"min":return e.value/1440;case"h":return e.value/24;case"y":return e.value*365.25;case"ky":return e.value*365250;case"my":return e.value*36525e4;case"gy":return e.value*36525e7;default:return null}}function Gi(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?rn(n)??0:0}function Hi(e){return`${Math.round(e*100)/100}d`}function O(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function V(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function Ki(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Zi=new Set(["climate","habitability","settlement"]),ze=new Map;for(let e of["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","kind","class","culture","tags","color","image","hidden","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"]){let t=L(e);t&&ze.set(e,{key:e,version:"2.0",inlineMode:t.arity==="multiple"?"multiple":"single",allowRepeat:!1,legacySchema:t})}for(let e of[{key:"groups",inlineMode:"multiple",allowRepeat:!1},{key:"epoch",inlineMode:"single",allowRepeat:!1},{key:"referencePlane",inlineMode:"single",allowRepeat:!1},{key:"tidalLock",inlineMode:"single",allowRepeat:!1},{key:"renderLabel",inlineMode:"single",allowRepeat:!1},{key:"renderOrbit",inlineMode:"single",allowRepeat:!1},{key:"renderPriority",inlineMode:"single",allowRepeat:!1},{key:"resonance",inlineMode:"pair",allowRepeat:!1},{key:"derive",inlineMode:"pair",allowRepeat:!0},{key:"validate",inlineMode:"single",allowRepeat:!0},{key:"locked",inlineMode:"multiple",allowRepeat:!1},{key:"tolerance",inlineMode:"pair",allowRepeat:!0}])ze.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var Xi=new Set(ze.keys());function Ve(e){return sn(e)}function an(e){return sn(e,"2.0-draft")}function sn(e,t){let n=Ro(e),r=n.source.split(/\r?\n/),i=[],a=!1,s="2.0",o=null,l=null,c=[],u=[],f=[],m=!1,p=!1,b=new Set,v=new Set,j=new Set,A=new Set;for(let $=0;$<r.length;$++){let _=r[$],S=$+1;if(!_.trim())continue;let B=$e(_),F=G(_.slice(B),{line:S,columnOffset:B});if(F.length!==0){if(!a){s=Ji(F,S),a=!0,n.comments.length>0&&s!=="2.1"&&i.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${s}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(B===0){l=Qi(F,S,s,i,o,c,u,f,b,v,j,A,{sawDefaults:m,sawAtlas:p}),l.kind==="system"?o=l.system:l.kind==="defaults"?m=!0:l.kind==="atlas"&&(p=!0);continue}if(!l)throw new d("Indented line without parent atlas section",S,B+1);ao(l,B,F,S)}}if(!a)throw new d('Missing required atlas schema header "schema 2.0"');let y=c.map($=>ko($,s,i)),I=t??(s==="2.0-draft"?"2.0":s),P={format:"worldorbit",sourceVersion:"1.0",system:o,groups:u,relations:f,objects:y,diagnostics:i};if(I==="2.0-draft"){let $={...P,version:"2.0-draft",schemaVersion:"2.0-draft"};return $.diagnostics.push(...ye($,s)),$}let N={...P,version:I,schemaVersion:I};return s==="2.0-draft"&&N.diagnostics.push({code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}),N.diagnostics.push(...ye(N,s)),N}function Ji(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1"].includes(e[1].value.toLowerCase()))throw new d('Expected atlas header "schema 2.0", "schema 2.1", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function Qi(e,t,n,r,i,a,s,o,l,c,u,f,m){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new d('Atlas section "system" may only appear once',t,e[0].column);return eo(e,t,n,r);case"defaults":if(!i)throw new d('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(m.sawDefaults)throw new d('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:i,seenFields:new Set};case"atlas":if(!i)throw new d('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(m.sawAtlas)throw new d('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:i,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!i)throw new d('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return to(e,t,i,l);case"annotation":if(!i)throw new d('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return no(e,t,i,c);case"group":return U(n,r,"group",{line:t,column:e[0].column}),ro(e,t,s,u);case"relation":return U(n,r,"relation",{line:t,column:e[0].column}),io(e,t,o,f);case"object":return oo(e,t,n,r,a);default:throw new d(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function eo(e,t,n,r){if(e.length!==2)throw new d("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},sourceSchemaVersion:n,diagnostics:r,seenFields:new Set}}function to(e,t,n,r){if(e.length!==2)throw new d("Invalid viewpoint declaration",t,e[0]?.column??1);let i=he(e[1].value);if(!i)throw new d("Viewpoint id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate viewpoint id "${i}"`,t,e[1].column);let a={id:i,label:Ne(i),summary:"",focusObjectId:null,selectedObjectId:null,projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,layers:{},filter:null};return n.viewpoints.push(a),r.add(i),{kind:"viewpoint",viewpoint:a,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set}}function no(e,t,n,r){if(e.length!==2)throw new d("Invalid annotation declaration",t,e[0]?.column??1);let i=he(e[1].value);if(!i)throw new d("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate annotation id "${i}"`,t,e[1].column);let a={id:i,label:Ne(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(a),r.add(i),{kind:"annotation",annotation:a,seenFields:new Set}}function ro(e,t,n,r){if(e.length!==2)throw new d("Invalid group declaration",t,e[0]?.column??1);let i=he(e[1].value);if(!i)throw new d("Group id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate group id "${i}"`,t,e[1].column);let a={id:i,label:Ne(i),summary:"",color:null,tags:[],hidden:!1};return n.push(a),r.add(i),{kind:"group",group:a,seenFields:new Set}}function io(e,t,n,r){if(e.length!==2)throw new d("Invalid relation declaration",t,e[0]?.column??1);let i=he(e[1].value);if(!i)throw new d("Relation id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate relation id "${i}"`,t,e[1].column);let a={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(a),r.add(i),{kind:"relation",relation:a,seenFields:new Set}}function oo(e,t,n,r,i){if(e.length<3)throw new d("Invalid atlas object declaration",t,e[0]?.column??1);let a=e[1],s=e[2],o=a.value;if(!ie.has(o)||o==="system")throw new d(`Unknown object type "${a.value}"`,t,a.column);let l={objectType:o,id:s.value,fields:Io(e.slice(3),t,o,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:a.column}};return i.push(l),{kind:"object",objectNode:l,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function ao(e,t,n,r){switch(e.kind){case"system":so(e,n,r);return;case"defaults":lo(e,n,r);return;case"atlas":co(e,t,n,r);return;case"viewpoint":uo(e,t,n,r);return;case"annotation":po(e,n,r);return;case"group":mo(e,n,r);return;case"relation":ho(e,n,r);return;case"object":yo(e,t,n,r);return}}function so(e,t,n){let r=X(t,e.seenFields,n),i=T(t,n);switch(r){case"title":e.system.title=i;return;case"description":U(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":U(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":U(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=i;return;default:throw new d(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function lo(e,t,n){let r=X(t,e.seenFields,n),i=T(t,n);switch(r){case"view":e.system.defaults.view=ln(i,n,t[0].column);return;case"scale":e.system.defaults.scale=i;return;case"units":e.system.defaults.units=i;return;case"preset":e.system.defaults.preset=cn(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new d(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function co(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=dn(n,r,"Invalid atlas metadata entry");if(i.key in e.system.atlasMetadata)throw new d(`Duplicate atlas metadata key "${i.key}"`,r,n[0].column);e.system.atlasMetadata[i.key]=i.value;return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new d(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function uo(e,t,n,r){if(e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inFilter){fo(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new d('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=X(n,e.seenFields,r),a=T(n,r);switch(i){case"label":e.viewpoint.label=a;return;case"summary":e.viewpoint.summary=a;return;case"focus":e.viewpoint.focusObjectId=a;return;case"select":e.viewpoint.selectedObjectId=a;return;case"projection":e.viewpoint.projection=ln(a,r,n[0].column);return;case"preset":e.viewpoint.preset=cn(a,r,n[0].column);return;case"zoom":e.viewpoint.zoom=wo(a,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=un(a,r,n[0].column,"rotation");return;case"layers":e.viewpoint.layers=bo(n.slice(1),r);return;default:throw new d(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function fo(e,t,n){let r=X(t,e.seenFilterFields,n),i=e.viewpoint.filter??vo();switch(r){case"query":i.query=T(t,n);break;case"objecttypes":i.objectTypes=go(t.slice(1),n);break;case"tags":i.tags=Z(t.slice(1),n,"tags");break;case"groups":i.groupIds=Z(t.slice(1),n,"groups");break;default:throw new d(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function po(e,t,n){switch(X(t,e.seenFields,n)){case"label":e.annotation.label=T(t,n);return;case"target":e.annotation.targetObjectId=T(t,n);return;case"body":e.annotation.body=T(t,n);return;case"tags":e.annotation.tags=Z(t.slice(1),n,"tags");return;default:throw new d(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function mo(e,t,n){switch(X(t,e.seenFields,n)){case"label":e.group.label=T(t,n);return;case"summary":e.group.summary=T(t,n);return;case"color":e.group.color=T(t,n);return;case"tags":e.group.tags=Z(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=K(T(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new d(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function ho(e,t,n){switch(X(t,e.seenFields,n)){case"from":e.relation.from=T(t,n);return;case"to":e.relation.to=T(t,n);return;case"kind":e.relation.kind=T(t,n);return;case"label":e.relation.label=T(t,n);return;case"summary":e.relation.summary=T(t,n);return;case"tags":e.relation.tags=Z(t.slice(1),n,"tags");return;case"color":e.relation.color=T(t,n);return;case"hidden":e.relation.hidden=K(T(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new d(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function yo(e,t,n,r){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),n.length===1){let i=n[0].value.toLowerCase();if(i==="info"||Zi.has(i)){i!=="info"&&U(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=dn(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(i.key))throw new d(`Duplicate info key "${i.key}"`,r,n[0].column);e.seenInfoKeys.add(i.key),e.objectNode.infoEntries.push(i);return}let a=e.activeBlock,s=e.seenTypedBlockKeys[a]??(e.seenTypedBlockKeys[a]=new Set);if(s.has(i.key))throw new d(`Duplicate ${a} key "${i.key}"`,r,n[0].column);s.add(i.key),(e.objectNode.typedBlockEntries[a]??(e.objectNode.typedBlockEntries[a]=[])).push(i);return}e.objectNode.fields.push($o(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function X(e,t,n){if(e.length<2)throw new d("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new d(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function T(e,t){if(e.length<2)throw new d("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function go(e,t){return Z(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function bo(e,t){let n={};for(let r of Z(e,t,"layers")){let i=!r.startsWith("-")&&!r.startsWith("!"),a=r.replace(/^[-!]+/,"").toLowerCase();if(a==="orbits"){n["orbits-back"]=i,n["orbits-front"]=i;continue}(a==="background"||a==="guides"||a==="orbits-back"||a==="orbits-front"||a==="relations"||a==="objects"||a==="labels"||a==="metadata")&&(n[a]=i)}return n}function Z(e,t,n){if(e.length===0)throw new d(`Missing value for atlas field "${n}"`,t,1);let r=e.map(i=>i.value).filter(Boolean);if(r.length===0)throw new d(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function ln(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric")throw new d(`Unknown projection "${e}"`,t,n);return r}function cn(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new d(`Unknown render preset "${e}"`,t,n)}function wo(e,t,n,r){let i=un(e,t,n,r);if(i<=0)throw new d(`Field "${r}" must be greater than zero`,t,n);return i}function un(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new d(`Invalid numeric value "${e}" for "${r}"`,t,n);return i}function vo(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Io(e,t,n,r,i){let a=[],s=0;for(;s<e.length;){let o=e[s],l=ge(o.value);if(!l)throw new d(`Unknown field "${o.value}"`,t,o.column);l.version==="2.1"&&U(r,i,o.value,{line:t,column:o.column}),s++;let c=[];if(l.inlineMode==="single"){let u=e[s];u&&(c.push(u),s++)}else if(l.inlineMode==="pair")for(let u=0;u<2;u++){let f=e[s];if(!f)break;c.push(f),s++}else for(;s<e.length&&!Xi.has(e[s].value);)c.push(e[s]),s++;if(c.length===0)throw new d(`Missing value for field "${o.value}"`,t,o.column);a.push({type:"field",key:o.value,values:c.map(u=>u.value),location:{line:t,column:o.column}})}return pn(a,n),a}function $o(e,t,n,r,i){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);let a=ge(e[0].value);if(!a)throw new d(`Unknown field "${e[0].value}"`,t,e[0].column);a.version==="2.1"&&U(r,i,e[0].value,{line:t,column:e[0].column});let s={type:"field",key:e[0].value,values:e.slice(1).map(o=>o.value),location:{line:t,column:e[0].column}};return pn([s],n),s}function dn(e,t,n){if(e.length<2)throw new d(n,t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}function ko(e,t,n){let r=xo(e.fields),i=jo(e.objectType,r),a=Oo(e.objectType,r),s=Fo(r.get("groups")?.[0]),o=on(r.get("epoch")?.[0]),l=on(r.get("referencePlane")?.[0]),c=r.has("tidalLock")?K(E(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?Lo(r.get("resonance")[0]):void 0,f=Ao(r),m=r.get("derive")?.map(I=>Do(I)),p=r.get("validate")?.map(I=>({rule:E(I)})),b=r.has("locked")?[...new Set(r.get("locked").flatMap(I=>I.values))]:void 0,v=r.get("tolerance")?.map(I=>So(I)),j=To(e.typedBlockEntries),A=fn(e.infoEntries,"info"),y={type:e.objectType,id:e.id,properties:a,placement:i,info:A};return s.length>0&&(y.groups=s),o&&(y.epoch=o),l&&(y.referencePlane=l),c!==void 0&&(y.tidalLock=c),u&&(y.resonance=u),f&&(y.renderHints=f),m?.length&&(y.deriveRules=m),p?.length&&(y.validationRules=p),b?.length&&(y.lockedFields=b),v?.length&&(y.tolerances=v),j&&Object.keys(j).length>0&&(y.typedBlocks=j),t!=="2.1"&&(y.groups||y.epoch||y.referencePlane||y.tidalLock!==void 0||y.resonance||y.renderHints||y.deriveRules?.length||y.validationRules?.length||y.lockedFields?.length||y.tolerances?.length||y.typedBlocks)&&U(t,n,e.id,e.location),y}function xo(e){let t=new Map;for(let n of e){let r=ge(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(!r.allowRepeat&&t.has(n.key))throw d.fromLocation(`Duplicate field "${n.key}"`,n.location);let i=t.get(n.key)??[];i.push(n),t.set(n.key,i)}return t}function jo(e,t){let n=t.get("orbit")?.[0],r=t.get("at")?.[0],i=t.get("surface")?.[0],a=t.get("free")?.[0];if([n,r,i,a].filter(Boolean).length>1){let o=n??r??i??a;throw d.fromLocation("Object has multiple placement modes",o?.location)}if(n)return{mode:"orbit",target:E(n),distance:te(t.get("distance")?.[0],"distance"),semiMajor:te(t.get("semiMajor")?.[0],"semiMajor"),eccentricity:Mo(t.get("eccentricity")?.[0],"eccentricity"),period:te(t.get("period")?.[0],"period"),angle:te(t.get("angle")?.[0],"angle"),inclination:te(t.get("inclination")?.[0],"inclination"),phase:te(t.get("phase")?.[0],"phase")};if(r){let o=E(r);return{mode:"at",target:o,reference:Qt(o,r.location)}}if(i)return{mode:"surface",target:E(i)};if(a){let o=E(a),l=rt(o);return{mode:"free",distance:l??void 0,descriptor:l?void 0:o}}return null}function Oo(e,t){let n={};for(let[r,i]of t.entries()){let a=i[0],s=ge(r);!a||!s?.legacySchema||s.legacySchema.placement||(it(r,e,a.location),n[r]=en(r,a.values,a.location))}return n}function fn(e,t){let n={};for(let r of e){if(r.key in n)throw d.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function To(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=fn(r,n))}return t}function Ao(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=K(E(n),"renderLabel",n.location)),r&&(t.renderOrbit=K(E(r),"renderOrbit",r.location)),i&&(t.renderPriority=Be(E(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function Lo(e){if(e.values.length!==2)throw d.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw d.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function Do(e){if(e.values.length!==2)throw d.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function So(e){if(e.values.length!==2)throw d.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=rt(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function Fo(e){return e?[...new Set(e.values)]:[]}function on(e){return e&&e.values.join(" ").trim()||null}function te(e,t){return e?nt(E(e),e.location,t):void 0}function Mo(e,t){return e?Be(E(e),t,e.location):void 0}function E(e){return me(e.values,e.key,e.location)}function ge(e){return ze.get(e)}function pn(e,t){for(let n of e){let r=ge(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){it(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw d.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function U(e,t,n,r){e!=="2.1"&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function Ro(e){let t=[...e],n=[],r=!1,i=!1,a=null,s=1,o=1;for(let l=0;l<t.length;l++){let c=t[l],u=t[l+1];if(i){if(c==="*"&&u==="/"){t[l]=" ",t[l+1]=" ",i=!1,a=null,l++,o+=2;continue}c!==`
5
- `&&c!=="\r"&&(t[l]=" "),c===`
6
- `?(s++,o=1):o++;continue}if(!r&&c==="/"&&u==="*"){n.push({kind:"block",line:s,column:o}),t[l]=" ",t[l+1]=" ",i=!0,a={line:s,column:o},l++,o+=2;continue}if(!r&&c==="#"&&!Po(t,l)){n.push({kind:"line",line:s,column:o}),t[l]=" ";let f=l+1;for(;f<t.length&&t[f]!==`
7
- `&&t[f]!=="\r";)t[f]=" ",f++;o+=f-l,l=f-1;continue}c==='"'&&t[l-1]!=="\\"&&(r=!r),c===`
8
- `?(s++,o=1):o++}if(i)throw d.fromLocation("Unclosed block comment",a??void 0);return{source:t.join(""),comments:n}}function Po(e,t){let n=t+1,r=0;for(;n<e.length&&/[0-9a-f]/i.test(e[n]??"");)n++,r++;if(![3,4,6,8].includes(r))return!1;let i=e[n];return i===void 0||i===" "||i===" "||i==="\r"||i===`
9
- `}function ot(e="WorldOrbit",t="2.0"){return{format:"worldorbit",version:t,schemaVersion:t,sourceVersion:"1.0",system:{type:"system",id:e,title:e,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},groups:[],relations:[],objects:[],diagnostics:[]}}function Ue(e){return structuredClone(e)}function mn(e){let t=[{kind:"system"},{kind:"defaults"}];if(e.system){for(let n of Object.keys(e.system.atlasMetadata).sort())t.push({kind:"metadata",key:n});for(let n of[...e.system.viewpoints].sort(ne))t.push({kind:"viewpoint",id:n.id});for(let n of[...e.system.annotations].sort(ne))t.push({kind:"annotation",id:n.id})}for(let n of[...e.groups].sort(ne))t.push({kind:"group",id:n.id});for(let n of[...e.relations].sort(ne))t.push({kind:"relation",id:n.id});for(let n of[...e.objects].sort(ne))t.push({kind:"object",id:n.id});return t}function at(e,t){switch(t.kind){case"system":return e.system;case"defaults":return e.system?.defaults??null;case"metadata":return t.key?e.system?.atlasMetadata[t.key]??null:null;case"group":return t.id?wn(e,t.id):null;case"object":return t.id?bn(e,t.id):null;case"viewpoint":return t.id?In(e.system,t.id):null;case"annotation":return t.id?$n(e.system,t.id):null;case"relation":return t.id?vn(e,t.id):null}}function st(e,t,n){let r=Ue(e),i=ut(r);switch(t.kind){case"system":return r.system=n,r;case"defaults":return i.defaults={...i.defaults,...n},r;case"metadata":if(!t.key)throw new Error('Metadata updates require a "key" value.');return n==null||n===""?delete i.atlasMetadata[t.key]:i.atlasMetadata[t.key]=String(n),r;case"group":if(!t.id)throw new Error('Group updates require an "id" value.');return be(r.groups,n),r;case"object":if(!t.id)throw new Error('Object updates require an "id" value.');return be(r.objects,n),r;case"viewpoint":if(!t.id)throw new Error('Viewpoint updates require an "id" value.');return be(i.viewpoints,n),r;case"annotation":if(!t.id)throw new Error('Annotation updates require an "id" value.');return be(i.annotations,n),r;case"relation":if(!t.id)throw new Error('Relation updates require an "id" value.');return be(r.relations,n),r}}function hn(e,t,n){return st(e,t,n(at(e,t)))}function yn(e,t){let n=Ue(e),r=ut(n);switch(t.kind){case"metadata":return t.key&&delete r.atlasMetadata[t.key],n;case"object":return t.id&&(n.objects=n.objects.filter(i=>i.id!==t.id)),n;case"group":return t.id&&(n.groups=n.groups.filter(i=>i.id!==t.id)),n;case"viewpoint":return t.id&&(r.viewpoints=r.viewpoints.filter(i=>i.id!==t.id)),n;case"annotation":return t.id&&(r.annotations=r.annotations.filter(i=>i.id!==t.id)),n;case"relation":return t.id&&(n.relations=n.relations.filter(i=>i.id!==t.id)),n;default:return n}}function lt(e,t){return t.map(n=>({diagnostic:n,path:ct(e,n)}))}function ct(e,t){if(t.objectId&&bn(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("group.")){let n=t.field.split(".");if(n[1]&&wn(e,n[1]))return{kind:"group",id:n[1]}}if(t.field?.startsWith("viewpoint.")){let n=t.field.split(".");if(n[1]&&In(e.system,n[1]))return{kind:"viewpoint",id:n[1]}}if(t.field?.startsWith("annotation.")){let n=t.field.split(".");if(n[1]&&$n(e.system,n[1]))return{kind:"annotation",id:n[1]}}if(t.field?.startsWith("relation.")){let n=t.field.split(".");if(n[1]&&vn(e,n[1]))return{kind:"relation",id:n[1]}}return t.field&&t.field in ut(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function gn(e){let t=[...e.diagnostics,...ye(e,e.version)];return lt(e,t)}function ut(e){return e.system||(e.system=ot().system),e.system}function bn(e,t){return e.objects.find(n=>n.id===t)??null}function wn(e,t){return e.groups.find(n=>n.id===t)??null}function vn(e,t){return e.relations.find(n=>n.id===t)??null}function In(e,t){return e?.viewpoints.find(n=>n.id===t)??null}function $n(e,t){return e?.annotations.find(n=>n.id===t)??null}function be(e,t){let n=e.findIndex(r=>r.id===t.id);if(n===-1){e.push(t),e.sort(ne);return}e[n]=t}function ne(e,t){return e.id.localeCompare(t.id)}var _o=/^schema\s+2(?:\.0|\.1)?$/i,Eo=/^schema\s+2\.1$/i,No=/^schema\s+2\.0-draft$/i;function dt(e){for(let t of Bo(e).split(/\r?\n/)){let n=t.trim();if(n)return No.test(n)?"2.0-draft":Eo.test(n)?"2.1":_o.test(n)?"2.0":"1.0"}return"1.0"}function Bo(e){let t=[...e],n=!1,r=!1;for(let i=0;i<t.length;i++){let a=t[i],s=t[i+1];if(r){if(a==="*"&&s==="/"){t[i]=" ",t[i+1]=" ",r=!1,i++;continue}a!==`
10
- `&&a!=="\r"&&(t[i]=" ");continue}if(!n&&a==="/"&&s==="*"){t[i]=" ",t[i+1]=" ",r=!0,i++;continue}if(!n&&a==="#"){t[i]=" ";let o=i+1;for(;o<t.length&&t[o]!==`
11
- `&&t[o]!=="\r";)t[o]=" ",o++;i=o-1;continue}a==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function We(e){let t=ft(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new d(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function ft(e){let t=dt(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1")return Co(e,t);let n;try{n=q(e)}catch(i){return{ok:!1,value:null,diagnostics:[D(i,"parse")]}}let r;try{r=C(n)}catch(i){return{ok:!1,value:null,diagnostics:[D(i,"normalize")]}}try{z(r)}catch(i){return{ok:!1,value:null,diagnostics:[D(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function Co(e,t){let n;try{n=Ve(e)}catch(s){return{ok:!1,value:null,diagnostics:[D(s,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(s=>s.severity==="error"))return{ok:!1,value:null,diagnostics:r};let i;try{i=pe(n)}catch(s){return{ok:!1,value:null,diagnostics:[D(s,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var zo=/^```worldorbit(?:\s+(.*))?\s*$/;function kn(e){let t=e.split(/\r?\n/),n=[],r=!1,i=null,a=0,s=[];return t.forEach((o,l)=>{let c=l+1;if(!r){let u=o.match(zo);u&&(r=!0,i=u[1]??null,a=c,s=[]);return}if(o.trim()==="```"){n.push({source:s.join(`
12
- `),info:i,startLine:a,endLine:c}),r=!1,i=null,a=0,s=[];return}s.push(o)}),n}function xn(e){let t=q(e),n=C(t);return z(n),{ast:t,document:n}}function Vo(e){let t=xn(e);return{...t,scene:H(t.document)}}function Uo(e){return We(e)}function Wo(e){return je(e)}function qo(e,t={}){return Ee(e,t)}return Pn(Yo);})();
1
+ "use strict";var WorldOrbitCore=(()=>{var Ke=Object.defineProperty;var Yn=Object.getOwnPropertyDescriptor;var qn=Object.getOwnPropertyNames;var Hn=Object.prototype.hasOwnProperty;var Gn=(e,t)=>{for(var n in t)Ke(e,n,{get:t[n],enumerable:!0})},Kn=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of qn(t))!Hn.call(e,i)&&i!==n&&Ke(e,i,{get:()=>t[i],enumerable:!(r=Yn(t,i))||r.enumerable});return e};var Zn=e=>Kn(Ke({},"__esModule",{value:!0}),e);var ka={};Gn(ka,{WORLDORBIT_FIELD_KEYS:()=>vt,WORLDORBIT_FIELD_SCHEMAS:()=>Ze,WORLDORBIT_OBJECT_TYPES:()=>fe,WorldOrbitError:()=>u,cloneAtlasDocument:()=>Ye,createDiagnostic:()=>xt,createEmptyAtlasDocument:()=>lt,detectWorldOrbitSchemaVersion:()=>ht,diagnosticFromError:()=>F,extractWorldOrbitBlocks:()=>Nn,formatAtlasDocument:()=>Ce,formatDocument:()=>Be,formatDraftDocument:()=>nt,getAtlasDocumentNode:()=>ut,getFieldSchema:()=>D,isKnownFieldKey:()=>Xe,listAtlasDocumentPaths:()=>Ln,load:()=>va,loadWorldOrbitSource:()=>He,loadWorldOrbitSourceWithDiagnostics:()=>yt,materializeAtlasDocument:()=>Ie,materializeDraftDocument:()=>Kt,normalizeDocument:()=>V,normalizeWithDiagnostics:()=>Ot,parse:()=>Cn,parseSafe:()=>Ia,parseWithDiagnostics:()=>Te,parseWorldOrbit:()=>G,parseWorldOrbitAtlas:()=>We,parseWorldOrbitDraft:()=>gn,removeAtlasDocumentNode:()=>Sn,render:()=>wa,renderDocumentToScene:()=>re,resolveAtlasDiagnosticPath:()=>pt,resolveAtlasDiagnostics:()=>ft,rotatePoint:()=>Mt,stringify:()=>$a,supportsObjectType:()=>Je,tokenizeLine:()=>It,tokenizeLineDetailed:()=>ne,unitFamilyAllowsUnit:()=>pe,updateAtlasDocumentNode:()=>An,upgradeDocumentToDraftV2:()=>Ne,upgradeDocumentToV2:()=>ve,upsertAtlasDocumentNode:()=>dt,validateAtlasDocumentWithDiagnostics:()=>Tn,validateDocument:()=>W,validateDocumentWithDiagnostics:()=>Lt});var u=class e extends Error{line;column;constructor(t,n,r){let i=n===void 0?"":` (line ${n}${r===void 0?"":`, column ${r}`})`;super(`${t}${i}`),this.name="WorldOrbitError",this.line=n,this.column=r}static fromLocation(t,n){return new e(t,n?.line,n?.column)}};var de=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],E=de.filter(e=>e!=="system"),Xn=["star","planet","moon","asteroid","comet","structure","phenomenon"],wt=["structure","phenomenon"],H=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Jn=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function w(e,t){return{key:e,...t}}var fe=new Set(de),Ze=new Map([w("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:H}),w("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"distance"}),w("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"distance"}),w("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:H}),w("period",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"duration"}),w("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"angle"}),w("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"angle"}),w("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"angle"}),w("at",{kind:"string",placement:!0,arity:"single",objectTypes:wt}),w("surface",{kind:"string",placement:!0,arity:"single",objectTypes:wt}),w("free",{kind:"string",placement:!0,arity:"single",objectTypes:Jn}),w("kind",{kind:"string",placement:!1,arity:"single",objectTypes:E}),w("class",{kind:"string",placement:!1,arity:"single",objectTypes:E}),w("culture",{kind:"string",placement:!1,arity:"single",objectTypes:E}),w("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:de}),w("color",{kind:"string",placement:!1,arity:"single",objectTypes:de}),w("image",{kind:"string",placement:!1,arity:"single",objectTypes:Xn}),w("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:de}),w("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"radius"}),w("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"mass"}),w("density",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"generic"}),w("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"generic"}),w("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"generic"}),w("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:E}),w("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),w("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),w("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),w("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),w("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),w("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),w("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),w("on",{kind:"string",placement:!1,arity:"single",objectTypes:E}),w("source",{kind:"string",placement:!1,arity:"single",objectTypes:E}),w("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"duration"})].map(e=>[e.key,e])),vt=new Set(Ze.keys());function D(e){return Ze.get(e)}function Xe(e){return vt.has(e)}function Je(e,t){return e.objectTypes.includes(t)}function pe(e,t){switch(e){case"distance":return t===null||["au","km","m","ly","pc","kpc","re","sol"].includes(t);case"radius":return t===null||["km","m","re","rj","sol"].includes(t);case"mass":return t===null||["me","mj","sol"].includes(t);case"duration":return t===null||["s","min","h","d","y","ky","my","gy"].includes(t);case"angle":return t===null||t==="deg";case"generic":return!0}}function It(e){return ne(e).map(t=>t.value)}function ne(e,t={}){let n=[],r=t.columnOffset??0,i="",a=null,o=!1,s=!1,c=null,l=()=>{a!==null&&(n.push({value:i,column:a,quoted:o}),i="",a=null,o=!1)};for(let d=0;d<e.length;d++){let f=e[d],p=r+d+1;if(s&&f==="\\"){let m=e[d+1];if(m==='"'||m==="\\"){i+=m,d++;continue}}if(f==='"'){s?s=!1:(a===null&&(a=p),o=!0,c=p,s=!0);continue}if(!s&&/\s/.test(f)){l();continue}a===null&&(a=p),i+=f}if(s)throw new u("Unclosed quote in line",t.line,c??r+e.length);return l(),n}function Le(e){return e.match(/^\s*/)?.[0].length??0}function G(e){let t=e.split(/\r?\n/),n=[],r=null,i=!1,a=null;for(let o=0;o<t.length;o++){let s=t[o],c=o+1;if(!s.trim())continue;let l=Le(s),d=ne(s.slice(l),{line:c,columnOffset:l});if(d.length!==0){if(l===0){i=!1,a=null;let f=Qn(d,c);n.push(f),r=f;continue}if(!r)throw new u("Indented line without parent object",c,l+1);if(d.length===1&&d[0].value==="info"){i=!0,a=l;continue}i&&l<=(a??0)&&(i=!1),i?r.infoEntries.push(nr(d,c)):r.blockFields.push(tr(d,c))}}return{type:"document",objects:n}}function Qn(e,t){if(e.length<2)throw new u("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!fe.has(n.value))throw new u(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:er(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function er(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],a=D(i.value);if(!a)throw new u(`Unknown field "${i.value}"`,t,i.column);r++;let o=[];if(a.arity==="multiple")for(;r<e.length&&!Xe(e[r].value);)o.push(e[r]),r++;else{let s=e[r];s&&(o.push(s),r++)}if(o.length===0)throw new u(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:o.map(s=>s.value),location:{line:t,column:i.column}})}return n}function tr(e,t){if(e.length<2)throw new u("Invalid field line",t,e[0]?.column??1);if(!D(e[0].value))throw new u(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function nr(e,t){if(e.length<2)throw new u("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}var $t=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,rr=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),ir=/^[A-Za-z][A-Za-z0-9+.-]*:/;function V(e){let t=null,n=[];for(let r of e.objects){let i=or(r);if(r.objectType==="system"){if(t)throw u.fromLocation("Only one system object is allowed",r.location);t=i}else n.push(i)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",system:t,groups:[],relations:[],events:[],objects:n}}function or(e){let t=[...e.inlineFields,...e.blockFields];ar(e.objectType,t);let n=sr(t),r=cr(e.objectType,n),i=lr(n),a=fr(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof i.title=="string"?i.title:null,description:null,epoch:null,referencePlane:null,properties:i,info:a}:{type:e.objectType,id:e.name,properties:i,placement:r,info:a}}function ar(e,t){for(let n of t){let r=D(n.key);if(!r)throw u.fromLocation(`Unknown field "${n.key}"`,n.location);if(!Je(r,e))throw u.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw u.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function sr(e){let t=new Map;for(let n of e){if(t.has(n.key))throw u.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function cr(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),a=t.has("free"),o=[n,r,i,a].filter(Boolean).length;if(o>1){let s=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw u.fromLocation("Object has multiple placement modes",s?.location)}if(e==="system"&&o>0)throw u.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:Ae(t,"orbit"),distance:oe(t,"distance"),semiMajor:oe(t,"semiMajor"),eccentricity:hr(t,"eccentricity"),period:oe(t,"period"),angle:oe(t,"angle"),inclination:oe(t,"inclination"),phase:oe(t,"phase")};if(r){let s=Se(t,"at"),c=Ae(t,"at");return{mode:"at",target:c,reference:pr(c,s.location)}}if(i)return{mode:"surface",target:Ae(t,"surface")};if(a){let s=Ae(t,"free"),c=mr(s);return{mode:"free",distance:c??void 0,descriptor:c?void 0:s}}return null}function lr(e){let t={};for(let[n,r]of e.entries()){let i=D(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=yr(r);break;case"number":t[n]=jt(ae(r),n,r.location);break;case"unit":t[n]=kt(ae(r),r.location,n);break;case"string":t[n]=ur(n,r);break}}return t}function ur(e,t){let n=t.values.join(" ").trim();return e==="image"&&dr(n,t.location),n}function dr(e,t){if(!e)throw u.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw u.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(ir);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw u.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function fr(e){let t={};for(let n of e){if(n.key in t)throw u.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function pr(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw u.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw u.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function kt(e,t,n){let r=e.match($t);if(!r)throw u.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let a=D(n);if(a?.unitFamily&&!pe(a.unitFamily,i.unit))throw u.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function mr(e){let t=e.match($t);return t?{value:Number(t[1]),unit:t[2]??null}:null}function oe(e,t){if(!e.has(t))return;let n=Se(e,t);return kt(ae(n),n.location,t)}function hr(e,t){if(!e.has(t))return;let n=Se(e,t);return jt(ae(n),t,n.location)}function jt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw u.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function yr(e){let t=ae(e).toLowerCase(),n=rr.get(t);if(n===void 0)throw u.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Se(e,t){let n=e.get(t);if(!n)throw new u(`Missing value for key "${t}"`);return n}function Ae(e,t){return ae(Se(e,t))}function ae(e){if(e.values.length!==1)throw u.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var gr=new Set(["star","planet","moon","asteroid","comet"]);function W(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new u(`Duplicate object id "${r.id}"`);t.add(r.id),n.set(r.id,r)}for(let r of e.objects)if(r.placement){if((r.placement.mode==="orbit"||r.placement.mode==="surface")&&!t.has(r.placement.target))throw new u(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!gr.has(i.type))throw new u(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&br(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&wr(r,r.placement.reference,t))}}function br(e,t,n){if(!n.has(t.primary))throw new u(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new u(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function wr(e,t,n){if(!n.has(t.objectId))throw new u(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function xt(e){return{...e}}function F(e,t,n=`${t}.failed`){return e instanceof u?{code:n,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:n,severity:"error",source:t,message:e.message}:{code:n,severity:"error",source:t,message:String(e)}}function Te(e){let t;try{t=G(e)}catch(r){return{ok:!1,value:null,diagnostics:[F(r,"parse")]}}let n;try{n=V(t)}catch(r){return{ok:!1,value:null,diagnostics:[F(r,"normalize")]}}try{W(n)}catch(r){return{ok:!1,value:null,diagnostics:[F(r,"validate")]}}return{ok:!0,value:{ast:t,document:n},diagnostics:[]}}function Ot(e){try{return{ok:!0,value:V(e),diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[F(t,"normalize")]}}}function Lt(e){try{return W(e),{ok:!0,value:e,diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[F(t,"validate")]}}}var me=1495978707e-1,vr=6371,Ir=71492,$r=695700,kr=63241.077,jr=206264.806,xr=206264806,Pt=.68,Or=.2,Et=28;function re(e,t={}){let n=Sr(t),r=n.width,i=n.height,a=n.padding,o=Ar(e),s=Dr(e,t.projection),c=Fr(o,t.scaleModel),l=Er(o),d=e.system?.id??null,f=t.activeEventId??null,p=Lr(e.objects,e.events??[],f),m=new Map(p.map(h=>[h.id,h])),b=wi(p,m),I=new Map,j=[],L=[],g=[],k=[],R=[],Q=new Map,_=new Map;for(let h of p){let P=h.placement;if(!P){g.push(h);continue}if(P.mode==="orbit"){Tt(_,P.target,h);continue}if(P.mode==="surface"){Tt(Q,P.target,h);continue}if(P.mode==="at"){R.push(h);continue}k.push(h)}let Y=k.length>0?r*.42:r/2,q=i/2,C={orbitChildren:_,surfaceChildren:Q,objectMap:m,spacingFactor:l,projection:s,scaleModel:c},A=g.find(h=>h.type==="star")??g[0]??null;A&&Qe(A,Y,q,0,I,j,L,C);let ee=g.filter(h=>h.id!==A?.id);if(ee.length>0){let h=Math.min(r,i)*.28*l*c.orbitDistanceMultiplier;ee.forEach((P,x)=>{let Ge=be(x,ee.length,-Math.PI/2),te=we(Ge,h,s,1);Qe(P,Y+te.x,q+te.y,0,I,j,L,C)})}k.forEach((h,P)=>{let x=r-a-140-xi(h.placement?.mode==="free"?h.placement.distance:void 0,c),Ge=Math.max(76,(i-a*2-180)/Math.max(1,k.length)*l)*c.freePlacementMultiplier,te=a+92+P*Ge;I.set(h.id,{object:h,x,y:te,radius:Ee(h,0,c),sortKey:Re(x,te,0)}),L.push({object:h,groupId:b.groupIds.get(h.id)??null,x1:x-60,y1:te,x2:x-18,y2:te,mode:"free"}),Fe(h,I,j,L,C,1)}),R.forEach((h,P)=>{if(I.has(h.id)||!h.placement||h.placement.mode!=="at")return;let x=gi(h.placement.reference,I,m,P,R.length,r,i,a,C);I.set(h.id,{object:h,x:x.x,y:x.y,radius:Ee(h,2,c),sortKey:Re(x.x,x.y,2),anchorX:x.anchorX,anchorY:x.anchorY}),x.anchorX!==void 0&&x.anchorY!==void 0&&L.push({object:h,groupId:b.groupIds.get(h.id)??null,x1:x.anchorX,y1:x.anchorY,x2:x.x,y2:x.y,mode:"at"}),Fe(h,I,j,L,C,2)});let T=[...I.values()].map(h=>Mr(h,c,b)),B=j.map(h=>Rr(h,b.groupIds.get(h.object.id)??null)),U=L.map(h=>_r(h)),Oe=Nr(T,r,i,c.labelMultiplier),gt=qr(e,T),bt=Hr(e.events??[],T,f),Bn=Vr(B,gt,bt,U,T,Oe),zn=Wr(T,B,U,Oe,b,c.labelMultiplier),Un=Yr(e,T),Vn=Gr(e,s,n.preset,b,m),Wn=ci(r,i,T,B,U,Oe,c.labelMultiplier);return{width:r,height:i,padding:a,renderPreset:n.preset,projection:s,scaleModel:c,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:`${Dt(s)} view - ${Dt(o)} layout`,systemId:d,viewMode:s,layoutPreset:o,metadata:{format:e.format,version:e.version,view:s,scale:String(e.system?.properties.scale??o),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom"},contentBounds:Wn,layers:Bn,groups:zn,semanticGroups:Un,viewpoints:Vn,events:bt,activeEventId:f,objects:T,orbitVisuals:B,relations:gt,leaders:U,labels:Oe}}function Mt(e,t,n){let r=_e(n),i=Math.cos(r),a=Math.sin(r),o=e.x-t.x,s=e.y-t.y;return{x:t.x+o*i-s*a,y:t.y+o*a+s*i}}function Lr(e,t,n){let r=e.map(o=>structuredClone(o));if(!n)return r;let i=t.find(o=>o.id===n);if(!i)return r;let a=new Map(r.map(o=>[o.id,o]));for(let o of i.positions){let s=a.get(o.objectId);s&&(s.placement=o.placement?structuredClone(o.placement):null,o.inner?s.properties.inner={...o.inner}:delete s.properties.inner,o.outer?s.properties.outer={...o.outer}:delete s.properties.outer)}return r}function Ar(e){switch(String(e.system?.properties.scale??"balanced").toLowerCase()){case"compressed":case"compact":return"compact";case"expanded":case"presentation":return"presentation";default:return"balanced"}}function Sr(e){let t=Tr(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function Tr(e){switch(e){case"presentation":return{width:1440,height:900,padding:88};case"atlas-card":return{width:960,height:560,padding:56};case"markdown":return{width:920,height:540,padding:48};default:return{width:1200,height:780,padding:72}}}function Dr(e,t){return t==="topdown"||t==="isometric"?t:String(e.system?.properties.view??"topdown").toLowerCase()==="isometric"?"isometric":"topdown"}function Fr(e,t){return{...Pr(e),...t}}function Pr(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40}}}function Er(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Mr(e,t,n){let{object:r,x:i,y:a,radius:o,sortKey:s,anchorX:c,anchorY:l}=e,d=r.renderHints?.renderPriority??0;return{renderId:se(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:i,y:a,radius:o,visualRadius:ji(r,o,t),sortKey:s+d*.001,anchorX:c,anchorY:l,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:Li(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function Rr(e,t){return{renderId:`${se(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,semanticGroupIds:[...e.object.groups??[]],kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0||e.object.renderHints?.renderOrbit===!1}}function _r(e){return{renderId:`${se(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,semanticGroupIds:[...e.object.groups??[]],x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function Nr(e,t,n,r){let i=[],a=[],o=new Map(e.map(c=>[c.objectId,c])),s=[...e].filter(c=>!c.hidden&&c.object.renderHints?.renderLabel!==!1).sort(Cr);for(let c of s){let l=Br(c,o,a,t,n,r)??_t(c,Rt(c,o.get(c.parentId??"")??null,n),0,r);a.push(Vt(c,l,r)),i.push({renderId:`${c.renderId}-label`,objectId:c.objectId,object:c.object,groupId:c.groupId,semanticGroupIds:[...c.semanticGroupIds],label:c.label,secondaryLabel:c.secondaryLabel,x:l.x,y:l.labelY,secondaryY:l.secondaryY,textAnchor:l.textAnchor,direction:l.direction,hidden:c.hidden})}return i}function Cr(e,t){let n=At(e)-At(t);if(n!==0)return n;let r=(t.object.renderHints?.renderPriority??0)-(e.object.renderHints?.renderPriority??0);return r!==0?r:e.sortKey-t.sortKey}function At(e){switch(e.object.type){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":case"ring":return 3;case"asteroid":case"comet":return 4;case"structure":case"phenomenon":return 5}}function Br(e,t,n,r,i,a){for(let o of zr(e,t,r,i)){let s=o==="left"||o==="right"?4:6;for(let c=0;c<=s;c+=1){let l=_t(e,o,c,a),d=Vt(e,l,a);if(!n.some(f=>$i(f,d)))return l}}return null}function zr(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,a=Rt(e,i,r),o=a==="below"?"above":"below",s=Ur(e,i,n),c=s==="right"?"left":"right";return e.object.type==="structure"||e.object.type==="phenomenon"||e.object.placement?.mode==="at"||e.object.placement?.mode==="surface"||e.object.placement?.mode==="free"?[s,a,c,o]:[a,s,o,c]}function Rt(e,t,n){return t&&Math.abs(e.y-t.y)>6?e.y>=t.y?"below":"above":e.y>n*.62?"above":"below"}function Ur(e,t,n){return t&&Math.abs(e.x-t.x)>6?e.x>=t.x?"right":"left":e.x>=n/2?"right":"left"}function _t(e,t,n,r){let i=14*r;switch(t){case"above":{let a=e.y-(e.radius+18*r+n*i);return{x:e.x,labelY:a,secondaryY:a-16*r,textAnchor:"middle",direction:t}}case"below":{let a=e.y+e.radius+18*r+n*i;return{x:e.x,labelY:a,secondaryY:a+16*r,textAnchor:"middle",direction:t}}case"left":{let a=e.x-(e.visualRadius+16*r+n*i),o=e.y-4*r;return{x:a,labelY:o,secondaryY:o+16*r,textAnchor:"end",direction:t}}case"right":{let a=e.x+e.visualRadius+16*r+n*i,o=e.y-4*r;return{x:a,labelY:o,secondaryY:o+16*r,textAnchor:"start",direction:t}}}}function Vr(e,t,n,r,i,a){let o=e.filter(c=>!c.hidden&&!!c.backArcPath).map(c=>c.renderId),s=e.filter(c=>!c.hidden).map(c=>c.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(c=>!c.hidden).map(c=>c.renderId)},{id:"orbits-back",renderIds:o},{id:"orbits-front",renderIds:s},{id:"relations",renderIds:t.filter(c=>!c.hidden).map(c=>c.renderId)},{id:"events",renderIds:n.filter(c=>!c.hidden).map(c=>c.renderId)},{id:"objects",renderIds:i.filter(c=>!c.hidden).map(c=>c.renderId)},{id:"labels",renderIds:a.filter(c=>!c.hidden).map(c=>c.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function Wr(e,t,n,r,i,a){let o=new Map,s=c=>{if(!c)return null;let l=o.get(c);if(l)return l;let d=i.groupRoots.get(c)??null,f={renderId:c,rootObjectId:d,label:d??c,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:ge(0,0,0,0)};return o.set(c,f),f};for(let c of e){let l=s(c.groupId);l&&!c.hidden&&l.objectIds.push(c.objectId)}for(let c of t){let l=s(c.groupId);l&&!c.hidden&&l.orbitIds.push(c.objectId)}for(let c of n){let l=s(c.groupId);l&&!c.hidden&&l.leaderIds.push(c.objectId)}for(let c of r){let l=s(c.groupId);l&&!c.hidden&&l.labelIds.push(c.objectId)}for(let c of o.values())c.contentBounds=vi(c,e,t,n,r,a);return[...o.values()].sort((c,l)=>c.label.localeCompare(l.label))}function Yr(e,t){return[...e.groups].map(n=>({id:n.id,label:n.label,summary:n.summary,color:n.color,tags:[...n.tags],hidden:n.hidden,objectIds:t.filter(r=>!r.hidden&&r.semanticGroupIds.includes(n.id)).map(r=>r.objectId)})).sort((n,r)=>n.label.localeCompare(r.label))}function qr(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),a=n.get(r.to);return{renderId:`${se(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:i?.x??0,y1:i?.y??0,x2:a?.x??0,y2:a?.y??0,hidden:r.hidden||!i||!a||i.hidden||a.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function Hr(e,t,n){let r=new Map(t.map(i=>[i.objectId,i]));return e.map(i=>{let a=[...new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds])],o=a.map(l=>r.get(l)).filter(Boolean),s=o.length>0?o.reduce((l,d)=>l+d.x,0)/o.length:0,c=o.length>0?o.reduce((l,d)=>l+d.y,0)/o.length:0;return{renderId:`${se(i.id)}-event`,eventId:i.id,event:i,objectIds:a,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:s,y:c,hidden:i.hidden||o.length===0||o.every(l=>l.hidden)||n!==null&&i.id!==n}}).sort((i,a)=>i.event.id.localeCompare(a.event.id))}function Gr(e,t,n,r,i){let a=Kr(e,t,n),o=new Map;for(let[l,d]of Object.entries(e.system?.info??{})){if(!l.startsWith("viewpoint."))continue;let[f,p,...m]=l.split(".");if(f!=="viewpoint"||!p||m.length===0)continue;let b=oi(p);if(!b)continue;let I=m.join(".").toLowerCase(),j=o.get(b)??{id:b};Zr(j,I,d,e,t,n,r,i),o.set(b,j)}let s=[...o.values()].map(l=>Xr(l,t,n,i)).filter(Boolean),c=s.findIndex(l=>l.id===a.id);return c>=0?s.splice(c,1,{...a,...s[c],layers:{...a.layers,...s[c].layers},filter:s[c].filter??a.filter,generated:!1}):s.unshift(a),s.sort((l,d)=>l.id==="overview"?-1:d.id==="overview"?1:l.label.localeCompare(d.label))}function Kr(e,t,n){let r=e.system?.title??e.system?.properties.title;return{id:"overview",label:r?`${String(r)} Overview`:"Overview",summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function Zr(e,t,n,r,i,a,o,s){let c=n.trim();switch(t){case"label":case"title":c&&(e.label=c);return;case"summary":case"description":c&&(e.summary=c);return;case"focus":case"object":c&&(e.focus=c);return;case"select":case"selection":c&&(e.select=c);return;case"events":e.eventIds=ye(c);return;case"projection":case"view":e.projection=Qr(c)??i;return;case"preset":e.preset=ei(c)??a;return;case"rotation":case"angle":e.rotationDeg=Nt(c)??e.rotationDeg??0;return;case"zoom":case"scale":e.scale=ti(c);return;case"layers":e.layers=ni(c);return;case"query":e.filter={...e.filter??De(),query:c||null};return;case"types":case"objecttypes":e.filter={...e.filter??De(),objectTypes:ri(c)};return;case"tags":e.filter={...e.filter??De(),tags:ye(c)};return;case"groups":e.filter={...e.filter??De(),groupIds:ii(c,r,o,s)};return}}function Xr(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,a=e.select&&r.has(e.select)?e.select:i,o=Jr(e.filter),s=e.label?.trim()||ai(e.id);return{id:e.id,label:s,summary:e.summary?.trim()||si(s,i,o),objectId:i,selectedObjectId:a,eventIds:[...new Set(e.eventIds??[])],projection:e.projection??t,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:o,generated:!1}}function De(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Jr(e){if(!e)return null;let t={query:e.query?.trim()||null,objectTypes:[...new Set(e.objectTypes)],tags:[...new Set(e.tags)],groupIds:[...new Set(e.groupIds)]};return t.query||t.objectTypes.length>0||t.tags.length>0||t.groupIds.length>0?t:null}function Qr(e){return e.toLowerCase()==="isometric"?"isometric":e.toLowerCase()==="topdown"?"topdown":null}function ei(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function Nt(e){let t=Number(e);return Number.isFinite(t)?t:null}function ti(e){let t=Nt(e);return t!==null&&t>0?t:null}function ni(e){let t={};for(let n of ye(e)){let r=!n.startsWith("-")&&!n.startsWith("!"),i=n.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){t["orbits-back"]=r,t["orbits-front"]=r;continue}(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="relations"||i==="events"||i==="objects"||i==="labels"||i==="metadata")&&(t[i]=r)}return t}function ri(e){return ye(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function ii(e,t,n,r){return ye(e).map(i=>t.schemaVersion==="2.1"||t.groups.some(a=>a.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??he(i):(r.has(i),he(i)))}function ye(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function oi(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function ai(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function si(e,t,n){let r=[e];return t&&r.push(`focus ${t}`),n?.objectTypes.length&&r.push(n.objectTypes.join("/")),n?.tags.length&&r.push(`tags ${n.tags.join(", ")}`),n?.query&&r.push(`query "${n.query}"`),r.join(" - ")}function ci(e,t,n,r,i,a,o){let s=Number.POSITIVE_INFINITY,c=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,d=Number.NEGATIVE_INFINITY,f=(p,m)=>{s=Math.min(s,p),c=Math.min(c,m),l=Math.max(l,p),d=Math.max(d,m)};for(let p of r)p.hidden||Ct(p,f);for(let p of i)p.hidden||(f(p.x1,p.y1),f(p.x2,p.y2));for(let p of n)p.hidden||Bt(p,f);for(let p of a)p.hidden||zt(p,f,o);return!Number.isFinite(s)||!Number.isFinite(c)?ge(0,0,e,t):ge(s,c,l,d)}function Ct(e,t){let n=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-n,e.cy-e.radius-n),t(e.cx+e.radius+n,e.cy+e.radius+n);return}let r=e.rx??e.radius??0,i=e.ry??e.radius??0,a=Yt(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,Et*2);for(let o of a)t(o.x-n,o.y-n),t(o.x+n,o.y+n)}function ge(e,t,n,r){return{minX:e,minY:t,maxX:n,maxY:r,width:n-e,height:r-t,centerX:e+(n-e)/2,centerY:t+(r-t)/2}}function Bt(e,t){t(e.x-e.visualRadius-24,e.y-e.visualRadius-16),t(e.x+e.visualRadius+24,e.y+e.visualRadius+36)}function zt(e,t,n){let r=Wt(e.x,e.y,e.secondaryY,e.textAnchor,e.direction,e.label,e.secondaryLabel,n);t(r.left,r.top),t(r.right,r.bottom)}function Qe(e,t,n,r,i,a,o,s){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:Ee(e,r,s.scaleModel),sortKey:Re(t,n,r)}),Fe(e,i,a,o,s,r+1))}function Fe(e,t,n,r,i,a){let o=t.get(e.id);if(!o)return;let s=[...i.orbitChildren.get(e.id)??[]].sort(li),c=ui(s,o.radius,i.spacingFactor,i.scaleModel),l=pi(s,c);s.forEach((f,p)=>{let m=di(f,p,s.length,o,c,l[p]??c.innerPx,i);n.push({object:f,parentId:e.id,kind:m.kind,cx:m.cx,cy:m.cy,radius:m.radius,rx:m.rx,ry:m.ry,rotationDeg:m.rotationDeg,band:m.band,bandThickness:m.bandThickness,frontArcPath:m.frontArcPath,backArcPath:m.backArcPath}),Qe(f,m.objectX,m.objectY,a,t,n,r,i)});let d=[...i.surfaceChildren.get(e.id)??[]];d.forEach((f,p)=>{let m=be(p,d.length,-Math.PI/3),b=28*i.spacingFactor,I=we(m,o.radius,i.projection,i.projection==="isometric"?.9:1),j=we(m,o.radius+b,i.projection,i.projection==="isometric"?.9:1),L=o.x+I.x,g=o.y+I.y,k=o.x+j.x,R=o.y+j.y;t.set(f.id,{object:f,x:k,y:R,radius:Ee(f,a+1,i.scaleModel),sortKey:Re(k,R,a+1),anchorX:L,anchorY:g}),r.push({object:f,groupId:i.objectMap.has(f.id)?he(Ii(f,i.objectMap)):null,x1:L,y1:g,x2:k,y2:R,mode:"surface"}),Fe(f,t,n,r,i,a+1)})}function li(e,t){let n=Pe(e),r=Pe(t);return n!==null&&r!==null&&n!==r?n-r:n!==null&&r===null?-1:n===null&&r!==null?1:e.id.localeCompare(t.id)}function ui(e,t,n,r){let i=e.map(f=>Pe(f)),a=i.filter(f=>f!==null),o=t+56*n*r.orbitDistanceMultiplier,s=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(a.length===0)return{metrics:i,minMetric:0,maxMetric:0,metricSpread:0,innerPx:o,stepPx:s,pixelSpread:Math.max(s*Math.max(e.length-1,1),s),minimumGapPx:s*.42};let c=Math.min(...a),l=Math.max(...a),d=l-c;return{metrics:i,minMetric:c,maxMetric:l,metricSpread:d,innerPx:o,stepPx:s,pixelSpread:Math.max(s*Math.max(e.length-1,1),s),minimumGapPx:s*.42}}function di(e,t,n,r,i,a,o){let s=e.placement,c=e.type==="belt"||e.type==="ring";if(!s||s.mode!=="orbit"){let q=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:q,rotationDeg:0,band:c,bandThickness:c?12*o.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-q}}let l=O(typeof s.eccentricity=="number"?s.eccentricity:0,0,.92),d=a,f=Math.max(d*Math.sqrt(1-l*l),d*.18),p=tt(s.inclination)??0,m=o.projection==="isometric"?Math.max(Or,Math.cos(_e(p)))*Pt:1,b=Math.max(f*m,d*.14),I=tt(s.angle)??0,j=d*l,L=Ht(-j,0,I),g=r.x+L.x,k=r.y+L.y,R=hi(s.phase,t,n),Q=qt(g,k,d,b,I,R),_=o.projection==="topdown"&&l<=1e-4&&Math.abs(I)<=1e-4,Y=c?yi(e,d,i,o.scaleModel):void 0;return{kind:_?"circle":"ellipse",cx:_?r.x:g,cy:_?r.y:k,radius:_?d:void 0,rx:_?void 0:d,ry:_?void 0:b,rotationDeg:I,band:c,bandThickness:Y,frontArcPath:o.projection==="isometric"||c?St(g,k,d,b,I,0,Math.PI):void 0,backArcPath:o.projection==="isometric"||c?St(g,k,d,b,I,Math.PI,Math.PI*2):void 0,objectX:Q.x,objectY:Q.y}}function fi(e,t){return t.innerPx+t.stepPx*mi(Math.max(e,0)+1)}function pi(e,t){let n=[];return e.forEach((r,i)=>{let a=Pe(r),o=t.innerPx+i*t.stepPx,s=a===null?o:fi(a,t),c=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(s,c))}),n}function Pe(e){return!e.placement||e.placement.mode!=="orbit"?null:Me(e.placement.semiMajor??e.placement.distance??null)}function mi(e){return Math.log(e)/Math.log(2)}function hi(e,t,n){let r=e?tt(e):null;return r!==null?_e(r-90):be(t,n,-Math.PI/2)}function yi(e,t,n,r){let i=Me(et(e.properties.inner)),a=Me(et(e.properties.outer));if(i!==null&&a!==null){let s=Math.abs(a-i);if(n.metricSpread>0)return O(s/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let c=Math.max(Math.max(i,a),1e-4);return O(s/c*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function gi(e,t,n,r,i,a,o,s,c){if(e.kind==="lagrange")return bi(e,t,n,a,o);if(e.kind==="anchor"){let l=t.get(e.objectId);if(l){let d=be(r,i,Math.PI/5),f=(l.radius+36)*c.scaleModel.labelMultiplier,p=we(d,f,c.projection,c.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}if(e.kind==="named"){let l=t.get(e.name);if(l){let d=be(r,i,Math.PI/6),f=(l.radius+36)*c.scaleModel.labelMultiplier,p=we(d,f,c.projection,c.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}return{x:a-s-170,y:o-s-86-r*58*c.scaleModel.freePlacementMultiplier}}function bi(e,t,n,r,i){let a=e.secondary?t.get(e.primary):ki(e.primary,t,n),o=t.get(e.secondary??e.primary);if(!a||!o)return{x:r*.7,y:i*.25};let s=o.x-a.x,c=o.y-a.y,l=Math.hypot(s,c)||1,d=s/l,f=c/l,p=-f,m=d,b=O(l*.25,24,68);switch(e.point){case"L1":return{x:o.x-d*b,y:o.y-f*b,anchorX:o.x,anchorY:o.y};case"L2":return{x:o.x+d*b,y:o.y+f*b,anchorX:o.x,anchorY:o.y};case"L3":return{x:a.x-d*b,y:a.y-f*b,anchorX:a.x,anchorY:a.y};case"L4":return{x:o.x+(d*.5-p*.8660254)*b,y:o.y+(f*.5-m*.8660254)*b,anchorX:o.x,anchorY:o.y};case"L5":return{x:o.x+(d*.5+p*.8660254)*b,y:o.y+(f*.5+m*.8660254)*b,anchorX:o.x,anchorY:o.y}}}function wi(e,t){let n=new Map,r=new Map;for(let l of e){let d=Ut(l,t);if(n.set(l.id,d),d){let f=r.get(d);f?f.push(l.id):r.set(d,[l.id])}r.has(l.id)||r.set(l.id,[])}let i=new Map,a=new Map,o=new Map,s=l=>{let d=i.get(l);if(d)return d;let f=new Set,p=[],m=n.get(l)??null;for(;m&&!f.has(m);)p.push(m),f.add(m),m=n.get(m)??null;return i.set(l,p),p},c=l=>{let d=o.get(a.get(l)??"");if(d)return d;let f=n.get(l)??null,p=t.get(l),m=l;return p?.placement&&p.placement.mode!=="free"&&f&&(m=c(f)),m};for(let l of e){s(l.id);let d=c(l.id),f=he(d);a.set(l.id,f),o.set(f,d)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:a,groupRoots:o}}function Ut(e,t){let n=e.placement;if(!n)return null;switch(n.mode){case"orbit":case"surface":return t.has(n.target)?n.target:null;case"at":switch(n.reference.kind){case"anchor":return t.has(n.reference.objectId)?n.reference.objectId:null;case"named":return t.has(n.reference.name)?n.reference.name:null;case"lagrange":return n.reference.secondary&&t.has(n.reference.secondary)?n.reference.secondary:t.has(n.reference.primary)?n.reference.primary:null}case"free":return null}}function vi(e,t,n,r,i,a){let o=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,d=(f,p)=>{o=Math.min(o,f),s=Math.min(s,p),c=Math.max(c,f),l=Math.max(l,p)};for(let f of t)!f.hidden&&e.objectIds.includes(f.objectId)&&Bt(f,d);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&Ct(f,d);for(let f of r)!f.hidden&&e.leaderIds.includes(f.objectId)&&(d(f.x1,f.y1),d(f.x2,f.y2));for(let f of i)!f.hidden&&e.labelIds.includes(f.objectId)&&zt(f,d,a);return!Number.isFinite(o)||!Number.isFinite(s)?ge(0,0,0,0):ge(o,s,c,l)}function Ii(e,t){let n=e,r=new Set;for(;n.placement&&n.placement.mode!=="free"&&!r.has(n.id);){r.add(n.id);let i=Ut(n,t);if(!i)break;let a=t.get(i);if(!a)break;n=a}return n.id}function Vt(e,t,n){return Wt(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function Wt(e,t,n,r,i,a,o,s){let c=Ai(a,o,s),l=c*2,d=i==="above"?18:12,f=i==="above"?8:12,p=e-c,m=e+c;return r==="start"?(p=e,m=e+l):r==="end"&&(p=e-l,m=e),{left:p,right:m,top:Math.min(t,n)-d,bottom:Math.max(t,n)+f}}function $i(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function ki(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Ee(e,t,n){let r=Oi(e.properties.radius,n);if(r!==null)return r;let i=n.bodyRadiusMultiplier;switch(e.type){case"star":return O((t===0?28:20)*i,n.minBodyRadius,n.maxBodyRadius);case"planet":return O(12*i,n.minBodyRadius,n.maxBodyRadius);case"moon":return O(7*i,n.minBodyRadius,n.maxBodyRadius);case"belt":return O(5*i,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return O(5*i,n.minBodyRadius,n.maxBodyRadius);case"comet":return O(6*i,n.minBodyRadius,n.maxBodyRadius);case"ring":return O(5*i,n.minBodyRadius,n.maxBodyRadius);case"structure":return O(6*i,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return O(8*i,n.minBodyRadius,n.maxBodyRadius)}}function ji(e,t,n){let r=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"structure":return t+2;default:return Math.min(t+r,n.maxBodyRadius+10)}}function Me(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/me;case"m":return e.value/1e3/me;case"ly":return e.value*kr;case"pc":return e.value*jr;case"kpc":return e.value*xr;case"re":return e.value*vr/me;case"rj":return e.value*Ir/me;case"sol":return e.value*$r/me;default:return e.value}}function xi(e,t){let n=Me(e??null);return n===null||n<=0?0:O(n*96*t.freePlacementMultiplier,0,420)}function Oi(e,t){let n=et(e);if(!n)return null;let r;switch(n.unit){case"sol":r=O(n.value*22,14,40);break;case"re":r=O(n.value*10,6,18);break;case"km":r=O(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=O(n.value*4,4,20);break}return O(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function et(e){return!e||typeof e!="object"||!("value"in e)?null:e}function tt(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function be(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function St(e,t,n,r,i,a,o){let s=Yt(e,t,n,r,i,a,o,Et);return s.length===0?"":s.map((c,l)=>`${l===0?"M":"L"} ${Ft(c.x)} ${Ft(c.y)}`).join(" ")}function Yt(e,t,n,r,i,a,o,s){let c=[];for(let l=0;l<=s;l+=1){let d=a+(o-a)*l/s;c.push(qt(e,t,n,r,i,d))}return c}function qt(e,t,n,r,i,a){let o=n*Math.cos(a),s=r*Math.sin(a),c=Ht(o,s,i);return{x:e+c.x,y:t+c.y}}function Ht(e,t,n){let r=_e(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function we(e,t,n,r){let i=n==="isometric"?Pt*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function Re(e,t,n){return t*1e3+e+n*.01}function O(e,t,n){return Math.min(Math.max(e,t),n)}function Tt(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function se(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function he(e){return`${se(e)}-group`}function Li(e){return typeof e=="string"&&e.trim()?e:void 0}function Ai(e,t,n){let r=e.length*4.6*n+18,i=t.length*3.9*n+18;return Math.max(r,i,24)}function Dt(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function _e(e){return e*Math.PI/180}function Ft(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function ve(e,t={}){let n=re(e,t),r=[],i=Di(e,r),a=Fi(e,r),o=Ti(e,n.renderPreset??t.preset??null,n.projection),s=e.system?Si(e,o,i,a,r,n.renderPreset??t.preset??null):null;return n.viewpoints.some(c=>!c.generated)&&r.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${n.viewpoints.filter(c=>!c.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"2.0",schemaVersion:"2.0",sourceVersion:e.version,system:s,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:structuredClone(e.events??[]),objects:e.objects.map(Zt),diagnostics:r}}function Ne(e,t={}){return Vi(ve(e,t))}function Ie(e,t={}){let n=e.system?{type:"system",id:e.system.id,title:e.system.title,description:e.system.description,epoch:e.system.epoch,referencePlane:e.system.referencePlane,properties:Bi(e.system),info:zi(e.system)}:null,r=e.objects.map(Zt);return Ri(r,e.events??[],t.activeEventId??null),{format:"worldorbit",version:"1.0",schemaVersion:e.version,system:n,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:e.events.map(Ei),objects:r}}function Kt(e){return Ie(e)}function Si(e,t,n,r,i,a){let o=re(e,{preset:a??void 0,projection:t.view});return{type:"system",id:e.system?.id??"WorldOrbit",title:e.system?.title??(typeof e.system?.properties.title=="string"?e.system.properties.title:null),description:e.system?.description??null,epoch:e.system?.epoch??null,referencePlane:e.system?.referencePlane??null,defaults:t,atlasMetadata:n,viewpoints:o.viewpoints.map(Pi),annotations:r}}function Ti(e,t,n){return{view:typeof e.system?.properties.view=="string"&&e.system.properties.view.toLowerCase()==="topdown"?"topdown":n,scale:typeof e.system?.properties.scale=="string"?e.system.properties.scale:null,units:typeof e.system?.properties.units=="string"?e.system.properties.units:null,preset:t,theme:typeof e.system?.info["atlas.theme"]=="string"?e.system.info["atlas.theme"]:null}}function Di(e,t){let n={};for(let[i,a]of Object.entries(e.system?.info??{}))i.startsWith("viewpoint.")||i.startsWith("annotation.")||(n[i]=a);let r=Object.keys(n);return r.length>0&&t.push({code:"upgrade.atlasMetadata.preserved",severity:"warning",source:"upgrade",message:`Preserved ${r.length} system info entr${r.length===1?"y":"ies"} as atlas metadata in the 2.0 atlas document.`}),n}function Fi(e,t){let n=new Map;for(let[r,i]of Object.entries(e.system?.info??{})){if(!r.startsWith("annotation."))continue;let[,a,...o]=r.split(".");if(!a||o.length===0)continue;let s=Gt(a);if(!s)continue;let c=n.get(s)??{id:s};switch(o.join(".").toLowerCase()){case"label":c.label=i;break;case"target":case"object":c.targetObjectId=i.trim()||null;break;case"body":case"text":case"description":c.body=i;break;case"tags":c.tags=Ni(i);break}n.set(s,c)}for(let r of e.objects){let i=r.info.description;if(!i)continue;let a=Gt(`${r.id}-notes`);n.has(a)||(n.set(a,{id:a,label:`${r.id} Notes`,targetObjectId:r.id,body:i,tags:Array.isArray(r.properties.tags)?r.properties.tags.filter(o=>typeof o=="string"):[]}),t.push({code:"upgrade.annotation.objectDescription",severity:"info",source:"upgrade",message:`Lifted ${r.id}.info.description into structured atlas annotation "${a}".`,objectId:r.id,field:"description"}))}return[...n.values()].filter(r=>r.body||r.label).map(r=>({id:r.id,label:r.label??Ci(r.id),targetObjectId:r.targetObjectId??null,body:r.body??"",tags:r.tags??[],sourceObjectId:r.targetObjectId??null})).sort((r,i)=>r.label.localeCompare(i.label))}function Pi(e){return{id:e.id,label:e.label,summary:e.summary,focusObjectId:e.objectId,selectedObjectId:e.selectedObjectId,events:[...e.eventIds],projection:e.projection,preset:e.preset,zoom:e.scale,rotationDeg:e.rotationDeg,layers:{...e.layers},filter:e.filter?{query:e.filter.query,objectTypes:[...e.filter.objectTypes],tags:[...e.filter.tags],groupIds:[...e.filter.groupIds]}:null}}function Zt(e){return{...e,groups:e.groups?[...e.groups]:void 0,resonance:e.resonance?{...e.resonance}:e.resonance,renderHints:e.renderHints?{...e.renderHints}:e.renderHints,deriveRules:e.deriveRules?e.deriveRules.map(t=>({...t})):void 0,validationRules:e.validationRules?e.validationRules.map(t=>({...t})):void 0,lockedFields:e.lockedFields?[...e.lockedFields]:void 0,tolerances:e.tolerances?e.tolerances.map(t=>({field:t.field,value:t.value&&typeof t.value=="object"&&"value"in t.value?{value:t.value.value,unit:t.value.unit}:Array.isArray(t.value)?[...t.value]:t.value})):void 0,typedBlocks:e.typedBlocks?Object.fromEntries(Object.entries(e.typedBlocks).map(([t,n])=>[t,{...n??{}}])):void 0,properties:_i(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function Ei(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(Mi)}}function Mi(e){return{objectId:e.objectId,placement:Xt(e.placement),inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0}}function Xt(e){return e?structuredClone(e):null}function Ri(e,t,n){if(!n)return;let r=t.find(a=>a.id===n);if(!r)return;let i=new Map(e.map(a=>[a.id,a]));for(let a of r.positions){let o=i.get(a.objectId);o&&(o.placement=Xt(a.placement),a.inner?o.properties.inner={...a.inner}:delete o.properties.inner,a.outer?o.properties.outer={...a.outer}:delete o.properties.outer)}}function _i(e){let t={};for(let[n,r]of Object.entries(e)){if(Array.isArray(r)){t[n]=[...r];continue}if(r&&typeof r=="object"&&"value"in r){t[n]={value:r.value,unit:r.unit};continue}t[n]=r}return t}function Ni(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Gt(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Ci(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Bi(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),e.description&&(t.description=e.description),e.epoch&&(t.epoch=e.epoch),e.referencePlane&&(t.referencePlane=e.referencePlane),t}function zi(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let n of e.viewpoints){let r=`viewpoint.${n.id}`;t[`${r}.label`]=n.label,n.summary&&(t[`${r}.summary`]=n.summary),n.focusObjectId&&(t[`${r}.focus`]=n.focusObjectId),n.selectedObjectId&&(t[`${r}.select`]=n.selectedObjectId),n.projection&&(t[`${r}.projection`]=n.projection),n.preset&&(t[`${r}.preset`]=n.preset),n.zoom!==null&&(t[`${r}.zoom`]=String(n.zoom)),n.rotationDeg!==0&&(t[`${r}.rotation`]=String(n.rotationDeg));let i=Ui(n.layers);i&&(t[`${r}.layers`]=i),n.filter?.query&&(t[`${r}.query`]=n.filter.query),(n.filter?.objectTypes.length??0)>0&&(t[`${r}.types`]=n.filter?.objectTypes.join(" ")??""),(n.filter?.tags.length??0)>0&&(t[`${r}.tags`]=n.filter?.tags.join(" ")??""),(n.filter?.groupIds.length??0)>0&&(t[`${r}.groups`]=n.filter?.groupIds.join(" ")??""),n.events.length>0&&(t[`${r}.events`]=n.events.join(" "))}for(let n of e.annotations){let r=`annotation.${n.id}`;t[`${r}.label`]=n.label,n.targetObjectId&&(t[`${r}.target`]=n.targetObjectId),t[`${r}.body`]=n.body,n.tags.length>0&&(t[`${r}.tags`]=n.tags.join(" ")),n.sourceObjectId&&(t[`${r}.source`]=n.sourceObjectId)}return t}function Ui(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t.join(" ")}function Vi(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var Jt=["title","view","scale","units","kind","class","tags","color","image","hidden","orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"];function Be(e,t={}){let n=t.schema??"auto";if(n==="2.0"||n==="2.1"||n==="2.0-draft"||e.version==="2.0"||e.version==="2.1"||e.version==="2.0-draft"){if(n==="2.0-draft"){let c=e.version==="2.0-draft"?e:e.version==="2.0"||e.version==="2.1"?{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}:Ne(e);return nt(c)}let s=e.version==="2.0"||e.version==="2.1"?e:e.version==="2.0-draft"?{...e,version:"2.0",schemaVersion:"2.0"}:ve(e);return n==="2.1"&&s.version!=="2.1"?Ce({...s,version:"2.1",schemaVersion:"2.1"}):Ce(s)}let i=[],a=e;a.system&&i.push(...Wi(a.system));let o=[...a.objects].sort(ot);for(let s of o)i.length>0&&i.push(""),i.push(...qi(s));return i.join(`
2
+ `)}function Ce(e){let t=[`schema ${e.version}`,""];e.system&&t.push(...en(e.system));for(let r of[...e.groups].sort(ce))t.push(""),t.push(...on(r));for(let r of[...e.relations].sort(ce))t.push(""),t.push(...an(r));for(let r of[...e.events].sort(ce))t.push(""),t.push(...sn(r));let n=[...e.objects].sort(ot);return n.length>0&&t.at(-1)!==""&&t.push(""),n.forEach((r,i)=>{i>0&&t.push(""),t.push(...tn(r))}),t.join(`
3
+ `)}function nt(e){let t=e.version==="2.0-draft"?e:{...e,version:"2.0-draft",schemaVersion:"2.0-draft"},n=["schema 2.0-draft",""];t.system&&n.push(...en(t.system));for(let i of[...t.groups].sort(ce))n.push(""),n.push(...on(i));for(let i of[...t.relations].sort(ce))n.push(""),n.push(...an(i));for(let i of[...t.events].sort(ce))n.push(""),n.push(...sn(i));let r=[...t.objects].sort(ot);return r.length>0&&n.at(-1)!==""&&n.push(""),r.forEach((i,a)=>{a>0&&n.push(""),n.push(...tn(i))}),n.join(`
4
+ `)}function Wi(e){return Yi("system",e.id,e.properties,null,e.info)}function Yi(e,t,n,r,i){let a=[`${e} ${t}`],o=[...rt(r),...rn(n)];for(let c of o)a.push(` ${c}`);let s=Object.entries(i).sort(([c],[l])=>c.localeCompare(l));if(s.length>0){o.length>0&&a.push(""),a.push(" info");for(let[c,l]of s)a.push(` ${c} ${y(l)}`)}return a}function en(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${y(e.title)}`),e.description&&t.push(` description ${y(e.description)}`),e.epoch&&t.push(` epoch ${y(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${y(e.referencePlane)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${y(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${y(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${y(e.defaults.theme)}`),Object.keys(e.atlasMetadata).length>0){t.push(""),t.push("atlas"),t.push(" metadata");for(let[n,r]of Object.entries(e.atlasMetadata).sort(([i],[a])=>i.localeCompare(a)))t.push(` ${n} ${y(r)}`)}for(let n of e.viewpoints)t.push(""),t.push(...Gi(n));for(let n of e.annotations)t.push(""),t.push(...Ki(n));return t}function qi(e){return nn(e.type,e.id,e)}function tn(e){return nn(`object ${e.type}`,e.id,e)}function nn(e,t,n){let r=[`${e} ${t}`],i=[...rt(n.placement),...rn(n.properties),...Hi(n)];for(let o of i)r.push(` ${o}`);let a=Object.entries(n.info).sort(([o],[s])=>o.localeCompare(s));if(a.length>0){i.length>0&&r.push(""),r.push(" info");for(let[o,s]of a)r.push(` ${o} ${y(s)}`)}for(let o of["climate","habitability","settlement"]){let s=Object.entries(n.typedBlocks?.[o]??{}).sort(([c],[l])=>c.localeCompare(l));if(s.length>0){r.push(""),r.push(` ${o}`);for(let[c,l]of s)r.push(` ${c} ${y(l)}`)}}return r}function rt(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...K("distance",e.distance),...K("semiMajor",e.semiMajor),...Xi("eccentricity",e.eccentricity),...K("period",e.period),...K("angle",e.angle),...K("inclination",e.inclination),...K("phase",e.phase)];case"at":return[`at ${Ji(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?it(e.distance):e.descriptor??""}`.trim()]}}function rn(e){return Object.keys(e).sort(eo).map(t=>`${t} ${cn(e[t])}`)}function Hi(e){let t=[];e.groups?.length&&t.push(`groups ${e.groups.join(" ")}`),e.epoch&&t.push(`epoch ${y(e.epoch)}`),e.referencePlane&&t.push(`referencePlane ${y(e.referencePlane)}`),e.tidalLock!==void 0&&t.push(`tidalLock ${e.tidalLock?"true":"false"}`),e.renderHints?.renderLabel!==void 0&&t.push(`renderLabel ${e.renderHints.renderLabel?"true":"false"}`),e.renderHints?.renderOrbit!==void 0&&t.push(`renderOrbit ${e.renderHints.renderOrbit?"true":"false"}`),e.renderHints?.renderPriority!==void 0&&t.push(`renderPriority ${e.renderHints.renderPriority}`),e.resonance&&t.push(`resonance ${e.resonance.targetObjectId} ${e.resonance.ratio}`);for(let n of e.deriveRules??[])t.push(`derive ${n.field} ${n.strategy}`);for(let n of e.validationRules??[])t.push(`validate ${n.rule}`);e.lockedFields?.length&&t.push(`locked ${e.lockedFields.join(" ")}`);for(let n of e.tolerances??[])t.push(`tolerance ${n.field} ${cn(n.value)}`);return t}function Gi(e){let t=[`viewpoint ${e.id}`,` label ${y(e.label)}`];e.focusObjectId&&t.push(` focus ${e.focusObjectId}`),e.selectedObjectId&&e.selectedObjectId!==e.focusObjectId&&t.push(` select ${e.selectedObjectId}`),e.summary&&t.push(` summary ${y(e.summary)}`),e.projection&&t.push(` projection ${e.projection}`),e.preset&&t.push(` preset ${e.preset}`),e.zoom!==null&&t.push(` zoom ${e.zoom}`),e.rotationDeg!==0&&t.push(` rotation ${e.rotationDeg}`);let n=Qi(e.layers);return n.length>0&&t.push(` layers ${n.join(" ")}`),e.events.length>0&&t.push(` events ${e.events.join(" ")}`),e.filter&&(t.push(" filter"),e.filter.query&&t.push(` query ${y(e.filter.query)}`),e.filter.objectTypes.length>0&&t.push(` objectTypes ${e.filter.objectTypes.join(" ")}`),e.filter.tags.length>0&&t.push(` tags ${e.filter.tags.map(y).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function Ki(e){let t=[`annotation ${e.id}`,` label ${y(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${y(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),t}function on(e){let t=[`group ${e.id}`,` label ${y(e.label)}`];return e.summary&&t.push(` summary ${y(e.summary)}`),e.color&&t.push(` color ${y(e.color)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),e.hidden&&t.push(" hidden true"),t}function an(e){let t=[`relation ${e.id}`];return e.from&&t.push(` from ${y(e.from)}`),e.to&&t.push(` to ${y(e.to)}`),e.kind&&t.push(` kind ${y(e.kind)}`),e.label&&t.push(` label ${y(e.label)}`),e.summary&&t.push(` summary ${y(e.summary)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),e.color&&t.push(` color ${y(e.color)}`),e.hidden&&t.push(" hidden true"),t}function sn(e){let t=[`event ${e.id}`,` kind ${y(e.kind)}`];if(e.label&&t.push(` label ${y(e.label)}`),e.summary&&t.push(` summary ${y(e.summary)}`),e.targetObjectId&&t.push(` target ${e.targetObjectId}`),e.participantObjectIds.length>0&&t.push(` participants ${e.participantObjectIds.join(" ")}`),e.timing&&t.push(` timing ${y(e.timing)}`),e.visibility&&t.push(` visibility ${y(e.visibility)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),e.color&&t.push(` color ${y(e.color)}`),e.hidden&&t.push(" hidden true"),e.positions.length>0){t.push(""),t.push(" positions");for(let n of[...e.positions].sort(to)){t.push(` pose ${n.objectId}`);for(let r of Zi(n))t.push(` ${r}`)}}return t}function Zi(e){return[...rt(e.placement),...K("inner",e.inner),...K("outer",e.outer)]}function cn(e){return Array.isArray(e)?e.map(t=>y(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?y(e):it(e)}function it(e){return`${e.value}${e.unit??""}`}function K(e,t){return t?[`${e} ${it(t)}`]:[]}function Xi(e,t){return t===void 0?[]:[`${e} ${t}`]}function Ji(e){switch(e.kind){case"lagrange":return e.secondary?`${e.primary}-${e.secondary}:${e.point}`:`${e.primary}:${e.point}`;case"anchor":return`${e.objectId}:${e.anchor}`;case"named":return e.name}}function Qi(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t}function eo(e,t){let n=Jt.indexOf(e),r=Jt.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function ot(e,t){let n=Qt(e.type),r=Qt(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function ce(e,t){return e.id.localeCompare(t.id)}function to(e,t){return e.objectId.localeCompare(t.objectId)}function Qt(e){switch(e){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":return 3;case"asteroid":return 4;case"comet":return 5;case"ring":return 6;case"structure":return 7;case"phenomenon":return 8}}function y(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}var ln=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,no=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),ro=/^[A-Za-z][A-Za-z0-9+.-]*:/;function le(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function ke(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function at(e,t,n){let r=e.match(ln);if(!r)throw u.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let a=D(n);if(a?.unitFamily&&!pe(a.unitFamily,i.unit))throw u.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function st(e){let t=e.match(ln);return t?{value:Number(t[1]),unit:t[2]??null}:null}function ze(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw u.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Z(e,t,n){let r=no.get(e.toLowerCase());if(r===void 0)throw u.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function un(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw u.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw u.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function io(e,t){if(!e)throw u.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw u.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(ro);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw u.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function dn(e,t,n){let r=D(e);if(!r)throw u.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw u.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return Z($e(t,e,n),e,n);case"number":return ze($e(t,e,n),e,n);case"unit":return at($e(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&io(i,n),i}}}function ct(e,t,n){let r=D(e);if(!r)throw u.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw u.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function $e(e,t,n){if(e.length!==1)throw u.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var pn=new Set(["star","planet","moon","asteroid","comet"]),oo=332946.0487,ao=1047.3486,Ue=1495978707e-1,so=6371,co=695700,lo=63241.077,uo=206264.806,fo=206264806;function je(e,t){let n=[],r=new Map(e.objects.map(s=>[s.id,s])),i=new Set(e.groups.map(s=>s.id)),a=new Set(e.events.map(s=>s.id));e.system||n.push(v("validate.system.required","Atlas documents must declare exactly one system."));let o=new Map;for(let[s,c]of[["group",e.groups.map(l=>l.id)],["viewpoint",e.system?.viewpoints.map(l=>l.id)??[]],["annotation",e.system?.annotations.map(l=>l.id)??[]],["relation",e.relations.map(l=>l.id)],["event",e.events.map(l=>l.id)],["object",e.objects.map(l=>l.id)]])for(let l of c){let d=o.get(l);d?n.push(v("validate.id.duplicate",`Duplicate ${s} id "${l}" already used by ${d}.`)):o.set(l,s)}for(let s of e.relations)po(s,r,n);for(let s of e.system?.viewpoints??[])mo(s.filter,s.events??[],i,a,t,n,s.id);for(let s of e.objects)ho(s,e.system,r,i,n);for(let s of e.events)yo(s,r,n);return n}function po(e,t,n){e.from?t.has(e.from)||n.push(v("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(v("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(v("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(v("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(v("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function mo(e,t,n,r,i,a,o){if(i==="2.1"){if(e)for(let s of e.groupIds)n.has(s)||a.push(S("validate.viewpoint.group.unknown",`Unknown group "${s}" in viewpoint "${o}".`,void 0,`viewpoint.${o}.groups`));for(let s of t)r.has(s)||a.push(S("validate.viewpoint.event.unknown",`Unknown event "${s}" in viewpoint "${o}".`,void 0,`viewpoint.${o}.events`))}}function ho(e,t,n,r,i){let a=e.placement,o=a?.mode==="orbit"?a:null,s=a?.mode==="orbit"?n.get(a.target)??null:null;if(e.groups)for(let c of e.groups)r.has(c)||i.push(S("validate.group.unknown",`Unknown group "${c}" on "${e.id}".`,e.id,"groups"));if(o&&(n.has(o.target)||i.push(v("validate.orbit.target.unknown",`Unknown placement target "${o.target}" on "${e.id}".`,e.id,"orbit")),o.distance&&o.semiMajor&&i.push(v("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),o.phase&&!e.epoch&&!t?.epoch&&i.push(S("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),o.inclination&&!e.referencePlane&&!t?.referencePlane&&i.push(S("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),o.period&&!mn(s?.properties.mass)&&i.push(S("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),a?.mode==="surface"){let c=n.get(a.target);c?pn.has(c.type)||i.push(v("validate.surface.target.invalid",`Surface target "${a.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):i.push(v("validate.surface.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"surface"))}if(a?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&i.push(v("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),bo(e,n,i)||i.push(v("validate.at.target.unknown",`Unknown at-reference target "${a.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let c=n.get(e.resonance.targetObjectId);c?(e.placement?.mode!=="orbit"||c.placement?.mode!=="orbit"||e.placement.target!==c.placement.target)&&i.push(S("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):i.push(v("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let c of e.deriveRules??[]){if(c.field!=="period"||c.strategy!=="kepler"){i.push(S("validate.derive.unsupported",`Unsupported derive rule "${c.field} ${c.strategy}" on "${e.id}".`,e.id,"derive"));continue}let l=fn(e,s);if(l===null){i.push(S("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}o?.period||i.push($o("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Io(l)}.`,e.id,"derive"))}for(let c of e.validationRules??[]){if(c.rule!=="kepler"){i.push(S("validate.rule.unsupported",`Unsupported validation rule "${c.rule}" on "${e.id}".`,e.id,"validate"));continue}let l=hn(o?.period),d=fn(e,s);if(l===null||d===null)continue;let f=vo(e,"period");Math.abs(l-d)>f&&i.push(v("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function yo(e,t,n){let r=`event.${e.id}`,i=new Set;e.kind.trim()||n.push(v("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${r}.kind`)),!e.targetObjectId&&e.participantObjectIds.length===0&&n.push(v("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${r}.participants`)),e.targetObjectId&&(i.add(e.targetObjectId),t.has(e.targetObjectId)||n.push(v("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${r}.target`)));let a=new Set;for(let s of e.participantObjectIds){if(i.add(s),a.has(s)){n.push(S("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${s}".`,void 0,`${r}.participants`));continue}a.add(s),t.has(s)||n.push(v("validate.event.participants.unknown",`Unknown event participant "${s}" on "${e.id}".`,void 0,`${r}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&n.push(S("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${r}.target`)),e.positions.length===0&&n.push(S("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${r}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&i.size<3&&n.push(S("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${r}.participants`));let o=new Set;for(let s of e.positions){let c=`${r}.pose.${s.objectId}`;if(o.has(s.objectId)){n.push(v("validate.event.pose.duplicate",`Event "${e.id}" defines "${s.objectId}" more than once in positions.`,void 0,c));continue}o.add(s.objectId);let l=t.get(s.objectId);if(!l){n.push(v("validate.event.pose.object.unknown",`Unknown event pose object "${s.objectId}" on "${e.id}".`,void 0,c));continue}i.has(s.objectId)||n.push(S("validate.event.pose.unreferenced",`Event pose "${s.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,c)),go(s,l,t,n,c,e.id)}}function go(e,t,n,r,i,a){let o=e.placement;if(!o){r.push(v("validate.event.pose.placement.required",`Event "${a}" pose "${e.objectId}" is missing a placement mode.`,void 0,i));return}if(o.mode==="orbit"){n.has(o.target)||r.push(v("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${o.target}" on "${a}:${e.objectId}".`,void 0,`${i}.orbit`)),o.distance&&o.semiMajor&&r.push(v("validate.event.pose.orbit.distanceConflict",`Event "${a}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${i}.distance`));return}if(o.mode==="surface"){let s=n.get(o.target);s?pn.has(s.type)||r.push(v("validate.event.pose.surface.target.invalid",`Event surface target "${o.target}" on "${a}:${e.objectId}" is not surface-capable.`,void 0,`${i}.surface`)):r.push(v("validate.event.pose.surface.target.unknown",`Unknown event surface target "${o.target}" on "${a}:${e.objectId}".`,void 0,`${i}.surface`));return}if(o.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&r.push(v("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${a}:${e.objectId}".`,void 0,`${i}.at`));let s=o.reference;s.kind==="named"&&!n.has(s.name)?r.push(v("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${o.target}" on "${a}:${e.objectId}".`,void 0,`${i}.at`)):s.kind==="anchor"&&!n.has(s.objectId)?r.push(v("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${s.objectId}" on "${a}:${e.objectId}".`,void 0,`${i}.at`)):s.kind==="lagrange"&&(n.has(s.primary)?s.secondary&&!n.has(s.secondary)&&r.push(v("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${s.secondary}" on "${a}:${e.objectId}".`,void 0,`${i}.at`)):r.push(v("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${s.primary}" on "${a}:${e.objectId}".`,void 0,`${i}.at`)))}}function bo(e,t,n){let r=e.placement?.mode==="at"?e.placement.reference:null;return r?r.kind==="named"?t.has(r.name):r.kind==="anchor"?t.has(r.objectId)?!0:(n.push(v("validate.anchor.target.unknown",`Unknown anchor target "${r.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(r.primary)?r.secondary&&!t.has(r.secondary)?(n.push(v("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(v("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function fn(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=wo(n.semiMajor??n.distance),i=mn(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function wo(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Ue;case"m":return e.value/(Ue*1e3);case"ly":return e.value*lo;case"pc":return e.value*uo;case"kpc":return e.value*fo;case"re":return e.value*so/Ue;case"sol":return e.value*co/Ue;default:return null}}function mn(e){if(!e||typeof e!="object"||!("value"in e))return null;let t=e;switch(t.unit){case null:case"sol":return t.value;case"me":return t.value/oo;case"mj":return t.value/ao;default:return null}}function hn(e){if(!e)return null;switch(e.unit){case null:case"d":return e.value;case"s":return e.value/86400;case"min":return e.value/1440;case"h":return e.value/24;case"y":return e.value*365.25;case"ky":return e.value*365250;case"my":return e.value*36525e4;case"gy":return e.value*36525e7;default:return null}}function vo(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?hn(n)??0:0}function Io(e){return`${Math.round(e*100)/100}d`}function v(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function S(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function $o(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var ko=new Set(["climate","habitability","settlement"]),Ve=new Map;for(let e of["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","kind","class","culture","tags","color","image","hidden","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"]){let t=D(e);t&&Ve.set(e,{key:e,version:"2.0",inlineMode:t.arity==="multiple"?"multiple":"single",allowRepeat:!1,legacySchema:t})}for(let e of[{key:"groups",inlineMode:"multiple",allowRepeat:!1},{key:"epoch",inlineMode:"single",allowRepeat:!1},{key:"referencePlane",inlineMode:"single",allowRepeat:!1},{key:"tidalLock",inlineMode:"single",allowRepeat:!1},{key:"renderLabel",inlineMode:"single",allowRepeat:!1},{key:"renderOrbit",inlineMode:"single",allowRepeat:!1},{key:"renderPriority",inlineMode:"single",allowRepeat:!1},{key:"resonance",inlineMode:"pair",allowRepeat:!1},{key:"derive",inlineMode:"pair",allowRepeat:!0},{key:"validate",inlineMode:"single",allowRepeat:!0},{key:"locked",inlineMode:"multiple",allowRepeat:!1},{key:"tolerance",inlineMode:"pair",allowRepeat:!0}])Ve.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var jo=new Set(Ve.keys()),xo=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer"]);function We(e){return bn(e)}function gn(e){return bn(e,"2.0-draft")}function bn(e,t){let n=ua(e),r=n.source.split(/\r?\n/),i=[],a=!1,o="2.0",s=null,c=null,l=[],d=[],f=[],p=[],m=new Map,b=!1,I=!1,j=new Set,L=new Set,g=new Set,k=new Set,R=new Set;for(let A=0;A<r.length;A++){let ee=r[A],T=A+1;if(!ee.trim())continue;let B=Le(ee),U=ne(ee.slice(B),{line:T,columnOffset:B});if(U.length!==0){if(!a){o=Oo(U,T),a=!0,n.comments.length>0&&o!=="2.1"&&i.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${o}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(B===0){c=Lo(U,T,o,i,s,l,d,f,p,m,j,L,g,k,R,{sawDefaults:b,sawAtlas:I}),c.kind==="system"?s=c.system:c.kind==="defaults"?b=!0:c.kind==="atlas"&&(I=!0);continue}if(!c)throw new u("Indented line without parent atlas section",T,B+1);Mo(c,B,U,T)}}if(!a)throw new u('Missing required atlas schema header "schema 2.0"');let Q=l.map(A=>Qo(A,o,i)),_=p.map(A=>ea(A,m.get(A.id)??[])),Y=t??(o==="2.0-draft"?"2.0":o),q={format:"worldorbit",sourceVersion:"1.0",system:s,groups:d,relations:f,events:_,objects:Q,diagnostics:i};if(Y==="2.0-draft"){let A={...q,version:"2.0-draft",schemaVersion:"2.0-draft"};return A.diagnostics.push(...je(A,o)),A}let C={...q,version:Y,schemaVersion:Y};return o==="2.0-draft"&&C.diagnostics.push({code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}),C.diagnostics.push(...je(C,o)),C}function Oo(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1"].includes(e[1].value.toLowerCase()))throw new u('Expected atlas header "schema 2.0", "schema 2.1", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function Lo(e,t,n,r,i,a,o,s,c,l,d,f,p,m,b,I){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new u('Atlas section "system" may only appear once',t,e[0].column);return Ao(e,t,n,r);case"defaults":if(!i)throw new u('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(I.sawDefaults)throw new u('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:i,seenFields:new Set};case"atlas":if(!i)throw new u('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(I.sawAtlas)throw new u('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:i,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!i)throw new u('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return So(e,t,i,d,n,r);case"annotation":if(!i)throw new u('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return To(e,t,i,f);case"group":return M(n,r,"group",{line:t,column:e[0].column}),Do(e,t,o,p);case"relation":return M(n,r,"relation",{line:t,column:e[0].column}),Fo(e,t,s,m);case"event":return M(n,r,"event",{line:t,column:e[0].column}),Po(e,t,c,l,b,n,r);case"object":return Eo(e,t,n,r,a);default:throw new u(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function Ao(e,t,n,r){if(e.length!==2)throw new u("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},sourceSchemaVersion:n,diagnostics:r,seenFields:new Set}}function So(e,t,n,r,i,a){if(e.length!==2)throw new u("Invalid viewpoint declaration",t,e[0]?.column??1);let o=le(e[1].value);if(!o)throw new u("Viewpoint id must not be empty",t,e[1].column);if(r.has(o))throw new u(`Duplicate viewpoint id "${o}"`,t,e[1].column);let s={id:o,label:ke(o),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,layers:{},filter:null};return n.viewpoints.push(s),r.add(o),{kind:"viewpoint",viewpoint:s,sourceSchemaVersion:i,diagnostics:a,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set}}function To(e,t,n,r){if(e.length!==2)throw new u("Invalid annotation declaration",t,e[0]?.column??1);let i=le(e[1].value);if(!i)throw new u("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new u(`Duplicate annotation id "${i}"`,t,e[1].column);let a={id:i,label:ke(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(a),r.add(i),{kind:"annotation",annotation:a,seenFields:new Set}}function Do(e,t,n,r){if(e.length!==2)throw new u("Invalid group declaration",t,e[0]?.column??1);let i=le(e[1].value);if(!i)throw new u("Group id must not be empty",t,e[1].column);if(r.has(i))throw new u(`Duplicate group id "${i}"`,t,e[1].column);let a={id:i,label:ke(i),summary:"",color:null,tags:[],hidden:!1};return n.push(a),r.add(i),{kind:"group",group:a,seenFields:new Set}}function Fo(e,t,n,r){if(e.length!==2)throw new u("Invalid relation declaration",t,e[0]?.column??1);let i=le(e[1].value);if(!i)throw new u("Relation id must not be empty",t,e[1].column);if(r.has(i))throw new u(`Duplicate relation id "${i}"`,t,e[1].column);let a={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(a),r.add(i),{kind:"relation",relation:a,seenFields:new Set}}function Po(e,t,n,r,i,a,o){if(e.length!==2)throw new u("Invalid event declaration",t,e[0]?.column??1);let s=le(e[1].value);if(!s)throw new u("Event id must not be empty",t,e[1].column);if(i.has(s))throw new u(`Duplicate event id "${s}"`,t,e[1].column);let c={id:s,kind:"",label:ke(s),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,tags:[],color:null,hidden:!1,positions:[]},l=[];return n.push(c),r.set(s,l),i.add(s),{kind:"event",event:c,sourceSchemaVersion:a,diagnostics:o,seenFields:new Set,rawPoses:l,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function Eo(e,t,n,r,i){if(e.length<3)throw new u("Invalid atlas object declaration",t,e[0]?.column??1);let a=e[1],o=e[2],s=a.value;if(!fe.has(s)||s==="system")throw new u(`Unknown object type "${a.value}"`,t,a.column);let c={objectType:s,id:o.value,fields:Xo(e.slice(3),t,s,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:a.column}};return i.push(c),{kind:"object",objectNode:c,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function Mo(e,t,n,r){switch(e.kind){case"system":Ro(e,n,r);return;case"defaults":_o(e,n,r);return;case"atlas":No(e,t,n,r);return;case"viewpoint":Co(e,t,n,r);return;case"annotation":zo(e,n,r);return;case"group":Uo(e,n,r);return;case"relation":Vo(e,n,r);return;case"event":Wo(e,t,n,r);return;case"object":qo(e,t,n,r);return}}function Ro(e,t,n){let r=J(t,e.seenFields,n),i=$(t,n);switch(r){case"title":e.system.title=i;return;case"description":M(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":M(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":M(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=i;return;default:throw new u(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function _o(e,t,n){let r=J(t,e.seenFields,n),i=$(t,n);switch(r){case"view":e.system.defaults.view=wn(i,n,t[0].column);return;case"scale":e.system.defaults.scale=i;return;case"units":e.system.defaults.units=i;return;case"preset":e.system.defaults.preset=vn(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new u(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function No(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=$n(n,r,"Invalid atlas metadata entry");if(i.key in e.system.atlasMetadata)throw new u(`Duplicate atlas metadata key "${i.key}"`,r,n[0].column);e.system.atlasMetadata[i.key]=i.value;return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new u(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function Co(e,t,n,r){if(e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inFilter){Bo(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new u('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=J(n,e.seenFields,r),a=$(n,r);switch(i){case"label":e.viewpoint.label=a;return;case"summary":e.viewpoint.summary=a;return;case"focus":e.viewpoint.focusObjectId=a;return;case"select":e.viewpoint.selectedObjectId=a;return;case"projection":e.viewpoint.projection=wn(a,r,n[0].column);return;case"preset":e.viewpoint.preset=vn(a,r,n[0].column);return;case"zoom":e.viewpoint.zoom=Ko(a,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=In(a,r,n[0].column,"rotation");return;case"layers":e.viewpoint.layers=Go(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":M(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=z(n.slice(1),r,"events");return;default:throw new u(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function Bo(e,t,n){let r=J(t,e.seenFilterFields,n),i=e.viewpoint.filter??Zo();switch(r){case"query":i.query=$(t,n);break;case"objecttypes":i.objectTypes=Ho(t.slice(1),n);break;case"tags":i.tags=z(t.slice(1),n,"tags");break;case"groups":i.groupIds=z(t.slice(1),n,"groups");break;default:throw new u(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function zo(e,t,n){switch(J(t,e.seenFields,n)){case"label":e.annotation.label=$(t,n);return;case"target":e.annotation.targetObjectId=$(t,n);return;case"body":e.annotation.body=$(t,n);return;case"tags":e.annotation.tags=z(t.slice(1),n,"tags");return;default:throw new u(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function Uo(e,t,n){switch(J(t,e.seenFields,n)){case"label":e.group.label=$(t,n);return;case"summary":e.group.summary=$(t,n);return;case"color":e.group.color=$(t,n);return;case"tags":e.group.tags=z(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=Z($(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new u(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function Vo(e,t,n){switch(J(t,e.seenFields,n)){case"from":e.relation.from=$(t,n);return;case"to":e.relation.to=$(t,n);return;case"kind":e.relation.kind=$(t,n);return;case"label":e.relation.label=$(t,n);return;case"summary":e.relation.summary=$(t,n);return;case"tags":e.relation.tags=z(t.slice(1),n,"tags");return;case"color":e.relation.color=$(t,n);return;case"hidden":e.relation.hidden=Z($(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new u(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function Wo(e,t,n,r){if(e.activePose&&t<=(e.poseIndent??0)&&(e.activePose=null,e.poseIndent=null,e.activePoseSeenFields.clear()),!e.activePose&&e.inPositions&&t<=(e.positionsIndent??0)&&(e.inPositions=!1,e.positionsIndent=null),e.activePose){e.activePose.fields.push(Yo(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new u(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let a=n[1].value;if(!a.trim())throw new u("Event pose object id must not be empty",r,n[1].column);let o={objectId:a,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(o),e.activePose=o,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new u('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(J(n,e.seenFields,r)){case"kind":e.event.kind=$(n,r);return;case"label":e.event.label=$(n,r);return;case"summary":e.event.summary=$(n,r);return;case"target":e.event.targetObjectId=$(n,r);return;case"participants":e.event.participantObjectIds=z(n.slice(1),r,"participants");return;case"timing":e.event.timing=$(n,r);return;case"visibility":e.event.visibility=$(n,r);return;case"tags":e.event.tags=z(n.slice(1),r,"tags");return;case"color":e.event.color=$(n,r);return;case"hidden":e.event.hidden=Z($(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new u(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function Yo(e,t,n){if(e.length<2)throw new u("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!xo.has(r))throw new u(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new u(`Duplicate event pose field "${r}"`,t,e[0].column);return n.add(r),{type:"field",key:r,values:e.slice(1).map(i=>i.value),location:{line:t,column:e[0].column}}}function qo(e,t,n,r){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),n.length===1){let i=n[0].value.toLowerCase();if(i==="info"||ko.has(i)){i!=="info"&&M(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=$n(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(i.key))throw new u(`Duplicate info key "${i.key}"`,r,n[0].column);e.seenInfoKeys.add(i.key),e.objectNode.infoEntries.push(i);return}let a=e.activeBlock,o=e.seenTypedBlockKeys[a]??(e.seenTypedBlockKeys[a]=new Set);if(o.has(i.key))throw new u(`Duplicate ${a} key "${i.key}"`,r,n[0].column);o.add(i.key),(e.objectNode.typedBlockEntries[a]??(e.objectNode.typedBlockEntries[a]=[])).push(i);return}e.objectNode.fields.push(Jo(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function J(e,t,n){if(e.length<2)throw new u("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new u(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function $(e,t){if(e.length<2)throw new u("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function Ho(e,t){return z(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function Go(e,t,n,r){let i={};for(let a of z(e,t,"layers")){let o=!a.startsWith("-")&&!a.startsWith("!"),s=a.replace(/^[-!]+/,"").toLowerCase();if(s==="orbits"){i["orbits-back"]=o,i["orbits-front"]=o;continue}(s==="background"||s==="guides"||s==="orbits-back"||s==="orbits-front"||s==="relations"||s==="events"||s==="objects"||s==="labels"||s==="metadata")&&(s==="events"&&n&&r&&M(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[s]=o)}return i}function z(e,t,n){if(e.length===0)throw new u(`Missing value for atlas field "${n}"`,t,1);let r=e.map(i=>i.value).filter(Boolean);if(r.length===0)throw new u(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function wn(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric")throw new u(`Unknown projection "${e}"`,t,n);return r}function vn(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new u(`Unknown render preset "${e}"`,t,n)}function Ko(e,t,n,r){let i=In(e,t,n,r);if(i<=0)throw new u(`Field "${r}" must be greater than zero`,t,n);return i}function In(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new u(`Invalid numeric value "${e}" for "${r}"`,t,n);return i}function Zo(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Xo(e,t,n,r,i){let a=[],o=0;for(;o<e.length;){let s=e[o],c=xe(s.value);if(!c)throw new u(`Unknown field "${s.value}"`,t,s.column);c.version==="2.1"&&M(r,i,s.value,{line:t,column:s.column}),o++;let l=[];if(c.inlineMode==="single"){let d=e[o];d&&(l.push(d),o++)}else if(c.inlineMode==="pair")for(let d=0;d<2;d++){let f=e[o];if(!f)break;l.push(f),o++}else for(;o<e.length&&!jo.has(e[o].value);)l.push(e[o]),o++;if(l.length===0)throw new u(`Missing value for field "${s.value}"`,t,s.column);a.push({type:"field",key:s.value,values:l.map(d=>d.value),location:{line:t,column:s.column}})}return On(a,n),a}function Jo(e,t,n,r,i){if(e.length<2)throw new u("Invalid field line",t,e[0]?.column??1);let a=xe(e[0].value);if(!a)throw new u(`Unknown field "${e[0].value}"`,t,e[0].column);a.version==="2.1"&&M(r,i,e[0].value,{line:t,column:e[0].column});let o={type:"field",key:e[0].value,values:e.slice(1).map(s=>s.value),location:{line:t,column:e[0].column}};return On([o],n),o}function $n(e,t,n){if(e.length<2)throw new u(n,t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}function Qo(e,t,n){let r=kn(e.fields),i=jn(r),a=na(e.objectType,r),o=ca(r.get("groups")?.[0]),s=yn(r.get("epoch")?.[0]),c=yn(r.get("referencePlane")?.[0]),l=r.has("tidalLock")?Z(N(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,d=r.has("resonance")?oa(r.get("resonance")[0]):void 0,f=ia(r),p=r.get("derive")?.map(k=>aa(k)),m=r.get("validate")?.map(k=>({rule:N(k)})),b=r.has("locked")?[...new Set(r.get("locked").flatMap(k=>k.values))]:void 0,I=r.get("tolerance")?.map(k=>sa(k)),j=ra(e.typedBlockEntries),L=xn(e.infoEntries,"info"),g={type:e.objectType,id:e.id,properties:a,placement:i,info:L};return o.length>0&&(g.groups=o),s&&(g.epoch=s),c&&(g.referencePlane=c),l!==void 0&&(g.tidalLock=l),d&&(g.resonance=d),f&&(g.renderHints=f),p?.length&&(g.deriveRules=p),m?.length&&(g.validationRules=m),b?.length&&(g.lockedFields=b),I?.length&&(g.tolerances=I),j&&Object.keys(j).length>0&&(g.typedBlocks=j),t!=="2.1"&&(g.groups||g.epoch||g.referencePlane||g.tidalLock!==void 0||g.resonance||g.renderHints||g.deriveRules?.length||g.validationRules?.length||g.lockedFields?.length||g.tolerances?.length||g.typedBlocks)&&M(t,n,e.id,e.location),g}function ea(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>ta(n))}}function ta(e){let t=kn(e.fields),n=jn(t);return{objectId:e.objectId,placement:n,inner:X(t.get("inner")?.[0],"inner"),outer:X(t.get("outer")?.[0],"outer")}}function kn(e){let t=new Map;for(let n of e){let r=xe(n.key);if(!r)throw u.fromLocation(`Unknown field "${n.key}"`,n.location);if(!r.allowRepeat&&t.has(n.key))throw u.fromLocation(`Duplicate field "${n.key}"`,n.location);let i=t.get(n.key)??[];i.push(n),t.set(n.key,i)}return t}function jn(e){let t=e.get("orbit")?.[0],n=e.get("at")?.[0],r=e.get("surface")?.[0],i=e.get("free")?.[0];if([t,n,r,i].filter(Boolean).length>1){let o=t??n??r??i;throw u.fromLocation("Object has multiple placement modes",o?.location)}if(t)return{mode:"orbit",target:N(t),distance:X(e.get("distance")?.[0],"distance"),semiMajor:X(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:la(e.get("eccentricity")?.[0],"eccentricity"),period:X(e.get("period")?.[0],"period"),angle:X(e.get("angle")?.[0],"angle"),inclination:X(e.get("inclination")?.[0],"inclination"),phase:X(e.get("phase")?.[0],"phase")};if(n){let o=N(n);return{mode:"at",target:o,reference:un(o,n.location)}}if(r)return{mode:"surface",target:N(r)};if(i){let o=N(i),s=st(o);return{mode:"free",distance:s??void 0,descriptor:s?void 0:o}}return null}function na(e,t){let n={};for(let[r,i]of t.entries()){let a=i[0],o=xe(r);!a||!o?.legacySchema||o.legacySchema.placement||(ct(r,e,a.location),n[r]=dn(r,a.values,a.location))}return n}function xn(e,t){let n={};for(let r of e){if(r.key in n)throw u.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function ra(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=xn(r,n))}return t}function ia(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=Z(N(n),"renderLabel",n.location)),r&&(t.renderOrbit=Z(N(r),"renderOrbit",r.location)),i&&(t.renderPriority=ze(N(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function oa(e){if(e.values.length!==2)throw u.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw u.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function aa(e){if(e.values.length!==2)throw u.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function sa(e){if(e.values.length!==2)throw u.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=st(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function ca(e){return e?[...new Set(e.values)]:[]}function yn(e){return e&&e.values.join(" ").trim()||null}function X(e,t){return e?at(N(e),e.location,t):void 0}function la(e,t){return e?ze(N(e),t,e.location):void 0}function N(e){return $e(e.values,e.key,e.location)}function xe(e){return Ve.get(e)}function On(e,t){for(let n of e){let r=xe(n.key);if(!r)throw u.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){ct(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw u.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function M(e,t,n,r){e!=="2.1"&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function ua(e){let t=[...e],n=[],r=!1,i=!1,a=null,o=1,s=1;for(let c=0;c<t.length;c++){let l=t[c],d=t[c+1];if(i){if(l==="*"&&d==="/"){t[c]=" ",t[c+1]=" ",i=!1,a=null,c++,s+=2;continue}l!==`
5
+ `&&l!=="\r"&&(t[c]=" "),l===`
6
+ `?(o++,s=1):s++;continue}if(!r&&l==="/"&&d==="*"){n.push({kind:"block",line:o,column:s}),t[c]=" ",t[c+1]=" ",i=!0,a={line:o,column:s},c++,s+=2;continue}if(!r&&l==="#"&&!da(t,c)){n.push({kind:"line",line:o,column:s}),t[c]=" ";let f=c+1;for(;f<t.length&&t[f]!==`
7
+ `&&t[f]!=="\r";)t[f]=" ",f++;s+=f-c,c=f-1;continue}l==='"'&&t[c-1]!=="\\"&&(r=!r),l===`
8
+ `?(o++,s=1):s++}if(i)throw u.fromLocation("Unclosed block comment",a??void 0);return{source:t.join(""),comments:n}}function da(e,t){let n=t+1,r=0;for(;n<e.length&&/[0-9a-f]/i.test(e[n]??"");)n++,r++;if(![3,4,6,8].includes(r))return!1;let i=e[n];return i===void 0||i===" "||i===" "||i==="\r"||i===`
9
+ `}function lt(e="WorldOrbit",t="2.0"){return{format:"worldorbit",version:t,schemaVersion:t,sourceVersion:"1.0",system:{type:"system",id:e,title:e,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},groups:[],relations:[],events:[],objects:[],diagnostics:[]}}function Ye(e){return structuredClone(e)}function Ln(e){let t=[{kind:"system"},{kind:"defaults"}];if(e.system){for(let n of Object.keys(e.system.atlasMetadata).sort())t.push({kind:"metadata",key:n});for(let n of[...e.system.viewpoints].sort(ie))t.push({kind:"viewpoint",id:n.id});for(let n of[...e.system.annotations].sort(ie))t.push({kind:"annotation",id:n.id})}for(let n of[...e.groups].sort(ie))t.push({kind:"group",id:n.id});for(let n of[...e.relations].sort(ie))t.push({kind:"relation",id:n.id});for(let n of[...e.events].sort(ie)){t.push({kind:"event",id:n.id});for(let r of[...n.positions].sort(_n))t.push({kind:"event-pose",id:n.id,key:r.objectId})}for(let n of[...e.objects].sort(ie))t.push({kind:"object",id:n.id});return t}function ut(e,t){switch(t.kind){case"system":return e.system;case"defaults":return e.system?.defaults??null;case"metadata":return t.key?e.system?.atlasMetadata[t.key]??null:null;case"group":return t.id?Fn(e,t.id):null;case"event":return t.id?qe(e,t.id):null;case"event-pose":return t.id&&t.key?En(e,t.id,t.key):null;case"object":return t.id?Dn(e,t.id):null;case"viewpoint":return t.id?Mn(e.system,t.id):null;case"annotation":return t.id?Rn(e.system,t.id):null;case"relation":return t.id?Pn(e,t.id):null}}function dt(e,t,n){let r=Ye(e),i=mt(r);switch(t.kind){case"system":return r.system=n,r;case"defaults":return i.defaults={...i.defaults,...n},r;case"metadata":if(!t.key)throw new Error('Metadata updates require a "key" value.');return n==null||n===""?delete i.atlasMetadata[t.key]:i.atlasMetadata[t.key]=String(n),r;case"group":if(!t.id)throw new Error('Group updates require an "id" value.');return ue(r.groups,n),r;case"event":if(!t.id)throw new Error('Event updates require an "id" value.');return ue(r.events,n),r;case"event-pose":if(!t.id||!t.key)throw new Error('Event pose updates require an event "id" and pose "key" value.');return fa(r.events,t.id,n),r;case"object":if(!t.id)throw new Error('Object updates require an "id" value.');return ue(r.objects,n),r;case"viewpoint":if(!t.id)throw new Error('Viewpoint updates require an "id" value.');return ue(i.viewpoints,n),r;case"annotation":if(!t.id)throw new Error('Annotation updates require an "id" value.');return ue(i.annotations,n),r;case"relation":if(!t.id)throw new Error('Relation updates require an "id" value.');return ue(r.relations,n),r}}function An(e,t,n){return dt(e,t,n(ut(e,t)))}function Sn(e,t){let n=Ye(e),r=mt(n);switch(t.kind){case"metadata":return t.key&&delete r.atlasMetadata[t.key],n;case"object":return t.id&&(n.objects=n.objects.filter(i=>i.id!==t.id)),n;case"group":return t.id&&(n.groups=n.groups.filter(i=>i.id!==t.id)),n;case"event":return t.id&&(n.events=n.events.filter(i=>i.id!==t.id)),n;case"event-pose":if(t.id&&t.key){let i=qe(n,t.id);i&&(i.positions=i.positions.filter(a=>a.objectId!==t.key))}return n;case"viewpoint":return t.id&&(r.viewpoints=r.viewpoints.filter(i=>i.id!==t.id)),n;case"annotation":return t.id&&(r.annotations=r.annotations.filter(i=>i.id!==t.id)),n;case"relation":return t.id&&(n.relations=n.relations.filter(i=>i.id!==t.id)),n;default:return n}}function ft(e,t){return t.map(n=>({diagnostic:n,path:pt(e,n)}))}function pt(e,t){if(t.objectId&&Dn(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("group.")){let n=t.field.split(".");if(n[1]&&Fn(e,n[1]))return{kind:"group",id:n[1]}}if(t.field?.startsWith("viewpoint.")){let n=t.field.split(".");if(n[1]&&Mn(e.system,n[1]))return{kind:"viewpoint",id:n[1]}}if(t.field?.startsWith("annotation.")){let n=t.field.split(".");if(n[1]&&Rn(e.system,n[1]))return{kind:"annotation",id:n[1]}}if(t.field?.startsWith("relation.")){let n=t.field.split(".");if(n[1]&&Pn(e,n[1]))return{kind:"relation",id:n[1]}}if(t.field?.startsWith("event.")){let n=t.field.split(".");if(n[1]&&qe(e,n[1]))return n[2]==="pose"&&n[3]&&En(e,n[1],n[3])?{kind:"event-pose",id:n[1],key:n[3]}:{kind:"event",id:n[1]}}return t.field&&t.field in mt(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function Tn(e){let t=[...e.diagnostics,...je(e,e.version)];return ft(e,t)}function mt(e){return e.system||(e.system=lt().system),e.system}function Dn(e,t){return e.objects.find(n=>n.id===t)??null}function Fn(e,t){return e.groups.find(n=>n.id===t)??null}function Pn(e,t){return e.relations.find(n=>n.id===t)??null}function qe(e,t){return e.events.find(n=>n.id===t)??null}function En(e,t,n){return qe(e,t)?.positions.find(r=>r.objectId===n)??null}function Mn(e,t){return e?.viewpoints.find(n=>n.id===t)??null}function Rn(e,t){return e?.annotations.find(n=>n.id===t)??null}function ue(e,t){let n=e.findIndex(r=>r.id===t.id);if(n===-1){e.push(t),e.sort(ie);return}e[n]=t}function fa(e,t,n){let r=e.find(a=>a.id===t);if(!r)throw new Error(`Unknown event "${t}" for pose update.`);let i=r.positions.findIndex(a=>a.objectId===n.objectId);if(i===-1){r.positions.push(n),r.positions.sort(_n);return}r.positions[i]=n}function ie(e,t){return e.id.localeCompare(t.id)}function _n(e,t){return e.objectId.localeCompare(t.objectId)}var pa=/^schema\s+2(?:\.0|\.1)?$/i,ma=/^schema\s+2\.1$/i,ha=/^schema\s+2\.0-draft$/i;function ht(e){for(let t of ya(e).split(/\r?\n/)){let n=t.trim();if(n)return ha.test(n)?"2.0-draft":ma.test(n)?"2.1":pa.test(n)?"2.0":"1.0"}return"1.0"}function ya(e){let t=[...e],n=!1,r=!1;for(let i=0;i<t.length;i++){let a=t[i],o=t[i+1];if(r){if(a==="*"&&o==="/"){t[i]=" ",t[i+1]=" ",r=!1,i++;continue}a!==`
10
+ `&&a!=="\r"&&(t[i]=" ");continue}if(!n&&a==="/"&&o==="*"){t[i]=" ",t[i+1]=" ",r=!0,i++;continue}if(!n&&a==="#"){t[i]=" ";let s=i+1;for(;s<t.length&&t[s]!==`
11
+ `&&t[s]!=="\r";)t[s]=" ",s++;i=s-1;continue}a==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function He(e){let t=yt(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new u(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function yt(e){let t=ht(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1")return ga(e,t);let n;try{n=G(e)}catch(i){return{ok:!1,value:null,diagnostics:[F(i,"parse")]}}let r;try{r=V(n)}catch(i){return{ok:!1,value:null,diagnostics:[F(i,"normalize")]}}try{W(r)}catch(i){return{ok:!1,value:null,diagnostics:[F(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function ga(e,t){let n;try{n=We(e)}catch(o){return{ok:!1,value:null,diagnostics:[F(o,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(o=>o.severity==="error"))return{ok:!1,value:null,diagnostics:r};let i;try{i=Ie(n)}catch(o){return{ok:!1,value:null,diagnostics:[F(o,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var ba=/^```worldorbit(?:\s+(.*))?\s*$/;function Nn(e){let t=e.split(/\r?\n/),n=[],r=!1,i=null,a=0,o=[];return t.forEach((s,c)=>{let l=c+1;if(!r){let d=s.match(ba);d&&(r=!0,i=d[1]??null,a=l,o=[]);return}if(s.trim()==="```"){n.push({source:o.join(`
12
+ `),info:i,startLine:a,endLine:l}),r=!1,i=null,a=0,o=[];return}o.push(s)}),n}function Cn(e){let t=G(e),n=V(t);return W(n),{ast:t,document:n}}function wa(e){let t=Cn(e);return{...t,scene:re(t.document)}}function va(e){return He(e)}function Ia(e){return Te(e)}function $a(e,t={}){return Be(e,t)}return Zn(ka);})();