@essrt/physics 2.5.0 → 3.1.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/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@essrt/physics",
3
- "version": "2.5.0",
3
+ "version": "3.1.0",
4
4
  "description": "ESSRT (Expanding Solar System Resonance Theory) physics core \u2014 pure, injectable-constants, no I/O, no globals, no DOM. The complete model incl. fitted coefficients; every published version immutably ships one recorded model identity.",
5
5
  "essrt": {
6
- "modelVersion": "v12.0",
6
+ "modelVersion": "v13.0",
7
7
  "_note": "The model identity this package version ships (IP-unified-architecture \u00a710: package semver tracks the API axis; the model version + CONSTANTS_HASH/COEFFICIENTS_HASH in src/constants/ carry the scientific identity). The version-pinning gate enforces this pairing against public/input/model-version.json."
8
8
  },
9
9
  "type": "module",
@@ -45,6 +45,7 @@
45
45
  "./planets/asc-node-integrator": "./src/planets/asc-node-integrator.cjs",
46
46
  "./planets/orbit-chain": "./src/planets/orbit-chain.cjs",
47
47
  "./planets/corrections": "./src/planets/corrections.cjs",
48
+ "./planets/keplerian-chain": "./src/planets/keplerian-chain.cjs",
48
49
  "./planets/predict": "./src/planets/predict.cjs",
49
50
  "./planets/model": "./src/planets/model.cjs",
50
51
  "./deltat/cycles": "./src/deltat/cycles.cjs",
@@ -35,7 +35,7 @@
35
35
  export const CONSTANTS_HASH = "ffbce6e075ca2f25";
36
36
 
37
37
  /** Model version label — single source: public/input/model-version.json (§10 two-axis scheme). */
38
- export const MODEL_VERSION = "v12.0";
38
+ export const MODEL_VERSION = "v13.0";
39
39
 
40
40
  /** Canonical preprint DOI — single source: public/input/model-version.json. */
41
41
  export const PREPRINT_DOI = "10.21203/rs.3.rs-8758810/v4";
package/src/index.js CHANGED
@@ -118,6 +118,10 @@ export * as planetOrientation from './planets/orientation.cjs';
118
118
  export { integrateAscendingNode } from './planets/asc-node-integrator.cjs';
119
119
  export * as planetOrbitChain from './planets/orbit-chain.cjs';
120
120
  export { evaluateParallaxBasis, gravitationTermDeltasDeg, evaluateElongationBasis } from './planets/corrections.cjs';
121
+ // P5/K4.6c — the engine-D Keplerian chain (pure evaluator + the embedded
122
+ // governed artifact; the browser flag path consumes exactly these).
123
+ export { buildPlanetChainsFromArtifactData, computePlanetElementsAtYear, computeHeliocentricEclipticFromElements, computePoissonArgRad, computeOsculatingElements, solveKeplerRad, ANCHOR_EPOCH_YEAR, ANCHOR_EPOCH_JD } from './planets/keplerian-chain.cjs';
124
+ export { CHAIN_ARTIFACT, CHAIN_ARTIFACT_HASH } from './planets/chain-artifact.js';
121
125
  export { createPredictivePrecession, calcPlanetPerihelionLongDeg } from './planets/predict.cjs';
122
126
  // L10 — the composition front door: one law set, N body records. Thin by
123
127
  // design; engines keep their direct call sites (see planets/model.cjs).
@@ -145,9 +149,11 @@ export { createSunLongitudeCorrection } from './sun/longitude-correction.cjs';
145
149
  * even though the body is empty.
146
150
  *
147
151
  * @param {Constants} [constants]
152
+ * @param {{ laws?: { eccentricityAt?: (year: number) => number, eccentricityRateAt?: (year: number) => number, perihelionLongitudeDegAt?: (year: number) => number } }} [opts]
153
+ * `laws` — research overrides for Earth's orbit laws (doc 109 §7); absent = the shipped laws, bit-identical. Not part of the hash.
148
154
  * @returns {Model}
149
155
  */
150
- export const createModel = (constants = GENERATED) => {
156
+ export const createModel = (constants = GENERATED, opts = {}) => {
151
157
  // Validation targets are not merely absent from DEFAULT_CONSTANTS — they are
152
158
  // REFUSED here. Absence alone only stops the spread form
153
159
  // `{...DEFAULT_CONSTANTS, x}`; nothing stopped a caller passing a bound
@@ -183,7 +189,9 @@ export const createModel = (constants = GENERATED) => {
183
189
 
184
190
  // The §7a assembly: every factory wired from THIS context, so counterfactual
185
191
  // constants flow through the entire motion model.
186
- const surfaces = assembleModel(ctx, FITTED);
192
+ // opts.laws research overrides for Earth's orbit laws (see assembleModel);
193
+ // absent = the shipped laws, bit-identical. Never part of the hash.
194
+ const surfaces = assembleModel(ctx, FITTED, opts.laws ?? {});
187
195
 
188
196
  return {
189
197
  constants: ctx,
package/src/model.js CHANGED
@@ -65,9 +65,16 @@ const MOON_ECC_SENSITIVITY_NODE = 1.018;
65
65
  *
66
66
  * @param {Readonly<Record<string, any>>} C the frozen constants context
67
67
  * @param {Readonly<Record<string, any>>} F the fitted coefficients
68
+ * @param {{ eccentricityAt?: (year: number) => number, eccentricityRateAt?: (year: number) => number, perihelionLongitudeDegAt?: (year: number) => number }} [laws]
69
+ * RESEARCH OVERRIDES for Earth's orbit laws (doc 109 §7): an alternative e(t),
70
+ * de/dt(t) and ϖ_of-date(t) flow through every consumer (the eclipse Sun, the
71
+ * Moon's E-factor, the cardinal points) exactly as the shipped laws do. Default
72
+ * {} = the shipped laws, bit-identical to before this parameter existed. Not a
73
+ * counterfactual in the §2d sense (no hash change) — callers must say when
74
+ * they used it; the generators refuse to --write under an override.
68
75
  * @returns the assembled surfaces (epoch, earth, lengths, cardinal, moon) — type inferred so ReturnType stays precise
69
76
  */
70
- export function assembleModel(C, F) {
77
+ export function assembleModel(C, F, laws = {}) {
71
78
  // ── Derived constants (constants.js §9 order) ─────────────────────────────
72
79
  const H = C.foundational.holisticyearLength;
73
80
  const meanSolarYearDays = Math.round(C.foundational.inputmeanlengthsolaryearindays * (H / 8)) / (H / 8);
@@ -290,14 +297,14 @@ export function assembleModel(C, F) {
290
297
 
291
298
  // ── Earth scalars (integrated-phase display semantics) ────────────────────
292
299
  /** @param {number} year @returns {number} */
293
- const earthPerihelionDeg = (year) => {
300
+ const earthPerihelionDeg = laws.perihelionLongitudeDegAt ?? ((year) => {
294
301
  let longitude = 270.0 + 360.0 * cyclesBetween(balancedYear, year, 16);
295
302
  for (const [div, sinC, cosC] of F.PERI_HARMONICS_RAW) {
296
303
  const ph = phaseRadians(balancedYear, year, div);
297
304
  longitude += sinC * Math.sin(ph) + cosC * Math.cos(ph);
298
305
  }
299
306
  return (((longitude + F.PERI_OFFSET) % 360) + 360) % 360;
300
- };
307
+ });
301
308
  /** @param {number} year @returns {number} */
302
309
  const obliquityDeg = (year) => {
303
310
  let obliq = solsticeObliquityMean;
@@ -343,10 +350,10 @@ export function assembleModel(C, F) {
343
350
  eccentricityJ2000: C.earthOrbital.earthEccentricityJ2000,
344
351
  });
345
352
  /** @param {number} year @returns {number} */
346
- const eccentricityAt = (year) => moonEcc.eccAt(year - 2000);
353
+ const eccentricityAt = laws.eccentricityAt ?? ((year) => moonEcc.eccAt(year - 2000));
347
354
  /** de/dyear of the one law — the cardinal braid's equation-of-centre
348
355
  * derivative rides it. @param {number} year @returns {number} */
349
- const eccentricityRateAt = (year) => moonEcc.eccRateAt(year - 2000);
356
+ const eccentricityRateAt = laws.eccentricityRateAt ?? ((year) => moonEcc.eccRateAt(year - 2000));
350
357
  /** @param {number} year @returns {number} */
351
358
  const inclinationDeg = (year) => earthInclMean
352
359
  - earthInclAmplitude * Math.cos(phaseRadians(balancedYear, year, 3));
@@ -0,0 +1,17 @@
1
+ /**
2
+ * GENERATED — do not edit. Regenerate:
3
+ * node tools/constants/generate.mjs --write
4
+ *
5
+ * Source: data/nbody-secular-frequencies.json (the governed engine-D
6
+ * artifact), emitted VERBATIM. Two gates guard the two legs of the causal
7
+ * chain: check:artifacts pins artifact ↔ engine (input hashes name the
8
+ * regeneration command), this module's staleness check pins embed ↔ artifact.
9
+ * A changed planet mass therefore propagates engine → artifact → here → the
10
+ * browser scene, or a gate goes red.
11
+ */
12
+
13
+ /** @type {string} */
14
+ export const CHAIN_ARTIFACT_HASH = "e880abed97ebf1ba";
15
+
16
+ /** @type {Readonly<Record<string, unknown>>} */
17
+ export const CHAIN_ARTIFACT = Object.freeze({"_description":"Engine-D secular frequencies from the model’s own N-body pipeline (WH 1-Myr, 1PN on, NAFF), the 1800–2100 window rates (B), the Keplerian chain’s governed inputs (K2.1/P5: windowElementRates + j2000AnchorElements — era-typed window values and the t=0 anchor, the chain’s ONE home), the derived instantaneous 1PN apsidal supplement, and the K4.5/K4.7b derived periodic-term layer (periodicTerms: λ̄/a/z/ζ lines + era window affine, engine-measured — tools/explore/k45e-amplitude-solve.mjs). Frames: g ecliptic-J2000 z-modes, s INVARIABLE-plane ζ-modes. Laskar 2004 values are external reference labels (theory), never inputs. See tools/verify/nbody-secular.js for the assertions carried.","meta":{"integrator":"wh","order":2,"dtDays":2,"spanYears":1000000,"sampleDays":1000,"gr":true,"seed":"JPL Horizons J2000 heliocentric state vectors (tools/explore/j2000-state.mjs, the one home)","masses":"DE440 mass ratios (astro-reference physicalConstants)","naffTerms":8,"windowYears":[1800,2100],"laskarRef":"Laskar, J. et al. (2004), A&A 428, 261–285, Table 3","conservationMaxDE":1.1113907520896154e-8,"note1PN":"Mercury eigen-level 1PN shift ≈ +0.473 ″/yr (cycle-average of 1/(1−e²)) vs +0.430 instantaneous — not a discrepancy; only the instantaneous value is asserted (P8b).","periodicTermsMethod":"k45e era-centered LSQ (self-seeded prewhitening, golden-refined frequencies; K4.7b)","periodicTermsSpanYr":2500,"periodicTermsCadenceYr":0.1},"g":{"mercury":{"arcsecPerYr":5.575712797823945,"amplitude":0.17545096694269685,"nearestLaskar":{"mode":"g1","arcsecPerYr":5.5965}},"venus":{"arcsecPerYr":7.405845742227483,"amplitude":0.022570769830788477,"nearestLaskar":{"mode":"g2","arcsecPerYr":7.4555}},"earth":{"arcsecPerYr":4.346410041032439,"amplitude":0.019341964493845513,"nearestLaskar":{"mode":"g5","arcsecPerYr":4.2575}},"mars":{"arcsecPerYr":17.916696630844026,"amplitude":0.08882914197372903,"nearestLaskar":{"mode":"g4","arcsecPerYr":17.9159}},"jupiter":{"arcsecPerYr":4.256769523195223,"amplitude":0.044182672664934045,"nearestLaskar":{"mode":"g5","arcsecPerYr":4.2575}},"saturn":{"arcsecPerYr":28.245581358956457,"amplitude":0.04819349426795283,"nearestLaskar":{"mode":"g6","arcsecPerYr":28.2455}},"uranus":{"arcsecPerYr":3.921148698318919,"amplitude":0.0332189082697614,"nearestLaskar":{"mode":"g5","arcsecPerYr":4.2575}},"neptune":{"arcsecPerYr":0.6065154396549126,"amplitude":0.009569000717364112,"nearestLaskar":{"mode":"g8","arcsecPerYr":0.673}}},"s":{"mercury":{"arcsecPerYr":-5.586173808637174,"amplitude":0.059409340430501154,"nearestLaskar":{"mode":"s1","arcsecPerYr":-5.6197}},"venus":{"arcsecPerYr":-18.3363903851603,"amplitude":0.013576723462640201,"nearestLaskar":{"mode":"s3","arcsecPerYr":-18.8506}},"earth":{"arcsecPerYr":-18.39611848918824,"amplitude":0.01184463735421656,"nearestLaskar":{"mode":"s3","arcsecPerYr":-18.8506}},"mars":{"arcsecPerYr":-17.545402434182556,"amplitude":0.021473581268835227,"nearestLaskar":{"mode":"s4","arcsecPerYr":-17.7553}},"jupiter":{"arcsecPerYr":-26.347747510182444,"amplitude":0.0031511446932465333,"nearestLaskar":{"mode":"s6","arcsecPerYr":-26.3475}},"saturn":{"arcsecPerYr":-26.34770515585438,"amplitude":0.007853480398801458,"nearestLaskar":{"mode":"s6","arcsecPerYr":-26.3475}},"uranus":{"arcsecPerYr":-2.999782557988895,"amplitude":0.008744980387074497,"nearestLaskar":{"mode":"s7","arcsecPerYr":-2.9927}},"neptune":{"arcsecPerYr":-0.7119237190344891,"amplitude":0.005960579851589255,"nearestLaskar":{"mode":"s8","arcsecPerYr":-0.6919}}},"secularModes":{"mercury":{"z":[{"omegaRadPerYr":0.000027031818463225768,"re":0.0061578259451980115,"im":0.17534287262605214},{"omegaRadPerYr":0.00003762575562965475,"re":0.022801391439964295,"im":0.008306970885650663},{"omegaRadPerYr":0.00001819756010161927,"re":0.019634392385947316,"im":0.014089365629220058},{"omegaRadPerYr":0.000011448057114609211,"re":-0.005593515523159691,"im":-0.0029052231145468826},{"omegaRadPerYr":0.00004414416237516322,"re":-0.0058059195322990535,"im":-0.0014204432190273834}],"zeta":[{"omegaRadPerYr":-0.000027080770518521117,"re":0.058209232182515294,"im":0.011937299831838749},{"omegaRadPerYr":-0.00003532228218977498,"re":0.004745715778503308,"im":0.009067515752921801},{"omegaRadPerYr":6.775714890718091e-8,"re":-0.0039039071253357234,"im":0.013489752627573397},{"omegaRadPerYr":-0.000014531803306709756,"re":-0.0027805829079540424,"im":0.001873307195814228},{"omegaRadPerYr":-0.00008871641521465394,"re":-0.00011206141890946473,"im":-0.0024785290535285108},{"omegaRadPerYr":-0.00004086484773308675,"re":-0.0009298161832617493,"im":0.0013601243172003264},{"omegaRadPerYr":-0.0000320673476361423,"re":-0.013260807519741909,"im":0.010385681846746578}]},"venus":{"z":[{"omegaRadPerYr":0.000035904553360186896,"re":-0.0211984643558249,"im":-0.007750145786322514},{"omegaRadPerYr":0.000021373474422862907,"re":0.016886761236088624,"im":0.011238461694226397},{"omegaRadPerYr":0.0000891126674473552,"re":0.0050874946506860065,"im":-0.005109367673184332},{"omegaRadPerYr":0.00002871637284884016,"re":-0.0017393876896891237,"im":0.005587660035943027},{"omegaRadPerYr":0.0000799342923050964,"re":-0.0044448366327981305,"im":-0.0000503440797393948},{"omegaRadPerYr":0.000012541690188563,"re":0.0004535723363856848,"im":0.0009117376424311817}],"zeta":[{"omegaRadPerYr":-0.00008889595040236661,"re":0.0014429354865157266,"im":0.013492668736937167},{"omegaRadPerYr":-2.9208356071391507e-8,"re":-0.0038419612953034085,"im":0.01343833962446885},{"omegaRadPerYr":-0.000027486544944080902,"re":0.008423422326469315,"im":0.0009256786850090009},{"omegaRadPerYr":-0.000035402171418589797,"re":0.0007435050926828158,"im":-0.0028971907452019956},{"omegaRadPerYr":-0.0000816605133107709,"re":-0.0010567171844393416,"im":0.0017536585345055515},{"omegaRadPerYr":-0.00009527377513796924,"re":0.001562527173160095,"im":0.00142794192883987},{"omegaRadPerYr":-0.000022714283438616226,"re":0.0006900663832152563,"im":0.0009409483713469917},{"omegaRadPerYr":-0.000012901293108561725,"re":-0.0007909153616483306,"im":0.0007730683997926797}]},"earth":{"z":[{"omegaRadPerYr":0.000021071990516043863,"re":0.016301183796398024,"im":0.010410715504576574},{"omegaRadPerYr":0.000035854880135688966,"re":-0.016689300824841616,"im":-0.00587694407980285},{"omegaRadPerYr":0.00008867935711133655,"re":-0.006205359589321793,"im":0.0059045379227095785},{"omegaRadPerYr":0.00007976873965068339,"re":0.003442662776173624,"im":0.00018161801434096533},{"omegaRadPerYr":0.000028440629463153055,"re":-0.0007693818323351555,"im":0.0036759836693912766},{"omegaRadPerYr":0.0001368996733554364,"re":-0.0008112549290125483,"im":0.0011800841029160098}],"zeta":[{"omegaRadPerYr":-2.789132719584616e-8,"re":-0.003980175066603849,"im":0.01346535718722163},{"omegaRadPerYr":-0.00008918684866422754,"re":-0.0017818272301117842,"im":-0.01171473788270621},{"omegaRadPerYr":-0.000027565953011645597,"re":0.005837345967007995,"im":0.0005767264828698533},{"omegaRadPerYr":-0.000035436881992393566,"re":0.0005316599469742484,"im":-0.002298310523068399},{"omegaRadPerYr":-0.00012766579969759884,"re":-0.0006080730450000734,"im":0.0011811620431347754},{"omegaRadPerYr":-0.00008175633290332968,"re":0.0008468767179477169,"im":-0.0014453751935461902},{"omegaRadPerYr":-0.00009544829395201416,"re":-0.0013543922729998166,"im":-0.0011678254911581005},{"omegaRadPerYr":-0.000022618656478089485,"re":0.0008212474154199974,"im":0.0007376186464093101}]},"mars":{"z":[{"omegaRadPerYr":0.00008686259646922313,"re":0.06413361286031954,"im":-0.061461338785219796},{"omegaRadPerYr":0.000020710599293705756,"re":0.0168815770314768,"im":0.010181016750981363},{"omegaRadPerYr":0.00013701274439308748,"re":-0.004154546031788784,"im":0.0052484404204072264},{"omegaRadPerYr":0.00007830364627518509,"re":0.006610030627920962,"im":0.00716773876788036},{"omegaRadPerYr":0.0000967464223286991,"re":0.00669811842776162,"im":-0.0005917424234258758},{"omegaRadPerYr":0.00003622387429863297,"re":-0.0037118530783633074,"im":-0.001197130016454561},{"omegaRadPerYr":0.00007107828755070232,"re":-0.0030272556571569256,"im":-0.0021089438693236047}],"zeta":[{"omegaRadPerYr":-0.00008506290699879281,"re":0.007775523866870005,"im":-0.02001096343618598},{"omegaRadPerYr":-0.00009339911610380382,"re":0.009574153430346467,"im":0.01499249567600023},{"omegaRadPerYr":-2.1361701870262538e-8,"re":-0.003652982290513836,"im":0.013619195708169822},{"omegaRadPerYr":-0.00012775359218502626,"re":-0.0023045039444621073,"im":0.0035319422124707343},{"omegaRadPerYr":-0.00007647491607131078,"re":0.0003559447186960134,"im":0.00225681738420922},{"omegaRadPerYr":-0.00009952035224595763,"re":-0.002686141523001369,"im":-0.0032247663817401412}]},"jupiter":{"z":[{"omegaRadPerYr":0.000020637401021751606,"re":0.03775130376392058,"im":0.022955339856793808},{"omegaRadPerYr":0.0001369384796979771,"re":0.009695326488717567,"im":-0.012378818304894155},{"omegaRadPerYr":0.00001285183951543766,"re":-0.0008196553575553386,"im":0.0013298147968340598},{"omegaRadPerYr":0.0002532450446505381,"re":0.00041541273181667615,"im":0.0003999550758746959},{"omegaRadPerYr":0.000006063027991986138,"re":0.00018743032373578906,"im":-0.0002594778854773961},{"omegaRadPerYr":0.000031414566802098374,"re":-0.00014101517848288215,"im":0.00024144519615503003}],"zeta":[{"omegaRadPerYr":-2.1490404832806168e-8,"re":-0.0036895385366188783,"im":0.013265898846260308},{"omegaRadPerYr":-0.0001277374796658874,"re":0.0018884354550522274,"im":-0.00251606466916287},{"omegaRadPerYr":-0.000015175434386812629,"re":-0.0004021019571492075,"im":0.0003117907932519991},{"omegaRadPerYr":-0.000006632717903107953,"re":0.0003009472423168709,"im":0.0001317099906824581},{"omegaRadPerYr":0.000003955724900485721,"re":-0.0002689226108809528,"im":2.564175400368284e-7},{"omegaRadPerYr":-0.000020525770532327617,"re":0.00010370417805463956,"im":-0.000024424616444032364}]},"saturn":{"z":[{"omegaRadPerYr":0.0001369384427371457,"re":-0.02960653952726686,"im":0.03802717064120847},{"omegaRadPerYr":0.00002063674100262723,"re":0.028150073232470787,"im":0.01709774750149962},{"omegaRadPerYr":0.00025324837081694125,"re":-0.0013606989653353102,"im":-0.0013821126035298548},{"omegaRadPerYr":0.000012847385779998076,"re":-0.0006853047928644228,"im":0.0011218181664192914},{"omegaRadPerYr":0.00012770394549879298,"re":0.00030532747308216533,"im":0.00020649598646880408},{"omegaRadPerYr":0.00014631533310756968,"re":0.0002679684896809784,"im":0.00022796694930874033},{"omegaRadPerYr":-0.00009568507237176567,"re":-0.000049572612945519304,"im":0.00011688249888045971}],"zeta":[{"omegaRadPerYr":-1.9284984538258004e-8,"re":-0.003708721248959303,"im":0.013267262775914458},{"omegaRadPerYr":-0.0001277372896899594,"re":-0.00473585842558015,"im":0.006270978893125488},{"omegaRadPerYr":-0.000015325638313367067,"re":-0.000342091983477944,"im":0.0002459194020261331},{"omegaRadPerYr":-0.0000065831107802777746,"re":0.0002849200201049732,"im":0.00012107400921002766},{"omegaRadPerYr":0.000003999922886015977,"re":-0.00025809587923422754,"im":-0.000010818807501830861},{"omegaRadPerYr":-0.000020373996231109695,"re":0.00011127740663504409,"im":-0.00002191187386888525}]},"uranus":{"z":[{"omegaRadPerYr":0.000019010265346098605,"re":-0.033200286080063916,"im":0.0011121469492544251},{"omegaRadPerYr":0.000012033775574177009,"re":-0.008077561115556027,"im":0.02293125999571007},{"omegaRadPerYr":0.000023775733149813484,"re":-0.008710621833115826,"im":-0.016095355591969604},{"omegaRadPerYr":0.000007822007075432675,"re":0.0016021840612059168,"im":-0.009621969113692156},{"omegaRadPerYr":0.00002952547228417886,"re":0.0016566445996550965,"im":0.006018707505057967},{"omegaRadPerYr":0.00013694007244464723,"re":0.0009292339240691288,"im":-0.0016372467645427197}],"zeta":[{"omegaRadPerYr":7.599421366412143e-8,"re":-0.004660490353585718,"im":0.01324646340758287},{"omegaRadPerYr":-0.000014567449496838837,"re":0.006613328514408994,"im":-0.005878235417711313},{"omegaRadPerYr":-0.000007051181231496491,"re":-0.0004558064482609971,"im":-0.00031393562385899923},{"omegaRadPerYr":0.000003329914022932244,"re":0.0003411959761619822,"im":-0.0003305440071371085},{"omegaRadPerYr":-0.0001277295137673612,"re":0.00021735572403603482,"im":-0.00029463734768672754},{"omegaRadPerYr":-0.00002335403426632458,"re":-0.00006477073255467024,"im":-0.00008547519620498973}]},"neptune":{"z":[{"omegaRadPerYr":0.0000029404698294886683,"re":0.002583276204603991,"im":0.009213710369858697},{"omegaRadPerYr":0.000015819958189246093,"re":0.002410719467240076,"im":-0.0028958675920111618},{"omegaRadPerYr":0.00002325097119532629,"re":0.001159396623354508,"im":0.001106111966705049},{"omegaRadPerYr":-0.0000035890886114523422,"re":-0.00020879605377416773,"im":-0.0006167290950842672},{"omegaRadPerYr":0.000030374670292163826,"re":-0.0002774301776095828,"im":-0.0002388641303570229}],"zeta":[{"omegaRadPerYr":-3.301733513849372e-7,"re":-0.008762838168102518,"im":0.010494876534409803},{"omegaRadPerYr":-0.000007353421929989998,"re":-0.0024807316856027294,"im":-0.0014503561615380218},{"omegaRadPerYr":0.000004080233598697059,"re":0.0018281727993976064,"im":0.002054509738245118},{"omegaRadPerYr":-0.000014881778065736648,"re":-0.00013356695251210882,"im":0.0011500105634289276},{"omegaRadPerYr":0.00001160480877156738,"re":-0.0005630431963197903,"im":-0.0005345014452666219},{"omegaRadPerYr":-0.000020788597979173094,"re":-0.0005111003177756488,"im":-0.00044451839396914716}]}},"windowRatesArcsecCy":{"gr":{"mercury":572.0163954148283,"venus":22.72580010599836,"earth":1154.4288756665303,"mars":1597.8081246982024,"jupiter":488.52901897634354,"saturn":-1576.6419790262526,"uranus":806.6031271547791,"neptune":9101.672820143169},"newton":{"mercury":529.0318184207404,"venus":14.090631090521121,"earth":1150.5947011086469,"mars":1596.4568002639046,"jupiter":488.4665375503103,"saturn":-1576.655982201358,"uranus":806.6007460587327,"neptune":9101.678202054029}},"windowElementRates":{"mercury":{"meanMotionDegPerYr":1494.7257434850626,"nodeRateArcsecCy":-451.23114506979533,"eccDotPerCy":0.000020426777739608027,"inclDotArcsecCy":-21.43063243338586},"venus":{"meanMotionDegPerYr":585.1779096296486,"nodeRateArcsecCy":-1000.3062148126329,"eccDotPerCy":-0.00004798428729899649,"inclDotArcsecCy":-2.9741785335138227},"earth":{"meanMotionDegPerYr":359.9936510408777,"nodeRateArcsecCy":287648.7600662079,"eccDotPerCy":-0.00004200482595462892,"inclDotArcsecCy":-22.64742397865307},"mars":{"meanMotionDegPerYr":191.40299923220516,"nodeRateArcsecCy":-1059.1798892427676,"eccDotPerCy":0.0000917178876575738,"inclDotArcsecCy":-29.268508116285304},"jupiter":{"meanMotionDegPerYr":30.347302970895168,"nodeRateArcsecCy":724.7057759408735,"eccDotPerCy":-0.0000876138498378255,"inclDotArcsecCy":-7.070016683580993},"saturn":{"meanMotionDegPerYr":12.225441692771112,"nodeRateArcsecCy":-1041.0659036365291,"eccDotPerCy":-0.00027446940576446793,"inclDotArcsecCy":8.397686122084723},"uranus":{"meanMotionDegPerYr":4.284939547595869,"nodeRateArcsecCy":114.5093750648986,"eccDotPerCy":-0.00009620843043291943,"inclDotArcsecCy":-8.163218561711115},"neptune":{"meanMotionDegPerYr":2.184556718701332,"nodeRateArcsecCy":-12.96633501054956,"eccDotPerCy":0.00038317519496411644,"inclDotArcsecCy":1.294056435039746}},"j2000AnchorElements":{"mercury":{"aAU":0.3870982306507114,"e":0.20563023607048908,"inclEclipticDeg":7.005014303274938,"ascNodeEclipticDeg":48.33053855197437,"lonPeriEclipticDeg":77.45482144099158,"meanLonEclipticDeg":252.25070308850388},"venus":{"aAU":0.723326980236553,"e":0.006755832524369414,"inclEclipticDeg":3.3945896490801655,"ascNodeEclipticDeg":76.67837411646671,"lonPeriEclipticDeg":131.86481574575365,"meanLonEclipticDeg":181.97911300917644},"earth":{"aAU":0.9999965019964896,"e":0.016702435651957018,"inclEclipticDeg":0.00010345820355474172,"ascNodeEclipticDeg":140.29217988414328,"lonPeriEclipticDeg":462.9179213996577,"meanLonEclipticDeg":100.46313620647612},"mars":{"aAU":1.5236791234560592,"e":0.09331517469683501,"inclEclipticDeg":1.8498764556630205,"ascNodeEclipticDeg":49.56200645402683,"lonPeriEclipticDeg":336.0994054433697,"meanLonEclipticDeg":355.4558712806536},"jupiter":{"aAU":5.204267043121455,"e":0.04877494875045604,"inclEclipticDeg":1.304625372772227,"ascNodeEclipticDeg":100.49162135259076,"lonPeriEclipticDeg":375.5576634246116,"meanLonEclipticDeg":34.37610122976946},"saturn":{"aAU":9.582017927199528,"e":0.05572345073837687,"inclEclipticDeg":2.4852504409844323,"ascNodeEclipticDeg":113.64296212519966,"lonPeriEclipticDeg":449.65653541437854,"meanLonEclipticDeg":50.00443784290724},"uranus":{"aAU":19.22941789809548,"e":0.04440546894120367,"inclEclipticDeg":0.7725675263742898,"ascNodeEclipticDeg":73.98941630128037,"lonPeriEclipticDeg":170.53113765495846,"meanLonEclipticDeg":313.4868371274142},"neptune":{"aAU":30.103641823294048,"e":0.01121513931197063,"inclEclipticDeg":1.7679863485740834,"ascNodeEclipticDeg":131.79386605766496,"lonPeriEclipticDeg":397.44244290669224,"meanLonEclipticDeg":305.20853660850446}},"relativisticSupplementArcsecCy":{"mercury":42.98142753750674,"venus":8.624988679409013,"earth":3.838964853078437,"mars":1.3510691613456707,"jupiter":0.06243854269534776,"saturn":0.013727538363259385,"uranus":0.0023997870642552053,"neptune":0.0007833188044413818},"checks":{"mercuryClosureArcsecCy":{"measuredWindowDelta":42.98457699408789,"derivedInstantaneous":42.98142753750674,"diff":0.003149456581148513,"tolerance":0.1},"earthMeanMotionVsSiderealAnchor":{"engineDegPerYr":359.9936510408777,"modelSiderealDegPerYr":359.9937285652708,"diffArcsecPerYr":-0.279087815283674,"tolerance":2},"saturnG6":{"measured":28.245581358956457,"laskar":28.2455},"jupiterG5":{"measured":4.256769523195223,"laskar":4.2575}},"inputs":{"generator":"node tools/verify/nbody-secular.js --write","files":{"packages/physics/src/planets/keplerian-chain.cjs":"sha256:1adb5ac0df1cbb36ad9ccfa855eae8d339f894883ad7e06ec799ccc1110a7871","public/input/astro-reference.json":"sha256:0e61f5bec0ee3c44016781599498db75067070e74aeddc89b2f5bd6bc2782918","tools/explore/j2000-state.mjs":"sha256:ef15efde06948b36b589e3f790e6c5ccda64b8c1e1899cb4ff1e5f1571149611","tools/explore/k45-residual-naff.mjs":"sha256:228eb4874adca9171d61c1697ffbbaac3ce82891476a34762bf882840ccae406","tools/explore/k45e-amplitude-solve.mjs":"sha256:d5ce9f8d3e38d49988b089542882833dd4c631125b5b4e21eff13b119eee45e8","tools/explore/lattice-long-window-test.mjs":"sha256:893ff6900a458b9a6f8d4f0978e496495f58be792cbaf1379629d62ab3d42626","tools/explore/naff-frequencies.mjs":"sha256:85178139faf0894c8cf62a7aa0a92395dab7afa6ab33efee93b63712ef257ed2","tools/explore/nbody-wh.mjs":"sha256:42947b7492e81dd412a97e0a794412706d16d6a42f2fde38310877fd1051c777","tools/lib/keplerian-chain.js":"sha256:7be1a96b20174d8c2726ec984250646093a847a5cf7e06d8e1e2ffae926ff5c9","tools/verify/nbody-secular.js":"sha256:f71112a27cca71d97811597fb86cf762a2ccab21c6af7d1ca8c0340acdaf8d81"}},"periodicTerms":{"mercury":{"mlonArcsec":[{"omegaRadPerYr":1.1094782578638633,"cos":0.4283393261961084,"sin":-7.326527509234423},{"omegaRadPerYr":5.661360380927949,"cos":-2.042649039570386,"sin":2.931772290428614}],"aPpm":[],"z":[],"zeta":[],"windowAffine":{"mlon":{"off":-3.0393736875871302,"slope":2.841277225316435},"a":{"off":0.2758746522782975,"slope":-7.212979068927238e-8},"k":{"off":-0.000010308133413000659,"slope":-3.078102566616934e-7},"h":{"off":-0.000016422197583177168,"slope":3.7560192853821967e-7},"q":{"off":0.000010395164103761334,"slope":-1.838228216218485e-7},"p":{"off":-0.0000045514783478873524,"slope":-4.54454512200622e-8}}},"venus":{"mlonArcsec":[],"aPpm":[],"z":[{"omegaRadPerYr":1.5773449192709434,"re":5.7688362360462365e-8,"im":5.534221828564653e-8},{"omegaRadPerYr":-1.5773449192709434,"re":0.000010314865584099027,"im":-0.0000198748787238016}],"zeta":[],"windowAffine":{"mlon":{"off":3.5948127312304887,"slope":0.5465947510597761},"a":{"off":4.008943004747135,"slope":7.075860643009611e-7},"k":{"off":0.00001907619455854608,"slope":-1.3082845363477187e-8},"h":{"off":0.00003129559857960834,"slope":-1.441522288917906e-8},"q":{"off":0.00000369074550376789,"slope":-5.1716895028481445e-8},"p":{"off":0.000005182645310723055,"slope":4.982987600455474e-8}}},"mars":{"mlonArcsec":[{"omegaRadPerYr":0.003412137087635026,"cos":53.66134652943842,"sin":17.0702224095311},{"omegaRadPerYr":0.19158768233986423,"cos":4.119097641894965,"sin":-4.748875287824893},{"omegaRadPerYr":0.39807082074986866,"cos":12.712294840261926,"sin":-4.8937042567324385},{"omegaRadPerYr":0.7961398668364265,"cos":1.4218153844689059,"sin":4.144231910196455}],"aPpm":[],"z":[{"omegaRadPerYr":0.3981475229837692,"re":-0.000006022352586612927,"im":-0.000016334865019193796},{"omegaRadPerYr":-0.3981475229837692,"re":-1.906831770330436e-7,"im":-4.274257222159089e-7},{"omegaRadPerYr":0.5296892164591163,"re":-0.00003701074387998172,"im":-0.000026873075674723054},{"omegaRadPerYr":-0.5296892164591163,"re":-4.860521864995133e-7,"im":3.4682346833132817e-7}],"zeta":[],"windowAffine":{"mlon":{"off":-83.40368679689061,"slope":-0.1308571754299822},"a":{"off":0.22572896074793633,"slope":0.00002462826981976612},"k":{"off":0.000055581565502195474,"slope":-3.330033606281005e-7},"h":{"off":-0.00011828467060704684,"slope":8.036921269251493e-8},"q":{"off":-0.000004188215333238016,"slope":1.6809402416370802e-7},"p":{"off":-0.000015868506481068194,"slope":-5.921860993754493e-8}}},"jupiter":{"mlonArcsec":[{"omegaRadPerYr":0.0006208681133576669,"cos":193.3832216620771,"sin":380.597621447694},{"omegaRadPerYr":0.0012063073379189023,"cos":-3.9274841583289564,"sin":-80.09301290875467},{"omegaRadPerYr":0.004160979269962051,"cos":-1.69943829568573,"sin":10.726068111658648},{"omegaRadPerYr":0.005711423877210773,"cos":58.571129321431584,"sin":-126.86137607602102},{"omegaRadPerYr":0.0060611490662863445,"cos":-197.7236817832274,"sin":527.5745834567023},{"omegaRadPerYr":0.006400320486794552,"cos":379.14030538693584,"sin":-996.4275081012628},{"omegaRadPerYr":0.006927123132186677,"cos":-96.86651973973018,"sin":-625.8640378432207},{"omegaRadPerYr":0.00734753548346981,"cos":8.43825109969694,"sin":46.700085406090466},{"omegaRadPerYr":0.013416263751242975,"cos":2.917377177432902,"sin":-10.573630606149845},{"omegaRadPerYr":0.10286332259410932,"cos":-55.41328203440606,"sin":28.51871156692714},{"omegaRadPerYr":0.10341539484729162,"cos":-77.12097788008923,"sin":9.202995253429414},{"omegaRadPerYr":0.1100425288520466,"cos":3.899298688610127,"sin":-10.215251943431543},{"omegaRadPerYr":0.20645396403363098,"cos":-12.573442445414853,"sin":6.295822342082753},{"omegaRadPerYr":0.21316426593910423,"cos":10.054032585538861,"sin":-1.4152085169745214},{"omegaRadPerYr":0.3163921030750765,"cos":14.356082594113289,"sin":-47.02291299274492},{"omegaRadPerYr":0.4196206573492547,"cos":-18.86823087866421,"sin":-20.24646022413696},{"omegaRadPerYr":0.5228460556683714,"cos":-3.4375496090271564,"sin":0.6151505966978332},{"omegaRadPerYr":0.5295794256693848,"cos":3.217907378493207,"sin":1.975307816916936},{"omegaRadPerYr":0.6327839673705462,"cos":35.3349228950653,"sin":-56.4049785284849},{"omegaRadPerYr":0.7360122252144383,"cos":-4.7168510713684295,"sin":-9.5724698724},{"omegaRadPerYr":0.949175502963057,"cos":17.822449799701438,"sin":-16.382728937959474},{"omegaRadPerYr":1.2655672106357103,"cos":8.87498412842184,"sin":-4.569657084971597}],"aPpm":[{"omegaRadPerYr":0.006719118472690749,"cos":48.57374276056867,"sin":5.718778591306203},{"omegaRadPerYr":0.10316587166928487,"cos":-20.64279315909391,"sin":-58.4592094563138},{"omegaRadPerYr":0.31639212053382026,"cos":37.85268365288874,"sin":11.814375674076771},{"omegaRadPerYr":0.4196197886355212,"cos":32.19572358006155,"sin":-26.99428023819792},{"omegaRadPerYr":0.6327837640748681,"cos":112.58712391466997,"sin":70.37241144145064},{"omegaRadPerYr":0.7360111762024295,"cos":20.869632878207252,"sin":-9.118091922845995},{"omegaRadPerYr":0.9491754071485186,"cos":40.75667943910494,"sin":43.811460605574815}],"z":[{"omegaRadPerYr":-0.0006207787083493434,"re":-0.000007760801206480335,"im":0.0000016579719102905573},{"omegaRadPerYr":0.0006207787083493449,"re":-0.000008695682534227633,"im":-0.000006359405183752185},{"omegaRadPerYr":-0.004432186705238992,"re":3.2207615300300247e-7,"im":-6.196347944817902e-7},{"omegaRadPerYr":0.006185044486880686,"re":-0.000004731941541673283,"im":-0.0000017729858354297809},{"omegaRadPerYr":0.006526633569639799,"re":0.00004150382284636084,"im":0.000017534400952133703},{"omegaRadPerYr":0.006841730692169909,"re":-0.0002026998234541423,"im":0.0003233646880686746},{"omegaRadPerYr":0.007470533994347621,"re":-0.0000049281296015436406,"im":-0.0000012002820271097082},{"omegaRadPerYr":0.013548716908851125,"re":-0.000002377738793176193,"im":0.000006656435245445941},{"omegaRadPerYr":-0.0963835641459155,"re":0.000004243818371947522,"im":0.000006318732294994447},{"omegaRadPerYr":-0.10309304895354462,"re":0.0002599772038145943,"im":0.0005935193398974658},{"omegaRadPerYr":0.10334256718399279,"re":0.00001068106998793681,"im":-7.548205310553664e-7},{"omegaRadPerYr":-0.10355795380749366,"re":-2.1154636946827e-7,"im":-5.390710095107589e-8},{"omegaRadPerYr":0.10974751126305515,"re":0.0000011302669198675927,"im":0.000006702466721595302},{"omegaRadPerYr":-0.10980538631044515,"re":-0.000002866815045583102,"im":-0.000009885070817152992},{"omegaRadPerYr":0.11007006680531065,"re":-0.00013061727670124666,"im":0.000009881348055011194},{"omegaRadPerYr":0.20631979856483246,"re":5.04298118741976e-7,"im":2.480806224515503e-7},{"omegaRadPerYr":-0.20631979856483246,"re":0.00006341492203955716,"im":0.000011273250168154838},{"omegaRadPerYr":0.2132961022923942,"re":-0.00005065824330209699,"im":-0.00006271190037317963},{"omegaRadPerYr":-0.2132961022923942,"re":-0.000004406921581341513,"im":-0.0000016060783929656262},{"omegaRadPerYr":-0.30955001412647276,"re":0.0000056019124603202195,"im":-0.000005441874625394522},{"omegaRadPerYr":0.41948265838592674,"re":-9.509570952152945e-8,"im":-0.0000012590269907950825},{"omegaRadPerYr":-0.41948265838592674,"re":0.000014641220619062486,"im":0.00010495558350565439},{"omegaRadPerYr":0.426466505091871,"re":-0.0000064497978114164694,"im":0.000013430976495086736},{"omegaRadPerYr":-0.426466505091871,"re":-1.7392937473622375e-8,"im":-0.000002543548554022179},{"omegaRadPerYr":0.5227123063902634,"re":-6.493200167943617e-8,"im":-1.9428718738465597e-7},{"omegaRadPerYr":-0.5227123063902634,"re":0.00001824269392489439,"im":0.00000906975764089715},{"omegaRadPerYr":0.5296909646421464,"re":-0.000023988048624019953,"im":-0.000016305548718652476},{"omegaRadPerYr":0.7358764924026054,"re":-5.772321676657591e-7,"im":-9.031194308086103e-8},{"omegaRadPerYr":-0.7358764924026054,"re":-0.000004926448326111552,"im":0.00003725847350296657}],"zeta":[{"omegaRadPerYr":-0.0006207787083493432,"re":0.0000017148670408172224,"im":-1.1979774717324106e-7},{"omegaRadPerYr":0.0006207787083493434,"re":0.0000073648358837529556,"im":-0.000001424067731329963},{"omegaRadPerYr":0.0011047092477748065,"re":-7.000878721120519e-7,"im":-2.3731715104835338e-7},{"omegaRadPerYr":0.0071090112684356,"re":-0.000003975092067696403,"im":0.0000075798744823925934}],"windowAffine":{"mlon":{"off":-276.6789283580293,"slope":6.146016597905851},"a":{"off":-319.6050905273606,"slope":0.0007796076926885039},"k":{"off":0.000014289210688706095,"slope":2.880479286878237e-8},"h":{"off":-0.001073832363366988,"slope":-2.534500776380545e-8},"q":{"off":-0.0000010335341247600158,"slope":1.4914208056557646e-9},"p":{"off":-0.000008818002194016852,"slope":3.0856264717746908e-9}}},"saturn":{"mlonArcsec":[{"omegaRadPerYr":0.0006208681133576669,"cos":-451.253615891754,"sin":145.98152908438132},{"omegaRadPerYr":0.004165525534002769,"cos":5.787274939055933,"sin":-12.703810065013153},{"omegaRadPerYr":0.005711612505032101,"cos":-189.54704549967167,"sin":-160.138901914935},{"omegaRadPerYr":0.006061128582866573,"cos":603.7466010253094,"sin":-8.700856030526818},{"omegaRadPerYr":0.0064003167157022246,"cos":-1037.3698907699634,"sin":1226.0959465379547},{"omegaRadPerYr":0.006927098454757736,"cos":279.6703017478956,"sin":2098.4367623243365},{"omegaRadPerYr":0.007347527790309774,"cos":-31.43305366096744,"sin":-283.15643985756446},{"omegaRadPerYr":0.009480611716879448,"cos":-0.4507335945350436,"sin":4.79424382361373},{"omegaRadPerYr":0.010945707057204556,"cos":25.998025191315012,"sin":6.51039808953889},{"omegaRadPerYr":0.01341613162135763,"cos":-7.425964486999675,"sin":26.129189937928867},{"omegaRadPerYr":0.06380203049325128,"cos":-4.956781443209341,"sin":-5.857273277892975},{"omegaRadPerYr":0.09641501836240508,"cos":1.093655918412904,"sin":-3.2100722037931555},{"omegaRadPerYr":0.10286386181613702,"cos":99.08099439180381,"sin":-63.162454954986316},{"omegaRadPerYr":0.10333438844615983,"cos":212.53124729979737,"sin":-24.123206548331538},{"omegaRadPerYr":0.11004419279928404,"cos":-8.76642821816064,"sin":25.14155702073091},{"omegaRadPerYr":0.1384221456508977,"cos":-4.142308935304489,"sin":0.3359277714106255},{"omegaRadPerYr":0.2064531916682817,"cos":30.963724773182314,"sin":-15.259788419608947},{"omegaRadPerYr":0.2131887934790523,"cos":-24.29491341571394,"sin":-6.982168144064149},{"omegaRadPerYr":0.2770241887124282,"cos":1.4543542593835515,"sin":6.3793376087284965},{"omegaRadPerYr":0.31639189446899674,"cos":-148.12974553923905,"sin":514.8691214437579},{"omegaRadPerYr":0.3231050733335511,"cos":2.178111128712694,"sin":-4.849441591870168},{"omegaRadPerYr":0.41962101131042784,"cos":43.79639605758242,"sin":47.62049382853528},{"omegaRadPerYr":0.4263384811647367,"cos":-1.9599761156575544,"sin":-4.910375543643042},{"omegaRadPerYr":0.5228461938866507,"cos":7.6492352759963484,"sin":-1.4042408711820147},{"omegaRadPerYr":0.5296206925660197,"cos":20.82311358880523,"sin":-21.723522060178187},{"omegaRadPerYr":0.6327839463508664,"cos":-77.8067933782241,"sin":124.58143011814512},{"omegaRadPerYr":0.7360122996869195,"cos":11.252910261739688,"sin":22.663624511588285},{"omegaRadPerYr":0.8460438288764272,"cos":1.8113799261773025,"sin":20.756673170052206},{"omegaRadPerYr":0.9491754962353995,"cos":-40.339539075190224,"sin":37.047932328557295},{"omegaRadPerYr":1.2655672066097283,"cos":-20.25042369756606,"sin":10.420773654426046}],"aPpm":[{"omegaRadPerYr":0.006719059935042215,"cos":-298.1739213236028,"sin":-35.65492072514902},{"omegaRadPerYr":0.10311278023647517,"cos":329.05242810267646,"sin":168.2053446152665},{"omegaRadPerYr":0.1099870935042278,"cos":-80.20082859738086,"sin":25.677992848453474},{"omegaRadPerYr":0.20645076221400505,"cos":22.365346624696144,"sin":52.11596047023494},{"omegaRadPerYr":0.21316470395286807,"cos":22.417376358933,"sin":148.19540823121667},{"omegaRadPerYr":0.3096741611131529,"cos":40.76320120805859,"sin":6.028630477781981},{"omegaRadPerYr":0.31639181272876266,"cos":3380.8172681042483,"sin":952.19154868527},{"omegaRadPerYr":0.41962072059820554,"cos":-117.61845886216751,"sin":102.62640456035058},{"omegaRadPerYr":0.522848349625552,"cos":2.3692526123597575,"sin":25.55482510964822},{"omegaRadPerYr":0.6327843055552796,"cos":-267.8385275274031,"sin":-178.81334724872872},{"omegaRadPerYr":0.7360113200820578,"cos":-70.20882189811421,"sin":30.840529284060356},{"omegaRadPerYr":0.8460447241275829,"cos":152.71397931748962,"sin":-11.548664498369881},{"omegaRadPerYr":0.9491754312473957,"cos":-100.97703552341146,"sin":-108.78710325854236},{"omegaRadPerYr":1.265567050136826,"cos":-32.69042937836259,"sin":-61.98759537925285}],"z":[{"omegaRadPerYr":-0.004358110846151278,"re":-0.000002445279424852449,"im":0.0000017621954362468656},{"omegaRadPerYr":0.006181644107420951,"re":0.000019239809643427013,"im":0.000026302645815428275},{"omegaRadPerYr":0.006525673611358515,"re":-0.00017162207988757243,"im":-0.00012381490122963492},{"omegaRadPerYr":0.006842443147971666,"re":0.0008160379290510822,"im":-0.0012855611879206686},{"omegaRadPerYr":0.007464263599308896,"re":0.000012700556847236648,"im":-0.000011961876101686816},{"omegaRadPerYr":0.011038687923256879,"re":-0.000039869855044714435,"im":0.00003195328235370556},{"omegaRadPerYr":0.013549298871283269,"re":0.000009801001526091865,"im":-0.000026447688535276757},{"omegaRadPerYr":-0.06373626925966255,"re":-0.00003596115998384089,"im":-0.000028529187552461677},{"omegaRadPerYr":-0.09638538445927783,"re":0.000015535362203103386,"im":0.000026853064771238423},{"omegaRadPerYr":-0.10309247938025248,"re":0.0002905044325100417,"im":0.0006021956537131266},{"omegaRadPerYr":0.10334344954127525,"re":-0.000019533843400768672,"im":0.000010878621921404595},{"omegaRadPerYr":0.10921440834492788,"re":-0.00003560780226338562,"im":0.000008050131621592458},{"omegaRadPerYr":-0.10921440834492788,"re":0.0000017934499315039944,"im":0.00000405315797293809},{"omegaRadPerYr":0.10975358535397606,"re":0.00017369831673455462,"im":-0.00007535465148308143},{"omegaRadPerYr":-0.10975358535397606,"re":-0.000004563988896924535,"im":-0.0000154375327254865},{"omegaRadPerYr":0.11042109885467918,"re":0.00018688710085717507,"im":-0.00012925303231366497},{"omegaRadPerYr":0.1107948956846119,"re":-0.00005742819467953064,"im":0.00002446019747635651},{"omegaRadPerYr":-0.1107948956846119,"re":3.2507064761096937e-7,"im":0.0000014893262878712717},{"omegaRadPerYr":0.2063193110741841,"re":-0.000012094578924974436,"im":-0.000015066272817853064},{"omegaRadPerYr":-0.2063193110741841,"re":-0.0002645706853712598,"im":-0.000043660297027029056},{"omegaRadPerYr":0.2130228704680447,"re":0.0007392110656689748,"im":0.0008891228393192088},{"omegaRadPerYr":-0.2130228704680447,"re":0.000018380819773470427,"im":0.000004389860388892079},{"omegaRadPerYr":-0.30955014898803845,"re":-0.000024631815470831895,"im":0.00002635073382218204},{"omegaRadPerYr":0.3161372566474592,"re":0.000010638067732514132,"im":0.00002903644464320735},{"omegaRadPerYr":-0.3161372566474592,"re":0.000044785364090127505,"im":-0.00007235123203278041},{"omegaRadPerYr":0.3232395099583198,"re":-0.0000030767740423315698,"im":-0.00002580327386509728},{"omegaRadPerYr":-0.3232395099583198,"re":-8.037783708694097e-7,"im":0.0000013792616646490144},{"omegaRadPerYr":0.41948429875117665,"re":-0.0000024400754535557023,"im":8.894450263194997e-7},{"omegaRadPerYr":-0.41948429875117665,"re":-0.00005542845317142494,"im":-0.00044582635037752926},{"omegaRadPerYr":0.42644865463819764,"re":0.00007629843791169079,"im":-0.00004431512896241777},{"omegaRadPerYr":-0.42644865463819764,"re":-3.142917811194328e-7,"im":0.000010823856186704562},{"omegaRadPerYr":0.5227089862323508,"re":0.000003410979417831606,"im":0.0000030363670326161395},{"omegaRadPerYr":-0.5227089862323508,"re":-0.00007781393434095757,"im":-0.000038627649196321925},{"omegaRadPerYr":0.5296908859098071,"re":0.0016272720362705665,"im":0.0011111321002679347},{"omegaRadPerYr":-0.6327562885720048,"re":0.000029869908761550486,"im":0.00004153187994553486},{"omegaRadPerYr":0.7358761721222311,"re":0.000002104902323996618,"im":-5.169275046806296e-7},{"omegaRadPerYr":-0.7358761721222311,"re":0.00002159732009990703,"im":-0.00016115133722286416},{"omegaRadPerYr":0.8391031676474132,"re":-3.2200579003446994e-7,"im":-1.921602155098948e-7},{"omegaRadPerYr":-0.8391031676474132,"re":-0.000029573064620902294,"im":-0.00002687687857849615},{"omegaRadPerYr":0.8460633253903981,"re":-0.0000182912621724972,"im":-0.000004960467884280318},{"omegaRadPerYr":-0.8460633253903981,"re":0.000002270968484351811,"im":-4.1450617474219755e-7},{"omegaRadPerYr":1.0522678070946976,"re":0.000002112495108837071,"im":-6.772836661571395e-7},{"omegaRadPerYr":-1.0522678070946976,"re":0.000026798123887720964,"im":-0.00006313630230370938},{"omegaRadPerYr":1.0593357383703628,"re":0.000055178325520269776,"im":0.00007541106198902492},{"omegaRadPerYr":-1.0593357383703628,"re":-0.0000011488133127119404,"im":0.0000024971143397116498}],"zeta":[{"omegaRadPerYr":-0.0006207787083493432,"re":-8.436595912367323e-7,"im":0.000001633263627834134},{"omegaRadPerYr":0.0006207787083493434,"re":-0.000021424440269056364,"im":0.00000406741893133285},{"omegaRadPerYr":0.0011035308302650994,"re":0.0000028014305555000514,"im":3.03429131598728e-7},{"omegaRadPerYr":0.007110979736486372,"re":0.000009782653039468542,"im":-0.000018356544025335236},{"omegaRadPerYr":0.11036111149309716,"re":0.0000053050503083409155,"im":-7.394158520138554e-7},{"omegaRadPerYr":-0.11036111149309716,"re":-1.2281150228540698e-7,"im":-3.07875979063758e-7},{"omegaRadPerYr":0.31648864888649864,"re":5.930263050595727e-7,"im":-0.0000017212036515675988},{"omegaRadPerYr":-0.31648864888649864,"re":0.000006094478957977664,"im":-0.0000045938972600486}],"windowAffine":{"mlon":{"off":709.9722654779956,"slope":-15.579934294638058},"a":{"off":-2829.2103263877525,"slope":-0.004510524074380032},"k":{"off":-0.0032950974609698065,"slope":-2.0051399643096954e-8},"h":{"off":-0.0002907698308219252,"slope":-1.3596818437416563e-8},"q":{"off":-0.0000010497861227947909,"slope":-1.844836227990879e-9},"p":{"off":0.00001949409542224931,"slope":-8.310665514904321e-10}}},"uranus":{"mlonArcsec":[{"omegaRadPerYr":0.0006208681133576669,"cos":1801.9688215276547,"sin":3696.0402015231675},{"omegaRadPerYr":0.0011579316488608284,"cos":-2487.6534406001147,"sin":-459.55088689711397},{"omegaRadPerYr":0.0016224830408352498,"cos":-1220.2966969515146,"sin":1099.2432996165028},{"omegaRadPerYr":0.002935118567074053,"cos":-86.83674347331831,"sin":-108.24685231024809},{"omegaRadPerYr":0.004155546482813653,"cos":7.118744517059694,"sin":23.57760406645599},{"omegaRadPerYr":0.009315002243089728,"cos":3.7516023313568363,"sin":7.101267898351473},{"omegaRadPerYr":0.010640504204457963,"cos":-45.57910944323328,"sin":-40.20883229440988},{"omegaRadPerYr":0.01119673478710359,"cos":-81.22235365041975,"sin":1.901281748995162},{"omegaRadPerYr":0.012145759710583907,"cos":6.889745560125585,"sin":0.1337542919867262},{"omegaRadPerYr":0.03510485087576988,"cos":-13.688922570681836,"sin":-0.13357807007057396},{"omegaRadPerYr":0.036426329598293165,"cos":-5.668712161443024,"sin":-24.347642616449427},{"omegaRadPerYr":0.03764711514559774,"cos":1.138953309753275,"sin":-6.871151194186152},{"omegaRadPerYr":0.06379838901039833,"cos":20.403291982312666,"sin":27.239956687524646},{"omegaRadPerYr":0.07318148932273885,"cos":-9.790209397106063,"sin":-27.80021241193281},{"omegaRadPerYr":0.07471215976498653,"cos":7.902379642110793,"sin":-0.774442117625175},{"omegaRadPerYr":0.10992640338436127,"cos":-5.939904215836388,"sin":-10.882753324742827},{"omegaRadPerYr":0.1385175392010205,"cos":155.21118912477402,"sin":-15.812055598809634},{"omegaRadPerYr":0.14663782569970274,"cos":-3.7488763779317598,"sin":-4.791075382227249},{"omegaRadPerYr":0.18317858258233016,"cos":-2.2663688645635784,"sin":-2.0807781596480717},{"omegaRadPerYr":0.20224498577277328,"cos":8.906763705097376,"sin":0.1380298652243485},{"omegaRadPerYr":0.21324964619950887,"cos":7.79719866947626,"sin":3.241509288620873},{"omegaRadPerYr":0.2770253845805853,"cos":-5.372427211086557,"sin":-26.160552277645316},{"omegaRadPerYr":0.34075769983231263,"cos":-0.34413062425412416,"sin":-3.4023598781892685},{"omegaRadPerYr":0.35171296920155715,"cos":6.530654205490572,"sin":4.862791616448076},{"omegaRadPerYr":0.3801532980579145,"cos":-10.061663279866217,"sin":6.615060134886086},{"omegaRadPerYr":0.4155393874689375,"cos":-8.765446247114845,"sin":2.7918680516072425},{"omegaRadPerYr":0.4549044622840928,"cos":693.1080948896936,"sin":120.18474838738872},{"omegaRadPerYr":0.45610432617458596,"cos":1.4784723033153024,"sin":-4.600733971723476},{"omegaRadPerYr":0.5296580495362411,"cos":25.53148607890865,"sin":29.126214483562098},{"omegaRadPerYr":0.9098120073368585,"cos":1.5179157507850387,"sin":-4.917034352655555},{"omegaRadPerYr":0.9845575209673397,"cos":34.71485095170867,"sin":-6.198872286264103}],"aPpm":[{"omegaRadPerYr":0.0015195464620650877,"cos":-97.92780120015847,"sin":-170.5428140152202},{"omegaRadPerYr":0.010971188991961797,"cos":15.922068967567228,"sin":-63.432796546205935},{"omegaRadPerYr":0.036210324842414696,"cos":16.212587942173556,"sin":-6.129790120421755},{"omegaRadPerYr":0.0638251399824393,"cos":10.100213421265115,"sin":75.06714450826473},{"omegaRadPerYr":0.0733720075467266,"cos":42.98239259300776,"sin":-17.9418140413923},{"omegaRadPerYr":0.07480628721946354,"cos":-98.25061077714025,"sin":-132.202002201576},{"omegaRadPerYr":0.10992773337349732,"cos":23.527834427275085,"sin":-13.195939312161588},{"omegaRadPerYr":0.13851260798083515,"cos":-111.93654476921755,"sin":-1070.016527121048},{"omegaRadPerYr":0.20224432811824086,"cos":-1.6198240173862555,"sin":23.993058869923644},{"omegaRadPerYr":0.2770277343049128,"cos":61.913236841972406,"sin":-9.835654134674343},{"omegaRadPerYr":0.35171020655145807,"cos":33.74734368162499,"sin":-41.87577534787228},{"omegaRadPerYr":0.38014999979161623,"cos":101.22109160185427,"sin":184.81826525347103},{"omegaRadPerYr":0.4155326059030616,"cos":-8.50929116085849,"sin":-24.32921998914257},{"omegaRadPerYr":0.45490446743623597,"cos":713.139927237936,"sin":-4114.6325172160405},{"omegaRadPerYr":0.4561160600364418,"cos":-27.913180144325082,"sin":-8.624546428335371},{"omegaRadPerYr":0.984557509897134,"cos":-33.18844015424147,"sin":-186.75405236611599}],"z":[{"omegaRadPerYr":-0.0006207787083493432,"re":-0.0010010271541711772,"im":0.0018777044315025746},{"omegaRadPerYr":0.0006207787083493464,"re":0.004669404370945987,"im":-0.009340747389266558},{"omegaRadPerYr":0.0009435296146423852,"re":-0.002693731244410169,"im":0.005515123870617622},{"omegaRadPerYr":-0.0011535901883012222,"re":0.00014035425010575732,"im":-0.00024989373718838423},{"omegaRadPerYr":0.0014837575606668784,"re":-0.00045779885526748995,"im":0.001029220718337651},{"omegaRadPerYr":0.0029527987688873665,"re":0.00009183113654454647,"im":0.00014226780874768813},{"omegaRadPerYr":0.004292938112541269,"re":0.00002604331453241119,"im":-0.0000026087586213451956},{"omegaRadPerYr":0.009597120283040226,"re":-0.000007669844938360622,"im":0.000021294192837364352},{"omegaRadPerYr":-0.009597120283040226,"re":-3.9726713006760554e-7,"im":6.855988059585005e-7},{"omegaRadPerYr":0.010674384178493406,"re":-0.000010533262678437352,"im":-0.0001455148230309594},{"omegaRadPerYr":0.011227739550618343,"re":0.00006715354281438808,"im":-0.00012622016168569206},{"omegaRadPerYr":0.03372910794138875,"re":-5.792844472104949e-7,"im":2.4314285495180073e-7},{"omegaRadPerYr":-0.03372910794138875,"re":-0.00000880378752168949,"im":-0.000006800427022328312},{"omegaRadPerYr":-0.03516446737018353,"re":0.000017036805195683028,"im":-0.00006576383803542369},{"omegaRadPerYr":0.03813277064323463,"re":-0.000014411793574417915,"im":0.000021543930065801352},{"omegaRadPerYr":0.03956799170730824,"re":0.0000060071290961077885,"im":0.000009377006777274802},{"omegaRadPerYr":-0.03956799170730824,"re":2.6935210872742854e-7,"im":-4.916863023382216e-8},{"omegaRadPerYr":0.05268030494966354,"re":-4.237037805796693e-8,"im":-2.2749652861175358e-7},{"omegaRadPerYr":-0.05268030494966354,"re":-0.00001162431242526334,"im":0.000006194880630876984},{"omegaRadPerYr":-0.06373512207652907,"re":-0.00022367795746631777,"im":-0.00017316839062164822},{"omegaRadPerYr":0.07165168074871991,"re":0.0000017015187480928225,"im":7.242338771966972e-7},{"omegaRadPerYr":-0.07165168074871991,"re":0.0000022253065719657005,"im":-0.0000239819546465497},{"omegaRadPerYr":0.07478159870524997,"re":0.0009483157794586808,"im":-0.0009764231771624703},{"omegaRadPerYr":0.10845808945136469,"re":-3.004883965295506e-7,"im":1.7055087357327652e-7},{"omegaRadPerYr":-0.10845808945136469,"re":-9.064387638229779e-7,"im":-0.000011385527941028099},{"omegaRadPerYr":-0.12747767226472656,"re":0.000021699265157246156,"im":0.00002376114754738344},{"omegaRadPerYr":0.13850950308176996,"re":-0.0000010910229098697519,"im":-0.000007886168725902355},{"omegaRadPerYr":-0.13850950308176996,"re":-0.000001434320086571384,"im":-0.00001963808508671571},{"omegaRadPerYr":0.1495497617854712,"re":0.000014732954282267382,"im":0.00008515250779883778},{"omegaRadPerYr":0.20222937823935716,"re":-1.1385591675988417e-7,"im":7.147831866493965e-7},{"omegaRadPerYr":-0.20222937823935716,"re":0.00004353415832027236,"im":-0.00006511784459661798},{"omegaRadPerYr":0.21329897373317086,"re":0.0003933511417178107,"im":0.00047058009044412887},{"omegaRadPerYr":-0.21329897373317086,"re":2.8327811431341513e-7,"im":-3.560359246154832e-7},{"omegaRadPerYr":0.2769038067800174,"re":-6.922779079018568e-7,"im":-0.0000013818132165140064},{"omegaRadPerYr":-0.2769038067800174,"re":-2.3494785512648875e-7,"im":-0.000016621555907303974},{"omegaRadPerYr":0.3053633220183532,"re":-3.828674197691803e-8,"im":-3.0064823844297327e-8},{"omegaRadPerYr":-0.3053633220183532,"re":0.00007882762566993446,"im":0.0000236123586415603},{"omegaRadPerYr":0.3407483470470682,"re":-1.3758316558774432e-7,"im":-2.4367154579582864e-7},{"omegaRadPerYr":-0.3407483470470682,"re":-0.000024185839542396282,"im":-0.000011566031399227259},{"omegaRadPerYr":0.38011803010191847,"re":-5.112230464978982e-8,"im":3.5576083426589514e-7},{"omegaRadPerYr":-0.38011803010191847,"re":-0.000683808108807156,"im":-0.0009409743748576826},{"omegaRadPerYr":0.38132830185858746,"re":-5.8177806967052385e-8,"im":1.6800244502590846e-7},{"omegaRadPerYr":-0.38132830185858746,"re":-0.000014034035119495699,"im":0.000007393494708343985},{"omegaRadPerYr":0.4264958876223484,"re":0.000033536519266374154,"im":0.0000032361816570982316},{"omegaRadPerYr":-0.4264958876223484,"re":2.1135509106302237e-9,"im":-2.2152515698741622e-7},{"omegaRadPerYr":0.4548421909364264,"re":-0.000006897616144456808,"im":-0.00002246641860475243},{"omegaRadPerYr":-0.4548421909364264,"re":0.00000407137788831569,"im":-0.00007288075699841603},{"omegaRadPerYr":0.5296909155630158,"re":0.0022676944652803236,"im":0.0015486566265643551},{"omegaRadPerYr":0.6044398037682881,"re":0.00001772821682494471,"im":-0.000001325745633927324},{"omegaRadPerYr":-0.6044398037682881,"re":1.8671243007549463e-7,"im":5.135484152882108e-9},{"omegaRadPerYr":0.8350185854831645,"re":1.3389962716219148e-7,"im":4.84551878795857e-8},{"omegaRadPerYr":-0.8350185854831645,"re":0.000018812120588273927,"im":-0.000007750077895326201},{"omegaRadPerYr":0.9097702890415831,"re":-5.782380719892394e-7,"im":1.9729873306333605e-7},{"omegaRadPerYr":-0.9097702890415831,"re":-0.00004113467597080967,"im":-0.000028046600646821318},{"omegaRadPerYr":1.0593442234385404,"re":0.00007767832087815946,"im":0.00010783753098964789},{"omegaRadPerYr":-1.0593442234385404,"re":-1.3556647669744362e-9,"im":3.814197973272324e-8}],"zeta":[{"omegaRadPerYr":-0.0006207787083493432,"re":0.000009629466068512008,"im":-0.00002700542307681737},{"omegaRadPerYr":0.0006207787083493434,"re":-0.000049798841708766556,"im":0.00013244063973719405},{"omegaRadPerYr":0.0009514858307923093,"re":0.000026789231695805917,"im":-0.00007644359257728086},{"omegaRadPerYr":0.0014527887892821479,"re":-0.0000023897704328165434,"im":0.000013648719577168508},{"omegaRadPerYr":-0.0014792753244575146,"re":0.000002151034415423666,"im":0.000005190682098271777},{"omegaRadPerYr":0.0029820480249223872,"re":-0.0000013160358614767749,"im":-0.000005115909165770176},{"omegaRadPerYr":0.00445001839713232,"re":-6.717165830591991e-7,"im":9.251686604741414e-9},{"omegaRadPerYr":0.011102305337337318,"re":-0.000004628968123150622,"im":-0.0000046908160229297634},{"omegaRadPerYr":0.03663431002433444,"re":-6.097607617781723e-7,"im":9.248254018616485e-8},{"omegaRadPerYr":-0.036662600049736954,"re":4.790966947907778e-7,"im":-2.7030397322901033e-7},{"omegaRadPerYr":-0.1385862814842433,"re":0.0000034400542443838532,"im":0.0000021585069767270156},{"omegaRadPerYr":0.1496020811421664,"re":8.15990123336191e-7,"im":-7.942505016386517e-7},{"omegaRadPerYr":0.2881502651212958,"re":-0.0000010962716988804577,"im":-0.0000016121125699103533},{"omegaRadPerYr":0.45486894002023015,"re":-2.2992966985781707e-8,"im":-9.354657471556091e-9},{"omegaRadPerYr":-0.45486894002023015,"re":0.0000041579007491430415,"im":0.000004891978906915924},{"omegaRadPerYr":0.6044418164850311,"re":-0.0000037738318413916955,"im":-0.0000030151035436098662},{"omegaRadPerYr":-0.6044418164850311,"re":-7.35866162994619e-11,"im":-1.0864146466816922e-9}],"windowAffine":{"mlon":{"off":1210.0916981086646,"slope":-2.356561618102263},"a":{"off":-570.5850928990467,"slope":-0.008328826998351968},"k":{"off":-0.00366228365357873,"slope":-0.000002706626332717455},"h":{"off":0.0013833912074699532,"slope":-0.0000013941565327430463},"q":{"off":0.000017812451313420837,"slope":4.3356058040235435e-8},"p":{"off":-0.00003762382414202915,"slope":1.7014936480391533e-8}}},"neptune":{"mlonArcsec":[{"omegaRadPerYr":0.0006208681133576669,"cos":1064.212149451297,"sin":-18540.652753959734},{"omegaRadPerYr":0.0010884207287489497,"cos":-924.0362482426459,"sin":8383.82201986771},{"omegaRadPerYr":0.0014542551964391568,"cos":2226.955694353464,"sin":-3270.274366253071},{"omegaRadPerYr":0.0029389628530379795,"cos":48.078439095229676,"sin":94.12365761816456},{"omegaRadPerYr":0.035319889560920095,"cos":9.257473045853379,"sin":2.0734856552080676},{"omegaRadPerYr":0.03664876565539879,"cos":4.7094553822663965,"sin":32.60593260837659},{"omegaRadPerYr":0.0379634784712963,"cos":2.9744193339631977,"sin":2.513917234979188},{"omegaRadPerYr":0.07185421776935363,"cos":2.8052710744993297,"sin":0.02846273088874038},{"omegaRadPerYr":0.0732973641270625,"cos":6.1965389050552835,"sin":17.0773714633508},{"omegaRadPerYr":0.10987969317187546,"cos":3.60363735367916,"sin":6.863360280812679},{"omegaRadPerYr":0.1465411070471313,"cos":2.3029358223686502,"sin":2.954488343602723},{"omegaRadPerYr":0.17516600735395105,"cos":184.4413301288469,"sin":-52.32109605114765},{"omegaRadPerYr":0.35033794653247485,"cos":-1.7861093063080808,"sin":-2.9405528996126975},{"omegaRadPerYr":0.38836651611040063,"cos":9.70081182993168,"sin":5.3192582532981545},{"omegaRadPerYr":0.4915611841446312,"cos":911.0889137852095,"sin":-1.0510799754510758},{"omegaRadPerYr":0.49279773384983616,"cos":-0.5592399822047331,"sin":3.9702700781104827},{"omegaRadPerYr":0.5297024373268707,"cos":2.40320968051373,"sin":-9.399068768105197},{"omegaRadPerYr":1.021214758421749,"cos":42.2020577057518,"sin":-15.309967518050174}],"aPpm":[{"omegaRadPerYr":0.0015262400589186877,"cos":128.59464307443753,"sin":231.15748494462574},{"omegaRadPerYr":0.0028522808070564833,"cos":-21.37258121508621,"sin":10.41064755989285},{"omegaRadPerYr":0.03669498740393444,"cos":151.68816464488373,"sin":-28.109847919847983},{"omegaRadPerYr":0.0732428963963061,"cos":-33.097418893495544,"sin":11.320551289859745},{"omegaRadPerYr":0.11007776654950899,"cos":-15.641429019477593,"sin":8.577259144710313},{"omegaRadPerYr":0.17516937472508654,"cos":-326.96669731853905,"sin":-1149.3821777931403},{"omegaRadPerYr":0.38836651718787407,"cos":29.53675612865252,"sin":-54.13457963760843},{"omegaRadPerYr":0.4534159750526987,"cos":-46.68270557697238,"sin":11.759966469069417},{"omegaRadPerYr":0.49156118009313077,"cos":-5.290056175958509,"sin":-4922.302879177644},{"omegaRadPerYr":0.4928261722960873,"cos":22.10668376967481,"sin":2.1304175891318873},{"omegaRadPerYr":1.0212147268897795,"cos":-78.57315117147935,"sin":-216.34180136813907}],"z":[{"omegaRadPerYr":-0.0006207787083493432,"re":0.00000822910599695662,"im":0.00000566645788782689},{"omegaRadPerYr":0.0006207787083493453,"re":-0.0000033482623738817215,"im":-0.000011998582333036538},{"omegaRadPerYr":0.0014837734825010177,"re":0.0002465285902965811,"im":-0.000542946526804817},{"omegaRadPerYr":0.002952491806788975,"re":-0.00011247629571556469,"im":-0.00011171907883842821},{"omegaRadPerYr":-0.004414051602461347,"re":-1.1949180023376013e-8,"im":-5.895393912563796e-8},{"omegaRadPerYr":0.00441745151969733,"re":-0.000011139829747812603,"im":0.000005957961387581304},{"omegaRadPerYr":-0.0336947851363493,"re":0.000008788563557474915,"im":0.0000066100893572258815},{"omegaRadPerYr":-0.03516438841507151,"re":-0.000016831823497116864,"im":0.00006611363801678594},{"omegaRadPerYr":0.03666424259143439,"re":0.0000067161349630566706,"im":8.5863061450533e-7},{"omegaRadPerYr":0.03813296419381759,"re":0.0007689836932573089,"im":-0.0011245762260255845},{"omegaRadPerYr":-0.07181296843697238,"re":-0.0000023474904524169503,"im":0.000024443385640750307},{"omegaRadPerYr":0.07478167259300009,"re":0.00006051155974368794,"im":-0.00006241188917030075},{"omegaRadPerYr":0.08068029609791652,"re":-2.1385174933710793e-7,"im":9.47807650713311e-8},{"omegaRadPerYr":0.10840999361006448,"re":-2.1894562976651773e-8,"im":-1.842804538376415e-8},{"omegaRadPerYr":-0.10840999361006448,"re":5.153826226655718e-7,"im":0.000011407506356300657},{"omegaRadPerYr":-0.13703303990304816,"re":-0.0003233037620025506,"im":-0.00010732690949601281},{"omegaRadPerYr":0.21329898735568126,"re":0.00048778689719744165,"im":0.0005843247148884207},{"omegaRadPerYr":-0.3121996849254518,"re":2.6584347616665e-7,"im":-0.000009497238475246992},{"omegaRadPerYr":0.3502350293271937,"re":4.843040927610671e-8,"im":-1.0702237146150716e-7},{"omegaRadPerYr":-0.3502350293271937,"re":-0.000007616440459433557,"im":-0.000014833156682859016},{"omegaRadPerYr":0.41529137321236287,"re":1.442005878816463e-7,"im":-3.484512197119509e-7},{"omegaRadPerYr":-0.41529137321236287,"re":-0.00000707795193580432,"im":0.00001836075632727175},{"omegaRadPerYr":0.42649606358473324,"re":0.00004218844308149576,"im":0.000004227571689777453},{"omegaRadPerYr":-0.42649606358473324,"re":-5.658292052953387e-8,"im":-6.845099901226937e-8},{"omegaRadPerYr":0.45343148629777286,"re":-5.680507946629673e-8,"im":-9.841661999629342e-8},{"omegaRadPerYr":-0.45343148629777286,"re":-0.0010841004899122212,"im":-0.000736390221813403},{"omegaRadPerYr":0.4546133901012304,"re":6.67914668314911e-8,"im":6.897609009672202e-8},{"omegaRadPerYr":-0.4546133901012304,"re":0.00000818929299076697,"im":-0.000008038397570237945},{"omegaRadPerYr":0.4915675955310438,"re":-0.000004083522353726188,"im":0.000003744270434963885},{"omegaRadPerYr":-0.4915675955310438,"re":-0.000012301739812453286,"im":0.000010686366413055363},{"omegaRadPerYr":0.5296909041466622,"re":0.002839613383622111,"im":0.0019403577470709873},{"omegaRadPerYr":0.9830852238230905,"re":-6.720721583920492e-8,"im":3.425816645371005e-8},{"omegaRadPerYr":-0.9830852238230905,"re":-0.00005758151994324185,"im":-0.000014754794069635932},{"omegaRadPerYr":1.0593442030083966,"re":0.00009721226174654751,"im":0.0001350049744357107},{"omegaRadPerYr":-1.0593442030083966,"re":-4.1559879847366785e-8,"im":9.802298292992387e-9}],"zeta":[{"omegaRadPerYr":-0.0006207787083493432,"re":-5.057373983794714e-7,"im":0.0000031433152031555667},{"omegaRadPerYr":0.0006207787083493438,"re":0.0000029115733404898485,"im":-0.000004309627443672908},{"omegaRadPerYr":0.0014366584800648346,"re":-0.0000013572071156821169,"im":-0.000001020104238423996},{"omegaRadPerYr":-0.001480323771534016,"re":-0.0000011783259528824155,"im":-0.0000018211874549353222},{"omegaRadPerYr":0.002982469348844243,"re":9.458475398560309e-7,"im":0.000003122123819843002},{"omegaRadPerYr":0.0044510414024656955,"re":3.971188256100343e-7,"im":2.94455272695886e-8},{"omegaRadPerYr":0.03663380433896722,"re":3.593149192869475e-7,"im":-5.5827146617815774e-8},{"omegaRadPerYr":-0.17494555869955136,"re":9.099409535530744e-7,"im":-9.024205485759674e-7},{"omegaRadPerYr":-0.17549754071699553,"re":0.000001505121306046405,"im":-3.070442234723798e-7},{"omegaRadPerYr":0.49159407636236985,"re":4.796686684990757e-9,"im":3.358344123813994e-10},{"omegaRadPerYr":-0.49159407636236985,"re":-3.98804489842816e-7,"im":-0.00001005615352417885},{"omegaRadPerYr":0.5676217845108422,"re":0.000004880876845321145,"im":-0.0000023244672855910403},{"omegaRadPerYr":0.5681730424584401,"re":0.000003985093304959338,"im":-7.238476904721648e-7}],"windowAffine":{"mlon":{"off":-3600.978375847875,"slope":6.706848240846746},"a":{"off":228.34220468445073,"slope":0.013417433557641792},"k":{"off":-0.0029101681444154044,"slope":2.5117803834315305e-9},"h":{"off":-0.00012102457242531213,"slope":1.8162297961597065e-8},"q":{"off":-0.000011703165443191566,"slope":-2.5174396402677695e-9},"p":{"off":0.00001578707593265369,"slope":-1.0378417602521395e-8}}}}});
@@ -0,0 +1,304 @@
1
+ /**
2
+ * The Keplerian planet chain — THE shared implementation (P5/K2 → K4.7b).
3
+ * Engine-D-driven elements → heliocentric positions; lives ONCE here, consumed
4
+ * by tools/lib/keplerian-chain.js (Node binding: fs artifact loader + the
5
+ * model's AU) and by the browser scene (src/script.js) through the embedded
6
+ * chain artifact.
7
+ *
8
+ * SOURCE-OF-TRUTH DOCTRINE (plan 02 §P5): engine D is the truth because it is
9
+ * causally ours. The ONLY inputs are (1) the J2000 Horizons state vectors —
10
+ * the anchor, the numbers left to nature — and (2) element evolution measured
11
+ * by the model's own N-body pipeline (the governed artifact
12
+ * data/nbody-secular-frequencies.json: era-typed window rates, the K4.7
13
+ * multi-mode secular tables, the K4.5/K4.7b derived periodic layer;
14
+ * regenerated from the constants whenever they change, so a changed planet
15
+ * mass propagates engine → artifact → here). No Meeus/JPL/Laskar series or
16
+ * rates enter this module, ever; external ephemerides are anchors and
17
+ * comparison surfaces only. The model's planet positions MAY DIFFER from
18
+ * JPL — that difference is published model content, not a defect.
19
+ *
20
+ * PURITY: every function is pure; the artifact object and the model's AU are
21
+ * passed in by the caller (the two engines bind their own single homes).
22
+ * Units/frames: AU and years internally where named; ecliptic-J2000 frame
23
+ * throughout (the HZ seed frame); angles degrees in the public API.
24
+ * MATCHED PAIR: this file is hashed as an input of the governed artifact —
25
+ * terms and evaluation form ship together (the ~1162-minute-class rule).
26
+ */
27
+
28
+ 'use strict';
29
+
30
+ /** @typedef {{aAU:number,e:number,inclEclipticDeg:number,ascNodeEclipticDeg:number,
31
+ * lonPeriEclipticDeg:number,meanLonEclipticDeg:number,
32
+ * meanMotionDegPerYr?:number,argPeriDeg?:number,meanAnomalyDeg?:number}} KcElements */
33
+ /** @typedef {{omegaRadPerYr:number,cos:number,sin:number}} KcCosSinTerm */
34
+ /** @typedef {{omegaRadPerYr:number,re:number,im:number}} KcComplexTerm */
35
+ /** @typedef {{comps:Array<{planet:string,sLam?:number,sPom?:number}>,cos:number,sin:number}} KcPoissonCosSinTerm */
36
+ /** @typedef {{comps:Array<{planet:string,sLam?:number,sPom?:number}>,re:number,im:number}} KcPoissonComplexTerm */
37
+ /** @typedef {{off:number,slope?:number}} KcAffine */
38
+ /** @typedef {{windowAffine?:Object<string,KcAffine>,mlonArcsec?:KcCosSinTerm[],aPpm?:KcCosSinTerm[],
39
+ * z?:KcComplexTerm[],zeta?:KcComplexTerm[],
40
+ * poissonMlonArcsec?:KcPoissonCosSinTerm[],poissonZ?:KcPoissonComplexTerm[]}} KcPeriodicTerms */
41
+ /** @typedef {{anchor:KcElements,periRateArcsecCy:number,meanMotionDegPerYr:(number|null),
42
+ * windowRates?:{meanMotionDegPerYr?:number,nodeRateArcsecCy?:number,eccDotPerCy?:number,inclDotArcsecCy?:number},
43
+ * secularModes?:({z:KcComplexTerm[],zeta:KcComplexTerm[]}|null),
44
+ * periodicTerms?:(KcPeriodicTerms|undefined)}} KcPlanetChain */
45
+
46
+ const D2R = Math.PI / 180;
47
+
48
+ // The anchor epoch of the HZ state vectors: J2000.0 (JD 2451545.0), carried
49
+ // in this module's `year` coordinate as 2000.0 by convention. PRECISION NOTE
50
+ // (K3): JD 2451545.0 is Jan 1, 12:00 TT — when the chain meets a scene
51
+ // calendar, the epoch maps through the model's OWN JD→year machinery (the
52
+ // linear-vs-calendar JD→year trap), never a hand-made offset; a half-day
53
+ // slip is 2° of Mercury mean longitude.
54
+ const ANCHOR_EPOCH_YEAR = 2000;
55
+ const ANCHOR_EPOCH_JD = 2451545.0;
56
+
57
+ /** Full osculating elements from a heliocentric ecliptic-J2000 state vector.
58
+ * @param {number[]} rKm heliocentric position, km
59
+ * @param {number[]} vKmS heliocentric velocity, km/s
60
+ * @param {number} muKm3S2 GM_Sun + GM_planet
61
+ * @param {number} auKm the model's AU in km (caller's single home)
62
+ * @returns {{aAU:number,e:number,inclEclipticDeg:number,ascNodeEclipticDeg:number,
63
+ * argPeriDeg:number,lonPeriEclipticDeg:number,meanAnomalyDeg:number,
64
+ * meanLonEclipticDeg:number,meanMotionDegPerYr:number}} */
65
+ function computeOsculatingElements(rKm, vKmS, muKm3S2, auKm) {
66
+ const r = rKm, v = vKmS, mu = muKm3S2;
67
+ const rn = Math.hypot(r[0], r[1], r[2]);
68
+ const v2 = v[0] * v[0] + v[1] * v[1] + v[2] * v[2];
69
+ const h = [r[1] * v[2] - r[2] * v[1], r[2] * v[0] - r[0] * v[2], r[0] * v[1] - r[1] * v[0]];
70
+ const hn = Math.hypot(h[0], h[1], h[2]);
71
+ const ev = [0, 1, 2].map((c) =>
72
+ (v[(c + 1) % 3] * h[(c + 2) % 3] - v[(c + 2) % 3] * h[(c + 1) % 3]) / mu - r[c] / rn);
73
+ const e = Math.hypot(ev[0], ev[1], ev[2]);
74
+ const aKm = 1 / (2 / rn - v2 / mu);
75
+ const incl = Math.acos(h[2] / hn);
76
+ const Om = Math.atan2(h[0], -h[1]); // ascending node
77
+ // argument of perihelion
78
+ const nodeU = [Math.cos(Om), Math.sin(Om), 0];
79
+ let argw = Math.acos(Math.max(-1, Math.min(1, (nodeU[0] * ev[0] + nodeU[1] * ev[1]) / e)));
80
+ if (ev[2] < 0) argw = 2 * Math.PI - argw;
81
+ // true anomaly → eccentric → mean
82
+ let nu = Math.acos(Math.max(-1, Math.min(1, (ev[0] * r[0] + ev[1] * r[1] + ev[2] * r[2]) / (e * rn))));
83
+ const rv = r[0] * v[0] + r[1] * v[1] + r[2] * v[2];
84
+ if (rv < 0) nu = 2 * Math.PI - nu;
85
+ const E = Math.atan2(Math.sqrt(1 - e * e) * Math.sin(nu), e + Math.cos(nu));
86
+ const M = E - e * Math.sin(E);
87
+ const nRadS = Math.sqrt(mu / (aKm * aKm * aKm)); // rad/s
88
+ const meanMotionDegPerYr = nRadS * 86400 * 365.25 / D2R;
89
+ const wrap = (/** @type {number} */ x) => ((x % 360) + 360) % 360;
90
+ const lonPeri = wrap((Om + argw) / D2R);
91
+ return {
92
+ aAU: aKm / auKm,
93
+ e,
94
+ inclEclipticDeg: incl / D2R,
95
+ ascNodeEclipticDeg: wrap(Om / D2R),
96
+ argPeriDeg: wrap(argw / D2R),
97
+ lonPeriEclipticDeg: lonPeri,
98
+ meanAnomalyDeg: wrap(M / D2R),
99
+ meanLonEclipticDeg: wrap(lonPeri + M / D2R),
100
+ meanMotionDegPerYr,
101
+ };
102
+ }
103
+
104
+ /** Solve Kepler's equation E − e·sinE = M (radians), Newton iteration.
105
+ * @param {number} meanAnomalyRad @param {number} e @returns {number} */
106
+ function solveKeplerRad(meanAnomalyRad, e) {
107
+ let E = e < 0.8 ? meanAnomalyRad : Math.PI;
108
+ for (let i = 0; i < 30; i++) {
109
+ const d = (E - e * Math.sin(E) - meanAnomalyRad) / (1 - e * Math.cos(E));
110
+ E -= d;
111
+ if (Math.abs(d) < 1e-14) break;
112
+ }
113
+ return E;
114
+ }
115
+
116
+ /** Heliocentric ecliptic-J2000 position from elements-of-date.
117
+ * @param {{aAU:number,e:number,inclEclipticDeg:number,ascNodeEclipticDeg:number,
118
+ * lonPeriEclipticDeg:number,meanLonEclipticDeg:number}} el
119
+ * @returns {{xAU:number,yAU:number,zAU:number,rAU:number}} */
120
+ function computeHeliocentricEclipticFromElements(el) {
121
+ const Mdeg = el.meanLonEclipticDeg - el.lonPeriEclipticDeg;
122
+ const E = solveKeplerRad(((Mdeg % 360) + 360) % 360 * D2R, el.e);
123
+ const xp = el.aAU * (Math.cos(E) - el.e);
124
+ const yp = el.aAU * Math.sqrt(1 - el.e * el.e) * Math.sin(E);
125
+ const w = (el.lonPeriEclipticDeg - el.ascNodeEclipticDeg) * D2R;
126
+ const Om = el.ascNodeEclipticDeg * D2R;
127
+ const inc = el.inclEclipticDeg * D2R;
128
+ const cw = Math.cos(w), sw = Math.sin(w), cO = Math.cos(Om), sO = Math.sin(Om), ci = Math.cos(inc), si = Math.sin(inc);
129
+ const xAU = (cw * cO - sw * sO * ci) * xp + (-sw * cO - cw * sO * ci) * yp;
130
+ const yAU = (cw * sO + sw * cO * ci) * xp + (-sw * sO + cw * cO * ci) * yp;
131
+ const zAU = (sw * si) * xp + (cw * si) * yp;
132
+ return { xAU, yAU, zAU, rAU: Math.hypot(xAU, yAU, zAU) };
133
+ }
134
+
135
+ /** Poisson argument θ (radians) at `year`: Σ comps of s_lam·λ̄ + s_pom·ϖ over
136
+ * the referenced planets — λ̄ from the linear skeleton, ϖ(t) from the
137
+ * multi-mode secular sum (d'Alembert-complete arguments; K4.7b — RECORD
138
+ * ONLY: the era solve measured Poisson columns negative, no terms are
139
+ * exported; the machinery stands as the campaign record).
140
+ * @param {number} year @param {Object<string,KcPlanetChain>} allChains
141
+ * @param {Array<{planet:string,sLam?:number,sPom?:number}>} comps
142
+ * @returns {number} */
143
+ function computePoissonArgRad(year, allChains, comps) {
144
+ let th = 0;
145
+ for (const c of comps) {
146
+ const ch = allChains[c.planet], a = ch.anchor;
147
+ if (c.sLam) th += c.sLam * (a.meanLonEclipticDeg + (ch.meanMotionDegPerYr ?? a.meanMotionDegPerYr ?? 0) * (year - ANCHOR_EPOCH_YEAR)) * D2R;
148
+ if (c.sPom) {
149
+ // secular-only ϖ(t): the periodic terms are stripped BY CONSTRUCTION —
150
+ // a runtime chain carrying poissonZ terms would otherwise recurse
151
+ // through this very argument.
152
+ const el = computePlanetElementsAtYear(year, { ...ch, periodicTerms: undefined });
153
+ th += c.sPom * el.lonPeriEclipticDeg * D2R;
154
+ }
155
+ }
156
+ return th;
157
+ }
158
+
159
+ /** Elements-of-date for one planet.
160
+ * @param {number} year decimal year (epoch parameter first, per naming rule)
161
+ * @param {KcPlanetChain} planetChain
162
+ * @param {Object<string,KcPlanetChain>=} allChains full chain set — required
163
+ * only when planetChain.periodicTerms carries Poisson-argument terms
164
+ * @returns {KcElements} elements at `year` */
165
+ function computePlanetElementsAtYear(year, planetChain, allChains) {
166
+ const dt = year - ANCHOR_EPOCH_YEAR;
167
+ const a = planetChain.anchor;
168
+ const n = planetChain.meanMotionDegPerYr ?? a.meanMotionDegPerYr ?? 0;
169
+ const r = planetChain.windowRates || {}; // K2.1 era-typed drifts (legacy linear path)
170
+ const wrap = (/** @type {number} */ x) => ((x % 360) + 360) % 360;
171
+ const out = {
172
+ aAU: a.aAU,
173
+ meanLonEclipticDeg: wrap(a.meanLonEclipticDeg + n * dt),
174
+ e: 0, inclEclipticDeg: 0, ascNodeEclipticDeg: 0, lonPeriEclipticDeg: 0,
175
+ };
176
+ const SM = planetChain.secularModes;
177
+ if (SM) {
178
+ // K4.7 — THE MULTI-MODE SECULAR SKELETON (same physics for all planets):
179
+ // z(t) = Σ modes + constant remainder; the linear-drift tangent was
180
+ // measured leaving the eigenmode-rotation curvature as an unfixable
181
+ // residual (Saturn ~700µ sagitta over ±2.5 kyr). The constant remainder
182
+ // z₀ − Σmodes(0) is the content a 1-Myr NAFF cannot resolve
183
+ // (ultra-long modes + short-period at the anchor) — itself physical.
184
+ const sum = (/** @type {KcComplexTerm[]} */ modes, /** @type {number} */ t2) => {
185
+ let re = 0, im = 0;
186
+ for (const m of modes) { const c = Math.cos(m.omegaRadPerYr * t2), s = Math.sin(m.omegaRadPerYr * t2); re += m.re * c - m.im * s; im += m.re * s + m.im * c; }
187
+ return [re, im];
188
+ };
189
+ const [zk, zh] = sum(SM.z, dt), [zk0, zh0] = sum(SM.z, 0);
190
+ const k0 = zk + (a.e * Math.cos(a.lonPeriEclipticDeg * D2R) - zk0);
191
+ const h0 = zh + (a.e * Math.sin(a.lonPeriEclipticDeg * D2R) - zh0);
192
+ out.e = Math.hypot(k0, h0);
193
+ out.lonPeriEclipticDeg = wrap(Math.atan2(h0, k0) / D2R);
194
+ const [zq, zp] = sum(SM.zeta, dt), [zq0, zp0] = sum(SM.zeta, 0);
195
+ const s2a = Math.sin(a.inclEclipticDeg / 2 * D2R);
196
+ const q0 = zq + (s2a * Math.cos(a.ascNodeEclipticDeg * D2R) - zq0);
197
+ const p0 = zp + (s2a * Math.sin(a.ascNodeEclipticDeg * D2R) - zp0);
198
+ out.inclEclipticDeg = 2 * Math.asin(Math.hypot(q0, p0)) / D2R;
199
+ out.ascNodeEclipticDeg = wrap(Math.atan2(p0, q0) / D2R);
200
+ } else {
201
+ // legacy linear path (frozen-element gating; pre-K4.7 artifacts)
202
+ out.e = a.e + ((r.eccDotPerCy || 0) / 100) * dt;
203
+ out.inclEclipticDeg = a.inclEclipticDeg + ((r.inclDotArcsecCy || 0) / 3600 / 100) * dt;
204
+ out.ascNodeEclipticDeg = wrap(a.ascNodeEclipticDeg + ((r.nodeRateArcsecCy || 0) / 3600 / 100) * dt);
205
+ out.lonPeriEclipticDeg = wrap(a.lonPeriEclipticDeg + (planetChain.periRateArcsecCy / 3600 / 100) * dt);
206
+ }
207
+ // K4.5 — the DERIVED periodic layer: engine-extracted/era-solved terms in
208
+ // the mean longitude, the semi-major axis, and the nonsingular z-vector
209
+ // (z = k + i·h = e·e^{iϖ}), plus the era-typed in-window affine (anchor-
210
+ // snapshot vs window content). All quantities measured from the model's
211
+ // own N-body runs (k45-residual-naff / k45e-amplitude-solve are the
212
+ // record) — nothing observation-fitted.
213
+ const P = planetChain.periodicTerms;
214
+ if (P) {
215
+ const w = P.windowAffine || {};
216
+ // K4.7b — the semi-major-axis channel: heliocentric osculating elements
217
+ // slosh TOGETHER at the synodic periods (largely the Sun's giant-planet
218
+ // reflex, physical on both sides of any comparison); fitting λ̄/z wobbles
219
+ // while freezing a at the anchor leaves an element-INCONSISTENT set — the
220
+ // reconstructed position needs all channels or none (measured: U/N δa/a
221
+ // residual 3000–3800 ppm at the J/S synodics, k47b spectrum).
222
+ if (P.aPpm || w.a) {
223
+ let dA = w.a ? w.a.off + (w.a.slope || 0) * dt : 0;
224
+ for (const tm of P.aPpm || []) dA += tm.cos * Math.cos(tm.omegaRadPerYr * dt) + tm.sin * Math.sin(tm.omegaRadPerYr * dt);
225
+ out.aAU = a.aAU * (1 + dA * 1e-6);
226
+ }
227
+ let dMlon = w.mlon ? w.mlon.off + (w.mlon.slope || 0) * dt : 0;
228
+ for (const tm of P.mlonArcsec || []) dMlon += tm.cos * Math.cos(tm.omegaRadPerYr * dt) + tm.sin * Math.sin(tm.omegaRadPerYr * dt);
229
+ // K4.7b — Poisson-argument terms (record only; none currently exported)
230
+ for (const tm of P.poissonMlonArcsec || []) {
231
+ const th = computePoissonArgRad(year, allChains || {}, tm.comps);
232
+ dMlon += tm.cos * Math.cos(th) + tm.sin * Math.sin(th);
233
+ }
234
+ out.meanLonEclipticDeg = wrap(out.meanLonEclipticDeg + dMlon / 3600);
235
+ let k0 = out.e * Math.cos(out.lonPeriEclipticDeg * D2R) + (w.k ? w.k.off + (w.k.slope || 0) * dt : 0);
236
+ let h0 = out.e * Math.sin(out.lonPeriEclipticDeg * D2R) + (w.h ? w.h.off + (w.h.slope || 0) * dt : 0);
237
+ for (const tm of P.z || []) {
238
+ const c = Math.cos(tm.omegaRadPerYr * dt), s = Math.sin(tm.omegaRadPerYr * dt);
239
+ k0 += tm.re * c - tm.im * s; h0 += tm.re * s + tm.im * c;
240
+ }
241
+ for (const tm of P.poissonZ || []) {
242
+ const th = computePoissonArgRad(year, allChains || {}, tm.comps);
243
+ const c = Math.cos(th), s = Math.sin(th);
244
+ k0 += tm.re * c - tm.im * s; h0 += tm.re * s + tm.im * c;
245
+ }
246
+ out.e = Math.hypot(k0, h0);
247
+ out.lonPeriEclipticDeg = wrap(Math.atan2(h0, k0) / D2R);
248
+ // K4.5c — the out-of-plane channel: ζ = q + i·p = sin(i/2)·e^{iΩ}
249
+ if (P.zeta || w.q || w.p) {
250
+ let q0 = Math.sin(out.inclEclipticDeg / 2 * D2R) * Math.cos(out.ascNodeEclipticDeg * D2R) + (w.q ? w.q.off + (w.q.slope || 0) * dt : 0);
251
+ let p0 = Math.sin(out.inclEclipticDeg / 2 * D2R) * Math.sin(out.ascNodeEclipticDeg * D2R) + (w.p ? w.p.off + (w.p.slope || 0) * dt : 0);
252
+ for (const tm of P.zeta || []) {
253
+ const c = Math.cos(tm.omegaRadPerYr * dt), s = Math.sin(tm.omegaRadPerYr * dt);
254
+ q0 += tm.re * c - tm.im * s; p0 += tm.re * s + tm.im * c;
255
+ }
256
+ out.inclEclipticDeg = 2 * Math.asin(Math.hypot(q0, p0)) / D2R;
257
+ out.ascNodeEclipticDeg = wrap(Math.atan2(p0, q0) / D2R);
258
+ }
259
+ }
260
+ return out;
261
+ }
262
+
263
+ /** The chain's canonical constructor from a PARSED governed artifact (K2.1 →
264
+ * K4.6c): anchors (the engine-extracted t=0 elements), era-typed window
265
+ * rates, the K4.7 secular mode tables, and the K4.5/K4.7b periodic layer.
266
+ * @param {*} art the governed engine-D artifact, parsed (deep JSON —
267
+ * shape enforced by the generator's assertions, not retyped here)
268
+ * @param {{skeletonOnly?:boolean}=} opts skeletonOnly omits the periodic
269
+ * layer — REQUIRED by the extraction/solve instruments, which
270
+ * measure the residual AGAINST the skeleton; a terms-bearing chain
271
+ * there would extract its own output.
272
+ * @returns {Object<string,KcPlanetChain>} */
273
+ function buildPlanetChainsFromArtifactData(art, opts = {}) {
274
+ if (!art.windowElementRates || !art.j2000AnchorElements) {
275
+ throw new Error('artifact predates K2.1 — regenerate: node tools/verify/nbody-secular.js --write');
276
+ }
277
+ /** @type {Object<string,KcPlanetChain>} */
278
+ const chains = {};
279
+ for (const key of Object.keys(art.j2000AnchorElements)) {
280
+ const n = art.windowElementRates[key].meanMotionDegPerYr;
281
+ chains[key] = {
282
+ anchor: { ...art.j2000AnchorElements[key], meanMotionDegPerYr: n },
283
+ periRateArcsecCy: art.windowRatesArcsecCy.gr[key],
284
+ meanMotionDegPerYr: n,
285
+ windowRates: art.windowElementRates[key],
286
+ secularModes: art.secularModes ? art.secularModes[key] : null, // K4.7 multi-mode skeleton
287
+ };
288
+ if (!opts.skeletonOnly && art.periodicTerms && art.periodicTerms[key]) {
289
+ chains[key].periodicTerms = art.periodicTerms[key];
290
+ }
291
+ }
292
+ return chains;
293
+ }
294
+
295
+ module.exports = {
296
+ ANCHOR_EPOCH_YEAR,
297
+ ANCHOR_EPOCH_JD,
298
+ computeOsculatingElements,
299
+ solveKeplerRad,
300
+ computeHeliocentricEclipticFromElements,
301
+ computePoissonArgRad,
302
+ computePlanetElementsAtYear,
303
+ buildPlanetChainsFromArtifactData,
304
+ };