worldorbit 3.0.2 → 3.0.6

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.
@@ -1,15 +1,15 @@
1
- "use strict";var WorldOrbitMarkdown=(()=>{var ot=Object.defineProperty;var tr=Object.getOwnPropertyDescriptor;var nr=Object.getOwnPropertyNames;var rr=Object.prototype.hasOwnProperty;var ir=(e,t)=>{for(var n in t)ot(e,n,{get:t[n],enumerable:!0})},or=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of nr(t))!rr.call(e,i)&&i!==n&&ot(e,i,{get:()=>t[i],enumerable:!(r=tr(t,i))||r.enumerable});return e};var ar=e=>or(ot({},"__esModule",{value:!0}),e);var gs={};ir(gs,{rehypeWorldOrbit:()=>Xn,remarkWorldOrbit:()=>Yn,renderWorldOrbitBlock:()=>ue,renderWorldOrbitError:()=>Vt});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 de=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],V=de.filter(e=>e!=="system"),sr=["star","planet","moon","asteroid","comet","structure","phenomenon"],zt=["structure","phenomenon"],q=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],lr=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function v(e,t){return{key:e,...t}}var Te=new Set(de),Bt=new Map([v("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:q}),v("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:q,unitFamily:"distance"}),v("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:q,unitFamily:"distance"}),v("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:q}),v("period",{kind:"unit",placement:!0,arity:"single",objectTypes:q,unitFamily:"duration"}),v("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:q,unitFamily:"angle"}),v("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:q,unitFamily:"angle"}),v("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:q,unitFamily:"angle"}),v("at",{kind:"string",placement:!0,arity:"single",objectTypes:zt}),v("surface",{kind:"string",placement:!0,arity:"single",objectTypes:zt}),v("free",{kind:"string",placement:!0,arity:"single",objectTypes:lr}),v("kind",{kind:"string",placement:!1,arity:"single",objectTypes:V}),v("class",{kind:"string",placement:!1,arity:"single",objectTypes:V}),v("culture",{kind:"string",placement:!1,arity:"single",objectTypes:V}),v("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:de}),v("color",{kind:"string",placement:!1,arity:"single",objectTypes:de}),v("image",{kind:"string",placement:!1,arity:"single",objectTypes:sr}),v("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:de}),v("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:V,unitFamily:"radius"}),v("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:V,unitFamily:"mass"}),v("density",{kind:"unit",placement:!1,arity:"single",objectTypes:V,unitFamily:"generic"}),v("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:V,unitFamily:"generic"}),v("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:V,unitFamily:"generic"}),v("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:V}),v("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),v("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),v("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),v("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),v("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),v("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),v("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),v("on",{kind:"string",placement:!1,arity:"single",objectTypes:V}),v("source",{kind:"string",placement:!1,arity:"single",objectTypes:V}),v("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:V,unitFamily:"duration"})].map(e=>[e.key,e])),cr=new Set(Bt.keys());function P(e){return Bt.get(e)}function _t(e){return cr.has(e)}function Nt(e,t){return e.objectTypes.includes(t)}function Le(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 fe(e,t={}){let n=[],r=t.columnOffset??0,i="",o=null,a=!1,l=!1,s=null,c=()=>{o!==null&&(n.push({value:i,column:o,quoted:a}),i="",o=null,a=!1)};for(let u=0;u<e.length;u++){let f=e[u],m=r+u+1;if(l&&f==="\\"){let h=e[u+1];if(h==='"'||h==="\\"){i+=h,u++;continue}}if(f==='"'){l?l=!1:(o===null&&(o=m),a=!0,s=m,l=!0);continue}if(!l&&/\s/.test(f)){c();continue}o===null&&(o=m),i+=f}if(l)throw new d("Unclosed quote in line",t.line,s??r+e.length);return c(),n}function Pe(e){return e.match(/^\s*/)?.[0].length??0}function pe(e){let t=e.split(/\r?\n/),n=[],r=null,i=!1,o=null;for(let a=0;a<t.length;a++){let l=t[a],s=a+1;if(!l.trim())continue;let c=Pe(l),u=fe(l.slice(c),{line:s,columnOffset:c});if(u.length!==0){if(c===0){i=!1,o=null;let f=ur(u,s);n.push(f),r=f;continue}if(!r)throw new d("Indented line without parent object",s,c+1);if(u.length===1&&u[0].value==="info"){i=!0,o=c;continue}i&&c<=(o??0)&&(i=!1),i?r.infoEntries.push(pr(u,s)):r.blockFields.push(fr(u,s))}}return{type:"document",objects:n}}function ur(e,t){if(e.length<2)throw new d("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!Te.has(n.value))throw new d(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:dr(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function dr(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],o=P(i.value);if(!o)throw new d(`Unknown field "${i.value}"`,t,i.column);r++;let a=[];if(o.arity==="multiple")for(;r<e.length&&!_t(e[r].value);)a.push(e[r]),r++;else{let l=e[r];l&&(a.push(l),r++)}if(a.length===0)throw new d(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:a.map(l=>l.value),location:{line:t,column:i.column}})}return n}function fr(e,t){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);if(!P(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 pr(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 Ut=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,mr=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),hr=/^[A-Za-z][A-Za-z0-9+.-]*:/;function me(e){let t=null,n=[];for(let r of e.objects){let i=gr(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:[],events:[],objects:n}}function gr(e){let t=[...e.inlineFields,...e.blockFields];br(e.objectType,t);let n=yr(t),r=wr(e.objectType,n),i=vr(n),o=xr(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:o}:{type:e.objectType,id:e.name,properties:i,placement:r,info:o}}function br(e,t){for(let n of t){let r=P(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(!Nt(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 yr(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 wr(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),o=t.has("free"),a=[n,r,i,o].filter(Boolean).length;if(a>1){let l=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw d.fromLocation("Object has multiple placement modes",l?.location)}if(e==="system"&&a>0)throw d.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:De(t,"orbit"),distance:oe(t,"distance"),semiMajor:oe(t,"semiMajor"),eccentricity:kr(t,"eccentricity"),period:oe(t,"period"),angle:oe(t,"angle"),inclination:oe(t,"inclination"),phase:oe(t,"phase")};if(r){let l=Ee(t,"at"),s=De(t,"at");return{mode:"at",target:s,reference:jr(s,l.location)}}if(i)return{mode:"surface",target:De(t,"surface")};if(o){let l=De(t,"free"),s=Sr(l);return{mode:"free",distance:s??void 0,descriptor:s?void 0:l}}return null}function vr(e){let t={};for(let[n,r]of e.entries()){let i=P(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=Mr(r);break;case"number":t[n]=Yt(ae(r),n,r.location);break;case"unit":t[n]=Wt(ae(r),r.location,n);break;case"string":t[n]=Ir(n,r);break}}return t}function Ir(e,t){let n=t.values.join(" ").trim();return e==="image"&&$r(n,t.location),n}function $r(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(hr);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 xr(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 jr(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 Wt(e,t,n){let r=e.match(Ut);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=P(n);if(o?.unitFamily&&!Le(o.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Sr(e){let t=e.match(Ut);return t?{value:Number(t[1]),unit:t[2]??null}:null}function oe(e,t){if(!e.has(t))return;let n=Ee(e,t);return Wt(ae(n),n.location,t)}function kr(e,t){if(!e.has(t))return;let n=Ee(e,t);return Yt(ae(n),t,n.location)}function Yt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Mr(e){let t=ae(e).toLowerCase(),n=mr.get(t);if(n===void 0)throw d.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Ee(e,t){let n=e.get(t);if(!n)throw new d(`Missing value for key "${t}"`);return n}function De(e,t){return ae(Ee(e,t))}function ae(e){if(e.values.length!==1)throw d.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var Or=new Set(["star","planet","moon","asteroid","comet"]);function he(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||!Or.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"&&Ar(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&Tr(r,r.placement.reference,t))}}function Ar(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 Tr(e,t,n){if(!n.has(t.objectId))throw new d(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function te(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)}}var ge=1495978707e-1,Lr=6371,Pr=71492,Dr=695700,Er=63241.077,Fr=206264.806,Vr=206264806,Jt=.68,Cr=.2,Qt=28;function z(e,t={}){let n=Br(t),r=n.width,i=n.height,o=n.padding,a=zr(e),l=Nr(e,t.projection),s=dt(t.camera??null),c=ut(l,s),u=Yr(a,t.scaleModel),f=Xr(a),m=e.system?.id??null,h=t.activeEventId??null,y=Rr(e.objects,e.events??[],h),g=new Map(y.map(b=>[b.id,b])),x=Ti(y,g),S=new Map,p=[],$=[],D=[],_=[],E=[],G=new Map,X=new Map;for(let b of y){let F=b.placement;if(!F){D.push(b);continue}if(F.mode==="orbit"){Ht(X,F.target,b);continue}if(F.mode==="surface"){Ht(G,F.target,b);continue}if(F.mode==="at"){E.push(b);continue}_.push(b)}let Q=_.length>0?r*.42:r/2,A=i/2,N={orbitChildren:X,surfaceChildren:G,objectMap:g,spacingFactor:f,projection:c,scaleModel:u},U=D.find(b=>b.type==="star")??D[0]??null;U&&st(U,Q,A,0,S,p,$,N);let W=D.filter(b=>b.id!==U?.id);if(W.length>0){let b=Math.min(r,i)*.28*f*u.orbitDistanceMultiplier;W.forEach((F,k)=>{let it=Ie(k,W.length,-Math.PI/2),ee=$e(it,b,c,1);st(F,Q+ee.x,A+ee.y,0,S,p,$,N)})}_.forEach((b,F)=>{let k=r-o-140-Vi(b.placement?.mode==="free"?b.placement.distance:void 0,u),it=Math.max(76,(i-o*2-180)/Math.max(1,_.length)*f)*u.freePlacementMultiplier,ee=o+92+F*it;S.set(b.id,{object:b,x:k,y:ee,radius:ze(b,0,u),sortKey:_e(k,ee,0)}),$.push({object:b,groupId:x.groupIds.get(b.id)??null,x1:k-60,y1:ee,x2:k-18,y2:ee,mode:"free"}),Ce(b,S,p,$,N,1)}),E.forEach((b,F)=>{if(S.has(b.id)||!b.placement||b.placement.mode!=="at")return;let k=Oi(b.placement.reference,S,g,F,E.length,r,i,o,N);S.set(b.id,{object:b,x:k.x,y:k.y,radius:ze(b,2,u),sortKey:_e(k.x,k.y,2),anchorX:k.anchorX,anchorY:k.anchorY}),k.anchorX!==void 0&&k.anchorY!==void 0&&$.push({object:b,groupId:x.groupIds.get(b.id)??null,x1:k.anchorX,y1:k.anchorY,x2:k.x,y2:k.y,mode:"at"}),Ce(b,S,p,$,N,2)});let L=[...S.values()].map(b=>qr(b,u,x)),Me=p.map(b=>Hr(b,x.groupIds.get(b.object.id)??null)),Oe=$.map(b=>Kr(b)),Ae=Zr(L,r,i,u.labelMultiplier),Ct=oi(e,L),Rt=ai(e.events??[],L,h),Kn=ni(Me,Ct,Rt,Oe,L,Ae),Zn=ri(L,Me,Oe,Ae,x,u.labelMultiplier),Jn=ii(e,L),Qn=si(e,l,n.preset,x,g),er=wi(r,i,L,Me,Oe,Ae,u.labelMultiplier);return{width:r,height:i,padding:o,renderPreset:n.preset,projection:l,renderProjection:c,camera:s,scaleModel:u,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:Wr(l,c,a,s),systemId:m,viewMode:l,layoutPreset:a,metadata:{format:e.format,version:e.version,view:l,renderProjection:c,scale:String(e.system?.properties.scale??a),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom",...s?.azimuth!==null?{"camera.azimuth":String(s?.azimuth)}:{},...s?.elevation!==null?{"camera.elevation":String(s?.elevation)}:{},...s?.roll!==null?{"camera.roll":String(s?.roll)}:{},...s?.distance!==null?{"camera.distance":String(s?.distance)}:{}},contentBounds:er,layers:Kn,groups:Zn,semanticGroups:Jn,viewpoints:Qn,events:Rt,activeEventId:h,objects:L,orbitVisuals:Me,relations:Ct,leaders:Oe,labels:Ae}}function Rr(e,t,n){let r=e.map(l=>structuredClone(l));if(!n)return r;let i=t.find(l=>l.id===n);if(!i)return r;let o=new Map(r.map(l=>[l.id,l])),a=new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds,...i.positions.map(l=>l.objectId)]);for(let l of a){let s=o.get(l);s&&(i.epoch&&(s.epoch=i.epoch),i.referencePlane&&(s.referencePlane=i.referencePlane))}for(let l of i.positions){let s=o.get(l.objectId);s&&(l.placement&&(s.placement=structuredClone(l.placement)),l.inner&&(s.properties.inner={...l.inner}),l.outer&&(s.properties.outer={...l.outer}),l.epoch&&(s.epoch=l.epoch),l.referencePlane&&(s.referencePlane=l.referencePlane))}return r}function zr(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 Br(e){let t=_r(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function _r(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 Nr(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return nn(n)??"topdown"}function ut(e,t){switch(e){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return t&&(t.azimuth!==null||t.elevation!==null||t.roll!==null)?"isometric":"topdown";case"perspective":return"isometric"}}function dt(e){if(!e)return null;let t={azimuth:at(e.azimuth),elevation:at(e.elevation),roll:at(e.roll),distance:Ur(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function at(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Ur(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function Wr(e,t,n,r){let i=[`${Kt(e)} view`,`${Kt(n)} layout`];if(e!==t&&i.push(`2D ${t} fallback`),r){let o=[r.azimuth!==null?`az ${r.azimuth}`:null,r.elevation!==null?`el ${r.elevation}`:null,r.roll!==null?`roll ${r.roll}`:null,r.distance!==null?`dist ${r.distance}`:null].filter(Boolean);o.length>0&&i.push(`camera ${o.join(" / ")}`)}return i.join(" - ")}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 Xr(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function qr(e,t,n){let{object:r,x:i,y:o,radius:a,sortKey:l,anchorX:s,anchorY:c}=e,u=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:o,radius:a,visualRadius:Fi(r,a,t),sortKey:l+u*.001,anchorX:s,anchorY:c,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:Ri(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function Hr(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 Kr(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 Zr(e,t,n,r){let i=[],o=[],a=new Map(e.map(s=>[s.objectId,s])),l=[...e].filter(s=>!s.hidden&&s.object.renderHints?.renderLabel!==!1).sort(Jr);for(let s of l){let c=Qr(s,a,o,t,n,r)??tn(s,en(s,a.get(s.parentId??"")??null,n),0,r);o.push(ln(s,c,r)),i.push({renderId:`${s.renderId}-label`,objectId:s.objectId,object:s.object,groupId:s.groupId,semanticGroupIds:[...s.semanticGroupIds],label:s.label,secondaryLabel:s.secondaryLabel,x:c.x,y:c.labelY,secondaryY:c.secondaryY,textAnchor:c.textAnchor,direction:c.direction,hidden:s.hidden})}return i}function Jr(e,t){let n=Gt(e)-Gt(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 Gt(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 Qr(e,t,n,r,i,o){for(let a of ei(e,t,r,i)){let l=a==="left"||a==="right"?4:6;for(let s=0;s<=l;s+=1){let c=tn(e,a,s,o),u=ln(e,c,o);if(!n.some(f=>Di(f,u)))return c}}return null}function ei(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,o=en(e,i,r),a=o==="below"?"above":"below",l=ti(e,i,n),s=l==="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"?[l,o,s,a]:[o,l,a,s]}function en(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 ti(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 tn(e,t,n,r){let i=14*r;switch(t){case"above":{let o=e.y-(e.radius+18*r+n*i);return{x:e.x,labelY:o,secondaryY:o-16*r,textAnchor:"middle",direction:t}}case"below":{let o=e.y+e.radius+18*r+n*i;return{x:e.x,labelY:o,secondaryY:o+16*r,textAnchor:"middle",direction:t}}case"left":{let o=e.x-(e.visualRadius+16*r+n*i),a=e.y-4*r;return{x:o,labelY:a,secondaryY:a+16*r,textAnchor:"end",direction:t}}case"right":{let o=e.x+e.visualRadius+16*r+n*i,a=e.y-4*r;return{x:o,labelY:a,secondaryY:a+16*r,textAnchor:"start",direction:t}}}}function ni(e,t,n,r,i,o){let a=e.filter(s=>!s.hidden&&!!s.backArcPath).map(s=>s.renderId),l=e.filter(s=>!s.hidden).map(s=>s.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"orbits-back",renderIds:a},{id:"orbits-front",renderIds:l},{id:"relations",renderIds:t.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"events",renderIds:n.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"objects",renderIds:i.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"labels",renderIds:o.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function ri(e,t,n,r,i,o){let a=new Map,l=s=>{if(!s)return null;let c=a.get(s);if(c)return c;let u=i.groupRoots.get(s)??null,f={renderId:s,rootObjectId:u,label:u??s,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:ve(0,0,0,0)};return a.set(s,f),f};for(let s of e){let c=l(s.groupId);c&&!s.hidden&&c.objectIds.push(s.objectId)}for(let s of t){let c=l(s.groupId);c&&!s.hidden&&c.orbitIds.push(s.objectId)}for(let s of n){let c=l(s.groupId);c&&!s.hidden&&c.leaderIds.push(s.objectId)}for(let s of r){let c=l(s.groupId);c&&!s.hidden&&c.labelIds.push(s.objectId)}for(let s of a.values())s.contentBounds=Li(s,e,t,n,r,o);return[...a.values()].sort((s,c)=>s.label.localeCompare(c.label))}function ii(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 oi(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),o=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:o?.x??0,y2:o?.y??0,hidden:r.hidden||!i||!o||i.hidden||o.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function ai(e,t,n){let r=new Map(t.map(i=>[i.objectId,i]));return e.map(i=>{let o=[...new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds])],a=o.map(c=>r.get(c)).filter(Boolean),l=a.length>0?a.reduce((c,u)=>c+u.x,0)/a.length:0,s=a.length>0?a.reduce((c,u)=>c+u.y,0)/a.length:0;return{renderId:`${se(i.id)}-event`,eventId:i.id,event:i,objectIds:o,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:l,y:s,hidden:i.hidden||a.length===0||a.every(c=>c.hidden)||n!==null&&i.id!==n}}).sort((i,o)=>i.event.id.localeCompare(o.event.id))}function si(e,t,n,r,i){let o=li(e,t,n),a=new Map;for(let[c,u]of Object.entries(e.system?.info??{})){if(!c.startsWith("viewpoint."))continue;let[f,m,...h]=c.split(".");if(f!=="viewpoint"||!m||h.length===0)continue;let y=gi(m);if(!y)continue;let g=h.join(".").toLowerCase(),x=a.get(y)??{id:y};ci(x,g,u,e,t,n,r,i),a.set(y,x)}let l=[...a.values()].map(c=>ui(c,t,n,i)).filter(Boolean),s=l.findIndex(c=>c.id===o.id);return s>=0?l.splice(s,1,{...o,...l[s],layers:{...o.layers,...l[s].layers},filter:l[s].filter??o.filter,generated:!1}):l.unshift(o),l.sort((c,u)=>c.id==="overview"?-1:u.id==="overview"?1:c.label.localeCompare(u.label))}function li(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",o=dt(null),a=ut(t,o);return{id:"overview",label:i,summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,renderProjection:a,camera:o,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function ci(e,t,n,r,i,o,a,l){let s=n.trim();switch(t){case"label":case"title":s&&(e.label=s);return;case"summary":case"description":s&&(e.summary=s);return;case"focus":case"object":s&&(e.focus=s);return;case"select":case"selection":s&&(e.select=s);return;case"events":e.eventIds=we(s);return;case"projection":case"view":e.projection=nn(s)??i;return;case"preset":e.preset=fi(s)??o;return;case"rotation":case"angle":e.rotationDeg=be(s)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??Ve(),azimuth:be(s)};return;case"camera.elevation":e.camera={...e.camera??Ve(),elevation:be(s)};return;case"camera.roll":e.camera={...e.camera??Ve(),roll:be(s)};return;case"camera.distance":e.camera={...e.camera??Ve(),distance:Xt(s)};return;case"zoom":case"scale":e.scale=Xt(s);return;case"layers":e.layers=pi(s);return;case"query":e.filter={...e.filter??Fe(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??Fe(),objectTypes:mi(s)};return;case"tags":e.filter={...e.filter??Fe(),tags:we(s)};return;case"groups":e.filter={...e.filter??Fe(),groupIds:hi(s,r,a,l)};return}}function ui(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,o=e.select&&r.has(e.select)?e.select:i,a=di(e.filter),l=e.label?.trim()||bi(e.id),s=e.projection??t,c=dt(e.camera??null),u=ut(s,c);return{id:e.id,label:l,summary:e.summary?.trim()||yi(l,i,a),objectId:i,selectedObjectId:o,eventIds:[...new Set(e.eventIds??[])],projection:s,renderProjection:u,camera:c,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:a,generated:!1}}function Fe(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Ve(){return{azimuth:null,elevation:null,roll:null,distance:null}}function di(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 nn(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function fi(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function be(e){let t=Number(e);return Number.isFinite(t)?t:null}function Xt(e){let t=be(e);return t!==null&&t>0?t:null}function pi(e){let t={};for(let n of we(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 mi(e){return we(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function hi(e,t,n,r){return we(e).map(i=>t.schemaVersion==="2.1"||t.schemaVersion==="2.5"||t.groups.some(o=>o.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??ye(i):(r.has(i),ye(i)))}function we(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function gi(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function bi(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function yi(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 wi(e,t,n,r,i,o,a){let l=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,f=(m,h)=>{l=Math.min(l,m),s=Math.min(s,h),c=Math.max(c,m),u=Math.max(u,h)};for(let m of r)m.hidden||rn(m,f);for(let m of i)m.hidden||(f(m.x1,m.y1),f(m.x2,m.y2));for(let m of n)m.hidden||on(m,f);for(let m of o)m.hidden||an(m,f,a);return!Number.isFinite(l)||!Number.isFinite(s)?ve(0,0,e,t):ve(l,s,c,u)}function rn(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,o=un(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,Qt*2);for(let a of o)t(a.x-n,a.y-n),t(a.x+n,a.y+n)}function ve(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 on(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 an(e,t,n){let r=cn(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 st(e,t,n,r,i,o,a,l){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:ze(e,r,l.scaleModel),sortKey:_e(t,n,r)}),Ce(e,i,o,a,l,r+1))}function Ce(e,t,n,r,i,o){let a=t.get(e.id);if(!a)return;let l=[...i.orbitChildren.get(e.id)??[]].sort(vi),s=Ii(l,a.radius,i.spacingFactor,i.scaleModel),c=ji(l,s);l.forEach((f,m)=>{let h=$i(f,m,l.length,a,s,c[m]??s.innerPx,i);n.push({object:f,parentId:e.id,kind:h.kind,cx:h.cx,cy:h.cy,radius:h.radius,rx:h.rx,ry:h.ry,rotationDeg:h.rotationDeg,band:h.band,bandThickness:h.bandThickness,frontArcPath:h.frontArcPath,backArcPath:h.backArcPath}),st(f,h.objectX,h.objectY,o,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((f,m)=>{let h=Ie(m,u.length,-Math.PI/3),y=28*i.spacingFactor,g=$e(h,a.radius,i.projection,i.projection==="isometric"?.9:1),x=$e(h,a.radius+y,i.projection,i.projection==="isometric"?.9:1),S=a.x+g.x,p=a.y+g.y,$=a.x+x.x,D=a.y+x.y;t.set(f.id,{object:f,x:$,y:D,radius:ze(f,o+1,i.scaleModel),sortKey:_e($,D,o+1),anchorX:S,anchorY:p}),r.push({object:f,groupId:i.objectMap.has(f.id)?ye(Pi(f,i.objectMap)):null,x1:S,y1:p,x2:$,y2:D,mode:"surface"}),Ce(f,t,n,r,i,o+1)})}function vi(e,t){let n=Re(e),r=Re(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 Ii(e,t,n,r){let i=e.map(f=>Re(f)),o=i.filter(f=>f!==null),a=t+56*n*r.orbitDistanceMultiplier,l=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(o.length===0)return{metrics:i,minMetric:0,maxMetric:0,metricSpread:0,innerPx:a,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:l*.42};let s=Math.min(...o),c=Math.max(...o),u=c-s;return{metrics:i,minMetric:s,maxMetric:c,metricSpread:u,innerPx:a,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:l*.42}}function $i(e,t,n,r,i,o,a){let l=e.placement,s=e.type==="belt"||e.type==="ring";if(!l||l.mode!=="orbit"){let X=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:X,rotationDeg:0,band:s,bandThickness:s?12*a.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-X}}let c=M(typeof l.eccentricity=="number"?l.eccentricity:0,0,.92),u=o,f=Math.max(u*Math.sqrt(1-c*c),u*.18),m=ct(l.inclination)??0,h=a.projection==="isometric"?Math.max(Cr,Math.cos(ft(m)))*Jt:1,y=Math.max(f*h,u*.14),g=ct(l.angle)??0,x=u*c,S=fn(-x,0,g),p=r.x+S.x,$=r.y+S.y,D=ki(l.phase,t,n),_=dn(p,$,u,y,g,D),E=a.projection==="topdown"&&c<=1e-4&&Math.abs(g)<=1e-4,G=s?Mi(e,u,i,a.scaleModel):void 0;return{kind:E?"circle":"ellipse",cx:E?r.x:p,cy:E?r.y:$,radius:E?u:void 0,rx:E?void 0:u,ry:E?void 0:y,rotationDeg:g,band:s,bandThickness:G,frontArcPath:a.projection==="isometric"||s?qt(p,$,u,y,g,0,Math.PI):void 0,backArcPath:a.projection==="isometric"||s?qt(p,$,u,y,g,Math.PI,Math.PI*2):void 0,objectX:_.x,objectY:_.y}}function xi(e,t){return t.innerPx+t.stepPx*Si(Math.max(e,0)+1)}function ji(e,t){let n=[];return e.forEach((r,i)=>{let o=Re(r),a=t.innerPx+i*t.stepPx,l=o===null?a:xi(o,t),s=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(l,s))}),n}function Re(e){return!e.placement||e.placement.mode!=="orbit"?null:Be(e.placement.semiMajor??e.placement.distance??null)}function Si(e){return Math.log(e)/Math.log(2)}function ki(e,t,n){let r=e?ct(e):null;return r!==null?ft(r-90):Ie(t,n,-Math.PI/2)}function Mi(e,t,n,r){let i=Be(lt(e.properties.inner)),o=Be(lt(e.properties.outer));if(i!==null&&o!==null){let l=Math.abs(o-i);if(n.metricSpread>0)return M(l/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let s=Math.max(Math.max(i,o),1e-4);return M(l/s*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function Oi(e,t,n,r,i,o,a,l,s){if(e.kind==="lagrange")return Ai(e,t,n,o,a);if(e.kind==="anchor"){let c=t.get(e.objectId);if(c){let u=Ie(r,i,Math.PI/5),f=(c.radius+36)*s.scaleModel.labelMultiplier,m=$e(u,f,s.projection,s.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=Ie(r,i,Math.PI/6),f=(c.radius+36)*s.scaleModel.labelMultiplier,m=$e(u,f,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+m.x,y:c.y+m.y,anchorX:c.x,anchorY:c.y}}}return{x:o-l-170,y:a-l-86-r*58*s.scaleModel.freePlacementMultiplier}}function Ai(e,t,n,r,i){let o=e.secondary?t.get(e.primary):Ei(e.primary,t,n),a=t.get(e.secondary??e.primary);if(!o||!a)return{x:r*.7,y:i*.25};let l=a.x-o.x,s=a.y-o.y,c=Math.hypot(l,s)||1,u=l/c,f=s/c,m=-f,h=u,y=M(c*.25,24,68);switch(e.point){case"L1":return{x:a.x-u*y,y:a.y-f*y,anchorX:a.x,anchorY:a.y};case"L2":return{x:a.x+u*y,y:a.y+f*y,anchorX:a.x,anchorY:a.y};case"L3":return{x:o.x-u*y,y:o.y-f*y,anchorX:o.x,anchorY:o.y};case"L4":return{x:a.x+(u*.5-m*.8660254)*y,y:a.y+(f*.5-h*.8660254)*y,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(u*.5+m*.8660254)*y,y:a.y+(f*.5+h*.8660254)*y,anchorX:a.x,anchorY:a.y}}}function Ti(e,t){let n=new Map,r=new Map;for(let c of e){let u=sn(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,o=new Map,a=new Map,l=c=>{let u=i.get(c);if(u)return u;let f=new Set,m=[],h=n.get(c)??null;for(;h&&!f.has(h);)m.push(h),f.add(h),h=n.get(h)??null;return i.set(c,m),m},s=c=>{let u=a.get(o.get(c)??"");if(u)return u;let f=n.get(c)??null,m=t.get(c),h=c;return m?.placement&&m.placement.mode!=="free"&&f&&(h=s(f)),h};for(let c of e){l(c.id);let u=s(c.id),f=ye(u);o.set(c.id,f),a.set(f,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:o,groupRoots:a}}function sn(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 Li(e,t,n,r,i,o){let a=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=(f,m)=>{a=Math.min(a,f),l=Math.min(l,m),s=Math.max(s,f),c=Math.max(c,m)};for(let f of t)!f.hidden&&e.objectIds.includes(f.objectId)&&on(f,u);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&rn(f,u);for(let f of r)!f.hidden&&e.leaderIds.includes(f.objectId)&&(u(f.x1,f.y1),u(f.x2,f.y2));for(let f of i)!f.hidden&&e.labelIds.includes(f.objectId)&&an(f,u,o);return!Number.isFinite(a)||!Number.isFinite(l)?ve(0,0,0,0):ve(a,l,s,c)}function Pi(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=sn(n,t);if(!i)break;let o=t.get(i);if(!o)break;n=o}return n.id}function ln(e,t,n){return cn(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function cn(e,t,n,r,i,o,a,l){let s=zi(o,a,l),c=s*2,u=i==="above"?18:12,f=i==="above"?8:12,m=e-s,h=e+s;return r==="start"?(m=e,h=e+c):r==="end"&&(m=e-c,h=e),{left:m,right:h,top:Math.min(t,n)-u,bottom:Math.max(t,n)+f}}function Di(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Ei(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function ze(e,t,n){let r=Ci(e.properties.radius,n);if(r!==null)return r;let i=n.bodyRadiusMultiplier;switch(e.type){case"star":return M((t===0?28:20)*i,n.minBodyRadius,n.maxBodyRadius);case"planet":return M(12*i,n.minBodyRadius,n.maxBodyRadius);case"moon":return M(7*i,n.minBodyRadius,n.maxBodyRadius);case"belt":return M(5*i,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return M(5*i,n.minBodyRadius,n.maxBodyRadius);case"comet":return M(6*i,n.minBodyRadius,n.maxBodyRadius);case"ring":return M(5*i,n.minBodyRadius,n.maxBodyRadius);case"structure":return M(6*i,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return M(8*i,n.minBodyRadius,n.maxBodyRadius)}}function Fi(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 Be(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/ge;case"m":return e.value/1e3/ge;case"ly":return e.value*Er;case"pc":return e.value*Fr;case"kpc":return e.value*Vr;case"re":return e.value*Lr/ge;case"rj":return e.value*Pr/ge;case"sol":return e.value*Dr/ge;default:return e.value}}function Vi(e,t){let n=Be(e??null);return n===null||n<=0?0:M(n*96*t.freePlacementMultiplier,0,420)}function Ci(e,t){let n=lt(e);if(!n)return null;let r;switch(n.unit){case"sol":r=M(n.value*22,14,40);break;case"re":r=M(n.value*10,6,18);break;case"km":r=M(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=M(n.value*4,4,20);break}return M(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function lt(e){return!e||typeof e!="object"||!("value"in e)?null:e}function ct(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Ie(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function qt(e,t,n,r,i,o,a){let l=un(e,t,n,r,i,o,a,Qt);return l.length===0?"":l.map((s,c)=>`${c===0?"M":"L"} ${Zt(s.x)} ${Zt(s.y)}`).join(" ")}function un(e,t,n,r,i,o,a,l){let s=[];for(let c=0;c<=l;c+=1){let u=o+(a-o)*c/l;s.push(dn(e,t,n,r,i,u))}return s}function dn(e,t,n,r,i,o){let a=n*Math.cos(o),l=r*Math.sin(o),s=fn(a,l,i);return{x:e+s.x,y:t+s.y}}function fn(e,t,n){let r=ft(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function $e(e,t,n,r){let i=n==="isometric"?Jt*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function _e(e,t,n){return t*1e3+e+n*.01}function M(e,t,n){return Math.min(Math.max(e,t),n)}function Ht(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 ye(e){return`${se(e)}-group`}function Ri(e){return typeof e=="string"&&e.trim()?e:void 0}function zi(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 Kt(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function ft(e){return e*Math.PI/180}function Zt(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var hn=86400,Ne=hn*365.25,Ue=18,pn=180;function Ge(e,t={}){let n={width:t.width,height:t.height,padding:t.padding,preset:t.preset,projection:t.projection,camera:t.camera,scaleModel:t.scaleModel,activeEventId:t.activeEventId},r=z(e,n),i=Wi(r.layoutPreset,t.spatialScaleModel),o={x:r.contentBounds.centerX,y:r.contentBounds.centerY},a=new Map(r.objects.map(g=>[g.objectId,g])),l=new Map(r.orbitVisuals.map(g=>[g.objectId,g])),s=new Map;for(let g of r.objects){let x=g.object.placement;!x||x.mode!=="orbit"||s.set(g.objectId,mt(x))}let c=Math.min(...[...s.values()].filter(g=>Number.isFinite(g)&&g>0))||1,u=new Map,f=r.objects.map(g=>Bi(g,r,o,a,l,i,u,c)),m=new Map(f.map(g=>[g.objectId,g])),h=r.orbitVisuals.map(g=>_i(g,m,c,r.activeEventId!==null)),y=f.map(g=>({objectId:g.objectId,center:{...g.position},radius:g.visualRadius+i.focusPadding}));return{width:r.width,height:r.height,padding:r.padding,renderPreset:r.renderPreset,projection:r.projection,camera:r.camera,scaleModel:i,title:r.title,subtitle:r.subtitle,systemId:r.systemId,viewMode:"3d",layoutPreset:r.layoutPreset,metadata:{...r.metadata,"viewer.mode":"3d"},contentBounds:Gi(f),semanticGroups:r.semanticGroups,viewpoints:r.viewpoints,activeEventId:r.activeEventId,timeFrozen:r.activeEventId!==null,objects:f,orbits:h,focusTargets:y}}function Bi(e,t,n,r,i,o,a,l){let s=We(e,t,n,r,i,a),c=ht(e.object,i.get(e.objectId),l,t.activeEventId!==null);return{objectId:e.objectId,object:e.object,parentId:e.parentId,ancestorIds:e.ancestorIds.slice(),childIds:e.childIds.slice(),groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),position:s,radius:le(e.radius*o.bodyRadiusMultiplier,o.minBodyRadius,o.maxBodyRadius),visualRadius:le(e.visualRadius*o.bodyRadiusMultiplier,o.minBodyRadius,o.maxBodyRadius+24),label:e.label,secondaryLabel:e.secondaryLabel,fillColor:e.fillColor,imageHref:e.imageHref,hidden:e.hidden,motion:c}}function _i(e,t,n,r){let i=t.get(e.objectId),o=t.get(e.parentId);return{objectId:e.objectId,object:e.object,parentId:e.parentId,groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),center:o?.position??{x:0,y:0,z:0},kind:e.kind,radius:e.radius,semiMajor:e.radius??e.rx??0,semiMinor:e.radius??e.ry??0,rotationDeg:e.rotationDeg,inclinationDeg:i?.motion?.inclinationDeg??Ye(e.object.placement?.mode==="orbit"?e.object.placement.inclination:void 0)??0,band:e.band,bandThickness:e.bandThickness,hidden:e.hidden,motion:i?.motion??ht(e.object,e,n,r)}}function We(e,t,n,r,i,o){let a=o.get(e.objectId);if(a)return a;let l=e.object.placement,s;if(l?.mode==="orbit"&&e.parentId){let c=r.get(e.parentId),u=c?We(c,t,n,r,i,o):{x:0,y:0,z:0},f=i.get(e.objectId),m=ht(e.object,f,1,t.activeEventId!==null),h=m?Ni(m,0):{x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};s=Xi(u,h)}else if(l?.mode==="surface"&&e.parentId){let c=r.get(e.parentId),u=c?We(c,t,n,r,i,o):{x:0,y:0,z:0},f=c?.visualRadius??16,m=qi(e.objectId),h=m*Math.PI*2;s={x:u.x+Math.cos(h)*(f+e.visualRadius*.9),y:u.y+Math.sin(m*Math.PI)*Math.max(e.visualRadius*.2,2),z:u.z+Math.sin(h)*(f+e.visualRadius*.9)}}else if(l?.mode==="at"&&e.parentId){let c=r.get(e.parentId),u=c?We(c,t,n,r,i,o):{x:0,y:0,z:0},f=e.anchorX??c?.x??n.x,m=e.anchorY??c?.y??n.y;s={x:u.x+(e.x-f),y:u.y,z:u.z+(e.y-m)}}else s={x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};return o.set(e.objectId,s),s}function Ni(e,t){let n=e.phase0Deg+e.angularVelocityDegPerSecond*t,r=pt(n),i=pt(e.rotationDeg),o=pt(e.inclinationDeg),a=Math.cos(r)*e.semiMajor,l=Math.sin(r)*e.semiMinor,s=a*Math.cos(i)-l*Math.sin(i),c=a*Math.sin(i)+l*Math.cos(i);return{x:s,y:c*Math.sin(o),z:c*Math.cos(o)}}function ht(e,t,n,r){let i=e.placement;if(!i||i.mode!=="orbit")return null;let o=t?.radius??t?.rx??le(mt(i)*48,24,1200),a=t?.radius??t?.ry??o,l=Ui(i.period),s=mt(i),c=le(s/Math.max(n,1e-4),1,20),u=le(l?Ue*c:Ue*Math.pow(c,.75),Ue,pn);return{phase0Deg:Ye(i.phase)??0,rotationDeg:Ye(i.angle)??t?.rotationDeg??0,inclinationDeg:Ye(i.inclination)??0,semiMajor:o,semiMinor:a,eccentricity:i.eccentricity??0,periodSeconds:l,angularVelocityDegPerSecond:360/Math.max(u,.001),heuristic:l===null,frozen:r}}function mt(e){let t=mn(e.semiMajor)??mn(e.distance)??1;return Math.max(t,.01)}function mn(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/1495978707e-1;case"m":return e.value/149597870700;case"re":return e.value*6371/1495978707e-1;case"rj":return e.value*71492/1495978707e-1;case"sol":return e.value*695700/1495978707e-1;case"ly":return e.value*63241.077;case"pc":return e.value*206264.806;case"kpc":return e.value*206264806;default:return e.value}}function Ui(e){if(!e)return null;switch(e.unit){case"s":return e.value;case"min":return e.value*60;case"h":return e.value*3600;case"d":return e.value*hn;case"y":return e.value*Ne;case"ky":return e.value*Ne*1e3;case"my":return e.value*Ne*1e6;case"gy":return e.value*Ne*1e9;default:return null}}function Ye(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Wi(e,t){return{...Yi(e),...t}}function Yi(e){switch(e){case"compact":return{orbitDistanceMultiplier:.92,bodyRadiusMultiplier:.92,markerSizeMultiplier:.92,ringThicknessMultiplier:.9,focusPadding:10,minBodyRadius:4,maxBodyRadius:34};case"presentation":return{orbitDistanceMultiplier:1.15,bodyRadiusMultiplier:1.12,markerSizeMultiplier:1.08,ringThicknessMultiplier:1.14,focusPadding:16,minBodyRadius:5,maxBodyRadius:44};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,markerSizeMultiplier:1,ringThicknessMultiplier:1,focusPadding:12,minBodyRadius:4,maxBodyRadius:40}}}function Gi(e){if(e.length===0)return{minX:0,minY:0,minZ:0,maxX:0,maxY:0,maxZ:0,width:0,height:0,depth:0,center:{x:0,y:0,z:0}};let t=Number.POSITIVE_INFINITY,n=Number.POSITIVE_INFINITY,r=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY,a=Number.NEGATIVE_INFINITY;for(let l of e)t=Math.min(t,l.position.x-l.visualRadius),n=Math.min(n,l.position.y-l.visualRadius),r=Math.min(r,l.position.z-l.visualRadius),i=Math.max(i,l.position.x+l.visualRadius),o=Math.max(o,l.position.y+l.visualRadius),a=Math.max(a,l.position.z+l.visualRadius);return{minX:t,minY:n,minZ:r,maxX:i,maxY:o,maxZ:a,width:i-t,height:o-n,depth:a-r,center:{x:(t+i)/2,y:(n+o)/2,z:(r+a)/2}}}function Xi(e,t){return{x:e.x+t.x,y:e.y+t.y,z:e.z+t.z}}function qi(e){let t=0;for(let n=0;n<e.length;n+=1)t=t*31+e.charCodeAt(n)>>>0;return t%1e4/1e4}function le(e,t,n){return Math.min(Math.max(e,t),n)}function pt(e){return e*Math.PI/180}function gt(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:eo(e.system),info:to(e.system)}:null,r=e.objects.map(Hi);return Ji(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(Ki),objects:r}}function Hi(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:Qi(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function Ki(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(Zi)}}function Zi(e){return{objectId:e.objectId,placement:gn(e.placement),inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0,epoch:e.epoch??null,referencePlane:e.referencePlane??null}}function gn(e){return e?structuredClone(e):null}function Ji(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])),o=new Set([...r.targetObjectId?[r.targetObjectId]:[],...r.participantObjectIds,...r.positions.map(a=>a.objectId)]);for(let a of o){let l=i.get(a);l&&(r.epoch&&(l.epoch=r.epoch),r.referencePlane&&(l.referencePlane=r.referencePlane))}for(let a of r.positions){let l=i.get(a.objectId);l&&(a.placement&&(l.placement=gn(a.placement)),a.inner&&(l.properties.inner={...a.inner}),a.outer&&(l.properties.outer={...a.outer}),a.epoch&&(l.epoch=a.epoch),a.referencePlane&&(l.referencePlane=a.referencePlane))}}function Qi(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 eo(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 to(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)),n.camera?.azimuth!==null&&(t[`${r}.camera.azimuth`]=String(n.camera?.azimuth)),n.camera?.elevation!==null&&(t[`${r}.camera.elevation`]=String(n.camera?.elevation)),n.camera?.roll!==null&&(t[`${r}.camera.roll`]=String(n.camera?.roll)),n.camera?.distance!==null&&(t[`${r}.camera.distance`]=String(n.camera?.distance));let i=no(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 no(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(" ")}var bn=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,oo=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),ao=/^[A-Za-z][A-Za-z0-9+.-]*:/;function ce(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function je(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function bt(e,t,n){let r=e.match(bn);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=P(n);if(o?.unitFamily&&!Le(o.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function yt(e){let t=e.match(bn);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Xe(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function H(e,t,n){let r=oo.get(e.toLowerCase());if(r===void 0)throw d.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function yn(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 so(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(ao);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 wn(e,t,n){let r=P(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 H(xe(t,e,n),e,n);case"number":return Xe(xe(t,e,n),e,n);case"unit":return bt(xe(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&so(i,n),i}}}function wt(e,t,n){let r=P(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 xe(e,t,n){if(e.length!==1)throw d.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var In=new Set(["star","planet","moon","asteroid","comet"]),lo=332946.0487,co=1047.3486,qe=1495978707e-1,uo=6371,fo=695700,po=63241.077,mo=206264.806,ho=206264806;function He(e,t){let n=[],r=new Map(e.objects.map(l=>[l.id,l])),i=new Set(e.groups.map(l=>l.id)),o=new Set(e.events.map(l=>l.id));e.system||n.push(w("validate.system.required","Atlas documents must declare exactly one system."));let a=new Map;for(let[l,s]of[["group",e.groups.map(c=>c.id)],["viewpoint",e.system?.viewpoints.map(c=>c.id)??[]],["annotation",e.system?.annotations.map(c=>c.id)??[]],["relation",e.relations.map(c=>c.id)],["event",e.events.map(c=>c.id)],["object",e.objects.map(c=>c.id)]])for(let c of s){let u=a.get(c);u?n.push(w("validate.id.duplicate",`Duplicate ${l} id "${c}" already used by ${u}.`)):a.set(c,l)}for(let l of e.relations)go(l,r,n);for(let l of e.system?.viewpoints??[])bo(l,i,o,t,n,r);for(let l of e.objects)yo(l,e.system,r,i,n);for(let l of e.events)wo(l,e.system,r,n);return n}function go(e,t,n){e.from?t.has(e.from)||n.push(w("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(w("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(w("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(w("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(w("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function bo(e,t,n,r,i,o){let a=e.filter;if(r==="2.1"||r==="2.5"){if(a)for(let l of a.groupIds)t.has(l)||i.push(j("validate.viewpoint.group.unknown",`Unknown group "${l}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.groups`));for(let l of e.events??[])n.has(l)||i.push(j("validate.viewpoint.event.unknown",`Unknown event "${l}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}xo(e.projection,i,`viewpoint.${e.id}.projection`,e.id),jo(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,a,o)}function yo(e,t,n,r,i){let o=e.placement,a=o?.mode==="orbit"?o:null,l=o?.mode==="orbit"?n.get(o.target)??null:null;if(e.groups)for(let s of e.groups)r.has(s)||i.push(j("validate.group.unknown",`Unknown group "${s}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(j("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(j("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),a&&(n.has(a.target)||i.push(w("validate.orbit.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"orbit")),a.distance&&a.semiMajor&&i.push(w("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),a.phase&&!e.epoch&&!t?.epoch&&i.push(j("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),a.inclination&&!e.referencePlane&&!t?.referencePlane&&i.push(j("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),a.period&&!It(l?.properties.mass)&&i.push(j("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),o?.mode==="surface"){let s=n.get(o.target);s?In.has(s.type)||i.push(w("validate.surface.target.invalid",`Surface target "${o.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):i.push(w("validate.surface.target.unknown",`Unknown placement target "${o.target}" on "${e.id}".`,e.id,"surface"))}if(o?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&i.push(w("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),Io(e,n,i)||i.push(w("validate.at.target.unknown",`Unknown at-reference target "${o.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let s=n.get(e.resonance.targetObjectId);s?(e.placement?.mode!=="orbit"||s.placement?.mode!=="orbit"||e.placement.target!==s.placement.target)&&i.push(j("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):i.push(w("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let s of e.deriveRules??[]){if(s.field!=="period"||s.strategy!=="kepler"){i.push(j("validate.derive.unsupported",`Unsupported derive rule "${s.field} ${s.strategy}" on "${e.id}".`,e.id,"derive"));continue}let c=vn(e,l);if(c===null){i.push(j("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}a?.period||i.push(vt("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Oo(c)}.`,e.id,"derive"))}for(let s of e.validationRules??[]){if(s.rule!=="kepler"){i.push(j("validate.rule.unsupported",`Unsupported validation rule "${s.rule}" on "${e.id}".`,e.id,"validate"));continue}let c=$n(a?.period),u=vn(e,l);if(c===null||u===null)continue;let f=Mo(e,"period");Math.abs(c-u)>f&&i.push(w("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function wo(e,t,n,r){let i=`event.${e.id}`,o=new Set;e.kind.trim()||r.push(w("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${i}.kind`)),typeof e.epoch=="string"&&!e.epoch.trim()&&r.push(j("validate.event.epoch.empty",`Event "${e.id}" defines an empty epoch string.`,void 0,`${i}.epoch`)),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&r.push(j("validate.event.referencePlane.empty",`Event "${e.id}" defines an empty reference plane string.`,void 0,`${i}.referencePlane`)),!e.targetObjectId&&e.participantObjectIds.length===0&&r.push(w("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${i}.participants`)),e.targetObjectId&&(o.add(e.targetObjectId),n.has(e.targetObjectId)||r.push(w("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${i}.target`)));let a=new Set;for(let c of e.participantObjectIds){if(o.add(c),a.has(c)){r.push(j("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${c}".`,void 0,`${i}.participants`));continue}a.add(c),n.has(c)||r.push(w("validate.event.participants.unknown",`Unknown event participant "${c}" on "${e.id}".`,void 0,`${i}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&r.push(j("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${i}.target`)),e.positions.length===0&&r.push(j("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${i}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&o.size<3&&r.push(j("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${i}.participants`));let l=new Set;for(let c of e.positions){let u=`${i}.pose.${c.objectId}`;if(l.has(c.objectId)){r.push(w("validate.event.pose.duplicate",`Event "${e.id}" defines "${c.objectId}" more than once in positions.`,void 0,u));continue}l.add(c.objectId);let f=n.get(c.objectId);if(!f){r.push(w("validate.event.pose.object.unknown",`Unknown event pose object "${c.objectId}" on "${e.id}".`,void 0,u));continue}o.has(c.objectId)||r.push(j("validate.event.pose.unreferenced",`Event pose "${c.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,u)),vo(c,f,e,t,n,r,u,e.id)}let s=[...o].filter(c=>!l.has(c));e.positions.length>0&&s.length>0&&r.push(j("validate.event.positions.partial",`Event "${e.id}" leaves ${s.length} referenced object(s) on their base placement.`,void 0,`${i}.positions`))}function vo(e,t,n,r,i,o,a,l){let s=e.placement;if(!s){o.push(w("validate.event.pose.placement.required",`Event "${l}" pose "${e.objectId}" is missing a placement mode.`,void 0,a));return}if(s.mode==="orbit"){i.has(s.target)||o.push(w("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.orbit`)),s.distance&&s.semiMajor&&o.push(w("validate.event.pose.orbit.distanceConflict",`Event "${l}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${a}.distance`)),s.phase&&!So(r,t,n,e)&&o.push(j("validate.event.pose.phase.epochMissing",`Event "${l}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${a}.phase`)),s.inclination&&!ko(r,t,n,e)&&o.push(j("validate.event.pose.inclination.referencePlaneMissing",`Event "${l}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${a}.inclination`)),s.period&&!It(i.get(s.target)?.properties.mass)&&o.push(j("validate.event.pose.period.massMissing",`Event "${l}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${a}.period`));return}if(s.mode==="surface"){let c=i.get(s.target);c?In.has(c.type)||o.push(w("validate.event.pose.surface.target.invalid",`Event surface target "${s.target}" on "${l}:${e.objectId}" is not surface-capable.`,void 0,`${a}.surface`)):o.push(w("validate.event.pose.surface.target.unknown",`Unknown event surface target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.surface`));return}if(s.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&o.push(w("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${l}:${e.objectId}".`,void 0,`${a}.at`));let c=s.reference;c.kind==="named"&&!i.has(c.name)?o.push(w("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):c.kind==="anchor"&&!i.has(c.objectId)?o.push(w("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${c.objectId}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):c.kind==="lagrange"&&(i.has(c.primary)?c.secondary&&!i.has(c.secondary)&&o.push(w("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${c.secondary}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):o.push(w("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${c.primary}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)))}}function Io(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(w("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(w("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(w("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function vn(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=$o(n.semiMajor??n.distance),i=It(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function $o(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/qe;case"m":return e.value/(qe*1e3);case"ly":return e.value*po;case"pc":return e.value*mo;case"kpc":return e.value*ho;case"re":return e.value*uo/qe;case"sol":return e.value*fo/qe;default:return null}}function It(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/lo;case"mj":return t.value/co;default:return null}}function $n(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 xo(e,t,n,r){e!=="topdown"&&e!=="isometric"&&e!=="orthographic"&&e!=="perspective"&&t.push(w("validate.viewpoint.projection.invalid",`Unknown projection "${String(e)}" in viewpoint "${r}".`,void 0,n))}function jo(e,t,n,r,i,o,a,l,s){if(!e)return;let c=`viewpoint.${i}.camera`;for(let[f,m]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])m!==null&&(!Number.isFinite(m)||f==="distance"&&m<=0)&&r.push(w("validate.viewpoint.camera.invalid",`Invalid camera ${f} "${String(m)}" in viewpoint "${i}".`,void 0,`${c}.${f}`));e.distance!==null&&t!=="perspective"&&r.push(j("validate.viewpoint.camera.distance.partialEffect",`Camera "distance" only has a semantic effect in perspective viewpoints; "${i}" uses "${t}".`,void 0,`${c}.distance`)),t==="topdown"&&(e.elevation!==null||e.roll!==null)&&r.push(j("validate.viewpoint.camera.topdownPartial",`Camera elevation/roll on topdown viewpoint "${i}" are currently stored for future 3D use and only partially affect 2D rendering.`,void 0,c)),t==="isometric"&&e.elevation!==null&&r.push(vt("validate.viewpoint.camera.isometricStored",`Camera elevation on isometric viewpoint "${i}" is preserved semantically for future 3D rendering.`,void 0,`${c}.elevation`)),e.azimuth!==null&&e.azimuth!==0&&n!==0&&r.push(j("validate.viewpoint.rotation.cameraOverlap",`Viewpoint "${i}" uses camera.azimuth; keep "rotation" only for 2D screen rotation to avoid ambiguity.`,void 0,`${c}.azimuth`)),o!==null&&s.has(o)||a!==null&&s.has(a)||l||r.push(vt("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,c))}function So(e,t,n,r){return K(r?.epoch)??K(n?.epoch)??K(t.epoch)??K(e?.epoch)??null}function ko(e,t,n,r){return K(r?.referencePlane)??K(n?.referencePlane)??K(t.referencePlane)??K(e?.referencePlane)??null}function K(e){return typeof e=="string"&&e.trim()?e.trim():null}function Mo(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?$n(n)??0:0}function Oo(e){return`${Math.round(e*100)/100}d`}function w(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function j(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function vt(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Ao=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=P(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 To=new Set(Ze.keys()),jn=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane"]);function $t(e){return Lo(e)}function Lo(e,t){let n=ba(e),r=n.source.split(/\r?\n/),i=[],o=!1,a="2.0",l=null,s=null,c=[],u=[],f=[],m=[],h=new Map,y=!1,g=!1,x=new Set,S=new Set,p=new Set,$=new Set,D=new Set;for(let A=0;A<r.length;A++){let N=r[A],U=A+1;if(!N.trim())continue;let W=Pe(N),L=fe(N.slice(W),{line:U,columnOffset:W});if(L.length!==0){if(!o){a=Po(L,U),o=!0,n.comments.length>0&&Je(a,"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 ${a}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(W===0){s=Do(L,U,a,i,l,c,u,f,m,h,x,S,p,$,D,{sawDefaults:y,sawAtlas:g}),s.kind==="system"?l=s.system:s.kind==="defaults"?y=!0:s.kind==="atlas"&&(g=!0);continue}if(!s)throw new d("Indented line without parent atlas section",U,W+1);_o(s,W,L,U)}}if(!o)throw new d('Missing required atlas schema header "schema 2.0"');let _=c.map(A=>aa(A,a,i)),E=m.map(A=>sa(A,h.get(A.id)??[])),G=t??(a==="2.0-draft"?"2.0":a),X={format:"worldorbit",sourceVersion:"1.0",system:l,groups:u,relations:f,events:E,objects:_,diagnostics:i};if(G==="2.0-draft"){let A={...X,version:"2.0-draft",schemaVersion:"2.0-draft"};return A.diagnostics.push(...He(A,a)),A}let Q={...X,version:G,schemaVersion:G};return a==="2.0-draft"&&Q.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".'}),Q.diagnostics.push(...He(Q,a)),Q}function Po(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1","2.5"].includes(e[1].value.toLowerCase()))throw new d('Expected atlas header "schema 2.0", "schema 2.1", "schema 2.5", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.5"?"2.5":n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function Do(e,t,n,r,i,o,a,l,s,c,u,f,m,h,y,g){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(g.sawDefaults)throw new d('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:i,sourceSchemaVersion:n,diagnostics:r,seenFields:new Set};case"atlas":if(!i)throw new d('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(g.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 Fo(e,t,i,u,n,r);case"annotation":if(!i)throw new d('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return Vo(e,t,i,f);case"group":return C(n,r,"group",{line:t,column:e[0].column}),Co(e,t,a,m);case"relation":return C(n,r,"relation",{line:t,column:e[0].column}),Ro(e,t,l,h);case"event":return C(n,r,"event",{line:t,column:e[0].column}),zo(e,t,s,c,y,n,r);case"object":return Bo(e,t,n,r,o);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 Fo(e,t,n,r,i,o){if(e.length!==2)throw new d("Invalid viewpoint declaration",t,e[0]?.column??1);let a=ce(e[1].value);if(!a)throw new d("Viewpoint id must not be empty",t,e[1].column);if(r.has(a))throw new d(`Duplicate viewpoint id "${a}"`,t,e[1].column);let l={id:a,label:je(a),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,camera:null,layers:{},filter:null};return n.viewpoints.push(l),r.add(a),{kind:"viewpoint",viewpoint:l,sourceSchemaVersion:i,diagnostics:o,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set,inCamera:!1,cameraIndent:null,seenCameraFields:new Set}}function Vo(e,t,n,r){if(e.length!==2)throw new d("Invalid annotation declaration",t,e[0]?.column??1);let i=ce(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 o={id:i,label:je(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(o),r.add(i),{kind:"annotation",annotation:o,seenFields:new Set}}function Co(e,t,n,r){if(e.length!==2)throw new d("Invalid group declaration",t,e[0]?.column??1);let i=ce(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 o={id:i,label:je(i),summary:"",color:null,tags:[],hidden:!1};return n.push(o),r.add(i),{kind:"group",group:o,seenFields:new Set}}function Ro(e,t,n,r){if(e.length!==2)throw new d("Invalid relation declaration",t,e[0]?.column??1);let i=ce(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 o={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(o),r.add(i),{kind:"relation",relation:o,seenFields:new Set}}function zo(e,t,n,r,i,o,a){if(e.length!==2)throw new d("Invalid event declaration",t,e[0]?.column??1);let l=ce(e[1].value);if(!l)throw new d("Event id must not be empty",t,e[1].column);if(i.has(l))throw new d(`Duplicate event id "${l}"`,t,e[1].column);let s={id:l,kind:"",label:je(l),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},c=[];return n.push(s),r.set(l,c),i.add(l),{kind:"event",event:s,sourceSchemaVersion:o,diagnostics:a,seenFields:new Set,rawPoses:c,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function Bo(e,t,n,r,i){if(e.length<3)throw new d("Invalid atlas object declaration",t,e[0]?.column??1);let o=e[1],a=e[2],l=o.value;if(!Te.has(l)||l==="system")throw new d(`Unknown object type "${o.value}"`,t,o.column);let s={objectType:l,id:a.value,fields:ia(e.slice(3),t,l,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:o.column}};return i.push(s),{kind:"object",objectNode:s,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function _o(e,t,n,r){switch(e.kind){case"system":No(e,n,r);return;case"defaults":Uo(e,n,r);return;case"atlas":Wo(e,t,n,r);return;case"viewpoint":Yo(e,t,n,r);return;case"annotation":qo(e,n,r);return;case"group":Ho(e,n,r);return;case"relation":Ko(e,n,r);return;case"event":Zo(e,t,n,r);return;case"object":Qo(e,t,n,r);return}}function No(e,t,n){let r=Y(t,e.seenFields,n),i=I(t,n);switch(r){case"title":e.system.title=i;return;case"description":C(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":C(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":C(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 Uo(e,t,n){let r=Y(t,e.seenFields,n),i=I(t,n);switch(r){case"view":kn(i)&&ne(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=Sn(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=Mn(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 Wo(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=On(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 Yo(e,t,n,r){if(e.inCamera&&t<=(e.cameraIndent??0)&&(e.inCamera=!1,e.cameraIndent=null),e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inCamera){Go(e,n,r);return}if(e.inFilter){Xo(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(ne(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.seenFields.has("camera"))throw new d('Duplicate viewpoint field "camera"',r,n[0].column);e.seenFields.add("camera"),e.inCamera=!0,e.cameraIndent=t,e.viewpoint.camera=e.viewpoint.camera??jt();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=Y(n,e.seenFields,r),o=I(n,r);switch(i){case"label":e.viewpoint.label=o;return;case"summary":e.viewpoint.summary=o;return;case"focus":e.viewpoint.focusObjectId=o;return;case"select":e.viewpoint.selectedObjectId=o;return;case"projection":kn(o)&&ne(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=Sn(o,r,n[0].column);return;case"preset":e.viewpoint.preset=Mn(o,r,n[0].column);return;case"zoom":e.viewpoint.zoom=xt(o,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=J(o,r,n[0].column,"rotation");return;case"camera":ne(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=ra(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=ta(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":C(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=B(n.slice(1),r,"events");return;default:throw new d(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function Go(e,t,n){let r=Y(t,e.seenCameraFields,n),i=I(t,n),o=e.viewpoint.camera??jt();switch(r){case"azimuth":o.azimuth=J(i,n,t[0].column,"camera.azimuth");break;case"elevation":o.elevation=J(i,n,t[0].column,"camera.elevation");break;case"roll":o.roll=J(i,n,t[0].column,"camera.roll");break;case"distance":o.distance=xt(i,n,t[0].column,"camera.distance");break;default:throw new d(`Unknown viewpoint camera field "${t[0].value}"`,n,t[0].column)}e.viewpoint.camera=o}function Xo(e,t,n){let r=Y(t,e.seenFilterFields,n),i=e.viewpoint.filter??na();switch(r){case"query":i.query=I(t,n);break;case"objecttypes":i.objectTypes=ea(t.slice(1),n);break;case"tags":i.tags=B(t.slice(1),n,"tags");break;case"groups":i.groupIds=B(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 qo(e,t,n){switch(Y(t,e.seenFields,n)){case"label":e.annotation.label=I(t,n);return;case"target":e.annotation.targetObjectId=I(t,n);return;case"body":e.annotation.body=I(t,n);return;case"tags":e.annotation.tags=B(t.slice(1),n,"tags");return;default:throw new d(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function Ho(e,t,n){switch(Y(t,e.seenFields,n)){case"label":e.group.label=I(t,n);return;case"summary":e.group.summary=I(t,n);return;case"color":e.group.color=I(t,n);return;case"tags":e.group.tags=B(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=H(I(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 Ko(e,t,n){switch(Y(t,e.seenFields,n)){case"from":e.relation.from=I(t,n);return;case"to":e.relation.to=I(t,n);return;case"kind":e.relation.kind=I(t,n);return;case"label":e.relation.label=I(t,n);return;case"summary":e.relation.summary=I(t,n);return;case"tags":e.relation.tags=B(t.slice(1),n,"tags");return;case"color":e.relation.color=I(t,n);return;case"hidden":e.relation.hidden=H(I(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 Zo(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){(n[0]?.value==="epoch"||n[0]?.value==="referencePlane")&&ne(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push(Jo(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new d(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let o=n[1].value;if(!o.trim())throw new d("Event pose object id must not be empty",r,n[1].column);let a={objectId:o,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(a),e.activePose=a,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new d('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(Y(n,e.seenFields,r)){case"kind":e.event.kind=I(n,r);return;case"label":e.event.label=I(n,r);return;case"summary":e.event.summary=I(n,r);return;case"target":e.event.targetObjectId=I(n,r);return;case"participants":e.event.participantObjectIds=B(n.slice(1),r,"participants");return;case"timing":e.event.timing=I(n,r);return;case"visibility":e.event.visibility=I(n,r);return;case"epoch":ne(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=I(n,r);return;case"referenceplane":ne(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=I(n,r);return;case"tags":e.event.tags=B(n.slice(1),r,"tags");return;case"color":e.event.color=I(n,r);return;case"hidden":e.event.hidden=H(I(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new d(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function Jo(e,t,n){if(e.length<2)throw new d("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!jn.has(r))throw new d(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new d(`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"||Ao.has(i)){i!=="info"&&C(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=On(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 o=e.activeBlock,a=e.seenTypedBlockKeys[o]??(e.seenTypedBlockKeys[o]=new Set);if(a.has(i.key))throw new d(`Duplicate ${o} key "${i.key}"`,r,n[0].column);a.add(i.key),(e.objectNode.typedBlockEntries[o]??(e.objectNode.typedBlockEntries[o]=[])).push(i);return}e.objectNode.fields.push(oa(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function Y(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 I(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 ea(e,t){return B(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function ta(e,t,n,r){let i={};for(let o of B(e,t,"layers")){let a=!o.startsWith("-")&&!o.startsWith("!"),l=o.replace(/^[-!]+/,"").toLowerCase();if(l==="orbits"){i["orbits-back"]=a,i["orbits-front"]=a;continue}(l==="background"||l==="guides"||l==="orbits-back"||l==="orbits-front"||l==="relations"||l==="events"||l==="objects"||l==="labels"||l==="metadata")&&(l==="events"&&n&&r&&C(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[l]=a)}return i}function B(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 Sn(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric"&&r!=="orthographic"&&r!=="perspective")throw new d(`Unknown projection "${e}"`,t,n);return r}function kn(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function Mn(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 xt(e,t,n,r){let i=J(e,t,n,r);if(i<=0)throw new d(`Field "${r}" must be greater than zero`,t,n);return i}function J(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 na(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function jt(){return{azimuth:null,elevation:null,roll:null,distance:null}}function ra(e,t,n){if(e.length===0||e.length%2!==0)throw new d('Field "camera" expects "<field> <value>" pairs',t,e[0]?.column??1);let r=n?{...n}:jt(),i=new Set;for(let o=0;o<e.length;o+=2){let a=e[o],l=e[o+1],s=a.value.toLowerCase();if(i.has(s))throw new d(`Duplicate viewpoint camera field "${a.value}"`,t,a.column);i.add(s);let c=l.value;switch(s){case"azimuth":r.azimuth=J(c,t,a.column,"camera.azimuth");break;case"elevation":r.elevation=J(c,t,a.column,"camera.elevation");break;case"roll":r.roll=J(c,t,a.column,"camera.roll");break;case"distance":r.distance=xt(c,t,a.column,"camera.distance");break;default:throw new d(`Unknown viewpoint camera field "${a.value}"`,t,a.column)}}return r}function ia(e,t,n,r,i){let o=[],a=0;for(;a<e.length;){let l=e[a],s=Se(l.value);if(!s)throw new d(`Unknown field "${l.value}"`,t,l.column);s.version==="2.1"&&C(r,i,l.value,{line:t,column:l.column}),a++;let c=[];if(s.inlineMode==="single"){let u=e[a];u&&(c.push(u),a++)}else if(s.inlineMode==="pair")for(let u=0;u<2;u++){let f=e[a];if(!f)break;c.push(f),a++}else for(;a<e.length&&!To.has(e[a].value);)c.push(e[a]),a++;if(c.length===0)throw new d(`Missing value for field "${l.value}"`,t,l.column);o.push({type:"field",key:l.value,values:c.map(u=>u.value),location:{line:t,column:l.column}})}return Pn(o,n),o}function oa(e,t,n,r,i){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);let o=Se(e[0].value);if(!o)throw new d(`Unknown field "${e[0].value}"`,t,e[0].column);o.version==="2.1"&&C(r,i,e[0].value,{line:t,column:e[0].column});let a={type:"field",key:e[0].value,values:e.slice(1).map(l=>l.value),location:{line:t,column:e[0].column}};return Pn([a],n),a}function On(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 aa(e,t,n){let r=An(e.fields),i=Tn(r),o=ca(e.objectType,r),a=ha(r.get("groups")?.[0]),l=Ke(r.get("epoch")?.[0]),s=Ke(r.get("referencePlane")?.[0]),c=r.has("tidalLock")?H(R(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?fa(r.get("resonance")[0]):void 0,f=da(r),m=r.get("derive")?.map($=>pa($)),h=r.get("validate")?.map($=>({rule:R($)})),y=r.has("locked")?[...new Set(r.get("locked").flatMap($=>$.values))]:void 0,g=r.get("tolerance")?.map($=>ma($)),x=ua(e.typedBlockEntries),S=Ln(e.infoEntries,"info"),p={type:e.objectType,id:e.id,properties:o,placement:i,info:S};return a.length>0&&(p.groups=a),l&&(p.epoch=l),s&&(p.referencePlane=s),c!==void 0&&(p.tidalLock=c),u&&(p.resonance=u),f&&(p.renderHints=f),m?.length&&(p.deriveRules=m),h?.length&&(p.validationRules=h),y?.length&&(p.lockedFields=y),g?.length&&(p.tolerances=g),x&&Object.keys(x).length>0&&(p.typedBlocks=x),Je(t,"2.1")&&(p.groups||p.epoch||p.referencePlane||p.tidalLock!==void 0||p.resonance||p.renderHints||p.deriveRules?.length||p.validationRules?.length||p.lockedFields?.length||p.tolerances?.length||p.typedBlocks)&&C(t,n,e.id,e.location),p}function sa(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>la(n))}}function la(e){let t=An(e.fields,"event-pose"),n=Tn(t);return{objectId:e.objectId,placement:n,inner:Z(t.get("inner")?.[0],"inner"),outer:Z(t.get("outer")?.[0],"outer"),epoch:Ke(t.get("epoch")?.[0]),referencePlane:Ke(t.get("referencePlane")?.[0])}}function An(e,t="object"){let n=new Map;for(let r of e){let i=Se(r.key);if(!i&&!jn.has(r.key))throw d.fromLocation(`Unknown field "${r.key}"`,r.location);if(!i?.allowRepeat&&n.has(r.key))throw d.fromLocation(`Duplicate field "${r.key}"`,r.location);let o=n.get(r.key)??[];o.push(r),n.set(r.key,o)}return n}function Tn(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 a=t??n??r??i;throw d.fromLocation("Object has multiple placement modes",a?.location)}if(t)return{mode:"orbit",target:R(t),distance:Z(e.get("distance")?.[0],"distance"),semiMajor:Z(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:ga(e.get("eccentricity")?.[0],"eccentricity"),period:Z(e.get("period")?.[0],"period"),angle:Z(e.get("angle")?.[0],"angle"),inclination:Z(e.get("inclination")?.[0],"inclination"),phase:Z(e.get("phase")?.[0],"phase")};if(n){let a=R(n);return{mode:"at",target:a,reference:yn(a,n.location)}}if(r)return{mode:"surface",target:R(r)};if(i){let a=R(i),l=yt(a);return{mode:"free",distance:l??void 0,descriptor:l?void 0:a}}return null}function ca(e,t){let n={};for(let[r,i]of t.entries()){let o=i[0],a=Se(r);!o||!a?.legacySchema||a.legacySchema.placement||(wt(r,e,o.location),n[r]=wn(r,o.values,o.location))}return n}function Ln(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 ua(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=Ln(r,n))}return t}function da(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=H(R(n),"renderLabel",n.location)),r&&(t.renderOrbit=H(R(r),"renderOrbit",r.location)),i&&(t.renderPriority=Xe(R(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function fa(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 pa(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 ma(e){if(e.values.length!==2)throw d.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=yt(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function ha(e){return e?[...new Set(e.values)]:[]}function Ke(e){return e&&e.values.join(" ").trim()||null}function Z(e,t){return e?bt(R(e),e.location,t):void 0}function ga(e,t){return e?Xe(R(e),t,e.location):void 0}function R(e){return xe(e.values,e.key,e.location)}function Se(e){return Ze.get(e)}function Pn(e,t){for(let n of e){let r=Se(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){wt(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 C(e,t,n,r){Je(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 ne(e,t,n,r){Je(e,"2.5")&&t.push({code:"parse.schema25.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.5; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function Je(e,t){return xn(e)<xn(t)}function xn(e){switch(e){case"2.0-draft":return 0;case"2.0":return 1;case"2.1":return 2;case"2.5":return 3}}function ba(e){let t=[...e],n=[],r=!1,i=!1,o=null,a=1,l=1;for(let s=0;s<t.length;s++){let c=t[s],u=t[s+1];if(i){if(c==="*"&&u==="/"){t[s]=" ",t[s+1]=" ",i=!1,o=null,s++,l+=2;continue}c!==`
1
+ "use strict";var WorldOrbitMarkdown=(()=>{var ot=Object.defineProperty;var tr=Object.getOwnPropertyDescriptor;var nr=Object.getOwnPropertyNames;var rr=Object.prototype.hasOwnProperty;var ir=(e,t)=>{for(var n in t)ot(e,n,{get:t[n],enumerable:!0})},or=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of nr(t))!rr.call(e,i)&&i!==n&&ot(e,i,{get:()=>t[i],enumerable:!(r=tr(t,i))||r.enumerable});return e};var ar=e=>or(ot({},"__esModule",{value:!0}),e);var gs={};ir(gs,{rehypeWorldOrbit:()=>Hn,remarkWorldOrbit:()=>Yn,renderWorldOrbitBlock:()=>ue,renderWorldOrbitError:()=>Ct});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 de=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],C=de.filter(e=>e!=="system"),sr=["star","planet","moon","asteroid","comet","structure","phenomenon"],zt=["structure","phenomenon"],X=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],lr=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function v(e,t){return{key:e,...t}}var Te=new Set(de),Bt=new Map([v("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:X}),v("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"distance"}),v("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"distance"}),v("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:X}),v("period",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"duration"}),v("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),v("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),v("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),v("at",{kind:"string",placement:!0,arity:"single",objectTypes:zt}),v("surface",{kind:"string",placement:!0,arity:"single",objectTypes:zt}),v("free",{kind:"string",placement:!0,arity:"single",objectTypes:lr}),v("kind",{kind:"string",placement:!1,arity:"single",objectTypes:C}),v("class",{kind:"string",placement:!1,arity:"single",objectTypes:C}),v("culture",{kind:"string",placement:!1,arity:"single",objectTypes:C}),v("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:de}),v("color",{kind:"string",placement:!1,arity:"single",objectTypes:de}),v("image",{kind:"string",placement:!1,arity:"single",objectTypes:sr}),v("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:de}),v("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:C,unitFamily:"radius"}),v("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:C,unitFamily:"mass"}),v("density",{kind:"unit",placement:!1,arity:"single",objectTypes:C,unitFamily:"generic"}),v("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:C,unitFamily:"generic"}),v("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:C,unitFamily:"generic"}),v("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:C}),v("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),v("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),v("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),v("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),v("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),v("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),v("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),v("on",{kind:"string",placement:!1,arity:"single",objectTypes:C}),v("source",{kind:"string",placement:!1,arity:"single",objectTypes:C}),v("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:C,unitFamily:"duration"})].map(e=>[e.key,e])),cr=new Set(Bt.keys());function P(e){return Bt.get(e)}function _t(e){return cr.has(e)}function Nt(e,t){return e.objectTypes.includes(t)}function Le(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 fe(e,t={}){let n=[],r=t.columnOffset??0,i="",o=null,a=!1,l=!1,s=null,c=()=>{o!==null&&(n.push({value:i,column:o,quoted:a}),i="",o=null,a=!1)};for(let u=0;u<e.length;u++){let f=e[u],m=r+u+1;if(l&&f==="\\"){let h=e[u+1];if(h==='"'||h==="\\"){i+=h,u++;continue}}if(f==='"'){l?l=!1:(o===null&&(o=m),a=!0,s=m,l=!0);continue}if(!l&&/\s/.test(f)){c();continue}o===null&&(o=m),i+=f}if(l)throw new d("Unclosed quote in line",t.line,s??r+e.length);return c(),n}function Pe(e){return e.match(/^\s*/)?.[0].length??0}function pe(e){let t=e.split(/\r?\n/),n=[],r=null,i=!1,o=null;for(let a=0;a<t.length;a++){let l=t[a],s=a+1;if(!l.trim())continue;let c=Pe(l),u=fe(l.slice(c),{line:s,columnOffset:c});if(u.length!==0){if(c===0){i=!1,o=null;let f=ur(u,s);n.push(f),r=f;continue}if(!r)throw new d("Indented line without parent object",s,c+1);if(u.length===1&&u[0].value==="info"){i=!0,o=c;continue}i&&c<=(o??0)&&(i=!1),i?r.infoEntries.push(pr(u,s)):r.blockFields.push(fr(u,s))}}return{type:"document",objects:n}}function ur(e,t){if(e.length<2)throw new d("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!Te.has(n.value))throw new d(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:dr(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function dr(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],o=P(i.value);if(!o)throw new d(`Unknown field "${i.value}"`,t,i.column);r++;let a=[];if(o.arity==="multiple")for(;r<e.length&&!_t(e[r].value);)a.push(e[r]),r++;else{let l=e[r];l&&(a.push(l),r++)}if(a.length===0)throw new d(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:a.map(l=>l.value),location:{line:t,column:i.column}})}return n}function fr(e,t){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);if(!P(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 pr(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 Ut=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,mr=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),hr=/^[A-Za-z][A-Za-z0-9+.-]*:/;function me(e){let t=null,n=[];for(let r of e.objects){let i=gr(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:[],events:[],objects:n}}function gr(e){let t=[...e.inlineFields,...e.blockFields];br(e.objectType,t);let n=yr(t),r=wr(e.objectType,n),i=vr(n),o=xr(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:o}:{type:e.objectType,id:e.name,properties:i,placement:r,info:o}}function br(e,t){for(let n of t){let r=P(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(!Nt(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 yr(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 wr(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),o=t.has("free"),a=[n,r,i,o].filter(Boolean).length;if(a>1){let l=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw d.fromLocation("Object has multiple placement modes",l?.location)}if(e==="system"&&a>0)throw d.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:De(t,"orbit"),distance:oe(t,"distance"),semiMajor:oe(t,"semiMajor"),eccentricity:kr(t,"eccentricity"),period:oe(t,"period"),angle:oe(t,"angle"),inclination:oe(t,"inclination"),phase:oe(t,"phase")};if(r){let l=Ee(t,"at"),s=De(t,"at");return{mode:"at",target:s,reference:jr(s,l.location)}}if(i)return{mode:"surface",target:De(t,"surface")};if(o){let l=De(t,"free"),s=Sr(l);return{mode:"free",distance:s??void 0,descriptor:s?void 0:l}}return null}function vr(e){let t={};for(let[n,r]of e.entries()){let i=P(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=Mr(r);break;case"number":t[n]=Yt(ae(r),n,r.location);break;case"unit":t[n]=Wt(ae(r),r.location,n);break;case"string":t[n]=Ir(n,r);break}}return t}function Ir(e,t){let n=t.values.join(" ").trim();return e==="image"&&$r(n,t.location),n}function $r(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(hr);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 xr(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 jr(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 Wt(e,t,n){let r=e.match(Ut);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=P(n);if(o?.unitFamily&&!Le(o.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Sr(e){let t=e.match(Ut);return t?{value:Number(t[1]),unit:t[2]??null}:null}function oe(e,t){if(!e.has(t))return;let n=Ee(e,t);return Wt(ae(n),n.location,t)}function kr(e,t){if(!e.has(t))return;let n=Ee(e,t);return Yt(ae(n),t,n.location)}function Yt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Mr(e){let t=ae(e).toLowerCase(),n=mr.get(t);if(n===void 0)throw d.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Ee(e,t){let n=e.get(t);if(!n)throw new d(`Missing value for key "${t}"`);return n}function De(e,t){return ae(Ee(e,t))}function ae(e){if(e.values.length!==1)throw d.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var Or=new Set(["star","planet","moon","asteroid","comet"]);function he(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||!Or.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"&&Ar(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&Tr(r,r.placement.reference,t))}}function Ar(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 Tr(e,t,n){if(!n.has(t.objectId))throw new d(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function te(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)}}var ge=1495978707e-1,Lr=6371,Pr=71492,Dr=695700,Er=63241.077,Fr=206264.806,Cr=206264806,Jt=.68,Vr=.2,Qt=28;function z(e,t={}){let n=Br(t),r=n.width,i=n.height,o=n.padding,a=zr(e),l=Nr(e,t.projection),s=dt(t.camera??null),c=ut(l,s),u=Yr(a,t.scaleModel),f=Hr(a),m=e.system?.id??null,h=t.activeEventId??null,y=Rr(e.objects,e.events??[],h),g=new Map(y.map(b=>[b.id,b])),x=Ti(y,g),S=new Map,p=[],$=[],D=[],_=[],E=[],G=new Map,H=new Map;for(let b of y){let F=b.placement;if(!F){D.push(b);continue}if(F.mode==="orbit"){qt(H,F.target,b);continue}if(F.mode==="surface"){qt(G,F.target,b);continue}if(F.mode==="at"){E.push(b);continue}_.push(b)}let Q=_.length>0?r*.42:r/2,A=i/2,N={orbitChildren:H,surfaceChildren:G,objectMap:g,spacingFactor:f,projection:c,scaleModel:u},U=D.find(b=>b.type==="star")??D[0]??null;U&&st(U,Q,A,0,S,p,$,N);let W=D.filter(b=>b.id!==U?.id);if(W.length>0){let b=Math.min(r,i)*.28*f*u.orbitDistanceMultiplier;W.forEach((F,k)=>{let it=Ie(k,W.length,-Math.PI/2),ee=$e(it,b,c,1);st(F,Q+ee.x,A+ee.y,0,S,p,$,N)})}_.forEach((b,F)=>{let k=r-o-140-Ci(b.placement?.mode==="free"?b.placement.distance:void 0,u),it=Math.max(76,(i-o*2-180)/Math.max(1,_.length)*f)*u.freePlacementMultiplier,ee=o+92+F*it;S.set(b.id,{object:b,x:k,y:ee,radius:ze(b,0,u),sortKey:_e(k,ee,0)}),$.push({object:b,groupId:x.groupIds.get(b.id)??null,x1:k-60,y1:ee,x2:k-18,y2:ee,mode:"free"}),Ve(b,S,p,$,N,1)}),E.forEach((b,F)=>{if(S.has(b.id)||!b.placement||b.placement.mode!=="at")return;let k=Oi(b.placement.reference,S,g,F,E.length,r,i,o,N);S.set(b.id,{object:b,x:k.x,y:k.y,radius:ze(b,2,u),sortKey:_e(k.x,k.y,2),anchorX:k.anchorX,anchorY:k.anchorY}),k.anchorX!==void 0&&k.anchorY!==void 0&&$.push({object:b,groupId:x.groupIds.get(b.id)??null,x1:k.anchorX,y1:k.anchorY,x2:k.x,y2:k.y,mode:"at"}),Ve(b,S,p,$,N,2)});let L=[...S.values()].map(b=>Xr(b,u,x)),Me=p.map(b=>qr(b,x.groupIds.get(b.object.id)??null)),Oe=$.map(b=>Kr(b)),Ae=Zr(L,r,i,u.labelMultiplier),Vt=oi(e,L),Rt=ai(e.events??[],L,h),Kn=ni(Me,Vt,Rt,Oe,L,Ae),Zn=ri(L,Me,Oe,Ae,x,u.labelMultiplier),Jn=ii(e,L),Qn=si(e,l,n.preset,x,g),er=wi(r,i,L,Me,Oe,Ae,u.labelMultiplier);return{width:r,height:i,padding:o,renderPreset:n.preset,projection:l,renderProjection:c,camera:s,scaleModel:u,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:Wr(l,c,a,s),systemId:m,viewMode:l,layoutPreset:a,metadata:{format:e.format,version:e.version,view:l,renderProjection:c,scale:String(e.system?.properties.scale??a),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom",...s?.azimuth!==null?{"camera.azimuth":String(s?.azimuth)}:{},...s?.elevation!==null?{"camera.elevation":String(s?.elevation)}:{},...s?.roll!==null?{"camera.roll":String(s?.roll)}:{},...s?.distance!==null?{"camera.distance":String(s?.distance)}:{}},contentBounds:er,layers:Kn,groups:Zn,semanticGroups:Jn,viewpoints:Qn,events:Rt,activeEventId:h,objects:L,orbitVisuals:Me,relations:Vt,leaders:Oe,labels:Ae}}function Rr(e,t,n){let r=e.map(l=>structuredClone(l));if(!n)return r;let i=t.find(l=>l.id===n);if(!i)return r;let o=new Map(r.map(l=>[l.id,l])),a=new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds,...i.positions.map(l=>l.objectId)]);for(let l of a){let s=o.get(l);s&&(i.epoch&&(s.epoch=i.epoch),i.referencePlane&&(s.referencePlane=i.referencePlane))}for(let l of i.positions){let s=o.get(l.objectId);s&&(l.placement&&(s.placement=structuredClone(l.placement)),l.inner&&(s.properties.inner={...l.inner}),l.outer&&(s.properties.outer={...l.outer}),l.epoch&&(s.epoch=l.epoch),l.referencePlane&&(s.referencePlane=l.referencePlane))}return r}function zr(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 Br(e){let t=_r(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function _r(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 Nr(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return nn(n)??"topdown"}function ut(e,t){switch(e){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return t&&(t.azimuth!==null||t.elevation!==null||t.roll!==null)?"isometric":"topdown";case"perspective":return"isometric"}}function dt(e){if(!e)return null;let t={azimuth:at(e.azimuth),elevation:at(e.elevation),roll:at(e.roll),distance:Ur(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function at(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Ur(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function Wr(e,t,n,r){let i=[`${Kt(e)} view`,`${Kt(n)} layout`];if(e!==t&&i.push(`2D ${t} fallback`),r){let o=[r.azimuth!==null?`az ${r.azimuth}`:null,r.elevation!==null?`el ${r.elevation}`:null,r.roll!==null?`roll ${r.roll}`:null,r.distance!==null?`dist ${r.distance}`:null].filter(Boolean);o.length>0&&i.push(`camera ${o.join(" / ")}`)}return i.join(" - ")}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 Hr(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Xr(e,t,n){let{object:r,x:i,y:o,radius:a,sortKey:l,anchorX:s,anchorY:c}=e,u=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:o,radius:a,visualRadius:Fi(r,a,t),sortKey:l+u*.001,anchorX:s,anchorY:c,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:Ri(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function qr(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 Kr(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 Zr(e,t,n,r){let i=[],o=[],a=new Map(e.map(s=>[s.objectId,s])),l=[...e].filter(s=>!s.hidden&&s.object.renderHints?.renderLabel!==!1).sort(Jr);for(let s of l){let c=Qr(s,a,o,t,n,r)??tn(s,en(s,a.get(s.parentId??"")??null,n),0,r);o.push(ln(s,c,r)),i.push({renderId:`${s.renderId}-label`,objectId:s.objectId,object:s.object,groupId:s.groupId,semanticGroupIds:[...s.semanticGroupIds],label:s.label,secondaryLabel:s.secondaryLabel,x:c.x,y:c.labelY,secondaryY:c.secondaryY,textAnchor:c.textAnchor,direction:c.direction,hidden:s.hidden})}return i}function Jr(e,t){let n=Gt(e)-Gt(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 Gt(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 Qr(e,t,n,r,i,o){for(let a of ei(e,t,r,i)){let l=a==="left"||a==="right"?4:6;for(let s=0;s<=l;s+=1){let c=tn(e,a,s,o),u=ln(e,c,o);if(!n.some(f=>Di(f,u)))return c}}return null}function ei(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,o=en(e,i,r),a=o==="below"?"above":"below",l=ti(e,i,n),s=l==="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"?[l,o,s,a]:[o,l,a,s]}function en(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 ti(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 tn(e,t,n,r){let i=14*r;switch(t){case"above":{let o=e.y-(e.radius+18*r+n*i);return{x:e.x,labelY:o,secondaryY:o-16*r,textAnchor:"middle",direction:t}}case"below":{let o=e.y+e.radius+18*r+n*i;return{x:e.x,labelY:o,secondaryY:o+16*r,textAnchor:"middle",direction:t}}case"left":{let o=e.x-(e.visualRadius+16*r+n*i),a=e.y-4*r;return{x:o,labelY:a,secondaryY:a+16*r,textAnchor:"end",direction:t}}case"right":{let o=e.x+e.visualRadius+16*r+n*i,a=e.y-4*r;return{x:o,labelY:a,secondaryY:a+16*r,textAnchor:"start",direction:t}}}}function ni(e,t,n,r,i,o){let a=e.filter(s=>!s.hidden&&!!s.backArcPath).map(s=>s.renderId),l=e.filter(s=>!s.hidden).map(s=>s.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"orbits-back",renderIds:a},{id:"orbits-front",renderIds:l},{id:"relations",renderIds:t.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"events",renderIds:n.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"objects",renderIds:i.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"labels",renderIds:o.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function ri(e,t,n,r,i,o){let a=new Map,l=s=>{if(!s)return null;let c=a.get(s);if(c)return c;let u=i.groupRoots.get(s)??null,f={renderId:s,rootObjectId:u,label:u??s,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:ve(0,0,0,0)};return a.set(s,f),f};for(let s of e){let c=l(s.groupId);c&&!s.hidden&&c.objectIds.push(s.objectId)}for(let s of t){let c=l(s.groupId);c&&!s.hidden&&c.orbitIds.push(s.objectId)}for(let s of n){let c=l(s.groupId);c&&!s.hidden&&c.leaderIds.push(s.objectId)}for(let s of r){let c=l(s.groupId);c&&!s.hidden&&c.labelIds.push(s.objectId)}for(let s of a.values())s.contentBounds=Li(s,e,t,n,r,o);return[...a.values()].sort((s,c)=>s.label.localeCompare(c.label))}function ii(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 oi(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),o=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:o?.x??0,y2:o?.y??0,hidden:r.hidden||!i||!o||i.hidden||o.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function ai(e,t,n){let r=new Map(t.map(i=>[i.objectId,i]));return e.map(i=>{let o=[...new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds])],a=o.map(c=>r.get(c)).filter(Boolean),l=a.length>0?a.reduce((c,u)=>c+u.x,0)/a.length:0,s=a.length>0?a.reduce((c,u)=>c+u.y,0)/a.length:0;return{renderId:`${se(i.id)}-event`,eventId:i.id,event:i,objectIds:o,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:l,y:s,hidden:i.hidden||a.length===0||a.every(c=>c.hidden)||n!==null&&i.id!==n}}).sort((i,o)=>i.event.id.localeCompare(o.event.id))}function si(e,t,n,r,i){let o=li(e,t,n),a=new Map;for(let[c,u]of Object.entries(e.system?.info??{})){if(!c.startsWith("viewpoint."))continue;let[f,m,...h]=c.split(".");if(f!=="viewpoint"||!m||h.length===0)continue;let y=gi(m);if(!y)continue;let g=h.join(".").toLowerCase(),x=a.get(y)??{id:y};ci(x,g,u,e,t,n,r,i),a.set(y,x)}let l=[...a.values()].map(c=>ui(c,t,n,i)).filter(Boolean),s=l.findIndex(c=>c.id===o.id);return s>=0?l.splice(s,1,{...o,...l[s],layers:{...o.layers,...l[s].layers},filter:l[s].filter??o.filter,generated:!1}):l.unshift(o),l.sort((c,u)=>c.id==="overview"?-1:u.id==="overview"?1:c.label.localeCompare(u.label))}function li(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",o=dt(null),a=ut(t,o);return{id:"overview",label:i,summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,renderProjection:a,camera:o,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function ci(e,t,n,r,i,o,a,l){let s=n.trim();switch(t){case"label":case"title":s&&(e.label=s);return;case"summary":case"description":s&&(e.summary=s);return;case"focus":case"object":s&&(e.focus=s);return;case"select":case"selection":s&&(e.select=s);return;case"events":e.eventIds=we(s);return;case"projection":case"view":e.projection=nn(s)??i;return;case"preset":e.preset=fi(s)??o;return;case"rotation":case"angle":e.rotationDeg=be(s)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??Ce(),azimuth:be(s)};return;case"camera.elevation":e.camera={...e.camera??Ce(),elevation:be(s)};return;case"camera.roll":e.camera={...e.camera??Ce(),roll:be(s)};return;case"camera.distance":e.camera={...e.camera??Ce(),distance:Ht(s)};return;case"zoom":case"scale":e.scale=Ht(s);return;case"layers":e.layers=pi(s);return;case"query":e.filter={...e.filter??Fe(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??Fe(),objectTypes:mi(s)};return;case"tags":e.filter={...e.filter??Fe(),tags:we(s)};return;case"groups":e.filter={...e.filter??Fe(),groupIds:hi(s,r,a,l)};return}}function ui(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,o=e.select&&r.has(e.select)?e.select:i,a=di(e.filter),l=e.label?.trim()||bi(e.id),s=e.projection??t,c=dt(e.camera??null),u=ut(s,c);return{id:e.id,label:l,summary:e.summary?.trim()||yi(l,i,a),objectId:i,selectedObjectId:o,eventIds:[...new Set(e.eventIds??[])],projection:s,renderProjection:u,camera:c,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:a,generated:!1}}function Fe(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Ce(){return{azimuth:null,elevation:null,roll:null,distance:null}}function di(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 nn(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function fi(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function be(e){let t=Number(e);return Number.isFinite(t)?t:null}function Ht(e){let t=be(e);return t!==null&&t>0?t:null}function pi(e){let t={};for(let n of we(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 mi(e){return we(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function hi(e,t,n,r){return we(e).map(i=>t.schemaVersion==="2.1"||t.schemaVersion==="2.5"||t.groups.some(o=>o.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??ye(i):(r.has(i),ye(i)))}function we(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function gi(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function bi(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function yi(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 wi(e,t,n,r,i,o,a){let l=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,f=(m,h)=>{l=Math.min(l,m),s=Math.min(s,h),c=Math.max(c,m),u=Math.max(u,h)};for(let m of r)m.hidden||rn(m,f);for(let m of i)m.hidden||(f(m.x1,m.y1),f(m.x2,m.y2));for(let m of n)m.hidden||on(m,f);for(let m of o)m.hidden||an(m,f,a);return!Number.isFinite(l)||!Number.isFinite(s)?ve(0,0,e,t):ve(l,s,c,u)}function rn(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,o=un(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,Qt*2);for(let a of o)t(a.x-n,a.y-n),t(a.x+n,a.y+n)}function ve(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 on(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 an(e,t,n){let r=cn(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 st(e,t,n,r,i,o,a,l){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:ze(e,r,l.scaleModel),sortKey:_e(t,n,r)}),Ve(e,i,o,a,l,r+1))}function Ve(e,t,n,r,i,o){let a=t.get(e.id);if(!a)return;let l=[...i.orbitChildren.get(e.id)??[]].sort(vi),s=Ii(l,a.radius,i.spacingFactor,i.scaleModel),c=ji(l,s);l.forEach((f,m)=>{let h=$i(f,m,l.length,a,s,c[m]??s.innerPx,i);n.push({object:f,parentId:e.id,kind:h.kind,cx:h.cx,cy:h.cy,radius:h.radius,rx:h.rx,ry:h.ry,rotationDeg:h.rotationDeg,band:h.band,bandThickness:h.bandThickness,frontArcPath:h.frontArcPath,backArcPath:h.backArcPath}),st(f,h.objectX,h.objectY,o,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((f,m)=>{let h=Ie(m,u.length,-Math.PI/3),y=28*i.spacingFactor,g=$e(h,a.radius,i.projection,i.projection==="isometric"?.9:1),x=$e(h,a.radius+y,i.projection,i.projection==="isometric"?.9:1),S=a.x+g.x,p=a.y+g.y,$=a.x+x.x,D=a.y+x.y;t.set(f.id,{object:f,x:$,y:D,radius:ze(f,o+1,i.scaleModel),sortKey:_e($,D,o+1),anchorX:S,anchorY:p}),r.push({object:f,groupId:i.objectMap.has(f.id)?ye(Pi(f,i.objectMap)):null,x1:S,y1:p,x2:$,y2:D,mode:"surface"}),Ve(f,t,n,r,i,o+1)})}function vi(e,t){let n=Re(e),r=Re(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 Ii(e,t,n,r){let i=e.map(f=>Re(f)),o=i.filter(f=>f!==null),a=t+56*n*r.orbitDistanceMultiplier,l=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(o.length===0)return{metrics:i,minMetric:0,maxMetric:0,metricSpread:0,innerPx:a,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:l*.42};let s=Math.min(...o),c=Math.max(...o),u=c-s;return{metrics:i,minMetric:s,maxMetric:c,metricSpread:u,innerPx:a,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:l*.42}}function $i(e,t,n,r,i,o,a){let l=e.placement,s=e.type==="belt"||e.type==="ring";if(!l||l.mode!=="orbit"){let H=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:H,rotationDeg:0,band:s,bandThickness:s?12*a.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-H}}let c=M(typeof l.eccentricity=="number"?l.eccentricity:0,0,.92),u=o,f=Math.max(u*Math.sqrt(1-c*c),u*.18),m=ct(l.inclination)??0,h=a.projection==="isometric"?Math.max(Vr,Math.cos(ft(m)))*Jt:1,y=Math.max(f*h,u*.14),g=ct(l.angle)??0,x=u*c,S=fn(-x,0,g),p=r.x+S.x,$=r.y+S.y,D=ki(l.phase,t,n),_=dn(p,$,u,y,g,D),E=a.projection==="topdown"&&c<=1e-4&&Math.abs(g)<=1e-4,G=s?Mi(e,u,i,a.scaleModel):void 0;return{kind:E?"circle":"ellipse",cx:E?r.x:p,cy:E?r.y:$,radius:E?u:void 0,rx:E?void 0:u,ry:E?void 0:y,rotationDeg:g,band:s,bandThickness:G,frontArcPath:a.projection==="isometric"||s?Xt(p,$,u,y,g,0,Math.PI):void 0,backArcPath:a.projection==="isometric"||s?Xt(p,$,u,y,g,Math.PI,Math.PI*2):void 0,objectX:_.x,objectY:_.y}}function xi(e,t){return t.innerPx+t.stepPx*Si(Math.max(e,0)+1)}function ji(e,t){let n=[];return e.forEach((r,i)=>{let o=Re(r),a=t.innerPx+i*t.stepPx,l=o===null?a:xi(o,t),s=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(l,s))}),n}function Re(e){return!e.placement||e.placement.mode!=="orbit"?null:Be(e.placement.semiMajor??e.placement.distance??null)}function Si(e){return Math.log(e)/Math.log(2)}function ki(e,t,n){let r=e?ct(e):null;return r!==null?ft(r-90):Ie(t,n,-Math.PI/2)}function Mi(e,t,n,r){let i=Be(lt(e.properties.inner)),o=Be(lt(e.properties.outer));if(i!==null&&o!==null){let l=Math.abs(o-i);if(n.metricSpread>0)return M(l/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let s=Math.max(Math.max(i,o),1e-4);return M(l/s*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function Oi(e,t,n,r,i,o,a,l,s){if(e.kind==="lagrange")return Ai(e,t,n,o,a);if(e.kind==="anchor"){let c=t.get(e.objectId);if(c){let u=Ie(r,i,Math.PI/5),f=(c.radius+36)*s.scaleModel.labelMultiplier,m=$e(u,f,s.projection,s.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=Ie(r,i,Math.PI/6),f=(c.radius+36)*s.scaleModel.labelMultiplier,m=$e(u,f,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+m.x,y:c.y+m.y,anchorX:c.x,anchorY:c.y}}}return{x:o-l-170,y:a-l-86-r*58*s.scaleModel.freePlacementMultiplier}}function Ai(e,t,n,r,i){let o=e.secondary?t.get(e.primary):Ei(e.primary,t,n),a=t.get(e.secondary??e.primary);if(!o||!a)return{x:r*.7,y:i*.25};let l=a.x-o.x,s=a.y-o.y,c=Math.hypot(l,s)||1,u=l/c,f=s/c,m=-f,h=u,y=M(c*.25,24,68);switch(e.point){case"L1":return{x:a.x-u*y,y:a.y-f*y,anchorX:a.x,anchorY:a.y};case"L2":return{x:a.x+u*y,y:a.y+f*y,anchorX:a.x,anchorY:a.y};case"L3":return{x:o.x-u*y,y:o.y-f*y,anchorX:o.x,anchorY:o.y};case"L4":return{x:a.x+(u*.5-m*.8660254)*y,y:a.y+(f*.5-h*.8660254)*y,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(u*.5+m*.8660254)*y,y:a.y+(f*.5+h*.8660254)*y,anchorX:a.x,anchorY:a.y}}}function Ti(e,t){let n=new Map,r=new Map;for(let c of e){let u=sn(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,o=new Map,a=new Map,l=c=>{let u=i.get(c);if(u)return u;let f=new Set,m=[],h=n.get(c)??null;for(;h&&!f.has(h);)m.push(h),f.add(h),h=n.get(h)??null;return i.set(c,m),m},s=c=>{let u=a.get(o.get(c)??"");if(u)return u;let f=n.get(c)??null,m=t.get(c),h=c;return m?.placement&&m.placement.mode!=="free"&&f&&(h=s(f)),h};for(let c of e){l(c.id);let u=s(c.id),f=ye(u);o.set(c.id,f),a.set(f,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:o,groupRoots:a}}function sn(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 Li(e,t,n,r,i,o){let a=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=(f,m)=>{a=Math.min(a,f),l=Math.min(l,m),s=Math.max(s,f),c=Math.max(c,m)};for(let f of t)!f.hidden&&e.objectIds.includes(f.objectId)&&on(f,u);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&rn(f,u);for(let f of r)!f.hidden&&e.leaderIds.includes(f.objectId)&&(u(f.x1,f.y1),u(f.x2,f.y2));for(let f of i)!f.hidden&&e.labelIds.includes(f.objectId)&&an(f,u,o);return!Number.isFinite(a)||!Number.isFinite(l)?ve(0,0,0,0):ve(a,l,s,c)}function Pi(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=sn(n,t);if(!i)break;let o=t.get(i);if(!o)break;n=o}return n.id}function ln(e,t,n){return cn(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function cn(e,t,n,r,i,o,a,l){let s=zi(o,a,l),c=s*2,u=i==="above"?18:12,f=i==="above"?8:12,m=e-s,h=e+s;return r==="start"?(m=e,h=e+c):r==="end"&&(m=e-c,h=e),{left:m,right:h,top:Math.min(t,n)-u,bottom:Math.max(t,n)+f}}function Di(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Ei(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function ze(e,t,n){let r=Vi(e.properties.radius,n);if(r!==null)return r;let i=n.bodyRadiusMultiplier;switch(e.type){case"star":return M((t===0?28:20)*i,n.minBodyRadius,n.maxBodyRadius);case"planet":return M(12*i,n.minBodyRadius,n.maxBodyRadius);case"moon":return M(7*i,n.minBodyRadius,n.maxBodyRadius);case"belt":return M(5*i,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return M(5*i,n.minBodyRadius,n.maxBodyRadius);case"comet":return M(6*i,n.minBodyRadius,n.maxBodyRadius);case"ring":return M(5*i,n.minBodyRadius,n.maxBodyRadius);case"structure":return M(6*i,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return M(8*i,n.minBodyRadius,n.maxBodyRadius)}}function Fi(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 Be(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/ge;case"m":return e.value/1e3/ge;case"ly":return e.value*Er;case"pc":return e.value*Fr;case"kpc":return e.value*Cr;case"re":return e.value*Lr/ge;case"rj":return e.value*Pr/ge;case"sol":return e.value*Dr/ge;default:return e.value}}function Ci(e,t){let n=Be(e??null);return n===null||n<=0?0:M(n*96*t.freePlacementMultiplier,0,420)}function Vi(e,t){let n=lt(e);if(!n)return null;let r;switch(n.unit){case"sol":r=M(n.value*22,14,40);break;case"re":r=M(n.value*10,6,18);break;case"km":r=M(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=M(n.value*4,4,20);break}return M(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function lt(e){return!e||typeof e!="object"||!("value"in e)?null:e}function ct(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Ie(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function Xt(e,t,n,r,i,o,a){let l=un(e,t,n,r,i,o,a,Qt);return l.length===0?"":l.map((s,c)=>`${c===0?"M":"L"} ${Zt(s.x)} ${Zt(s.y)}`).join(" ")}function un(e,t,n,r,i,o,a,l){let s=[];for(let c=0;c<=l;c+=1){let u=o+(a-o)*c/l;s.push(dn(e,t,n,r,i,u))}return s}function dn(e,t,n,r,i,o){let a=n*Math.cos(o),l=r*Math.sin(o),s=fn(a,l,i);return{x:e+s.x,y:t+s.y}}function fn(e,t,n){let r=ft(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function $e(e,t,n,r){let i=n==="isometric"?Jt*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function _e(e,t,n){return t*1e3+e+n*.01}function M(e,t,n){return Math.min(Math.max(e,t),n)}function qt(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 ye(e){return`${se(e)}-group`}function Ri(e){return typeof e=="string"&&e.trim()?e:void 0}function zi(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 Kt(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function ft(e){return e*Math.PI/180}function Zt(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var hn=86400,Ne=hn*365.25,Ue=18,pn=180;function Ge(e,t={}){let n={width:t.width,height:t.height,padding:t.padding,preset:t.preset,projection:t.projection,camera:t.camera,scaleModel:t.scaleModel,activeEventId:t.activeEventId},r=z(e,n),i=Wi(r.layoutPreset,t.spatialScaleModel),o={x:r.contentBounds.centerX,y:r.contentBounds.centerY},a=new Map(r.objects.map(g=>[g.objectId,g])),l=new Map(r.orbitVisuals.map(g=>[g.objectId,g])),s=new Map;for(let g of r.objects){let x=g.object.placement;!x||x.mode!=="orbit"||s.set(g.objectId,mt(x))}let c=Math.min(...[...s.values()].filter(g=>Number.isFinite(g)&&g>0))||1,u=new Map,f=r.objects.map(g=>Bi(g,r,o,a,l,i,u,c)),m=new Map(f.map(g=>[g.objectId,g])),h=r.orbitVisuals.map(g=>_i(g,m,c,r.activeEventId!==null)),y=f.map(g=>({objectId:g.objectId,center:{...g.position},radius:g.visualRadius+i.focusPadding}));return{width:r.width,height:r.height,padding:r.padding,renderPreset:r.renderPreset,projection:r.projection,camera:r.camera,scaleModel:i,title:r.title,subtitle:r.subtitle,systemId:r.systemId,viewMode:"3d",layoutPreset:r.layoutPreset,metadata:{...r.metadata,"viewer.mode":"3d"},contentBounds:Gi(f),semanticGroups:r.semanticGroups,viewpoints:r.viewpoints,activeEventId:r.activeEventId,timeFrozen:r.activeEventId!==null,objects:f,orbits:h,focusTargets:y}}function Bi(e,t,n,r,i,o,a,l){let s=We(e,t,n,r,i,a),c=ht(e.object,i.get(e.objectId),l,t.activeEventId!==null);return{objectId:e.objectId,object:e.object,parentId:e.parentId,ancestorIds:e.ancestorIds.slice(),childIds:e.childIds.slice(),groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),position:s,radius:le(e.radius*o.bodyRadiusMultiplier,o.minBodyRadius,o.maxBodyRadius),visualRadius:le(e.visualRadius*o.bodyRadiusMultiplier,o.minBodyRadius,o.maxBodyRadius+24),label:e.label,secondaryLabel:e.secondaryLabel,fillColor:e.fillColor,imageHref:e.imageHref,hidden:e.hidden,motion:c}}function _i(e,t,n,r){let i=t.get(e.objectId),o=t.get(e.parentId);return{objectId:e.objectId,object:e.object,parentId:e.parentId,groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),center:o?.position??{x:0,y:0,z:0},kind:e.kind,radius:e.radius,semiMajor:e.radius??e.rx??0,semiMinor:e.radius??e.ry??0,rotationDeg:e.rotationDeg,inclinationDeg:i?.motion?.inclinationDeg??Ye(e.object.placement?.mode==="orbit"?e.object.placement.inclination:void 0)??0,band:e.band,bandThickness:e.bandThickness,hidden:e.hidden,motion:i?.motion??ht(e.object,e,n,r)}}function We(e,t,n,r,i,o){let a=o.get(e.objectId);if(a)return a;let l=e.object.placement,s;if(l?.mode==="orbit"&&e.parentId){let c=r.get(e.parentId),u=c?We(c,t,n,r,i,o):{x:0,y:0,z:0},f=i.get(e.objectId),m=ht(e.object,f,1,t.activeEventId!==null),h=m?Ni(m,0):{x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};s=Hi(u,h)}else if(l?.mode==="surface"&&e.parentId){let c=r.get(e.parentId),u=c?We(c,t,n,r,i,o):{x:0,y:0,z:0},f=c?.visualRadius??16,m=Xi(e.objectId),h=m*Math.PI*2;s={x:u.x+Math.cos(h)*(f+e.visualRadius*.9),y:u.y+Math.sin(m*Math.PI)*Math.max(e.visualRadius*.2,2),z:u.z+Math.sin(h)*(f+e.visualRadius*.9)}}else if(l?.mode==="at"&&e.parentId){let c=r.get(e.parentId),u=c?We(c,t,n,r,i,o):{x:0,y:0,z:0},f=e.anchorX??c?.x??n.x,m=e.anchorY??c?.y??n.y;s={x:u.x+(e.x-f),y:u.y,z:u.z+(e.y-m)}}else s={x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};return o.set(e.objectId,s),s}function Ni(e,t){let n=e.phase0Deg+e.angularVelocityDegPerSecond*t,r=pt(n),i=pt(e.rotationDeg),o=pt(e.inclinationDeg),a=Math.cos(r)*e.semiMajor,l=Math.sin(r)*e.semiMinor,s=a*Math.cos(i)-l*Math.sin(i),c=a*Math.sin(i)+l*Math.cos(i);return{x:s,y:c*Math.sin(o),z:c*Math.cos(o)}}function ht(e,t,n,r){let i=e.placement;if(!i||i.mode!=="orbit")return null;let o=t?.radius??t?.rx??le(mt(i)*48,24,1200),a=t?.radius??t?.ry??o,l=Ui(i.period),s=mt(i),c=le(s/Math.max(n,1e-4),1,20),u=le(l?Ue*c:Ue*Math.pow(c,.75),Ue,pn);return{phase0Deg:Ye(i.phase)??0,rotationDeg:Ye(i.angle)??t?.rotationDeg??0,inclinationDeg:Ye(i.inclination)??0,semiMajor:o,semiMinor:a,eccentricity:i.eccentricity??0,periodSeconds:l,angularVelocityDegPerSecond:360/Math.max(u,.001),heuristic:l===null,frozen:r}}function mt(e){let t=mn(e.semiMajor)??mn(e.distance)??1;return Math.max(t,.01)}function mn(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/1495978707e-1;case"m":return e.value/149597870700;case"re":return e.value*6371/1495978707e-1;case"rj":return e.value*71492/1495978707e-1;case"sol":return e.value*695700/1495978707e-1;case"ly":return e.value*63241.077;case"pc":return e.value*206264.806;case"kpc":return e.value*206264806;default:return e.value}}function Ui(e){if(!e)return null;switch(e.unit){case"s":return e.value;case"min":return e.value*60;case"h":return e.value*3600;case"d":return e.value*hn;case"y":return e.value*Ne;case"ky":return e.value*Ne*1e3;case"my":return e.value*Ne*1e6;case"gy":return e.value*Ne*1e9;default:return null}}function Ye(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Wi(e,t){return{...Yi(e),...t}}function Yi(e){switch(e){case"compact":return{orbitDistanceMultiplier:.92,bodyRadiusMultiplier:.92,markerSizeMultiplier:.92,ringThicknessMultiplier:.9,focusPadding:10,minBodyRadius:4,maxBodyRadius:34};case"presentation":return{orbitDistanceMultiplier:1.15,bodyRadiusMultiplier:1.12,markerSizeMultiplier:1.08,ringThicknessMultiplier:1.14,focusPadding:16,minBodyRadius:5,maxBodyRadius:44};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,markerSizeMultiplier:1,ringThicknessMultiplier:1,focusPadding:12,minBodyRadius:4,maxBodyRadius:40}}}function Gi(e){if(e.length===0)return{minX:0,minY:0,minZ:0,maxX:0,maxY:0,maxZ:0,width:0,height:0,depth:0,center:{x:0,y:0,z:0}};let t=Number.POSITIVE_INFINITY,n=Number.POSITIVE_INFINITY,r=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY,a=Number.NEGATIVE_INFINITY;for(let l of e)t=Math.min(t,l.position.x-l.visualRadius),n=Math.min(n,l.position.y-l.visualRadius),r=Math.min(r,l.position.z-l.visualRadius),i=Math.max(i,l.position.x+l.visualRadius),o=Math.max(o,l.position.y+l.visualRadius),a=Math.max(a,l.position.z+l.visualRadius);return{minX:t,minY:n,minZ:r,maxX:i,maxY:o,maxZ:a,width:i-t,height:o-n,depth:a-r,center:{x:(t+i)/2,y:(n+o)/2,z:(r+a)/2}}}function Hi(e,t){return{x:e.x+t.x,y:e.y+t.y,z:e.z+t.z}}function Xi(e){let t=0;for(let n=0;n<e.length;n+=1)t=t*31+e.charCodeAt(n)>>>0;return t%1e4/1e4}function le(e,t,n){return Math.min(Math.max(e,t),n)}function pt(e){return e*Math.PI/180}function gt(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:eo(e.system),info:to(e.system)}:null,r=e.objects.map(qi);return Ji(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(Ki),objects:r}}function qi(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:Qi(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function Ki(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(Zi)}}function Zi(e){return{objectId:e.objectId,placement:gn(e.placement),inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0,epoch:e.epoch??null,referencePlane:e.referencePlane??null}}function gn(e){return e?structuredClone(e):null}function Ji(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])),o=new Set([...r.targetObjectId?[r.targetObjectId]:[],...r.participantObjectIds,...r.positions.map(a=>a.objectId)]);for(let a of o){let l=i.get(a);l&&(r.epoch&&(l.epoch=r.epoch),r.referencePlane&&(l.referencePlane=r.referencePlane))}for(let a of r.positions){let l=i.get(a.objectId);l&&(a.placement&&(l.placement=gn(a.placement)),a.inner&&(l.properties.inner={...a.inner}),a.outer&&(l.properties.outer={...a.outer}),a.epoch&&(l.epoch=a.epoch),a.referencePlane&&(l.referencePlane=a.referencePlane))}}function Qi(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 eo(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 to(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)),n.camera?.azimuth!==null&&(t[`${r}.camera.azimuth`]=String(n.camera?.azimuth)),n.camera?.elevation!==null&&(t[`${r}.camera.elevation`]=String(n.camera?.elevation)),n.camera?.roll!==null&&(t[`${r}.camera.roll`]=String(n.camera?.roll)),n.camera?.distance!==null&&(t[`${r}.camera.distance`]=String(n.camera?.distance));let i=no(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 no(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(" ")}var bn=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,oo=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),ao=/^[A-Za-z][A-Za-z0-9+.-]*:/;function ce(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function je(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function bt(e,t,n){let r=e.match(bn);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=P(n);if(o?.unitFamily&&!Le(o.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function yt(e){let t=e.match(bn);return t?{value:Number(t[1]),unit:t[2]??null}:null}function He(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function q(e,t,n){let r=oo.get(e.toLowerCase());if(r===void 0)throw d.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function yn(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 so(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(ao);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 wn(e,t,n){let r=P(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 q(xe(t,e,n),e,n);case"number":return He(xe(t,e,n),e,n);case"unit":return bt(xe(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&so(i,n),i}}}function wt(e,t,n){let r=P(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 xe(e,t,n){if(e.length!==1)throw d.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var In=new Set(["star","planet","moon","asteroid","comet"]),lo=332946.0487,co=1047.3486,Xe=1495978707e-1,uo=6371,fo=695700,po=63241.077,mo=206264.806,ho=206264806;function qe(e,t){let n=[],r=new Map(e.objects.map(l=>[l.id,l])),i=new Set(e.groups.map(l=>l.id)),o=new Set(e.events.map(l=>l.id));e.system||n.push(w("validate.system.required","Atlas documents must declare exactly one system."));let a=new Map;for(let[l,s]of[["group",e.groups.map(c=>c.id)],["viewpoint",e.system?.viewpoints.map(c=>c.id)??[]],["annotation",e.system?.annotations.map(c=>c.id)??[]],["relation",e.relations.map(c=>c.id)],["event",e.events.map(c=>c.id)],["object",e.objects.map(c=>c.id)]])for(let c of s){let u=a.get(c);u?n.push(w("validate.id.duplicate",`Duplicate ${l} id "${c}" already used by ${u}.`)):a.set(c,l)}for(let l of e.relations)go(l,r,n);for(let l of e.system?.viewpoints??[])bo(l,i,o,t,n,r);for(let l of e.objects)yo(l,e.system,r,i,n);for(let l of e.events)wo(l,e.system,r,n);return n}function go(e,t,n){e.from?t.has(e.from)||n.push(w("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(w("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(w("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(w("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(w("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function bo(e,t,n,r,i,o){let a=e.filter;if(r==="2.1"||r==="2.5"){if(a)for(let l of a.groupIds)t.has(l)||i.push(j("validate.viewpoint.group.unknown",`Unknown group "${l}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.groups`));for(let l of e.events??[])n.has(l)||i.push(j("validate.viewpoint.event.unknown",`Unknown event "${l}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}xo(e.projection,i,`viewpoint.${e.id}.projection`,e.id),jo(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,a,o)}function yo(e,t,n,r,i){let o=e.placement,a=o?.mode==="orbit"?o:null,l=o?.mode==="orbit"?n.get(o.target)??null:null;if(e.groups)for(let s of e.groups)r.has(s)||i.push(j("validate.group.unknown",`Unknown group "${s}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(j("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(j("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),a&&(n.has(a.target)||i.push(w("validate.orbit.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"orbit")),a.distance&&a.semiMajor&&i.push(w("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),a.phase&&!e.epoch&&!t?.epoch&&i.push(j("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),a.inclination&&!e.referencePlane&&!t?.referencePlane&&i.push(j("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),a.period&&!It(l?.properties.mass)&&i.push(j("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),o?.mode==="surface"){let s=n.get(o.target);s?In.has(s.type)||i.push(w("validate.surface.target.invalid",`Surface target "${o.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):i.push(w("validate.surface.target.unknown",`Unknown placement target "${o.target}" on "${e.id}".`,e.id,"surface"))}if(o?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&i.push(w("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),Io(e,n,i)||i.push(w("validate.at.target.unknown",`Unknown at-reference target "${o.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let s=n.get(e.resonance.targetObjectId);s?(e.placement?.mode!=="orbit"||s.placement?.mode!=="orbit"||e.placement.target!==s.placement.target)&&i.push(j("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):i.push(w("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let s of e.deriveRules??[]){if(s.field!=="period"||s.strategy!=="kepler"){i.push(j("validate.derive.unsupported",`Unsupported derive rule "${s.field} ${s.strategy}" on "${e.id}".`,e.id,"derive"));continue}let c=vn(e,l);if(c===null){i.push(j("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}a?.period||i.push(vt("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Oo(c)}.`,e.id,"derive"))}for(let s of e.validationRules??[]){if(s.rule!=="kepler"){i.push(j("validate.rule.unsupported",`Unsupported validation rule "${s.rule}" on "${e.id}".`,e.id,"validate"));continue}let c=$n(a?.period),u=vn(e,l);if(c===null||u===null)continue;let f=Mo(e,"period");Math.abs(c-u)>f&&i.push(w("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function wo(e,t,n,r){let i=`event.${e.id}`,o=new Set;e.kind.trim()||r.push(w("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${i}.kind`)),typeof e.epoch=="string"&&!e.epoch.trim()&&r.push(j("validate.event.epoch.empty",`Event "${e.id}" defines an empty epoch string.`,void 0,`${i}.epoch`)),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&r.push(j("validate.event.referencePlane.empty",`Event "${e.id}" defines an empty reference plane string.`,void 0,`${i}.referencePlane`)),!e.targetObjectId&&e.participantObjectIds.length===0&&r.push(w("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${i}.participants`)),e.targetObjectId&&(o.add(e.targetObjectId),n.has(e.targetObjectId)||r.push(w("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${i}.target`)));let a=new Set;for(let c of e.participantObjectIds){if(o.add(c),a.has(c)){r.push(j("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${c}".`,void 0,`${i}.participants`));continue}a.add(c),n.has(c)||r.push(w("validate.event.participants.unknown",`Unknown event participant "${c}" on "${e.id}".`,void 0,`${i}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&r.push(j("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${i}.target`)),e.positions.length===0&&r.push(j("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${i}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&o.size<3&&r.push(j("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${i}.participants`));let l=new Set;for(let c of e.positions){let u=`${i}.pose.${c.objectId}`;if(l.has(c.objectId)){r.push(w("validate.event.pose.duplicate",`Event "${e.id}" defines "${c.objectId}" more than once in positions.`,void 0,u));continue}l.add(c.objectId);let f=n.get(c.objectId);if(!f){r.push(w("validate.event.pose.object.unknown",`Unknown event pose object "${c.objectId}" on "${e.id}".`,void 0,u));continue}o.has(c.objectId)||r.push(j("validate.event.pose.unreferenced",`Event pose "${c.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,u)),vo(c,f,e,t,n,r,u,e.id)}let s=[...o].filter(c=>!l.has(c));e.positions.length>0&&s.length>0&&r.push(j("validate.event.positions.partial",`Event "${e.id}" leaves ${s.length} referenced object(s) on their base placement.`,void 0,`${i}.positions`))}function vo(e,t,n,r,i,o,a,l){let s=e.placement;if(!s){o.push(w("validate.event.pose.placement.required",`Event "${l}" pose "${e.objectId}" is missing a placement mode.`,void 0,a));return}if(s.mode==="orbit"){i.has(s.target)||o.push(w("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.orbit`)),s.distance&&s.semiMajor&&o.push(w("validate.event.pose.orbit.distanceConflict",`Event "${l}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${a}.distance`)),s.phase&&!So(r,t,n,e)&&o.push(j("validate.event.pose.phase.epochMissing",`Event "${l}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${a}.phase`)),s.inclination&&!ko(r,t,n,e)&&o.push(j("validate.event.pose.inclination.referencePlaneMissing",`Event "${l}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${a}.inclination`)),s.period&&!It(i.get(s.target)?.properties.mass)&&o.push(j("validate.event.pose.period.massMissing",`Event "${l}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${a}.period`));return}if(s.mode==="surface"){let c=i.get(s.target);c?In.has(c.type)||o.push(w("validate.event.pose.surface.target.invalid",`Event surface target "${s.target}" on "${l}:${e.objectId}" is not surface-capable.`,void 0,`${a}.surface`)):o.push(w("validate.event.pose.surface.target.unknown",`Unknown event surface target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.surface`));return}if(s.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&o.push(w("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${l}:${e.objectId}".`,void 0,`${a}.at`));let c=s.reference;c.kind==="named"&&!i.has(c.name)?o.push(w("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):c.kind==="anchor"&&!i.has(c.objectId)?o.push(w("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${c.objectId}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):c.kind==="lagrange"&&(i.has(c.primary)?c.secondary&&!i.has(c.secondary)&&o.push(w("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${c.secondary}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):o.push(w("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${c.primary}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)))}}function Io(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(w("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(w("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(w("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function vn(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=$o(n.semiMajor??n.distance),i=It(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function $o(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Xe;case"m":return e.value/(Xe*1e3);case"ly":return e.value*po;case"pc":return e.value*mo;case"kpc":return e.value*ho;case"re":return e.value*uo/Xe;case"sol":return e.value*fo/Xe;default:return null}}function It(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/lo;case"mj":return t.value/co;default:return null}}function $n(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 xo(e,t,n,r){e!=="topdown"&&e!=="isometric"&&e!=="orthographic"&&e!=="perspective"&&t.push(w("validate.viewpoint.projection.invalid",`Unknown projection "${String(e)}" in viewpoint "${r}".`,void 0,n))}function jo(e,t,n,r,i,o,a,l,s){if(!e)return;let c=`viewpoint.${i}.camera`;for(let[f,m]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])m!==null&&(!Number.isFinite(m)||f==="distance"&&m<=0)&&r.push(w("validate.viewpoint.camera.invalid",`Invalid camera ${f} "${String(m)}" in viewpoint "${i}".`,void 0,`${c}.${f}`));e.distance!==null&&t!=="perspective"&&r.push(j("validate.viewpoint.camera.distance.partialEffect",`Camera "distance" only has a semantic effect in perspective viewpoints; "${i}" uses "${t}".`,void 0,`${c}.distance`)),t==="topdown"&&(e.elevation!==null||e.roll!==null)&&r.push(j("validate.viewpoint.camera.topdownPartial",`Camera elevation/roll on topdown viewpoint "${i}" are currently stored for future 3D use and only partially affect 2D rendering.`,void 0,c)),t==="isometric"&&e.elevation!==null&&r.push(vt("validate.viewpoint.camera.isometricStored",`Camera elevation on isometric viewpoint "${i}" is preserved semantically for future 3D rendering.`,void 0,`${c}.elevation`)),e.azimuth!==null&&e.azimuth!==0&&n!==0&&r.push(j("validate.viewpoint.rotation.cameraOverlap",`Viewpoint "${i}" uses camera.azimuth; keep "rotation" only for 2D screen rotation to avoid ambiguity.`,void 0,`${c}.azimuth`)),o!==null&&s.has(o)||a!==null&&s.has(a)||l||r.push(vt("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,c))}function So(e,t,n,r){return K(r?.epoch)??K(n?.epoch)??K(t.epoch)??K(e?.epoch)??null}function ko(e,t,n,r){return K(r?.referencePlane)??K(n?.referencePlane)??K(t.referencePlane)??K(e?.referencePlane)??null}function K(e){return typeof e=="string"&&e.trim()?e.trim():null}function Mo(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?$n(n)??0:0}function Oo(e){return`${Math.round(e*100)/100}d`}function w(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function j(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function vt(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Ao=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=P(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 To=new Set(Ze.keys()),jn=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane"]);function $t(e){return Lo(e)}function Lo(e,t){let n=ba(e),r=n.source.split(/\r?\n/),i=[],o=!1,a="2.0",l=null,s=null,c=[],u=[],f=[],m=[],h=new Map,y=!1,g=!1,x=new Set,S=new Set,p=new Set,$=new Set,D=new Set;for(let A=0;A<r.length;A++){let N=r[A],U=A+1;if(!N.trim())continue;let W=Pe(N),L=fe(N.slice(W),{line:U,columnOffset:W});if(L.length!==0){if(!o){a=Po(L,U),o=!0,n.comments.length>0&&Je(a,"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 ${a}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(W===0){s=Do(L,U,a,i,l,c,u,f,m,h,x,S,p,$,D,{sawDefaults:y,sawAtlas:g}),s.kind==="system"?l=s.system:s.kind==="defaults"?y=!0:s.kind==="atlas"&&(g=!0);continue}if(!s)throw new d("Indented line without parent atlas section",U,W+1);_o(s,W,L,U)}}if(!o)throw new d('Missing required atlas schema header "schema 2.0"');let _=c.map(A=>aa(A,a,i)),E=m.map(A=>sa(A,h.get(A.id)??[])),G=t??(a==="2.0-draft"?"2.0":a),H={format:"worldorbit",sourceVersion:"1.0",system:l,groups:u,relations:f,events:E,objects:_,diagnostics:i};if(G==="2.0-draft"){let A={...H,version:"2.0-draft",schemaVersion:"2.0-draft"};return A.diagnostics.push(...qe(A,a)),A}let Q={...H,version:G,schemaVersion:G};return a==="2.0-draft"&&Q.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".'}),Q.diagnostics.push(...qe(Q,a)),Q}function Po(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1","2.5"].includes(e[1].value.toLowerCase()))throw new d('Expected atlas header "schema 2.0", "schema 2.1", "schema 2.5", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.5"?"2.5":n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function Do(e,t,n,r,i,o,a,l,s,c,u,f,m,h,y,g){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(g.sawDefaults)throw new d('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:i,sourceSchemaVersion:n,diagnostics:r,seenFields:new Set};case"atlas":if(!i)throw new d('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(g.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 Fo(e,t,i,u,n,r);case"annotation":if(!i)throw new d('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return Co(e,t,i,f);case"group":return V(n,r,"group",{line:t,column:e[0].column}),Vo(e,t,a,m);case"relation":return V(n,r,"relation",{line:t,column:e[0].column}),Ro(e,t,l,h);case"event":return V(n,r,"event",{line:t,column:e[0].column}),zo(e,t,s,c,y,n,r);case"object":return Bo(e,t,n,r,o);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 Fo(e,t,n,r,i,o){if(e.length!==2)throw new d("Invalid viewpoint declaration",t,e[0]?.column??1);let a=ce(e[1].value);if(!a)throw new d("Viewpoint id must not be empty",t,e[1].column);if(r.has(a))throw new d(`Duplicate viewpoint id "${a}"`,t,e[1].column);let l={id:a,label:je(a),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,camera:null,layers:{},filter:null};return n.viewpoints.push(l),r.add(a),{kind:"viewpoint",viewpoint:l,sourceSchemaVersion:i,diagnostics:o,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set,inCamera:!1,cameraIndent:null,seenCameraFields:new Set}}function Co(e,t,n,r){if(e.length!==2)throw new d("Invalid annotation declaration",t,e[0]?.column??1);let i=ce(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 o={id:i,label:je(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(o),r.add(i),{kind:"annotation",annotation:o,seenFields:new Set}}function Vo(e,t,n,r){if(e.length!==2)throw new d("Invalid group declaration",t,e[0]?.column??1);let i=ce(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 o={id:i,label:je(i),summary:"",color:null,tags:[],hidden:!1};return n.push(o),r.add(i),{kind:"group",group:o,seenFields:new Set}}function Ro(e,t,n,r){if(e.length!==2)throw new d("Invalid relation declaration",t,e[0]?.column??1);let i=ce(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 o={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(o),r.add(i),{kind:"relation",relation:o,seenFields:new Set}}function zo(e,t,n,r,i,o,a){if(e.length!==2)throw new d("Invalid event declaration",t,e[0]?.column??1);let l=ce(e[1].value);if(!l)throw new d("Event id must not be empty",t,e[1].column);if(i.has(l))throw new d(`Duplicate event id "${l}"`,t,e[1].column);let s={id:l,kind:"",label:je(l),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},c=[];return n.push(s),r.set(l,c),i.add(l),{kind:"event",event:s,sourceSchemaVersion:o,diagnostics:a,seenFields:new Set,rawPoses:c,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function Bo(e,t,n,r,i){if(e.length<3)throw new d("Invalid atlas object declaration",t,e[0]?.column??1);let o=e[1],a=e[2],l=o.value;if(!Te.has(l)||l==="system")throw new d(`Unknown object type "${o.value}"`,t,o.column);let s={objectType:l,id:a.value,fields:ia(e.slice(3),t,l,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:o.column}};return i.push(s),{kind:"object",objectNode:s,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function _o(e,t,n,r){switch(e.kind){case"system":No(e,n,r);return;case"defaults":Uo(e,n,r);return;case"atlas":Wo(e,t,n,r);return;case"viewpoint":Yo(e,t,n,r);return;case"annotation":Xo(e,n,r);return;case"group":qo(e,n,r);return;case"relation":Ko(e,n,r);return;case"event":Zo(e,t,n,r);return;case"object":Qo(e,t,n,r);return}}function No(e,t,n){let r=Y(t,e.seenFields,n),i=I(t,n);switch(r){case"title":e.system.title=i;return;case"description":V(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":V(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":V(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 Uo(e,t,n){let r=Y(t,e.seenFields,n),i=I(t,n);switch(r){case"view":kn(i)&&ne(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=Sn(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=Mn(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 Wo(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=On(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 Yo(e,t,n,r){if(e.inCamera&&t<=(e.cameraIndent??0)&&(e.inCamera=!1,e.cameraIndent=null),e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inCamera){Go(e,n,r);return}if(e.inFilter){Ho(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(ne(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.seenFields.has("camera"))throw new d('Duplicate viewpoint field "camera"',r,n[0].column);e.seenFields.add("camera"),e.inCamera=!0,e.cameraIndent=t,e.viewpoint.camera=e.viewpoint.camera??jt();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=Y(n,e.seenFields,r),o=I(n,r);switch(i){case"label":e.viewpoint.label=o;return;case"summary":e.viewpoint.summary=o;return;case"focus":e.viewpoint.focusObjectId=o;return;case"select":e.viewpoint.selectedObjectId=o;return;case"projection":kn(o)&&ne(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=Sn(o,r,n[0].column);return;case"preset":e.viewpoint.preset=Mn(o,r,n[0].column);return;case"zoom":e.viewpoint.zoom=xt(o,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=J(o,r,n[0].column,"rotation");return;case"camera":ne(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=ra(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=ta(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":V(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=B(n.slice(1),r,"events");return;default:throw new d(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function Go(e,t,n){let r=Y(t,e.seenCameraFields,n),i=I(t,n),o=e.viewpoint.camera??jt();switch(r){case"azimuth":o.azimuth=J(i,n,t[0].column,"camera.azimuth");break;case"elevation":o.elevation=J(i,n,t[0].column,"camera.elevation");break;case"roll":o.roll=J(i,n,t[0].column,"camera.roll");break;case"distance":o.distance=xt(i,n,t[0].column,"camera.distance");break;default:throw new d(`Unknown viewpoint camera field "${t[0].value}"`,n,t[0].column)}e.viewpoint.camera=o}function Ho(e,t,n){let r=Y(t,e.seenFilterFields,n),i=e.viewpoint.filter??na();switch(r){case"query":i.query=I(t,n);break;case"objecttypes":i.objectTypes=ea(t.slice(1),n);break;case"tags":i.tags=B(t.slice(1),n,"tags");break;case"groups":i.groupIds=B(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 Xo(e,t,n){switch(Y(t,e.seenFields,n)){case"label":e.annotation.label=I(t,n);return;case"target":e.annotation.targetObjectId=I(t,n);return;case"body":e.annotation.body=I(t,n);return;case"tags":e.annotation.tags=B(t.slice(1),n,"tags");return;default:throw new d(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function qo(e,t,n){switch(Y(t,e.seenFields,n)){case"label":e.group.label=I(t,n);return;case"summary":e.group.summary=I(t,n);return;case"color":e.group.color=I(t,n);return;case"tags":e.group.tags=B(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=q(I(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 Ko(e,t,n){switch(Y(t,e.seenFields,n)){case"from":e.relation.from=I(t,n);return;case"to":e.relation.to=I(t,n);return;case"kind":e.relation.kind=I(t,n);return;case"label":e.relation.label=I(t,n);return;case"summary":e.relation.summary=I(t,n);return;case"tags":e.relation.tags=B(t.slice(1),n,"tags");return;case"color":e.relation.color=I(t,n);return;case"hidden":e.relation.hidden=q(I(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 Zo(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){(n[0]?.value==="epoch"||n[0]?.value==="referencePlane")&&ne(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push(Jo(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new d(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let o=n[1].value;if(!o.trim())throw new d("Event pose object id must not be empty",r,n[1].column);let a={objectId:o,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(a),e.activePose=a,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new d('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(Y(n,e.seenFields,r)){case"kind":e.event.kind=I(n,r);return;case"label":e.event.label=I(n,r);return;case"summary":e.event.summary=I(n,r);return;case"target":e.event.targetObjectId=I(n,r);return;case"participants":e.event.participantObjectIds=B(n.slice(1),r,"participants");return;case"timing":e.event.timing=I(n,r);return;case"visibility":e.event.visibility=I(n,r);return;case"epoch":ne(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=I(n,r);return;case"referenceplane":ne(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=I(n,r);return;case"tags":e.event.tags=B(n.slice(1),r,"tags");return;case"color":e.event.color=I(n,r);return;case"hidden":e.event.hidden=q(I(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new d(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function Jo(e,t,n){if(e.length<2)throw new d("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!jn.has(r))throw new d(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new d(`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"||Ao.has(i)){i!=="info"&&V(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=On(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 o=e.activeBlock,a=e.seenTypedBlockKeys[o]??(e.seenTypedBlockKeys[o]=new Set);if(a.has(i.key))throw new d(`Duplicate ${o} key "${i.key}"`,r,n[0].column);a.add(i.key),(e.objectNode.typedBlockEntries[o]??(e.objectNode.typedBlockEntries[o]=[])).push(i);return}e.objectNode.fields.push(oa(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function Y(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 I(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 ea(e,t){return B(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function ta(e,t,n,r){let i={};for(let o of B(e,t,"layers")){let a=!o.startsWith("-")&&!o.startsWith("!"),l=o.replace(/^[-!]+/,"").toLowerCase();if(l==="orbits"){i["orbits-back"]=a,i["orbits-front"]=a;continue}(l==="background"||l==="guides"||l==="orbits-back"||l==="orbits-front"||l==="relations"||l==="events"||l==="objects"||l==="labels"||l==="metadata")&&(l==="events"&&n&&r&&V(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[l]=a)}return i}function B(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 Sn(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric"&&r!=="orthographic"&&r!=="perspective")throw new d(`Unknown projection "${e}"`,t,n);return r}function kn(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function Mn(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 xt(e,t,n,r){let i=J(e,t,n,r);if(i<=0)throw new d(`Field "${r}" must be greater than zero`,t,n);return i}function J(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 na(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function jt(){return{azimuth:null,elevation:null,roll:null,distance:null}}function ra(e,t,n){if(e.length===0||e.length%2!==0)throw new d('Field "camera" expects "<field> <value>" pairs',t,e[0]?.column??1);let r=n?{...n}:jt(),i=new Set;for(let o=0;o<e.length;o+=2){let a=e[o],l=e[o+1],s=a.value.toLowerCase();if(i.has(s))throw new d(`Duplicate viewpoint camera field "${a.value}"`,t,a.column);i.add(s);let c=l.value;switch(s){case"azimuth":r.azimuth=J(c,t,a.column,"camera.azimuth");break;case"elevation":r.elevation=J(c,t,a.column,"camera.elevation");break;case"roll":r.roll=J(c,t,a.column,"camera.roll");break;case"distance":r.distance=xt(c,t,a.column,"camera.distance");break;default:throw new d(`Unknown viewpoint camera field "${a.value}"`,t,a.column)}}return r}function ia(e,t,n,r,i){let o=[],a=0;for(;a<e.length;){let l=e[a],s=Se(l.value);if(!s)throw new d(`Unknown field "${l.value}"`,t,l.column);s.version==="2.1"&&V(r,i,l.value,{line:t,column:l.column}),a++;let c=[];if(s.inlineMode==="single"){let u=e[a];u&&(c.push(u),a++)}else if(s.inlineMode==="pair")for(let u=0;u<2;u++){let f=e[a];if(!f)break;c.push(f),a++}else for(;a<e.length&&!To.has(e[a].value);)c.push(e[a]),a++;if(c.length===0)throw new d(`Missing value for field "${l.value}"`,t,l.column);o.push({type:"field",key:l.value,values:c.map(u=>u.value),location:{line:t,column:l.column}})}return Pn(o,n),o}function oa(e,t,n,r,i){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);let o=Se(e[0].value);if(!o)throw new d(`Unknown field "${e[0].value}"`,t,e[0].column);o.version==="2.1"&&V(r,i,e[0].value,{line:t,column:e[0].column});let a={type:"field",key:e[0].value,values:e.slice(1).map(l=>l.value),location:{line:t,column:e[0].column}};return Pn([a],n),a}function On(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 aa(e,t,n){let r=An(e.fields),i=Tn(r),o=ca(e.objectType,r),a=ha(r.get("groups")?.[0]),l=Ke(r.get("epoch")?.[0]),s=Ke(r.get("referencePlane")?.[0]),c=r.has("tidalLock")?q(R(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?fa(r.get("resonance")[0]):void 0,f=da(r),m=r.get("derive")?.map($=>pa($)),h=r.get("validate")?.map($=>({rule:R($)})),y=r.has("locked")?[...new Set(r.get("locked").flatMap($=>$.values))]:void 0,g=r.get("tolerance")?.map($=>ma($)),x=ua(e.typedBlockEntries),S=Ln(e.infoEntries,"info"),p={type:e.objectType,id:e.id,properties:o,placement:i,info:S};return a.length>0&&(p.groups=a),l&&(p.epoch=l),s&&(p.referencePlane=s),c!==void 0&&(p.tidalLock=c),u&&(p.resonance=u),f&&(p.renderHints=f),m?.length&&(p.deriveRules=m),h?.length&&(p.validationRules=h),y?.length&&(p.lockedFields=y),g?.length&&(p.tolerances=g),x&&Object.keys(x).length>0&&(p.typedBlocks=x),Je(t,"2.1")&&(p.groups||p.epoch||p.referencePlane||p.tidalLock!==void 0||p.resonance||p.renderHints||p.deriveRules?.length||p.validationRules?.length||p.lockedFields?.length||p.tolerances?.length||p.typedBlocks)&&V(t,n,e.id,e.location),p}function sa(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>la(n))}}function la(e){let t=An(e.fields,"event-pose"),n=Tn(t);return{objectId:e.objectId,placement:n,inner:Z(t.get("inner")?.[0],"inner"),outer:Z(t.get("outer")?.[0],"outer"),epoch:Ke(t.get("epoch")?.[0]),referencePlane:Ke(t.get("referencePlane")?.[0])}}function An(e,t="object"){let n=new Map;for(let r of e){let i=Se(r.key);if(!i&&!jn.has(r.key))throw d.fromLocation(`Unknown field "${r.key}"`,r.location);if(!i?.allowRepeat&&n.has(r.key))throw d.fromLocation(`Duplicate field "${r.key}"`,r.location);let o=n.get(r.key)??[];o.push(r),n.set(r.key,o)}return n}function Tn(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 a=t??n??r??i;throw d.fromLocation("Object has multiple placement modes",a?.location)}if(t)return{mode:"orbit",target:R(t),distance:Z(e.get("distance")?.[0],"distance"),semiMajor:Z(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:ga(e.get("eccentricity")?.[0],"eccentricity"),period:Z(e.get("period")?.[0],"period"),angle:Z(e.get("angle")?.[0],"angle"),inclination:Z(e.get("inclination")?.[0],"inclination"),phase:Z(e.get("phase")?.[0],"phase")};if(n){let a=R(n);return{mode:"at",target:a,reference:yn(a,n.location)}}if(r)return{mode:"surface",target:R(r)};if(i){let a=R(i),l=yt(a);return{mode:"free",distance:l??void 0,descriptor:l?void 0:a}}return null}function ca(e,t){let n={};for(let[r,i]of t.entries()){let o=i[0],a=Se(r);!o||!a?.legacySchema||a.legacySchema.placement||(wt(r,e,o.location),n[r]=wn(r,o.values,o.location))}return n}function Ln(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 ua(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=Ln(r,n))}return t}function da(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=q(R(n),"renderLabel",n.location)),r&&(t.renderOrbit=q(R(r),"renderOrbit",r.location)),i&&(t.renderPriority=He(R(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function fa(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 pa(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 ma(e){if(e.values.length!==2)throw d.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=yt(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function ha(e){return e?[...new Set(e.values)]:[]}function Ke(e){return e&&e.values.join(" ").trim()||null}function Z(e,t){return e?bt(R(e),e.location,t):void 0}function ga(e,t){return e?He(R(e),t,e.location):void 0}function R(e){return xe(e.values,e.key,e.location)}function Se(e){return Ze.get(e)}function Pn(e,t){for(let n of e){let r=Se(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){wt(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 V(e,t,n,r){Je(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 ne(e,t,n,r){Je(e,"2.5")&&t.push({code:"parse.schema25.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.5; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function Je(e,t){return xn(e)<xn(t)}function xn(e){switch(e){case"2.0-draft":return 0;case"2.0":return 1;case"2.1":return 2;case"2.5":return 3}}function ba(e){let t=[...e],n=[],r=!1,i=!1,o=null,a=1,l=1;for(let s=0;s<t.length;s++){let c=t[s],u=t[s+1];if(i){if(c==="*"&&u==="/"){t[s]=" ",t[s+1]=" ",i=!1,o=null,s++,l+=2;continue}c!==`
2
2
  `&&c!=="\r"&&(t[s]=" "),c===`
3
3
  `?(a++,l=1):l++;continue}if(!r&&c==="/"&&u==="*"){n.push({kind:"block",line:a,column:l}),t[s]=" ",t[s+1]=" ",i=!0,o={line:a,column:l},s++,l+=2;continue}if(!r&&c==="#"&&!ya(t,s)){n.push({kind:"line",line:a,column:l}),t[s]=" ";let f=s+1;for(;f<t.length&&t[f]!==`
4
4
  `&&t[f]!=="\r";)t[f]=" ",f++;l+=f-s,s=f-1;continue}c==='"'&&t[s-1]!=="\\"&&(r=!r),c===`
5
5
  `?(a++,l=1):l++}if(i)throw d.fromLocation("Unclosed block comment",o??void 0);return{source:t.join(""),comments:n}}function ya(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===`
6
6
  `}var wa=/^schema\s+2(?:\.0|\.1|\.5)?$/i,va=/^schema\s+2\.1$/i,Ia=/^schema\s+2\.5$/i,$a=/^schema\s+2\.0-draft$/i;function Dn(e){for(let t of xa(e).split(/\r?\n/)){let n=t.trim();if(n)return $a.test(n)?"2.0-draft":va.test(n)?"2.1":Ia.test(n)?"2.5":wa.test(n)?"2.0":"1.0"}return"1.0"}function xa(e){let t=[...e],n=!1,r=!1;for(let i=0;i<t.length;i++){let o=t[i],a=t[i+1];if(r){if(o==="*"&&a==="/"){t[i]=" ",t[i+1]=" ",r=!1,i++;continue}o!==`
7
7
  `&&o!=="\r"&&(t[i]=" ");continue}if(!n&&o==="/"&&a==="*"){t[i]=" ",t[i+1]=" ",r=!0,i++;continue}if(!n&&o==="#"){t[i]=" ";let l=i+1;for(;l<t.length&&t[l]!==`
8
- `&&t[l]!=="\r";)t[l]=" ",l++;i=l-1;continue}o==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function re(e){let t=En(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 En(e){let t=Dn(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1"||t==="2.5")return ja(e,t);let n;try{n=pe(e)}catch(i){return{ok:!1,value:null,diagnostics:[te(i,"parse")]}}let r;try{r=me(n)}catch(i){return{ok:!1,value:null,diagnostics:[te(i,"normalize")]}}try{he(r)}catch(i){return{ok:!1,value:null,diagnostics:[te(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function ja(e,t){let n;try{n=$t(e)}catch(a){return{ok:!1,value:null,diagnostics:[te(a,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(a=>a.severity==="error"))return{ok:!1,value:null,diagnostics:r};let i;try{i=gt(n)}catch(a){return{ok:!1,value:null,diagnostics:[te(a,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var Oa={background:!0,guides:!0,relations:!0,events:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0},Qe={atlas:{name:"atlas",backgroundStart:"#041018",backgroundEnd:"#0a2331",backgroundGlow:"rgba(240, 180, 100, 0.18)",panel:"rgba(7, 17, 27, 0.9)",panelLine:"rgba(168, 207, 242, 0.18)",relation:"rgba(240, 180, 100, 0.42)",orbit:"rgba(163, 209, 255, 0.24)",orbitBand:"rgba(255, 190, 120, 0.28)",guide:"rgba(255, 255, 255, 0.04)",leader:"rgba(225, 238, 255, 0.4)",ink:"#e8f0ff",muted:"rgba(232, 240, 255, 0.7)",accent:"#f0b464",accentStrong:"#ff7f5f",selected:"rgba(255, 214, 139, 0.92)",starCore:"#ffcc67",starStroke:"rgba(255, 245, 203, 0.85)",starGlow:"#ffe8a3",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},nightglass:{name:"nightglass",backgroundStart:"#07131f",backgroundEnd:"#13283a",backgroundGlow:"rgba(120, 255, 215, 0.16)",panel:"rgba(7, 20, 30, 0.9)",panelLine:"rgba(120, 255, 215, 0.16)",relation:"rgba(156, 231, 255, 0.42)",orbit:"rgba(120, 255, 215, 0.2)",orbitBand:"rgba(137, 185, 255, 0.24)",guide:"rgba(255, 255, 255, 0.035)",leader:"rgba(192, 255, 233, 0.42)",ink:"#edfff8",muted:"rgba(237, 255, 248, 0.68)",accent:"#78ffd7",accentStrong:"#9ce7ff",selected:"rgba(120, 255, 215, 0.9)",starCore:"#e5f98c",starStroke:"rgba(246, 255, 217, 0.9)",starGlow:"#fffab4",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},ember:{name:"ember",backgroundStart:"#17090b",backgroundEnd:"#31111a",backgroundGlow:"rgba(255, 127, 95, 0.18)",panel:"rgba(24, 9, 13, 0.9)",panelLine:"rgba(255, 166, 149, 0.16)",relation:"rgba(255, 178, 125, 0.42)",orbit:"rgba(255, 188, 164, 0.22)",orbitBand:"rgba(255, 214, 139, 0.24)",guide:"rgba(255, 255, 255, 0.03)",leader:"rgba(255, 223, 209, 0.42)",ink:"#fff3ee",muted:"rgba(255, 243, 238, 0.68)",accent:"#ffb27d",accentStrong:"#ff7f5f",selected:"rgba(255, 178, 125, 0.9)",starCore:"#ffb766",starStroke:"rgba(255, 236, 205, 0.88)",starGlow:"#ffe2ad",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'}};function et(e){return e?typeof e=="string"?Qe[e]??Qe.atlas:{...Qe.atlas,...e}:Qe.atlas}function St(e){return{...Oa,...e}}function tt(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:kt(e.objectTypes??[]),tags:kt((e.tags??[]).map(n=>n.trim()).filter(Boolean)),groupIds:kt((e.groupIds??[]).map(n=>n.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return Aa(t)?t:null}function Aa(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function Mt(e,t){let n=tt(t),r=new Set;for(let i of e.objects)if(!i.hidden&&Ta(i,n)&&(r.add(i.objectId),n?.includeAncestors!==!1))for(let o of i.ancestorIds)r.add(o);return n?r:new Set(e.objects.filter(i=>!i.hidden).map(i=>i.objectId))}function Ta(e,t){if(!t)return!0;if(t.objectTypes?.length&&!t.objectTypes.includes(e.object.type))return!1;if(t.groupIds?.length&&(!e.groupId||!t.groupIds.includes(e.groupId))){let n=e.semanticGroupIds.length>0&&t.groupIds.some(i=>e.semanticGroupIds.includes(i)),r=!!(e.groupId&&t.groupIds.includes(e.groupId));if(!n&&!r)return!1}if(t.tags?.length){let n=Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(r=>typeof r=="string"):[];if(!t.tags.every(r=>n.includes(r)))return!1}if(t.query?.trim()){let n=La(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(i=>n.includes(i)))return!1}return!0}function La(e,t){let n=Object.values(e.info),r=Object.values(e.properties).flatMap(i=>Array.isArray(i)?i:typeof i=="object"&&i&&"value"in i?[String(i.value),String(i.unit??"")]:[String(i)]).filter(Boolean);return[e.id,t,e.type,...r,...n].join(" ")}function kt(e){return[...new Set(e)]}var Ot="worldorbit-camera-root";function ie(e,t={}){let n=et(t.theme),r=Xa(t.preset??e.renderPreset??void 0),i=St({...r.layers,...t.layers}),o=t.subtitle??e.subtitle,a=Mt(e,t.filter??null),l=e.objects.filter(p=>!p.hidden).filter(p=>a.has(p.objectId)).filter(p=>i.structures||!nt(p.object)).sort((p,$)=>p.sortKey-$.sortKey),s=e.labels.filter(p=>!p.hidden).filter(p=>a.has(p.objectId)).filter(p=>i.structures||!nt(p.object)),c=Ea(l),u=i.orbits?Da(e,a,i.structures):{back:"",front:""},f=i.guides?e.leaders.filter(p=>!p.hidden).filter(p=>a.has(p.objectId)).filter(p=>i.structures||!nt(p.object)).map(p=>`<line class="wo-leader wo-leader-${p.mode}" x1="${p.x1}" y1="${p.y1}" x2="${p.x2}" y2="${p.y2}" data-render-id="${O(p.renderId)}" data-group-id="${T(p.groupId??"")}" />`).join(""):"",m=i.relations?e.relations.filter(p=>!p.hidden).filter(p=>a.has(p.fromObjectId)&&a.has(p.toObjectId)).map(p=>`<line class="wo-relation" x1="${p.x1}" y1="${p.y1}" x2="${p.x2}" y2="${p.y2}" data-render-id="${O(p.renderId)}" data-relation-id="${T(p.relationId)}" />`).join(""):"",h=i.events?e.events.filter(p=>!p.hidden).map(p=>Pa(e,p,a,n)).join(""):"",y=i.objects?l.map(p=>Fa(p,t.selectedObjectId??null,n)).join(""):"",g=i.labels?s.map(p=>Va(e,p,t.selectedObjectId??null)).join(""):"",x=i.metadata?`<text class="wo-title" x="56" y="64">${O(e.title)}</text>
8
+ `&&t[l]!=="\r";)t[l]=" ",l++;i=l-1;continue}o==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function re(e){let t=En(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 En(e){let t=Dn(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1"||t==="2.5")return ja(e,t);let n;try{n=pe(e)}catch(i){return{ok:!1,value:null,diagnostics:[te(i,"parse")]}}let r;try{r=me(n)}catch(i){return{ok:!1,value:null,diagnostics:[te(i,"normalize")]}}try{he(r)}catch(i){return{ok:!1,value:null,diagnostics:[te(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function ja(e,t){let n;try{n=$t(e)}catch(a){return{ok:!1,value:null,diagnostics:[te(a,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(a=>a.severity==="error"))return{ok:!1,value:null,diagnostics:r};let i;try{i=gt(n)}catch(a){return{ok:!1,value:null,diagnostics:[te(a,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var Oa={background:!0,guides:!0,relations:!0,events:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0},Qe={atlas:{name:"atlas",backgroundStart:"#041018",backgroundEnd:"#0a2331",backgroundGlow:"rgba(240, 180, 100, 0.18)",panel:"rgba(7, 17, 27, 0.9)",panelLine:"rgba(168, 207, 242, 0.18)",relation:"rgba(240, 180, 100, 0.42)",orbit:"rgba(163, 209, 255, 0.24)",orbitBand:"rgba(255, 190, 120, 0.28)",guide:"rgba(255, 255, 255, 0.04)",leader:"rgba(225, 238, 255, 0.4)",ink:"#e8f0ff",muted:"rgba(232, 240, 255, 0.7)",accent:"#f0b464",accentStrong:"#ff7f5f",selected:"rgba(255, 214, 139, 0.92)",starCore:"#ffcc67",starStroke:"rgba(255, 245, 203, 0.85)",starGlow:"#ffe8a3",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},nightglass:{name:"nightglass",backgroundStart:"#07131f",backgroundEnd:"#13283a",backgroundGlow:"rgba(120, 255, 215, 0.16)",panel:"rgba(7, 20, 30, 0.9)",panelLine:"rgba(120, 255, 215, 0.16)",relation:"rgba(156, 231, 255, 0.42)",orbit:"rgba(120, 255, 215, 0.2)",orbitBand:"rgba(137, 185, 255, 0.24)",guide:"rgba(255, 255, 255, 0.035)",leader:"rgba(192, 255, 233, 0.42)",ink:"#edfff8",muted:"rgba(237, 255, 248, 0.68)",accent:"#78ffd7",accentStrong:"#9ce7ff",selected:"rgba(120, 255, 215, 0.9)",starCore:"#e5f98c",starStroke:"rgba(246, 255, 217, 0.9)",starGlow:"#fffab4",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},ember:{name:"ember",backgroundStart:"#17090b",backgroundEnd:"#31111a",backgroundGlow:"rgba(255, 127, 95, 0.18)",panel:"rgba(24, 9, 13, 0.9)",panelLine:"rgba(255, 166, 149, 0.16)",relation:"rgba(255, 178, 125, 0.42)",orbit:"rgba(255, 188, 164, 0.22)",orbitBand:"rgba(255, 214, 139, 0.24)",guide:"rgba(255, 255, 255, 0.03)",leader:"rgba(255, 223, 209, 0.42)",ink:"#fff3ee",muted:"rgba(255, 243, 238, 0.68)",accent:"#ffb27d",accentStrong:"#ff7f5f",selected:"rgba(255, 178, 125, 0.9)",starCore:"#ffb766",starStroke:"rgba(255, 236, 205, 0.88)",starGlow:"#ffe2ad",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'}};function et(e){return e?typeof e=="string"?Qe[e]??Qe.atlas:{...Qe.atlas,...e}:Qe.atlas}function St(e){return{...Oa,...e}}function tt(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:kt(e.objectTypes??[]),tags:kt((e.tags??[]).map(n=>n.trim()).filter(Boolean)),groupIds:kt((e.groupIds??[]).map(n=>n.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return Aa(t)?t:null}function Aa(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function Mt(e,t){let n=tt(t),r=new Set;for(let i of e.objects)if(!i.hidden&&Ta(i,n)&&(r.add(i.objectId),n?.includeAncestors!==!1))for(let o of i.ancestorIds)r.add(o);return n?r:new Set(e.objects.filter(i=>!i.hidden).map(i=>i.objectId))}function Ta(e,t){if(!t)return!0;if(t.objectTypes?.length&&!t.objectTypes.includes(e.object.type))return!1;if(t.groupIds?.length&&(!e.groupId||!t.groupIds.includes(e.groupId))){let n=e.semanticGroupIds.length>0&&t.groupIds.some(i=>e.semanticGroupIds.includes(i)),r=!!(e.groupId&&t.groupIds.includes(e.groupId));if(!n&&!r)return!1}if(t.tags?.length){let n=Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(r=>typeof r=="string"):[];if(!t.tags.every(r=>n.includes(r)))return!1}if(t.query?.trim()){let n=La(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(i=>n.includes(i)))return!1}return!0}function La(e,t){let n=Object.values(e.info),r=Object.values(e.properties).flatMap(i=>Array.isArray(i)?i:typeof i=="object"&&i&&"value"in i?[String(i.value),String(i.unit??"")]:[String(i)]).filter(Boolean);return[e.id,t,e.type,...r,...n].join(" ")}function kt(e){return[...new Set(e)]}var Ot="worldorbit-camera-root";function ie(e,t={}){let n=et(t.theme),r=Ha(t.preset??e.renderPreset??void 0),i=St({...r.layers,...t.layers}),o=t.subtitle??e.subtitle,a=Mt(e,t.filter??null),l=e.objects.filter(p=>!p.hidden).filter(p=>a.has(p.objectId)).filter(p=>i.structures||!nt(p.object)).sort((p,$)=>p.sortKey-$.sortKey),s=e.labels.filter(p=>!p.hidden).filter(p=>a.has(p.objectId)).filter(p=>i.structures||!nt(p.object)),c=Ea(l),u=i.orbits?Da(e,a,i.structures):{back:"",front:""},f=i.guides?e.leaders.filter(p=>!p.hidden).filter(p=>a.has(p.objectId)).filter(p=>i.structures||!nt(p.object)).map(p=>`<line class="wo-leader wo-leader-${p.mode}" x1="${p.x1}" y1="${p.y1}" x2="${p.x2}" y2="${p.y2}" data-render-id="${O(p.renderId)}" data-group-id="${T(p.groupId??"")}" />`).join(""):"",m=i.relations?e.relations.filter(p=>!p.hidden).filter(p=>a.has(p.fromObjectId)&&a.has(p.toObjectId)).map(p=>`<line class="wo-relation" x1="${p.x1}" y1="${p.y1}" x2="${p.x2}" y2="${p.y2}" data-render-id="${O(p.renderId)}" data-relation-id="${T(p.relationId)}" />`).join(""):"",h=i.events?e.events.filter(p=>!p.hidden).map(p=>Pa(e,p,a,n)).join(""):"",y=i.objects?l.map(p=>Fa(p,t.selectedObjectId??null,n)).join(""):"",g=i.labels?s.map(p=>Ca(e,p,t.selectedObjectId??null)).join(""):"",x=i.metadata?`<text class="wo-title" x="56" y="64">${O(e.title)}</text>
9
9
  <text class="wo-subtitle" x="56" y="88">${O(o)}</text>
10
- <text class="wo-meta" x="56" y="${e.height-42}">${O(Ha(e))}</text>`:"",S=i.background?`<rect class="wo-bg" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
10
+ <text class="wo-meta" x="56" y="${e.height-42}">${O(qa(e))}</text>`:"",S=i.background?`<rect class="wo-bg" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
11
11
  <rect class="wo-bg-glow" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
12
- ${i.guides?qa(e.width,e.height):""}`:"";return`<svg xmlns="http://www.w3.org/2000/svg" data-worldorbit-svg="true" width="${e.width}" height="${e.height}" viewBox="0 0 ${e.width} ${e.height}" preserveAspectRatio="xMidYMid meet" role="img" aria-labelledby="worldorbit-title worldorbit-desc">
12
+ ${i.guides?Xa(e.width,e.height):""}`:"";return`<svg xmlns="http://www.w3.org/2000/svg" data-worldorbit-svg="true" width="${e.width}" height="${e.height}" viewBox="0 0 ${e.width} ${e.height}" preserveAspectRatio="xMidYMid meet" role="img" aria-labelledby="worldorbit-title worldorbit-desc">
13
13
  <title id="worldorbit-title">${O(e.title)}</title>
14
14
  <desc id="worldorbit-desc">A ${O(e.viewMode)} WorldOrbit render with ${l.length} visible objects.</desc>
15
15
  <defs>
@@ -84,20 +84,20 @@
84
84
  ${l}
85
85
  <circle class="wo-event-node" cx="${t.x}" cy="${t.y}" r="5" fill="${T(o)}" />
86
86
  <text class="wo-event-label" x="${t.x}" y="${t.y-10}" text-anchor="middle" font-size="10">${O(a)}</text>
87
- </g>`}function Da(e,t,n){let r=[],i=[];for(let o of e.orbitVisuals.filter(a=>!a.hidden&&t.has(a.objectId)&&(n||!nt(a.object)))){let a=o.bandThickness??(o.band?10:1.5),l=o.band?"wo-orbit wo-orbit-band wo-orbit-node":"wo-orbit wo-orbit-node",s=`data-render-id="${O(o.renderId)}" data-orbit-object-id="${T(o.objectId)}" data-parent-id="${T(o.parentId)}" data-group-id="${T(o.groupId??"")}"`;if(o.backArcPath||o.frontArcPath){o.backArcPath&&r.push(`<path class="${l} wo-orbit-back" d="${o.backArcPath}" stroke-width="${a}" ${s} />`),o.frontArcPath&&i.push(`<path class="${l} wo-orbit-front" d="${o.frontArcPath}" stroke-width="${a}" ${s} />`);continue}if(o.kind==="ellipse"){let c=o.rx??o.radius??0,u=o.ry??o.radius??0;i.push(`<ellipse class="${l} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" rx="${c}" ry="${u}" transform="rotate(${o.rotationDeg} ${o.cx} ${o.cy})" stroke-width="${a}" ${s} />`);continue}i.push(`<circle class="${l} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" r="${o.radius??0}" stroke-width="${a}" ${s} />`)}return{back:r.join(""),front:i.join("")}}function Ea(e){return e.filter(t=>!!t.imageHref).map(t=>za(t)).join("")}function Fa(e,t,n){let{object:r,x:i,y:o,radius:a,visualRadius:l}=e,s=t===e.objectId?" wo-object-selected":"",c=r.properties.kind?` wo-kind-${String(r.properties.kind).toLowerCase().replace(/[^a-z0-9-]/g,"-")}`:"",u=_a(e,n),f=Ra(e),m=f?Vn(r,i,o,a,u,{outlineOnly:!0}):"";return`<g class="wo-object wo-object-${r.type}${c}${s}" data-object-id="${O(e.objectId)}" data-parent-id="${T(e.parentId??"")}" data-group-id="${T(e.groupId??"")}" data-render-id="${O(e.renderId)}" tabindex="0" role="button" aria-label="${O(`${r.type} ${e.objectId}`)}">
87
+ </g>`}function Da(e,t,n){let r=[],i=[];for(let o of e.orbitVisuals.filter(a=>!a.hidden&&t.has(a.objectId)&&(n||!nt(a.object)))){let a=o.bandThickness??(o.band?10:1.5),l=o.band?"wo-orbit wo-orbit-band wo-orbit-node":"wo-orbit wo-orbit-node",s=`data-render-id="${O(o.renderId)}" data-orbit-object-id="${T(o.objectId)}" data-parent-id="${T(o.parentId)}" data-group-id="${T(o.groupId??"")}"`;if(o.backArcPath||o.frontArcPath){o.backArcPath&&r.push(`<path class="${l} wo-orbit-back" d="${o.backArcPath}" stroke-width="${a}" ${s} />`),o.frontArcPath&&i.push(`<path class="${l} wo-orbit-front" d="${o.frontArcPath}" stroke-width="${a}" ${s} />`);continue}if(o.kind==="ellipse"){let c=o.rx??o.radius??0,u=o.ry??o.radius??0;i.push(`<ellipse class="${l} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" rx="${c}" ry="${u}" transform="rotate(${o.rotationDeg} ${o.cx} ${o.cy})" stroke-width="${a}" ${s} />`);continue}i.push(`<circle class="${l} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" r="${o.radius??0}" stroke-width="${a}" ${s} />`)}return{back:r.join(""),front:i.join("")}}function Ea(e){return e.filter(t=>!!t.imageHref).map(t=>za(t)).join("")}function Fa(e,t,n){let{object:r,x:i,y:o,radius:a,visualRadius:l}=e,s=t===e.objectId?" wo-object-selected":"",c=r.properties.kind?` wo-kind-${String(r.properties.kind).toLowerCase().replace(/[^a-z0-9-]/g,"-")}`:"",u=_a(e,n),f=Ra(e),m=f?Cn(r,i,o,a,u,{outlineOnly:!0}):"";return`<g class="wo-object wo-object-${r.type}${c}${s}" data-object-id="${O(e.objectId)}" data-parent-id="${T(e.parentId??"")}" data-group-id="${T(e.groupId??"")}" data-render-id="${O(e.renderId)}" tabindex="0" role="button" aria-label="${O(`${r.type} ${e.objectId}`)}">
88
88
  <circle class="wo-selection-ring" cx="${i}" cy="${o}" r="${l+8}" />
89
- ${Ca(e,u)}
90
- ${Vn(r,i,o,a,u)}
89
+ ${Va(e,u)}
90
+ ${Cn(r,i,o,a,u)}
91
91
  ${f}
92
92
  ${m}
93
- </g>`}function Va(e,t,n){let r=n===t.objectId?" wo-object-label-selected":"",i=e.scaleModel.labelMultiplier;return`<g class="wo-object-label${r}" data-object-id="${O(t.objectId)}" data-group-id="${T(t.groupId??"")}" data-render-id="${O(t.renderId)}">
93
+ </g>`}function Ca(e,t,n){let r=n===t.objectId?" wo-object-label-selected":"",i=e.scaleModel.labelMultiplier;return`<g class="wo-object-label${r}" data-object-id="${O(t.objectId)}" data-group-id="${T(t.groupId??"")}" data-render-id="${O(t.renderId)}">
94
94
  <text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*i}">${O(t.label)}</text>
95
95
  <text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*i}">${O(t.secondaryLabel)}</text>
96
- </g>`}function Vn(e,t,n,r,i,o={}){let a=o.outlineOnly?"transparent":i.fill,l=i.tail??i.fill;switch(e.type){case"star":return o.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="2" />`:`<circle cx="${t}" cy="${n}" r="${r*2.4}" fill="${i.glow??"url(#wo-star-glow)"}" opacity="0.84" />
96
+ </g>`}function Cn(e,t,n,r,i,o={}){let a=o.outlineOnly?"transparent":i.fill,l=i.tail??i.fill;switch(e.type){case"star":return o.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="2" />`:`<circle cx="${t}" cy="${n}" r="${r*2.4}" fill="${i.glow??"url(#wo-star-glow)"}" opacity="0.84" />
97
97
  <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="2" />`;case"planet":case"moon":case"belt":case"asteroid":case"ring":return`<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="${o.outlineOnly?1.5:1.4}" />`;case"comet":return o.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:`<path d="M ${t-r*2} ${n+r*1.3} Q ${t-r*.7} ${n+r*.3} ${t-r*.45} ${n}" fill="none" stroke="${l}" stroke-width="${Math.max(2,r*.8)}" stroke-linecap="round" opacity="0.85" />
98
98
  <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${Bn(t,n,r)}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`;case"phenomenon":{let s=String(e.properties.kind??"").toLowerCase().replace(/_/g,"-");return o.outlineOnly?s==="black-hole"||s==="nebula"||s==="galaxy"||s==="dwarf-galaxy"?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:`<polygon points="${At(t,n,r)}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:s==="black-hole"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.4}" ry="${r*.55}" fill="none" stroke="${i.accentRing??i.stroke}" stroke-width="3.5" />
99
99
  <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="2" />`:s==="galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.6}" ry="${r}" fill="${i.halo??"none"}" stroke="none" />
100
100
  <ellipse cx="${t}" cy="${n}" rx="${r*1.5}" ry="${r*.42}" fill="${a}" stroke="${i.stroke}" stroke-width="1.2" />
101
101
  <circle cx="${t}" cy="${n}" r="${r*.28}" fill="${i.core??"#fff"}" stroke="none" />`:s==="dwarf-galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*1.6}" ry="${r*.55}" fill="${a}" stroke="${i.stroke}" stroke-width="1" />
102
102
  <circle cx="${t}" cy="${n}" r="${r*.25}" fill="${i.core??"#fff"}" stroke="none" />`:s==="nebula"?`<circle cx="${t}" cy="${n}" r="${r*2.2}" fill="${i.halo??"none"}" stroke="none" />
103
- <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="1" />`:`<polygon points="${At(t,n,r)}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`}}}function Ca(e,t){if(!t.atmosphere)return"";let{object:n,x:r,y:i,radius:o}=e;return n.type!=="planet"&&n.type!=="moon"&&n.type!=="asteroid"?"":`<circle cx="${r}" cy="${i}" r="${o+4}" fill="none" stroke="${t.atmosphere}" stroke-width="4" opacity="0.45" />`}function Ra(e){if(!e.imageHref)return"";let t=Ba(e);return`<image class="wo-object-image" x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" href="${T(e.imageHref)}" preserveAspectRatio="xMidYMid slice" clip-path="url(#${T(zn(e))})" />`}function za(e){let{x:t,y:n,radius:r}=e,i="";switch(e.object.type){case"star":case"planet":case"moon":case"asteroid":case"comet":i=`<circle cx="${t}" cy="${n}" r="${r}" />`;break;case"structure":i=`<polygon points="${Bn(t,n,r)}" />`;break;case"phenomenon":i=`<polygon points="${At(t,n,r)}" />`;break;default:return""}return`<clipPath id="${T(zn(e))}" clipPathUnits="userSpaceOnUse">${i}</clipPath>`}function Ba(e){let{object:t,x:n,y:r,radius:i}=e;switch(t.type){case"structure":return{x:n-i,y:r-i,width:i*2,height:i*2};case"phenomenon":return{x:n-i*1.2,y:r-i*1.2,width:i*2.4,height:i*2.4};default:return{x:n-i,y:r-i,width:i*2,height:i*2}}}function _a(e,t){let n=String(e.object.properties.kind??"").toLowerCase().replace(/_/g,"-"),r=Na(e.object.type,n,t),i=e.fillColor&&Za(e.fillColor)?e.fillColor:r.fill,o=Cn(e.object.properties.albedo),a=Cn(e.object.properties.temperature),l=Wa(i,a,o,e.object.type),s=ke(l,"#ffffff",.4)??r.stroke,c=Ga(e.object.properties.atmosphere),u=e.object.type==="star"?Rn(ke(l,"#fff2cb",.4)??l,.82):void 0;return{fill:l,stroke:s,glow:u,atmosphere:c,tail:e.object.type==="comet"?Rn(ke(l,"#ffffff",.5)??l,.72):void 0}}function Na(e,t,n){switch(e){case"star":return{fill:n.starCore,stroke:n.starStroke};case"planet":return{fill:"#72b7ff",stroke:"#d8efff"};case"moon":return{fill:"#c7d7ea",stroke:"#f2f8ff"};case"belt":return{fill:"#d9aa74",stroke:"#f7d5aa"};case"asteroid":return{fill:"#a7a5b8",stroke:"#ebe5ff"};case"comet":return{fill:"#9ce7ff",stroke:"#e7fbff"};case"ring":return{fill:"#e59f7d",stroke:"#fff0d3"};case"structure":return{fill:n.accentStrong,stroke:"#fff2ea"};case"phenomenon":return Ua(t)}}function Ua(e){return e==="galaxy"?{fill:"rgba(165,125,255,0.55)",stroke:"rgba(210,185,255,0.75)",halo:"rgba(160,120,255,0.10)",core:"#ede0ff"}:e==="dwarf-galaxy"?{fill:"rgba(190,165,255,0.45)",stroke:"rgba(220,205,255,0.75)",core:"#ddd0ff"}:e==="black-hole"?{fill:"#040408",stroke:"#ff6a00",accentRing:"rgba(255,140,20,0.72)"}:e==="nebula"?{fill:"rgba(105,205,255,0.45)",stroke:"rgba(180,235,255,0.72)",halo:"rgba(100,200,255,0.08)"}:e==="void"?{fill:"#05080f",stroke:"rgba(130,160,255,0.4)"}:{fill:"#78ffd7",stroke:"#e9fff7"}}function Wa(e,t,n,r){let i=e;if(t!==null){let o=Ya(t,r);i=ke(i,o,r==="star"?.42:.2)??i}if(n!==null){let o=Math.min(Math.max(n,0),1);i=ke(i,o>=.5?"#ffffff":"#0f1520",Math.abs(o-.5)*.7)??i}return i}function Ya(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function Ga(e){if(typeof e!="string"||!e.trim())return;let t=e.trim().toLowerCase();return t.includes("methane")?"rgba(134, 236, 255, 0.75)":t.includes("nitrogen")||t.includes("oxygen")||t.includes("air")?"rgba(122, 194, 255, 0.75)":t.includes("carbon")||t.includes("co2")?"rgba(255, 198, 138, 0.75)":t.includes("sulfur")?"rgba(255, 233, 138, 0.75)":"rgba(180, 222, 255, 0.68)"}function Xa(e){switch(e){case"presentation":return{layers:{background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}};case"atlas-card":return{layers:{background:!0,guides:!1,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}};case"markdown":return{layers:{background:!0,guides:!1,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!1}};default:return{layers:{background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}}}}function Cn(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function zn(e){return`${e.renderId}-clip`}function Bn(e,t,n){return`${e},${t-n} ${e+n},${t} ${e},${t+n} ${e-n},${t}`}function At(e,t,n){return`${e},${t-n*1.2} ${e+n*.9},${t-n*.3} ${e+n*1.2},${t+n*.8} ${e},${t+n*1.2} ${e-n*1.1},${t+n*.3} ${e-n*.8},${t-n*.8}`}function qa(e,t){let n=Array.from({length:10},(i,o)=>{let a=90+o*((e-180)/9);return`<line class="wo-grid" x1="${a}" y1="120" x2="${a}" y2="${t-70}" />`}).join(""),r=Array.from({length:6},(i,o)=>{let a=150+o*((t-240)/5);return`<line class="wo-grid" x1="56" y1="${a}" x2="${e-56}" y2="${a}" />`}).join("");return`${n}${r}`}function Ha(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function nt(e){return e.type==="structure"||e.type==="phenomenon"}function ke(e,t,n){let r=Tt(e),i=Tt(t);if(!r||!i)return;let o=Math.min(Math.max(n,0),1);return Ka({r:Math.round(r.r+(i.r-r.r)*o),g:Math.round(r.g+(i.g-r.g)*o),b:Math.round(r.b+(i.b-r.b)*o)})}function Rn(e,t){let n=Tt(e);return n?`rgba(${n.r}, ${n.g}, ${n.b}, ${t})`:e}function Tt(e){let t=e.trim();return/^#[0-9a-f]{6}$/i.test(t)?{r:Number.parseInt(t.slice(1,3),16),g:Number.parseInt(t.slice(3,5),16),b:Number.parseInt(t.slice(5,7),16)}:/^#[0-9a-f]{3}$/i.test(t)?{r:Number.parseInt(t[1]+t[1],16),g:Number.parseInt(t[2]+t[2],16),b:Number.parseInt(t[3]+t[3],16)}:null}function Ka(e){let t=n=>n.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function Za(e){return!!e.trim()}function O(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function T(e){return O(e)}function _n(e){return encodeURIComponent(JSON.stringify(e))}function Et(e,t,n={}){return{version:"2.0",mode:Pt(t),scene:e,spatialScene:n.spatialScene,options:{viewMode:n.viewMode??Nn(Pt(t)),initialViewpointId:n.initialViewpointId,initialSelectionObjectId:n.initialSelectionObjectId,initialFilter:n.initialFilter??null,atlasState:n.atlasState??null,minimap:n.minimap}}}function Ft(e,t={}){let n={...e,options:{...e.options,theme:t.theme??e.options?.theme,layers:t.layers??e.options?.layers,subtitle:t.subtitle??e.options?.subtitle,preset:t.preset??e.options?.preset,viewMode:t.viewMode??e.options?.viewMode??Nn(Pt(e.mode)),initialViewpointId:t.initialViewpointId??e.options?.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId??e.options?.initialSelectionObjectId,initialFilter:t.initialFilter??e.options?.initialFilter??null,atlasState:t.atlasState??e.options?.atlasState??null,minimap:t.minimap??e.options?.minimap}},r=ie(e.scene,{theme:n.options?.theme,layers:n.options?.layers,filter:n.options?.initialFilter??null,selectedObjectId:n.options?.initialSelectionObjectId??null,subtitle:n.options?.subtitle,preset:n.options?.preset});return`<div class="${rt(t.className??"worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${n.mode}" data-worldorbit-preset="${rt(n.options?.preset??e.scene.renderPreset??"custom")}" data-worldorbit-viewpoint="${rt(n.options?.initialViewpointId??"")}" data-worldorbit-payload="${rt(_n(n))}">${r}</div>`}function rt(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function Pt(e){return!e||e==="interactive"?"interactive-2d":e}function Nn(e){return e==="interactive-3d"?"3d":"2d"}function ue(e,t={}){try{let n=re(e),r=z(n.document,Un(n,t)),i=t.mode??"static";if(i==="interactive"||i==="interactive-2d"||i==="interactive-3d"){let o=i==="interactive"?"interactive-2d":i;return Ft(Et(r,o,{spatialScene:o==="interactive-3d"?Ge(n.document,Un(n,t)):void 0,viewMode:o==="interactive-3d"?"3d":"2d",initialViewpointId:t.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId,initialFilter:t.initialFilter??null,atlasState:t.atlasState??null,minimap:t.minimap}),{className:t.className??"worldorbit-block worldorbit-interactive",theme:t.theme,layers:t.layers,subtitle:t.subtitle,preset:t.preset,viewMode:o==="interactive-3d"?"3d":"2d",initialViewpointId:t.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId,initialFilter:t.initialFilter??null,atlasState:t.atlasState??null,minimap:t.minimap})}return`<figure class="${ps(t.className??"worldorbit-block worldorbit-static")}">${ie(r,t)}</figure>`}catch(n){if(t.strict)throw n;return Vt(n instanceof Error?n.message:String(n))}}function Vt(e){return`<pre class="worldorbit-error">WorldOrbit error: ${Wn(e)}</pre>`}function Wn(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;")}function ps(e){return Wn(e).replaceAll('"',"&quot;")}function Un(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}function Yn(e={}){return function(n){Gn(n,(r,i,o)=>{!o||i===-1||r.type!=="code"||!ms(r.lang)||(o.children[i]={type:"html",value:ue(r.value??"",e)})})}}function Gn(e,t,n=null){let r=e.children??[];for(let i=0;i<r.length;i+=1){let o=r[i];t(o,i,e),Gn(o,t,e)}n||t(e,-1,null)}function ms(e){return(e??"").trim().toLowerCase()==="worldorbit"}function Xn(e={}){return function(n){qn(n,(r,i,o)=>{if(!o||i===-1||r.type!=="element"||r.tagName!=="pre")return;let a=r.children?.[0];if(!a||a.type!=="element"||a.tagName!=="code"||!hs(a.properties?.className).includes("language-worldorbit"))return;let s=Hn(a);o.children[i]={type:"raw",value:ue(s,e)}})}}function qn(e,t,n=null){let r=e.children??[];for(let i=0;i<r.length;i+=1){let o=r[i];t(o,i,e),qn(o,t,e)}n||t(e,-1,null)}function hs(e){return Array.isArray(e)?e.map(t=>String(t)):typeof e=="string"?e.split(/\s+/).filter(Boolean):[]}function Hn(e){return e.type==="text"?e.value??"":(e.children??[]).map(t=>Hn(t)).join("")}return ar(gs);})();
103
+ <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="1" />`:`<polygon points="${At(t,n,r)}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`}}}function Va(e,t){if(!t.atmosphere)return"";let{object:n,x:r,y:i,radius:o}=e;return n.type!=="planet"&&n.type!=="moon"&&n.type!=="asteroid"?"":`<circle cx="${r}" cy="${i}" r="${o+4}" fill="none" stroke="${t.atmosphere}" stroke-width="4" opacity="0.45" />`}function Ra(e){if(!e.imageHref)return"";let t=Ba(e);return`<image class="wo-object-image" x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" href="${T(e.imageHref)}" preserveAspectRatio="xMidYMid slice" clip-path="url(#${T(zn(e))})" />`}function za(e){let{x:t,y:n,radius:r}=e,i="";switch(e.object.type){case"star":case"planet":case"moon":case"asteroid":case"comet":i=`<circle cx="${t}" cy="${n}" r="${r}" />`;break;case"structure":i=`<polygon points="${Bn(t,n,r)}" />`;break;case"phenomenon":i=`<polygon points="${At(t,n,r)}" />`;break;default:return""}return`<clipPath id="${T(zn(e))}" clipPathUnits="userSpaceOnUse">${i}</clipPath>`}function Ba(e){let{object:t,x:n,y:r,radius:i}=e;switch(t.type){case"structure":return{x:n-i,y:r-i,width:i*2,height:i*2};case"phenomenon":return{x:n-i*1.2,y:r-i*1.2,width:i*2.4,height:i*2.4};default:return{x:n-i,y:r-i,width:i*2,height:i*2}}}function _a(e,t){let n=String(e.object.properties.kind??"").toLowerCase().replace(/_/g,"-"),r=Na(e.object.type,n,t),i=e.fillColor&&Za(e.fillColor)?e.fillColor:r.fill,o=Vn(e.object.properties.albedo),a=Vn(e.object.properties.temperature),l=Wa(i,a,o,e.object.type),s=ke(l,"#ffffff",.4)??r.stroke,c=Ga(e.object.properties.atmosphere),u=e.object.type==="star"?Rn(ke(l,"#fff2cb",.4)??l,.82):void 0;return{fill:l,stroke:s,glow:u,atmosphere:c,tail:e.object.type==="comet"?Rn(ke(l,"#ffffff",.5)??l,.72):void 0}}function Na(e,t,n){switch(e){case"star":return{fill:n.starCore,stroke:n.starStroke};case"planet":return{fill:"#72b7ff",stroke:"#d8efff"};case"moon":return{fill:"#c7d7ea",stroke:"#f2f8ff"};case"belt":return{fill:"#d9aa74",stroke:"#f7d5aa"};case"asteroid":return{fill:"#a7a5b8",stroke:"#ebe5ff"};case"comet":return{fill:"#9ce7ff",stroke:"#e7fbff"};case"ring":return{fill:"#e59f7d",stroke:"#fff0d3"};case"structure":return{fill:n.accentStrong,stroke:"#fff2ea"};case"phenomenon":return Ua(t)}}function Ua(e){return e==="galaxy"?{fill:"rgba(165,125,255,0.55)",stroke:"rgba(210,185,255,0.75)",halo:"rgba(160,120,255,0.10)",core:"#ede0ff"}:e==="dwarf-galaxy"?{fill:"rgba(190,165,255,0.45)",stroke:"rgba(220,205,255,0.75)",core:"#ddd0ff"}:e==="black-hole"?{fill:"#040408",stroke:"#ff6a00",accentRing:"rgba(255,140,20,0.72)"}:e==="nebula"?{fill:"rgba(105,205,255,0.45)",stroke:"rgba(180,235,255,0.72)",halo:"rgba(100,200,255,0.08)"}:e==="void"?{fill:"#05080f",stroke:"rgba(130,160,255,0.4)"}:{fill:"#78ffd7",stroke:"#e9fff7"}}function Wa(e,t,n,r){let i=e;if(t!==null){let o=Ya(t,r);i=ke(i,o,r==="star"?.42:.2)??i}if(n!==null){let o=Math.min(Math.max(n,0),1);i=ke(i,o>=.5?"#ffffff":"#0f1520",Math.abs(o-.5)*.7)??i}return i}function Ya(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function Ga(e){if(typeof e!="string"||!e.trim())return;let t=e.trim().toLowerCase();return t.includes("methane")?"rgba(134, 236, 255, 0.75)":t.includes("nitrogen")||t.includes("oxygen")||t.includes("air")?"rgba(122, 194, 255, 0.75)":t.includes("carbon")||t.includes("co2")?"rgba(255, 198, 138, 0.75)":t.includes("sulfur")?"rgba(255, 233, 138, 0.75)":"rgba(180, 222, 255, 0.68)"}function Ha(e){switch(e){case"presentation":return{layers:{background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}};case"atlas-card":return{layers:{background:!0,guides:!1,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}};case"markdown":return{layers:{background:!0,guides:!1,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!1}};default:return{layers:{background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}}}}function Vn(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function zn(e){return`${e.renderId}-clip`}function Bn(e,t,n){return`${e},${t-n} ${e+n},${t} ${e},${t+n} ${e-n},${t}`}function At(e,t,n){return`${e},${t-n*1.2} ${e+n*.9},${t-n*.3} ${e+n*1.2},${t+n*.8} ${e},${t+n*1.2} ${e-n*1.1},${t+n*.3} ${e-n*.8},${t-n*.8}`}function Xa(e,t){let n=Array.from({length:10},(i,o)=>{let a=90+o*((e-180)/9);return`<line class="wo-grid" x1="${a}" y1="120" x2="${a}" y2="${t-70}" />`}).join(""),r=Array.from({length:6},(i,o)=>{let a=150+o*((t-240)/5);return`<line class="wo-grid" x1="56" y1="${a}" x2="${e-56}" y2="${a}" />`}).join("");return`${n}${r}`}function qa(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function nt(e){return e.type==="structure"||e.type==="phenomenon"}function ke(e,t,n){let r=Tt(e),i=Tt(t);if(!r||!i)return;let o=Math.min(Math.max(n,0),1);return Ka({r:Math.round(r.r+(i.r-r.r)*o),g:Math.round(r.g+(i.g-r.g)*o),b:Math.round(r.b+(i.b-r.b)*o)})}function Rn(e,t){let n=Tt(e);return n?`rgba(${n.r}, ${n.g}, ${n.b}, ${t})`:e}function Tt(e){let t=e.trim();return/^#[0-9a-f]{6}$/i.test(t)?{r:Number.parseInt(t.slice(1,3),16),g:Number.parseInt(t.slice(3,5),16),b:Number.parseInt(t.slice(5,7),16)}:/^#[0-9a-f]{3}$/i.test(t)?{r:Number.parseInt(t[1]+t[1],16),g:Number.parseInt(t[2]+t[2],16),b:Number.parseInt(t[3]+t[3],16)}:null}function Ka(e){let t=n=>n.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function Za(e){return!!e.trim()}function O(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function T(e){return O(e)}function _n(e){return encodeURIComponent(JSON.stringify(e))}function Et(e,t,n={}){return{version:"2.0",mode:Pt(t),scene:e,spatialScene:n.spatialScene,options:{viewMode:n.viewMode??Nn(Pt(t)),initialViewpointId:n.initialViewpointId,initialSelectionObjectId:n.initialSelectionObjectId,initialFilter:n.initialFilter??null,atlasState:n.atlasState??null,minimap:n.minimap}}}function Ft(e,t={}){let n={...e,options:{...e.options,theme:t.theme??e.options?.theme,layers:t.layers??e.options?.layers,subtitle:t.subtitle??e.options?.subtitle,preset:t.preset??e.options?.preset,viewMode:t.viewMode??e.options?.viewMode??Nn(Pt(e.mode)),initialViewpointId:t.initialViewpointId??e.options?.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId??e.options?.initialSelectionObjectId,initialFilter:t.initialFilter??e.options?.initialFilter??null,atlasState:t.atlasState??e.options?.atlasState??null,minimap:t.minimap??e.options?.minimap}},r=ie(e.scene,{theme:n.options?.theme,layers:n.options?.layers,filter:n.options?.initialFilter??null,selectedObjectId:n.options?.initialSelectionObjectId??null,subtitle:n.options?.subtitle,preset:n.options?.preset});return`<div class="${rt(t.className??"worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${n.mode}" data-worldorbit-preset="${rt(n.options?.preset??e.scene.renderPreset??"custom")}" data-worldorbit-viewpoint="${rt(n.options?.initialViewpointId??"")}" data-worldorbit-payload="${rt(_n(n))}">${r}</div>`}function rt(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function Pt(e){return!e||e==="interactive"?"interactive-2d":e}function Nn(e){return e==="interactive-3d"?"3d":"2d"}function ue(e,t={}){try{let n=re(e),r=z(n.document,Un(n,t)),i=t.mode??"static";if(i==="interactive"||i==="interactive-2d"||i==="interactive-3d"){let o=i==="interactive"?"interactive-2d":i;return Ft(Et(r,o,{spatialScene:o==="interactive-3d"?Ge(n.document,Un(n,t)):void 0,viewMode:o==="interactive-3d"?"3d":"2d",initialViewpointId:t.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId,initialFilter:t.initialFilter??null,atlasState:t.atlasState??null,minimap:t.minimap}),{className:t.className??"worldorbit-block worldorbit-interactive",theme:t.theme,layers:t.layers,subtitle:t.subtitle,preset:t.preset,viewMode:o==="interactive-3d"?"3d":"2d",initialViewpointId:t.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId,initialFilter:t.initialFilter??null,atlasState:t.atlasState??null,minimap:t.minimap})}return`<figure class="${ps(t.className??"worldorbit-block worldorbit-static")}">${ie(r,t)}</figure>`}catch(n){if(t.strict)throw n;return Ct(n instanceof Error?n.message:String(n))}}function Ct(e){return`<pre class="worldorbit-error">WorldOrbit error: ${Wn(e)}</pre>`}function Wn(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;")}function ps(e){return Wn(e).replaceAll('"',"&quot;")}function Un(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}function Yn(e={}){return function(n){Gn(n,(r,i,o)=>{!o||i===-1||r.type!=="code"||!ms(r.lang)||(o.children[i]={type:"html",value:ue(r.value??"",e)})})}}function Gn(e,t,n=null){let r=e.children??[];for(let i=0;i<r.length;i+=1){let o=r[i];t(o,i,e),Gn(o,t,e)}n||t(e,-1,null)}function ms(e){return(e??"").trim().toLowerCase()==="worldorbit"}function Hn(e={}){return function(n){Xn(n,(r,i,o)=>{if(!o||i===-1||r.type!=="element"||r.tagName!=="pre")return;let a=r.children?.[0];if(!a||a.type!=="element"||a.tagName!=="code"||!hs(a.properties?.className).includes("language-worldorbit"))return;let s=qn(a);o.children[i]={type:"raw",value:ue(s,e)}})}}function Xn(e,t,n=null){let r=e.children??[];for(let i=0;i<r.length;i+=1){let o=r[i];t(o,i,e),Xn(o,t,e)}n||t(e,-1,null)}function hs(e){return Array.isArray(e)?e.map(t=>String(t)):typeof e=="string"?e.split(/\s+/).filter(Boolean):[]}function qn(e){return e.type==="text"?e.value??"":(e.children??[]).map(t=>qn(t)).join("")}return ar(gs);})();