@fnndsc/orrery 0.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.
Files changed (116) hide show
  1. package/README.md +12 -0
  2. package/dist/controls/cameraRig.d.ts +223 -0
  3. package/dist/controls/cameraRig.js +353 -0
  4. package/dist/controls/cameraRig.js.map +1 -0
  5. package/dist/controls/gestures.d.ts +133 -0
  6. package/dist/controls/gestures.js +282 -0
  7. package/dist/controls/gestures.js.map +1 -0
  8. package/dist/controls/index.d.ts +9 -0
  9. package/dist/controls/index.js +10 -0
  10. package/dist/controls/index.js.map +1 -0
  11. package/dist/controls/picker.d.ts +117 -0
  12. package/dist/controls/picker.js +167 -0
  13. package/dist/controls/picker.js.map +1 -0
  14. package/dist/controls/replay.d.ts +94 -0
  15. package/dist/controls/replay.js +147 -0
  16. package/dist/controls/replay.js.map +1 -0
  17. package/dist/draw/censusField.d.ts +113 -0
  18. package/dist/draw/censusField.js +241 -0
  19. package/dist/draw/censusField.js.map +1 -0
  20. package/dist/draw/constants.d.ts +13 -0
  21. package/dist/draw/constants.js +14 -0
  22. package/dist/draw/constants.js.map +1 -0
  23. package/dist/draw/geometry.d.ts +33 -0
  24. package/dist/draw/geometry.js +55 -0
  25. package/dist/draw/geometry.js.map +1 -0
  26. package/dist/draw/handoff.d.ts +11 -0
  27. package/dist/draw/handoff.js +12 -0
  28. package/dist/draw/handoff.js.map +1 -0
  29. package/dist/draw/handoffField.d.ts +74 -0
  30. package/dist/draw/handoffField.js +151 -0
  31. package/dist/draw/handoffField.js.map +1 -0
  32. package/dist/draw/index.d.ts +20 -0
  33. package/dist/draw/index.js +21 -0
  34. package/dist/draw/index.js.map +1 -0
  35. package/dist/draw/labelField.d.ts +63 -0
  36. package/dist/draw/labelField.js +149 -0
  37. package/dist/draw/labelField.js.map +1 -0
  38. package/dist/draw/lamps.d.ts +16 -0
  39. package/dist/draw/lamps.js +17 -0
  40. package/dist/draw/lamps.js.map +1 -0
  41. package/dist/draw/nebula.d.ts +8 -0
  42. package/dist/draw/nebula.js +28 -0
  43. package/dist/draw/nebula.js.map +1 -0
  44. package/dist/draw/palette.d.ts +41 -0
  45. package/dist/draw/palette.js +32 -0
  46. package/dist/draw/palette.js.map +1 -0
  47. package/dist/draw/sphereField.d.ts +98 -0
  48. package/dist/draw/sphereField.js +168 -0
  49. package/dist/draw/sphereField.js.map +1 -0
  50. package/dist/draw/starField.d.ts +127 -0
  51. package/dist/draw/starField.js +267 -0
  52. package/dist/draw/starField.js.map +1 -0
  53. package/dist/draw/stars.d.ts +65 -0
  54. package/dist/draw/stars.js +132 -0
  55. package/dist/draw/stars.js.map +1 -0
  56. package/dist/draw/timing.d.ts +11 -0
  57. package/dist/draw/timing.js +12 -0
  58. package/dist/draw/timing.js.map +1 -0
  59. package/dist/draw/tubeField.d.ts +131 -0
  60. package/dist/draw/tubeField.js +352 -0
  61. package/dist/draw/tubeField.js.map +1 -0
  62. package/dist/draw/tubes.d.ts +41 -0
  63. package/dist/draw/tubes.js +116 -0
  64. package/dist/draw/tubes.js.map +1 -0
  65. package/dist/index.d.ts +15 -0
  66. package/dist/index.js +15 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/layout/accretion.d.ts +31 -0
  69. package/dist/layout/accretion.js +384 -0
  70. package/dist/layout/accretion.js.map +1 -0
  71. package/dist/layout/constellations.d.ts +25 -0
  72. package/dist/layout/constellations.js +197 -0
  73. package/dist/layout/constellations.js.map +1 -0
  74. package/dist/layout/galaxy.d.ts +12 -0
  75. package/dist/layout/galaxy.js +99 -0
  76. package/dist/layout/galaxy.js.map +1 -0
  77. package/dist/layout/hierarchy.d.ts +45 -0
  78. package/dist/layout/hierarchy.js +464 -0
  79. package/dist/layout/hierarchy.js.map +1 -0
  80. package/dist/layout/index.d.ts +20 -0
  81. package/dist/layout/index.js +21 -0
  82. package/dist/layout/index.js.map +1 -0
  83. package/dist/layout/layoutInput.d.ts +29 -0
  84. package/dist/layout/layoutInput.js +45 -0
  85. package/dist/layout/layoutInput.js.map +1 -0
  86. package/dist/layout/molecule.d.ts +64 -0
  87. package/dist/layout/molecule.js +155 -0
  88. package/dist/layout/molecule.js.map +1 -0
  89. package/dist/layout/pull.d.ts +94 -0
  90. package/dist/layout/pull.js +137 -0
  91. package/dist/layout/pull.js.map +1 -0
  92. package/dist/layout/ranked.d.ts +75 -0
  93. package/dist/layout/ranked.js +148 -0
  94. package/dist/layout/ranked.js.map +1 -0
  95. package/dist/layout/registry.d.ts +23 -0
  96. package/dist/layout/registry.js +165 -0
  97. package/dist/layout/registry.js.map +1 -0
  98. package/dist/layout/seeded.d.ts +32 -0
  99. package/dist/layout/seeded.js +48 -0
  100. package/dist/layout/seeded.js.map +1 -0
  101. package/dist/layout/types.d.ts +81 -0
  102. package/dist/layout/types.js +14 -0
  103. package/dist/layout/types.js.map +1 -0
  104. package/dist/scene/index.d.ts +6 -0
  105. package/dist/scene/index.js +7 -0
  106. package/dist/scene/index.js.map +1 -0
  107. package/dist/scene/orrery.d.ts +592 -0
  108. package/dist/scene/orrery.js +1555 -0
  109. package/dist/scene/orrery.js.map +1 -0
  110. package/dist/types/encoding.d.ts +43 -0
  111. package/dist/types/encoding.js +7 -0
  112. package/dist/types/encoding.js.map +1 -0
  113. package/dist/types/space.d.ts +12 -0
  114. package/dist/types/space.js +10 -0
  115. package/dist/types/space.js.map +1 -0
  116. package/package.json +57 -0
@@ -0,0 +1,464 @@
1
+ /**
2
+ * @file A space of many molecules laid out as a hierarchy.
3
+ *
4
+ * The universe is thousands of feeds, and no feed links to another: each
5
+ * molecule hangs from its shape's anchor. Settling every sphere against
6
+ * every other (26,402 of them for one identity, 150 ticks) took two and a
7
+ * half minutes. It does not have to: a molecule's shape is its own
8
+ * business, and the space only needs to place molecules.
9
+ *
10
+ * 1. Each group (a feed) is laid out alone, around its own centre: a few
11
+ * to a few dozen spheres, nearly free.
12
+ * 2. Each group becomes one body, as wide as its molecule, and the bodies
13
+ * and the ungrouped nodes (the anchors) are laid out together: a
14
+ * tenth of the nodes and none of the inner pushing.
15
+ * 3. Every sphere stands at its body's place plus its offset in the group.
16
+ *
17
+ * Pure: no DOM, no three.js, so it runs in a worker and under jest alike.
18
+ *
19
+ * @module
20
+ */
21
+ import { forceSimulation, forceLink, forceManyBody, forceCenter, forceCollide, forceX, forceY, forceZ } from 'd3-force-3d';
22
+ import { randomFor_key } from './seeded.js';
23
+ /** The smallest room a body takes, so a lone sphere is not a point. */
24
+ const BODY_MIN_RADIUS = 0.55;
25
+ /** A molecule hugs itself: its charge reaches no further than this. */
26
+ const GROUP_REACH = 12;
27
+ /** Ticks for one molecule on its own. */
28
+ const GROUP_TICKS = 60;
29
+ /** Ticks for the bodies when they start near their anchors (unseeded), or where they stood. */
30
+ const TOP_TICKS = 60;
31
+ /**
32
+ * A molecule's shape as a key: each member's parent position within the
33
+ * group and its radius. Feeds of one pipeline share it, and a shape laid
34
+ * out once serves them all.
35
+ */
36
+ function moleculeSignature_of(members) {
37
+ const index = new Map(members.map((member, i) => [member.id, i]));
38
+ return members.map((member) => {
39
+ const parents = member.parents.map((parent) => index.get(parent) ?? -1).join('.');
40
+ return `${parents}:${member.radius.toFixed(2)}`;
41
+ }).join('|');
42
+ }
43
+ /** Turns an offset by a rotation (yaw, then pitch). */
44
+ function offset_turn(offset, yaw, pitch) {
45
+ const [x, y, z] = offset;
46
+ const x1 = x * Math.cos(yaw) + z * Math.sin(yaw);
47
+ const z1 = -x * Math.sin(yaw) + z * Math.cos(yaw);
48
+ const y2 = y * Math.cos(pitch) - z1 * Math.sin(pitch);
49
+ const z2 = y * Math.sin(pitch) + z1 * Math.cos(pitch);
50
+ return [x1, y2, z2];
51
+ }
52
+ /**
53
+ * Turns a vector by the rotation that carries one direction onto another
54
+ * (Rodrigues' formula); a degenerate direction leaves it as it was.
55
+ */
56
+ function vector_turnOnto(v, from, to) {
57
+ const norm = (a) => Math.hypot(a[0], a[1], a[2]);
58
+ const fn = norm(from);
59
+ const tn = norm(to);
60
+ if (fn < 1e-9 || tn < 1e-9)
61
+ return v;
62
+ const a = [from[0] / fn, from[1] / fn, from[2] / fn];
63
+ const b = [to[0] / tn, to[1] / tn, to[2] / tn];
64
+ const k = [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
65
+ const sin = norm(k);
66
+ const cos = a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
67
+ if (sin < 1e-9)
68
+ return cos > 0 ? v : [-v[0], -v[1], -v[2]];
69
+ const u = [k[0] / sin, k[1] / sin, k[2] / sin];
70
+ const dot = u[0] * v[0] + u[1] * v[1] + u[2] * v[2];
71
+ const cross = [u[1] * v[2] - u[2] * v[1], u[2] * v[0] - u[0] * v[2], u[0] * v[1] - u[1] * v[0]];
72
+ return [
73
+ v[0] * cos + cross[0] * sin + u[0] * dot * (1 - cos),
74
+ v[1] * cos + cross[1] * sin + u[1] * dot * (1 - cos),
75
+ v[2] * cos + cross[2] * sin + u[2] * dot * (1 - cos),
76
+ ];
77
+ }
78
+ /**
79
+ * How far a hub's spokes reach: enough shell for every feed hanging from
80
+ * it, so the spokes grow with the crowd as they did when feeds pushed each
81
+ * other outward.
82
+ */
83
+ function spokeShell_of(hubRadius, spokes, bodyRadius) {
84
+ if (spokes.length === 0)
85
+ return hubRadius;
86
+ let mean = 0;
87
+ for (const spoke of spokes)
88
+ mean += bodyRadius.get(spoke.id.slice('group:'.length)) ?? BODY_MIN_RADIUS;
89
+ mean /= spokes.length;
90
+ return Math.max(hubRadius + 2, Math.sqrt(spokes.length) * mean * 1.6);
91
+ }
92
+ /** The k-th of n points spread evenly on a sphere of a radius. */
93
+ function shell_point(k, n, radius) {
94
+ const y = n <= 1 ? 0 : 1 - (2 * (k + 0.5)) / n;
95
+ const ring = Math.sqrt(Math.max(0, 1 - y * y));
96
+ const theta = k * Math.PI * (3 - Math.sqrt(5));
97
+ return [Math.cos(theta) * ring * radius, y * radius, Math.sin(theta) * ring * radius];
98
+ }
99
+ /**
100
+ * Lays out a space as a hierarchy.
101
+ *
102
+ * @param nodes - Every node.
103
+ * @param physics - The terms.
104
+ * @param onProgress - Told how far it has come, 0..1.
105
+ * @param arrangement - SPOKES or CLUMPS (GALAXY starts from spokes).
106
+ * @param randomFor - Where a reused molecule's turn comes from, by the
107
+ * molecule's key: a molecule whose shape was already worked out takes it
108
+ * at a turn of its own, so like feeds do not stand as clones. Seeded by
109
+ * the key unless a caller asks otherwise, so the same space lands the
110
+ * same way on every device and a new molecule turns no other.
111
+ * @returns Every node's position.
112
+ */
113
+ export function hierarchy_layout(nodes, physics, onProgress = () => { }, arrangement = 'clumps', randomFor = randomFor_key) {
114
+ const byId = new Map(nodes.map((node) => [node.id, node]));
115
+ const groups = new Map();
116
+ const top = [];
117
+ for (const node of nodes) {
118
+ if (node.group === null)
119
+ top.push(node);
120
+ else
121
+ groups.set(node.group, [...(groups.get(node.group) ?? []), node]);
122
+ }
123
+ // 1. Each molecule on its own.
124
+ const offsets = new Map();
125
+ const bodyRadius = new Map();
126
+ const bodySeed = new Map();
127
+ const bodyFrozen = new Set();
128
+ let done = 0;
129
+ const groupCount = Math.max(1, groups.size);
130
+ // Molecules of one shape are laid out once; each copy is turned at
131
+ // random so a galaxy of one pipeline does not show a thousand identical
132
+ // orientations.
133
+ const shapes = new Map();
134
+ for (const [key, members] of groups) {
135
+ const seeded = members.filter((member) => member.seed !== undefined);
136
+ const mean = [0, 0, 0];
137
+ for (const member of seeded) {
138
+ mean[0] += member.seed[0];
139
+ mean[1] += member.seed[1];
140
+ mean[2] += member.seed[2];
141
+ }
142
+ if (seeded.length > 0) {
143
+ mean[0] /= seeded.length;
144
+ mean[1] /= seeded.length;
145
+ mean[2] /= seeded.length;
146
+ bodySeed.set(key, mean);
147
+ }
148
+ if (members.every((member) => member.frozen === true && member.seed !== undefined))
149
+ bodyFrozen.add(key);
150
+ const local = new Map();
151
+ const signature = seeded.length === 0 ? moleculeSignature_of(members) : null;
152
+ const known = signature === null ? undefined : shapes.get(signature);
153
+ if (seeded.length === members.length) {
154
+ // Every sphere stood somewhere: the molecule keeps its shape.
155
+ for (const member of members)
156
+ local.set(member.id, [member.seed[0] - mean[0], member.seed[1] - mean[1], member.seed[2] - mean[2]]);
157
+ }
158
+ else if (known !== undefined) {
159
+ const random = randomFor(key);
160
+ const yaw = random() * Math.PI * 2;
161
+ const pitch = (random() - 0.5) * Math.PI;
162
+ members.forEach((member, i) => { local.set(member.id, offset_turn(known[i] ?? [0, 0, 0], yaw, pitch)); });
163
+ }
164
+ else {
165
+ const sim = members.map((member) => {
166
+ const at = { id: member.id, r: member.radius };
167
+ if (member.seed !== undefined) {
168
+ at.x = member.seed[0] - mean[0];
169
+ at.y = member.seed[1] - mean[1];
170
+ at.z = member.seed[2] - mean[2];
171
+ if (member.frozen === true) {
172
+ at.fx = at.x;
173
+ at.fy = at.y;
174
+ at.fz = at.z;
175
+ }
176
+ }
177
+ return at;
178
+ });
179
+ const inGroup = new Set(members.map((member) => member.id));
180
+ const links = [];
181
+ for (const member of members) {
182
+ for (const parent of member.parents)
183
+ if (inGroup.has(parent))
184
+ links.push({ source: parent, target: member.id });
185
+ }
186
+ const radiusOf = new Map(members.map((member) => [member.id, member.radius]));
187
+ const simulation = forceSimulation(sim, 3)
188
+ .force('link', forceLink(links).id((d) => d.id).distance(physics.link
189
+ ? (link) => (radiusOf.get(link.source.id) ?? BODY_MIN_RADIUS) + (radiusOf.get(link.target.id) ?? BODY_MIN_RADIUS) + 1.4
190
+ : 2.2))
191
+ .force('charge', forceManyBody().strength((d) => (physics.charge ? -6 * (d.r / BODY_MIN_RADIUS) ** 2 : -6)).distanceMax(GROUP_REACH))
192
+ .force('center', forceCenter(0, 0, 0))
193
+ .stop();
194
+ if (physics.collide)
195
+ simulation.force('collide', forceCollide().radius((d) => d.r * 1.2));
196
+ for (let tick = 0; tick < GROUP_TICKS; tick++)
197
+ simulation.tick();
198
+ const centre = [0, 0, 0];
199
+ for (const at of sim) {
200
+ centre[0] += at.x ?? 0;
201
+ centre[1] += at.y ?? 0;
202
+ centre[2] += at.z ?? 0;
203
+ }
204
+ centre[0] /= sim.length;
205
+ centre[1] /= sim.length;
206
+ centre[2] /= sim.length;
207
+ for (const at of sim)
208
+ local.set(at.id, [(at.x ?? 0) - centre[0], (at.y ?? 0) - centre[1], (at.z ?? 0) - centre[2]]);
209
+ if (signature !== null)
210
+ shapes.set(signature, members.map((member) => local.get(member.id) ?? [0, 0, 0]));
211
+ }
212
+ let radius = BODY_MIN_RADIUS;
213
+ for (const member of members) {
214
+ const offset = local.get(member.id) ?? [0, 0, 0];
215
+ offsets.set(member.id, offset);
216
+ radius = Math.max(radius, Math.hypot(offset[0], offset[1], offset[2]) + member.radius);
217
+ }
218
+ bodyRadius.set(key, radius);
219
+ done += 1;
220
+ if (done % 50 === 0)
221
+ onProgress(0.3 * (done / groupCount));
222
+ }
223
+ onProgress(0.3);
224
+ // 2. The molecules as bodies, with the anchors.
225
+ const bodyOf = (id) => {
226
+ const node = byId.get(id);
227
+ return node !== undefined && node.group !== null ? `group:${node.group}` : id;
228
+ };
229
+ const bodies = [];
230
+ const radii = new Map();
231
+ let anyFrozen = false;
232
+ let anySeed = false;
233
+ for (const [key] of groups) {
234
+ const id = `group:${key}`;
235
+ const radius = bodyRadius.get(key) ?? BODY_MIN_RADIUS;
236
+ const body = { id, r: radius };
237
+ const seed = bodySeed.get(key);
238
+ if (seed !== undefined) {
239
+ anySeed = true;
240
+ body.x = seed[0];
241
+ body.y = seed[1];
242
+ body.z = seed[2];
243
+ if (bodyFrozen.has(key)) {
244
+ body.fx = seed[0];
245
+ body.fy = seed[1];
246
+ body.fz = seed[2];
247
+ anyFrozen = true;
248
+ }
249
+ }
250
+ radii.set(id, radius);
251
+ bodies.push(body);
252
+ }
253
+ for (const node of top) {
254
+ const body = { id: node.id, r: node.radius };
255
+ if (node.seed !== undefined) {
256
+ anySeed = true;
257
+ body.x = node.seed[0];
258
+ body.y = node.seed[1];
259
+ body.z = node.seed[2];
260
+ if (node.frozen === true) {
261
+ body.fx = node.seed[0];
262
+ body.fy = node.seed[1];
263
+ body.fz = node.seed[2];
264
+ anyFrozen = true;
265
+ }
266
+ }
267
+ radii.set(node.id, node.radius);
268
+ bodies.push(body);
269
+ }
270
+ const linkSeen = new Set();
271
+ const links = [];
272
+ for (const node of nodes) {
273
+ for (const parent of node.parents) {
274
+ if (!byId.has(parent))
275
+ continue;
276
+ const a = bodyOf(parent);
277
+ const b = bodyOf(node.id);
278
+ if (a === b)
279
+ continue;
280
+ const key = `${a}\u0000${b}`;
281
+ if (linkSeen.has(key))
282
+ continue;
283
+ linkSeen.add(key);
284
+ links.push({ source: a, target: b });
285
+ }
286
+ }
287
+ // Start near the answer: the anchors spread on a wide shell, each
288
+ // unplaced body on a shell around the anchor it hangs from. A settle
289
+ // that starts there needs a fraction of the ticks one from a heap does.
290
+ const anchorOf = new Map();
291
+ for (const link of links) {
292
+ if (link.source.startsWith('group:') !== link.target.startsWith('group:')) {
293
+ const group = link.source.startsWith('group:') ? link.source : link.target;
294
+ const anchor = link.source.startsWith('group:') ? link.target : link.source;
295
+ if (!anchorOf.has(group))
296
+ anchorOf.set(group, anchor);
297
+ }
298
+ }
299
+ const children = new Map();
300
+ for (const body of bodies) {
301
+ const anchor = anchorOf.get(body.id);
302
+ if (anchor !== undefined)
303
+ children.set(anchor, [...(children.get(anchor) ?? []), body]);
304
+ }
305
+ const area = bodies.reduce((sum, body) => sum + body.r * body.r, 0);
306
+ const anchors = bodies.filter((body) => !body.id.startsWith('group:'));
307
+ anchors.forEach((anchor, k) => {
308
+ if (anchor.x !== undefined)
309
+ return;
310
+ const [x, y, z] = shell_point(k, anchors.length, Math.sqrt(area) * 1.2 + 10);
311
+ anchor.x = x;
312
+ anchor.y = y;
313
+ anchor.z = z;
314
+ });
315
+ for (const [anchorId, around] of children) {
316
+ const anchor = bodies.find((body) => body.id === anchorId);
317
+ const room = Math.sqrt(around.reduce((sum, body) => sum + body.r * body.r, 0)) * 1.4 + 2;
318
+ around.forEach((body, k) => {
319
+ if (body.x !== undefined)
320
+ return;
321
+ const [x, y, z] = shell_point(k, around.length, room);
322
+ body.x = (anchor?.x ?? 0) + x;
323
+ body.y = (anchor?.y ?? 0) + y;
324
+ body.z = (anchor?.z ?? 0) + z;
325
+ });
326
+ }
327
+ // Spokes: only the hubs are settled — each as wide as its longest spoke
328
+ // — and every feed hanging from a hub is placed round it, its root just
329
+ // outside the hub and its chain pointing out, the directions spread over
330
+ // a sphere. The feeds may cross near the hub, as spokes do.
331
+ const anchored = new Set();
332
+ if (arrangement === 'spokes') {
333
+ const rootOf = (key) => {
334
+ const members = groups.get(key) ?? [];
335
+ const inGroup = new Set(members.map((member) => member.id));
336
+ const root = members.find((member) => member.parents.some((parent) => !inGroup.has(parent))) ?? members[0];
337
+ return root === undefined ? [0, 0, 0] : (offsets.get(root.id) ?? [0, 0, 0]);
338
+ };
339
+ const hubs = [];
340
+ for (const body of bodies) {
341
+ if (body.id.startsWith('group:') && anchorOf.has(body.id)) {
342
+ anchored.add(body.id);
343
+ continue;
344
+ }
345
+ if (!body.id.startsWith('group:')) {
346
+ const spokes = children.get(body.id) ?? [];
347
+ let reach = body.r;
348
+ const shell = spokeShell_of(body.r, spokes, bodyRadius);
349
+ for (const spoke of spokes) {
350
+ const key = spoke.id.slice('group:'.length);
351
+ const root = rootOf(key);
352
+ reach = Math.max(reach, shell + Math.hypot(root[0], root[1], root[2]) + 2 * (bodyRadius.get(key) ?? BODY_MIN_RADIUS));
353
+ }
354
+ hubs.push({ id: body.id, r: reach, x: body.x, y: body.y, z: body.z, ...(body.fx !== undefined ? { fx: body.fx, fy: body.fy, fz: body.fz } : {}) });
355
+ }
356
+ else {
357
+ hubs.push(body);
358
+ }
359
+ }
360
+ if (!hubs.every((hub) => hub.fx !== undefined)) {
361
+ const simulation = forceSimulation(hubs, 3)
362
+ .force('charge', forceManyBody().strength((d) => -1.5 * d.r))
363
+ .force('collide', forceCollide().radius((d) => d.r * 0.9))
364
+ .stop();
365
+ if (!anyFrozen)
366
+ simulation.force('center', forceCenter(0, 0, 0));
367
+ for (let tick = 0; tick < TOP_TICKS; tick++) {
368
+ simulation.tick();
369
+ if (tick % 5 === 0)
370
+ onProgress(0.3 + 0.7 * (tick / TOP_TICKS));
371
+ }
372
+ }
373
+ for (const hub of hubs) {
374
+ const body = bodies.find((b) => b.id === hub.id);
375
+ if (body !== undefined && body !== hub) {
376
+ body.x = hub.x;
377
+ body.y = hub.y;
378
+ body.z = hub.z;
379
+ }
380
+ }
381
+ for (const body of bodies) {
382
+ if (body.id.startsWith('group:') || !children.has(body.id))
383
+ continue;
384
+ const spokes = children.get(body.id) ?? [];
385
+ const shell = spokeShell_of(body.r, spokes, bodyRadius);
386
+ spokes.forEach((spoke, k) => {
387
+ if (spoke.fx !== undefined || bodySeed.has(spoke.id.slice('group:'.length)))
388
+ return;
389
+ const root = rootOf(spoke.id.slice('group:'.length));
390
+ const out = shell_point(k, spokes.length, 1);
391
+ // Staggered along the spoke by the golden ratio, so a crowded hub
392
+ // fans out in depth instead of forming one hollow shell.
393
+ const stagger = 0.35 + 0.65 * ((k * 0.6180339887) % 1);
394
+ const distance = body.r + 1.4 + shell * stagger + Math.hypot(root[0], root[1], root[2]);
395
+ spoke.x = (body.x ?? 0) + out[0] * distance;
396
+ spoke.y = (body.y ?? 0) + out[1] * distance;
397
+ spoke.z = (body.z ?? 0) + out[2] * distance;
398
+ });
399
+ }
400
+ }
401
+ const allFrozen = bodies.every((body) => body.fx !== undefined);
402
+ if (!allFrozen && arrangement !== 'spokes') {
403
+ const simulation = forceSimulation(bodies, 3)
404
+ .force('link', forceLink(links).id((d) => d.id).distance(physics.link
405
+ ? (link) => (radii.get(link.source.id) ?? BODY_MIN_RADIUS) + (radii.get(link.target.id) ?? BODY_MIN_RADIUS) + 1.4
406
+ : 2.2))
407
+ .stop();
408
+ const charge = forceManyBody().strength((d) => (physics.charge ? -6 * (d.r / BODY_MIN_RADIUS) ** 2 : -6));
409
+ if (physics.reach !== undefined)
410
+ charge.distanceMax(physics.reach);
411
+ simulation.force('charge', charge);
412
+ if (!anyFrozen)
413
+ simulation.force('center', forceCenter(0, 0, 0));
414
+ if (physics.collide)
415
+ simulation.force('collide', forceCollide().radius((d) => d.r * 1.05));
416
+ if (physics.gravity) {
417
+ const pull = (d) => Math.min(1, ((d.r / BODY_MIN_RADIUS) ** 2) * 0.08);
418
+ simulation.force('gx', forceX(0).strength(pull)).force('gy', forceY(0).strength(pull)).force('gz', forceZ(0).strength(pull));
419
+ }
420
+ const ticks = TOP_TICKS;
421
+ void anySeed;
422
+ for (let tick = 0; tick < ticks; tick++) {
423
+ simulation.tick();
424
+ if (tick % 5 === 0)
425
+ onProgress(0.3 + 0.7 * (tick / ticks));
426
+ }
427
+ }
428
+ const at = new Map(bodies.map((body) => [body.id, body]));
429
+ // Spokes: each molecule turned so its root faces the anchor it hangs
430
+ // from and the rest of it points away — radial, as a hub's spokes.
431
+ if (arrangement === 'spokes') {
432
+ for (const [key, members] of groups) {
433
+ if (members.some((member) => member.seed !== undefined))
434
+ continue;
435
+ const bodyId = `group:${key}`;
436
+ const body = at.get(bodyId);
437
+ const anchorId = anchorOf.get(bodyId);
438
+ const anchor = anchorId === undefined ? undefined : at.get(anchorId);
439
+ if (body === undefined || anchor === undefined)
440
+ continue;
441
+ const out = [(body.x ?? 0) - (anchor.x ?? 0), (body.y ?? 0) - (anchor.y ?? 0), (body.z ?? 0) - (anchor.z ?? 0)];
442
+ const inGroup = new Set(members.map((member) => member.id));
443
+ const root = members.find((member) => member.parents.some((parent) => !inGroup.has(parent))) ?? members[0];
444
+ const rootAt = offsets.get(root.id) ?? [0, 0, 0];
445
+ // The molecule's axis: from its root to its centre.
446
+ const axis = [-rootAt[0], -rootAt[1], -rootAt[2]];
447
+ for (const member of members) {
448
+ const offset = offsets.get(member.id) ?? [0, 0, 0];
449
+ offsets.set(member.id, vector_turnOnto(offset, axis, out));
450
+ }
451
+ }
452
+ }
453
+ // 3. Every sphere at its body plus its offset.
454
+ const positions = {};
455
+ for (const node of nodes) {
456
+ const body = at.get(bodyOf(node.id));
457
+ const base = [body?.x ?? 0, body?.y ?? 0, body?.z ?? 0];
458
+ const offset = node.group === null ? [0, 0, 0] : (offsets.get(node.id) ?? [0, 0, 0]);
459
+ positions[node.id] = [base[0] + offset[0], base[1] + offset[1], base[2] + offset[2]];
460
+ }
461
+ onProgress(1);
462
+ return positions;
463
+ }
464
+ //# sourceMappingURL=hierarchy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hierarchy.js","sourceRoot":"","sources":["../../src/layout/hierarchy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC3H,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAoC5C,uEAAuE;AACvE,MAAM,eAAe,GAAW,IAAI,CAAC;AACrC,uEAAuE;AACvE,MAAM,WAAW,GAAW,EAAE,CAAC;AAC/B,yCAAyC;AACzC,MAAM,WAAW,GAAW,EAAE,CAAC;AAC/B,+FAA+F;AAC/F,MAAM,SAAS,GAAW,EAAE,CAAC;AAE7B;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,OAAqC;IACjE,MAAM,KAAK,GAAwB,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAqB,EAAE,CAAS,EAAoB,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChI,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAqB,EAAU,EAAE;QACnD,MAAM,OAAO,GAAW,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAc,EAAU,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1G,OAAO,GAAG,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,uDAAuD;AACvD,SAAS,WAAW,CAAC,MAAgC,EAAE,GAAW,EAAE,KAAa;IAC/E,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC;IACzB,MAAM,EAAE,GAAW,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzD,MAAM,EAAE,GAAW,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1D,MAAM,EAAE,GAAW,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9D,MAAM,EAAE,GAAW,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9D,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,CAA2B,EAAE,IAA8B,EAAE,EAA4B;IAChH,MAAM,IAAI,GAAG,CAAC,CAA2B,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnF,MAAM,EAAE,GAAW,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,EAAE,GAAW,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5B,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI;QAAE,OAAO,CAAC,CAAC;IACrC,MAAM,CAAC,GAA6B,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/E,MAAM,CAAC,GAA6B,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACzE,MAAM,CAAC,GAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtH,MAAM,GAAG,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,GAAG,GAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,IAAI,GAAG,GAAG,IAAI;QAAE,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,CAAC,GAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IACzE,MAAM,GAAG,GAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,KAAK,GAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1H,OAAO;QACL,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;QACpD,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;QACpD,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;KACrD,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,SAAiB,EAAE,MAAqC,EAAE,UAAuC;IACtH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,IAAI,GAAW,CAAC,CAAC;IACrB,KAAK,MAAM,KAAK,IAAI,MAAM;QAAE,IAAI,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,eAAe,CAAC;IACvG,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC;IACtB,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;AACxE,CAAC;AAED,kEAAkE;AAClE,SAAS,WAAW,CAAC,CAAS,EAAE,CAAS,EAAE,MAAc;IACvD,MAAM,CAAC,GAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACvD,MAAM,IAAI,GAAW,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,KAAK,GAAW,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC,CAAC;AACxF,CAAC;AAID;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAmC,EACnC,OAAyB,EACzB,aAAyC,GAAS,EAAE,GAAE,CAAC,EACvD,cAAoC,QAAQ,EAC5C,YAA2C,aAAa;IAExD,MAAM,IAAI,GAA+B,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAmB,EAA2B,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/H,MAAM,MAAM,GAAiC,IAAI,GAAG,EAAE,CAAC;IACvD,MAAM,GAAG,GAAoB,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;YACnC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,+BAA+B;IAC/B,MAAM,OAAO,GAA0C,IAAI,GAAG,EAAE,CAAC;IACjE,MAAM,UAAU,GAAwB,IAAI,GAAG,EAAE,CAAC;IAClD,MAAM,QAAQ,GAA0C,IAAI,GAAG,EAAE,CAAC;IAClE,MAAM,UAAU,GAAgB,IAAI,GAAG,EAAE,CAAC;IAC1C,IAAI,IAAI,GAAW,CAAC,CAAC;IACrB,MAAM,UAAU,GAAW,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACpD,mEAAmE;IACnE,wEAAwE;IACxE,gBAAgB;IAChB,MAAM,MAAM,GAAiD,IAAI,GAAG,EAAE,CAAC;IACvE,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,EAAE,CAAC;QACpC,MAAM,MAAM,GAAoB,OAAO,CAAC,MAAM,CAAC,CAAC,MAAqB,EAAW,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QAC9G,MAAM,IAAI,GAA6B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACjD,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,CAAC;YAC5B,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAK,CAAC,CAAC,CAAC,CAAC;YAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAK,CAAC,CAAC,CAAC,CAAC;YAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAK,CAAC,CAAC,CAAC,CAAC;QACrF,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC;YAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC;YAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC;YAC7E,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,MAAqB,EAAW,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC;YAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChI,MAAM,KAAK,GAA0C,IAAI,GAAG,EAAE,CAAC;QAC/D,MAAM,SAAS,GAAkB,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5F,MAAM,KAAK,GAAgD,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAClH,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;YACrC,8DAA8D;YAC9D,KAAK,MAAM,MAAM,IAAI,OAAO;gBAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,IAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,IAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxI,CAAC;aAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAiB,SAAS,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,GAAG,GAAW,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAW,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;YACjD,OAAO,CAAC,OAAO,CAAC,CAAC,MAAqB,EAAE,CAAS,EAAQ,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzI,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAc,OAAO,CAAC,GAAG,CAAC,CAAC,MAAqB,EAAW,EAAE;gBACpE,MAAM,EAAE,GAAY,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;gBACxD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC9B,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;oBAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;oBAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClG,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;wBAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;wBAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;wBAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;oBAAC,CAAC;gBAC3E,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YACH,MAAM,OAAO,GAAgB,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAqB,EAAU,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YAChG,MAAM,KAAK,GAA8C,EAAE,CAAC;YAC5D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO;oBAAE,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;wBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YAClH,CAAC;YACD,MAAM,QAAQ,GAAwB,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAqB,EAAoB,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACpI,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC;iBACvC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CACtE,OAAO,CAAC,IAAI;gBACV,CAAC,CAAC,CAAC,IAAwD,EAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,eAAe,CAAC,GAAG,GAAG;gBACnL,CAAC,CAAC,GAAG,CACR,CAAC;iBACD,KAAK,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAiB,EAAU,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAE,CAAa,CAAC,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;iBACzK,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;iBACrC,IAAI,EAAE,CAAC;YACV,IAAI,OAAO,CAAC,OAAO;gBAAE,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,CAAiB,EAAU,EAAE,CAAE,CAAa,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAC/H,KAAK,IAAI,IAAI,GAAW,CAAC,EAAE,IAAI,GAAG,WAAW,EAAE,IAAI,EAAE;gBAAE,UAAU,CAAC,IAAI,EAAE,CAAC;YACzE,MAAM,MAAM,GAA6B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACnD,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;gBAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAAC,CAAC;YACjG,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC;YAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC;YAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC;YAC1E,KAAK,MAAM,EAAE,IAAI,GAAG;gBAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpH,IAAI,SAAS,KAAK,IAAI;gBAAE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAqB,EAA4B,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACrJ,CAAC;QACD,IAAI,MAAM,GAAW,eAAe,CAAC;QACrC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,MAAM,GAA6B,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAC/B,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACzF,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC5B,IAAI,IAAI,CAAC,CAAC;QACV,IAAI,IAAI,GAAG,EAAE,KAAK,CAAC;YAAE,UAAU,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC;IAC7D,CAAC;IACD,UAAU,CAAC,GAAG,CAAC,CAAC;IAEhB,gDAAgD;IAChD,MAAM,MAAM,GAAG,CAAC,EAAU,EAAU,EAAE;QACpC,MAAM,IAAI,GAA8B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrD,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAChF,CAAC,CAAC;IACF,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAwB,IAAI,GAAG,EAAE,CAAC;IAC7C,IAAI,SAAS,GAAY,KAAK,CAAC;IAC/B,IAAI,OAAO,GAAY,KAAK,CAAC;IAC7B,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAW,SAAS,GAAG,EAAE,CAAC;QAClC,MAAM,MAAM,GAAW,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC;QAC9D,MAAM,IAAI,GAAY,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;QACxC,MAAM,IAAI,GAAyC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACrD,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAC,SAAS,GAAG,IAAI,CAAC;YAAC,CAAC;QACzG,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;QACvB,MAAM,IAAI,GAAY,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QACtD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpE,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;gBAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAC,SAAS,GAAG,IAAI,CAAC;YAAC,CAAC;QACzH,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,MAAM,QAAQ,GAAgB,IAAI,GAAG,EAAE,CAAC;IACxC,MAAM,KAAK,GAA8C,EAAE,CAAC;IAC5D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,SAAS;YAChC,MAAM,CAAC,GAAW,MAAM,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,CAAC,GAAW,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC;gBAAE,SAAS;YACtB,MAAM,GAAG,GAAW,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACrC,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAChC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IACD,kEAAkE;IAClE,qEAAqE;IACrE,wEAAwE;IACxE,MAAM,QAAQ,GAAwB,IAAI,GAAG,EAAE,CAAC;IAChD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1E,MAAM,KAAK,GAAW,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YACnF,MAAM,MAAM,GAAW,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YACpF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAA2B,IAAI,GAAG,EAAE,CAAC;IACnD,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAuB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzD,IAAI,MAAM,KAAK,SAAS;YAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAC1F,CAAC;IACD,MAAM,IAAI,GAAW,MAAM,CAAC,MAAM,CAAC,CAAC,GAAW,EAAE,IAAa,EAAU,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrG,MAAM,OAAO,GAAc,MAAM,CAAC,MAAM,CAAC,CAAC,IAAa,EAAW,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpG,OAAO,CAAC,OAAO,CAAC,CAAC,MAAe,EAAE,CAAS,EAAQ,EAAE;QACnD,IAAI,MAAM,CAAC,CAAC,KAAK,SAAS;YAAE,OAAO;QACnC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC;QAC7E,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;QAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;QAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IACH,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAwB,MAAM,CAAC,IAAI,CAAC,CAAC,IAAa,EAAW,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;QAClG,MAAM,IAAI,GAAW,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAW,EAAE,IAAa,EAAU,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;QAC1H,MAAM,CAAC,OAAO,CAAC,CAAC,IAAa,EAAE,CAAS,EAAQ,EAAE;YAChD,IAAI,IAAI,CAAC,CAAC,KAAK,SAAS;gBAAE,OAAO;YACjC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACtD,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9F,CAAC,CAAC,CAAC;IACL,CAAC;IACD,wEAAwE;IACxE,wEAAwE;IACxE,yEAAyE;IACzE,4DAA4D;IAC5D,MAAM,QAAQ,GAAgB,IAAI,GAAG,EAAE,CAAC;IACxC,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,CAAC,GAAW,EAA4B,EAAE;YACvD,MAAM,OAAO,GAAoB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACvD,MAAM,OAAO,GAAgB,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAqB,EAAU,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YAChG,MAAM,IAAI,GAA8B,OAAO,CAAC,IAAI,CAAC,CAAC,MAAqB,EAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAc,EAAW,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;YAC/K,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9E,CAAC,CAAC;QACF,MAAM,IAAI,GAAc,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAAC,SAAS;YAAC,CAAC;YAC/F,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClC,MAAM,MAAM,GAAc,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;gBACtD,IAAI,KAAK,GAAW,IAAI,CAAC,CAAC,CAAC;gBAC3B,MAAM,KAAK,GAAW,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;gBAChE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,MAAM,GAAG,GAAW,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBACpD,MAAM,IAAI,GAA6B,MAAM,CAAC,GAAG,CAAC,CAAC;oBACnD,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC;gBACxH,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACrJ,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAY,EAAW,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC;YACjE,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;iBACxC,KAAK,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAiB,EAAU,EAAE,CAAC,CAAC,GAAG,GAAI,CAAa,CAAC,CAAC,CAAC,CAAC;iBACjG,KAAK,CAAC,SAAS,EAAE,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,CAAiB,EAAU,EAAE,CAAE,CAAa,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;iBAC9F,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,SAAS;gBAAE,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACjE,KAAK,IAAI,IAAI,GAAW,CAAC,EAAE,IAAI,GAAG,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;gBACpD,UAAU,CAAC,IAAI,EAAE,CAAC;gBAClB,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC;oBAAE,UAAU,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,GAAwB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAU,EAAW,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;YACxF,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAAC,CAAC;QAC7F,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAE,SAAS;YACrE,MAAM,MAAM,GAAc,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YACtD,MAAM,KAAK,GAAW,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;YAChE,MAAM,CAAC,OAAO,CAAC,CAAC,KAAc,EAAE,CAAS,EAAQ,EAAE;gBACjD,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBAAE,OAAO;gBACpF,MAAM,IAAI,GAA6B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC/E,MAAM,GAAG,GAA6B,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACvE,kEAAkE;gBAClE,yDAAyD;gBACzD,MAAM,OAAO,GAAW,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC/D,MAAM,QAAQ,GAAW,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,GAAG,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;gBAC5C,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;gBAC5C,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;YAC9C,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAY,MAAM,CAAC,KAAK,CAAC,CAAC,IAAa,EAAW,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;IAC3F,IAAI,CAAC,SAAS,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC;aAC1C,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CACtE,OAAO,CAAC,IAAI;YACV,CAAC,CAAC,CAAC,IAAwD,EAAU,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,eAAe,CAAC,GAAG,GAAG;YAC7K,CAAC,CAAC,GAAG,CACR,CAAC;aACD,IAAI,EAAE,CAAC;QACV,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAiB,EAAU,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAE,CAAa,CAAC,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/I,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;YAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnE,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,SAAS;YAAE,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjE,IAAI,OAAO,CAAC,OAAO;YAAE,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,CAAiB,EAAU,EAAE,CAAE,CAAa,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAChI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,CAAC,CAAiB,EAAU,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAE,CAAa,CAAC,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAC5G,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/H,CAAC;QACD,MAAM,KAAK,GAAW,SAAS,CAAC;QAChC,KAAK,OAAO,CAAC;QACb,KAAK,IAAI,IAAI,GAAW,CAAC,EAAE,IAAI,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;YAChD,UAAU,CAAC,IAAI,EAAE,CAAC;YAClB,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC;gBAAE,UAAU,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IACD,MAAM,EAAE,GAAyB,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAa,EAAqB,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAE5G,qEAAqE;IACrE,mEAAmE;IACnE,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,EAAE,CAAC;YACpC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAqB,EAAW,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC;gBAAE,SAAS;YAC1F,MAAM,MAAM,GAAW,SAAS,GAAG,EAAE,CAAC;YACtC,MAAM,IAAI,GAAwB,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACjD,MAAM,QAAQ,GAAuB,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAwB,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC1F,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;gBAAE,SAAS;YACzD,MAAM,GAAG,GAA6B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC1I,MAAM,OAAO,GAAgB,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAqB,EAAU,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YAChG,MAAM,IAAI,GAAkB,OAAO,CAAC,IAAI,CAAC,CAAC,MAAqB,EAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAc,EAAW,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAE,CAAC;YACpK,MAAM,MAAM,GAA6B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3E,oDAAoD;YACpD,MAAM,IAAI,GAA6B,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5E,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAA6B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC7E,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,MAAM,SAAS,GAAuB,EAAE,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAwB,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1D,MAAM,IAAI,GAA6B,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAClF,MAAM,MAAM,GAA6B,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/G,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,CAAC;IACD,UAAU,CAAC,CAAC,CAAC,CAAC;IACd,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @file The layout layer's public face: the engines, their contract, and
3
+ * the pure layouts a surface may call directly.
4
+ *
5
+ * This entry imports no renderer, so a worker that settles a space loads
6
+ * only the gearing, never the brass.
7
+ *
8
+ * @module
9
+ */
10
+ export * from './types.js';
11
+ export { galaxy_layout } from './galaxy.js';
12
+ export { layoutInput_build, type LayoutSource } from './layoutInput.js';
13
+ export { accretion_layout, feedLikeness_of, STEP_BUDGET } from './accretion.js';
14
+ export { constellations_layout, pluginWeights_of, LANDMARK_SHARE } from './constellations.js';
15
+ export { hierarchy_layout, type HierarchyArrangement, type HierarchyNode, type HierarchyPhysics, type HierarchyPositions } from './hierarchy.js';
16
+ export { molecule_prepare, molecule_layout, moleculeRadii_of, type MoleculeNode, type MoleculePlace, type MoleculeSettle } from './molecule.js';
17
+ export { rankedLayout_compute, ranked_layout, type RankedInput, type RankedPlacement, type RankedLayout, type RankedSceneNode } from './ranked.js';
18
+ export { PullSimulation, pullMolecule_of, type PullInput, type PullNode } from './pull.js';
19
+ export { hash_of, random_seeded, randomFor_key } from './seeded.js';
20
+ export { layoutEngines_list, layoutEngine_get, layoutNeeds_missing } from './registry.js';
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @file The layout layer's public face: the engines, their contract, and
3
+ * the pure layouts a surface may call directly.
4
+ *
5
+ * This entry imports no renderer, so a worker that settles a space loads
6
+ * only the gearing, never the brass.
7
+ *
8
+ * @module
9
+ */
10
+ export * from './types.js';
11
+ export { galaxy_layout } from './galaxy.js';
12
+ export { layoutInput_build } from './layoutInput.js';
13
+ export { accretion_layout, feedLikeness_of, STEP_BUDGET } from './accretion.js';
14
+ export { constellations_layout, pluginWeights_of, LANDMARK_SHARE } from './constellations.js';
15
+ export { hierarchy_layout } from './hierarchy.js';
16
+ export { molecule_prepare, molecule_layout, moleculeRadii_of } from './molecule.js';
17
+ export { rankedLayout_compute, ranked_layout } from './ranked.js';
18
+ export { PullSimulation, pullMolecule_of } from './pull.js';
19
+ export { hash_of, random_seeded, randomFor_key } from './seeded.js';
20
+ export { layoutEngines_list, layoutEngine_get, layoutNeeds_missing } from './registry.js';
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/layout/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAqB,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,EAAE,gBAAgB,EAAiG,MAAM,gBAAgB,CAAC;AACjJ,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAA8D,MAAM,eAAe,CAAC;AAChJ,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAmF,MAAM,aAAa,CAAC;AACnJ,OAAO,EAAE,cAAc,EAAE,eAAe,EAAiC,MAAM,WAAW,CAAC;AAC3F,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { type LayoutNode, type Vec3 } from './types.js';
2
+ /**
3
+ * A node as a surface describes it to a layout.
4
+ *
5
+ * @property id - Its id.
6
+ * @property parentIds - Its parents.
7
+ * @property joinParentIds - Its joins: edges that are not its parent chain.
8
+ * @property metric - What sizes it; absent sizes it by its degree.
9
+ * @property ghost - An anchor: in the settle, belonging to no molecule.
10
+ * @property attrs - What an engine that needs more reads.
11
+ */
12
+ export interface LayoutSource {
13
+ id: string;
14
+ parentIds: ReadonlyArray<string>;
15
+ joinParentIds: ReadonlyArray<string>;
16
+ metric?: number;
17
+ ghost?: boolean;
18
+ attrs?: Record<string, number | string | string[]>;
19
+ }
20
+ /**
21
+ * The engines' input for a space.
22
+ *
23
+ * @param nodes - The space's nodes.
24
+ * @param keyOf - The molecule a node belongs to, as the surface names it.
25
+ * @param seeds - Where nodes stood last, if anywhere.
26
+ * @param frozen - Nodes held where they stand.
27
+ * @returns One layout node per node, in order.
28
+ */
29
+ export declare function layoutInput_build<N extends LayoutSource>(nodes: ReadonlyArray<N>, keyOf: (node: N) => string | null, seeds?: ReadonlyMap<string, Vec3>, frozen?: ReadonlySet<string>): LayoutNode[];
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @file What a layout engine is handed, built one way for every caller.
3
+ *
4
+ * A scene settling a space in the browser and a session laying the same
5
+ * space out once for every browser must hand the engines the same input, or
6
+ * the session's places are not the places a browser would have found: each
7
+ * node's radius (sized by its metric against the space's largest), its
8
+ * parents (joins included), its molecule (the surface names it; an anchor
9
+ * has none), what it carries for an engine that needs more, and where it
10
+ * stood if anywhere. Built here, once, for both.
11
+ *
12
+ * @module
13
+ */
14
+ import { moleculeRadii_of } from './molecule.js';
15
+ import { NODE_RADIUS } from './types.js';
16
+ /**
17
+ * The engines' input for a space.
18
+ *
19
+ * @param nodes - The space's nodes.
20
+ * @param keyOf - The molecule a node belongs to, as the surface names it.
21
+ * @param seeds - Where nodes stood last, if anywhere.
22
+ * @param frozen - Nodes held where they stand.
23
+ * @returns One layout node per node, in order.
24
+ */
25
+ export function layoutInput_build(nodes, keyOf, seeds = new Map(), frozen = new Set()) {
26
+ const radii = moleculeRadii_of(nodes.map((node) => {
27
+ const out = { id: node.id, parents: [...node.parentIds, ...node.joinParentIds] };
28
+ if (node.metric !== undefined)
29
+ out.metric = node.metric;
30
+ return out;
31
+ }));
32
+ return nodes.map((node) => {
33
+ const seed = seeds.get(node.id);
34
+ return {
35
+ id: node.id,
36
+ parents: [...node.parentIds, ...node.joinParentIds],
37
+ radius: radii.get(node.id) ?? NODE_RADIUS,
38
+ group: node.ghost === true ? null : keyOf(node),
39
+ ...(node.attrs === undefined ? {} : { attrs: node.attrs }),
40
+ ...(seed === undefined ? {} : { seed }),
41
+ ...(frozen.has(node.id) ? { frozen: true } : {}),
42
+ };
43
+ });
44
+ }
45
+ //# sourceMappingURL=layoutInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layoutInput.js","sourceRoot":"","sources":["../../src/layout/layoutInput.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,gBAAgB,EAAqB,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,WAAW,EAA8B,MAAM,YAAY,CAAC;AAqBrE;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAuB,EACvB,KAAiC,EACjC,QAAmC,IAAI,GAAG,EAAE,EAC5C,SAA8B,IAAI,GAAG,EAAE;IAEvC,MAAM,KAAK,GAAwB,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAO,EAAgB,EAAE;QACtF,MAAM,GAAG,GAAiB,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/F,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACxD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC,CAAC;IACJ,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAO,EAAc,EAAE;QACvC,MAAM,IAAI,GAAqB,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClD,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;YACnD,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,WAAW;YACzC,KAAK,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YAC/C,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;YAC1D,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YACvC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}