worldorbit 4.0.0 → 5.0.0
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.
- package/README.md +17 -18
- package/dist/browser/core/dist/draft-parse.js +131 -12
- package/dist/browser/core/dist/draft.js +4 -4
- package/dist/browser/core/dist/format.js +42 -3
- package/dist/browser/core/dist/load.js +7 -2
- package/dist/browser/core/dist/scene.js +215 -3
- package/dist/browser/core/dist/solver.d.ts +8 -1
- package/dist/browser/core/dist/solver.js +72 -0
- package/dist/browser/core/dist/spatial-scene.js +56 -0
- package/dist/browser/core/dist/types.d.ts +74 -2
- package/dist/browser/viewer/dist/render.js +71 -15
- package/dist/browser/viewer/dist/theme.js +1 -0
- package/dist/browser/viewer/dist/types.d.ts +7 -0
- package/dist/browser/viewer/dist/viewer.js +27 -0
- package/dist/obsidian-plugin/main.js +81 -67
- package/dist/unpkg/core/dist/draft-parse.js +131 -12
- package/dist/unpkg/core/dist/draft.js +4 -4
- package/dist/unpkg/core/dist/format.js +42 -3
- package/dist/unpkg/core/dist/load.js +7 -2
- package/dist/unpkg/core/dist/scene.js +215 -3
- package/dist/unpkg/core/dist/solver.d.ts +8 -1
- package/dist/unpkg/core/dist/solver.js +72 -0
- package/dist/unpkg/core/dist/spatial-scene.js +56 -0
- package/dist/unpkg/core/dist/types.d.ts +74 -2
- package/dist/unpkg/viewer/dist/render.js +71 -15
- package/dist/unpkg/viewer/dist/theme.js +1 -0
- package/dist/unpkg/viewer/dist/types.d.ts +7 -0
- package/dist/unpkg/viewer/dist/viewer.js +27 -0
- package/dist/unpkg/worldorbit-core.min.js +12 -12
- package/dist/unpkg/worldorbit-editor.min.js +336 -322
- package/dist/unpkg/worldorbit-markdown.min.js +50 -36
- package/dist/unpkg/worldorbit-viewer.min.js +225 -211
- package/dist/unpkg/worldorbit.js +473 -19
- package/dist/unpkg/worldorbit.min.js +229 -215
- package/package.json +1 -1
- package/packages/core/dist/draft-parse.js +131 -12
- package/packages/core/dist/draft.js +4 -4
- package/packages/core/dist/format.js +42 -3
- package/packages/core/dist/load.js +7 -2
- package/packages/core/dist/scene.js +215 -3
- package/packages/core/dist/solver.d.ts +8 -1
- package/packages/core/dist/solver.js +72 -0
- package/packages/core/dist/spatial-scene.js +56 -0
- package/packages/core/dist/types.d.ts +74 -2
- package/packages/viewer/dist/render.js +71 -15
- package/packages/viewer/dist/theme.js +1 -0
- package/packages/viewer/dist/types.d.ts +7 -0
- package/packages/viewer/dist/viewer.js +27 -0
|
@@ -1,108 +1,122 @@
|
|
|
1
|
-
"use strict";var rt=Object.defineProperty;var rr=Object.getOwnPropertyDescriptor;var ir=Object.getOwnPropertyNames;var or=Object.prototype.hasOwnProperty;var ar=(e,t)=>{for(var n in t)rt(e,n,{get:t[n],enumerable:!0})},sr=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of ir(t))!or.call(e,i)&&i!==n&&rt(e,i,{get:()=>t[i],enumerable:!(r=rr(t,i))||r.enumerable});return e};var lr=e=>sr(rt({},"__esModule",{value:!0}),e);var ds={};ar(ds,{default:()=>us});module.exports=lr(ds);var T=require("obsidian");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 he=["system","star","planet","moon","belt","asteroid","comet","ring","craft","structure","phenomenon"],U=he.filter(e=>e!=="system"),cr=["star","planet","moon","asteroid","comet","craft","structure","phenomenon"],Dt=["craft","structure","phenomenon"],Q=["star","planet","moon","belt","asteroid","comet","ring","craft","structure","phenomenon"],ur=["star","planet","moon","belt","asteroid","comet","ring","craft","structure","phenomenon"];function x(e,t){return{key:e,...t}}var Le=new Set(he),Rt=new Map([x("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:Q}),x("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:Q,unitFamily:"distance"}),x("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:Q,unitFamily:"distance"}),x("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:Q}),x("period",{kind:"unit",placement:!0,arity:"single",objectTypes:Q,unitFamily:"duration"}),x("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:Q,unitFamily:"angle"}),x("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:Q,unitFamily:"angle"}),x("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:Q,unitFamily:"angle"}),x("at",{kind:"string",placement:!0,arity:"single",objectTypes:Dt}),x("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Dt}),x("free",{kind:"string",placement:!0,arity:"single",objectTypes:ur}),x("kind",{kind:"string",placement:!1,arity:"single",objectTypes:U}),x("class",{kind:"string",placement:!1,arity:"single",objectTypes:U}),x("culture",{kind:"string",placement:!1,arity:"single",objectTypes:U}),x("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:he}),x("color",{kind:"string",placement:!1,arity:"single",objectTypes:he}),x("image",{kind:"string",placement:!1,arity:"single",objectTypes:cr}),x("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:he}),x("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:U,unitFamily:"radius"}),x("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:U,unitFamily:"mass"}),x("density",{kind:"unit",placement:!1,arity:"single",objectTypes:U,unitFamily:"generic"}),x("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:U,unitFamily:"generic"}),x("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:U,unitFamily:"generic"}),x("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:U}),x("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),x("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),x("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),x("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),x("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),x("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),x("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),x("on",{kind:"string",placement:!1,arity:"single",objectTypes:U}),x("source",{kind:"string",placement:!1,arity:"single",objectTypes:U}),x("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:U,unitFamily:"duration"}),x("trajectory",{kind:"string",placement:!1,arity:"single",objectTypes:["craft","structure"]})].map(e=>[e.key,e])),dr=new Set(Rt.keys());function _(e){return Rt.get(e)}function Ct(e){return dr.has(e)}function _t(e,t){return e.objectTypes.includes(t)}function Ae(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}}var Vt=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,fr=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),pr=/^[A-Za-z][A-Za-z0-9+.-]*:/;function it(e){let t=null,n=[],r=e.theme?mr(e.theme):null;for(let i of e.objects){let o=gr(i);if(i.objectType==="system"){if(t)throw d.fromLocation("Only one system object is allowed",i.location);t=o}else n.push(o)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",theme:r,system:t,groups:[],relations:[],events:[],trajectories:[],objects:n}}function mr(e){let t={};for(let n of e.blocks){let r=zt(n.fields);t[n.target]=hr(r)}return{preset:e.preset,styles:t}}function hr(e){let t={};for(let[n,r]of e.entries()){if(r.values.length===1){let i=r.values[0];if(i==="true"){t[n]=!0;continue}if(i==="false"){t[n]=!1;continue}let o=Number(i);if(!Number.isNaN(o)&&i.trim()!==""){t[n]=o;continue}}t[n]=r.values.join(" ")}return t}function gr(e){let t=[...e.inlineFields,...e.blockFields];yr(e.objectType,t);let n=zt(t),r=br(e.objectType,n),i=wr(n),o=Ir(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 yr(e,t){for(let n of t){let r=_(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(!_t(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 zt(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 br(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:Fe(t,"orbit"),distance:le(t,"distance"),semiMajor:le(t,"semiMajor"),eccentricity:Sr(t,"eccentricity"),period:le(t,"period"),angle:le(t,"angle"),inclination:le(t,"inclination"),phase:le(t,"phase")};if(r){let l=De(t,"at"),s=Fe(t,"at");return{mode:"at",target:s,reference:xr(s,l.location)}}if(i)return{mode:"surface",target:Fe(t,"surface")};if(o){let l=Fe(t,"free"),s=kr(l);return{mode:"free",distance:s??void 0,descriptor:s?void 0:l}}return null}function wr(e){let t={};for(let[n,r]of e.entries()){let i=_(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=jr(r);break;case"number":t[n]=Nt(ce(r),n,r.location);break;case"unit":t[n]=Bt(ce(r),r.location,n);break;case"string":t[n]=vr(n,r);break}}return t}function vr(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(pr);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 Ir(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 xr(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function Bt(e,t,n){let r=e.match(Vt);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=_(n);if(o?.unitFamily&&!Ae(o.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function kr(e){let t=e.match(Vt);return t?{value:Number(t[1]),unit:t[2]??null}:null}function le(e,t){if(!e.has(t))return;let n=De(e,t);return Bt(ce(n),n.location,t)}function Sr(e,t){if(!e.has(t))return;let n=De(e,t);return Nt(ce(n),t,n.location)}function Nt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function jr(e){let t=ce(e).toLowerCase(),n=fr.get(t);if(n===void 0)throw d.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function De(e,t){let n=e.get(t);if(!n)throw new d(`Missing value for key "${t}"`);return n}function Fe(e,t){return ce(De(e,t))}function ce(e){if(e.values.length!==1)throw d.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}function Re(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],p=r+u+1;if(l&&f==="\\"){let m=e[u+1];if(m==='"'||m==="\\"){i+=m,u++;continue}}if(f==='"'){l?l=!1:(o===null&&(o=p),a=!0,s=p,l=!0);continue}if(!l&&/\s/.test(f)){c();continue}o===null&&(o=p),i+=f}if(l)throw new d("Unclosed quote in line",t.line,s??r+e.length);return c(),n}function Ce(e){return e.match(/^\s*/)?.[0].length??0}function ot(e){let t=e.split(/\r?\n/),n=[],r=null,i=null,o=!1,a=!1,l=null,s=null,c=null,u=null;for(let f=0;f<t.length;f++){let p=t[f],m=f+1;if(!p.trim())continue;let g=Ce(p),y=Re(p.slice(g),{line:m,columnOffset:g});if(y.length!==0){if(g===0){if(o=!1,a=!1,l=null,s=null,c=null,u=null,y.length>=1&&y[0].value==="theme"){a=!0,s=0,r={type:"theme",preset:y.length>=2?y[1].value:null,blocks:[],location:{line:m,column:y[0].column}};continue}let I=Or(y,m);n.push(I),i=I;continue}if(a){if(y.length>=2&&y[0].value==="preset"&&(!c||g<=c)){r&&(r.preset=y[1].value);continue}u&&c!==null&&g>c?u.fields.push(Tr(y,m)):(c=g,u={type:"theme-block",target:y[0].value,fields:[],location:{line:m,column:y[0].column}},r?.blocks.push(u));continue}if(!i)throw new d("Indented line without parent object",m,g+1);if(y.length===1&&y[0].value==="info"){o=!0,l=g;continue}o&&g<=(l??0)&&(o=!1),o?i.infoEntries.push(Pr(y,m)):i.blockFields.push(Er(y,m))}}return{type:"document",theme:r,objects:n}}function Or(e,t){if(e.length<2)throw new d("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!Le.has(n.value))throw new d(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:Mr(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function Mr(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],o=_(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&&!Ct(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 Er(e,t){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);if(!_(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 Tr(e,t){if(e.length<2)throw new d("Invalid theme field line",t,e[0]?.column??1);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 Lr=new Set(["star","planet","moon","asteroid","comet"]);function at(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||!Lr.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"&&Fr(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 Fr(e,t,n){if(!n.has(t.objectId))throw new d(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function ue(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,Dr=6371,Rr=71492,Cr=695700,_r=63241.077,Vr=206264.806,zr=206264806,Xt=.68,Br=.2,Kt=28;function Ye(e,t={}){let n=Wr(t),r=n.width,i=n.height,o=n.padding,a=Ur(e),l=Hr(e,t.projection),s=ft(t.camera??null),c=dt(l,s),u=Zr(a),f=Xr(a,t.scaleModel,t.bodyScaleMode),p=e.system?.id??null,m=t.activeEventId??null,g=Nr(e.objects,e.events??[],m),y=Jr(g,r,i,o,u,f),I=new Map(g.map(v=>[v.id,v])),O=Di(g,I),h=new Map,b=[],S=[],B=[],P=[],q=[],$=new Map,M=new Map;for(let v of g){let N=v.placement;if(!N){B.push(v);continue}if(N.mode==="orbit"){Ht(M,N.target,v);continue}if(N.mode==="surface"){Ht($,N.target,v);continue}if(N.mode==="at"){q.push(v);continue}P.push(v)}let F=P.length>0?r*.42:r/2,G=i/2,L={orbitChildren:M,surfaceChildren:$,objectMap:I,spacingFactor:u,projection:c,scaleModel:f,sceneMetricScale:y},ie=B.find(v=>v.type==="star")??B[0]??null;ie&<(ie,F,G,0,h,b,S,L);let X=B.filter(v=>v.id!==ie?.id);if(X.length>0){let v=Math.min(r,i)*.28*u*f.orbitDistanceMultiplier;X.forEach((N,A)=>{let nt=$e(A,X.length,-Math.PI/2),oe=Ie(nt,v,c,1);lt(N,F+oe.x,G+oe.y,0,h,b,S,L)})}P.forEach((v,N)=>{let A=r-o-140-Bi(v.placement?.mode==="free"?v.placement.distance:void 0,f,y),nt=Math.max(76,(i-o*2-180)/Math.max(1,P.length)*u)*f.freePlacementMultiplier,oe=o+92+N*nt;h.set(v.id,{object:v,x:A,y:oe,radius:Ne(v,0,f,y),sortKey:We(A,oe,0)}),S.push({object:v,groupId:O.groupIds.get(v.id)??null,x1:A-60,y1:oe,x2:A-18,y2:oe,mode:"free"}),ze(v,h,b,S,L,1)}),q.forEach((v,N)=>{if(h.has(v.id)||!v.placement||v.placement.mode!=="at")return;let A=Ai(v.placement.reference,h,I,N,q.length,r,i,o,L);h.set(v.id,{object:v,x:A.x,y:A.y,radius:Ne(v,2,f,y),sortKey:We(A.x,A.y,2),anchorX:A.anchorX,anchorY:A.anchorY}),A.anchorX!==void 0&&A.anchorY!==void 0&&S.push({object:v,groupId:O.groupIds.get(v.id)??null,x1:A.anchorX,y1:A.anchorY,x2:A.x,y2:A.y,mode:"at"}),ze(v,h,b,S,L,2)});let C=[...h.values()].map(v=>Qr(v,f,O)),K=b.map(v=>ei(v,O.groupIds.get(v.object.id)??null)),Te=S.map(v=>ti(v)),Pe=ni(C,r,i,f.labelMultiplier),At=ui(e,C),Ft=di(e.events??[],C,m),Jn=si(K,At,Ft,Te,C,Pe),Qn=li(C,K,Te,Pe,O,f.labelMultiplier),er=ci(e,C),tr=fi(e,l,n.preset,O,I),nr=ki(r,i,C,K,Te,Pe,f.labelMultiplier);return{width:r,height:i,padding:o,renderPreset:n.preset,projection:l,renderProjection:c,camera:s,scaleModel:f,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:qr(l,c,a,s),systemId:p,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","body.scaleMode":f.bodyScaleMode,...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:nr,layers:Jn,groups:Qn,semanticGroups:er,viewpoints:tr,events:Ft,activeEventId:m,objects:C,orbitVisuals:K,relations:At,leaders:Te,labels:Pe}}function ut(e,t,n){let r=He(n),i=Math.cos(r),o=Math.sin(r),a=e.x-t.x,l=e.y-t.y;return{x:t.x+a*i-l*o,y:t.y+a*o+l*i}}function Nr(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 Ur(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 Wr(e){let t=Yr(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function Yr(e){switch(e){case"presentation":return{width:1440,height:900,padding:88};case"atlas-card":return{width:960,height:560,padding:56};case"markdown":return{width:920,height:540,padding:48};default:return{width:1200,height:780,padding:72}}}function Hr(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return Qt(n)??"topdown"}function dt(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 ft(e){if(!e)return null;let t={azimuth:st(e.azimuth),elevation:st(e.elevation),roll:st(e.roll),distance:Gr(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function st(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Gr(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function qr(e,t,n,r){let i=[`${Gt(e)} view`,`${Gt(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 Xr(e,t,n){return{...Kr(e),...n?{bodyScaleMode:n}:{},...t}}function Kr(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36,bodyScaleMode:"readable"};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48,bodyScaleMode:"readable"};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40,bodyScaleMode:"readable"}}}function Zr(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Jr(e,t,n,r,i,o){let a=[],l=[];for(let m of e){let g=Ui(m);g!==null&&g>0&&l.push(g);let y=m.placement;if(y){if(y.mode==="orbit"){let I=ee(y.semiMajor??y.distance??null);I!==null&&I>0&&a.push(I);continue}if(y.mode==="free"){let I=ee(y.distance??null);I!==null&&I>0&&a.push(I)}}}let s=Math.max(...a,0),c=Math.max(...l,0),u=Math.max(s,c*6,0),f=u+Math.max(Math.sqrt(u),c*2,s>0?.25:0);return f<=0?{pixelsPerMetric:null,hasExplicitScale:!1}:{pixelsPerMetric:Math.max(Math.min(t,n)/2-r-24,120)*i*o.orbitDistanceMultiplier/f,hasExplicitScale:!0}}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:de(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:i,y:o,radius:a,visualRadius:zi(r,a,t),sortKey:l+u*.001,anchorX:s,anchorY:c,label:r.id,secondaryLabel:r.type==="structure"||r.type==="craft"?String(r.properties.kind??r.type):r.type,fillColor:Wi(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function ei(e,t){return{renderId:`${de(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,semanticGroupIds:[...e.object.groups??[]],kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0||e.object.renderHints?.renderOrbit===!1}}function ti(e){return{renderId:`${de(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,semanticGroupIds:[...e.object.groups??[]],x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function ni(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(ri);for(let s of l){let c=ii(s,a,o,t,n,r)??Jt(s,Zt(s,a.get(s.parentId??"")??null,n),0,r);o.push(on(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 ri(e,t){let n=Ut(e)-Ut(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 Ut(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"craft":case"structure":case"phenomenon":return 5}}function ii(e,t,n,r,i,o){for(let a of oi(e,t,r,i)){let l=a==="left"||a==="right"?4:6;for(let s=0;s<=l;s+=1){let c=Jt(e,a,s,o),u=on(e,c,o);if(!n.some(f=>_i(f,u)))return c}}return null}function oi(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,o=Zt(e,i,r),a=o==="below"?"above":"below",l=ai(e,i,n),s=l==="right"?"left":"right";return e.object.type==="craft"||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 Zt(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 ai(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 Jt(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 si(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 li(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=Ri(s,e,t,n,r,o);return[...a.values()].sort((s,c)=>s.label.localeCompare(c.label))}function ci(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 ui(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:`${de(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 di(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:`${de(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 fi(e,t,n,r,i){let o=pi(e,t,n),a=new Map;for(let[c,u]of Object.entries(e.system?.info??{})){if(!c.startsWith("viewpoint."))continue;let[f,p,...m]=c.split(".");if(f!=="viewpoint"||!p||m.length===0)continue;let g=$i(p);if(!g)continue;let y=m.join(".").toLowerCase(),I=a.get(g)??{id:g};mi(I,y,u,e,t,n,r,i),a.set(g,I)}let l=[...a.values()].map(c=>hi(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 pi(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",o=ft(null),a=dt(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 mi(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=Qt(s)??i;return;case"preset":e.preset=yi(s)??o;return;case"rotation":case"angle":e.rotationDeg=ye(s)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??Ve(),azimuth:ye(s)};return;case"camera.elevation":e.camera={...e.camera??Ve(),elevation:ye(s)};return;case"camera.roll":e.camera={...e.camera??Ve(),roll:ye(s)};return;case"camera.distance":e.camera={...e.camera??Ve(),distance:Wt(s)};return;case"zoom":case"scale":e.scale=Wt(s);return;case"layers":e.layers=bi(s);return;case"query":e.filter={...e.filter??_e(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??_e(),objectTypes:wi(s)};return;case"tags":e.filter={...e.filter??_e(),tags:we(s)};return;case"groups":e.filter={...e.filter??_e(),groupIds:vi(s,r,a,l)};return}}function hi(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=gi(e.filter),l=e.label?.trim()||Ii(e.id),s=e.projection??t,c=ft(e.camera??null),u=dt(s,c);return{id:e.id,label:l,summary:e.summary?.trim()||xi(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 _e(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Ve(){return{azimuth:null,elevation:null,roll:null,distance:null}}function gi(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 Qt(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function yi(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function ye(e){let t=Number(e);return Number.isFinite(t)?t:null}function Wt(e){let t=ye(e);return t!==null&&t>0?t:null}function bi(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 wi(e){return we(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="craft"||t==="structure"||t==="phenomenon")}function vi(e,t,n,r){return we(e).map(i=>t.schemaVersion==="2.1"||t.schemaVersion==="2.5"||t.schemaVersion==="2.6"||t.groups.some(o=>o.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??be(i):(r.has(i),be(i)))}function we(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function $i(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Ii(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function xi(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 ki(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=(p,m)=>{l=Math.min(l,p),s=Math.min(s,m),c=Math.max(c,p),u=Math.max(u,m)};for(let p of r)p.hidden||en(p,f);for(let p of i)p.hidden||(f(p.x1,p.y1),f(p.x2,p.y2));for(let p of n)p.hidden||tn(p,f);for(let p of o)p.hidden||nn(p,f,a);return!Number.isFinite(l)||!Number.isFinite(s)?ve(0,0,e,t):ve(l,s,c,u)}function en(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=sn(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,Kt*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 tn(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 nn(e,t,n){let r=an(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 lt(e,t,n,r,i,o,a,l){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:Ne(e,r,l.scaleModel,l.sceneMetricScale),sortKey:We(t,n,r)}),ze(e,i,o,a,l,r+1))}function ze(e,t,n,r,i,o){let a=t.get(e.id);if(!a)return;let l=[...i.orbitChildren.get(e.id)??[]].sort(Si),s=ji(l,a.radius,i.spacingFactor,i.scaleModel,i.sceneMetricScale),c=Ei(l,s);l.forEach((f,p)=>{let m=Oi(f,p,l.length,a,s,c[p]??s.innerPx,i);n.push({object:f,parentId:e.id,kind:m.kind,cx:m.cx,cy:m.cy,radius:m.radius,rx:m.rx,ry:m.ry,rotationDeg:m.rotationDeg,band:m.band,bandThickness:m.bandThickness,frontArcPath:m.frontArcPath,backArcPath:m.backArcPath}),lt(f,m.objectX,m.objectY,o,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((f,p)=>{let m=$e(p,u.length,-Math.PI/3),g=28*i.spacingFactor,y=Ie(m,a.radius,i.projection,i.projection==="isometric"?.9:1),I=Ie(m,a.radius+g,i.projection,i.projection==="isometric"?.9:1),O=a.x+y.x,h=a.y+y.y,b=a.x+I.x,S=a.y+I.y;t.set(f.id,{object:f,x:b,y:S,radius:Ne(f,o+1,i.scaleModel,i.sceneMetricScale),sortKey:We(b,S,o+1),anchorX:O,anchorY:h}),r.push({object:f,groupId:i.objectMap.has(f.id)?be(Ci(f,i.objectMap)):null,x1:O,y1:h,x2:b,y2:S,mode:"surface"}),ze(f,t,n,r,i,o+1)})}function Si(e,t){let n=Be(e),r=Be(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 ji(e,t,n,r,i){let o=e.map(m=>Be(m)),a=o.filter(m=>m!==null),l=r.bodyScaleMode==="strict"?Math.max(2,8*n*r.orbitDistanceMultiplier):(e.length>2?54:64)*n*r.orbitDistanceMultiplier*.42,s=t+Math.max(l*1.2,24*n),c=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(a.length===0)return{metrics:o,minMetric:0,maxMetric:0,metricSpread:0,innerPx:s,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:l,pixelsPerMetric:i.pixelsPerMetric};let u=Math.min(...a),f=Math.max(...a),p=f-u;return{metrics:o,minMetric:u,maxMetric:f,metricSpread:p,innerPx:s,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:l,pixelsPerMetric:i.pixelsPerMetric}}function Oi(e,t,n,r,i,o,a){let l=e.placement,s=e.type==="belt"||e.type==="ring";if(!l||l.mode!=="orbit"){let $=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:$,rotationDeg:0,band:s,bandThickness:s?12*a.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-$}}let c=E(typeof l.eccentricity=="number"?l.eccentricity:0,0,.92),u=o,f=Math.max(u*Math.sqrt(1-c*c),u*.18),p=ct(l.inclination)??0,m=a.projection==="isometric"?Math.max(Br,Math.cos(He(p)))*Xt:1,g=Math.max(f*m,u*.14),y=ct(l.angle)??0,I=u*c,O=cn(-I,0,y),h=r.x+O.x,b=r.y+O.y,S=Pi(l.phase,t,n),B=ln(h,b,u,g,y,S),P=a.projection==="topdown"&&c<=1e-4&&Math.abs(y)<=1e-4,q=s?Li(e,u,i,a.scaleModel):void 0;return{kind:P?"circle":"ellipse",cx:P?r.x:h,cy:P?r.y:b,radius:P?u:void 0,rx:P?void 0:u,ry:P?void 0:g,rotationDeg:y,band:s,bandThickness:q,frontArcPath:a.projection==="isometric"||s?Yt(h,b,u,g,y,0,Math.PI):void 0,backArcPath:a.projection==="isometric"||s?Yt(h,b,u,g,y,Math.PI,Math.PI*2):void 0,objectX:B.x,objectY:B.y}}function Mi(e,t){return t.pixelsPerMetric!==null?e*t.pixelsPerMetric:t.innerPx+t.stepPx*Ti(Math.max(e,0)+1)}function Ei(e,t){let n=[];return e.forEach((r,i)=>{let o=Be(r),a=t.innerPx+i*t.stepPx,l=o===null?a:Mi(o,t),s=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(l,s))}),n}function Be(e){return!e.placement||e.placement.mode!=="orbit"?null:ee(e.placement.semiMajor??e.placement.distance??null)}function Ti(e){return Math.log(e)/Math.log(2)}function Pi(e,t,n){let r=e?ct(e):null;return r!==null?He(r-90):$e(t,n,-Math.PI/2)}function Li(e,t,n,r){let i=ee(Ue(e.properties.inner)),o=ee(Ue(e.properties.outer));if(i!==null&&o!==null){let l=Math.abs(o-i);if(n.pixelsPerMetric!==null){let c=l*n.pixelsPerMetric;return r.bodyScaleMode==="strict"?Math.max(c*r.ringThicknessMultiplier,1):E(Math.max(c*r.ringThicknessMultiplier,8),8,54)}if(n.metricSpread>0)return E(l/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let s=Math.max(Math.max(i,o),1e-4);return E(l/s*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function Ai(e,t,n,r,i,o,a,l,s){if(e.kind==="lagrange")return Fi(e,t,n,o,a);if(e.kind==="anchor"){let c=t.get(e.objectId);if(c){let u=$e(r,i,Math.PI/5),f=(c.radius+36)*s.scaleModel.labelMultiplier,p=Ie(u,f,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+p.x,y:c.y+p.y,anchorX:c.x,anchorY:c.y}}}if(e.kind==="named"){let c=t.get(e.name);if(c){let u=$e(r,i,Math.PI/6),f=(c.radius+36)*s.scaleModel.labelMultiplier,p=Ie(u,f,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+p.x,y:c.y+p.y,anchorX:c.x,anchorY:c.y}}}return{x:o-l-170,y:a-l-86-r*58*s.scaleModel.freePlacementMultiplier}}function Fi(e,t,n,r,i){let o=e.secondary?t.get(e.primary):Vi(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,p=-f,m=u,g=E(c*.25,24,68);switch(e.point){case"L1":return{x:a.x-u*g,y:a.y-f*g,anchorX:a.x,anchorY:a.y};case"L2":return{x:a.x+u*g,y:a.y+f*g,anchorX:a.x,anchorY:a.y};case"L3":return{x:o.x-u*g,y:o.y-f*g,anchorX:o.x,anchorY:o.y};case"L4":return{x:a.x+(u*.5-p*.8660254)*g,y:a.y+(f*.5-m*.8660254)*g,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(u*.5+p*.8660254)*g,y:a.y+(f*.5+m*.8660254)*g,anchorX:a.x,anchorY:a.y}}}function Di(e,t){let n=new Map,r=new Map;for(let c of e){let u=rn(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,p=[],m=n.get(c)??null;for(;m&&!f.has(m);)p.push(m),f.add(m),m=n.get(m)??null;return i.set(c,p),p},s=c=>{let u=a.get(o.get(c)??"");if(u)return u;let f=n.get(c)??null,p=t.get(c),m=c;return p?.placement&&p.placement.mode!=="free"&&f&&(m=s(f)),m};for(let c of e){l(c.id);let u=s(c.id),f=be(u);o.set(c.id,f),a.set(f,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:o,groupRoots:a}}function rn(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 Ri(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,p)=>{a=Math.min(a,f),l=Math.min(l,p),s=Math.max(s,f),c=Math.max(c,p)};for(let f of t)!f.hidden&&e.objectIds.includes(f.objectId)&&tn(f,u);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&en(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)&&nn(f,u,o);return!Number.isFinite(a)||!Number.isFinite(l)?ve(0,0,0,0):ve(a,l,s,c)}function Ci(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=rn(n,t);if(!i)break;let o=t.get(i);if(!o)break;n=o}return n.id}function on(e,t,n){return an(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function an(e,t,n,r,i,o,a,l){let s=Yi(o,a,l),c=s*2,u=i==="above"?18:12,f=i==="above"?8:12,p=e-s,m=e+s;return r==="start"?(p=e,m=e+c):r==="end"&&(p=e-c,m=e),{left:p,right:m,top:Math.min(t,n)-u,bottom:Math.max(t,n)+f}}function _i(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Vi(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Ne(e,t,n,r){let i=Ni(e.properties.radius,n,r);if(i!==null)return i;let o=n.bodyRadiusMultiplier;switch(e.type){case"star":return E((t===0?28:20)*o,n.minBodyRadius,n.maxBodyRadius);case"planet":return E(12*o,n.minBodyRadius,n.maxBodyRadius);case"moon":return E(7*o,n.minBodyRadius,n.maxBodyRadius);case"belt":return E(5*o,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return E(5*o,n.minBodyRadius,n.maxBodyRadius);case"comet":return E(6*o,n.minBodyRadius,n.maxBodyRadius);case"ring":return E(5*o,n.minBodyRadius,n.maxBodyRadius);case"craft":return E(5*o,n.minBodyRadius,n.maxBodyRadius);case"structure":return E(6*o,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return E(8*o,n.minBodyRadius,n.maxBodyRadius)}}function zi(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"craft":return t+1.5;case"structure":return t+2;default:return Math.min(t+r,n.maxBodyRadius+10)}}function ee(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*_r;case"pc":return e.value*Vr;case"kpc":return e.value*zr;case"re":return e.value*Dr/ge;case"rj":return e.value*Rr/ge;case"sol":return e.value*Cr/ge;default:return e.value}}function Bi(e,t,n){let r=ee(e??null);if(r===null||r<=0)return 0;if(n.pixelsPerMetric!==null){let i=r*n.pixelsPerMetric*t.freePlacementMultiplier;return t.bodyScaleMode==="strict"?Math.max(i,0):E(i,0,420)}return E(r*96*t.freePlacementMultiplier,0,420)}function Ni(e,t,n){let r=Ue(e);if(!r)return null;let i=ee(r);if(n.pixelsPerMetric!==null&&i!==null&&i>0){let a=i*n.pixelsPerMetric*t.bodyRadiusMultiplier;return t.bodyScaleMode==="strict"?Math.max(a,.1):E(Math.max(a,t.minBodyRadius),t.minBodyRadius,t.maxBodyRadius)}let o;switch(r.unit){case"sol":o=E(r.value*22,14,40);break;case"re":o=E(r.value*10,6,18);break;case"km":o=E(Math.log10(Math.max(r.value,1))*2.6,4,16);break;default:o=E(r.value*4,4,20);break}return E(o*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function Ui(e){return ee(Ue(e.properties.radius))}function Ue(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 $e(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function Yt(e,t,n,r,i,o,a){let l=sn(e,t,n,r,i,o,a,Kt);return l.length===0?"":l.map((s,c)=>`${c===0?"M":"L"} ${qt(s.x)} ${qt(s.y)}`).join(" ")}function sn(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(ln(e,t,n,r,i,u))}return s}function ln(e,t,n,r,i,o){let a=n*Math.cos(o),l=r*Math.sin(o),s=cn(a,l,i);return{x:e+s.x,y:t+s.y}}function cn(e,t,n){let r=He(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function Ie(e,t,n,r){let i=n==="isometric"?Xt*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function We(e,t,n){return t*1e3+e+n*.01}function E(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 de(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function be(e){return`${de(e)}-group`}function Wi(e){return typeof e=="string"&&e.trim()?e:void 0}function Yi(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 Gt(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function He(e){return e*Math.PI/180}function qt(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function un(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:Ji(e.system),info:Qi(e.system)}:null,r=e.objects.map(Hi);return Ki(r,e.events??[],t.activeEventId??null),{format:"worldorbit",version:"1.0",schemaVersion:e.version,theme:e.theme??null,system:n,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:e.events.map(Gi),trajectories:e.trajectories.map(Xi),objects:r}}function Hi(e){return{...e,trajectoryId:e.trajectoryId??null,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:Zi(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function Gi(e){return{...e,trajectoryId:e.trajectoryId??null,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(qi)}}function qi(e){return{objectId:e.objectId,placement:dn(e.placement),trajectorySegmentId:e.trajectorySegmentId??null,trajectoryManeuverId:e.trajectoryManeuverId??null,inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0,epoch:e.epoch??null,referencePlane:e.referencePlane??null}}function Xi(e){return structuredClone(e)}function dn(e){return e?structuredClone(e):null}function Ki(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=dn(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 Zi(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 Ji(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 Qi(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=eo(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 eo(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 fn=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,to=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),no=/^[A-Za-z][A-Za-z0-9+.-]*:/;function Z(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function fe(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function V(e,t,n){let r=e.match(fn);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=_(n);if(o?.unitFamily&&!Ae(o.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function pt(e){let t=e.match(fn);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Ge(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function J(e,t,n){let r=to.get(e.toLowerCase());if(r===void 0)throw d.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function pn(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 ro(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(no);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 mn(e,t,n){let r=_(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 J(xe(t,e,n),e,n);case"number":return Ge(xe(t,e,n),e,n);case"unit":return V(xe(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&ro(i,n),i}}}function mt(e,t,n){let r=_(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 gn=new Set(["star","planet","moon","asteroid","comet"]),io=332946.0487,oo=1047.3486,qe=1495978707e-1,ao=6371,so=695700,lo=63241.077,co=206264.806,uo=206264806;function gt(e,t){let n=[],r=new Map(e.objects.map(s=>[s.id,s])),i=new Set(e.groups.map(s=>s.id)),o=new Set(e.events.map(s=>s.id)),a=new Map(e.trajectories.map(s=>[s.id,s]));e.system||n.push(w("validate.system.required","Atlas documents must declare exactly one system."));let l=new Map;for(let[s,c]of[["group",e.groups.map(u=>u.id)],["viewpoint",e.system?.viewpoints.map(u=>u.id)??[]],["annotation",e.system?.annotations.map(u=>u.id)??[]],["relation",e.relations.map(u=>u.id)],["event",e.events.map(u=>u.id)],["trajectory",e.trajectories.map(u=>u.id)],["object",e.objects.map(u=>u.id)]])for(let u of c){let f=l.get(u);f?n.push(w("validate.id.duplicate",`Duplicate ${s} id "${u}" already used by ${f}.`)):l.set(u,s)}for(let s of e.relations)fo(s,r,n);for(let s of e.system?.viewpoints??[])po(s,i,o,t,n,r);for(let s of e.objects)mo(s,e.system,r,i,a,n);for(let s of e.events)ho(s,e.system,r,a,n);for(let s of e.trajectories)yo(s,r,n);return n}function fo(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 po(e,t,n,r,i,o){let a=e.filter;if(r==="2.1"||r==="2.5"||r==="2.6"){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`))}ko(e.projection,i,`viewpoint.${e.id}.projection`,e.id),So(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,a,o)}function mo(e,t,n,r,i,o){let a=e.placement,l=a?.mode==="orbit"?a:null,s=a?.mode==="orbit"?n.get(a.target)??null:null;if(e.groups)for(let c of e.groups)r.has(c)||o.push(j("validate.group.unknown",`Unknown group "${c}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&o.push(j("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&o.push(j("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),e.trajectoryId&&(i.has(e.trajectoryId)?yn(e)||o.push(w("validate.trajectory.object.invalidType",`Only craft or legacy ship-like structures may reference trajectories; found "${e.type}" on "${e.id}".`,e.id,"trajectory")):o.push(w("validate.trajectory.object.unknown",`Unknown trajectory "${e.trajectoryId}" on "${e.id}".`,e.id,"trajectory"))),l&&(n.has(l.target)||o.push(w("validate.orbit.target.unknown",`Unknown placement target "${l.target}" on "${e.id}".`,e.id,"orbit")),l.distance&&l.semiMajor&&o.push(w("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),l.phase&&!e.epoch&&!t?.epoch&&o.push(j("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),l.inclination&&!e.referencePlane&&!t?.referencePlane&&o.push(j("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),l.period&&!yt(s?.properties.mass)&&o.push(j("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),a?.mode==="surface"){let c=n.get(a.target);c?gn.has(c.type)||o.push(w("validate.surface.target.invalid",`Surface target "${a.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):o.push(w("validate.surface.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"surface"))}if(a?.mode==="at"&&(e.type!=="craft"&&e.type!=="structure"&&e.type!=="phenomenon"&&o.push(w("validate.at.objectType",`Only craft, structures, and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),Io(e,n,o)||o.push(w("validate.at.target.unknown",`Unknown at-reference target "${a.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let c=n.get(e.resonance.targetObjectId);c?(e.placement?.mode!=="orbit"||c.placement?.mode!=="orbit"||e.placement.target!==c.placement.target)&&o.push(j("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):o.push(w("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let c of e.deriveRules??[]){if(c.field!=="period"||c.strategy!=="kepler"){o.push(j("validate.derive.unsupported",`Unsupported derive rule "${c.field} ${c.strategy}" on "${e.id}".`,e.id,"derive"));continue}let u=hn(e,s);if(u===null){o.push(j("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}l?.period||o.push(ht("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Eo(u)}.`,e.id,"derive"))}for(let c of e.validationRules??[]){if(c.rule!=="kepler"){o.push(j("validate.rule.unsupported",`Unsupported validation rule "${c.rule}" on "${e.id}".`,e.id,"validate"));continue}let u=bn(l?.period),f=hn(e,s);if(u===null||f===null)continue;let p=Mo(e,"period");Math.abs(u-f)>p&&o.push(w("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function ho(e,t,n,r,i){let o=`event.${e.id}`,a=new Set;e.kind.trim()||i.push(w("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${o}.kind`)),typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(j("validate.event.epoch.empty",`Event "${e.id}" defines an empty epoch string.`,void 0,`${o}.epoch`)),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(j("validate.event.referencePlane.empty",`Event "${e.id}" defines an empty reference plane string.`,void 0,`${o}.referencePlane`)),e.trajectoryId&&!r.has(e.trajectoryId)&&i.push(w("validate.event.trajectory.unknown",`Unknown trajectory "${e.trajectoryId}" on event "${e.id}".`,void 0,`${o}.trajectory`)),!e.targetObjectId&&e.participantObjectIds.length===0&&i.push(w("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${o}.participants`)),e.targetObjectId&&(a.add(e.targetObjectId),n.has(e.targetObjectId)||i.push(w("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${o}.target`)));let l=new Set;for(let u of e.participantObjectIds){if(a.add(u),l.has(u)){i.push(j("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${u}".`,void 0,`${o}.participants`));continue}l.add(u),n.has(u)||i.push(w("validate.event.participants.unknown",`Unknown event participant "${u}" on "${e.id}".`,void 0,`${o}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&i.push(j("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${o}.target`)),e.positions.length===0&&i.push(j("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${o}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&a.size<3&&i.push(j("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${o}.participants`));let s=new Set;for(let u of e.positions){let f=`${o}.pose.${u.objectId}`;if(s.has(u.objectId)){i.push(w("validate.event.pose.duplicate",`Event "${e.id}" defines "${u.objectId}" more than once in positions.`,void 0,f));continue}s.add(u.objectId);let p=n.get(u.objectId);if(!p){i.push(w("validate.event.pose.object.unknown",`Unknown event pose object "${u.objectId}" on "${e.id}".`,void 0,f));continue}a.has(u.objectId)||i.push(j("validate.event.pose.unreferenced",`Event pose "${u.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,f)),go(u,p,e,t,n,r,i,f,e.id)}let c=[...a].filter(u=>!s.has(u));e.positions.length>0&&c.length>0&&i.push(j("validate.event.positions.partial",`Event "${e.id}" leaves ${c.length} referenced object(s) on their base placement.`,void 0,`${o}.positions`))}function go(e,t,n,r,i,o,a,l,s){let c=e.placement;if(!c){a.push(w("validate.event.pose.placement.required",`Event "${s}" pose "${e.objectId}" is missing a placement mode.`,void 0,l));return}if(e.trajectorySegmentId&&!vo(o,e.trajectorySegmentId)&&a.push(w("validate.event.pose.segment.unknown",`Unknown trajectory segment "${e.trajectorySegmentId}" on "${s}:${e.objectId}".`,void 0,`${l}.segment`)),e.trajectoryManeuverId&&!$o(o,e.trajectoryManeuverId)&&a.push(w("validate.event.pose.maneuver.unknown",`Unknown trajectory maneuver "${e.trajectoryManeuverId}" on "${s}:${e.objectId}".`,void 0,`${l}.maneuver`)),c.mode==="orbit"){i.has(c.target)||a.push(w("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${c.target}" on "${s}:${e.objectId}".`,void 0,`${l}.orbit`)),c.distance&&c.semiMajor&&a.push(w("validate.event.pose.orbit.distanceConflict",`Event "${s}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${l}.distance`)),c.phase&&!jo(r,t,n,e)&&a.push(j("validate.event.pose.phase.epochMissing",`Event "${s}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${l}.phase`)),c.inclination&&!Oo(r,t,n,e)&&a.push(j("validate.event.pose.inclination.referencePlaneMissing",`Event "${s}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${l}.inclination`)),c.period&&!yt(i.get(c.target)?.properties.mass)&&a.push(j("validate.event.pose.period.massMissing",`Event "${s}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${l}.period`));return}if(c.mode==="surface"){let u=i.get(c.target);u?gn.has(u.type)||a.push(w("validate.event.pose.surface.target.invalid",`Event surface target "${c.target}" on "${s}:${e.objectId}" is not surface-capable.`,void 0,`${l}.surface`)):a.push(w("validate.event.pose.surface.target.unknown",`Unknown event surface target "${c.target}" on "${s}:${e.objectId}".`,void 0,`${l}.surface`));return}if(c.mode==="at"){t.type!=="craft"&&t.type!=="structure"&&t.type!=="phenomenon"&&a.push(w("validate.event.pose.at.objectType",`Only craft, structures, and phenomena may use "at" placement in events; found "${t.type}" on "${s}:${e.objectId}".`,void 0,`${l}.at`));let u=c.reference;u.kind==="named"&&!i.has(u.name)?a.push(w("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${c.target}" on "${s}:${e.objectId}".`,void 0,`${l}.at`)):u.kind==="anchor"&&!i.has(u.objectId)?a.push(w("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${u.objectId}" on "${s}:${e.objectId}".`,void 0,`${l}.at`)):u.kind==="lagrange"&&(i.has(u.primary)?u.secondary&&!i.has(u.secondary)&&a.push(w("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${u.secondary}" on "${s}:${e.objectId}".`,void 0,`${l}.at`)):a.push(w("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${u.primary}" on "${s}:${e.objectId}".`,void 0,`${l}.at`)))}}function yo(e,t,n){if(e.craftObjectId){let r=t.get(e.craftObjectId);r?yn(r)||n.push(w("validate.trajectory.craft.invalidType",`Trajectory "${e.id}" targets "${e.craftObjectId}", which is not craft-like.`,void 0,`trajectory.${e.id}.craft`)):n.push(w("validate.trajectory.craft.unknown",`Unknown craft "${e.craftObjectId}" on trajectory "${e.id}".`,void 0,`trajectory.${e.id}.craft`))}for(let r of e.segments)bo(e.id,r,t,n)}function bo(e,t,n,r){let i=`trajectory.${e}.segment.${t.id}`;for(let[o,a]of[["from",t.fromObjectId],["to",t.toObjectId],["around",t.aroundObjectId]])a&&!n.has(a)&&r.push(w(`validate.trajectory.segment.${o}.unknown`,`Unknown ${o} object "${a}" on trajectory "${e}" segment "${t.id}".`,void 0,`${i}.${o}`));t.assist?.objectId&&!n.has(t.assist.objectId)&&r.push(w("validate.trajectory.segment.assist.unknown",`Unknown assist object "${t.assist.objectId}" on trajectory "${e}" segment "${t.id}".`,void 0,`${i}.assist`)),t.kind==="flyby"&&!t.assist?.objectId&&r.push(w("validate.trajectory.segment.assist.required",`Trajectory "${e}" segment "${t.id}" is a flyby and requires an "assist" object.`,void 0,`${i}.assist`)),(t.kind==="capture"||t.kind==="departure")&&!t.toObjectId&&!t.aroundObjectId&&r.push(w("validate.trajectory.segment.target.required",`Trajectory "${e}" segment "${t.id}" requires a target reference.`,void 0,`${i}.to`));for(let o of t.maneuvers)wo(e,t.id,o,r)}function wo(e,t,n,r){n.kind.trim()||r.push(w("validate.trajectory.maneuver.kind.required",`Trajectory "${e}" segment "${t}" maneuver "${n.id}" is missing a kind.`,void 0,`trajectory.${e}.segment.${t}.maneuver.${n.id}.kind`))}function yn(e){if(e.type==="craft")return!0;if(e.type!=="structure")return!1;let t=typeof e.properties.kind=="string"?e.properties.kind.toLowerCase():"";return t==="ship"||t==="probe"||t==="station"}function vo(e,t){for(let n of e.values()){let r=n.segments.find(i=>i.id===t);if(r)return r}return null}function $o(e,t){for(let n of e.values())for(let r of n.segments){let i=r.maneuvers.find(o=>o.id===t);if(i)return i}return null}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 hn(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=xo(n.semiMajor??n.distance),i=yt(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function xo(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*lo;case"pc":return e.value*co;case"kpc":return e.value*uo;case"re":return e.value*ao/qe;case"sol":return e.value*so/qe;default:return null}}function yt(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/io;case"mj":return t.value/oo;default:return null}}function bn(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 ko(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 So(e,t,n,r,i,o,a,l,s){if(!e)return;let c=`viewpoint.${i}.camera`;for(let[f,p]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])p!==null&&(!Number.isFinite(p)||f==="distance"&&p<=0)&&r.push(w("validate.viewpoint.camera.invalid",`Invalid camera ${f} "${String(p)}" 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(ht("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(ht("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,c))}function jo(e,t,n,r){return te(r?.epoch)??te(n?.epoch)??te(t.epoch)??te(e?.epoch)??null}function Oo(e,t,n,r){return te(r?.referencePlane)??te(n?.referencePlane)??te(t.referencePlane)??te(e?.referencePlane)??null}function te(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?bn(n)??0:0}function Eo(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 ht(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var To=new Set(["climate","habitability","settlement"]),Po=new Set(["departure","transfer","flyby","capture","stationkeeping","escape"]),Xe=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","trajectory"]){let t=_(e);t&&Xe.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},{key:"trajectory",inlineMode:"single",allowRepeat:!1}])Xe.set(e.key,{key:e.key,version:e.key==="trajectory"?"3.0":"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var Lo=new Set(Xe.keys()),vn=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane","segment","maneuver"]);function $n(e){return Ao(e)}function Ao(e,t){let n=xa(e),r=n.source.split(/\r?\n/),i=[],o=!1,a="2.0",l=null,s=null,c=[],u=[],f=[],p=[],m=[],g=new Map,y=!1,I=!1,O=new Set,h=new Set,b=new Set,S=new Set,B=new Set,P=new Set;for(let L=0;L<r.length;L++){let ie=r[L],X=L+1;if(!ie.trim())continue;let C=Ce(ie),K=Re(ie.slice(C),{line:X,columnOffset:C});if(K.length!==0){if(!o){a=Fo(K,X),o=!0,n.comments.length>0&&Se(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(C===0){s=Do(K,X,a,i,l,c,u,f,p,m,g,O,h,b,S,B,P,{sawDefaults:y,sawAtlas:I}),s.kind==="system"?l=s.system:s.kind==="defaults"?y=!0:s.kind==="atlas"&&(I=!0);continue}if(!s)throw new d("Indented line without parent atlas section",X,C+1);Wo(s,C,K,X)}}if(!o)throw new d('Missing required atlas schema header "schema 2.0" or "schema 3.0"');let q=c.map(L=>fa(L,a,i)),$=p.map(L=>pa(L,g.get(L.id)??[])),M=t??(a==="2.0-draft"?"2.0":a),F={format:"worldorbit",sourceVersion:"1.0",theme:null,system:l,groups:u,relations:f,events:$,trajectories:m,objects:q,diagnostics:i};if(M==="2.0-draft"){let L={...F,version:"2.0-draft",schemaVersion:"2.0-draft"};return L.diagnostics.push(...gt(L,a)),L}let G={...F,version:M,schemaVersion:M};return a==="2.0-draft"&&G.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".'}),G.diagnostics.push(...gt(G,a)),G}function Fo(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1","2.5","2.6","3.0"].includes(e[1].value.toLowerCase()))throw new d('Expected atlas header "schema 2.0", "schema 2.1", "schema 2.5", "schema 2.6", "schema 3.0", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.6"?"2.6":n==="3.0"?"3.0":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,p,m,g,y,I,O){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new d('Atlas section "system" may only appear once',t,e[0].column);return Ro(e,t,n,r);case"defaults":if(!i)throw new d('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(O.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(O.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 Co(e,t,i,f,n,r);case"annotation":if(!i)throw new d('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return _o(e,t,i,p);case"group":return W(n,r,"group",{line:t,column:e[0].column}),Vo(e,t,a,m);case"relation":return W(n,r,"relation",{line:t,column:e[0].column}),zo(e,t,l,g);case"event":return W(n,r,"event",{line:t,column:e[0].column}),Bo(e,t,s,u,y,n,r);case"trajectory":return pe(n,r,"trajectory",{line:t,column:e[0].column}),No(e,t,c,I,n,r);case"object":return Uo(e,t,n,r,o);default:throw new d(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function Ro(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 Co(e,t,n,r,i,o){if(e.length!==2)throw new d("Invalid viewpoint declaration",t,e[0]?.column??1);let a=Z(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:fe(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 _o(e,t,n,r){if(e.length!==2)throw new d("Invalid annotation declaration",t,e[0]?.column??1);let i=Z(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:fe(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=Z(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:fe(i),summary:"",color:null,tags:[],hidden:!1};return n.push(o),r.add(i),{kind:"group",group:o,seenFields:new Set}}function zo(e,t,n,r){if(e.length!==2)throw new d("Invalid relation declaration",t,e[0]?.column??1);let i=Z(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 Bo(e,t,n,r,i,o,a){if(e.length!==2)throw new d("Invalid event declaration",t,e[0]?.column??1);let l=Z(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:fe(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 No(e,t,n,r,i,o){if(e.length!==2)throw new d("Invalid trajectory declaration",t,e[0]?.column??1);let a=Z(e[1].value);if(!a)throw new d("Trajectory id must not be empty",t,e[1].column);if(r.has(a))throw new d(`Duplicate trajectory id "${a}"`,t,e[1].column);let l={id:a,label:fe(a),summary:null,craftObjectId:null,tags:[],color:null,hidden:!1,segments:[]};return n.push(l),r.add(a),{kind:"trajectory",trajectory:l,sourceSchemaVersion:i,diagnostics:o,seenFields:new Set,inSegment:!1,segmentIndent:null,activeSegment:null,activeSegmentSeenFields:new Set,inManeuver:!1,maneuverIndent:null,activeManeuver:null,activeManeuverSeenFields:new Set}}function Uo(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(!Le.has(l)||l==="system")throw new d(`Unknown object type "${o.value}"`,t,o.column);let s={objectType:l,id:a.value,fields:ua(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 Wo(e,t,n,r){switch(e.kind){case"system":Yo(e,n,r);return;case"defaults":Ho(e,n,r);return;case"atlas":Go(e,t,n,r);return;case"viewpoint":qo(e,t,n,r);return;case"annotation":Zo(e,n,r);return;case"group":Jo(e,n,r);return;case"relation":Qo(e,n,r);return;case"event":ea(e,t,n,r);return;case"trajectory":ta(e,t,n,r);return;case"object":oa(e,t,n,r);return}}function Yo(e,t,n){let r=Y(t,e.seenFields,n),i=k(t,n);switch(r){case"title":e.system.title=i;return;case"description":W(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":W(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":W(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 Ho(e,t,n){let r=Y(t,e.seenFields,n),i=k(t,n);switch(r){case"view":xn(i)&&se(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=In(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=kn(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 Go(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=Sn(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 qo(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){Xo(e,n,r);return}if(e.inFilter){Ko(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(se(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??wt();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=k(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":xn(o)&&se(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=In(o,r,n[0].column);return;case"preset":e.viewpoint.preset=kn(o,r,n[0].column);return;case"zoom":e.viewpoint.zoom=bt(o,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=re(o,r,n[0].column,"rotation");return;case"camera":se(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=ca(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=sa(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":W(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=z(n.slice(1),r,"events");return;default:throw new d(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function Xo(e,t,n){let r=Y(t,e.seenCameraFields,n),i=k(t,n),o=e.viewpoint.camera??wt();switch(r){case"azimuth":o.azimuth=re(i,n,t[0].column,"camera.azimuth");break;case"elevation":o.elevation=re(i,n,t[0].column,"camera.elevation");break;case"roll":o.roll=re(i,n,t[0].column,"camera.roll");break;case"distance":o.distance=bt(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 Ko(e,t,n){let r=Y(t,e.seenFilterFields,n),i=e.viewpoint.filter??la();switch(r){case"query":i.query=k(t,n);break;case"objecttypes":i.objectTypes=aa(t.slice(1),n);break;case"tags":i.tags=z(t.slice(1),n,"tags");break;case"groups":i.groupIds=z(t.slice(1),n,"groups");break;default:throw new d(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function Zo(e,t,n){switch(Y(t,e.seenFields,n)){case"label":e.annotation.label=k(t,n);return;case"target":e.annotation.targetObjectId=k(t,n);return;case"body":e.annotation.body=k(t,n);return;case"tags":e.annotation.tags=z(t.slice(1),n,"tags");return;default:throw new d(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function Jo(e,t,n){switch(Y(t,e.seenFields,n)){case"label":e.group.label=k(t,n);return;case"summary":e.group.summary=k(t,n);return;case"color":e.group.color=k(t,n);return;case"tags":e.group.tags=z(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=J(k(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 Qo(e,t,n){switch(Y(t,e.seenFields,n)){case"from":e.relation.from=k(t,n);return;case"to":e.relation.to=k(t,n);return;case"kind":e.relation.kind=k(t,n);return;case"label":e.relation.label=k(t,n);return;case"summary":e.relation.summary=k(t,n);return;case"tags":e.relation.tags=z(t.slice(1),n,"tags");return;case"color":e.relation.color=k(t,n);return;case"hidden":e.relation.hidden=J(k(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 ea(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")&&se(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),(n[0]?.value==="segment"||n[0]?.value==="maneuver")&&pe(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push(ia(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=k(n,r);return;case"label":e.event.label=k(n,r);return;case"summary":e.event.summary=k(n,r);return;case"trajectory":pe(e.sourceSchemaVersion,e.diagnostics,"event.trajectory",{line:r,column:n[0].column}),e.event.trajectoryId=k(n,r);return;case"target":e.event.targetObjectId=k(n,r);return;case"participants":e.event.participantObjectIds=z(n.slice(1),r,"participants");return;case"timing":e.event.timing=k(n,r);return;case"visibility":e.event.visibility=k(n,r);return;case"epoch":se(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=k(n,r);return;case"referenceplane":se(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=k(n,r);return;case"tags":e.event.tags=z(n.slice(1),r,"tags");return;case"color":e.event.color=k(n,r);return;case"hidden":e.event.hidden=J(k(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 ta(e,t,n,r){if(e.activeManeuver&&t<=(e.maneuverIndent??0)&&(e.activeManeuver=null,e.maneuverIndent=null,e.activeManeuverSeenFields.clear(),e.inManeuver=!1),e.activeSegment&&t<=(e.segmentIndent??0)&&(e.activeSegment=null,e.segmentIndent=null,e.activeSegmentSeenFields.clear(),e.inSegment=!1),e.activeManeuver){ra(e,n,r);return}if(e.activeSegment){if(n[0]?.value.toLowerCase()==="maneuver"){if(n.length!==2)throw new d("Invalid trajectory maneuver declaration",r,n[0]?.column??1);let a=Z(n[1].value);if(!a)throw new d("Trajectory maneuver id must not be empty",r,n[1].column);if(e.activeSegment.maneuvers.some(s=>s.id===a))throw new d(`Duplicate trajectory maneuver id "${a}"`,r,n[1].column);let l={id:a,kind:"burn",label:null,epoch:null,notes:[]};e.activeSegment.maneuvers.push(l),e.activeManeuver=l,e.inManeuver=!0,e.maneuverIndent=t,e.activeManeuverSeenFields=new Set;return}na(e,n,r);return}if(n[0]?.value.toLowerCase()==="segment"){if(n.length!==2)throw new d("Invalid trajectory segment declaration",r,n[0]?.column??1);let a=Z(n[1].value);if(!a)throw new d("Trajectory segment id must not be empty",r,n[1].column);if(e.trajectory.segments.some(s=>s.id===a))throw new d(`Duplicate trajectory segment id "${a}"`,r,n[1].column);let l={id:a,kind:"transfer",label:null,summary:null,fromObjectId:null,toObjectId:null,aroundObjectId:null,assist:null,epoch:null,notes:[],maneuvers:[]};e.trajectory.segments.push(l),e.activeSegment={id:a,fields:[],maneuvers:l.maneuvers,assist:null,location:{line:r,column:n[0].column}},e.inSegment=!0,e.segmentIndent=t,e.activeSegmentSeenFields=new Set;return}let i=Y(n,e.seenFields,r),o=k(n,r);switch(i){case"label":e.trajectory.label=o;return;case"summary":e.trajectory.summary=o;return;case"craft":e.trajectory.craftObjectId=o;return;case"tags":e.trajectory.tags=z(n.slice(1),r,"tags");return;case"color":e.trajectory.color=o;return;case"hidden":e.trajectory.hidden=J(o,"hidden",{line:r,column:n[0].column});return;default:throw new d(`Unknown trajectory field "${n[0].value}"`,r,n[0].column)}}function na(e,t,n){let r=e.activeSegment;if(!r)return;let i=Y(t,e.activeSegmentSeenFields,n),o=k(t,n),a=e.trajectory.segments.find(l=>l.id===r.id);switch(i){case"kind":{let l=o.toLowerCase();if(!Po.has(l))throw new d(`Unknown trajectory segment kind "${o}"`,n,t[0].column);a.kind=l;return}case"label":a.label=o;return;case"summary":a.summary=o;return;case"from":a.fromObjectId=o;return;case"to":a.toObjectId=o;return;case"around":a.aroundObjectId=o;return;case"assist":a.assist={objectId:o,notes:[]};return;case"epoch":a.epoch=o;return;case"periapsis":a.periapsis=V(o,{line:n,column:t[0].column},"periapsis");return;case"apoapsis":a.apoapsis=V(o,{line:n,column:t[0].column},"apoapsis");return;case"inclination":a.inclination=V(o,{line:n,column:t[0].column},"inclination");return;case"duration":a.duration=V(o,{line:n,column:t[0].column},"duration");return;case"deltav":a.deltaV=V(o,{line:n,column:t[0].column});return;case"phaseangle":a.phaseAngle=V(o,{line:n,column:t[0].column},"phaseAngle");return;case"turnangle":a.turnAngle=V(o,{line:n,column:t[0].column},"turnAngle");return;case"energy":a.energy=V(o,{line:n,column:t[0].column});return;case"notes":a.notes=z(t.slice(1),n,"notes");return;default:throw new d(`Unknown trajectory segment field "${t[0].value}"`,n,t[0].column)}}function ra(e,t,n){let r=e.activeManeuver;if(!r)return;let i=Y(t,e.activeManeuverSeenFields,n),o=k(t,n);switch(i){case"kind":r.kind=o;return;case"label":r.label=o;return;case"epoch":r.epoch=o;return;case"deltav":r.deltaV=V(o,{line:n,column:t[0].column});return;case"duration":r.duration=V(o,{line:n,column:t[0].column},"duration");return;case"notes":r.notes=z(t.slice(1),n,"notes");return;default:throw new d(`Unknown trajectory maneuver field "${t[0].value}"`,n,t[0].column)}}function ia(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(!vn.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 oa(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"||To.has(i)){i!=="info"&&W(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=Sn(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(da(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 k(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 aa(e,t){return z(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function sa(e,t,n,r){let i={};for(let o of z(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&&W(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[l]=a)}return i}function z(e,t,n){if(e.length===0)throw new d(`Missing value for atlas field "${n}"`,t,1);let r=e.map(i=>i.value).filter(Boolean);if(r.length===0)throw new d(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function In(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 xn(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function kn(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 bt(e,t,n,r){let i=re(e,t,n,r);if(i<=0)throw new d(`Field "${r}" must be greater than zero`,t,n);return i}function re(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 la(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function wt(){return{azimuth:null,elevation:null,roll:null,distance:null}}function ca(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}:wt(),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=re(c,t,a.column,"camera.azimuth");break;case"elevation":r.elevation=re(c,t,a.column,"camera.elevation");break;case"roll":r.roll=re(c,t,a.column,"camera.roll");break;case"distance":r.distance=bt(c,t,a.column,"camera.distance");break;default:throw new d(`Unknown viewpoint camera field "${a.value}"`,t,a.column)}}return r}function ua(e,t,n,r,i){let o=[],a=0;for(;a<e.length;){let l=e[a],s=ke(l.value);if(!s)throw new d(`Unknown field "${l.value}"`,t,l.column);s.version==="2.1"?W(r,i,l.value,{line:t,column:l.column}):s.version==="3.0"&&pe(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&&!Lo.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 En(o,n),o}function da(e,t,n,r,i){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);let o=ke(e[0].value);if(!o)throw new d(`Unknown field "${e[0].value}"`,t,e[0].column);o.version==="2.1"?W(r,i,e[0].value,{line:t,column:e[0].column}):o.version==="3.0"&&pe(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 En([a],n),a}function Sn(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 fa(e,t,n){let r=jn(e.fields),i=On(r),o=ha(e.objectType,r),a=$a(r.get("groups")?.[0]),l=ae(r.get("epoch")?.[0]),s=ae(r.get("referencePlane")?.[0]),c=r.has("tidalLock")?J(H(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?ba(r.get("resonance")[0]):void 0,f=ya(r),p=r.get("derive")?.map(S=>wa(S)),m=r.get("validate")?.map(S=>({rule:H(S)})),g=r.has("locked")?[...new Set(r.get("locked").flatMap(S=>S.values))]:void 0,y=r.get("tolerance")?.map(S=>va(S)),I=ga(e.typedBlockEntries),O=Mn(e.infoEntries,"info"),h=ae(r.get("trajectory")?.[0]),b={type:e.objectType,id:e.id,properties:o,placement:i,info:O};return a.length>0&&(b.groups=a),l&&(b.epoch=l),s&&(b.referencePlane=s),c!==void 0&&(b.tidalLock=c),u&&(b.resonance=u),f&&(b.renderHints=f),p?.length&&(b.deriveRules=p),m?.length&&(b.validationRules=m),g?.length&&(b.lockedFields=g),y?.length&&(b.tolerances=y),I&&Object.keys(I).length>0&&(b.typedBlocks=I),h&&(b.trajectoryId=h),Se(t,"2.1")&&(b.groups||b.epoch||b.referencePlane||b.tidalLock!==void 0||b.resonance||b.renderHints||b.deriveRules?.length||b.validationRules?.length||b.lockedFields?.length||b.tolerances?.length||b.typedBlocks||b.trajectoryId)&&W(t,n,e.id,e.location),b.trajectoryId&&pe(t,n,`${e.id}.trajectory`,e.location),b}function pa(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>ma(n))}}function ma(e){let t=jn(e.fields,"event-pose"),n=On(t);return{objectId:e.objectId,placement:n,trajectorySegmentId:ae(t.get("segment")?.[0]),trajectoryManeuverId:ae(t.get("maneuver")?.[0]),inner:ne(t.get("inner")?.[0],"inner"),outer:ne(t.get("outer")?.[0],"outer"),epoch:ae(t.get("epoch")?.[0]),referencePlane:ae(t.get("referencePlane")?.[0])}}function jn(e,t="object"){let n=new Map;for(let r of e){let i=ke(r.key);if(!i&&!vn.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 On(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:H(t),distance:ne(e.get("distance")?.[0],"distance"),semiMajor:ne(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:Ia(e.get("eccentricity")?.[0],"eccentricity"),period:ne(e.get("period")?.[0],"period"),angle:ne(e.get("angle")?.[0],"angle"),inclination:ne(e.get("inclination")?.[0],"inclination"),phase:ne(e.get("phase")?.[0],"phase")};if(n){let a=H(n);return{mode:"at",target:a,reference:pn(a,n.location)}}if(r)return{mode:"surface",target:H(r)};if(i){let a=H(i),l=pt(a);return{mode:"free",distance:l??void 0,descriptor:l?void 0:a}}return null}function ha(e,t){let n={};for(let[r,i]of t.entries()){let o=i[0],a=ke(r);!o||!a?.legacySchema||a.legacySchema.placement||(mt(r,e,o.location),n[r]=mn(r,o.values,o.location))}return n}function Mn(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 ga(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=Mn(r,n))}return t}function ya(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=J(H(n),"renderLabel",n.location)),r&&(t.renderOrbit=J(H(r),"renderOrbit",r.location)),i&&(t.renderPriority=Ge(H(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function ba(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 wa(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 va(e){if(e.values.length!==2)throw d.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=pt(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function $a(e){return e?[...new Set(e.values)]:[]}function ae(e){return e&&e.values.join(" ").trim()||null}function ne(e,t){return e?V(H(e),e.location,t):void 0}function Ia(e,t){return e?Ge(H(e),t,e.location):void 0}function H(e){return xe(e.values,e.key,e.location)}function ke(e){return Xe.get(e)}function En(e,t){for(let n of e){let r=ke(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){mt(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 W(e,t,n,r){Se(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 se(e,t,n,r){Se(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 pe(e,t,n,r){Se(e,"3.0")&&t.push({code:"parse.schema30.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 3.0; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function Se(e,t){return wn(e)<wn(t)}function wn(e){switch(e){case"2.0-draft":return 0;case"2.0":return 1;case"2.1":return 2;case"2.5":return 3;case"2.6":return 4;case"3.0":return 5;default:return 6}}function xa(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
|
-
`&&c!=="\r"&&(t[
|
|
3
|
-
`?(a++,
|
|
4
|
-
`&&t[
|
|
5
|
-
`?(a++,
|
|
6
|
-
`}var
|
|
7
|
-
`&&o!=="\r"&&(t[i]=" ");continue}if(!
|
|
8
|
-
`&&t[
|
|
9
|
-
`)}var
|
|
10
|
-
<text class="wo-subtitle" x="56" y="88">${
|
|
11
|
-
<text class="wo-meta" x="56" y="${e.height-42}">${
|
|
1
|
+
"use strict";var lt=Object.defineProperty;var dn=Object.getOwnPropertyDescriptor;var fn=Object.getOwnPropertyNames;var pn=Object.prototype.hasOwnProperty;var mn=(e,t)=>{for(var r in t)lt(e,r,{get:t[r],enumerable:!0})},hn=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of fn(t))!pn.call(e,i)&&i!==r&<(e,i,{get:()=>t[i],enumerable:!(n=dn(t,i))||n.enumerable});return e};var gn=e=>hn(lt({},"__esModule",{value:!0}),e);var Os={};mn(Os,{default:()=>Ss});module.exports=gn(Os);var E=require("obsidian");var f=class e extends Error{line;column;constructor(t,r,n){let i=r===void 0?"":` (line ${r}${n===void 0?"":`, column ${n}`})`;super(`${t}${i}`),this.name="WorldOrbitError",this.line=r,this.column=n}static fromLocation(t,r){return new e(t,r?.line,r?.column)}};var be=["system","star","planet","moon","belt","asteroid","comet","ring","craft","structure","phenomenon"],W=be.filter(e=>e!=="system"),yn=["star","planet","moon","asteroid","comet","craft","structure","phenomenon"],zt=["craft","structure","phenomenon"],te=["star","planet","moon","belt","asteroid","comet","ring","craft","structure","phenomenon"],bn=["star","planet","moon","belt","asteroid","comet","ring","craft","structure","phenomenon"];function x(e,t){return{key:e,...t}}var Re=new Set(be),Bt=new Map([x("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:te}),x("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:te,unitFamily:"distance"}),x("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:te,unitFamily:"distance"}),x("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:te}),x("period",{kind:"unit",placement:!0,arity:"single",objectTypes:te,unitFamily:"duration"}),x("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:te,unitFamily:"angle"}),x("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:te,unitFamily:"angle"}),x("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:te,unitFamily:"angle"}),x("at",{kind:"string",placement:!0,arity:"single",objectTypes:zt}),x("surface",{kind:"string",placement:!0,arity:"single",objectTypes:zt}),x("free",{kind:"string",placement:!0,arity:"single",objectTypes:bn}),x("kind",{kind:"string",placement:!1,arity:"single",objectTypes:W}),x("class",{kind:"string",placement:!1,arity:"single",objectTypes:W}),x("culture",{kind:"string",placement:!1,arity:"single",objectTypes:W}),x("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:be}),x("color",{kind:"string",placement:!1,arity:"single",objectTypes:be}),x("image",{kind:"string",placement:!1,arity:"single",objectTypes:yn}),x("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:be}),x("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:W,unitFamily:"radius"}),x("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:W,unitFamily:"mass"}),x("density",{kind:"unit",placement:!1,arity:"single",objectTypes:W,unitFamily:"generic"}),x("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:W,unitFamily:"generic"}),x("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:W,unitFamily:"generic"}),x("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:W}),x("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),x("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),x("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),x("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),x("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),x("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),x("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),x("on",{kind:"string",placement:!1,arity:"single",objectTypes:W}),x("source",{kind:"string",placement:!1,arity:"single",objectTypes:W}),x("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:W,unitFamily:"duration"}),x("trajectory",{kind:"string",placement:!1,arity:"single",objectTypes:["craft","structure"]})].map(e=>[e.key,e])),wn=new Set(Bt.keys());function V(e){return Bt.get(e)}function Nt(e){return wn.has(e)}function Wt(e,t){return e.objectTypes.includes(t)}function Ce(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}}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)?$/,vn=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),$n=/^[A-Za-z][A-Za-z0-9+.-]*:/;function ct(e){let t=null,r=[],n=e.theme?In(e.theme):null;for(let i of e.objects){let o=jn(i);if(i.objectType==="system"){if(t)throw f.fromLocation("Only one system object is allowed",i.location);t=o}else r.push(o)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",theme:n,system:t,groups:[],relations:[],events:[],trajectories:[],objects:r}}function In(e){let t={};for(let r of e.blocks){let n=Yt(r.fields);t[r.target]=xn(n)}return{preset:e.preset,styles:t}}function xn(e){let t={};for(let[r,n]of e.entries()){if(n.values.length===1){let i=n.values[0];if(i==="true"){t[r]=!0;continue}if(i==="false"){t[r]=!1;continue}let o=Number(i);if(!Number.isNaN(o)&&i.trim()!==""){t[r]=o;continue}}t[r]=n.values.join(" ")}return t}function jn(e){let t=[...e.inlineFields,...e.blockFields];kn(e.objectType,t);let r=Yt(t),n=Sn(e.objectType,r),i=On(r),o=En(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:n,info:o}}function kn(e,t){for(let r of t){let n=V(r.key);if(!n)throw f.fromLocation(`Unknown field "${r.key}"`,r.location);if(!Wt(n,e))throw f.fromLocation(`Field "${r.key}" is not valid on "${e}"`,r.location);if(n.arity==="single"&&r.values.length!==1)throw f.fromLocation(`Field "${r.key}" expects exactly one value`,r.location)}}function Yt(e){let t=new Map;for(let r of e){if(t.has(r.key))throw f.fromLocation(`Duplicate field "${r.key}"`,r.location);t.set(r.key,r)}return t}function Sn(e,t){let r=t.has("orbit"),n=t.has("at"),i=t.has("surface"),o=t.has("free"),a=[r,n,i,o].filter(Boolean).length;if(a>1){let s=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw f.fromLocation("Object has multiple placement modes",s?.location)}if(e==="system"&&a>0)throw f.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(r)return{mode:"orbit",target:Ve(t,"orbit"),distance:de(t,"distance"),semiMajor:de(t,"semiMajor"),eccentricity:An(t,"eccentricity"),period:de(t,"period"),angle:de(t,"angle"),inclination:de(t,"inclination"),phase:de(t,"phase")};if(n){let s=_e(t,"at"),l=Ve(t,"at");return{mode:"at",target:l,reference:Pn(l,s.location)}}if(i)return{mode:"surface",target:Ve(t,"surface")};if(o){let s=Ve(t,"free"),l=Ln(s);return{mode:"free",distance:l??void 0,descriptor:l?void 0:s}}return null}function On(e){let t={};for(let[r,n]of e.entries()){let i=V(r);if(!(!i||i.placement))switch(i.kind){case"list":t[r]=n.values;break;case"boolean":t[r]=Fn(n);break;case"number":t[r]=qt(fe(n),r,n.location);break;case"unit":t[r]=Ht(fe(n),n.location,r);break;case"string":t[r]=Mn(r,n);break}}return t}function Mn(e,t){let r=t.values.join(" ").trim();return e==="image"&&Tn(r,t.location),r}function Tn(e,t){if(!e)throw f.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw f.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let r=e.match($n);if(!r)return;let n=r[0].slice(0,-1).toLowerCase();if(n!=="http"&&n!=="https")throw f.fromLocation(`Field "image" does not support the "${n}" scheme`,t)}function En(e){let t={};for(let r of e){if(r.key in t)throw f.fromLocation(`Duplicate info key "${r.key}"`,r.location);t[r.key]=r.value}return t}function Pn(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw f.fromLocation(`Invalid special position "${e}"`,t);let r=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:r[2],point:r[3]};let n=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:null,point:n[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw f.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 Ht(e,t,r){let n=e.match(Ut);if(!n)throw f.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(n[1]),unit:n[2]??null};if(r){let o=V(r);if(o?.unitFamily&&!Ce(o.unitFamily,i.unit))throw f.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${r}"`,t)}return i}function Ln(e){let t=e.match(Ut);return t?{value:Number(t[1]),unit:t[2]??null}:null}function de(e,t){if(!e.has(t))return;let r=_e(e,t);return Ht(fe(r),r.location,t)}function An(e,t){if(!e.has(t))return;let r=_e(e,t);return qt(fe(r),t,r.location)}function qt(e,t,r){let n=Number(e);if(!Number.isFinite(n))throw f.fromLocation(`Invalid numeric value "${e}" for "${t}"`,r);return n}function Fn(e){let t=fe(e).toLowerCase(),r=vn.get(t);if(r===void 0)throw f.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return r}function _e(e,t){let r=e.get(t);if(!r)throw new f(`Missing value for key "${t}"`);return r}function Ve(e,t){return fe(_e(e,t))}function fe(e){if(e.values.length!==1)throw f.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}function ze(e,t={}){let r=[],n=t.columnOffset??0,i="",o=null,a=!1,s=!1,l=null,c=()=>{o!==null&&(r.push({value:i,column:o,quoted:a}),i="",o=null,a=!1)};for(let u=0;u<e.length;u++){let d=e[u],p=n+u+1;if(s&&d==="\\"){let h=e[u+1];if(h==='"'||h==="\\"){i+=h,u++;continue}}if(d==='"'){s?s=!1:(o===null&&(o=p),a=!0,l=p,s=!0);continue}if(!s&&/\s/.test(d)){c();continue}o===null&&(o=p),i+=d}if(s)throw new f("Unclosed quote in line",t.line,l??n+e.length);return c(),r}function Be(e){return e.match(/^\s*/)?.[0].length??0}function ut(e){let t=e.split(/\r?\n/),r=[],n=null,i=null,o=!1,a=!1,s=null,l=null,c=null,u=null;for(let d=0;d<t.length;d++){let p=t[d],h=d+1;if(!p.trim())continue;let g=Be(p),y=ze(p.slice(g),{line:h,columnOffset:g});if(y.length!==0){if(g===0){if(o=!1,a=!1,s=null,l=null,c=null,u=null,y.length>=1&&y[0].value==="theme"){a=!0,l=0,n={type:"theme",preset:y.length>=2?y[1].value:null,blocks:[],location:{line:h,column:y[0].column}};continue}let b=Dn(y,h);r.push(b),i=b;continue}if(a){if(y.length>=2&&y[0].value==="preset"&&(!c||g<=c)){n&&(n.preset=y[1].value);continue}u&&c!==null&&g>c?u.fields.push(Vn(y,h)):(c=g,u={type:"theme-block",target:y[0].value,fields:[],location:{line:h,column:y[0].column}},n?.blocks.push(u));continue}if(!i)throw new f("Indented line without parent object",h,g+1);if(y.length===1&&y[0].value==="info"){o=!0,s=g;continue}o&&g<=(s??0)&&(o=!1),o?i.infoEntries.push(_n(y,h)):i.blockFields.push(Cn(y,h))}}return{type:"document",theme:n,objects:r}}function Dn(e,t){if(e.length<2)throw new f("Invalid object declaration",t,e[0]?.column??1);let[r,n,...i]=e;if(!Re.has(r.value))throw new f(`Unknown object type "${r.value}"`,t,r.column);return{type:"object",objectType:r.value,name:n.value,inlineFields:Rn(i,t),blockFields:[],infoEntries:[],location:{line:t,column:r.column}}}function Rn(e,t){let r=[],n=0;for(;n<e.length;){let i=e[n],o=V(i.value);if(!o)throw new f(`Unknown field "${i.value}"`,t,i.column);n++;let a=[];if(o.arity==="multiple")for(;n<e.length&&!Nt(e[n].value);)a.push(e[n]),n++;else{let s=e[n];s&&(a.push(s),n++)}if(a.length===0)throw new f(`Missing value for field "${i.value}"`,t,i.column);r.push({type:"field",key:i.value,values:a.map(s=>s.value),location:{line:t,column:i.column}})}return r}function Cn(e,t){if(e.length<2)throw new f("Invalid field line",t,e[0]?.column??1);if(!V(e[0].value))throw new f(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(r=>r.value),location:{line:t,column:e[0].column}}}function Vn(e,t){if(e.length<2)throw new f("Invalid theme field line",t,e[0]?.column??1);return{type:"field",key:e[0].value,values:e.slice(1).map(r=>r.value),location:{line:t,column:e[0].column}}}function _n(e,t){if(e.length<2)throw new f("Invalid info entry",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}}}var zn=new Set(["star","planet","moon","asteroid","comet"]);function dt(e){let t=new Set,r=new Map;for(let n of e.objects){if(t.has(n.id))throw new f(`Duplicate object id "${n.id}"`);t.add(n.id),r.set(n.id,n)}for(let n of e.objects)if(n.placement){if((n.placement.mode==="orbit"||n.placement.mode==="surface")&&!t.has(n.placement.target))throw new f(`Unknown placement target "${n.placement.target}" on "${n.id}"`);if(n.placement.mode==="surface"){let i=r.get(n.placement.target);if(!i||!zn.has(i.type))throw new f(`Surface target "${n.placement.target}" on "${n.id}" is not surface-capable`)}n.placement.mode==="at"&&(n.placement.reference.kind==="lagrange"&&Bn(n,n.placement.reference,t),n.placement.reference.kind==="anchor"&&Nn(n,n.placement.reference,t))}}function Bn(e,t,r){if(!r.has(t.primary))throw new f(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!r.has(t.secondary))throw new f(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function Nn(e,t,r){if(!r.has(t.objectId))throw new f(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function pe(e,t,r=`${t}.failed`){return e instanceof f?{code:r,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:r,severity:"error",source:t,message:e.message}:{code:r,severity:"error",source:t,message:String(e)}}var we=1495978707e-1,Wn=6371,Un=71492,Yn=695700,Hn=63241.077,qn=206264.806,Gn=206264806,tr=.68,Xn=.2,rr=28;function Ke(e,t={}){let r=Jn(t),n=r.width,i=r.height,o=r.padding,a=Zn(e),s=ei(e,t.projection),l=bt(t.camera??null),c=yt(s,l),u=oi(a),d=ni(a,t.scaleModel,t.bodyScaleMode),p=e.system?.id??null,h=t.activeEventId??null,g=Kn(e.objects,e.events??[],h),y=ai(g,n,i,o,u,d),b=new Map(g.map(v=>[v.id,v])),S=Gi(g,b),I=new Map,m=[],j=[],B=[],L=[],Z=[],$=new Map,M=new Map;for(let v of g){let N=v.placement;if(!N){B.push(v);continue}if(N.mode==="orbit"){Jt(M,N.target,v);continue}if(N.mode==="surface"){Jt($,N.target,v);continue}if(N.mode==="at"){Z.push(v);continue}L.push(v)}let R=L.length>0?n*.42:n/2,X=i/2,A={orbitChildren:M,surfaceChildren:$,objectMap:b,spacingFactor:u,projection:c,scaleModel:d,sceneMetricScale:y},se=B.find(v=>v.type==="star")??B[0]??null;se&&mt(se,R,X,0,I,m,j,A);let J=B.filter(v=>v.id!==se?.id);if(J.length>0){let v=Math.min(n,i)*.28*u*d.orbitDistanceMultiplier;J.forEach((N,F)=>{let st=je(F,J.length,-Math.PI/2),le=ke(st,v,c,1);mt(N,R+le.x,X+le.y,0,I,m,j,A)})}L.forEach((v,N)=>{let F=n-o-140-eo(v.placement?.mode==="free"?v.placement.distance:void 0,d,y),st=Math.max(76,(i-o*2-180)/Math.max(1,L.length)*u)*d.freePlacementMultiplier,le=o+92+N*st;I.set(v.id,{object:v,x:F,y:le,radius:qe(v,0,d,y),sortKey:Xe(F,le,0)}),j.push({object:v,groupId:S.groupIds.get(v.id)??null,x1:F-60,y1:le,x2:F-18,y2:le,mode:"free"}),Ye(v,I,m,j,A,1)}),Z.forEach((v,N)=>{if(I.has(v.id)||!v.placement||v.placement.mode!=="at")return;let F=Hi(v.placement.reference,I,b,N,Z.length,n,i,o,A);I.set(v.id,{object:v,x:F.x,y:F.y,radius:qe(v,2,d,y),sortKey:Xe(F.x,F.y,2),anchorX:F.anchorX,anchorY:F.anchorY}),F.anchorX!==void 0&&F.anchorY!==void 0&&j.push({object:v,groupId:S.groupIds.get(v.id)??null,x1:F.anchorX,y1:F.anchorY,x2:F.x,y2:F.y,mode:"at"}),Ye(v,I,m,j,A,2)});let C=[...I.values()].map(v=>si(v,d,S)),Q=m.map(v=>li(v,S.groupIds.get(v.object.id)??null)),Fe=j.map(v=>ci(v)),De=ui(C,n,i,d.labelMultiplier),Vt=bi(e,C),at=wi(e.events??[],C,h),_t=vi(e,C,at,t),an=hi(Q,_t,Vt,at,Fe,C,De),sn=gi(C,Q,Fe,De,S,d.labelMultiplier),ln=yi(e,C),cn=Si(e,s,r.preset,S,b),un=Ci(n,i,C,Q,Fe,De,d.labelMultiplier);return{width:n,height:i,padding:o,renderPreset:r.preset,projection:s,renderProjection:c,camera:l,scaleModel:d,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:ri(s,c,a,l),systemId:p,viewMode:s,layoutPreset:a,metadata:{format:e.format,version:e.version,view:s,renderProjection:c,scale:String(e.system?.properties.scale??a),units:String(e.system?.properties.units??"mixed"),preset:r.preset??"custom","body.scaleMode":d.bodyScaleMode,...l?.azimuth!==null?{"camera.azimuth":String(l?.azimuth)}:{},...l?.elevation!==null?{"camera.elevation":String(l?.elevation)}:{},...l?.roll!==null?{"camera.roll":String(l?.roll)}:{},...l?.distance!==null?{"camera.distance":String(l?.distance)}:{}},contentBounds:un,layers:an,groups:sn,semanticGroups:ln,viewpoints:cn,events:at,activeEventId:h,trajectories:_t,objects:C,orbitVisuals:Q,relations:Vt,leaders:Fe,labels:De}}function gt(e,t,r){let n=Ze(r),i=Math.cos(n),o=Math.sin(n),a=e.x-t.x,s=e.y-t.y;return{x:t.x+a*i-s*o,y:t.y+a*o+s*i}}function Kn(e,t,r){let n=e.map(s=>structuredClone(s));if(!r)return n;let i=t.find(s=>s.id===r);if(!i)return n;let o=new Map(n.map(s=>[s.id,s])),a=new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds,...i.positions.map(s=>s.objectId)]);for(let s of a){let l=o.get(s);l&&(i.epoch&&(l.epoch=i.epoch),i.referencePlane&&(l.referencePlane=i.referencePlane))}for(let s of i.positions){let l=o.get(s.objectId);l&&(s.placement&&(l.placement=structuredClone(s.placement)),s.inner&&(l.properties.inner={...s.inner}),s.outer&&(l.properties.outer={...s.outer}),s.epoch&&(l.epoch=s.epoch),s.referencePlane&&(l.referencePlane=s.referencePlane))}return n}function Zn(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 Jn(e){let t=Qn(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function Qn(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 ei(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let r=String(e.system?.properties.view??"topdown").toLowerCase();return ar(r)??"topdown"}function yt(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 bt(e){if(!e)return null;let t={azimuth:ft(e.azimuth),elevation:ft(e.elevation),roll:ft(e.roll),distance:ti(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function ft(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function ti(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function ri(e,t,r,n){let i=[`${Qt(e)} view`,`${Qt(r)} layout`];if(e!==t&&i.push(`2D ${t} fallback`),n){let o=[n.azimuth!==null?`az ${n.azimuth}`:null,n.elevation!==null?`el ${n.elevation}`:null,n.roll!==null?`roll ${n.roll}`:null,n.distance!==null?`dist ${n.distance}`:null].filter(Boolean);o.length>0&&i.push(`camera ${o.join(" / ")}`)}return i.join(" - ")}function ni(e,t,r){return{...ii(e),...r?{bodyScaleMode:r}:{},...t}}function ii(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36,bodyScaleMode:"readable"};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48,bodyScaleMode:"readable"};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40,bodyScaleMode:"readable"}}}function oi(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function ai(e,t,r,n,i,o){let a=[],s=[];for(let h of e){let g=ro(h);g!==null&&g>0&&s.push(g);let y=h.placement;if(y){if(y.mode==="orbit"){let b=ne(y.semiMajor??y.distance??null);b!==null&&b>0&&a.push(b);continue}if(y.mode==="free"){let b=ne(y.distance??null);b!==null&&b>0&&a.push(b)}}}let l=Math.max(...a,0),c=Math.max(...s,0),u=Math.max(l,c*6,0),d=u+Math.max(Math.sqrt(u),c*2,l>0?.25:0);return d<=0?{pixelsPerMetric:null,hasExplicitScale:!1}:{pixelsPerMetric:Math.max(Math.min(t,r)/2-n-24,120)*i*o.orbitDistanceMultiplier/d,hasExplicitScale:!0}}function si(e,t,r){let{object:n,x:i,y:o,radius:a,sortKey:s,anchorX:l,anchorY:c}=e,u=n.renderHints?.renderPriority??0;return{renderId:K(n.id),objectId:n.id,object:n,parentId:r.parentIds.get(n.id)??null,ancestorIds:r.ancestorIds.get(n.id)??[],childIds:r.childIds.get(n.id)??[],groupId:r.groupIds.get(n.id)??null,semanticGroupIds:[...n.groups??[]],x:i,y:o,radius:a,visualRadius:Qi(n,a,t),sortKey:s+u*.001,anchorX:l,anchorY:c,label:n.id,secondaryLabel:n.type==="structure"||n.type==="craft"?String(n.properties.kind??n.type):n.type,fillColor:no(n.properties.color),imageHref:typeof n.properties.image=="string"&&n.properties.image.trim()?n.properties.image:void 0,hidden:n.properties.hidden===!0}}function li(e,t){return{renderId:`${K(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 ci(e){return{renderId:`${K(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 ui(e,t,r,n){let i=[],o=[],a=new Map(e.map(l=>[l.objectId,l])),s=[...e].filter(l=>!l.hidden&&l.object.renderHints?.renderLabel!==!1).sort(di);for(let l of s){let c=fi(l,a,o,t,r,n)??ir(l,nr(l,a.get(l.parentId??"")??null,r),0,n);o.push(fr(l,c,n)),i.push({renderId:`${l.renderId}-label`,objectId:l.objectId,object:l.object,groupId:l.groupId,semanticGroupIds:[...l.semanticGroupIds],label:l.label,secondaryLabel:l.secondaryLabel,x:c.x,y:c.labelY,secondaryY:c.secondaryY,textAnchor:c.textAnchor,direction:c.direction,hidden:l.hidden})}return i}function di(e,t){let r=Gt(e)-Gt(t);if(r!==0)return r;let n=(t.object.renderHints?.renderPriority??0)-(e.object.renderHints?.renderPriority??0);return n!==0?n: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"craft":case"structure":case"phenomenon":return 5}}function fi(e,t,r,n,i,o){for(let a of pi(e,t,n,i)){let s=a==="left"||a==="right"?4:6;for(let l=0;l<=s;l+=1){let c=ir(e,a,l,o),u=fr(e,c,o);if(!r.some(d=>Zi(d,u)))return c}}return null}function pi(e,t,r,n){let i=e.parentId?t.get(e.parentId)??null:null,o=nr(e,i,n),a=o==="below"?"above":"below",s=mi(e,i,r),l=s==="right"?"left":"right";return e.object.type==="craft"||e.object.type==="structure"||e.object.type==="phenomenon"||e.object.placement?.mode==="at"||e.object.placement?.mode==="surface"||e.object.placement?.mode==="free"?[s,o,l,a]:[o,s,a,l]}function nr(e,t,r){return t&&Math.abs(e.y-t.y)>6?e.y>=t.y?"below":"above":e.y>r*.62?"above":"below"}function mi(e,t,r){return t&&Math.abs(e.x-t.x)>6?e.x>=t.x?"right":"left":e.x>=r/2?"right":"left"}function ir(e,t,r,n){let i=14*n;switch(t){case"above":{let o=e.y-(e.radius+18*n+r*i);return{x:e.x,labelY:o,secondaryY:o-16*n,textAnchor:"middle",direction:t}}case"below":{let o=e.y+e.radius+18*n+r*i;return{x:e.x,labelY:o,secondaryY:o+16*n,textAnchor:"middle",direction:t}}case"left":{let o=e.x-(e.visualRadius+16*n+r*i),a=e.y-4*n;return{x:o,labelY:a,secondaryY:a+16*n,textAnchor:"end",direction:t}}case"right":{let o=e.x+e.visualRadius+16*n+r*i,a=e.y-4*n;return{x:o,labelY:a,secondaryY:a+16*n,textAnchor:"start",direction:t}}}}function hi(e,t,r,n,i,o,a){let s=e.filter(c=>!c.hidden&&!!c.backArcPath).map(c=>c.renderId),l=e.filter(c=>!c.hidden).map(c=>c.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:i.filter(c=>!c.hidden).map(c=>c.renderId)},{id:"orbits-back",renderIds:s},{id:"orbits-front",renderIds:l},{id:"trajectories",renderIds:t.filter(c=>!c.hidden).flatMap(c=>[c.renderId,...c.waypoints.filter(u=>!u.hidden).map(u=>u.renderId)])},{id:"relations",renderIds:r.filter(c=>!c.hidden).map(c=>c.renderId)},{id:"events",renderIds:n.filter(c=>!c.hidden).map(c=>c.renderId)},{id:"objects",renderIds:o.filter(c=>!c.hidden).map(c=>c.renderId)},{id:"labels",renderIds:a.filter(c=>!c.hidden).map(c=>c.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function gi(e,t,r,n,i,o){let a=new Map,s=l=>{if(!l)return null;let c=a.get(l);if(c)return c;let u=i.groupRoots.get(l)??null,d={renderId:l,rootObjectId:u,label:u??l,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:xe(0,0,0,0)};return a.set(l,d),d};for(let l of e){let c=s(l.groupId);c&&!l.hidden&&c.objectIds.push(l.objectId)}for(let l of t){let c=s(l.groupId);c&&!l.hidden&&c.orbitIds.push(l.objectId)}for(let l of r){let c=s(l.groupId);c&&!l.hidden&&c.leaderIds.push(l.objectId)}for(let l of n){let c=s(l.groupId);c&&!l.hidden&&c.labelIds.push(l.objectId)}for(let l of a.values())l.contentBounds=Xi(l,e,t,r,n,o);return[...a.values()].sort((l,c)=>l.label.localeCompare(c.label))}function yi(e,t){return[...e.groups].map(r=>({id:r.id,label:r.label,summary:r.summary,color:r.color,tags:[...r.tags],hidden:r.hidden,objectIds:t.filter(n=>!n.hidden&&n.semanticGroupIds.includes(r.id)).map(n=>n.objectId)})).sort((r,n)=>r.label.localeCompare(n.label))}function bi(e,t){let r=new Map(t.map(n=>[n.objectId,n]));return e.relations.map(n=>{let i=r.get(n.from),o=r.get(n.to);return{renderId:`${K(n.id)}-relation`,relationId:n.id,relation:n,fromObjectId:n.from,toObjectId:n.to,x1:i?.x??0,y1:i?.y??0,x2:o?.x??0,y2:o?.y??0,hidden:n.hidden||!i||!o||i.hidden||o.hidden}}).sort((n,i)=>n.relation.id.localeCompare(i.relation.id))}function wi(e,t,r){let n=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=>n.get(c)).filter(Boolean),s=a.length>0?a.reduce((c,u)=>c+u.x,0)/a.length:0,l=a.length>0?a.reduce((c,u)=>c+u.y,0)/a.length:0;return{renderId:`${K(i.id)}-event`,eventId:i.id,event:i,objectIds:o,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:s,y:l,hidden:i.hidden||a.length===0||a.every(c=>c.hidden)||r!==null&&i.id!==r}}).sort((i,o)=>i.event.id.localeCompare(o.event.id))}function vi(e,t,r,n){let i=new Map(t.map(o=>[o.objectId,o]));return e.trajectories.map(o=>$i(o,i,r,n)).sort((o,a)=>o.trajectoryId.localeCompare(a.trajectoryId))}function $i(e,t,r,n){let i=e.craftObjectId?t.get(e.craftObjectId)??null:null,o=xi(e,n),a=e.stroke??e.color??i?.fillColor??null,s=e.strokeWidth??2.4,l=n.showTrajectoryWaypoints??e.showWaypoints??!0,c=e.labelMode??(n.showTrajectoryLabels===!1?"hidden":"waypoint"),u=[],d=[],p=new Set,h=i;i&&p.add(i.objectId),e.segments.forEach((g,y)=>{let b=Ii(e,g,y,o,t,h,l);b.path&&u.push(b.path),b.objectIds.forEach(S=>p.add(S)),d.push(...b.waypoints),h=b.lastAnchor??h});for(let g of r.filter(y=>y.event.trajectoryId===e.id)){let y=g.targetObjectId?t.get(g.targetObjectId)??null:g.objectIds.map(b=>t.get(b)??null).find(Boolean)??null;y&&(d.push({renderId:`${K(`${e.id}-${g.eventId}`)}-waypoint`,trajectoryId:e.id,segmentId:null,maneuverId:null,objectId:y.objectId,x:y.x,y:y.y,label:g.event.label??g.event.id,dateLabel:g.event.epoch??null,hidden:e.hidden||g.hidden||!l}),p.add(y.objectId))}return{renderId:`${K(e.id)}-trajectory`,trajectoryId:e.id,trajectory:e,craftObjectId:e.craftObjectId,mode:o,path:u.join(" "),stroke:a,strokeWidth:s,marker:e.marker??"arrow",labelMode:c,showWaypoints:l,objectIds:[...p],waypoints:d,hidden:e.hidden||u.length===0}}function Ii(e,t,r,n,i,o,a){let s=Ne(t.fromObjectId,i)??o,l=Ne(t.assist?.objectId??t.aroundObjectId??null,i),c=Ne(t.toObjectId,i)??Ne(t.aroundObjectId,i)??l??s;if(!s||!c)return{path:"",objectIds:[],waypoints:[],lastAnchor:o};let u=[s.objectId,c.objectId];l&&u.push(l.objectId);let d=e.hidden||t.renderHidden===!0||s.hidden||c.hidden,p=[],h=t.waypointLabel??t.label??sr(t.id),g=t.waypointDate??t.epoch??null;a&&(r===0&&p.push(pt(e.id,t.id,null,s,s.label,null,d)),l&&l.objectId!==s.objectId&&l.objectId!==c.objectId&&p.push(pt(e.id,t.id,null,l,h,g,d)),p.push(pt(e.id,t.id,null,c,h,g,d)));let y=n==="solver"?ji(s,Xt(s,c,l,r),c,Math.max(10,Math.round((t.sampleDensity??1)*14))):null,b=Xt(s,c,l,r),S=n==="solver"?ki(y??[s,c]):`M ${re(s.x)} ${re(s.y)} Q ${re(b.x)} ${re(b.y)} ${re(c.x)} ${re(c.y)}`;return t.maneuvers.forEach((I,m)=>{if(!a)return;let j=or(s,b,c,(m+1)/(t.maneuvers.length+1));p.push({renderId:`${K(`${e.id}-${t.id}-${I.id}`)}-waypoint`,trajectoryId:e.id,segmentId:t.id,maneuverId:I.id,objectId:null,x:j.x,y:j.y,label:I.label??I.kind,dateLabel:I.epoch??null,hidden:d})}),{path:S,objectIds:[...new Set(u)],waypoints:p,lastAnchor:c}}function pt(e,t,r,n,i,o,a){return{renderId:`${K(`${e}-${t??n.objectId}-${r??n.objectId}`)}-waypoint`,trajectoryId:e,segmentId:t,maneuverId:r,objectId:n.objectId,x:n.x,y:n.y,label:i,dateLabel:o,hidden:a}}function xi(e,t){let r=t.trajectoryMode??e.renderMode??"auto";return r!=="auto"?r:e.segments.filter(i=>i.fromObjectId||i.toObjectId||i.assist?.objectId||i.aroundObjectId).length>0?"solver":"illustrative"}function Ne(e,t){return e?t.get(e)??null:null}function Xt(e,t,r,n){if(r)return{x:r.x,y:r.y};let i=t.x-e.x,o=t.y-e.y,a=Math.max(Math.hypot(i,o),1),s=Math.min(Math.max(a*.18,26),120)*(n%2===0?1:-1),l=-o/a,c=i/a;return{x:(e.x+t.x)/2+l*s,y:(e.y+t.y)/2+c*s}}function ji(e,t,r,n){let i=[];for(let o=0;o<=n;o+=1)i.push(or(e,t,r,o/n));return i}function or(e,t,r,n){let i=1-n;return{x:i*i*e.x+2*i*n*t.x+n*n*r.x,y:i*i*e.y+2*i*n*t.y+n*n*r.y}}function ki(e){return e.length===0?"":e.map((t,r)=>`${r===0?"M":"L"} ${re(t.x)} ${re(t.y)}`).join(" ")}function re(e){return Number.isFinite(e)?e.toFixed(2):"0"}function Si(e,t,r,n,i){let o=Oi(e,t,r),a=new Map;for(let[c,u]of Object.entries(e.system?.info??{})){if(!c.startsWith("viewpoint."))continue;let[d,p,...h]=c.split(".");if(d!=="viewpoint"||!p||h.length===0)continue;let g=Di(p);if(!g)continue;let y=h.join(".").toLowerCase(),b=a.get(g)??{id:g};Mi(b,y,u,e,t,r,n,i),a.set(g,b)}let s=[...a.values()].map(c=>Ti(c,t,r,i)).filter(Boolean),l=s.findIndex(c=>c.id===o.id);return l>=0?s.splice(l,1,{...o,...s[l],layers:{...o.layers,...s[l].layers},filter:s[l].filter??o.filter,generated:!1}):s.unshift(o),s.sort((c,u)=>c.id==="overview"?-1:u.id==="overview"?1:c.label.localeCompare(u.label))}function Oi(e,t,r){let n=e.system?.title??e.system?.properties.title,i=n?`${String(n)} Overview`:"Overview",o=bt(null),a=yt(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:r,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function Mi(e,t,r,n,i,o,a,s){let l=r.trim();switch(t){case"label":case"title":l&&(e.label=l);return;case"summary":case"description":l&&(e.summary=l);return;case"focus":case"object":l&&(e.focus=l);return;case"select":case"selection":l&&(e.select=l);return;case"events":e.eventIds=Ie(l);return;case"projection":case"view":e.projection=ar(l)??i;return;case"preset":e.preset=Pi(l)??o;return;case"rotation":case"angle":e.rotationDeg=ve(l)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??Ue(),azimuth:ve(l)};return;case"camera.elevation":e.camera={...e.camera??Ue(),elevation:ve(l)};return;case"camera.roll":e.camera={...e.camera??Ue(),roll:ve(l)};return;case"camera.distance":e.camera={...e.camera??Ue(),distance:Kt(l)};return;case"zoom":case"scale":e.scale=Kt(l);return;case"layers":e.layers=Li(l);return;case"query":e.filter={...e.filter??We(),query:l||null};return;case"types":case"objecttypes":e.filter={...e.filter??We(),objectTypes:Ai(l)};return;case"tags":e.filter={...e.filter??We(),tags:Ie(l)};return;case"groups":e.filter={...e.filter??We(),groupIds:Fi(l,n,a,s)};return}}function Ti(e,t,r,n){let i=e.focus&&n.has(e.focus)?e.focus:null,o=e.select&&n.has(e.select)?e.select:i,a=Ei(e.filter),s=e.label?.trim()||sr(e.id),l=e.projection??t,c=bt(e.camera??null),u=yt(l,c);return{id:e.id,label:s,summary:e.summary?.trim()||Ri(s,i,a),objectId:i,selectedObjectId:o,eventIds:[...new Set(e.eventIds??[])],projection:l,renderProjection:u,camera:c,preset:e.preset??r,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:a,generated:!1}}function We(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Ue(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Ei(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 ar(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function Pi(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function ve(e){let t=Number(e);return Number.isFinite(t)?t:null}function Kt(e){let t=ve(e);return t!==null&&t>0?t:null}function Li(e){let t={};for(let r of Ie(e)){let n=!r.startsWith("-")&&!r.startsWith("!"),i=r.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){t["orbits-back"]=n,t["orbits-front"]=n;continue}(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="relations"||i==="events"||i==="objects"||i==="labels"||i==="metadata"||i==="trajectories")&&(t[i]=n)}return t}function Ai(e){return Ie(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="craft"||t==="structure"||t==="phenomenon")}function Fi(e,t,r,n){return Ie(e).map(i=>t.schemaVersion==="2.1"||t.schemaVersion==="2.5"||t.schemaVersion==="2.6"||t.groups.some(o=>o.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:r.groupIds.has(i)?r.groupIds.get(i)??$e(i):(n.has(i),$e(i)))}function Ie(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Di(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function sr(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Ri(e,t,r){let n=[e];return t&&n.push(`focus ${t}`),r?.objectTypes.length&&n.push(r.objectTypes.join("/")),r?.tags.length&&n.push(`tags ${r.tags.join(", ")}`),r?.query&&n.push(`query "${r.query}"`),n.join(" - ")}function Ci(e,t,r,n,i,o,a){let s=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,d=(p,h)=>{s=Math.min(s,p),l=Math.min(l,h),c=Math.max(c,p),u=Math.max(u,h)};for(let p of n)p.hidden||lr(p,d);for(let p of i)p.hidden||(d(p.x1,p.y1),d(p.x2,p.y2));for(let p of r)p.hidden||cr(p,d);for(let p of o)p.hidden||ur(p,d,a);return!Number.isFinite(s)||!Number.isFinite(l)?xe(0,0,e,t):xe(s,l,c,u)}function lr(e,t){let r=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-r,e.cy-e.radius-r),t(e.cx+e.radius+r,e.cy+e.radius+r);return}let n=e.rx??e.radius??0,i=e.ry??e.radius??0,o=mr(e.cx,e.cy,n,i,e.rotationDeg,0,Math.PI*2,rr*2);for(let a of o)t(a.x-r,a.y-r),t(a.x+r,a.y+r)}function xe(e,t,r,n){return{minX:e,minY:t,maxX:r,maxY:n,width:r-e,height:n-t,centerX:e+(r-e)/2,centerY:t+(n-t)/2}}function cr(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 ur(e,t,r){let n=pr(e.x,e.y,e.secondaryY,e.textAnchor,e.direction,e.label,e.secondaryLabel,r);t(n.left,n.top),t(n.right,n.bottom)}function mt(e,t,r,n,i,o,a,s){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:r,radius:qe(e,n,s.scaleModel,s.sceneMetricScale),sortKey:Xe(t,r,n)}),Ye(e,i,o,a,s,n+1))}function Ye(e,t,r,n,i,o){let a=t.get(e.id);if(!a)return;let s=[...i.orbitChildren.get(e.id)??[]].sort(Vi),l=_i(s,a.radius,i.spacingFactor,i.scaleModel,i.sceneMetricScale),c=Ni(s,l);s.forEach((d,p)=>{let h=zi(d,p,s.length,a,l,c[p]??l.innerPx,i);r.push({object:d,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}),mt(d,h.objectX,h.objectY,o,t,r,n,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((d,p)=>{let h=je(p,u.length,-Math.PI/3),g=28*i.spacingFactor,y=ke(h,a.radius,i.projection,i.projection==="isometric"?.9:1),b=ke(h,a.radius+g,i.projection,i.projection==="isometric"?.9:1),S=a.x+y.x,I=a.y+y.y,m=a.x+b.x,j=a.y+b.y;t.set(d.id,{object:d,x:m,y:j,radius:qe(d,o+1,i.scaleModel,i.sceneMetricScale),sortKey:Xe(m,j,o+1),anchorX:S,anchorY:I}),n.push({object:d,groupId:i.objectMap.has(d.id)?$e(Ki(d,i.objectMap)):null,x1:S,y1:I,x2:m,y2:j,mode:"surface"}),Ye(d,t,r,n,i,o+1)})}function Vi(e,t){let r=He(e),n=He(t);return r!==null&&n!==null&&r!==n?r-n:r!==null&&n===null?-1:r===null&&n!==null?1:e.id.localeCompare(t.id)}function _i(e,t,r,n,i){let o=e.map(h=>He(h)),a=o.filter(h=>h!==null),s=n.bodyScaleMode==="strict"?Math.max(2,8*r*n.orbitDistanceMultiplier):(e.length>2?54:64)*r*n.orbitDistanceMultiplier*.42,l=t+Math.max(s*1.2,24*r),c=(e.length>2?54:64)*r*n.orbitDistanceMultiplier;if(a.length===0)return{metrics:o,minMetric:0,maxMetric:0,metricSpread:0,innerPx:l,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:s,pixelsPerMetric:i.pixelsPerMetric};let u=Math.min(...a),d=Math.max(...a),p=d-u;return{metrics:o,minMetric:u,maxMetric:d,metricSpread:p,innerPx:l,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:s,pixelsPerMetric:i.pixelsPerMetric}}function zi(e,t,r,n,i,o,a){let s=e.placement,l=e.type==="belt"||e.type==="ring";if(!s||s.mode!=="orbit"){let $=i.innerPx+t*i.stepPx;return{kind:"circle",cx:n.x,cy:n.y,radius:$,rotationDeg:0,band:l,bandThickness:l?12*a.scaleModel.ringThicknessMultiplier:void 0,objectX:n.x,objectY:n.y-$}}let c=T(typeof s.eccentricity=="number"?s.eccentricity:0,0,.92),u=o,d=Math.max(u*Math.sqrt(1-c*c),u*.18),p=ht(s.inclination)??0,h=a.projection==="isometric"?Math.max(Xn,Math.cos(Ze(p)))*tr:1,g=Math.max(d*h,u*.14),y=ht(s.angle)??0,b=u*c,S=gr(-b,0,y),I=n.x+S.x,m=n.y+S.y,j=Ui(s.phase,t,r),B=hr(I,m,u,g,y,j),L=a.projection==="topdown"&&c<=1e-4&&Math.abs(y)<=1e-4,Z=l?Yi(e,u,i,a.scaleModel):void 0;return{kind:L?"circle":"ellipse",cx:L?n.x:I,cy:L?n.y:m,radius:L?u:void 0,rx:L?void 0:u,ry:L?void 0:g,rotationDeg:y,band:l,bandThickness:Z,frontArcPath:a.projection==="isometric"||l?Zt(I,m,u,g,y,0,Math.PI):void 0,backArcPath:a.projection==="isometric"||l?Zt(I,m,u,g,y,Math.PI,Math.PI*2):void 0,objectX:B.x,objectY:B.y}}function Bi(e,t){return t.pixelsPerMetric!==null?e*t.pixelsPerMetric:t.innerPx+t.stepPx*Wi(Math.max(e,0)+1)}function Ni(e,t){let r=[];return e.forEach((n,i)=>{let o=He(n),a=t.innerPx+i*t.stepPx,s=o===null?a:Bi(o,t),l=i===0?t.innerPx:(r[i-1]??t.innerPx)+t.minimumGapPx;r.push(Math.max(s,l))}),r}function He(e){return!e.placement||e.placement.mode!=="orbit"?null:ne(e.placement.semiMajor??e.placement.distance??null)}function Wi(e){return Math.log(e)/Math.log(2)}function Ui(e,t,r){let n=e?ht(e):null;return n!==null?Ze(n-90):je(t,r,-Math.PI/2)}function Yi(e,t,r,n){let i=ne(Ge(e.properties.inner)),o=ne(Ge(e.properties.outer));if(i!==null&&o!==null){let s=Math.abs(o-i);if(r.pixelsPerMetric!==null){let c=s*r.pixelsPerMetric;return n.bodyScaleMode==="strict"?Math.max(c*n.ringThicknessMultiplier,1):T(Math.max(c*n.ringThicknessMultiplier,8),8,54)}if(r.metricSpread>0)return T(s/r.metricSpread*r.pixelSpread*n.ringThicknessMultiplier,8,54);let l=Math.max(Math.max(i,o),1e-4);return T(s/l*t*.75*n.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*n.ringThicknessMultiplier}function Hi(e,t,r,n,i,o,a,s,l){if(e.kind==="lagrange")return qi(e,t,r,o,a);if(e.kind==="anchor"){let c=t.get(e.objectId);if(c){let u=je(n,i,Math.PI/5),d=(c.radius+36)*l.scaleModel.labelMultiplier,p=ke(u,d,l.projection,l.projection==="isometric"?.92:1);return{x:c.x+p.x,y:c.y+p.y,anchorX:c.x,anchorY:c.y}}}if(e.kind==="named"){let c=t.get(e.name);if(c){let u=je(n,i,Math.PI/6),d=(c.radius+36)*l.scaleModel.labelMultiplier,p=ke(u,d,l.projection,l.projection==="isometric"?.92:1);return{x:c.x+p.x,y:c.y+p.y,anchorX:c.x,anchorY:c.y}}}return{x:o-s-170,y:a-s-86-n*58*l.scaleModel.freePlacementMultiplier}}function qi(e,t,r,n,i){let o=e.secondary?t.get(e.primary):Ji(e.primary,t,r),a=t.get(e.secondary??e.primary);if(!o||!a)return{x:n*.7,y:i*.25};let s=a.x-o.x,l=a.y-o.y,c=Math.hypot(s,l)||1,u=s/c,d=l/c,p=-d,h=u,g=T(c*.25,24,68);switch(e.point){case"L1":return{x:a.x-u*g,y:a.y-d*g,anchorX:a.x,anchorY:a.y};case"L2":return{x:a.x+u*g,y:a.y+d*g,anchorX:a.x,anchorY:a.y};case"L3":return{x:o.x-u*g,y:o.y-d*g,anchorX:o.x,anchorY:o.y};case"L4":return{x:a.x+(u*.5-p*.8660254)*g,y:a.y+(d*.5-h*.8660254)*g,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(u*.5+p*.8660254)*g,y:a.y+(d*.5+h*.8660254)*g,anchorX:a.x,anchorY:a.y}}}function Gi(e,t){let r=new Map,n=new Map;for(let c of e){let u=dr(c,t);if(r.set(c.id,u),u){let d=n.get(u);d?d.push(c.id):n.set(u,[c.id])}n.has(c.id)||n.set(c.id,[])}let i=new Map,o=new Map,a=new Map,s=c=>{let u=i.get(c);if(u)return u;let d=new Set,p=[],h=r.get(c)??null;for(;h&&!d.has(h);)p.push(h),d.add(h),h=r.get(h)??null;return i.set(c,p),p},l=c=>{let u=a.get(o.get(c)??"");if(u)return u;let d=r.get(c)??null,p=t.get(c),h=c;return p?.placement&&p.placement.mode!=="free"&&d&&(h=l(d)),h};for(let c of e){s(c.id);let u=l(c.id),d=$e(u);o.set(c.id,d),a.set(d,u)}return{parentIds:r,childIds:n,ancestorIds:i,groupIds:o,groupRoots:a}}function dr(e,t){let r=e.placement;if(!r)return null;switch(r.mode){case"orbit":case"surface":return t.has(r.target)?r.target:null;case"at":switch(r.reference.kind){case"anchor":return t.has(r.reference.objectId)?r.reference.objectId:null;case"named":return t.has(r.reference.name)?r.reference.name:null;case"lagrange":return r.reference.secondary&&t.has(r.reference.secondary)?r.reference.secondary:t.has(r.reference.primary)?r.reference.primary:null}case"free":return null}}function Xi(e,t,r,n,i,o){let a=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=(d,p)=>{a=Math.min(a,d),s=Math.min(s,p),l=Math.max(l,d),c=Math.max(c,p)};for(let d of t)!d.hidden&&e.objectIds.includes(d.objectId)&&cr(d,u);for(let d of r)!d.hidden&&e.orbitIds.includes(d.objectId)&&lr(d,u);for(let d of n)!d.hidden&&e.leaderIds.includes(d.objectId)&&(u(d.x1,d.y1),u(d.x2,d.y2));for(let d of i)!d.hidden&&e.labelIds.includes(d.objectId)&&ur(d,u,o);return!Number.isFinite(a)||!Number.isFinite(s)?xe(0,0,0,0):xe(a,s,l,c)}function Ki(e,t){let r=e,n=new Set;for(;r.placement&&r.placement.mode!=="free"&&!n.has(r.id);){n.add(r.id);let i=dr(r,t);if(!i)break;let o=t.get(i);if(!o)break;r=o}return r.id}function fr(e,t,r){return pr(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,r)}function pr(e,t,r,n,i,o,a,s){let l=io(o,a,s),c=l*2,u=i==="above"?18:12,d=i==="above"?8:12,p=e-l,h=e+l;return n==="start"?(p=e,h=e+c):n==="end"&&(p=e-c,h=e),{left:p,right:h,top:Math.min(t,r)-u,bottom:Math.max(t,r)+d}}function Zi(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Ji(e,t,r){let n=r.get(e);return!n?.placement||n.placement.mode!=="orbit"?t.get(e):t.get(n.placement.target)}function qe(e,t,r,n){let i=to(e.properties.radius,r,n);if(i!==null)return i;let o=r.bodyRadiusMultiplier;switch(e.type){case"star":return T((t===0?28:20)*o,r.minBodyRadius,r.maxBodyRadius);case"planet":return T(12*o,r.minBodyRadius,r.maxBodyRadius);case"moon":return T(7*o,r.minBodyRadius,r.maxBodyRadius);case"belt":return T(5*o,r.minBodyRadius,r.maxBodyRadius);case"asteroid":return T(5*o,r.minBodyRadius,r.maxBodyRadius);case"comet":return T(6*o,r.minBodyRadius,r.maxBodyRadius);case"ring":return T(5*o,r.minBodyRadius,r.maxBodyRadius);case"craft":return T(5*o,r.minBodyRadius,r.maxBodyRadius);case"structure":return T(6*o,r.minBodyRadius,r.maxBodyRadius);case"phenomenon":return T(8*o,r.minBodyRadius,r.maxBodyRadius)}}function Qi(e,t,r){let n=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"craft":return t+1.5;case"structure":return t+2;default:return Math.min(t+n,r.maxBodyRadius+10)}}function ne(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/we;case"m":return e.value/1e3/we;case"ly":return e.value*Hn;case"pc":return e.value*qn;case"kpc":return e.value*Gn;case"re":return e.value*Wn/we;case"rj":return e.value*Un/we;case"sol":return e.value*Yn/we;default:return e.value}}function eo(e,t,r){let n=ne(e??null);if(n===null||n<=0)return 0;if(r.pixelsPerMetric!==null){let i=n*r.pixelsPerMetric*t.freePlacementMultiplier;return t.bodyScaleMode==="strict"?Math.max(i,0):T(i,0,420)}return T(n*96*t.freePlacementMultiplier,0,420)}function to(e,t,r){let n=Ge(e);if(!n)return null;let i=ne(n);if(r.pixelsPerMetric!==null&&i!==null&&i>0){let a=i*r.pixelsPerMetric*t.bodyRadiusMultiplier;return t.bodyScaleMode==="strict"?Math.max(a,.1):T(Math.max(a,t.minBodyRadius),t.minBodyRadius,t.maxBodyRadius)}let o;switch(n.unit){case"sol":o=T(n.value*22,14,40);break;case"re":o=T(n.value*10,6,18);break;case"km":o=T(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:o=T(n.value*4,4,20);break}return T(o*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function ro(e){return ne(Ge(e.properties.radius))}function Ge(e){return!e||typeof e!="object"||!("value"in e)?null:e}function ht(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function je(e,t,r){return t<=1?r:r+e*Math.PI*2/t}function Zt(e,t,r,n,i,o,a){let s=mr(e,t,r,n,i,o,a,rr);return s.length===0?"":s.map((l,c)=>`${c===0?"M":"L"} ${er(l.x)} ${er(l.y)}`).join(" ")}function mr(e,t,r,n,i,o,a,s){let l=[];for(let c=0;c<=s;c+=1){let u=o+(a-o)*c/s;l.push(hr(e,t,r,n,i,u))}return l}function hr(e,t,r,n,i,o){let a=r*Math.cos(o),s=n*Math.sin(o),l=gr(a,s,i);return{x:e+l.x,y:t+l.y}}function gr(e,t,r){let n=Ze(r);return{x:e*Math.cos(n)-t*Math.sin(n),y:e*Math.sin(n)+t*Math.cos(n)}}function ke(e,t,r,n){let i=r==="isometric"?tr*n:n;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function Xe(e,t,r){return t*1e3+e+r*.01}function T(e,t,r){return Math.min(Math.max(e,t),r)}function Jt(e,t,r){let n=e.get(t);n?n.push(r):e.set(t,[r])}function K(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function $e(e){return`${K(e)}-group`}function no(e){return typeof e=="string"&&e.trim()?e:void 0}function io(e,t,r){let n=e.length*4.6*r+18,i=t.length*3.9*r+18;return Math.max(n,i,24)}function Qt(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Ze(e){return e*Math.PI/180}function er(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function yr(e,t={}){let r=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:fo(e.system),info:po(e.system)}:null,n=e.objects.map(oo);return co(n,e.events??[],t.activeEventId??null),{format:"worldorbit",version:"1.0",schemaVersion:e.version,theme:e.theme??null,system:r,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:e.events.map(ao),trajectories:e.trajectories.map(lo),objects:n}}function oo(e){return{...e,trajectoryId:e.trajectoryId??null,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,r])=>[t,{...r??{}}])):void 0,properties:uo(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function ao(e){return{...e,trajectoryId:e.trajectoryId??null,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(so)}}function so(e){return{objectId:e.objectId,placement:br(e.placement),trajectorySegmentId:e.trajectorySegmentId??null,trajectoryManeuverId:e.trajectoryManeuverId??null,inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0,epoch:e.epoch??null,referencePlane:e.referencePlane??null}}function lo(e){return structuredClone(e)}function br(e){return e?structuredClone(e):null}function co(e,t,r){if(!r)return;let n=t.find(a=>a.id===r);if(!n)return;let i=new Map(e.map(a=>[a.id,a])),o=new Set([...n.targetObjectId?[n.targetObjectId]:[],...n.participantObjectIds,...n.positions.map(a=>a.objectId)]);for(let a of o){let s=i.get(a);s&&(n.epoch&&(s.epoch=n.epoch),n.referencePlane&&(s.referencePlane=n.referencePlane))}for(let a of n.positions){let s=i.get(a.objectId);s&&(a.placement&&(s.placement=br(a.placement)),a.inner&&(s.properties.inner={...a.inner}),a.outer&&(s.properties.outer={...a.outer}),a.epoch&&(s.epoch=a.epoch),a.referencePlane&&(s.referencePlane=a.referencePlane))}}function uo(e){let t={};for(let[r,n]of Object.entries(e)){if(Array.isArray(n)){t[r]=[...n];continue}if(n&&typeof n=="object"&&"value"in n){t[r]={value:n.value,unit:n.unit};continue}t[r]=n}return t}function fo(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 po(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let r of e.viewpoints){let n=`viewpoint.${r.id}`;t[`${n}.label`]=r.label,r.summary&&(t[`${n}.summary`]=r.summary),r.focusObjectId&&(t[`${n}.focus`]=r.focusObjectId),r.selectedObjectId&&(t[`${n}.select`]=r.selectedObjectId),r.projection&&(t[`${n}.projection`]=r.projection),r.preset&&(t[`${n}.preset`]=r.preset),r.zoom!==null&&(t[`${n}.zoom`]=String(r.zoom)),r.rotationDeg!==0&&(t[`${n}.rotation`]=String(r.rotationDeg)),r.camera?.azimuth!==null&&(t[`${n}.camera.azimuth`]=String(r.camera?.azimuth)),r.camera?.elevation!==null&&(t[`${n}.camera.elevation`]=String(r.camera?.elevation)),r.camera?.roll!==null&&(t[`${n}.camera.roll`]=String(r.camera?.roll)),r.camera?.distance!==null&&(t[`${n}.camera.distance`]=String(r.camera?.distance));let i=mo(r.layers);i&&(t[`${n}.layers`]=i),r.filter?.query&&(t[`${n}.query`]=r.filter.query),(r.filter?.objectTypes.length??0)>0&&(t[`${n}.types`]=r.filter?.objectTypes.join(" ")??""),(r.filter?.tags.length??0)>0&&(t[`${n}.tags`]=r.filter?.tags.join(" ")??""),(r.filter?.groupIds.length??0)>0&&(t[`${n}.groups`]=r.filter?.groupIds.join(" ")??""),r.events.length>0&&(t[`${n}.events`]=r.events.join(" "))}for(let r of e.annotations){let n=`annotation.${r.id}`;t[`${n}.label`]=r.label,r.targetObjectId&&(t[`${n}.target`]=r.targetObjectId),t[`${n}.body`]=r.body,r.tags.length>0&&(t[`${n}.tags`]=r.tags.join(" ")),r.sourceObjectId&&(t[`${n}.source`]=r.sourceObjectId)}return t}function mo(e){let t=[],r=e["orbits-front"],n=e["orbits-back"];(r!==void 0||n!==void 0)&&t.push(r!==!1||n!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","trajectories","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t.join(" ")}var wr=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,ho=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),go=/^[A-Za-z][A-Za-z0-9+.-]*:/;function ee(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function me(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function _(e,t,r){let n=e.match(wr);if(!n)throw f.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(n[1]),unit:n[2]??null};if(r){let o=V(r);if(o?.unitFamily&&!Ce(o.unitFamily,i.unit))throw f.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${r}"`,t)}return i}function wt(e){let t=e.match(wr);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Je(e,t,r){let n=Number(e);if(!Number.isFinite(n))throw f.fromLocation(`Invalid numeric value "${e}" for "${t}"`,r);return n}function q(e,t,r){let n=ho.get(e.toLowerCase());if(n===void 0)throw f.fromLocation(`Invalid boolean value "${e}" for "${t}"`,r);return n}function vr(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw f.fromLocation(`Invalid special position "${e}"`,t);let r=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:r[2],point:r[3]};let n=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:null,point:n[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw f.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 yo(e,t){if(!e)throw f.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw f.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let r=e.match(go);if(!r)return;let n=r[0].slice(0,-1).toLowerCase();if(n!=="http"&&n!=="https")throw f.fromLocation(`Field "image" does not support the "${n}" scheme`,t)}function $r(e,t,r){let n=V(e);if(!n)throw f.fromLocation(`Unknown field "${e}"`,r);if(n.arity==="single"&&t.length!==1)throw f.fromLocation(`Field "${e}" expects exactly one value`,r);switch(n.kind){case"list":return t;case"boolean":return q(Se(t,e,r),e,r);case"number":return Je(Se(t,e,r),e,r);case"unit":return _(Se(t,e,r),r,e);case"string":{let i=t.join(" ").trim();return e==="image"&&yo(i,r),i}}}function vt(e,t,r){let n=V(e);if(!n)throw f.fromLocation(`Unknown field "${e}"`,r);if(!n.objectTypes.includes(t))throw f.fromLocation(`Field "${e}" is not valid on "${t}"`,r)}function Se(e,t,r){if(e.length!==1)throw f.fromLocation(`Field "${t}" expects exactly one value`,r);return e[0]}var xr=new Set(["star","planet","moon","asteroid","comet"]),bo=332946.0487,wo=1047.3486,Qe=1495978707e-1,vo=6371,$o=695700,Io=63241.077,xo=206264.806,jo=206264806;function It(e,t){let r=[],n=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)),a=new Map(e.trajectories.map(l=>[l.id,l]));e.system||r.push(w("validate.system.required","Atlas documents must declare exactly one system."));let s=new Map;for(let[l,c]of[["group",e.groups.map(u=>u.id)],["viewpoint",e.system?.viewpoints.map(u=>u.id)??[]],["annotation",e.system?.annotations.map(u=>u.id)??[]],["relation",e.relations.map(u=>u.id)],["event",e.events.map(u=>u.id)],["trajectory",e.trajectories.map(u=>u.id)],["object",e.objects.map(u=>u.id)]])for(let u of c){let d=s.get(u);d?r.push(w("validate.id.duplicate",`Duplicate ${l} id "${u}" already used by ${d}.`)):s.set(u,l)}for(let l of e.relations)ko(l,n,r);for(let l of e.system?.viewpoints??[])So(l,i,o,t,r,n);for(let l of e.objects)Oo(l,e.system,n,i,a,r);for(let l of e.events)Mo(l,e.system,n,a,r);for(let l of e.trajectories)Eo(l,n,r);return r}function ko(e,t,r){e.from?t.has(e.from)||r.push(w("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):r.push(w("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||r.push(w("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):r.push(w("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||r.push(w("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function So(e,t,r,n,i,o){let a=e.filter;if(n==="2.1"||n==="2.5"||n==="2.6"){if(a)for(let s of a.groupIds)t.has(s)||i.push(O("validate.viewpoint.group.unknown",`Unknown group "${s}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.groups`));for(let s of e.events??[])r.has(s)||i.push(O("validate.viewpoint.event.unknown",`Unknown event "${s}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}Co(e.projection,i,`viewpoint.${e.id}.projection`,e.id),Vo(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,a,o)}function Oo(e,t,r,n,i,o){let a=e.placement,s=a?.mode==="orbit"?a:null,l=a?.mode==="orbit"?r.get(a.target)??null:null;if(e.groups)for(let c of e.groups)n.has(c)||o.push(O("validate.group.unknown",`Unknown group "${c}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&o.push(O("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&o.push(O("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),e.trajectoryId&&(i.has(e.trajectoryId)?jr(e)||o.push(w("validate.trajectory.object.invalidType",`Only craft or legacy ship-like structures may reference trajectories; found "${e.type}" on "${e.id}".`,e.id,"trajectory")):o.push(w("validate.trajectory.object.unknown",`Unknown trajectory "${e.trajectoryId}" on "${e.id}".`,e.id,"trajectory"))),s&&(r.has(s.target)||o.push(w("validate.orbit.target.unknown",`Unknown placement target "${s.target}" on "${e.id}".`,e.id,"orbit")),s.distance&&s.semiMajor&&o.push(w("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),s.phase&&!e.epoch&&!t?.epoch&&o.push(O("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),s.inclination&&!e.referencePlane&&!t?.referencePlane&&o.push(O("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),s.period&&!xt(l?.properties.mass)&&o.push(O("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),a?.mode==="surface"){let c=r.get(a.target);c?xr.has(c.type)||o.push(w("validate.surface.target.invalid",`Surface target "${a.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):o.push(w("validate.surface.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"surface"))}if(a?.mode==="at"&&(e.type!=="craft"&&e.type!=="structure"&&e.type!=="phenomenon"&&o.push(w("validate.at.objectType",`Only craft, structures, and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),Do(e,r,o)||o.push(w("validate.at.target.unknown",`Unknown at-reference target "${a.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let c=r.get(e.resonance.targetObjectId);c?(e.placement?.mode!=="orbit"||c.placement?.mode!=="orbit"||e.placement.target!==c.placement.target)&&o.push(O("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):o.push(w("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let c of e.deriveRules??[]){if(c.field!=="period"||c.strategy!=="kepler"){o.push(O("validate.derive.unsupported",`Unsupported derive rule "${c.field} ${c.strategy}" on "${e.id}".`,e.id,"derive"));continue}let u=Ir(e,l);if(u===null){o.push(O("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}s?.period||o.push($t("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${No(u)}.`,e.id,"derive"))}for(let c of e.validationRules??[]){if(c.rule!=="kepler"){o.push(O("validate.rule.unsupported",`Unsupported validation rule "${c.rule}" on "${e.id}".`,e.id,"validate"));continue}let u=kr(s?.period),d=Ir(e,l);if(u===null||d===null)continue;let p=Bo(e,"period");Math.abs(u-d)>p&&o.push(w("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function Mo(e,t,r,n,i){let o=`event.${e.id}`,a=new Set;e.kind.trim()||i.push(w("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${o}.kind`)),typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(O("validate.event.epoch.empty",`Event "${e.id}" defines an empty epoch string.`,void 0,`${o}.epoch`)),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(O("validate.event.referencePlane.empty",`Event "${e.id}" defines an empty reference plane string.`,void 0,`${o}.referencePlane`)),e.trajectoryId&&!n.has(e.trajectoryId)&&i.push(w("validate.event.trajectory.unknown",`Unknown trajectory "${e.trajectoryId}" on event "${e.id}".`,void 0,`${o}.trajectory`)),!e.targetObjectId&&e.participantObjectIds.length===0&&i.push(w("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${o}.participants`)),e.targetObjectId&&(a.add(e.targetObjectId),r.has(e.targetObjectId)||i.push(w("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${o}.target`)));let s=new Set;for(let u of e.participantObjectIds){if(a.add(u),s.has(u)){i.push(O("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${u}".`,void 0,`${o}.participants`));continue}s.add(u),r.has(u)||i.push(w("validate.event.participants.unknown",`Unknown event participant "${u}" on "${e.id}".`,void 0,`${o}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&i.push(O("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${o}.target`)),e.positions.length===0&&i.push(O("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${o}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&a.size<3&&i.push(O("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${o}.participants`));let l=new Set;for(let u of e.positions){let d=`${o}.pose.${u.objectId}`;if(l.has(u.objectId)){i.push(w("validate.event.pose.duplicate",`Event "${e.id}" defines "${u.objectId}" more than once in positions.`,void 0,d));continue}l.add(u.objectId);let p=r.get(u.objectId);if(!p){i.push(w("validate.event.pose.object.unknown",`Unknown event pose object "${u.objectId}" on "${e.id}".`,void 0,d));continue}a.has(u.objectId)||i.push(O("validate.event.pose.unreferenced",`Event pose "${u.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,d)),To(u,p,e,t,r,n,i,d,e.id)}let c=[...a].filter(u=>!l.has(u));e.positions.length>0&&c.length>0&&i.push(O("validate.event.positions.partial",`Event "${e.id}" leaves ${c.length} referenced object(s) on their base placement.`,void 0,`${o}.positions`))}function To(e,t,r,n,i,o,a,s,l){let c=e.placement;if(!c){a.push(w("validate.event.pose.placement.required",`Event "${l}" pose "${e.objectId}" is missing a placement mode.`,void 0,s));return}if(e.trajectorySegmentId&&!Ao(o,e.trajectorySegmentId)&&a.push(w("validate.event.pose.segment.unknown",`Unknown trajectory segment "${e.trajectorySegmentId}" on "${l}:${e.objectId}".`,void 0,`${s}.segment`)),e.trajectoryManeuverId&&!Fo(o,e.trajectoryManeuverId)&&a.push(w("validate.event.pose.maneuver.unknown",`Unknown trajectory maneuver "${e.trajectoryManeuverId}" on "${l}:${e.objectId}".`,void 0,`${s}.maneuver`)),c.mode==="orbit"){i.has(c.target)||a.push(w("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${c.target}" on "${l}:${e.objectId}".`,void 0,`${s}.orbit`)),c.distance&&c.semiMajor&&a.push(w("validate.event.pose.orbit.distanceConflict",`Event "${l}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${s}.distance`)),c.phase&&!_o(n,t,r,e)&&a.push(O("validate.event.pose.phase.epochMissing",`Event "${l}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${s}.phase`)),c.inclination&&!zo(n,t,r,e)&&a.push(O("validate.event.pose.inclination.referencePlaneMissing",`Event "${l}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${s}.inclination`)),c.period&&!xt(i.get(c.target)?.properties.mass)&&a.push(O("validate.event.pose.period.massMissing",`Event "${l}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${s}.period`));return}if(c.mode==="surface"){let u=i.get(c.target);u?xr.has(u.type)||a.push(w("validate.event.pose.surface.target.invalid",`Event surface target "${c.target}" on "${l}:${e.objectId}" is not surface-capable.`,void 0,`${s}.surface`)):a.push(w("validate.event.pose.surface.target.unknown",`Unknown event surface target "${c.target}" on "${l}:${e.objectId}".`,void 0,`${s}.surface`));return}if(c.mode==="at"){t.type!=="craft"&&t.type!=="structure"&&t.type!=="phenomenon"&&a.push(w("validate.event.pose.at.objectType",`Only craft, structures, and phenomena may use "at" placement in events; found "${t.type}" on "${l}:${e.objectId}".`,void 0,`${s}.at`));let u=c.reference;u.kind==="named"&&!i.has(u.name)?a.push(w("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${c.target}" on "${l}:${e.objectId}".`,void 0,`${s}.at`)):u.kind==="anchor"&&!i.has(u.objectId)?a.push(w("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${u.objectId}" on "${l}:${e.objectId}".`,void 0,`${s}.at`)):u.kind==="lagrange"&&(i.has(u.primary)?u.secondary&&!i.has(u.secondary)&&a.push(w("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${u.secondary}" on "${l}:${e.objectId}".`,void 0,`${s}.at`)):a.push(w("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${u.primary}" on "${l}:${e.objectId}".`,void 0,`${s}.at`)))}}function Eo(e,t,r){if(e.craftObjectId){let n=t.get(e.craftObjectId);n?jr(n)||r.push(w("validate.trajectory.craft.invalidType",`Trajectory "${e.id}" targets "${e.craftObjectId}", which is not craft-like.`,void 0,`trajectory.${e.id}.craft`)):r.push(w("validate.trajectory.craft.unknown",`Unknown craft "${e.craftObjectId}" on trajectory "${e.id}".`,void 0,`trajectory.${e.id}.craft`))}for(let n of e.segments)Po(e.id,n,t,r)}function Po(e,t,r,n){let i=`trajectory.${e}.segment.${t.id}`;for(let[o,a]of[["from",t.fromObjectId],["to",t.toObjectId],["around",t.aroundObjectId]])a&&!r.has(a)&&n.push(w(`validate.trajectory.segment.${o}.unknown`,`Unknown ${o} object "${a}" on trajectory "${e}" segment "${t.id}".`,void 0,`${i}.${o}`));t.assist?.objectId&&!r.has(t.assist.objectId)&&n.push(w("validate.trajectory.segment.assist.unknown",`Unknown assist object "${t.assist.objectId}" on trajectory "${e}" segment "${t.id}".`,void 0,`${i}.assist`)),t.kind==="flyby"&&!t.assist?.objectId&&n.push(w("validate.trajectory.segment.assist.required",`Trajectory "${e}" segment "${t.id}" is a flyby and requires an "assist" object.`,void 0,`${i}.assist`)),(t.kind==="capture"||t.kind==="departure")&&!t.toObjectId&&!t.aroundObjectId&&n.push(w("validate.trajectory.segment.target.required",`Trajectory "${e}" segment "${t.id}" requires a target reference.`,void 0,`${i}.to`));for(let o of t.maneuvers)Lo(e,t.id,o,n)}function Lo(e,t,r,n){r.kind.trim()||n.push(w("validate.trajectory.maneuver.kind.required",`Trajectory "${e}" segment "${t}" maneuver "${r.id}" is missing a kind.`,void 0,`trajectory.${e}.segment.${t}.maneuver.${r.id}.kind`))}function jr(e){if(e.type==="craft")return!0;if(e.type!=="structure")return!1;let t=typeof e.properties.kind=="string"?e.properties.kind.toLowerCase():"";return t==="ship"||t==="probe"||t==="station"}function Ao(e,t){for(let r of e.values()){let n=r.segments.find(i=>i.id===t);if(n)return n}return null}function Fo(e,t){for(let r of e.values())for(let n of r.segments){let i=n.maneuvers.find(o=>o.id===t);if(i)return i}return null}function Do(e,t,r){let n=e.placement?.mode==="at"?e.placement.reference:null;return n?n.kind==="named"?t.has(n.name):n.kind==="anchor"?t.has(n.objectId)?!0:(r.push(w("validate.anchor.target.unknown",`Unknown anchor target "${n.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(n.primary)?n.secondary&&!t.has(n.secondary)?(r.push(w("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${n.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(r.push(w("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${n.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function Ir(e,t){let r=e.placement;if(!r||r.mode!=="orbit")return null;let n=Ro(r.semiMajor??r.distance),i=xt(t?.properties.mass);return n===null||i===null||i<=0?null:Math.sqrt(n**3/i)*365.25}function Ro(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*Io;case"pc":return e.value*xo;case"kpc":return e.value*jo;case"re":return e.value*vo/Qe;case"sol":return e.value*$o/Qe;default:return null}}function xt(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/bo;case"mj":return t.value/wo;default:return null}}function kr(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 Co(e,t,r,n){e!=="topdown"&&e!=="isometric"&&e!=="orthographic"&&e!=="perspective"&&t.push(w("validate.viewpoint.projection.invalid",`Unknown projection "${String(e)}" in viewpoint "${n}".`,void 0,r))}function Vo(e,t,r,n,i,o,a,s,l){if(!e)return;let c=`viewpoint.${i}.camera`;for(let[d,p]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])p!==null&&(!Number.isFinite(p)||d==="distance"&&p<=0)&&n.push(w("validate.viewpoint.camera.invalid",`Invalid camera ${d} "${String(p)}" in viewpoint "${i}".`,void 0,`${c}.${d}`));e.distance!==null&&t!=="perspective"&&n.push(O("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)&&n.push(O("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&&n.push($t("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&&r!==0&&n.push(O("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&&l.has(o)||a!==null&&l.has(a)||s||n.push($t("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,c))}function _o(e,t,r,n){return ie(n?.epoch)??ie(r?.epoch)??ie(t.epoch)??ie(e?.epoch)??null}function zo(e,t,r,n){return ie(n?.referencePlane)??ie(r?.referencePlane)??ie(t.referencePlane)??ie(e?.referencePlane)??null}function ie(e){return typeof e=="string"&&e.trim()?e.trim():null}function Bo(e,t){let r=e.tolerances?.find(n=>n.field===t)?.value;return typeof r=="number"?r:r&&typeof r=="object"&&"value"in r?kr(r)??0:0}function No(e){return`${Math.round(e*100)/100}d`}function w(e,t,r,n){return{code:e,severity:"error",source:"validate",message:t,objectId:r,field:n}}function O(e,t,r,n){return{code:e,severity:"warning",source:"validate",message:t,objectId:r,field:n}}function $t(e,t,r,n){return{code:e,severity:"info",source:"validate",message:t,objectId:r,field:n}}var Wo=new Set(["climate","habitability","settlement"]),Uo=new Set(["departure","transfer","flyby","capture","stationkeeping","escape"]),et=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","trajectory"]){let t=V(e);t&&et.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},{key:"trajectory",inlineMode:"single",allowRepeat:!1}])et.set(e.key,{key:e.key,version:e.key==="trajectory"?"3.0":"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var Yo=new Set(et.keys()),Or=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane","segment","maneuver"]);function Mr(e){return Ho(e)}function Ho(e,t){let r=Ra(e),n=r.source.split(/\r?\n/),i=[],o=!1,a="2.0",s=null,l=null,c=[],u=[],d=[],p=[],h=[],g=new Map,y=!1,b=!1,S=new Set,I=new Set,m=new Set,j=new Set,B=new Set,L=new Set;for(let A=0;A<n.length;A++){let se=n[A],J=A+1;if(!se.trim())continue;let C=Be(se),Q=ze(se.slice(C),{line:J,columnOffset:C});if(Q.length!==0){if(!o){a=qo(Q,J),o=!0,r.comments.length>0&&ge(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:r.comments[0].line,column:r.comments[0].column});continue}if(C===0){l=Go(Q,J,a,i,s,c,u,d,p,h,g,S,I,m,j,B,L,{sawDefaults:y,sawAtlas:b}),l.kind==="system"?s=l.system:l.kind==="defaults"?y=!0:l.kind==="atlas"&&(b=!0);continue}if(!l)throw new f("Indented line without parent atlas section",J,C+1);na(l,C,Q,J)}}if(!o)throw new f('Missing required atlas schema header "schema 2.0", "schema 3.0", or "schema 3.1"');let Z=c.map(A=>ka(A,a,i)),$=p.map(A=>Sa(A,g.get(A.id)??[])),M=t??(a==="2.0-draft"?"2.0":a),R={format:"worldorbit",sourceVersion:"1.0",theme:null,system:s,groups:u,relations:d,events:$,trajectories:h,objects:Z,diagnostics:i};if(M==="2.0-draft"){let A={...R,version:"2.0-draft",schemaVersion:"2.0-draft"};return A.diagnostics.push(...It(A,a)),A}let X={...R,version:M,schemaVersion:M};return a==="2.0-draft"&&X.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".'}),X.diagnostics.push(...It(X,a)),X}function qo(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1","2.5","2.6","3.0","3.1"].includes(e[1].value.toLowerCase()))throw new f('Expected atlas header "schema 2.0", "schema 2.1", "schema 2.5", "schema 2.6", "schema 3.0", "schema 3.1", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let r=e[1].value.toLowerCase();return r==="2.6"?"2.6":r==="3.0"?"3.0":r==="3.1"?"3.1":r==="2.5"?"2.5":r==="2.1"?"2.1":r==="2.0-draft"?"2.0-draft":"2.0"}function Go(e,t,r,n,i,o,a,s,l,c,u,d,p,h,g,y,b,S){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new f('Atlas section "system" may only appear once',t,e[0].column);return Xo(e,t,r,n);case"defaults":if(!i)throw new f('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(S.sawDefaults)throw new f('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:i,sourceSchemaVersion:r,diagnostics:n,seenFields:new Set};case"atlas":if(!i)throw new f('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(S.sawAtlas)throw new f('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 f('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return Ko(e,t,i,d,r,n);case"annotation":if(!i)throw new f('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return Zo(e,t,i,p);case"group":return Y(r,n,"group",{line:t,column:e[0].column}),Jo(e,t,a,h);case"relation":return Y(r,n,"relation",{line:t,column:e[0].column}),Qo(e,t,s,g);case"event":return Y(r,n,"event",{line:t,column:e[0].column}),ea(e,t,l,u,y,r,n);case"trajectory":return he(r,n,"trajectory",{line:t,column:e[0].column}),ta(e,t,c,b,r,n);case"object":return ra(e,t,r,n,o);default:throw new f(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function Xo(e,t,r,n){if(e.length!==2)throw new f("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:r,diagnostics:n,seenFields:new Set}}function Ko(e,t,r,n,i,o){if(e.length!==2)throw new f("Invalid viewpoint declaration",t,e[0]?.column??1);let a=ee(e[1].value);if(!a)throw new f("Viewpoint id must not be empty",t,e[1].column);if(n.has(a))throw new f(`Duplicate viewpoint id "${a}"`,t,e[1].column);let s={id:a,label:me(a),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:r.defaults.view,preset:r.defaults.preset,zoom:null,rotationDeg:0,camera:null,layers:{},filter:null};return r.viewpoints.push(s),n.add(a),{kind:"viewpoint",viewpoint:s,sourceSchemaVersion:i,diagnostics:o,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set,inCamera:!1,cameraIndent:null,seenCameraFields:new Set}}function Zo(e,t,r,n){if(e.length!==2)throw new f("Invalid annotation declaration",t,e[0]?.column??1);let i=ee(e[1].value);if(!i)throw new f("Annotation id must not be empty",t,e[1].column);if(n.has(i))throw new f(`Duplicate annotation id "${i}"`,t,e[1].column);let o={id:i,label:me(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return r.annotations.push(o),n.add(i),{kind:"annotation",annotation:o,seenFields:new Set}}function Jo(e,t,r,n){if(e.length!==2)throw new f("Invalid group declaration",t,e[0]?.column??1);let i=ee(e[1].value);if(!i)throw new f("Group id must not be empty",t,e[1].column);if(n.has(i))throw new f(`Duplicate group id "${i}"`,t,e[1].column);let o={id:i,label:me(i),summary:"",color:null,tags:[],hidden:!1};return r.push(o),n.add(i),{kind:"group",group:o,seenFields:new Set}}function Qo(e,t,r,n){if(e.length!==2)throw new f("Invalid relation declaration",t,e[0]?.column??1);let i=ee(e[1].value);if(!i)throw new f("Relation id must not be empty",t,e[1].column);if(n.has(i))throw new f(`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 r.push(o),n.add(i),{kind:"relation",relation:o,seenFields:new Set}}function ea(e,t,r,n,i,o,a){if(e.length!==2)throw new f("Invalid event declaration",t,e[0]?.column??1);let s=ee(e[1].value);if(!s)throw new f("Event id must not be empty",t,e[1].column);if(i.has(s))throw new f(`Duplicate event id "${s}"`,t,e[1].column);let l={id:s,kind:"",label:me(s),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},c=[];return r.push(l),n.set(s,c),i.add(s),{kind:"event",event:l,sourceSchemaVersion:o,diagnostics:a,seenFields:new Set,rawPoses:c,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function ta(e,t,r,n,i,o){if(e.length!==2)throw new f("Invalid trajectory declaration",t,e[0]?.column??1);let a=ee(e[1].value);if(!a)throw new f("Trajectory id must not be empty",t,e[1].column);if(n.has(a))throw new f(`Duplicate trajectory id "${a}"`,t,e[1].column);let s={id:a,label:me(a),summary:null,craftObjectId:null,tags:[],color:null,renderMode:null,stroke:null,strokeWidth:null,marker:null,labelMode:null,showWaypoints:null,hidden:!1,segments:[]};return r.push(s),n.add(a),{kind:"trajectory",trajectory:s,sourceSchemaVersion:i,diagnostics:o,seenFields:new Set,inSegment:!1,segmentIndent:null,activeSegment:null,activeSegmentSeenFields:new Set,inManeuver:!1,maneuverIndent:null,activeManeuver:null,activeManeuverSeenFields:new Set}}function ra(e,t,r,n,i){if(e.length<3)throw new f("Invalid atlas object declaration",t,e[0]?.column??1);let o=e[1],a=e[2],s=o.value;if(!Re.has(s)||s==="system")throw new f(`Unknown object type "${o.value}"`,t,o.column);let l={objectType:s,id:a.value,fields:xa(e.slice(3),t,s,r,n),infoEntries:[],typedBlockEntries:{},location:{line:t,column:o.column}};return i.push(l),{kind:"object",objectNode:l,sourceSchemaVersion:r,diagnostics:n,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function na(e,t,r,n){switch(e.kind){case"system":ia(e,r,n);return;case"defaults":oa(e,r,n);return;case"atlas":aa(e,t,r,n);return;case"viewpoint":sa(e,t,r,n);return;case"annotation":ua(e,r,n);return;case"group":da(e,r,n);return;case"relation":fa(e,r,n);return;case"event":pa(e,t,r,n);return;case"trajectory":ma(e,t,r,n);return;case"object":ba(e,t,r,n);return}}function ia(e,t,r){let n=H(t,e.seenFields,r),i=k(t,r);switch(n){case"title":e.system.title=i;return;case"description":Y(e.sourceSchemaVersion,e.diagnostics,n,{line:r,column:t[0].column}),e.system.description=i;return;case"epoch":Y(e.sourceSchemaVersion,e.diagnostics,n,{line:r,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":Y(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:r,column:t[0].column}),e.system.referencePlane=i;return;default:throw new f(`Unknown system atlas field "${t[0].value}"`,r,t[0].column)}}function oa(e,t,r){let n=H(t,e.seenFields,r),i=k(t,r);switch(n){case"view":Er(i)&&ue(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:r,column:t[0].column}),e.system.defaults.view=Tr(i,r,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=Pr(i,r,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new f(`Unknown defaults field "${t[0].value}"`,r,t[0].column)}}function aa(e,t,r,n){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=Lr(r,n,"Invalid atlas metadata entry");if(i.key in e.system.atlasMetadata)throw new f(`Duplicate atlas metadata key "${i.key}"`,n,r[0].column);e.system.atlasMetadata[i.key]=i.value;return}if(r.length===1&&r[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new f(`Unknown atlas field "${r[0].value}"`,n,r[0].column)}function sa(e,t,r,n){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){la(e,r,n);return}if(e.inFilter){ca(e,r,n);return}if(r.length===1&&r[0].value.toLowerCase()==="camera"){if(ue(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:n,column:r[0].column}),e.seenFields.has("camera"))throw new f('Duplicate viewpoint field "camera"',n,r[0].column);e.seenFields.add("camera"),e.inCamera=!0,e.cameraIndent=t,e.viewpoint.camera=e.viewpoint.camera??jt();return}if(r.length===1&&r[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new f('Duplicate viewpoint field "filter"',n,r[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=H(r,e.seenFields,n),o=k(r,n);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":Er(o)&&ue(e.sourceSchemaVersion,e.diagnostics,"projection",{line:n,column:r[0].column}),e.viewpoint.projection=Tr(o,n,r[0].column);return;case"preset":e.viewpoint.preset=Pr(o,n,r[0].column);return;case"zoom":e.viewpoint.zoom=Oe(o,n,r[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=ae(o,n,r[0].column,"rotation");return;case"camera":ue(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:n,column:r[0].column}),e.viewpoint.camera=Ia(r.slice(1),n,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=va(r.slice(1),n,e.sourceSchemaVersion,e.diagnostics);return;case"events":Y(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:n,column:r[0].column}),e.viewpoint.events=z(r.slice(1),n,"events");return;default:throw new f(`Unknown viewpoint field "${r[0].value}"`,n,r[0].column)}}function la(e,t,r){let n=H(t,e.seenCameraFields,r),i=k(t,r),o=e.viewpoint.camera??jt();switch(n){case"azimuth":o.azimuth=ae(i,r,t[0].column,"camera.azimuth");break;case"elevation":o.elevation=ae(i,r,t[0].column,"camera.elevation");break;case"roll":o.roll=ae(i,r,t[0].column,"camera.roll");break;case"distance":o.distance=Oe(i,r,t[0].column,"camera.distance");break;default:throw new f(`Unknown viewpoint camera field "${t[0].value}"`,r,t[0].column)}e.viewpoint.camera=o}function ca(e,t,r){let n=H(t,e.seenFilterFields,r),i=e.viewpoint.filter??$a();switch(n){case"query":i.query=k(t,r);break;case"objecttypes":i.objectTypes=wa(t.slice(1),r);break;case"tags":i.tags=z(t.slice(1),r,"tags");break;case"groups":i.groupIds=z(t.slice(1),r,"groups");break;default:throw new f(`Unknown viewpoint filter field "${t[0].value}"`,r,t[0].column)}e.viewpoint.filter=i}function ua(e,t,r){switch(H(t,e.seenFields,r)){case"label":e.annotation.label=k(t,r);return;case"target":e.annotation.targetObjectId=k(t,r);return;case"body":e.annotation.body=k(t,r);return;case"tags":e.annotation.tags=z(t.slice(1),r,"tags");return;default:throw new f(`Unknown annotation field "${t[0].value}"`,r,t[0].column)}}function da(e,t,r){switch(H(t,e.seenFields,r)){case"label":e.group.label=k(t,r);return;case"summary":e.group.summary=k(t,r);return;case"color":e.group.color=k(t,r);return;case"tags":e.group.tags=z(t.slice(1),r,"tags");return;case"hidden":e.group.hidden=q(k(t,r),"hidden",{line:r,column:t[0].column});return;default:throw new f(`Unknown group field "${t[0].value}"`,r,t[0].column)}}function fa(e,t,r){switch(H(t,e.seenFields,r)){case"from":e.relation.from=k(t,r);return;case"to":e.relation.to=k(t,r);return;case"kind":e.relation.kind=k(t,r);return;case"label":e.relation.label=k(t,r);return;case"summary":e.relation.summary=k(t,r);return;case"tags":e.relation.tags=z(t.slice(1),r,"tags");return;case"color":e.relation.color=k(t,r);return;case"hidden":e.relation.hidden=q(k(t,r),"hidden",{line:r,column:t[0].column});return;default:throw new f(`Unknown relation field "${t[0].value}"`,r,t[0].column)}}function pa(e,t,r,n){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){(r[0]?.value==="epoch"||r[0]?.value==="referencePlane")&&ue(e.sourceSchemaVersion,e.diagnostics,`pose.${r[0].value}`,{line:n,column:r[0]?.column??1}),(r[0]?.value==="segment"||r[0]?.value==="maneuver")&&he(e.sourceSchemaVersion,e.diagnostics,`pose.${r[0].value}`,{line:n,column:r[0]?.column??1}),e.activePose.fields.push(ya(r,n,e.activePoseSeenFields));return}if(e.inPositions){if(r.length!==2||r[0].value.toLowerCase()!=="pose")throw new f(`Unknown event positions field "${r[0].value}"`,n,r[0]?.column??1);let o=r[1].value;if(!o.trim())throw new f("Event pose object id must not be empty",n,r[1].column);let a={objectId:o,fields:[],location:{line:n,column:r[0].column}};e.rawPoses.push(a),e.activePose=a,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(r.length===1&&r[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new f('Duplicate event field "positions"',n,r[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(H(r,e.seenFields,n)){case"kind":e.event.kind=k(r,n);return;case"label":e.event.label=k(r,n);return;case"summary":e.event.summary=k(r,n);return;case"trajectory":he(e.sourceSchemaVersion,e.diagnostics,"event.trajectory",{line:n,column:r[0].column}),e.event.trajectoryId=k(r,n);return;case"target":e.event.targetObjectId=k(r,n);return;case"participants":e.event.participantObjectIds=z(r.slice(1),n,"participants");return;case"timing":e.event.timing=k(r,n);return;case"visibility":e.event.visibility=k(r,n);return;case"epoch":ue(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:n,column:r[0].column}),e.event.epoch=k(r,n);return;case"referenceplane":ue(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:n,column:r[0].column}),e.event.referencePlane=k(r,n);return;case"tags":e.event.tags=z(r.slice(1),n,"tags");return;case"color":e.event.color=k(r,n);return;case"hidden":e.event.hidden=q(k(r,n),"hidden",{line:n,column:r[0].column});return;default:throw new f(`Unknown event field "${r[0].value}"`,n,r[0].column)}}function ma(e,t,r,n){if(e.activeManeuver&&t<=(e.maneuverIndent??0)&&(e.activeManeuver=null,e.maneuverIndent=null,e.activeManeuverSeenFields.clear(),e.inManeuver=!1),e.activeSegment&&t<=(e.segmentIndent??0)&&(e.activeSegment=null,e.segmentIndent=null,e.activeSegmentSeenFields.clear(),e.inSegment=!1),e.activeManeuver){ga(e,r,n);return}if(e.activeSegment){if(r[0]?.value.toLowerCase()==="maneuver"){if(r.length!==2)throw new f("Invalid trajectory maneuver declaration",n,r[0]?.column??1);let a=ee(r[1].value);if(!a)throw new f("Trajectory maneuver id must not be empty",n,r[1].column);if(e.activeSegment.maneuvers.some(l=>l.id===a))throw new f(`Duplicate trajectory maneuver id "${a}"`,n,r[1].column);let s={id:a,kind:"burn",label:null,epoch:null,notes:[]};e.activeSegment.maneuvers.push(s),e.activeManeuver=s,e.inManeuver=!0,e.maneuverIndent=t,e.activeManeuverSeenFields=new Set;return}ha(e,r,n);return}if(r[0]?.value.toLowerCase()==="segment"){if(r.length!==2)throw new f("Invalid trajectory segment declaration",n,r[0]?.column??1);let a=ee(r[1].value);if(!a)throw new f("Trajectory segment id must not be empty",n,r[1].column);if(e.trajectory.segments.some(l=>l.id===a))throw new f(`Duplicate trajectory segment id "${a}"`,n,r[1].column);let s={id:a,kind:"transfer",label:null,summary:null,fromObjectId:null,toObjectId:null,aroundObjectId:null,assist:null,epoch:null,waypointLabel:null,waypointDate:null,renderHidden:null,sampleDensity:null,notes:[],maneuvers:[]};e.trajectory.segments.push(s),e.activeSegment={id:a,fields:[],maneuvers:s.maneuvers,assist:null,location:{line:n,column:r[0].column}},e.inSegment=!0,e.segmentIndent=t,e.activeSegmentSeenFields=new Set;return}let i=H(r,e.seenFields,n),o=k(r,n);switch(i){case"label":e.trajectory.label=o;return;case"summary":e.trajectory.summary=o;return;case"craft":e.trajectory.craftObjectId=o;return;case"tags":e.trajectory.tags=z(r.slice(1),n,"tags");return;case"color":e.trajectory.color=o;return;case"rendermode":if(U(e.sourceSchemaVersion,e.diagnostics,"trajectory.renderMode",{line:n,column:r[0].column}),o!=="illustrative"&&o!=="solver"&&o!=="auto")throw new f(`Unknown trajectory render mode "${o}"`,n,r[0].column);e.trajectory.renderMode=o;return;case"stroke":U(e.sourceSchemaVersion,e.diagnostics,"trajectory.stroke",{line:n,column:r[0].column}),e.trajectory.stroke=o;return;case"strokewidth":U(e.sourceSchemaVersion,e.diagnostics,"trajectory.strokeWidth",{line:n,column:r[0].column}),e.trajectory.strokeWidth=Oe(o,n,r[0].column,"strokeWidth");return;case"marker":U(e.sourceSchemaVersion,e.diagnostics,"trajectory.marker",{line:n,column:r[0].column}),e.trajectory.marker=o;return;case"labelmode":U(e.sourceSchemaVersion,e.diagnostics,"trajectory.labelMode",{line:n,column:r[0].column}),e.trajectory.labelMode=o;return;case"showwaypoints":U(e.sourceSchemaVersion,e.diagnostics,"trajectory.showWaypoints",{line:n,column:r[0].column}),e.trajectory.showWaypoints=q(o,"showWaypoints",{line:n,column:r[0].column});return;case"hidden":e.trajectory.hidden=q(o,"hidden",{line:n,column:r[0].column});return;default:throw new f(`Unknown trajectory field "${r[0].value}"`,n,r[0].column)}}function ha(e,t,r){let n=e.activeSegment;if(!n)return;let i=H(t,e.activeSegmentSeenFields,r),o=k(t,r),a=e.trajectory.segments.find(s=>s.id===n.id);switch(i){case"kind":{let s=o.toLowerCase();if(!Uo.has(s))throw new f(`Unknown trajectory segment kind "${o}"`,r,t[0].column);a.kind=s;return}case"label":a.label=o;return;case"summary":a.summary=o;return;case"from":a.fromObjectId=o;return;case"to":a.toObjectId=o;return;case"around":a.aroundObjectId=o;return;case"assist":a.assist={objectId:o,notes:[]};return;case"epoch":a.epoch=o;return;case"periapsis":a.periapsis=_(o,{line:r,column:t[0].column},"periapsis");return;case"apoapsis":a.apoapsis=_(o,{line:r,column:t[0].column},"apoapsis");return;case"inclination":a.inclination=_(o,{line:r,column:t[0].column},"inclination");return;case"duration":a.duration=_(o,{line:r,column:t[0].column},"duration");return;case"deltav":a.deltaV=_(o,{line:r,column:t[0].column});return;case"phaseangle":a.phaseAngle=_(o,{line:r,column:t[0].column},"phaseAngle");return;case"turnangle":a.turnAngle=_(o,{line:r,column:t[0].column},"turnAngle");return;case"energy":a.energy=_(o,{line:r,column:t[0].column});return;case"waypointlabel":U(e.sourceSchemaVersion,e.diagnostics,"segment.waypointLabel",{line:r,column:t[0].column}),a.waypointLabel=o;return;case"waypointdate":U(e.sourceSchemaVersion,e.diagnostics,"segment.waypointDate",{line:r,column:t[0].column}),a.waypointDate=o;return;case"renderhidden":U(e.sourceSchemaVersion,e.diagnostics,"segment.renderHidden",{line:r,column:t[0].column}),a.renderHidden=q(o,"renderHidden",{line:r,column:t[0].column});return;case"sampledensity":U(e.sourceSchemaVersion,e.diagnostics,"segment.sampleDensity",{line:r,column:t[0].column}),a.sampleDensity=Oe(o,r,t[0].column,"sampleDensity");return;case"notes":a.notes=z(t.slice(1),r,"notes");return;default:throw new f(`Unknown trajectory segment field "${t[0].value}"`,r,t[0].column)}}function ga(e,t,r){let n=e.activeManeuver;if(!n)return;let i=H(t,e.activeManeuverSeenFields,r),o=k(t,r);switch(i){case"kind":n.kind=o;return;case"label":n.label=o;return;case"epoch":n.epoch=o;return;case"deltav":n.deltaV=_(o,{line:r,column:t[0].column});return;case"duration":n.duration=_(o,{line:r,column:t[0].column},"duration");return;case"notes":n.notes=z(t.slice(1),r,"notes");return;default:throw new f(`Unknown trajectory maneuver field "${t[0].value}"`,r,t[0].column)}}function ya(e,t,r){if(e.length<2)throw new f("Invalid event pose field line",t,e[0]?.column??1);let n=e[0].value;if(!Or.has(n))throw new f(`Unknown event pose field "${n}"`,t,e[0].column);if(r.has(n))throw new f(`Duplicate event pose field "${n}"`,t,e[0].column);return r.add(n),{type:"field",key:n,values:e.slice(1).map(i=>i.value),location:{line:t,column:e[0].column}}}function ba(e,t,r,n){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),r.length===1){let i=r[0].value.toLowerCase();if(i==="info"||Wo.has(i)){i!=="info"&&Y(e.sourceSchemaVersion,e.diagnostics,i,{line:n,column:r[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=Lr(r,n,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(i.key))throw new f(`Duplicate info key "${i.key}"`,n,r[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 f(`Duplicate ${o} key "${i.key}"`,n,r[0].column);a.add(i.key),(e.objectNode.typedBlockEntries[o]??(e.objectNode.typedBlockEntries[o]=[])).push(i);return}e.objectNode.fields.push(ja(r,n,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function H(e,t,r){if(e.length<2)throw new f("Invalid atlas field line",r,e[0]?.column??1);let n=e[0].value.toLowerCase();if(t.has(n))throw new f(`Duplicate atlas field "${e[0].value}"`,r,e[0].column);return t.add(n),n}function k(e,t){if(e.length<2)throw new f("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(r=>r.value).join(" ").trim()}function wa(e,t){return z(e,t,"objectTypes").filter(r=>r==="star"||r==="planet"||r==="moon"||r==="belt"||r==="asteroid"||r==="comet"||r==="ring"||r==="structure"||r==="phenomenon")}function va(e,t,r,n){let i={};for(let o of z(e,t,"layers")){let a=!o.startsWith("-")&&!o.startsWith("!"),s=o.replace(/^[-!]+/,"").toLowerCase();if(s==="orbits"){i["orbits-back"]=a,i["orbits-front"]=a;continue}(s==="background"||s==="guides"||s==="orbits-back"||s==="orbits-front"||s==="relations"||s==="events"||s==="objects"||s==="labels"||s==="metadata"||s==="trajectories")&&(s==="events"&&r&&n&&Y(r,n,"layers.events",{line:t,column:e[0]?.column??1}),i[s]=a)}return i}function z(e,t,r){if(e.length===0)throw new f(`Missing value for atlas field "${r}"`,t,1);let n=e.map(i=>i.value).filter(Boolean);if(n.length===0)throw new f(`Missing value for atlas field "${r}"`,t,e[0]?.column??1);return n}function Tr(e,t,r){let n=e.toLowerCase();if(n!=="topdown"&&n!=="isometric"&&n!=="orthographic"&&n!=="perspective")throw new f(`Unknown projection "${e}"`,t,r);return n}function Er(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function Pr(e,t,r){let n=e.toLowerCase();if(n==="diagram"||n==="presentation"||n==="atlas-card"||n==="markdown")return n;throw new f(`Unknown render preset "${e}"`,t,r)}function Oe(e,t,r,n){let i=ae(e,t,r,n);if(i<=0)throw new f(`Field "${n}" must be greater than zero`,t,r);return i}function ae(e,t,r,n){let i=Number(e);if(!Number.isFinite(i))throw new f(`Invalid numeric value "${e}" for "${n}"`,t,r);return i}function $a(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function jt(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Ia(e,t,r){if(e.length===0||e.length%2!==0)throw new f('Field "camera" expects "<field> <value>" pairs',t,e[0]?.column??1);let n=r?{...r}:jt(),i=new Set;for(let o=0;o<e.length;o+=2){let a=e[o],s=e[o+1],l=a.value.toLowerCase();if(i.has(l))throw new f(`Duplicate viewpoint camera field "${a.value}"`,t,a.column);i.add(l);let c=s.value;switch(l){case"azimuth":n.azimuth=ae(c,t,a.column,"camera.azimuth");break;case"elevation":n.elevation=ae(c,t,a.column,"camera.elevation");break;case"roll":n.roll=ae(c,t,a.column,"camera.roll");break;case"distance":n.distance=Oe(c,t,a.column,"camera.distance");break;default:throw new f(`Unknown viewpoint camera field "${a.value}"`,t,a.column)}}return n}function xa(e,t,r,n,i){let o=[],a=0;for(;a<e.length;){let s=e[a],l=Me(s.value);if(!l)throw new f(`Unknown field "${s.value}"`,t,s.column);l.version==="2.1"?Y(n,i,s.value,{line:t,column:s.column}):l.version==="3.0"?he(n,i,s.value,{line:t,column:s.column}):l.version==="3.1"&&U(n,i,s.value,{line:t,column:s.column}),a++;let c=[];if(l.inlineMode==="single"){let u=e[a];u&&(c.push(u),a++)}else if(l.inlineMode==="pair")for(let u=0;u<2;u++){let d=e[a];if(!d)break;c.push(d),a++}else for(;a<e.length&&!Yo.has(e[a].value);)c.push(e[a]),a++;if(c.length===0)throw new f(`Missing value for field "${s.value}"`,t,s.column);o.push({type:"field",key:s.value,values:c.map(u=>u.value),location:{line:t,column:s.column}})}return Rr(o,r),o}function ja(e,t,r,n,i){if(e.length<2)throw new f("Invalid field line",t,e[0]?.column??1);let o=Me(e[0].value);if(!o)throw new f(`Unknown field "${e[0].value}"`,t,e[0].column);o.version==="2.1"?Y(n,i,e[0].value,{line:t,column:e[0].column}):o.version==="3.0"?he(n,i,e[0].value,{line:t,column:e[0].column}):o.version==="3.1"&&U(n,i,e[0].value,{line:t,column:e[0].column});let a={type:"field",key:e[0].value,values:e.slice(1).map(s=>s.value),location:{line:t,column:e[0].column}};return Rr([a],r),a}function Lr(e,t,r){if(e.length<2)throw new f(r,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}}}function ka(e,t,r){let n=Ar(e.fields),i=Fr(n),o=Ma(e.objectType,n),a=Fa(n.get("groups")?.[0]),s=ce(n.get("epoch")?.[0]),l=ce(n.get("referencePlane")?.[0]),c=n.has("tidalLock")?q(G(n.get("tidalLock")[0]),"tidalLock",n.get("tidalLock")[0].location):void 0,u=n.has("resonance")?Pa(n.get("resonance")[0]):void 0,d=Ea(n),p=n.get("derive")?.map(j=>La(j)),h=n.get("validate")?.map(j=>({rule:G(j)})),g=n.has("locked")?[...new Set(n.get("locked").flatMap(j=>j.values))]:void 0,y=n.get("tolerance")?.map(j=>Aa(j)),b=Ta(e.typedBlockEntries),S=Dr(e.infoEntries,"info"),I=ce(n.get("trajectory")?.[0]),m={type:e.objectType,id:e.id,properties:o,placement:i,info:S};return a.length>0&&(m.groups=a),s&&(m.epoch=s),l&&(m.referencePlane=l),c!==void 0&&(m.tidalLock=c),u&&(m.resonance=u),d&&(m.renderHints=d),p?.length&&(m.deriveRules=p),h?.length&&(m.validationRules=h),g?.length&&(m.lockedFields=g),y?.length&&(m.tolerances=y),b&&Object.keys(b).length>0&&(m.typedBlocks=b),I&&(m.trajectoryId=I),ge(t,"2.1")&&(m.groups||m.epoch||m.referencePlane||m.tidalLock!==void 0||m.resonance||m.renderHints||m.deriveRules?.length||m.validationRules?.length||m.lockedFields?.length||m.tolerances?.length||m.typedBlocks||m.trajectoryId)&&Y(t,r,e.id,e.location),m.trajectoryId&&he(t,r,`${e.id}.trajectory`,e.location),m}function Sa(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(r=>Oa(r))}}function Oa(e){let t=Ar(e.fields,"event-pose"),r=Fr(t);return{objectId:e.objectId,placement:r,trajectorySegmentId:ce(t.get("segment")?.[0]),trajectoryManeuverId:ce(t.get("maneuver")?.[0]),inner:oe(t.get("inner")?.[0],"inner"),outer:oe(t.get("outer")?.[0],"outer"),epoch:ce(t.get("epoch")?.[0]),referencePlane:ce(t.get("referencePlane")?.[0])}}function Ar(e,t="object"){let r=new Map;for(let n of e){let i=Me(n.key);if(!i&&!Or.has(n.key))throw f.fromLocation(`Unknown field "${n.key}"`,n.location);if(!i?.allowRepeat&&r.has(n.key))throw f.fromLocation(`Duplicate field "${n.key}"`,n.location);let o=r.get(n.key)??[];o.push(n),r.set(n.key,o)}return r}function Fr(e){let t=e.get("orbit")?.[0],r=e.get("at")?.[0],n=e.get("surface")?.[0],i=e.get("free")?.[0];if([t,r,n,i].filter(Boolean).length>1){let a=t??r??n??i;throw f.fromLocation("Object has multiple placement modes",a?.location)}if(t)return{mode:"orbit",target:G(t),distance:oe(e.get("distance")?.[0],"distance"),semiMajor:oe(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:Da(e.get("eccentricity")?.[0],"eccentricity"),period:oe(e.get("period")?.[0],"period"),angle:oe(e.get("angle")?.[0],"angle"),inclination:oe(e.get("inclination")?.[0],"inclination"),phase:oe(e.get("phase")?.[0],"phase")};if(r){let a=G(r);return{mode:"at",target:a,reference:vr(a,r.location)}}if(n)return{mode:"surface",target:G(n)};if(i){let a=G(i),s=wt(a);return{mode:"free",distance:s??void 0,descriptor:s?void 0:a}}return null}function Ma(e,t){let r={};for(let[n,i]of t.entries()){let o=i[0],a=Me(n);!o||!a?.legacySchema||a.legacySchema.placement||(vt(n,e,o.location),r[n]=$r(n,o.values,o.location))}return r}function Dr(e,t){let r={};for(let n of e){if(n.key in r)throw f.fromLocation(`Duplicate ${t} key "${n.key}"`,n.location);r[n.key]=n.value}return r}function Ta(e){let t={};for(let r of Object.keys(e)){let n=e[r];n?.length&&(t[r]=Dr(n,r))}return t}function Ea(e){let t={},r=e.get("renderLabel")?.[0],n=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return r&&(t.renderLabel=q(G(r),"renderLabel",r.location)),n&&(t.renderOrbit=q(G(n),"renderOrbit",n.location)),i&&(t.renderPriority=Je(G(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function Pa(e){if(e.values.length!==2)throw f.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw f.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function La(e){if(e.values.length!==2)throw f.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function Aa(e){if(e.values.length!==2)throw f.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],r=wt(t),n=Number(t);return{field:e.values[0],value:r??(Number.isFinite(n)?n:t)}}function Fa(e){return e?[...new Set(e.values)]:[]}function ce(e){return e&&e.values.join(" ").trim()||null}function oe(e,t){return e?_(G(e),e.location,t):void 0}function Da(e,t){return e?Je(G(e),t,e.location):void 0}function G(e){return Se(e.values,e.key,e.location)}function Me(e){return et.get(e)}function Rr(e,t){for(let r of e){let n=Me(r.key);if(!n)throw f.fromLocation(`Unknown field "${r.key}"`,r.location);if(n.legacySchema){vt(r.key,t,r.location);continue}if((r.key==="renderLabel"||r.key==="renderOrbit"||r.key==="tidalLock")&&r.values.length!==1)throw f.fromLocation(`Field "${r.key}" expects exactly one value`,r.location)}}function Y(e,t,r,n){ge(e,"2.1")&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${r}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:n.line,column:n.column})}function ue(e,t,r,n){ge(e,"2.5")&&t.push({code:"parse.schema25.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${r}" requires schema 2.5; parsed in compatibility mode because the document header is "schema ${e}".`,line:n.line,column:n.column})}function he(e,t,r,n){ge(e,"3.0")&&t.push({code:"parse.schema30.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${r}" requires schema 3.0; parsed in compatibility mode because the document header is "schema ${e}".`,line:n.line,column:n.column})}function U(e,t,r,n){ge(e,"3.1")&&t.push({code:"parse.schema31.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${r}" requires schema 3.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:n.line,column:n.column})}function ge(e,t){return Sr(e)<Sr(t)}function Sr(e){switch(e){case"2.0-draft":return 0;case"2.0":return 1;case"2.1":return 2;case"2.5":return 3;case"2.6":return 4;case"3.0":return 5;case"3.1":return 6;default:return 7}}function Ra(e){let t=[...e],r=[],n=!1,i=!1,o=null,a=1,s=1;for(let l=0;l<t.length;l++){let c=t[l],u=t[l+1];if(i){if(c==="*"&&u==="/"){t[l]=" ",t[l+1]=" ",i=!1,o=null,l++,s+=2;continue}c!==`
|
|
2
|
+
`&&c!=="\r"&&(t[l]=" "),c===`
|
|
3
|
+
`?(a++,s=1):s++;continue}if(!n&&c==="/"&&u==="*"){r.push({kind:"block",line:a,column:s}),t[l]=" ",t[l+1]=" ",i=!0,o={line:a,column:s},l++,s+=2;continue}if(!n&&c==="#"&&!Ca(t,l)){r.push({kind:"line",line:a,column:s}),t[l]=" ";let d=l+1;for(;d<t.length&&t[d]!==`
|
|
4
|
+
`&&t[d]!=="\r";)t[d]=" ",d++;s+=d-l,l=d-1;continue}c==='"'&&t[l-1]!=="\\"&&(n=!n),c===`
|
|
5
|
+
`?(a++,s=1):s++}if(i)throw f.fromLocation("Unclosed block comment",o??void 0);return{source:t.join(""),comments:r}}function Ca(e,t){let r=t+1,n=0;for(;r<e.length&&/[0-9a-f]/i.test(e[r]??"");)r++,n++;if(![3,4,6,8].includes(n))return!1;let i=e[r];return i===void 0||i===" "||i===" "||i==="\r"||i===`
|
|
6
|
+
`}var Va=/^schema\s+(?:2(?:\.0|\.1|\.5|\.6)?|3(?:\.0|\.1)?)$/i,_a=/^schema\s+2\.1$/i,za=/^schema\s+2\.5$/i,Ba=/^schema\s+2\.6$/i,Na=/^schema\s+3(?:\.0)?$/i,Wa=/^schema\s+3\.1$/i,Ua=/^schema\s+2\.0-draft$/i;function Ya(e){for(let t of Ha(e).split(/\r?\n/)){let r=t.trim();if(r)return Ua.test(r)?"2.0-draft":_a.test(r)?"2.1":za.test(r)?"2.5":Ba.test(r)?"2.6":Na.test(r)?"3.0":Wa.test(r)?"3.1":Va.test(r)?"2.0":"1.0"}return"1.0"}function Ha(e){let t=[...e],r=!1,n=!1;for(let i=0;i<t.length;i++){let o=t[i],a=t[i+1];if(n){if(o==="*"&&a==="/"){t[i]=" ",t[i+1]=" ",n=!1,i++;continue}o!==`
|
|
7
|
+
`&&o!=="\r"&&(t[i]=" ");continue}if(!r&&o==="/"&&a==="*"){t[i]=" ",t[i+1]=" ",n=!0,i++;continue}if(!r&&o==="#"){t[i]=" ";let s=i+1;for(;s<t.length&&t[s]!==`
|
|
8
|
+
`&&t[s]!=="\r";)t[s]=" ",s++;i=s-1;continue}o==='"'&&t[i-1]!=="\\"&&(r=!r)}return t.join("")}function Cr(e){let t=Ya(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1"||t==="2.5"||t==="2.6"||t==="3.0"||t==="3.1")return qa(e,t);let r;try{r=ut(e)}catch(i){return{ok:!1,value:null,diagnostics:[pe(i,"parse")]}}let n;try{n=ct(r)}catch(i){return{ok:!1,value:null,diagnostics:[pe(i,"normalize")]}}try{dt(n)}catch(i){return{ok:!1,value:null,diagnostics:[pe(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:r,document:n,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function qa(e,t){let r;try{r=Mr(e)}catch(a){return{ok:!1,value:null,diagnostics:[pe(a,"parse","load.atlas.failed")]}}let n=[...r.diagnostics];if(n.some(a=>a.severity==="error"))return{ok:!1,value:null,diagnostics:n};let i;try{i=yr(r)}catch(a){return{ok:!1,value:null,diagnostics:[pe(a,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:r,draftDocument:r,diagnostics:n},diagnostics:n}}function Vr(e){return e.line?e.column?`Line ${e.line}, Column ${e.column}`:`Line ${e.line}`:"No position"}function tt(e){let t=e.filter(n=>n.severity==="error").length,r=e.filter(n=>n.severity==="warning").length;return!t&&!r?"Ready":t&&r?`${t} error${t===1?"":"s"}, ${r} warning${r===1?"":"s"}`:t?`${t} error${t===1?"":"s"}`:`${r} warning${r===1?"":"s"}`}var _r="WorldOrbit Quick Start";function zr(){return["```worldorbit","schema 2.5","","system Sol",' title "Solar System"'," referencePlane ecliptic","","defaults"," view orthographic"," preset atlas-card","","group inner-system",' label "Inner System"',"","object star Sun"," mass 1sol","","object planet Mercury"," orbit Sun"," semiMajor 0.39au"," color #b7b1a7"," groups inner-system","","object planet Venus"," orbit Sun"," semiMajor 0.72au"," color #d9b37a"," groups inner-system","","object planet Earth"," orbit Sun"," semiMajor 1au"," color #6fa8ff"," atmosphere nitrogen-oxygen"," groups inner-system","","object moon Luna"," orbit Earth"," distance 384400km","","object planet Mars"," orbit Sun"," semiMajor 1.52au"," color #d97c52"," groups inner-system","```"].join(`
|
|
9
|
+
`)}var Te=require("obsidian");function Br(e){let r=e.text.split(/\r?\n/).findIndex(n=>/^\s*(```+|~~~+)\s*worldorbit(?:\s+.*)?$/i.test(n));return e.lineStart+(r>=0?r+1:1)}function Nr(e,t){return!t.line||t.line<1?null:{line:e+t.line-1,ch:Math.max((t.column??1)-1,0)}}function Wr(e,t){if(!e.sourcePath)return null;let r=e.getSectionInfo(t);return r?{sourcePath:e.sourcePath,contentStartLine:Br(r)}:null}async function Ur(e,t,r,n){let i=Nr(r,n);if(!i)return!1;let o=e.vault.getAbstractFileByPath(t);if(!(o instanceof Te.TFile))return!1;let a=e.workspace.getMostRecentLeaf()??e.workspace.getLeaf(!0);await a.openFile(o);let s=a.view instanceof Te.MarkdownView?a.view:e.workspace.getActiveViewOfType(Te.MarkdownView);return s?(s.editor.setCursor(i),s.editor.focus(),!0):!1}var kt={embeddedInteraction:"locked",showWarnings:!1,showFullscreenButton:!0};function Ga(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:St(e.objectTypes??[]),tags:St((e.tags??[]).map(r=>r.trim()).filter(Boolean)),groupIds:St((e.groupIds??[]).map(r=>r.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return Xa(t)?t:null}function Xa(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function Yr(e,t){let r=Ga(t),n=new Set;for(let i of e.objects)if(!i.hidden&&Ka(i,r)&&(n.add(i.objectId),r?.includeAncestors!==!1))for(let o of i.ancestorIds)n.add(o);return r?n:new Set(e.objects.filter(i=>!i.hidden).map(i=>i.objectId))}function Ka(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 r=e.semanticGroupIds.length>0&&t.groupIds.some(i=>e.semanticGroupIds.includes(i)),n=!!(e.groupId&&t.groupIds.includes(e.groupId));if(!r&&!n)return!1}if(t.tags?.length){let r=Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(n=>typeof n=="string"):[];if(!t.tags.every(n=>r.includes(n)))return!1}if(t.query?.trim()){let r=Za(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(i=>r.includes(i)))return!1}return!0}function Za(e,t){let r=Object.values(e.info),n=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,...n,...r].join(" ")}function St(e){return[...new Set(e)]}var Ja={background:!0,guides:!0,relations:!0,events:!0,orbits:!0,trajectories:!0,objects:!0,labels:!0,structures:!0,metadata:!0},rt={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",spaceFog:"#07131d",starfield:"rgba(226, 239, 255, 0.9)",starfieldDim:"rgba(164, 194, 228, 0.45)",objectSpecular:"#f5f8ff",orbitOpacity:.34,orbitBandOpacity:.24,selectionHalo:"rgba(255, 214, 139, 0.9)",atmosphere:"rgba(143, 202, 255, 0.4)",cometTail:"rgba(193, 243, 255, 0.7)",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",spaceFog:"#071723",starfield:"rgba(220, 255, 245, 0.9)",starfieldDim:"rgba(124, 212, 195, 0.42)",objectSpecular:"#ecfffb",orbitOpacity:.3,orbitBandOpacity:.22,selectionHalo:"rgba(120, 255, 215, 0.85)",atmosphere:"rgba(120, 255, 215, 0.32)",cometTail:"rgba(181, 255, 236, 0.68)",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",spaceFog:"#1c0d12",starfield:"rgba(255, 232, 214, 0.88)",starfieldDim:"rgba(255, 176, 138, 0.38)",objectSpecular:"#fff0e6",orbitOpacity:.3,orbitBandOpacity:.24,selectionHalo:"rgba(255, 178, 125, 0.85)",atmosphere:"rgba(255, 190, 140, 0.26)",cometTail:"rgba(255, 214, 173, 0.62)",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'}};function Ee(e){return e?typeof e=="string"?rt[e]??rt.atlas:{...rt.atlas,...e}:rt.atlas}function Hr(e){return{...Ja,...e}}var nt="worldorbit-camera-root";function Ae(e,t={}){let r=Ee(t.theme),n=gs(t.preset??e.renderPreset??void 0),i=Hr({...n.layers,...t.layers}),o=t.subtitle??e.subtitle,a=Yr(e,t.filter??null),s=e.objects.filter(m=>!m.hidden).filter(m=>a.has(m.objectId)).filter(m=>i.structures||!Pe(m.object)).sort((m,j)=>m.sortKey-j.sortKey),l=e.labels.filter(m=>!m.hidden).filter(m=>a.has(m.objectId)).filter(m=>i.structures||!Pe(m.object)),c=ns(s),u=i.orbits?rs(e,a,i.structures):{back:"",front:""},d=i.guides?e.leaders.filter(m=>!m.hidden).filter(m=>a.has(m.objectId)).filter(m=>i.structures||!Pe(m.object)).map(m=>`<line class="wo-leader wo-leader-${m.mode}" x1="${m.x1}" y1="${m.y1}" x2="${m.x2}" y2="${m.y2}" data-render-id="${P(m.renderId)}" data-group-id="${D(m.groupId??"")}" />`).join(""):"",p=i.relations?e.relations.filter(m=>!m.hidden).filter(m=>a.has(m.fromObjectId)&&a.has(m.toObjectId)).map(m=>`<line class="wo-relation" x1="${m.x1}" y1="${m.y1}" x2="${m.x2}" y2="${m.y2}" data-render-id="${P(m.renderId)}" data-relation-id="${D(m.relationId)}" />`).join(""):"",h=i.trajectories?es(e,a,{showLabels:t.showTrajectoryLabels??!0,showWaypoints:t.showTrajectoryWaypoints??!0,includeStructures:i.structures}):"",g=i.events?e.events.filter(m=>!m.hidden).map(m=>Qa(e,m,a,r)).join(""):"",y=i.objects?s.map(m=>is(m,t.selectedObjectId??null,r)).join(""):"",b=i.labels?l.map(m=>os(e,m,t.selectedObjectId??null)).join(""):"",S=i.metadata?`<text class="wo-title" x="56" y="64">${P(e.title)}</text>
|
|
10
|
+
<text class="wo-subtitle" x="56" y="88">${P(o)}</text>
|
|
11
|
+
<text class="wo-meta" x="56" y="${e.height-42}">${P(bs(e))}</text>`:"",I=i.background?`<rect class="wo-bg" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
|
|
12
12
|
<rect class="wo-bg-glow" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
|
|
13
|
-
${i.guides?
|
|
14
|
-
<title id="worldorbit-title">${
|
|
15
|
-
<desc id="worldorbit-desc">A ${
|
|
13
|
+
${i.guides?ys(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">
|
|
14
|
+
<title id="worldorbit-title">${P(e.title)}</title>
|
|
15
|
+
<desc id="worldorbit-desc">A ${P(e.viewMode)} WorldOrbit render with ${s.length} visible objects.</desc>
|
|
16
16
|
<defs>
|
|
17
17
|
<linearGradient id="wo-bg" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
18
|
-
<stop offset="0%" stop-color="${
|
|
19
|
-
<stop offset="100%" stop-color="${
|
|
18
|
+
<stop offset="0%" stop-color="${r.backgroundStart}" />
|
|
19
|
+
<stop offset="100%" stop-color="${r.backgroundEnd}" />
|
|
20
20
|
</linearGradient>
|
|
21
21
|
<radialGradient id="wo-star-glow" cx="50%" cy="50%" r="50%">
|
|
22
|
-
<stop offset="0%" stop-color="${
|
|
23
|
-
<stop offset="100%" stop-color="${
|
|
22
|
+
<stop offset="0%" stop-color="${r.starGlow}" stop-opacity="0.95" />
|
|
23
|
+
<stop offset="100%" stop-color="${r.starCore}" stop-opacity="0" />
|
|
24
24
|
</radialGradient>
|
|
25
25
|
<radialGradient id="wo-bg-glow" cx="20%" cy="10%" r="90%">
|
|
26
|
-
<stop offset="0%" stop-color="${
|
|
26
|
+
<stop offset="0%" stop-color="${r.backgroundGlow}" />
|
|
27
27
|
<stop offset="100%" stop-color="transparent" />
|
|
28
28
|
</radialGradient>
|
|
29
|
+
<marker id="wo-trajectory-arrow" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto" markerUnits="strokeWidth">
|
|
30
|
+
<path d="M 0 0 L 12 6 L 0 12 z" fill="${r.accent}" />
|
|
31
|
+
</marker>
|
|
29
32
|
${c}
|
|
30
33
|
</defs>
|
|
31
34
|
<style>
|
|
32
35
|
.wo-bg { fill: url(#wo-bg); }
|
|
33
36
|
.wo-bg-glow { fill: url(#wo-bg-glow); }
|
|
34
|
-
.wo-grid { fill: none; stroke: ${
|
|
35
|
-
.wo-orbit { fill: none; stroke: ${
|
|
37
|
+
.wo-grid { fill: none; stroke: ${r.guide}; stroke-width: 1; }
|
|
38
|
+
.wo-orbit { fill: none; stroke: ${r.orbit}; stroke-width: 1.5; }
|
|
36
39
|
.wo-orbit-back { opacity: 0.38; stroke-dasharray: 8 6; }
|
|
37
40
|
.wo-orbit-front { opacity: 0.9; }
|
|
38
|
-
.wo-orbit-band { stroke: ${
|
|
39
|
-
.wo-relation { stroke: ${
|
|
40
|
-
.wo-
|
|
41
|
-
.wo-
|
|
42
|
-
.wo-
|
|
43
|
-
.wo-
|
|
44
|
-
.wo-
|
|
45
|
-
.wo-
|
|
46
|
-
.wo-
|
|
47
|
-
.wo-
|
|
48
|
-
.wo-
|
|
41
|
+
.wo-orbit-band { stroke: ${r.orbitBand}; stroke-linecap: round; }
|
|
42
|
+
.wo-relation { stroke: ${r.relation}; stroke-width: 2; stroke-dasharray: 10 6; }
|
|
43
|
+
.wo-trajectory { fill: none; stroke: ${r.accent}; stroke-width: 2.4; stroke-linecap: round; stroke-linejoin: round; opacity: 0.92; }
|
|
44
|
+
.wo-trajectory-waypoint { fill: ${r.spaceFog}; stroke: ${r.selected}; stroke-width: 1.4; }
|
|
45
|
+
.wo-trajectory-label { fill: ${r.accent}; font-family: ${r.fontFamily}; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; }
|
|
46
|
+
.wo-trajectory-date { fill: ${r.muted}; font-family: ${r.fontFamily}; font-weight: 500; }
|
|
47
|
+
.wo-event-line { stroke: ${r.accent}; stroke-width: 1.6; stroke-dasharray: 5 5; opacity: 0.72; }
|
|
48
|
+
.wo-event-node { fill: ${r.accent}; stroke: ${r.selected}; stroke-width: 1.4; opacity: 0.92; }
|
|
49
|
+
.wo-event-label { fill: ${r.accent}; font-family: ${r.fontFamily}; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; }
|
|
50
|
+
.wo-leader { stroke: ${r.leader}; stroke-width: 1.5; stroke-dasharray: 6 5; }
|
|
51
|
+
.wo-label { fill: ${r.ink}; font-family: ${r.fontFamily}; font-weight: 600; letter-spacing: 0.02em; }
|
|
52
|
+
.wo-label-secondary { fill: ${r.muted}; font-family: ${r.fontFamily}; font-weight: 500; }
|
|
53
|
+
.wo-title { fill: ${r.ink}; font: 700 24px ${r.displayFont}; letter-spacing: 0.06em; text-transform: uppercase; }
|
|
54
|
+
.wo-subtitle { fill: ${r.muted}; font: 500 12px ${r.fontFamily}; letter-spacing: 0.14em; text-transform: uppercase; }
|
|
55
|
+
.wo-meta { fill: ${r.muted}; font: 500 11px ${r.fontFamily}; letter-spacing: 0.06em; }
|
|
49
56
|
.wo-object { cursor: pointer; outline: none; }
|
|
50
57
|
.wo-object:focus-visible .wo-selection-ring,
|
|
51
58
|
.wo-object:hover .wo-selection-ring,
|
|
52
59
|
.wo-object-selected .wo-selection-ring { display: block; }
|
|
53
|
-
.wo-object-selected .wo-selection-ring { stroke: ${
|
|
54
|
-
.wo-object-label-selected .wo-label { fill: ${
|
|
55
|
-
.wo-object-label-selected .wo-label-secondary { fill: ${
|
|
60
|
+
.wo-object-selected .wo-selection-ring { stroke: ${r.selected}; }
|
|
61
|
+
.wo-object-label-selected .wo-label { fill: ${r.accent}; }
|
|
62
|
+
.wo-object-label-selected .wo-label-secondary { fill: ${r.selected}; }
|
|
56
63
|
.wo-chain-selected .wo-selection-ring,
|
|
57
64
|
.wo-chain-hover .wo-selection-ring { display: block; }
|
|
58
65
|
.wo-ancestor-selected .wo-selection-ring,
|
|
59
66
|
.wo-ancestor-hover .wo-selection-ring { display: block; opacity: 0.66; }
|
|
60
67
|
.wo-chain-selected .wo-label,
|
|
61
|
-
.wo-chain-hover .wo-label { fill: ${
|
|
68
|
+
.wo-chain-hover .wo-label { fill: ${r.accent}; }
|
|
62
69
|
.wo-ancestor-selected .wo-label,
|
|
63
|
-
.wo-ancestor-hover .wo-label { fill: ${
|
|
70
|
+
.wo-ancestor-hover .wo-label { fill: ${r.ink}; opacity: 0.82; }
|
|
64
71
|
.wo-orbit-related-selected,
|
|
65
|
-
.wo-orbit-related-hover { stroke: ${
|
|
72
|
+
.wo-orbit-related-hover { stroke: ${r.accentStrong}; opacity: 1; }
|
|
66
73
|
.wo-selection-ring { display: none; fill: none; stroke-width: 2; stroke-dasharray: 6 5; }
|
|
67
74
|
.wo-object-image { pointer-events: none; }
|
|
68
75
|
</style>
|
|
69
|
-
${O}
|
|
70
76
|
${I}
|
|
77
|
+
${S}
|
|
71
78
|
<g data-worldorbit-world="true">
|
|
72
|
-
<g data-worldorbit-camera-root="${
|
|
79
|
+
<g data-worldorbit-camera-root="${nt}" id="${nt}">
|
|
73
80
|
<g data-worldorbit-world-content="true">
|
|
74
81
|
${i.orbits?`<g data-layer-id="orbits-back">${u.back}</g>`:""}
|
|
75
|
-
${i.guides?`<g data-layer-id="guides">${
|
|
82
|
+
${i.guides?`<g data-layer-id="guides">${d}</g>`:""}
|
|
76
83
|
${i.relations?`<g data-layer-id="relations">${p}</g>`:""}
|
|
77
|
-
${i.events?`<g data-layer-id="events">${
|
|
78
|
-
${i.objects?`<g data-layer-id="objects">${
|
|
84
|
+
${i.events?`<g data-layer-id="events">${g}</g>`:""}
|
|
85
|
+
${i.objects?`<g data-layer-id="objects">${y}</g>`:""}
|
|
79
86
|
${i.orbits?`<g data-layer-id="orbits-front">${u.front}</g>`:""}
|
|
80
|
-
${i.
|
|
87
|
+
${i.trajectories?`<g data-layer-id="trajectories">${h}</g>`:""}
|
|
88
|
+
${i.labels?`<g data-layer-id="labels">${b}</g>`:""}
|
|
81
89
|
</g>
|
|
82
90
|
</g>
|
|
83
91
|
</g>
|
|
84
|
-
</svg>`}function
|
|
85
|
-
${
|
|
86
|
-
<circle class="wo-event-node" cx="${t.x}" cy="${t.y}" r="5" fill="${
|
|
87
|
-
<text class="wo-event-label" x="${t.x}" y="${t.y-10}" text-anchor="middle" font-size="10">${
|
|
88
|
-
</g>`}function
|
|
89
|
-
<
|
|
90
|
-
${
|
|
91
|
-
|
|
92
|
-
${
|
|
92
|
+
</svg>`}function Qa(e,t,r,n){let i=t.objectIds.filter(l=>r.has(l)).map(l=>e.objects.find(c=>c.objectId===l&&!c.hidden)).filter(Boolean);if(i.length===0)return"";let o=t.event.color||n.accent,a=t.event.label||t.event.id,s=i.map(l=>`<line class="wo-event-line" x1="${t.x}" y1="${t.y}" x2="${l.x}" y2="${l.y}" stroke="${D(o)}" data-event-id="${D(t.eventId)}" data-object-id="${D(l.objectId)}" />`).join("");return`<g class="wo-event" data-render-id="${P(t.renderId)}" data-event-id="${D(t.eventId)}">
|
|
93
|
+
${s}
|
|
94
|
+
<circle class="wo-event-node" cx="${t.x}" cy="${t.y}" r="5" fill="${D(o)}" />
|
|
95
|
+
<text class="wo-event-label" x="${t.x}" y="${t.y-10}" text-anchor="middle" font-size="10">${P(a)}</text>
|
|
96
|
+
</g>`}function es(e,t,r){return e.trajectories.filter(n=>!n.hidden).filter(n=>n.objectIds.length===0||n.objectIds.some(i=>t.has(i))).filter(n=>r.includeStructures||!n.objectIds.some(i=>{let o=e.objects.find(a=>a.objectId===i)?.object;return o?Pe(o):!1})).map(n=>{let i=n.stroke??"#f0b464",o=n.marker==="none"?"":' marker-end="url(#wo-trajectory-arrow)"',a=n.showWaypoints&&r.showWaypoints?n.waypoints.filter(s=>!s.hidden).map(s=>ts(n,s,r.showLabels)).join(""):"";return`<g class="wo-trajectory-group" data-render-id="${P(n.renderId)}" data-trajectory-id="${D(n.trajectoryId)}">
|
|
97
|
+
<path class="wo-trajectory wo-trajectory-${n.mode}" d="${n.path}" stroke="${D(i)}" stroke-width="${n.strokeWidth}"${o} />
|
|
98
|
+
${a}
|
|
99
|
+
</g>`}).join("")}function ts(e,t,r){let n=r&&e.labelMode!=="hidden"?[t.label?`<text class="wo-trajectory-label" x="${t.x+10}" y="${t.y-10}" font-size="10">${P(t.label)}</text>`:"",t.dateLabel?`<text class="wo-trajectory-date" x="${t.x+10}" y="${t.y+4}" font-size="9">${P(t.dateLabel)}</text>`:""].join(""):"";return`<g class="wo-trajectory-waypoint-group" data-render-id="${P(t.renderId)}" data-trajectory-id="${D(t.trajectoryId)}">
|
|
100
|
+
<circle class="wo-trajectory-waypoint" cx="${t.x}" cy="${t.y}" r="4.5" />
|
|
101
|
+
${n}
|
|
102
|
+
</g>`}function rs(e,t,r){let n=[],i=[];for(let o of e.orbitVisuals.filter(a=>!a.hidden&&t.has(a.objectId)&&(r||!Pe(a.object)))){let a=o.bandThickness??(o.band?10:1.5),s=o.band?"wo-orbit wo-orbit-band wo-orbit-node":"wo-orbit wo-orbit-node",l=`data-render-id="${P(o.renderId)}" data-orbit-object-id="${D(o.objectId)}" data-parent-id="${D(o.parentId)}" data-group-id="${D(o.groupId??"")}"`;if(o.backArcPath||o.frontArcPath){o.backArcPath&&n.push(`<path class="${s} wo-orbit-back" d="${o.backArcPath}" stroke-width="${a}" ${l} />`),o.frontArcPath&&i.push(`<path class="${s} wo-orbit-front" d="${o.frontArcPath}" stroke-width="${a}" ${l} />`);continue}if(o.kind==="ellipse"){let c=o.rx??o.radius??0,u=o.ry??o.radius??0;i.push(`<ellipse class="${s} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" rx="${c}" ry="${u}" transform="rotate(${o.rotationDeg} ${o.cx} ${o.cy})" stroke-width="${a}" ${l} />`);continue}i.push(`<circle class="${s} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" r="${o.radius??0}" stroke-width="${a}" ${l} />`)}return{back:n.join(""),front:i.join("")}}function ns(e){return e.filter(t=>!!t.imageHref).map(t=>ls(t)).join("")}function is(e,t,r){let{object:n,x:i,y:o,radius:a,visualRadius:s}=e,l=t===e.objectId?" wo-object-selected":"",c=n.properties.kind?` wo-kind-${String(n.properties.kind).toLowerCase().replace(/[^a-z0-9-]/g,"-")}`:"",u=us(e,r),d=ss(e),p=d?qr(n,i,o,a,u,{outlineOnly:!0}):"";return`<g class="wo-object wo-object-${n.type}${c}${l}" data-object-id="${P(e.objectId)}" data-parent-id="${D(e.parentId??"")}" data-group-id="${D(e.groupId??"")}" data-render-id="${P(e.renderId)}" tabindex="0" role="button" aria-label="${P(`${n.type} ${e.objectId}`)}">
|
|
103
|
+
<circle class="wo-selection-ring" cx="${i}" cy="${o}" r="${s+8}" />
|
|
104
|
+
${as(e,u)}
|
|
105
|
+
${qr(n,i,o,a,u)}
|
|
106
|
+
${d}
|
|
93
107
|
${p}
|
|
94
|
-
</g>`}function
|
|
95
|
-
<text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*i}">${
|
|
96
|
-
<text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*i}">${
|
|
97
|
-
</g>`}function
|
|
98
|
-
<circle cx="${t}" cy="${
|
|
99
|
-
<circle cx="${t}" cy="${
|
|
100
|
-
<circle cx="${t}" cy="${
|
|
101
|
-
<ellipse cx="${t}" cy="${
|
|
102
|
-
<circle cx="${t}" cy="${
|
|
103
|
-
<circle cx="${t}" cy="${
|
|
104
|
-
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="1" />`:`<polygon points="${xt(t,n,r)}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`}}}function Wa(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 Ya(e){if(!e.imageHref)return"";let t=Ga(e);return`<image class="wo-object-image" x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" href="${R(e.imageHref)}" preserveAspectRatio="xMidYMid slice" clip-path="url(#${R(Un(e))})" />`}function Ha(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="${It(t,n,r)}" />`;break;case"phenomenon":i=`<polygon points="${xt(t,n,r)}" />`;break;default:return""}return`<clipPath id="${R(Un(e))}" clipPathUnits="userSpaceOnUse">${i}</clipPath>`}function Ga(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 qa(e,t){let n=String(e.object.properties.kind??"").toLowerCase().replace(/_/g,"-"),r=Xa(e.object.type,n,t),i=e.fillColor&&is(e.fillColor)?e.fillColor:r.fill,o=Bn(e.object.properties.albedo),a=Bn(e.object.properties.temperature),l=Za(i,a,o,e.object.type),s=Me(l,"#ffffff",.4)??r.stroke,c=Qa(e.object.properties.atmosphere),u=e.object.type==="star"?Nn(Me(l,"#fff2cb",.4)??l,.82):void 0;return{fill:l,stroke:s,glow:u,atmosphere:c,tail:e.object.type==="comet"?Nn(Me(l,"#ffffff",.5)??l,.72):void 0}}function Xa(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"craft":return{fill:"#ffb47f",stroke:"#fff0d3"};case"structure":return{fill:n.accentStrong,stroke:"#fff2ea"};case"phenomenon":return Ka(t)}}function Ka(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 Za(e,t,n,r){let i=e;if(t!==null){let o=Ja(t,r);i=Me(i,o,r==="star"?.42:.2)??i}if(n!==null){let o=Math.min(Math.max(n,0),1);i=Me(i,o>=.5?"#ffffff":"#0f1520",Math.abs(o-.5)*.7)??i}return i}function Ja(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function Qa(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 es(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 Bn(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function Un(e){return`${e.renderId}-clip`}function It(e,t,n){return`${e},${t-n} ${e+n},${t} ${e},${t+n} ${e-n},${t}`}function xt(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 ts(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 ns(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function Je(e){return e.type==="structure"||e.type==="phenomenon"}function Me(e,t,n){let r=kt(e),i=kt(t);if(!r||!i)return;let o=Math.min(Math.max(n,0),1);return rs({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 Nn(e,t){let n=kt(e);return n?`rgba(${n.r}, ${n.g}, ${n.b}, ${t})`:e}function kt(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 rs(e){let t=n=>n.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function is(e){return!!e.trim()}function D(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function R(e){return D(e)}var Wn={scale:1,rotationDeg:0,translateX:0,translateY:0,selectedObjectId:null};function Yn(e,t){return Math.min(Math.max(e,t.minScale),t.maxScale)}function Hn(e,t,n){return{...e,translateX:e.translateX+t,translateY:e.translateY+n}}function Gn(e,t,n,r,i){if(!Number.isFinite(n)||n<=0)return t;let o=jt(e),a=Yn(t.scale*n,i);if(a===t.scale)return t;let l=a/t.scale,s=r.x-o.x,c=r.y-o.y;return{...t,scale:a,translateX:(1-l)*s+l*t.translateX,translateY:(1-l)*c+l*t.translateY}}function St(e,t,n){let r=jt(e),i=os(e.contentBounds,r,t.rotationDeg),o=Math.max(e.width-n.fitPadding*2,1),a=Math.max(e.height-n.fitPadding*2,1),l=Math.max(i.width,1),s=Math.max(i.height,1),c=Yn(Math.min(o/l,a/s),n),u=ut({x:e.contentBounds.centerX,y:e.contentBounds.centerY},r,t.rotationDeg);return{...t,scale:c,translateX:r.x-(r.x+(u.x-r.x)*c),translateY:r.y-(r.y+(u.y-r.y)*c)}}function qn(e,t){let n=jt(e);return`translate(${t.translateX} ${t.translateY}) translate(${n.x} ${n.y}) rotate(${t.rotationDeg}) scale(${t.scale}) translate(${-n.x} ${-n.y})`}function jt(e){return{x:e.width/2,y:e.height/2}}function os(e,t,n){let r=[{x:e.minX,y:e.minY},{x:e.maxX,y:e.minY},{x:e.maxX,y:e.maxY},{x:e.minX,y:e.maxY}].map(s=>ut(s,t,n)),i=Math.min(...r.map(s=>s.x)),o=Math.min(...r.map(s=>s.y)),a=Math.max(...r.map(s=>s.x)),l=Math.max(...r.map(s=>s.y));return{minX:i,minY:o,maxX:a,maxY:l,width:a-i,height:l-o,centerX:i+(a-i)/2,centerY:o+(l-o)/2}}var Ot={minScale:.2,maxScale:8,fitPadding:48};function Xn(e,t,n={}){let r={minScale:n.minScale??Ot.minScale,maxScale:n.maxScale??Ot.maxScale,fitPadding:n.fitPadding??Ot.fitPadding},i={pointer:n.pointer??!0,touch:n.touch??!0,selection:n.selection??!0},o={width:n.width,height:n.height,padding:n.padding,preset:n.preset,theme:n.theme,layers:n.layers,subtitle:n.subtitle,pointer:i.pointer,touch:i.touch,selection:i.selection,minScale:r.minScale,maxScale:r.maxScale,fitPadding:r.fitPadding},a=St(t,Wn,r),l=null,s=null,c=!1,u=null,f=null,p=0,m=e.getAttribute("tabindex"),g=e.style.touchAction;m===null&&(e.tabIndex=0),e.classList.add("wo-viewer-container"),e.style.touchAction=i.touch?"none":g;let y=$=>{if(!i.pointer||c||!l)return;$.preventDefault(),e.focus();let M=q($.clientX,$.clientY),F=as(Math.exp(-$.deltaY*.002),.6,1.6);P(Gn(t,a,F,M,r))},I=$=>{if(c)return;let M=$.pointerType==="touch";M&&!i.touch||!M&&!i.pointer||!M&&$.button!==0||(u=$.pointerId,f={x:$.clientX,y:$.clientY},p=0,e.setPointerCapture?.($.pointerId),e.focus())},O=$=>{if(c||u!==$.pointerId||!f)return;let M=l?.getBoundingClientRect();if(!M||M.width<=0||M.height<=0)return;let F=$.clientX-f.x,G=$.clientY-f.y;f={x:$.clientX,y:$.clientY},p+=Math.hypot(F,G),P(Hn(a,F*(t.width/M.width),G*(t.height/M.height)))},h=$=>{u===$.pointerId&&(u=null,f=null,e.releasePointerCapture?.($.pointerId))},b=$=>{if(c||!i.selection||p>6)return;let M=$.target?.closest(".wo-object[data-object-id]");M&&(P({...a,selectedObjectId:M.dataset.objectId??null}),S())};return e.addEventListener("wheel",y,{passive:!1}),e.addEventListener("pointerdown",I),e.addEventListener("pointermove",O),e.addEventListener("pointerup",h),e.addEventListener("pointercancel",h),e.addEventListener("click",b),S(),{getState(){return{...a}},setState($){P({...a,...$}),"selectedObjectId"in $&&S()},setRenderOptions($){o={...o,...$},S()},fitToSystem(){P(St(t,a,r))},destroy(){c||(c=!0,e.removeEventListener("wheel",y),e.removeEventListener("pointerdown",I),e.removeEventListener("pointermove",O),e.removeEventListener("pointerup",h),e.removeEventListener("pointercancel",h),e.removeEventListener("click",b),m===null&&e.removeAttribute("tabindex"),e.style.touchAction=g,e.replaceChildren(),l=null,s=null)}};function S(){c||(e.innerHTML=Ee(t,{width:o.width,height:o.height,padding:o.padding,preset:o.preset,theme:o.theme,layers:o.layers,subtitle:o.subtitle,selectedObjectId:a.selectedObjectId}),l=e.querySelector("svg"),s=e.querySelector(`[data-worldorbit-camera-root="${Qe}"]`),B())}function B(){s?.setAttribute("transform",qn(t,a))}function P($){a=$,B()}function q($,M){let F=l?.getBoundingClientRect();return!F||F.width<=0||F.height<=0?{x:t.width/2,y:t.height/2}:{x:($-F.left)/F.width*t.width,y:(M-F.top)/F.height*t.height}}}function as(e,t,n){return Math.min(Math.max(e,t),n)}function et(){return{...Oe("atlas"),name:"obsidian",backgroundStart:"var(--background-primary, #10131a)",backgroundEnd:"var(--background-secondary, #171b24)",backgroundGlow:"var(--interactive-accent-hover, rgba(143, 202, 255, 0.18))",panel:"var(--background-secondary-alt, rgba(10, 16, 24, 0.92))",panelLine:"var(--background-modifier-border, rgba(168, 207, 242, 0.2))",relation:"var(--text-accent-hover, rgba(240, 180, 100, 0.42))",orbit:"var(--text-faint, rgba(163, 209, 255, 0.24))",guide:"var(--background-modifier-border-hover, rgba(255, 255, 255, 0.08))",leader:"var(--text-muted, rgba(225, 238, 255, 0.4))",ink:"var(--text-normal, #e8f0ff)",muted:"var(--text-muted, rgba(232, 240, 255, 0.7))",accent:"var(--interactive-accent, #f0b464)",accentStrong:"var(--text-accent-hover, #ff7f5f)",selected:"var(--color-cyan, rgba(255, 214, 139, 0.92))",starCore:"var(--color-yellow, #ffcc67)",starStroke:"var(--text-normal, rgba(255, 245, 203, 0.85))",starGlow:"var(--color-orange, #ffe8a3)",objectSpecular:"var(--text-normal, #f5f8ff)",selectionHalo:"var(--interactive-accent, rgba(255, 214, 139, 0.9))",atmosphere:"var(--color-cyan, rgba(143, 202, 255, 0.4))",cometTail:"var(--color-cyan, rgba(193, 243, 255, 0.7))",fontFamily:'var(--font-interface, "Segoe UI", sans-serif)',displayFont:'var(--font-text, var(--font-interface, "Segoe UI", sans-serif))'}}var me=class{options;viewer=null;state;constructor(t){this.options={...t,createViewer:t.createViewer??ss,renderStatic:t.renderStatic??ls},this.state={interactive:t.interactive,destroyed:!1}}getState(){return{...this.state}}mount(){this.state.destroyed||this.renderCurrent()}setInteractive(t){this.state.destroyed||this.state.interactive===t||(this.state.interactive=t,this.renderCurrent())}resize(){if(!this.state.destroyed){if(this.viewer){let t=Mt(this.options.container,this.options.scene);this.viewer.setRenderOptions(t);return}this.renderCurrent()}}destroy(){this.state.destroyed||(this.state.destroyed=!0,this.destroyViewer(),Zn(this.options.container))}renderCurrent(){if(this.destroyViewer(),Zn(this.options.container),this.state.interactive){let n=Mt(this.options.container,this.options.scene);this.viewer=this.options.createViewer(this.options.container,{scene:this.options.scene,theme:this.options.theme,pointer:this.options.enablePointer,touch:this.options.enableTouch,...n});return}let t=Mt(this.options.container,this.options.scene);this.options.container.innerHTML=this.options.renderStatic(this.options.scene,{theme:this.options.theme,...t})}destroyViewer(){this.viewer?.destroy(),this.viewer=null}};function ss(e,t){return Xn(e,t.scene,{theme:t.theme,pointer:t.pointer,touch:t.touch,selection:!0,width:t.width,height:t.height})}function ls(e,t){return Ee(e,{theme:t.theme,width:t.width,height:t.height})}function Mt(e,t){let n=e.getBoundingClientRect(),r=Kn(e.clientWidth||n.width)??t.width,i=Kn(e.clientHeight||n.height)??Math.max(Math.round(r*(t.height/Math.max(t.width,1))),280);return{width:r,height:i}}function Kn(e){return Number.isFinite(e)&&e>0?Math.round(e):void 0}function Zn(e){if(typeof e.empty=="function"){e.empty();return}e.replaceChildren()}var tt=class extends T.Plugin{settings=vt;async onload(){await this.loadSettings(),this.registerMarkdownCodeBlockProcessor("worldorbit",(t,n,r)=>{let i=new Et(this.app,this,t,n,r);r.addChild(i)}),this.addCommand({id:"insert-solar-system-example",name:"Insert Solar System Example",editorCheckCallback:(t,n)=>(t||cs(n),!0)}),this.addSettingTab(new Lt(this.app,this))}async loadSettings(){let t=await this.loadData();this.settings={...vt,...t}}async saveSettings(){await this.saveData(this.settings)}},Et=class extends T.MarkdownRenderChild{app;plugin;source;context;navigationContext=null;embeddedView=null;resizeObserver=null;intersectionObserver=null;pendingFrameId=null;cleanupComponent=new T.Component;rootEl;toolbarEl;statusEl;actionsEl;hostEl;diagnosticsEl;renderState="idle";loadedSource=null;scene=null;diagnostics=[];constructor(t,n,r,i,o){super(i),this.app=t,this.plugin=n,this.source=r,this.context=o}onload(){this.renderShell()}onunload(){this.renderState="destroyed",this.cancelPendingRender(),this.intersectionObserver?.disconnect(),this.intersectionObserver=null,this.resizeObserver?.disconnect(),this.resizeObserver=null,this.destroyEmbeddedView(),this.cleanupComponent.unload(),this.rootEl?.detach()}renderShell(){if(this.containerEl.empty(),this.navigationContext=Rn(this.context,this.containerEl),this.rootEl=this.containerEl.createDiv({cls:"worldorbit-obsidian-block"}),this.toolbarEl=this.rootEl.createDiv({cls:"worldorbit-obsidian-toolbar"}),this.statusEl=this.toolbarEl.createSpan({cls:"worldorbit-obsidian-status",text:"Preparing WorldOrbit block..."}),this.actionsEl=this.toolbarEl.createDiv({cls:"worldorbit-obsidian-actions"}),this.hostEl=this.rootEl.createDiv({cls:"worldorbit-obsidian-host is-locked"}),this.diagnosticsEl=this.rootEl.createDiv({cls:"worldorbit-obsidian-diagnostics"}),this.attachResizeObserver(),!this.source.trim()){this.statusEl.setText("Empty WorldOrbit block"),this.renderState="idle",this.renderActions(),this.renderEmptyState();return}this.statusEl.setText("Preview will render when this block becomes visible."),this.renderPlaceholder(),this.renderActions(),this.scheduleLazyRender()}scheduleLazyRender(){if(this.intersectionObserver?.disconnect(),typeof IntersectionObserver>"u"){this.queueRender();return}this.intersectionObserver=new IntersectionObserver(t=>{t.some(n=>n.isIntersecting)&&(this.intersectionObserver?.disconnect(),this.intersectionObserver=null,this.queueRender())}),this.intersectionObserver.observe(this.rootEl)}queueRender(){this.renderState!=="idle"||this.pendingFrameId!==null||(this.renderState="queued",this.statusEl.setText("Preparing preview..."),this.pendingFrameId=window.requestAnimationFrame(()=>{this.pendingFrameId=null,this.ensureRendered()}))}ensureRendered(){if(this.renderState==="destroyed"||this.scene||this.loadedSource)return;let t=Tn(this.source);if(this.loadedSource=t.ok?t.value:null,this.diagnostics=this.filterDiagnostics(t.diagnostics),this.diagnosticsEl.empty(),!t.ok||!t.value){this.renderState="rendered-static",this.destroyEmbeddedView(),this.hostEl.empty(),this.hostEl.createDiv({cls:"worldorbit-obsidian-empty",text:"WorldOrbit could not be rendered. Check the diagnostics below."}),this.renderDiagnostics(this.diagnostics,!0),this.renderActions();return}this.scene=Ye(t.value.document),this.mountStaticScene(),this.renderDiagnostics(this.diagnostics,!1),this.renderActions(),this.plugin.settings.embeddedInteraction==="enabled"&&!T.Platform.isMobile?this.mountInteractiveIfNeeded():(this.renderState="rendered-static",this.statusEl.setText(this.diagnostics.length?Ke(this.diagnostics):"Rendered"))}renderActions(){if(this.actionsEl.empty(),this.createIconButton("Help","help-circle",()=>{new Pt(this.app).open()}),!this.source.trim()||(this.plugin.settings.showFullscreenButton&&this.createToolbarButton("Open fullscreen",!1,()=>{this.openFullscreen()}),!this.scene))return;let t=this.renderState==="interactive-mounted";this.createToolbarButton(t?"Lock interaction":"Activate interaction",!t,()=>{if(t){this.mountStaticScene(),this.renderState="rendered-static",this.hostEl.toggleClass("is-locked",!0),this.statusEl.setText(this.diagnostics.length?Ke(this.diagnostics):"Rendered"),this.renderActions();return}this.mountInteractiveIfNeeded()})}renderPlaceholder(){this.destroyEmbeddedView(),this.hostEl.empty(),this.hostEl.createDiv({cls:"worldorbit-obsidian-empty",text:"Preview loads when the block becomes visible. Use fullscreen to render immediately."})}renderEmptyState(){this.destroyEmbeddedView(),this.hostEl.empty(),this.hostEl.createDiv({cls:"worldorbit-obsidian-empty",text:"Type or paste a WorldOrbit document to start. Use the help button or the example command for a ready-made block."}),this.hostEl.createEl("pre",{cls:"worldorbit-obsidian-example",text:["schema 2.5","","system Sol","","object star Sun","","object planet Earth"," orbit Sun"," semiMajor 1au"].join(`
|
|
105
|
-
`)}).setAttr("aria-label","WorldOrbit quick start example")}mountStaticScene(){this.scene&&(this.hostEl.empty(),this.embeddedView?.destroy(),this.embeddedView=new
|
|
106
|
-
`)});let
|
|
108
|
+
</g>`}function os(e,t,r){let n=r===t.objectId?" wo-object-label-selected":"",i=e.scaleModel.labelMultiplier;return`<g class="wo-object-label${n}" data-object-id="${P(t.objectId)}" data-group-id="${D(t.groupId??"")}" data-render-id="${P(t.renderId)}">
|
|
109
|
+
<text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*i}">${P(t.label)}</text>
|
|
110
|
+
<text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*i}">${P(t.secondaryLabel)}</text>
|
|
111
|
+
</g>`}function qr(e,t,r,n,i,o={}){let a=o.outlineOnly?"transparent":i.fill,s=i.tail??i.fill;switch(e.type){case"star":return o.outlineOnly?`<circle cx="${t}" cy="${r}" r="${n}" fill="transparent" stroke="${i.stroke}" stroke-width="2" />`:`<circle cx="${t}" cy="${r}" r="${n*2.4}" fill="${i.glow??"url(#wo-star-glow)"}" opacity="0.84" />
|
|
112
|
+
<circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${i.stroke}" stroke-width="2" />`;case"planet":case"moon":case"belt":case"asteroid":case"ring":return`<circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${i.stroke}" stroke-width="${o.outlineOnly?1.5:1.4}" />`;case"comet":return o.outlineOnly?`<circle cx="${t}" cy="${r}" r="${n}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:`<path d="M ${t-n*2} ${r+n*1.3} Q ${t-n*.7} ${r+n*.3} ${t-n*.45} ${r}" fill="none" stroke="${s}" stroke-width="${Math.max(2,n*.8)}" stroke-linecap="round" opacity="0.85" />
|
|
113
|
+
<circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`;case"craft":return`<polygon points="${Ot(t,r,n*.85)}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${Ot(t,r,n)}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`;case"phenomenon":{let l=String(e.properties.kind??"").toLowerCase().replace(/_/g,"-");return o.outlineOnly?l==="black-hole"||l==="nebula"||l==="galaxy"||l==="dwarf-galaxy"?`<circle cx="${t}" cy="${r}" r="${n}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:`<polygon points="${Mt(t,r,n)}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:l==="black-hole"?`<ellipse cx="${t}" cy="${r}" rx="${n*2.4}" ry="${n*.55}" fill="none" stroke="${i.accentRing??i.stroke}" stroke-width="3.5" />
|
|
114
|
+
<circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${i.stroke}" stroke-width="2" />`:l==="galaxy"?`<ellipse cx="${t}" cy="${r}" rx="${n*2.6}" ry="${n}" fill="${i.halo??"none"}" stroke="none" />
|
|
115
|
+
<ellipse cx="${t}" cy="${r}" rx="${n*1.5}" ry="${n*.42}" fill="${a}" stroke="${i.stroke}" stroke-width="1.2" />
|
|
116
|
+
<circle cx="${t}" cy="${r}" r="${n*.28}" fill="${i.core??"#fff"}" stroke="none" />`:l==="dwarf-galaxy"?`<ellipse cx="${t}" cy="${r}" rx="${n*1.6}" ry="${n*.55}" fill="${a}" stroke="${i.stroke}" stroke-width="1" />
|
|
117
|
+
<circle cx="${t}" cy="${r}" r="${n*.25}" fill="${i.core??"#fff"}" stroke="none" />`:l==="nebula"?`<circle cx="${t}" cy="${r}" r="${n*2.2}" fill="${i.halo??"none"}" stroke="none" />
|
|
118
|
+
<circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${i.stroke}" stroke-width="1" />`:`<polygon points="${Mt(t,r,n)}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`}}}function as(e,t){if(!t.atmosphere)return"";let{object:r,x:n,y:i,radius:o}=e;return r.type!=="planet"&&r.type!=="moon"&&r.type!=="asteroid"?"":`<circle cx="${n}" cy="${i}" r="${o+4}" fill="none" stroke="${t.atmosphere}" stroke-width="4" opacity="0.45" />`}function ss(e){if(!e.imageHref)return"";let t=cs(e);return`<image class="wo-object-image" x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" href="${D(e.imageHref)}" preserveAspectRatio="xMidYMid slice" clip-path="url(#${D(Kr(e))})" />`}function ls(e){let{x:t,y:r,radius:n}=e,i="";switch(e.object.type){case"star":case"planet":case"moon":case"asteroid":case"comet":i=`<circle cx="${t}" cy="${r}" r="${n}" />`;break;case"structure":i=`<polygon points="${Ot(t,r,n)}" />`;break;case"phenomenon":i=`<polygon points="${Mt(t,r,n)}" />`;break;default:return""}return`<clipPath id="${D(Kr(e))}" clipPathUnits="userSpaceOnUse">${i}</clipPath>`}function cs(e){let{object:t,x:r,y:n,radius:i}=e;switch(t.type){case"structure":return{x:r-i,y:n-i,width:i*2,height:i*2};case"phenomenon":return{x:r-i*1.2,y:n-i*1.2,width:i*2.4,height:i*2.4};default:return{x:r-i,y:n-i,width:i*2,height:i*2}}}function us(e,t){let r=String(e.object.properties.kind??"").toLowerCase().replace(/_/g,"-"),n=ds(e.object.type,r,t),i=e.fillColor&&vs(e.fillColor)?e.fillColor:n.fill,o=Gr(e.object.properties.albedo),a=Gr(e.object.properties.temperature),s=ps(i,a,o,e.object.type),l=Le(s,"#ffffff",.4)??n.stroke,c=hs(e.object.properties.atmosphere),u=e.object.type==="star"?Xr(Le(s,"#fff2cb",.4)??s,.82):void 0;return{fill:s,stroke:l,glow:u,atmosphere:c,tail:e.object.type==="comet"?Xr(Le(s,"#ffffff",.5)??s,.72):void 0}}function ds(e,t,r){switch(e){case"star":return{fill:r.starCore,stroke:r.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"craft":return{fill:"#ffb47f",stroke:"#fff0d3"};case"structure":return{fill:r.accentStrong,stroke:"#fff2ea"};case"phenomenon":return fs(t)}}function fs(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 ps(e,t,r,n){let i=e;if(t!==null){let o=ms(t,n);i=Le(i,o,n==="star"?.42:.2)??i}if(r!==null){let o=Math.min(Math.max(r,0),1);i=Le(i,o>=.5?"#ffffff":"#0f1520",Math.abs(o-.5)*.7)??i}return i}function ms(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function hs(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 gs(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 Gr(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function Kr(e){return`${e.renderId}-clip`}function Ot(e,t,r){return`${e},${t-r} ${e+r},${t} ${e},${t+r} ${e-r},${t}`}function Mt(e,t,r){return`${e},${t-r*1.2} ${e+r*.9},${t-r*.3} ${e+r*1.2},${t+r*.8} ${e},${t+r*1.2} ${e-r*1.1},${t+r*.3} ${e-r*.8},${t-r*.8}`}function ys(e,t){let r=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(""),n=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`${r}${n}`}function bs(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function Pe(e){return e.type==="structure"||e.type==="phenomenon"}function Le(e,t,r){let n=Tt(e),i=Tt(t);if(!n||!i)return;let o=Math.min(Math.max(r,0),1);return ws({r:Math.round(n.r+(i.r-n.r)*o),g:Math.round(n.g+(i.g-n.g)*o),b:Math.round(n.b+(i.b-n.b)*o)})}function Xr(e,t){let r=Tt(e);return r?`rgba(${r.r}, ${r.g}, ${r.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 ws(e){let t=r=>r.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function vs(e){return!!e.trim()}function P(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function D(e){return P(e)}var Zr={scale:1,rotationDeg:0,translateX:0,translateY:0,selectedObjectId:null};function Jr(e,t){return Math.min(Math.max(e,t.minScale),t.maxScale)}function Qr(e,t,r){return{...e,translateX:e.translateX+t,translateY:e.translateY+r}}function en(e,t,r,n,i){if(!Number.isFinite(r)||r<=0)return t;let o=Pt(e),a=Jr(t.scale*r,i);if(a===t.scale)return t;let s=a/t.scale,l=n.x-o.x,c=n.y-o.y;return{...t,scale:a,translateX:(1-s)*l+s*t.translateX,translateY:(1-s)*c+s*t.translateY}}function Et(e,t,r){let n=Pt(e),i=$s(e.contentBounds,n,t.rotationDeg),o=Math.max(e.width-r.fitPadding*2,1),a=Math.max(e.height-r.fitPadding*2,1),s=Math.max(i.width,1),l=Math.max(i.height,1),c=Jr(Math.min(o/s,a/l),r),u=gt({x:e.contentBounds.centerX,y:e.contentBounds.centerY},n,t.rotationDeg);return{...t,scale:c,translateX:n.x-(n.x+(u.x-n.x)*c),translateY:n.y-(n.y+(u.y-n.y)*c)}}function tn(e,t){let r=Pt(e);return`translate(${t.translateX} ${t.translateY}) translate(${r.x} ${r.y}) rotate(${t.rotationDeg}) scale(${t.scale}) translate(${-r.x} ${-r.y})`}function Pt(e){return{x:e.width/2,y:e.height/2}}function $s(e,t,r){let n=[{x:e.minX,y:e.minY},{x:e.maxX,y:e.minY},{x:e.maxX,y:e.maxY},{x:e.minX,y:e.maxY}].map(l=>gt(l,t,r)),i=Math.min(...n.map(l=>l.x)),o=Math.min(...n.map(l=>l.y)),a=Math.max(...n.map(l=>l.x)),s=Math.max(...n.map(l=>l.y));return{minX:i,minY:o,maxX:a,maxY:s,width:a-i,height:s-o,centerX:i+(a-i)/2,centerY:o+(s-o)/2}}var Lt={minScale:.2,maxScale:8,fitPadding:48};function rn(e,t,r={}){let n={minScale:r.minScale??Lt.minScale,maxScale:r.maxScale??Lt.maxScale,fitPadding:r.fitPadding??Lt.fitPadding},i={pointer:r.pointer??!0,touch:r.touch??!0,selection:r.selection??!0},o={width:r.width,height:r.height,padding:r.padding,preset:r.preset,theme:r.theme,layers:r.layers,subtitle:r.subtitle,pointer:i.pointer,touch:i.touch,selection:i.selection,minScale:n.minScale,maxScale:n.maxScale,fitPadding:n.fitPadding},a=Et(t,Zr,n),s=null,l=null,c=!1,u=null,d=null,p=0,h=e.getAttribute("tabindex"),g=e.style.touchAction;h===null&&(e.tabIndex=0),e.classList.add("wo-viewer-container"),e.style.touchAction=i.touch?"none":g;let y=$=>{if(!i.pointer||c||!s)return;$.preventDefault(),e.focus();let M=Z($.clientX,$.clientY),R=Is(Math.exp(-$.deltaY*.002),.6,1.6);L(en(t,a,R,M,n))},b=$=>{if(c)return;let M=$.pointerType==="touch";M&&!i.touch||!M&&!i.pointer||!M&&$.button!==0||(u=$.pointerId,d={x:$.clientX,y:$.clientY},p=0,e.setPointerCapture?.($.pointerId),e.focus())},S=$=>{if(c||u!==$.pointerId||!d)return;let M=s?.getBoundingClientRect();if(!M||M.width<=0||M.height<=0)return;let R=$.clientX-d.x,X=$.clientY-d.y;d={x:$.clientX,y:$.clientY},p+=Math.hypot(R,X),L(Qr(a,R*(t.width/M.width),X*(t.height/M.height)))},I=$=>{u===$.pointerId&&(u=null,d=null,e.releasePointerCapture?.($.pointerId))},m=$=>{if(c||!i.selection||p>6)return;let M=$.target?.closest(".wo-object[data-object-id]");M&&(L({...a,selectedObjectId:M.dataset.objectId??null}),j())};return e.addEventListener("wheel",y,{passive:!1}),e.addEventListener("pointerdown",b),e.addEventListener("pointermove",S),e.addEventListener("pointerup",I),e.addEventListener("pointercancel",I),e.addEventListener("click",m),j(),{getState(){return{...a}},setState($){L({...a,...$}),"selectedObjectId"in $&&j()},setRenderOptions($){o={...o,...$},j()},fitToSystem(){L(Et(t,a,n))},destroy(){c||(c=!0,e.removeEventListener("wheel",y),e.removeEventListener("pointerdown",b),e.removeEventListener("pointermove",S),e.removeEventListener("pointerup",I),e.removeEventListener("pointercancel",I),e.removeEventListener("click",m),h===null&&e.removeAttribute("tabindex"),e.style.touchAction=g,e.replaceChildren(),s=null,l=null)}};function j(){c||(e.innerHTML=Ae(t,{width:o.width,height:o.height,padding:o.padding,preset:o.preset,theme:o.theme,layers:o.layers,subtitle:o.subtitle,selectedObjectId:a.selectedObjectId}),s=e.querySelector("svg"),l=e.querySelector(`[data-worldorbit-camera-root="${nt}"]`),B())}function B(){l?.setAttribute("transform",tn(t,a))}function L($){a=$,B()}function Z($,M){let R=s?.getBoundingClientRect();return!R||R.width<=0||R.height<=0?{x:t.width/2,y:t.height/2}:{x:($-R.left)/R.width*t.width,y:(M-R.top)/R.height*t.height}}}function Is(e,t,r){return Math.min(Math.max(e,t),r)}function it(){return{...Ee("atlas"),name:"obsidian",backgroundStart:"var(--background-primary, #10131a)",backgroundEnd:"var(--background-secondary, #171b24)",backgroundGlow:"var(--interactive-accent-hover, rgba(143, 202, 255, 0.18))",panel:"var(--background-secondary-alt, rgba(10, 16, 24, 0.92))",panelLine:"var(--background-modifier-border, rgba(168, 207, 242, 0.2))",relation:"var(--text-accent-hover, rgba(240, 180, 100, 0.42))",orbit:"var(--text-faint, rgba(163, 209, 255, 0.24))",guide:"var(--background-modifier-border-hover, rgba(255, 255, 255, 0.08))",leader:"var(--text-muted, rgba(225, 238, 255, 0.4))",ink:"var(--text-normal, #e8f0ff)",muted:"var(--text-muted, rgba(232, 240, 255, 0.7))",accent:"var(--interactive-accent, #f0b464)",accentStrong:"var(--text-accent-hover, #ff7f5f)",selected:"var(--color-cyan, rgba(255, 214, 139, 0.92))",starCore:"var(--color-yellow, #ffcc67)",starStroke:"var(--text-normal, rgba(255, 245, 203, 0.85))",starGlow:"var(--color-orange, #ffe8a3)",objectSpecular:"var(--text-normal, #f5f8ff)",selectionHalo:"var(--interactive-accent, rgba(255, 214, 139, 0.9))",atmosphere:"var(--color-cyan, rgba(143, 202, 255, 0.4))",cometTail:"var(--color-cyan, rgba(193, 243, 255, 0.7))",fontFamily:'var(--font-interface, "Segoe UI", sans-serif)',displayFont:'var(--font-text, var(--font-interface, "Segoe UI", sans-serif))'}}var ye=class{options;viewer=null;state;constructor(t){this.options={...t,createViewer:t.createViewer??xs,renderStatic:t.renderStatic??js},this.state={interactive:t.interactive,destroyed:!1}}getState(){return{...this.state}}mount(){this.state.destroyed||this.renderCurrent()}setInteractive(t){this.state.destroyed||this.state.interactive===t||(this.state.interactive=t,this.renderCurrent())}resize(){if(!this.state.destroyed){if(this.viewer){let t=At(this.options.container,this.options.scene);this.viewer.setRenderOptions(t);return}this.renderCurrent()}}destroy(){this.state.destroyed||(this.state.destroyed=!0,this.destroyViewer(),on(this.options.container))}renderCurrent(){if(this.destroyViewer(),on(this.options.container),this.state.interactive){let r=At(this.options.container,this.options.scene);this.viewer=this.options.createViewer(this.options.container,{scene:this.options.scene,theme:this.options.theme,pointer:this.options.enablePointer,touch:this.options.enableTouch,...r});return}let t=At(this.options.container,this.options.scene);this.options.container.innerHTML=this.options.renderStatic(this.options.scene,{theme:this.options.theme,...t})}destroyViewer(){this.viewer?.destroy(),this.viewer=null}};function xs(e,t){return rn(e,t.scene,{theme:t.theme,pointer:t.pointer,touch:t.touch,selection:!0,width:t.width,height:t.height})}function js(e,t){return Ae(e,{theme:t.theme,width:t.width,height:t.height})}function At(e,t){let r=e.getBoundingClientRect(),n=nn(e.clientWidth||r.width)??t.width,i=nn(e.clientHeight||r.height)??Math.max(Math.round(n*(t.height/Math.max(t.width,1))),280);return{width:n,height:i}}function nn(e){return Number.isFinite(e)&&e>0?Math.round(e):void 0}function on(e){if(typeof e.empty=="function"){e.empty();return}e.replaceChildren()}var ot=class extends E.Plugin{settings=kt;async onload(){await this.loadSettings(),this.registerMarkdownCodeBlockProcessor("worldorbit",(t,r,n)=>{let i=new Ft(this.app,this,t,r,n);n.addChild(i)}),this.addCommand({id:"insert-solar-system-example",name:"Insert Solar System Example",editorCheckCallback:(t,r)=>(t||ks(r),!0)}),this.addSettingTab(new Ct(this.app,this))}async loadSettings(){let t=await this.loadData();this.settings={...kt,...t}}async saveSettings(){await this.saveData(this.settings)}},Ft=class extends E.MarkdownRenderChild{app;plugin;source;context;navigationContext=null;embeddedView=null;resizeObserver=null;intersectionObserver=null;pendingFrameId=null;cleanupComponent=new E.Component;rootEl;toolbarEl;statusEl;actionsEl;hostEl;diagnosticsEl;renderState="idle";loadedSource=null;scene=null;diagnostics=[];constructor(t,r,n,i,o){super(i),this.app=t,this.plugin=r,this.source=n,this.context=o}onload(){this.renderShell()}onunload(){this.renderState="destroyed",this.cancelPendingRender(),this.intersectionObserver?.disconnect(),this.intersectionObserver=null,this.resizeObserver?.disconnect(),this.resizeObserver=null,this.destroyEmbeddedView(),this.cleanupComponent.unload(),this.rootEl?.detach()}renderShell(){if(this.containerEl.empty(),this.navigationContext=Wr(this.context,this.containerEl),this.rootEl=this.containerEl.createDiv({cls:"worldorbit-obsidian-block"}),this.toolbarEl=this.rootEl.createDiv({cls:"worldorbit-obsidian-toolbar"}),this.statusEl=this.toolbarEl.createSpan({cls:"worldorbit-obsidian-status",text:"Preparing WorldOrbit block..."}),this.actionsEl=this.toolbarEl.createDiv({cls:"worldorbit-obsidian-actions"}),this.hostEl=this.rootEl.createDiv({cls:"worldorbit-obsidian-host is-locked"}),this.diagnosticsEl=this.rootEl.createDiv({cls:"worldorbit-obsidian-diagnostics"}),this.attachResizeObserver(),!this.source.trim()){this.statusEl.setText("Empty WorldOrbit block"),this.renderState="idle",this.renderActions(),this.renderEmptyState();return}this.statusEl.setText("Preview will render when this block becomes visible."),this.renderPlaceholder(),this.renderActions(),this.scheduleLazyRender()}scheduleLazyRender(){if(this.intersectionObserver?.disconnect(),typeof IntersectionObserver>"u"){this.queueRender();return}this.intersectionObserver=new IntersectionObserver(t=>{t.some(r=>r.isIntersecting)&&(this.intersectionObserver?.disconnect(),this.intersectionObserver=null,this.queueRender())}),this.intersectionObserver.observe(this.rootEl)}queueRender(){this.renderState!=="idle"||this.pendingFrameId!==null||(this.renderState="queued",this.statusEl.setText("Preparing preview..."),this.pendingFrameId=window.requestAnimationFrame(()=>{this.pendingFrameId=null,this.ensureRendered()}))}ensureRendered(){if(this.renderState==="destroyed"||this.scene||this.loadedSource)return;let t=Cr(this.source);if(this.loadedSource=t.ok?t.value:null,this.diagnostics=this.filterDiagnostics(t.diagnostics),this.diagnosticsEl.empty(),!t.ok||!t.value){this.renderState="rendered-static",this.destroyEmbeddedView(),this.hostEl.empty(),this.hostEl.createDiv({cls:"worldorbit-obsidian-empty",text:"WorldOrbit could not be rendered. Check the diagnostics below."}),this.renderDiagnostics(this.diagnostics,!0),this.renderActions();return}this.scene=Ke(t.value.document),this.mountStaticScene(),this.renderDiagnostics(this.diagnostics,!1),this.renderActions(),this.plugin.settings.embeddedInteraction==="enabled"&&!E.Platform.isMobile?this.mountInteractiveIfNeeded():(this.renderState="rendered-static",this.statusEl.setText(this.diagnostics.length?tt(this.diagnostics):"Rendered"))}renderActions(){if(this.actionsEl.empty(),this.createIconButton("Help","help-circle",()=>{new Rt(this.app).open()}),!this.source.trim()||(this.plugin.settings.showFullscreenButton&&this.createToolbarButton("Open fullscreen",!1,()=>{this.openFullscreen()}),!this.scene))return;let t=this.renderState==="interactive-mounted";this.createToolbarButton(t?"Lock interaction":"Activate interaction",!t,()=>{if(t){this.mountStaticScene(),this.renderState="rendered-static",this.hostEl.toggleClass("is-locked",!0),this.statusEl.setText(this.diagnostics.length?tt(this.diagnostics):"Rendered"),this.renderActions();return}this.mountInteractiveIfNeeded()})}renderPlaceholder(){this.destroyEmbeddedView(),this.hostEl.empty(),this.hostEl.createDiv({cls:"worldorbit-obsidian-empty",text:"Preview loads when the block becomes visible. Use fullscreen to render immediately."})}renderEmptyState(){this.destroyEmbeddedView(),this.hostEl.empty(),this.hostEl.createDiv({cls:"worldorbit-obsidian-empty",text:"Type or paste a WorldOrbit document to start. Use the help button or the example command for a ready-made block."}),this.hostEl.createEl("pre",{cls:"worldorbit-obsidian-example",text:["schema 2.5","","system Sol","","object star Sun","","object planet Earth"," orbit Sun"," semiMajor 1au"].join(`
|
|
119
|
+
`)}).setAttr("aria-label","WorldOrbit quick start example")}mountStaticScene(){this.scene&&(this.hostEl.empty(),this.embeddedView?.destroy(),this.embeddedView=new ye({container:this.hostEl,scene:this.scene,theme:it(),interactive:!1,enablePointer:!0,enableTouch:!0}),this.embeddedView.mount(),this.hostEl.toggleClass("is-locked",!0))}mountInteractiveIfNeeded(){this.scene||this.ensureRendered(),this.scene&&(this.embeddedView?this.embeddedView.setInteractive(!0):(this.embeddedView=new ye({container:this.hostEl,scene:this.scene,theme:it(),interactive:!0,enablePointer:!0,enableTouch:!0}),this.embeddedView.mount()),this.renderState="interactive-mounted",this.hostEl.toggleClass("is-locked",!1),this.statusEl.setText("Interactive preview active"),this.renderActions())}renderDiagnostics(t,r){if(this.diagnosticsEl.empty(),!t.length){this.diagnosticsEl.detach();return}this.diagnosticsEl.parentElement||this.rootEl.appendChild(this.diagnosticsEl);for(let n of t){let i=this.diagnosticsEl.createDiv({cls:"worldorbit-obsidian-diagnostic"});i.dataset.severity=n.severity;let o=i.createDiv({cls:"worldorbit-obsidian-diagnostic-meta"});o.createSpan({cls:"worldorbit-obsidian-diagnostic-badge",text:n.severity}),o.createSpan({text:n.source}),o.createSpan({text:Vr(n)}),i.createDiv({cls:"worldorbit-obsidian-diagnostic-message",text:n.message});let a=!!(this.navigationContext&&n.line);if(a){let l=i.createDiv({cls:"worldorbit-obsidian-diagnostic-actions"}).createEl("button",{cls:"worldorbit-obsidian-button",text:"Go to error"});l.disabled=!a,this.cleanupComponent.registerDomEvent(l,"click",()=>{this.handleDiagnosticNavigation(n)})}}r&&this.statusEl.setText(tt(t))}async openFullscreen(){if(this.scene||this.ensureRendered(),!this.scene){new E.Notice("WorldOrbit: this block could not be rendered.");return}new Dt(this.app,this.scene).open()}filterDiagnostics(t){return this.plugin.settings.showWarnings?t:t.filter(r=>r.source!=="validate")}async handleDiagnosticNavigation(t){if(!this.navigationContext){new E.Notice("WorldOrbit: no editor position is available for this block.");return}await Ur(this.app,this.navigationContext.sourcePath,this.navigationContext.contentStartLine,t)||new E.Notice("WorldOrbit: could not focus the diagnostic location.")}attachResizeObserver(){this.resizeObserver?.disconnect(),!(typeof ResizeObserver>"u")&&(this.resizeObserver=new ResizeObserver(()=>{this.embeddedView?.resize()}),this.resizeObserver.observe(this.hostEl))}cancelPendingRender(){this.pendingFrameId!==null&&(window.cancelAnimationFrame(this.pendingFrameId),this.pendingFrameId=null)}destroyEmbeddedView(){this.embeddedView?.destroy(),this.embeddedView=null}createToolbarButton(t,r,n){let i=this.actionsEl.createEl("button",{cls:`worldorbit-obsidian-button${r?" mod-cta":""}`,text:t});return this.cleanupComponent.registerDomEvent(i,"click",n),i}createIconButton(t,r,n){let i=this.actionsEl.createEl("button",{cls:"worldorbit-obsidian-button worldorbit-obsidian-icon-button",attr:{"aria-label":t,title:t}});return(0,E.setIcon)(i,r),this.cleanupComponent.registerDomEvent(i,"click",n),i}},Dt=class extends E.Modal{scene;embeddedView=null;constructor(t,r){super(t),this.scene=r}onOpen(){this.modalEl.addClass("worldorbit-obsidian-modal"),this.setTitle("WorldOrbit");let t=this.contentEl.createDiv({cls:"worldorbit-obsidian-modal-host"});this.embeddedView=new ye({container:t,scene:this.scene,theme:it(),interactive:!0,enablePointer:!0,enableTouch:!0}),this.embeddedView.mount()}onClose(){this.embeddedView?.destroy(),this.embeddedView=null,this.contentEl.empty()}},Rt=class extends E.Modal{constructor(t){super(t)}onOpen(){this.setTitle(_r),this.contentEl.empty();let t=this.contentEl.createDiv({cls:"worldorbit-obsidian-help"});t.createEl("p",{text:"Paste a fenced worldorbit block into a note to start rendering immediately."}),t.createEl("pre",{cls:"worldorbit-obsidian-example",text:["```worldorbit","schema 2.5","","system Sol","","object star Sun","","object planet Earth"," orbit Sun"," semiMajor 1au","```"].join(`
|
|
120
|
+
`)});let r=t.createEl("ul");for(let n of["`object planet NAME` creates a body","`orbit TARGET` places it around another object","`semiMajor 1au` or `distance 384400km` controls orbit size","`color #6fa8ff`, `radius`, `mass`, and `kind` add detail","Locked mode keeps note scrolling safe until you activate interaction"])r.createEl("li",{text:n})}onClose(){this.contentEl.empty()}},Ct=class extends E.PluginSettingTab{plugin;constructor(t,r){super(t,r),this.plugin=r}display(){let{containerEl:t}=this;t.empty(),new E.Setting(t).setName("Embedded interaction").setDesc("Choose whether embedded previews start locked or immediately interactive. Locked mode keeps note scrolling safe until you explicitly activate pan and zoom.").addDropdown(r=>r.addOption("locked","Locked by default").addOption("enabled","Interactive by default").setValue(this.plugin.settings.embeddedInteraction).onChange(async n=>{this.plugin.settings.embeddedInteraction=n,await this.plugin.saveSettings()})),new E.Setting(t).setName("Show validator diagnostics").setDesc("Display diagnostics produced by the validation phase under rendered WorldOrbit blocks.").addToggle(r=>r.setValue(this.plugin.settings.showWarnings).onChange(async n=>{this.plugin.settings.showWarnings=n,await this.plugin.saveSettings()})),new E.Setting(t).setName("Show fullscreen button").setDesc("Offer a larger interactive view for code blocks on small screens.").addToggle(r=>r.setValue(this.plugin.settings.showFullscreenButton).onChange(async n=>{this.plugin.settings.showFullscreenButton=n,await this.plugin.saveSettings()}))}};function ks(e){let t=zr(),r=e.getCursor(),n=e.lineCount(),i=r.line>0,o=r.line<n-1,a=`${i?`
|
|
107
121
|
`:""}${t}${o?`
|
|
108
|
-
`:""}`;e.replaceRange(a,
|
|
122
|
+
`:""}`;e.replaceRange(a,r)}var Ss=ot;
|