codeboard-studio 0.2.1

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 (208) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +23 -0
  3. package/README.md +54 -0
  4. package/dist/src/animation/camera-plane.d.ts +8 -0
  5. package/dist/src/animation/camera-plane.d.ts.map +1 -0
  6. package/dist/src/animation/camera-plane.js +16 -0
  7. package/dist/src/animation/camera-plane.js.map +1 -0
  8. package/dist/src/animation/drawing-neighbors.d.ts +4 -0
  9. package/dist/src/animation/drawing-neighbors.d.ts.map +1 -0
  10. package/dist/src/animation/drawing-neighbors.js +38 -0
  11. package/dist/src/animation/drawing-neighbors.js.map +1 -0
  12. package/dist/src/animation/evaluate.d.ts +17 -0
  13. package/dist/src/animation/evaluate.d.ts.map +1 -0
  14. package/dist/src/animation/evaluate.js +70 -0
  15. package/dist/src/animation/evaluate.js.map +1 -0
  16. package/dist/src/animation/frame.d.ts +8 -0
  17. package/dist/src/animation/frame.d.ts.map +1 -0
  18. package/dist/src/animation/frame.js +16 -0
  19. package/dist/src/animation/frame.js.map +1 -0
  20. package/dist/src/animation/ik.d.ts +26 -0
  21. package/dist/src/animation/ik.d.ts.map +1 -0
  22. package/dist/src/animation/ik.js +47 -0
  23. package/dist/src/animation/ik.js.map +1 -0
  24. package/dist/src/animation/retime.d.ts +4 -0
  25. package/dist/src/animation/retime.d.ts.map +1 -0
  26. package/dist/src/animation/retime.js +116 -0
  27. package/dist/src/animation/retime.js.map +1 -0
  28. package/dist/src/audio/wav.d.ts +11 -0
  29. package/dist/src/audio/wav.d.ts.map +1 -0
  30. package/dist/src/audio/wav.js +58 -0
  31. package/dist/src/audio/wav.js.map +1 -0
  32. package/dist/src/authoring-runner.d.ts +2 -0
  33. package/dist/src/authoring-runner.d.ts.map +1 -0
  34. package/dist/src/authoring-runner.js +24 -0
  35. package/dist/src/authoring-runner.js.map +1 -0
  36. package/dist/src/cli.d.ts +3 -0
  37. package/dist/src/cli.d.ts.map +1 -0
  38. package/dist/src/cli.js +127 -0
  39. package/dist/src/cli.js.map +1 -0
  40. package/dist/src/core/coordinates.d.ts +16 -0
  41. package/dist/src/core/coordinates.d.ts.map +1 -0
  42. package/dist/src/core/coordinates.js +48 -0
  43. package/dist/src/core/coordinates.js.map +1 -0
  44. package/dist/src/core/handles.d.ts +93 -0
  45. package/dist/src/core/handles.d.ts.map +1 -0
  46. package/dist/src/core/handles.js +190 -0
  47. package/dist/src/core/handles.js.map +1 -0
  48. package/dist/src/core/history.d.ts +14 -0
  49. package/dist/src/core/history.d.ts.map +1 -0
  50. package/dist/src/core/history.js +80 -0
  51. package/dist/src/core/history.js.map +1 -0
  52. package/dist/src/core/inspection.d.ts +51 -0
  53. package/dist/src/core/inspection.d.ts.map +1 -0
  54. package/dist/src/core/inspection.js +72 -0
  55. package/dist/src/core/inspection.js.map +1 -0
  56. package/dist/src/core/production.d.ts +208 -0
  57. package/dist/src/core/production.d.ts.map +1 -0
  58. package/dist/src/core/production.js +894 -0
  59. package/dist/src/core/production.js.map +1 -0
  60. package/dist/src/core/project.d.ts +146 -0
  61. package/dist/src/core/project.d.ts.map +1 -0
  62. package/dist/src/core/project.js +700 -0
  63. package/dist/src/core/project.js.map +1 -0
  64. package/dist/src/drawing/brush-authoring.d.ts +6 -0
  65. package/dist/src/drawing/brush-authoring.d.ts.map +1 -0
  66. package/dist/src/drawing/brush-authoring.js +12 -0
  67. package/dist/src/drawing/brush-authoring.js.map +1 -0
  68. package/dist/src/drawing/brushes.d.ts +157 -0
  69. package/dist/src/drawing/brushes.d.ts.map +1 -0
  70. package/dist/src/drawing/brushes.js +50 -0
  71. package/dist/src/drawing/brushes.js.map +1 -0
  72. package/dist/src/drawing/color.d.ts +5 -0
  73. package/dist/src/drawing/color.d.ts.map +1 -0
  74. package/dist/src/drawing/color.js +63 -0
  75. package/dist/src/drawing/color.js.map +1 -0
  76. package/dist/src/drawing/curves.d.ts +27 -0
  77. package/dist/src/drawing/curves.d.ts.map +1 -0
  78. package/dist/src/drawing/curves.js +170 -0
  79. package/dist/src/drawing/curves.js.map +1 -0
  80. package/dist/src/drawing/math.d.ts +10 -0
  81. package/dist/src/drawing/math.d.ts.map +1 -0
  82. package/dist/src/drawing/math.js +40 -0
  83. package/dist/src/drawing/math.js.map +1 -0
  84. package/dist/src/drawing/path-geometry.d.ts +18 -0
  85. package/dist/src/drawing/path-geometry.d.ts.map +1 -0
  86. package/dist/src/drawing/path-geometry.js +115 -0
  87. package/dist/src/drawing/path-geometry.js.map +1 -0
  88. package/dist/src/drawing/path-sampling.d.ts +10 -0
  89. package/dist/src/drawing/path-sampling.d.ts.map +1 -0
  90. package/dist/src/drawing/path-sampling.js +64 -0
  91. package/dist/src/drawing/path-sampling.js.map +1 -0
  92. package/dist/src/drawing/path.d.ts +4 -0
  93. package/dist/src/drawing/path.d.ts.map +1 -0
  94. package/dist/src/drawing/path.js +27 -0
  95. package/dist/src/drawing/path.js.map +1 -0
  96. package/dist/src/drawing/pen-input.d.ts +5 -0
  97. package/dist/src/drawing/pen-input.d.ts.map +1 -0
  98. package/dist/src/drawing/pen-input.js +30 -0
  99. package/dist/src/drawing/pen-input.js.map +1 -0
  100. package/dist/src/drawing/pixel-selection.d.ts +23 -0
  101. package/dist/src/drawing/pixel-selection.d.ts.map +1 -0
  102. package/dist/src/drawing/pixel-selection.js +142 -0
  103. package/dist/src/drawing/pixel-selection.js.map +1 -0
  104. package/dist/src/drawing/pixels.d.ts +22 -0
  105. package/dist/src/drawing/pixels.d.ts.map +1 -0
  106. package/dist/src/drawing/pixels.js +79 -0
  107. package/dist/src/drawing/pixels.js.map +1 -0
  108. package/dist/src/drawing/resource-binary.d.ts +23 -0
  109. package/dist/src/drawing/resource-binary.d.ts.map +1 -0
  110. package/dist/src/drawing/resource-binary.js +135 -0
  111. package/dist/src/drawing/resource-binary.js.map +1 -0
  112. package/dist/src/drawing/resources.d.ts +51 -0
  113. package/dist/src/drawing/resources.d.ts.map +1 -0
  114. package/dist/src/drawing/resources.js +239 -0
  115. package/dist/src/drawing/resources.js.map +1 -0
  116. package/dist/src/drawing/stroke-outline.d.ts +5 -0
  117. package/dist/src/drawing/stroke-outline.d.ts.map +1 -0
  118. package/dist/src/drawing/stroke-outline.js +53 -0
  119. package/dist/src/drawing/stroke-outline.js.map +1 -0
  120. package/dist/src/drawing/swatch.d.ts +6 -0
  121. package/dist/src/drawing/swatch.d.ts.map +1 -0
  122. package/dist/src/drawing/swatch.js +15 -0
  123. package/dist/src/drawing/swatch.js.map +1 -0
  124. package/dist/src/export/animatic-export.d.ts +11 -0
  125. package/dist/src/export/animatic-export.d.ts.map +1 -0
  126. package/dist/src/export/animatic-export.js +52 -0
  127. package/dist/src/export/animatic-export.js.map +1 -0
  128. package/dist/src/export/movie-export.d.ts +16 -0
  129. package/dist/src/export/movie-export.d.ts.map +1 -0
  130. package/dist/src/export/movie-export.js +108 -0
  131. package/dist/src/export/movie-export.js.map +1 -0
  132. package/dist/src/export/sheet-layout.d.ts +27 -0
  133. package/dist/src/export/sheet-layout.d.ts.map +1 -0
  134. package/dist/src/export/sheet-layout.js +72 -0
  135. package/dist/src/export/sheet-layout.js.map +1 -0
  136. package/dist/src/export/storyboard-export.d.ts +8 -0
  137. package/dist/src/export/storyboard-export.d.ts.map +1 -0
  138. package/dist/src/export/storyboard-export.js +76 -0
  139. package/dist/src/export/storyboard-export.js.map +1 -0
  140. package/dist/src/index.d.ts +36 -0
  141. package/dist/src/index.d.ts.map +1 -0
  142. package/dist/src/index.js +27 -0
  143. package/dist/src/index.js.map +1 -0
  144. package/dist/src/model/query.d.ts +6 -0
  145. package/dist/src/model/query.d.ts.map +1 -0
  146. package/dist/src/model/query.js +7 -0
  147. package/dist/src/model/query.js.map +1 -0
  148. package/dist/src/model/schema.d.ts +754 -0
  149. package/dist/src/model/schema.d.ts.map +1 -0
  150. package/dist/src/model/schema.js +205 -0
  151. package/dist/src/model/schema.js.map +1 -0
  152. package/dist/src/model/types.d.ts +537 -0
  153. package/dist/src/model/types.d.ts.map +1 -0
  154. package/dist/src/model/types.js +8 -0
  155. package/dist/src/model/types.js.map +1 -0
  156. package/dist/src/model/validate.d.ts +12 -0
  157. package/dist/src/model/validate.d.ts.map +1 -0
  158. package/dist/src/model/validate.js +183 -0
  159. package/dist/src/model/validate.js.map +1 -0
  160. package/dist/src/preview/server.d.ts +6 -0
  161. package/dist/src/preview/server.d.ts.map +1 -0
  162. package/dist/src/preview/server.js +71 -0
  163. package/dist/src/preview/server.js.map +1 -0
  164. package/dist/src/render/annotations.d.ts +4 -0
  165. package/dist/src/render/annotations.d.ts.map +1 -0
  166. package/dist/src/render/annotations.js +27 -0
  167. package/dist/src/render/annotations.js.map +1 -0
  168. package/dist/src/render/brush-engine.d.ts +14 -0
  169. package/dist/src/render/brush-engine.d.ts.map +1 -0
  170. package/dist/src/render/brush-engine.js +230 -0
  171. package/dist/src/render/brush-engine.js.map +1 -0
  172. package/dist/src/render/layer-compositor.d.ts +33 -0
  173. package/dist/src/render/layer-compositor.d.ts.map +1 -0
  174. package/dist/src/render/layer-compositor.js +296 -0
  175. package/dist/src/render/layer-compositor.js.map +1 -0
  176. package/dist/src/render/panel-renderer.d.ts +33 -0
  177. package/dist/src/render/panel-renderer.d.ts.map +1 -0
  178. package/dist/src/render/panel-renderer.js +118 -0
  179. package/dist/src/render/panel-renderer.js.map +1 -0
  180. package/dist/src/render/png.d.ts +4 -0
  181. package/dist/src/render/png.d.ts.map +1 -0
  182. package/dist/src/render/png.js +10 -0
  183. package/dist/src/render/png.js.map +1 -0
  184. package/dist/src/render/review.d.ts +42 -0
  185. package/dist/src/render/review.d.ts.map +1 -0
  186. package/dist/src/render/review.js +192 -0
  187. package/dist/src/render/review.js.map +1 -0
  188. package/dist/src/render/vector-renderer.d.ts +5 -0
  189. package/dist/src/render/vector-renderer.d.ts.map +1 -0
  190. package/dist/src/render/vector-renderer.js +98 -0
  191. package/dist/src/render/vector-renderer.js.map +1 -0
  192. package/dist/src/starter.d.ts +2 -0
  193. package/dist/src/starter.d.ts.map +1 -0
  194. package/dist/src/starter.js +23 -0
  195. package/dist/src/starter.js.map +1 -0
  196. package/dist/src/storage/codec.d.ts +20 -0
  197. package/dist/src/storage/codec.d.ts.map +1 -0
  198. package/dist/src/storage/codec.js +203 -0
  199. package/dist/src/storage/codec.js.map +1 -0
  200. package/dist/src/storage/store.d.ts +89 -0
  201. package/dist/src/storage/store.d.ts.map +1 -0
  202. package/dist/src/storage/store.js +392 -0
  203. package/dist/src/storage/store.js.map +1 -0
  204. package/dist/src/updates.d.ts +10 -0
  205. package/dist/src/updates.d.ts.map +1 -0
  206. package/dist/src/updates.js +134 -0
  207. package/dist/src/updates.js.map +1 -0
  208. package/package.json +84 -0
@@ -0,0 +1,33 @@
1
+ import { Canvas, type CanvasRenderingContext2D } from "skia-canvas";
2
+ import type { Layer, Panel, DrawingLayer } from "../model/types.js";
3
+ import { type EvaluatedCamera } from "../animation/evaluate.js";
4
+ export declare class RenderCache {
5
+ readonly maxBytes: number;
6
+ private layers;
7
+ private bytes;
8
+ constructor(maxBytes?: number);
9
+ clear(): void;
10
+ artwork(panel: Panel, layer: DrawingLayer, frame?: number, scale?: number): {
11
+ canvas: Canvas;
12
+ x: number;
13
+ y: number;
14
+ scale: number;
15
+ };
16
+ }
17
+ type CompositionBounds = {
18
+ x: number;
19
+ y: number;
20
+ width: number;
21
+ height: number;
22
+ };
23
+ type Matrix = {
24
+ a: number;
25
+ b: number;
26
+ c: number;
27
+ d: number;
28
+ e: number;
29
+ f: number;
30
+ };
31
+ export declare function compositeLayers(panel: Panel, layers: Layer[], target: CanvasRenderingContext2D, frame?: number, cache?: RenderCache, camera?: EvaluatedCamera, visited?: Set<string>, parent?: Matrix, resolution?: number, bounds?: CompositionBounds, selection?: ReadonlySet<string>): void;
32
+ export {};
33
+ //# sourceMappingURL=layer-compositor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layer-compositor.d.ts","sourceRoot":"","sources":["../../../src/render/layer-compositor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAkC,MAAM,mBAAmB,CAAC;AAGpG,OAAO,EAAkC,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAGhG,qBAAa,WAAW;IAGV,QAAQ,CAAC,QAAQ;IAF7B,OAAO,CAAC,MAAM,CAA2E;IACzF,OAAO,CAAC,KAAK,CAAK;gBACG,QAAQ,SAAoB;IACjD,KAAK;IACL,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,SAAW,EAAE,KAAK,SAAI,GAAG;QAAC,MAAM,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAC;QAAA,KAAK,EAAC,MAAM,CAAA;KAAC;CAkDxH;AAaD,KAAK,iBAAiB,GAAG;IAAC,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAC;IAAA,KAAK,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,MAAM,CAAA;CAAC,CAAC;AAsBxE,KAAK,MAAM,GAAG;IAAC,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAA;CAAC,CAAC;AAiEtE,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,wBAAwB,EAAE,KAAK,SAAmB,EAAE,KAAK,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,eAAe,EAAE,OAAO,cAAoB,EAAC,MAAM,CAAC,EAAC,MAAM,EAAC,UAAU,SAAE,EAAC,MAAM,oBAA6C,EAAC,SAAS,CAAC,EAAC,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAmD1T"}
@@ -0,0 +1,296 @@
1
+ import { Canvas } from "skia-canvas";
2
+ import { drawElement } from "./vector-renderer.js";
3
+ import { brushPadding } from "./brush-engine.js";
4
+ import { evaluateLayer, evaluateDrawing } from "../animation/evaluate.js";
5
+ import { cameraPlane } from "../animation/camera-plane.js";
6
+ export class RenderCache {
7
+ maxBytes;
8
+ layers = new Map();
9
+ bytes = 0;
10
+ constructor(maxBytes = 128 * 1024 * 1024) {
11
+ this.maxBytes = maxBytes;
12
+ }
13
+ clear() { this.layers.clear(); this.bytes = 0; }
14
+ artwork(panel, layer, frame = Infinity, scale = 1) {
15
+ scale = Math.max(1, Math.min(8, Math.ceil(scale * 4) / 4));
16
+ const active = revealing(layer, frame);
17
+ const found = active ? undefined : this.layers.get(layer);
18
+ if (found?.scale === scale)
19
+ return found;
20
+ if (found) {
21
+ this.bytes -= found.canvas.width * found.canvas.height * 4;
22
+ this.layers.delete(layer);
23
+ }
24
+ let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
25
+ const include = (left, top, right, bottom, matrix, padding = 0) => {
26
+ const [a, b, c, d, e, f] = matrix ?? [1, 0, 0, 1, 0, 0];
27
+ for (const [u, v] of [[left, top], [right, top], [left, bottom], [right, bottom]]) {
28
+ const x = a * u + c * v + e, y = b * u + d * v + f;
29
+ minX = Math.min(minX, x - padding);
30
+ minY = Math.min(minY, y - padding);
31
+ maxX = Math.max(maxX, x + padding);
32
+ maxY = Math.max(maxY, y + padding);
33
+ }
34
+ };
35
+ for (const e of layer.elements) {
36
+ if (e.kind === "raster-surface") {
37
+ include(0, 0, e.width, e.height, e.matrix, 1);
38
+ continue;
39
+ }
40
+ if (e.kind === "text") {
41
+ const context = new Canvas(1, 1).getContext("2d");
42
+ context.font = e.font;
43
+ context.textAlign = e.align;
44
+ const m = context.measureText(e.text);
45
+ include(e.x - m.actualBoundingBoxLeft - 2, e.y - m.actualBoundingBoxAscent - 2, e.x + m.actualBoundingBoxRight + 2, e.y + m.actualBoundingBoxDescent + 2, e.matrix);
46
+ continue;
47
+ }
48
+ const padding = e.kind === "raster-stroke" ? brushPadding(e.brush) : e.kind === "vector-stroke" ? e.width : e.strokeWidth;
49
+ const points = e.kind === "vector-path" ? e.commands.flatMap(c => c.op === "Z" ? [] : [{ x: c.x, y: c.y }, ...("x1" in c ? [{ x: c.x1, y: c.y1 }] : []), ...("x2" in c ? [{ x: c.x2, y: c.y2 }] : [])]) : e.points;
50
+ for (const p of points)
51
+ include(p.x - padding, p.y - padding, p.x + padding, p.y + padding, e.matrix);
52
+ }
53
+ if (!Number.isFinite(minX)) {
54
+ minX = 0;
55
+ minY = 0;
56
+ maxX = 1;
57
+ maxY = 1;
58
+ }
59
+ const x = Math.floor(minX), y = Math.floor(minY), width = Math.max(1, Math.ceil(maxX) - x), height = Math.max(1, Math.ceil(maxY) - y);
60
+ const pixelWidth = Math.ceil(width * scale), pixelHeight = Math.ceil(height * scale);
61
+ if (pixelWidth * pixelHeight > 32 * 1024 * 1024)
62
+ throw new Error(`Layer ${layer.id} exceeds 32 megapixel artwork bounds`);
63
+ const canvas = new Canvas(pixelWidth, pixelHeight);
64
+ const ctx = canvas.getContext("2d");
65
+ try {
66
+ ctx.scale(scale, scale);
67
+ ctx.translate(-x, -y);
68
+ for (const element of layer.elements)
69
+ drawElement(ctx, element, frame);
70
+ const size = pixelWidth * pixelHeight * 4;
71
+ while (this.bytes + size > this.maxBytes && this.layers.size) {
72
+ const first = this.layers.keys().next().value;
73
+ const old = this.layers.get(first);
74
+ this.bytes -= old.canvas.width * old.canvas.height * 4;
75
+ this.layers.delete(first);
76
+ }
77
+ // Keep pixels, not a retained display list of every dab, in the bounded cache.
78
+ const flattened = new Canvas(pixelWidth, pixelHeight);
79
+ flattened.getContext("2d").putImageData(ctx.getImageData(0, 0, pixelWidth, pixelHeight), 0, 0);
80
+ const result = { canvas: flattened, x, y, scale };
81
+ if (!active && size <= this.maxBytes) {
82
+ this.layers.set(layer, result);
83
+ this.bytes += size;
84
+ }
85
+ return result;
86
+ }
87
+ finally {
88
+ ctx.reset();
89
+ }
90
+ }
91
+ }
92
+ function findLayerPath(layers, id) {
93
+ for (const layer of layers) {
94
+ if (layer.id === id)
95
+ return [layer];
96
+ if (layer.kind === "group") {
97
+ const nested = findLayerPath(layer.children, id);
98
+ if (nested)
99
+ return [layer, ...nested];
100
+ }
101
+ }
102
+ return undefined;
103
+ }
104
+ function compositionBounds(panel, layers, frame, camera) {
105
+ let left = 0, top = 0, right = panel.width, bottom = panel.height;
106
+ if (camera) {
107
+ const c = Math.cos(camera.rotation), s = Math.sin(camera.rotation);
108
+ for (const layer of layers) {
109
+ const { zoom, panX, panY } = cameraPlane(camera, evaluateLayer(layer, frame).depth, panel.width, panel.height);
110
+ for (const [x, y] of [[0, 0], [panel.width, 0], [0, panel.height], [panel.width, panel.height]]) {
111
+ const u = (x - panel.width / 2) / zoom, v = (y - panel.height / 2) / zoom;
112
+ const wx = c * u - s * v + panel.width / 2 + panX;
113
+ const wy = s * u + c * v + panel.height / 2 + panY;
114
+ if (!Number.isFinite(wx) || !Number.isFinite(wy))
115
+ throw new Error('Camera plane composition bounds exceed the supported numerical range');
116
+ left = Math.min(left, Math.floor(wx));
117
+ top = Math.min(top, Math.floor(wy));
118
+ right = Math.max(right, Math.ceil(wx));
119
+ bottom = Math.max(bottom, Math.ceil(wy));
120
+ }
121
+ }
122
+ }
123
+ const width = right - left, height = bottom - top;
124
+ if (!Number.isFinite(width) || !Number.isFinite(height))
125
+ throw new Error('Camera plane composition bounds exceed the supported numerical range');
126
+ return { x: left, y: top, width, height };
127
+ }
128
+ function placeLayer(ctx, transform, pivot) {
129
+ ctx.translate(transform.x, transform.y);
130
+ if (pivot)
131
+ ctx.translate(pivot.x, pivot.y);
132
+ ctx.rotate(transform.rotation);
133
+ ctx.scale(transform.scaleX, transform.scaleY);
134
+ if (pivot)
135
+ ctx.translate(-pivot.x, -pivot.y);
136
+ }
137
+ const revealing = (layer, frame) => layer.elements.some(e => e.kind === "raster-stroke" && e.reveal && frame < e.reveal.endFrame);
138
+ function paintCached(ctx, cache, panel, layer, frame) {
139
+ const m = ctx.getTransform(), scale = Math.max(Math.hypot(m.a, m.b), Math.hypot(m.c, m.d));
140
+ const art = cache.artwork(panel, layer, frame, scale);
141
+ ctx.drawImage(art.canvas, art.x, art.y, art.canvas.width / art.scale, art.canvas.height / art.scale);
142
+ }
143
+ function renderLayer(panel, layer, frame, visited = new Set(), force = false, cache, parent, resolution = 1, bounds = { x: 0, y: 0, width: panel.width, height: panel.height }, selection) {
144
+ if (visited.has(layer.id))
145
+ throw new Error(`Circular layer mask involving ${layer.id}`);
146
+ const nextVisited = new Set(visited).add(layer.id);
147
+ const width = Math.ceil(bounds.width * resolution), height = Math.ceil(bounds.height * resolution);
148
+ if (width * height > 32 * 1024 * 1024)
149
+ throw new Error(`Layer ${layer.id} exceeds 32 megapixel camera composition bounds`);
150
+ const canvas = new Canvas(width, height);
151
+ if (!layer.visible && !force)
152
+ return canvas;
153
+ if (layer.exposure && (frame < layer.exposure.startFrame || frame >= layer.exposure.endFrame))
154
+ return canvas;
155
+ const ctx = canvas.getContext("2d");
156
+ ctx.save();
157
+ if (parent)
158
+ ctx.setTransform(parent.a, parent.b, parent.c, parent.d, parent.e, parent.f);
159
+ else {
160
+ ctx.scale(resolution, resolution);
161
+ ctx.translate(-bounds.x, -bounds.y);
162
+ }
163
+ const state = evaluateLayer(layer, frame);
164
+ placeLayer(ctx, state.transform, layer.pivot);
165
+ if (layer.kind === "group") {
166
+ const matrix = ctx.getTransform();
167
+ ctx.resetTransform();
168
+ const drawing = evaluateDrawing(layer.drawingSequence, frame);
169
+ const children = drawing === undefined ? layer.children : layer.children.filter(child => child.id === drawing);
170
+ compositeLayers(panel, children, ctx, frame, cache, undefined, nextVisited, matrix, resolution, bounds, selection?.has(layer.id) ? undefined : selection);
171
+ }
172
+ else if (cache && layer.kind === "raster")
173
+ paintCached(ctx, cache, panel, layer, frame);
174
+ else
175
+ for (const element of layer.elements)
176
+ drawElement(ctx, element, frame);
177
+ ctx.restore();
178
+ if (layer.maskLayerId) {
179
+ const maskPath = findLayerPath(panel.layers, layer.maskLayerId);
180
+ if (!maskPath)
181
+ throw new Error(`Mask layer not found: ${layer.maskLayerId}`);
182
+ const mask = maskPath.at(-1);
183
+ const consumerAncestors = new Set(findLayerPath(panel.layers, layer.id).slice(0, -1).map(entry => entry.id));
184
+ let maskOpacity = evaluateLayer(mask, frame).opacity;
185
+ ctx.save();
186
+ ctx.resetTransform();
187
+ ctx.scale(resolution, resolution);
188
+ ctx.translate(-bounds.x, -bounds.y);
189
+ for (const [index, ancestor] of maskPath.slice(0, -1).entries()) {
190
+ const state = evaluateLayer(ancestor, frame);
191
+ placeLayer(ctx, state.transform, ancestor.pivot);
192
+ if (!consumerAncestors.has(ancestor.id))
193
+ maskOpacity *= state.opacity;
194
+ if (ancestor.exposure && (frame < ancestor.exposure.startFrame || frame >= ancestor.exposure.endFrame))
195
+ maskOpacity = 0;
196
+ if (ancestor.kind === "group") {
197
+ const drawing = evaluateDrawing(ancestor.drawingSequence, frame);
198
+ if (drawing !== undefined && drawing !== maskPath[index + 1].id)
199
+ maskOpacity = 0;
200
+ }
201
+ }
202
+ const maskParent = ctx.getTransform();
203
+ ctx.restore();
204
+ const maskCanvas = renderLayer(panel, mask, frame, nextVisited, true, cache, maskParent, resolution, bounds);
205
+ ctx.save();
206
+ ctx.globalCompositeOperation = "destination-in";
207
+ ctx.globalAlpha = maskOpacity;
208
+ ctx.drawImage(maskCanvas, 0, 0);
209
+ ctx.restore();
210
+ }
211
+ return canvas;
212
+ }
213
+ export function compositeLayers(panel, layers, target, frame = panel.startFrame, cache, camera, visited = new Set(), parent, resolution = 1, bounds = compositionBounds(panel, layers, frame, camera), selection) {
214
+ const selected = (layer) => !selection || selection.has(layer.id) || (layer.kind === "group" && layer.children.some(selected));
215
+ let below;
216
+ for (const [index, layer] of layers.entries()) {
217
+ const state = evaluateLayer(layer, frame);
218
+ const placement = camera ? cameraPlane(camera, state.depth, panel.width, panel.height) : undefined;
219
+ const paint = selected(layer);
220
+ if (!paint && !layers[index + 1]?.clipToBelow) {
221
+ below = undefined;
222
+ continue;
223
+ }
224
+ if (!layer.visible) {
225
+ below = undefined;
226
+ continue;
227
+ }
228
+ if (state.opacity === 0) {
229
+ below = undefined;
230
+ continue;
231
+ }
232
+ if (layer.exposure && (frame < layer.exposure.startFrame || frame >= layer.exposure.endFrame)) {
233
+ below = undefined;
234
+ continue;
235
+ }
236
+ if (layer.clipToBelow && !below)
237
+ continue;
238
+ if (paint && cache && layer.kind !== "group" && !layer.maskLayerId && !layer.clipToBelow && !layers[index + 1]?.clipToBelow && (layer.kind === "raster" || (state.opacity === 1 && layer.blendMode === "source-over"))) {
239
+ target.save();
240
+ if (camera && placement) {
241
+ target.translate(panel.width / 2, panel.height / 2);
242
+ target.rotate(-camera.rotation);
243
+ target.scale(placement.zoom, placement.zoom);
244
+ target.translate(-panel.width / 2 - placement.panX, -panel.height / 2 - placement.panY);
245
+ }
246
+ if (parent)
247
+ target.transform(parent.a, parent.b, parent.c, parent.d, parent.e, parent.f);
248
+ placeLayer(target, state.transform, layer.pivot);
249
+ target.globalAlpha = state.opacity;
250
+ target.globalCompositeOperation = layer.blendMode;
251
+ if (layer.kind === "vector")
252
+ for (const e of layer.elements)
253
+ drawElement(target, e, frame);
254
+ else
255
+ paintCached(target, cache, panel, layer, frame);
256
+ target.restore();
257
+ below = undefined;
258
+ continue;
259
+ }
260
+ const layerResolution = placement ? Math.max(1, Math.ceil(placement.zoom * 4) / 4) : resolution;
261
+ const rendered = renderLayer(panel, layer, frame, visited, false, cache, parent, layerResolution, bounds, paint ? selection : undefined);
262
+ const alphaSource = selection && layer.kind === "group" && paint && !selection.has(layer.id) && layers[index + 1]?.clipToBelow
263
+ ? renderLayer(panel, layer, frame, visited, false, cache, parent, layerResolution, bounds) : rendered;
264
+ if (layer.clipToBelow && below) {
265
+ for (const surface of new Set([rendered, alphaSource])) {
266
+ const clippingContext = surface.getContext("2d");
267
+ clippingContext.globalCompositeOperation = "destination-in";
268
+ clippingContext.drawImage(below, 0, 0, surface.width, surface.height);
269
+ }
270
+ }
271
+ if (paint) {
272
+ target.save();
273
+ if (camera && placement) {
274
+ target.translate(panel.width / 2, panel.height / 2);
275
+ target.rotate(-camera.rotation);
276
+ target.scale(placement.zoom, placement.zoom);
277
+ target.translate(-panel.width / 2 - placement.panX, -panel.height / 2 - placement.panY);
278
+ }
279
+ target.globalAlpha = state.opacity;
280
+ target.globalCompositeOperation = layer.blendMode;
281
+ if (camera)
282
+ target.drawImage(rendered, bounds.x, bounds.y, rendered.width / layerResolution, rendered.height / layerResolution);
283
+ else
284
+ target.drawImage(rendered, 0, 0);
285
+ target.restore();
286
+ }
287
+ below = alphaSource;
288
+ if (state.opacity < 1 && layers[index + 1]?.clipToBelow) {
289
+ below = new Canvas(rendered.width, rendered.height);
290
+ const alpha = below.getContext("2d");
291
+ alpha.globalAlpha = state.opacity;
292
+ alpha.drawImage(alphaSource, 0, 0);
293
+ }
294
+ }
295
+ }
296
+ //# sourceMappingURL=layer-compositor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layer-compositor.js","sourceRoot":"","sources":["../../../src/render/layer-compositor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { Canvas } from "skia-canvas";
2
+ import type { StoryboardDocument } from "../model/types.js";
3
+ import { StoryboardProject } from "../core/project.js";
4
+ import { RenderCache } from "./layer-compositor.js";
5
+ export type RenderSource = StoryboardProject | StoryboardDocument;
6
+ export type PanelRenderSource = StoryboardProject | Pick<StoryboardDocument, "canvas" | "panels" | "shots">;
7
+ export declare function renderPanelCanvas(source: PanelRenderSource, panelId: string, options?: {
8
+ annotations?: boolean;
9
+ frame?: number;
10
+ camera?: boolean;
11
+ layerIds?: readonly string[];
12
+ cache?: RenderCache;
13
+ }): Canvas;
14
+ export declare function renderPanelPNG(source: RenderSource, panelId: string, options?: {
15
+ annotations?: boolean;
16
+ frame?: number;
17
+ camera?: boolean;
18
+ layerIds?: readonly string[];
19
+ }): Promise<Buffer>;
20
+ export declare function renderFrameCanvas(source: RenderSource, frame: number, options?: {
21
+ annotations?: boolean;
22
+ cache?: RenderCache;
23
+ }): Canvas;
24
+ export declare function renderFramePNG(source: RenderSource, frame: number, options?: {
25
+ annotations?: boolean;
26
+ }): Promise<Buffer>;
27
+ /** A frozen document snapshot with bounded artwork cache; create another session after edits. */
28
+ export declare function createRenderSession(source: RenderSource, maxCacheBytes?: number): {
29
+ durationFrames: number;
30
+ frame: (frame: number) => Canvas;
31
+ panel: (id: string, frame?: number) => Canvas;
32
+ };
33
+ //# sourceMappingURL=panel-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-renderer.d.ts","sourceRoot":"","sources":["../../../src/render/panel-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,EAAE,kBAAkB,EAAS,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAmB,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAQrE,MAAM,MAAM,YAAY,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;AAClE,MAAM,MAAM,iBAAiB,GAAG,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,EAAC,QAAQ,GAAC,QAAQ,GAAC,OAAO,CAAC,CAAC;AAMvG,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,WAAW,CAAA;CAAO,GAAG,MAAM,CAwBlN;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAEpM;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,WAAW,CAAA;CAAO,GAAG,MAAM,CAoC3I;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAElI;AAED,iGAAiG;AACjG,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,MAAM;;mBAO7D,MAAM;gBACT,MAAM,UAAU,MAAM;EAErC"}
@@ -0,0 +1,118 @@
1
+ import { Canvas } from "skia-canvas";
2
+ import { StoryboardProject } from "../core/project.js";
3
+ import { compositeLayers, RenderCache } from "./layer-compositor.js";
4
+ import { drawMotionAnnotations } from "./annotations.js";
5
+ import { evaluateCamera } from "../animation/evaluate.js";
6
+ import { parseStoryboardDocument } from "../model/validate.js";
7
+ import { assertRenderFrame, selectFramePanels } from "../animation/frame.js";
8
+ import { isDrawingColor } from "../drawing/color.js";
9
+ import { encodePNG } from "./png.js";
10
+ function documentOf(source) {
11
+ return source instanceof StoryboardProject ? source.toJSON() : source;
12
+ }
13
+ export function renderPanelCanvas(source, panelId, options = {}) {
14
+ const document = source instanceof StoryboardProject ? source._readRenderPanels([panelId]) : source;
15
+ const panel = document.panels.find((entry) => entry.id === panelId);
16
+ if (!panel)
17
+ throw new Error(`Panel not found: ${panelId}`);
18
+ const frame = options.frame ?? panel.startFrame;
19
+ assertRenderFrame(frame);
20
+ if (!isDrawingColor(document.canvas.background))
21
+ throw new Error("Invalid canvas background color");
22
+ const shot = document.shots.find((entry) => entry.id === panel.shotId);
23
+ const camera = evaluateCamera(shot?.cameraKeyframes ?? [], frame);
24
+ let selection;
25
+ if (options.layerIds) {
26
+ selection = new Set(options.layerIds);
27
+ if (!selection.size || selection.size !== options.layerIds.length)
28
+ throw new Error("Layer render selection requires nonempty unique layer IDs");
29
+ const ids = new Set();
30
+ const visit = (layers) => { for (const layer of layers) {
31
+ ids.add(layer.id);
32
+ if (layer.kind === "group")
33
+ visit(layer.children);
34
+ } };
35
+ visit(panel.layers);
36
+ for (const id of selection)
37
+ if (!ids.has(id))
38
+ throw new Error(`Render layer not found in panel ${panelId}: ${id}`);
39
+ }
40
+ const stage = new Canvas(panel.width, panel.height), stageContext = stage.getContext("2d");
41
+ try {
42
+ stageContext.fillStyle = document.canvas.background;
43
+ stageContext.fillRect(0, 0, panel.width, panel.height);
44
+ compositeLayers(panel, panel.layers, stageContext, frame, options.cache ?? new RenderCache(), options.camera === false ? undefined : camera, undefined, undefined, 1, undefined, selection);
45
+ if (options.annotations ?? true)
46
+ drawMotionAnnotations(stageContext, panel);
47
+ return stage;
48
+ }
49
+ catch (error) {
50
+ stageContext.reset();
51
+ throw error;
52
+ }
53
+ }
54
+ export async function renderPanelPNG(source, panelId, options = {}) {
55
+ return encodePNG(renderPanelCanvas(source, panelId, options));
56
+ }
57
+ export function renderFrameCanvas(source, frame, options = {}) {
58
+ assertRenderFrame(frame);
59
+ const document = source instanceof StoryboardProject ? source._readRenderFrame(frame) : source;
60
+ const { panel, incoming: next, progress } = selectFramePanels(document.panels, frame);
61
+ const current = renderPanelCanvas(document, panel.id, { ...options, frame, annotations: options.annotations ?? false });
62
+ const transition = panel.transition;
63
+ if (!next)
64
+ return current;
65
+ let incoming, output;
66
+ try {
67
+ incoming = renderPanelCanvas(document, next.id, { ...options, frame: next.startFrame, annotations: options.annotations ?? false });
68
+ output = new Canvas(panel.width, panel.height);
69
+ const ctx = output.getContext("2d");
70
+ if (transition.type === "dissolve") {
71
+ ctx.globalAlpha = 1 - progress;
72
+ ctx.drawImage(current, 0, 0);
73
+ ctx.globalAlpha = progress;
74
+ ctx.globalCompositeOperation = "lighter";
75
+ ctx.drawImage(incoming, 0, 0);
76
+ }
77
+ else {
78
+ ctx.drawImage(current, 0, 0);
79
+ const width = panel.width * progress;
80
+ const left = transition.type === "wipe-left" ? panel.width - width : 0;
81
+ ctx.clearRect(left, 0, width, panel.height);
82
+ ctx.save();
83
+ ctx.beginPath();
84
+ ctx.rect(left, 0, width, panel.height);
85
+ ctx.clip();
86
+ ctx.drawImage(incoming, 0, 0);
87
+ ctx.restore();
88
+ }
89
+ return output;
90
+ }
91
+ catch (error) {
92
+ output?.getContext("2d").reset();
93
+ throw error;
94
+ }
95
+ finally {
96
+ incoming?.getContext("2d").reset();
97
+ current.getContext("2d").reset();
98
+ }
99
+ }
100
+ export async function renderFramePNG(source, frame, options = {}) {
101
+ return encodePNG(renderFrameCanvas(source, frame, options));
102
+ }
103
+ /** A frozen document snapshot with bounded artwork cache; create another session after edits. */
104
+ export function createRenderSession(source, maxCacheBytes) {
105
+ const document = parseStoryboardDocument(documentOf(source));
106
+ const cache = new RenderCache(maxCacheBytes);
107
+ let lastPanel = "";
108
+ const select = (id) => { if (lastPanel !== id) {
109
+ cache.clear();
110
+ lastPanel = id;
111
+ } };
112
+ return {
113
+ durationFrames: document.panels.reduce((n, p) => Math.max(n, p.startFrame + p.durationFrames), 0),
114
+ frame: (frame) => { select(document.panels.find(p => frame >= p.startFrame && frame < p.startFrame + p.durationFrames)?.id ?? ""); return renderFrameCanvas(document, frame, { cache }); },
115
+ panel: (id, frame) => { select(id); return renderPanelCanvas(document, id, { cache, annotations: false, ...(frame === undefined ? {} : { frame }) }); },
116
+ };
117
+ }
118
+ //# sourceMappingURL=panel-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-renderer.js","sourceRoot":"","sources":["../../../src/render/panel-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Canvas } from "skia-canvas";
2
+ /** Consumes a private render surface after encoding; never pass a caller-owned canvas. */
3
+ export declare function encodePNG(canvas: Canvas): Promise<Buffer>;
4
+ //# sourceMappingURL=png.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"png.d.ts","sourceRoot":"","sources":["../../../src/render/png.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AAExC,0FAA0F;AAC1F,wBAAsB,SAAS,CAAC,MAAM,EAAC,MAAM,GAAE,OAAO,CAAC,MAAM,CAAC,CAG7D"}
@@ -0,0 +1,10 @@
1
+ /** Consumes a private render surface after encoding; never pass a caller-owned canvas. */
2
+ export async function encodePNG(canvas) {
3
+ try {
4
+ return await canvas.toBuffer("png");
5
+ }
6
+ finally {
7
+ canvas.getContext("2d").reset();
8
+ }
9
+ }
10
+ //# sourceMappingURL=png.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"png.js","sourceRoot":"","sources":["../../../src/render/png.ts"],"names":[],"mappings":"AAEA,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAa;IAC3C,IAAG,CAAC;QAAA,OAAO,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAAA,CAAC;YAClC,CAAC;QAAA,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;IAAA,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { type RenderSource } from "./panel-renderer.js";
2
+ export interface CompositionGuides {
3
+ frame?: number;
4
+ thirds?: boolean;
5
+ /** Fraction of frame width/height inset on each edge; not a broadcast standard. */
6
+ safeInset?: number;
7
+ /** Output-frame pixel coordinates, after camera placement. */
8
+ horizonY?: number;
9
+ vanishingPoints?: readonly {
10
+ x: number;
11
+ y: number;
12
+ }[];
13
+ }
14
+ export declare function renderCompositionGuides(source: RenderSource, panelId: string, options?: CompositionGuides): Promise<Buffer>;
15
+ export declare function renderContactSheet(source: RenderSource, options?: {
16
+ columns?: number;
17
+ thumbnailWidth?: number;
18
+ panelIds?: readonly string[];
19
+ }): Promise<Buffer>;
20
+ export declare function renderDetail(source: RenderSource, panelId: string, crop: {
21
+ x: number;
22
+ y: number;
23
+ width: number;
24
+ height: number;
25
+ }, frame?: number): Promise<Buffer>;
26
+ export interface OnionSkinSample {
27
+ panelId: string;
28
+ frame?: number;
29
+ layerIds?: readonly string[];
30
+ tint?: string;
31
+ opacity?: number;
32
+ }
33
+ export declare function renderOnionSkin(source: RenderSource, samples: readonly OnionSkinSample[], options?: {
34
+ opacity?: number;
35
+ camera?: boolean;
36
+ }): Promise<Buffer>;
37
+ /** Timeline samples in caller order, including drawing substitutions and shot transitions. */
38
+ export declare function renderFrameSheet(source: RenderSource, frames: readonly number[], options?: {
39
+ columns?: number;
40
+ thumbnailWidth?: number;
41
+ }): Promise<Buffer>;
42
+ //# sourceMappingURL=review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../src/render/review.ts"],"names":[],"mappings":"AAGA,OAAO,EAA6D,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAInH,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAC,MAAM,CAAC;IACd,MAAM,CAAC,EAAC,OAAO,CAAC;IAChB,mFAAmF;IACnF,SAAS,CAAC,EAAC,MAAM,CAAC;IAClB,8DAA8D;IAC9D,QAAQ,CAAC,EAAC,MAAM,CAAC;IACjB,eAAe,CAAC,EAAC,SAAS;QAAC,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAA;KAAC,EAAE,CAAC;CACjD;AAED,wBAAsB,uBAAuB,CAAC,MAAM,EAAC,YAAY,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,GAAC,iBAAoB,GAAE,OAAO,CAAC,MAAM,CAAC,CAoB7H;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAC,YAAY,EAAC,OAAO,GAAC;IAAC,OAAO,CAAC,EAAC,MAAM,CAAC;IAAA,cAAc,CAAC,EAAC,MAAM,CAAC;IAAA,QAAQ,CAAC,EAAC,SAAS,MAAM,EAAE,CAAA;CAAI,GAAE,OAAO,CAAC,MAAM,CAAC,CAsB5J;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAC,YAAY,EAAC,OAAO,EAAC,MAAM,EAAC,IAAI,EAAC;IAAC,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAC;IAAA,KAAK,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,MAAM,CAAA;CAAC,EAAC,KAAK,CAAC,EAAC,MAAM,GAAE,OAAO,CAAC,MAAM,CAAC,CAWvJ;AAED,MAAM,WAAW,eAAe;IAAE,OAAO,EAAC,MAAM,CAAC;IAAA,KAAK,CAAC,EAAC,MAAM,CAAC;IAAA,QAAQ,CAAC,EAAC,SAAS,MAAM,EAAE,CAAC;IAAA,IAAI,CAAC,EAAC,MAAM,CAAC;IAAA,OAAO,CAAC,EAAC,MAAM,CAAA;CAAC;AAExH,wBAAsB,eAAe,CAAC,MAAM,EAAC,YAAY,EAAC,OAAO,EAAC,SAAS,eAAe,EAAE,EAAC,OAAO,GAAC;IAAC,OAAO,CAAC,EAAC,MAAM,CAAC;IAAA,MAAM,CAAC,EAAC,OAAO,CAAA;CAAI,GAAE,OAAO,CAAC,MAAM,CAAC,CA8BzJ;AAED,8FAA8F;AAC9F,wBAAsB,gBAAgB,CAAC,MAAM,EAAC,YAAY,EAAC,MAAM,EAAC,SAAS,MAAM,EAAE,EAAC,OAAO,GAAC;IAAC,OAAO,CAAC,EAAC,MAAM,CAAC;IAAA,cAAc,CAAC,EAAC,MAAM,CAAA;CAAI,GAAE,OAAO,CAAC,MAAM,CAAC,CAwBvJ"}