velo-plot 3.0.0 → 4.0.0-alpha.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 (191) hide show
  1. package/README.md +22 -15
  2. package/dist/ChartCore-KYG2HTcK.js +7474 -0
  3. package/dist/ChartCore-KYG2HTcK.js.map +1 -0
  4. package/dist/GpuChartRenderer-Dxc0hrQA.js +75 -0
  5. package/dist/GpuChartRenderer-Dxc0hrQA.js.map +1 -0
  6. package/dist/{index.core-BmZe2jRQ.js → PluginRegistry-CDf_jcnp.js} +19 -33
  7. package/dist/PluginRegistry-CDf_jcnp.js.map +1 -0
  8. package/dist/SVGDocumentBuilder-C-uLkcFW.js +83 -0
  9. package/dist/SVGDocumentBuilder-C-uLkcFW.js.map +1 -0
  10. package/dist/angular-hooks.js +1 -1
  11. package/dist/angular.js +8 -8
  12. package/dist/{axisFormat-CzumxpCL.js → axisFormat-Sz4WIJfQ.js} +2 -2
  13. package/dist/{axisFormat-CzumxpCL.js.map → axisFormat-Sz4WIJfQ.js.map} +1 -1
  14. package/dist/{chartSyncBridge-DbWrwtyP.js → chartSyncBridge-C1uRy0ZS.js} +12 -11
  15. package/dist/{chartSyncBridge-DbWrwtyP.js.map → chartSyncBridge-C1uRy0ZS.js.map} +1 -1
  16. package/dist/core/ChartStatistics.d.ts +1 -1
  17. package/dist/core/chart/ChartCore.d.ts +19 -20
  18. package/dist/core/chart/ChartFeatureHooks.d.ts +7 -0
  19. package/dist/core/chart/ChartRenderLoop.d.ts +5 -0
  20. package/dist/core/chart/ChartRenderer.d.ts +9 -0
  21. package/dist/core/chart/ChartSetup.d.ts +1 -0
  22. package/dist/core/chart/chartExportPatch.d.ts +2 -0
  23. package/dist/core/chart/exporter/SVGExporter.d.ts +9 -7
  24. package/dist/core/chart/exporter/svg/SVGDocumentBuilder.d.ts +27 -0
  25. package/dist/core/chart/exporter/svg/SVGExportContext.d.ts +147 -0
  26. package/dist/core/chart/exporter/svg/SVGOrchestrator.d.ts +3 -0
  27. package/dist/core/chart/exporter/svg/SVGThemeAdapter.d.ts +22 -0
  28. package/dist/core/chart/exporter/svg/__tests__/testFixtures.d.ts +46 -0
  29. package/dist/core/chart/exporter/svg/__tests__/visualTestUtils.d.ts +12 -0
  30. package/dist/core/chart/exporter/svg/overlay/axes.d.ts +4 -0
  31. package/dist/core/chart/exporter/svg/overlay/border.d.ts +4 -0
  32. package/dist/core/chart/exporter/svg/overlay/errorBars.d.ts +7 -0
  33. package/dist/core/chart/exporter/svg/overlay/grid.d.ts +4 -0
  34. package/dist/core/chart/exporter/svg/overlay/index.d.ts +12 -0
  35. package/dist/core/chart/exporter/svg/overlay/legend.d.ts +4 -0
  36. package/dist/core/chart/exporter/svg/overlay/pluginCharts.d.ts +6 -0
  37. package/dist/core/chart/exporter/svg/overlay/polarGrid.d.ts +4 -0
  38. package/dist/core/chart/exporter/svg/overlay/specialChart.d.ts +15 -0
  39. package/dist/core/chart/exporter/svg/overlay/title.d.ts +4 -0
  40. package/dist/core/chart/exporter/svg/plugins/annotations.d.ts +5 -0
  41. package/dist/core/chart/exporter/svg/plugins/brokenAxis.d.ts +20 -0
  42. package/dist/core/chart/exporter/svg/plugins/latex.d.ts +9 -0
  43. package/dist/core/chart/exporter/svg/plugins/register.d.ts +8 -0
  44. package/dist/core/chart/exporter/svg/plugins/regression.d.ts +33 -0
  45. package/dist/core/chart/exporter/svg/plugins/roi.d.ts +12 -0
  46. package/dist/core/chart/exporter/svg/plugins/tradeMarkers.d.ts +3 -0
  47. package/dist/core/chart/exporter/svg/plugins/types.d.ts +28 -0
  48. package/dist/core/chart/exporter/svg/plugins/watermark.d.ts +13 -0
  49. package/dist/core/chart/exporter/svg/series/band.d.ts +6 -0
  50. package/dist/core/chart/exporter/svg/series/bar.d.ts +6 -0
  51. package/dist/core/chart/exporter/svg/series/boxplot.d.ts +6 -0
  52. package/dist/core/chart/exporter/svg/series/candlestick.d.ts +6 -0
  53. package/dist/core/chart/exporter/svg/series/finitePoints.d.ts +6 -0
  54. package/dist/core/chart/exporter/svg/series/gauge.d.ts +5 -0
  55. package/dist/core/chart/exporter/svg/series/heatmap.d.ts +6 -0
  56. package/dist/core/chart/exporter/svg/series/indicator.d.ts +6 -0
  57. package/dist/core/chart/exporter/svg/series/line.d.ts +12 -0
  58. package/dist/core/chart/exporter/svg/series/polar.d.ts +6 -0
  59. package/dist/core/chart/exporter/svg/series/radar.d.ts +5 -0
  60. package/dist/core/chart/exporter/svg/series/registry.d.ts +10 -0
  61. package/dist/core/chart/exporter/svg/series/sankey.d.ts +5 -0
  62. package/dist/core/chart/exporter/svg/series/scatter.d.ts +1 -0
  63. package/dist/core/chart/exporter/svg/series/ternary.d.ts +7 -0
  64. package/dist/core/chart/exporter/svg/series/waterfall.d.ts +6 -0
  65. package/dist/core/chart/exporter/svg/seriesAtTimestamp.d.ts +4 -0
  66. package/dist/core/chart/exporter/svg/seriesUtils.d.ts +3 -0
  67. package/dist/core/chart/exporter/svg/symbols.d.ts +5 -0
  68. package/dist/core/chart/exporter/svg/tickUtils.d.ts +9 -0
  69. package/dist/core/chart/mountSVGString.d.ts +5 -0
  70. package/dist/core/chart/overlaySeriesRegistry.d.ts +7 -0
  71. package/dist/core/chart/series/SeriesActions.d.ts +1 -0
  72. package/dist/core/chart/series/SeriesBufferLite.d.ts +13 -0
  73. package/dist/core/chart/series/seriesOptionsRegistry.d.ts +8 -0
  74. package/dist/core/chart/series/seriesTypeRegistry.d.ts +5 -0
  75. package/dist/core/chart/types.d.ts +2 -2
  76. package/dist/core/stacked/StackSVGComposer.d.ts +14 -0
  77. package/dist/core/stacked/index.d.ts +3 -2
  78. package/dist/core/stacked/types.d.ts +12 -4
  79. package/dist/createStackedChart-DjA3aJAu.js +2761 -0
  80. package/dist/createStackedChart-DjA3aJAu.js.map +1 -0
  81. package/dist/{hooks-CYPCxoZx.js → hooks-4wQH27r9.js} +7 -7
  82. package/dist/{hooks-CYPCxoZx.js.map → hooks-4wQH27r9.js.map} +1 -1
  83. package/dist/{index-qunX30Xu.js → index-B7PTX94B.js} +2133 -2133
  84. package/dist/index-B7PTX94B.js.map +1 -0
  85. package/dist/{index-BMiZoKmm.js → index-BgrvqltV.js} +67 -67
  86. package/dist/index-BgrvqltV.js.map +1 -0
  87. package/dist/index-Bj-xyXY6.js +582 -0
  88. package/dist/index-Bj-xyXY6.js.map +1 -0
  89. package/dist/index-qhscKTDy.js.map +1 -1
  90. package/dist/index.core.d.ts +8 -6
  91. package/dist/index.d.ts +1 -14
  92. package/dist/plugins/3d.js +3 -1
  93. package/dist/plugins/3d.js.map +1 -1
  94. package/dist/plugins/PluginManager.d.ts +5 -0
  95. package/dist/plugins/analysis.js.map +1 -1
  96. package/dist/plugins/annotations.js +8 -7
  97. package/dist/plugins/annotations.js.map +1 -1
  98. package/dist/plugins/broken-axis.js +198 -152
  99. package/dist/plugins/broken-axis.js.map +1 -1
  100. package/dist/plugins/createPlugin.d.ts +8 -0
  101. package/dist/plugins/debug.js +32 -32
  102. package/dist/plugins/debug.js.map +1 -1
  103. package/dist/plugins/forecasting.js +273 -258
  104. package/dist/plugins/forecasting.js.map +1 -1
  105. package/dist/plugins/gpu.js +2033 -209
  106. package/dist/plugins/gpu.js.map +1 -1
  107. package/dist/plugins/i18n.js +286 -23
  108. package/dist/plugins/i18n.js.map +1 -1
  109. package/dist/plugins/latex.js +766 -207
  110. package/dist/plugins/latex.js.map +1 -1
  111. package/dist/plugins/loading/index.d.ts +1 -2
  112. package/dist/plugins/loading.js +3 -4
  113. package/dist/plugins/ml-integration.js +107 -93
  114. package/dist/plugins/ml-integration.js.map +1 -1
  115. package/dist/plugins/offscreen.js +11 -10
  116. package/dist/plugins/offscreen.js.map +1 -1
  117. package/dist/plugins/radar/types.d.ts +11 -0
  118. package/dist/plugins/radar.js +64 -53
  119. package/dist/plugins/radar.js.map +1 -1
  120. package/dist/plugins/regression.js +254 -256
  121. package/dist/plugins/regression.js.map +1 -1
  122. package/dist/plugins/roi/index.d.ts +2 -0
  123. package/dist/plugins/roi.js +184 -145
  124. package/dist/plugins/roi.js.map +1 -1
  125. package/dist/plugins/snapshot.js +20 -15
  126. package/dist/plugins/snapshot.js.map +1 -1
  127. package/dist/plugins/streaming.js +1 -1
  128. package/dist/plugins/tools.js +1 -1
  129. package/dist/plugins/types.d.ts +4 -0
  130. package/dist/react.js +55 -58
  131. package/dist/react.js.map +1 -1
  132. package/dist/regression-HNdyk1Dm.js +28 -0
  133. package/dist/regression-HNdyk1Dm.js.map +1 -0
  134. package/dist/renderer/ChartSeriesRenderer.d.ts +3 -2
  135. package/dist/renderer/NativeWebGLRenderer.d.ts +2 -1
  136. package/dist/renderer/SVGChartRenderer.d.ts +15 -0
  137. package/dist/renderer/SankeyRenderer.d.ts +1 -0
  138. package/dist/renderer/native/NativeWebGLRenderer.d.ts +5 -1
  139. package/dist/renderer/native/draw.d.ts +2 -47
  140. package/dist/renderer/native/drawCore.d.ts +27 -0
  141. package/dist/renderer/native/drawExtended.d.ts +29 -0
  142. package/dist/renderer/native/frameRenderExtended.d.ts +1 -0
  143. package/dist/renderer/native/frameRenderRegistry.d.ts +27 -0
  144. package/dist/renderer/native/programFactoryCore.d.ts +6 -0
  145. package/dist/renderer/native/programFactoryExtended.d.ts +4 -0
  146. package/dist/renderer/native/utils.d.ts +3 -29
  147. package/dist/renderer/native/utilsCore.d.ts +14 -0
  148. package/dist/renderer/native/utilsExtended.d.ts +17 -0
  149. package/dist/renderer/overlaySeriesExtended.d.ts +1 -0
  150. package/dist/renderer/registerExtendedSeries.d.ts +1 -0
  151. package/dist/renderer/registerSVG.d.ts +5 -0
  152. package/dist/renderer/registerWebGPU.d.ts +2 -0
  153. package/dist/renderer/sankeyLayout.d.ts +29 -0
  154. package/dist/renderer/seriesBufferExtended.d.ts +4 -0
  155. package/dist/scientific/index.d.ts +1 -5
  156. package/dist/scientific/registerScientific.d.ts +1 -0
  157. package/dist/scientific.js +41 -41
  158. package/dist/solid.js +56 -59
  159. package/dist/solid.js.map +1 -1
  160. package/dist/svelte.js +26 -29
  161. package/dist/svelte.js.map +1 -1
  162. package/dist/tickUtils-B_X-ha13.js +41 -0
  163. package/dist/tickUtils-B_X-ha13.js.map +1 -0
  164. package/dist/trading/index.d.ts +1 -4
  165. package/dist/trading/registerTrading.d.ts +3 -0
  166. package/dist/trading.js +42 -42
  167. package/dist/types.d.ts +5 -4
  168. package/dist/velo-plot.full.js +1951 -1275
  169. package/dist/velo-plot.full.js.map +1 -1
  170. package/dist/velo-plot.js +33 -28
  171. package/dist/velo-plot.js.map +1 -1
  172. package/dist/vue/VeloPlot.vue.d.ts +1 -1
  173. package/dist/vue/index.d.ts +33 -33
  174. package/dist/vue.js +17 -20
  175. package/dist/vue.js.map +1 -1
  176. package/package.json +14 -1
  177. package/dist/ChartCore-BpzRvN4Y.js +0 -8467
  178. package/dist/ChartCore-BpzRvN4Y.js.map +0 -1
  179. package/dist/createStackedChart-Dm-YqUT7.js +0 -756
  180. package/dist/createStackedChart-Dm-YqUT7.js.map +0 -1
  181. package/dist/gpuRenderer-BpaMYz-k.js +0 -1848
  182. package/dist/gpuRenderer-BpaMYz-k.js.map +0 -1
  183. package/dist/index-BMiZoKmm.js.map +0 -1
  184. package/dist/index-qunX30Xu.js.map +0 -1
  185. package/dist/index-x4stH3jD.js +0 -282
  186. package/dist/index-x4stH3jD.js.map +0 -1
  187. package/dist/index.core-BmZe2jRQ.js.map +0 -1
  188. package/dist/mockDatafeed-DHIDPcpX.js +0 -515
  189. package/dist/mockDatafeed-DHIDPcpX.js.map +0 -1
  190. package/dist/symbols-DT0eLlpW.js +0 -568
  191. package/dist/symbols-DT0eLlpW.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"3d.js","sources":["../../src/plugins/3d/math/Mat4.ts","../../src/plugins/3d/camera/OrbitCamera.ts","../../src/plugins/3d/controls/OrbitController.ts","../../src/plugins/3d/shader/sources.ts","../../src/plugins/3d/shader/programs.ts","../../src/plugins/3d/Axes3D.ts","../../src/plugins/3d/Tooltip3D.ts","../../src/plugins/3d/math/Vec3.ts","../../src/plugins/3d/Raycaster3D.ts","../../src/plugins/3d/colorThemes.ts","../../src/plugins/3d/Area3DRenderer.ts","../../src/plugins/3d/mesh/geometry.ts","../../src/plugins/3d/mesh/InstancedMesh.ts","../../src/plugins/3d/Bubble3DRenderer.ts","../../src/plugins/3d/Impulse3DRenderer.ts","../../src/plugins/3d/Line3DRenderer.ts","../../src/plugins/3d/PointCloud3DRenderer.ts","../../src/plugins/3d/Ribbon3DRenderer.ts","../../src/plugins/3d/SurfaceBar3DRenderer.ts","../../src/plugins/3d/series/SurfaceMesh3D.ts","../../src/plugins/3d/SurfaceMesh3DRenderer.ts","../../src/plugins/3d/VectorField3DRenderer.ts","../../src/plugins/3d/Voxel3DRenderer.ts","../../src/plugins/3d/Waterfall3DRenderer.ts","../../src/plugins/3d/series/PointLine3D.ts","../../src/plugins/3d/series/Column3D.ts","../../src/plugins/3d/series/Waterfall3D.ts","../../src/plugins/3d/series/Scatter3D.ts","../../src/plugins/3d/series/Ribbon3D.ts","../../src/plugins/3d/series/Area3D.ts","../../src/plugins/3d/series/Heatmap3D.ts","../../src/plugins/3d/series/Impulse3D.ts","../../src/plugins/3d/index.ts"],"sourcesContent":["/**\n * Minimal 4x4 Matrix math for WebGL 3D rendering.\n * Column-major order (OpenGL/WebGL convention).\n * No external dependencies.\n */\n\nexport type Mat4 = Float32Array;\nexport type Vec3 = [number, number, number];\n\nconst EPSILON = 0.000001;\n\n/** Create identity matrix */\nexport function create(): Mat4 {\n const out = new Float32Array(16);\n out[0] = 1;\n out[5] = 1;\n out[10] = 1;\n out[15] = 1;\n return out;\n}\n\n/** Set matrix to identity */\nexport function identity(out: Mat4): Mat4 {\n out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0;\n out[4] = 0; out[5] = 1; out[6] = 0; out[7] = 0;\n out[8] = 0; out[9] = 0; out[10] = 1; out[11] = 0;\n out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1;\n return out;\n}\n\n/** Copy matrix a to out */\nexport function copy(out: Mat4, a: Mat4): Mat4 {\n out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3];\n out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7];\n out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11];\n out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15];\n return out;\n}\n\n/** Multiply two matrices: out = a * b */\nexport function multiply(out: Mat4, a: Mat4, b: Mat4): Mat4 {\n const a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n const a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n const a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n const a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n\n let b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n return out;\n}\n\n/** Create perspective projection matrix */\nexport function perspective(\n out: Mat4,\n fovY: number,\n aspect: number,\n near: number,\n far: number\n): Mat4 {\n const f = 1.0 / Math.tan(fovY / 2);\n const nf = 1 / (near - far);\n\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = 2 * far * near * nf;\n out[15] = 0;\n\n return out;\n}\n\n/** Create view matrix looking at target from eye position */\nexport function lookAt(\n out: Mat4,\n eye: Vec3,\n center: Vec3,\n up: Vec3\n): Mat4 {\n const eyeX = eye[0], eyeY = eye[1], eyeZ = eye[2];\n const centerX = center[0], centerY = center[1], centerZ = center[2];\n const upX = up[0], upY = up[1], upZ = up[2];\n\n let z0 = eyeX - centerX;\n let z1 = eyeY - centerY;\n let z2 = eyeZ - centerZ;\n\n let len = z0 * z0 + z1 * z1 + z2 * z2;\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n }\n\n let x0 = upY * z2 - upZ * z1;\n let x1 = upZ * z0 - upX * z2;\n let x2 = upX * z1 - upY * z0;\n\n len = x0 * x0 + x1 * x1 + x2 * x2;\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n const y0 = z1 * x2 - z2 * x1;\n const y1 = z2 * x0 - z0 * x2;\n const y2 = z0 * x1 - z1 * x0;\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyeX + x1 * eyeY + x2 * eyeZ);\n out[13] = -(y0 * eyeX + y1 * eyeY + y2 * eyeZ);\n out[14] = -(z0 * eyeX + z1 * eyeY + z2 * eyeZ);\n out[15] = 1;\n\n return out;\n}\n\n/** Translate matrix by vector v */\nexport function translate(out: Mat4, a: Mat4, v: Vec3): Mat4 {\n const x = v[0], y = v[1], z = v[2];\n\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n const a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n const a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n const a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n\n out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03;\n out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13;\n out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23;\n\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n\n return out;\n}\n\n/** Scale matrix by vector v */\nexport function scale(out: Mat4, a: Mat4, v: Vec3): Mat4 {\n const x = v[0], y = v[1], z = v[2];\n\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n\n return out;\n}\n\n/** Rotate matrix around X axis */\nexport function rotateX(out: Mat4, a: Mat4, rad: number): Mat4 {\n const s = Math.sin(rad);\n const c = Math.cos(rad);\n const a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n const a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n\n if (a !== out) {\n out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3];\n out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15];\n }\n\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n\n return out;\n}\n\n/** Rotate matrix around Y axis */\nexport function rotateY(out: Mat4, a: Mat4, rad: number): Mat4 {\n const s = Math.sin(rad);\n const c = Math.cos(rad);\n const a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n const a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n\n if (a !== out) {\n out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7];\n out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15];\n }\n\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n\n return out;\n}\n\n/** Rotate matrix around Z axis */\nexport function rotateZ(out: Mat4, a: Mat4, rad: number): Mat4 {\n const s = Math.sin(rad);\n const c = Math.cos(rad);\n const a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n const a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n\n if (a !== out) {\n out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11];\n out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15];\n }\n\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n\n return out;\n}\n\n/** Invert matrix */\nexport function invert(out: Mat4, a: Mat4): Mat4 | null {\n const a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n const a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n const a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n const a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n\n const b00 = a00 * a11 - a01 * a10;\n const b01 = a00 * a12 - a02 * a10;\n const b02 = a00 * a13 - a03 * a10;\n const b03 = a01 * a12 - a02 * a11;\n const b04 = a01 * a13 - a03 * a11;\n const b05 = a02 * a13 - a03 * a12;\n const b06 = a20 * a31 - a21 * a30;\n const b07 = a20 * a32 - a22 * a30;\n const b08 = a20 * a33 - a23 * a30;\n const b09 = a21 * a32 - a22 * a31;\n const b10 = a21 * a33 - a23 * a31;\n const b11 = a22 * a33 - a23 * a32;\n\n let det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (Math.abs(det) < EPSILON) {\n return null;\n }\n\n det = 1.0 / det;\n\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n\n return out;\n}\n\n/** Create orthographic projection matrix */\nexport function ortho(\n out: Mat4,\n left: number,\n right: number,\n bottom: number,\n top: number,\n near: number,\n far: number\n): Mat4 {\n const lr = 1 / (left - right);\n const bt = 1 / (bottom - top);\n const nf = 1 / (near - far);\n\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n\n return out;\n}\n","/**\n * Orbit camera for 3D scene navigation.\n * Uses spherical coordinates (theta, phi, radius) around a target point.\n */\n\nimport * as Mat4 from '../math/Mat4';\nimport type { Vec3 } from '../math/Mat4';\n\nexport interface OrbitCameraOptions {\n target?: Vec3;\n radius?: number;\n theta?: number; // Horizontal angle (radians)\n phi?: number; // Vertical angle (radians)\n fov?: number; // Field of view (radians)\n near?: number;\n far?: number;\n minRadius?: number;\n maxRadius?: number;\n minPhi?: number; // Prevent flipping at poles\n maxPhi?: number;\n}\n\nexport class OrbitCamera {\n // Target point to orbit around\n target: Vec3 = [0, 0, 0];\n \n // Spherical coordinates\n radius = 5;\n theta = 0; // Horizontal rotation\n phi = Math.PI / 4; // Vertical rotation (0 = top, PI = bottom)\n \n // Projection parameters\n fov = Math.PI / 4; // 45 degrees\n aspect = 1;\n near = 0.1;\n far = 1000;\n \n // Constraints\n minRadius = 0.5;\n maxRadius = 100;\n minPhi = 0.01;\n maxPhi = Math.PI - 0.01;\n \n // Cached matrices\n private viewMatrix: Mat4.Mat4;\n private projMatrix: Mat4.Mat4;\n private viewProjMatrix: Mat4.Mat4;\n private dirty = true;\n \n // Cached eye position\n private eye: Vec3 = [0, 0, 0];\n \n constructor(options: OrbitCameraOptions = {}) {\n this.viewMatrix = Mat4.create();\n this.projMatrix = Mat4.create();\n this.viewProjMatrix = Mat4.create();\n \n if (options.target) this.target = [...options.target];\n if (options.radius !== undefined) this.radius = options.radius;\n if (options.theta !== undefined) this.theta = options.theta;\n if (options.phi !== undefined) this.phi = options.phi;\n if (options.fov !== undefined) this.fov = options.fov;\n if (options.near !== undefined) this.near = options.near;\n if (options.far !== undefined) this.far = options.far;\n if (options.minRadius !== undefined) this.minRadius = options.minRadius;\n if (options.maxRadius !== undefined) this.maxRadius = options.maxRadius;\n if (options.minPhi !== undefined) this.minPhi = options.minPhi;\n if (options.maxPhi !== undefined) this.maxPhi = options.maxPhi;\n \n this.dirty = true;\n }\n \n /**\n * Set aspect ratio (width / height).\n */\n setAspect(aspect: number): void {\n if (this.aspect !== aspect) {\n this.aspect = aspect;\n this.dirty = true;\n }\n }\n \n /**\n * Rotate camera by delta angles.\n */\n rotate(deltaTheta: number, deltaPhi: number): void {\n this.theta += deltaTheta;\n this.phi = Math.max(this.minPhi, Math.min(this.maxPhi, this.phi + deltaPhi));\n this.dirty = true;\n }\n \n /**\n * Zoom camera by delta radius (positive = zoom out).\n */\n zoom(delta: number): void {\n this.radius = Math.max(this.minRadius, Math.min(this.maxRadius, this.radius + delta));\n this.dirty = true;\n }\n \n /**\n * Zoom by factor (1 = no change, <1 = zoom in, >1 = zoom out).\n */\n zoomFactor(factor: number): void {\n this.radius = Math.max(this.minRadius, Math.min(this.maxRadius, this.radius * factor));\n this.dirty = true;\n }\n \n /**\n * Pan camera target by world-space delta.\n */\n pan(deltaX: number, deltaY: number): void {\n // Calculate right and up vectors from current view\n const sinTheta = Math.sin(this.theta);\n const cosTheta = Math.cos(this.theta);\n \n // Right vector (perpendicular to view direction in XZ plane)\n const rightX = cosTheta;\n const rightZ = -sinTheta;\n \n // Up vector (world up for simplicity)\n const upY = 1;\n \n this.target[0] += rightX * deltaX;\n this.target[1] += upY * deltaY;\n this.target[2] += rightZ * deltaX;\n \n this.dirty = true;\n }\n \n /**\n * Set target position directly.\n */\n setTarget(x: number, y: number, z: number): void {\n this.target[0] = x;\n this.target[1] = y;\n this.target[2] = z;\n this.dirty = true;\n }\n \n /**\n * Set camera position from spherical coordinates.\n */\n setSpherical(theta: number, phi: number, radius: number): void {\n this.theta = theta;\n this.phi = Math.max(this.minPhi, Math.min(this.maxPhi, phi));\n this.radius = Math.max(this.minRadius, Math.min(this.maxRadius, radius));\n this.dirty = true;\n }\n \n /**\n * Update matrices if dirty.\n */\n private updateMatrices(): void {\n if (!this.dirty) return;\n \n // Calculate eye position from spherical coordinates\n const sinPhi = Math.sin(this.phi);\n const cosPhi = Math.cos(this.phi);\n const sinTheta = Math.sin(this.theta);\n const cosTheta = Math.cos(this.theta);\n \n this.eye[0] = this.target[0] + this.radius * sinPhi * sinTheta;\n this.eye[1] = this.target[1] + this.radius * cosPhi;\n this.eye[2] = this.target[2] + this.radius * sinPhi * cosTheta;\n \n // View matrix\n Mat4.lookAt(this.viewMatrix, this.eye, this.target, [0, 1, 0]);\n \n // Projection matrix\n Mat4.perspective(this.projMatrix, this.fov, this.aspect, this.near, this.far);\n \n // Combined view-projection matrix\n Mat4.multiply(this.viewProjMatrix, this.projMatrix, this.viewMatrix);\n \n this.dirty = false;\n }\n \n /**\n * Get view matrix.\n */\n getViewMatrix(): Mat4.Mat4 {\n this.updateMatrices();\n return this.viewMatrix;\n }\n \n /**\n * Get projection matrix.\n */\n getProjectionMatrix(): Mat4.Mat4 {\n this.updateMatrices();\n return this.projMatrix;\n }\n \n /**\n * Get combined view-projection matrix.\n */\n getViewProjectionMatrix(): Mat4.Mat4 {\n this.updateMatrices();\n return this.viewProjMatrix;\n }\n \n /**\n * Get current eye position.\n */\n getEyePosition(): Vec3 {\n this.updateMatrices();\n return [...this.eye] as Vec3;\n }\n \n /**\n * Get forward direction (normalized).\n */\n getForwardDirection(): Vec3 {\n this.updateMatrices();\n const dx = this.target[0] - this.eye[0];\n const dy = this.target[1] - this.eye[1];\n const dz = this.target[2] - this.eye[2];\n const len = Math.sqrt(dx * dx + dy * dy + dz * dz);\n return [dx / len, dy / len, dz / len];\n }\n \n /**\n * Reset camera to default position.\n */\n reset(): void {\n this.target = [0, 0, 0];\n this.radius = 5;\n this.theta = 0;\n this.phi = Math.PI / 4;\n this.dirty = true;\n }\n \n /**\n * Fit camera to view a bounding box.\n */\n fitToBounds(\n minX: number, minY: number, minZ: number,\n maxX: number, maxY: number, maxZ: number\n ): void {\n // Center target on bounds center\n this.target[0] = (minX + maxX) / 2;\n this.target[1] = (minY + maxY) / 2;\n this.target[2] = (minZ + maxZ) / 2;\n \n // Calculate radius to fit bounds\n const dx = maxX - minX;\n const dy = maxY - minY;\n const dz = maxZ - minZ;\n const diagonal = Math.sqrt(dx * dx + dy * dy + dz * dz);\n \n // Distance to fit diagonal in view\n this.radius = diagonal / (2 * Math.tan(this.fov / 2));\n this.radius = Math.max(this.minRadius, Math.min(this.maxRadius, this.radius));\n \n this.dirty = true;\n }\n}\n","/**\n * Orbit controller for mouse/touch interaction with OrbitCamera.\n * Handles rotation, zoom, and pan gestures.\n */\n\nimport type { OrbitCamera } from '../camera/OrbitCamera';\n\nexport interface OrbitControllerOptions {\n rotateSpeed?: number;\n zoomSpeed?: number;\n panSpeed?: number;\n enableRotate?: boolean;\n enableZoom?: boolean;\n enablePan?: boolean;\n rotateButton?: number; // 0 = left, 1 = middle, 2 = right\n panButton?: number;\n dampingFactor?: number; // 0 = no damping, 1 = instant stop\n}\n\ninterface PointerState {\n id: number;\n x: number;\n y: number;\n startX: number;\n startY: number;\n}\n\nexport class OrbitController {\n private camera: OrbitCamera;\n private element: HTMLElement;\n \n // Settings\n rotateSpeed = 0.005;\n zoomSpeed = 0.001;\n panSpeed = 0.003; // Reduced for less sensitivity\n enableRotate = true;\n enableZoom = true;\n enablePan = true;\n rotateButton = 0;\n panButton = 2;\n dampingFactor = 0.1;\n \n // State\n private isRotating = false;\n private isPanning = false;\n private lastX = 0;\n private lastY = 0;\n \n // Touch state\n private pointers: Map<number, PointerState> = new Map();\n private lastPinchDistance = 0;\n \n // Velocity for damping\n private velocityTheta = 0;\n private velocityPhi = 0;\n private velocityRadius = 0;\n \n // Callbacks\n private onChangeCallback?: () => void;\n \n // Bound handlers for cleanup\n private boundHandlers: {\n onPointerDown: (e: PointerEvent) => void;\n onPointerMove: (e: PointerEvent) => void;\n onPointerUp: (e: PointerEvent) => void;\n onWheel: (e: WheelEvent) => void;\n onContextMenu: (e: Event) => void;\n };\n \n constructor(\n camera: OrbitCamera,\n element: HTMLElement,\n options: OrbitControllerOptions = {}\n ) {\n this.camera = camera;\n this.element = element;\n \n if (options.rotateSpeed !== undefined) this.rotateSpeed = options.rotateSpeed;\n if (options.zoomSpeed !== undefined) this.zoomSpeed = options.zoomSpeed;\n if (options.panSpeed !== undefined) this.panSpeed = options.panSpeed;\n if (options.enableRotate !== undefined) this.enableRotate = options.enableRotate;\n if (options.enableZoom !== undefined) this.enableZoom = options.enableZoom;\n if (options.enablePan !== undefined) this.enablePan = options.enablePan;\n if (options.rotateButton !== undefined) this.rotateButton = options.rotateButton;\n if (options.panButton !== undefined) this.panButton = options.panButton;\n if (options.dampingFactor !== undefined) this.dampingFactor = options.dampingFactor;\n \n this.boundHandlers = {\n onPointerDown: this.onPointerDown.bind(this),\n onPointerMove: this.onPointerMove.bind(this),\n onPointerUp: this.onPointerUp.bind(this),\n onWheel: this.onWheel.bind(this),\n onContextMenu: (e: Event) => e.preventDefault(),\n };\n \n this.attach();\n }\n \n /**\n * Attach event listeners to element.\n */\n private attach(): void {\n const { element, boundHandlers } = this;\n \n element.addEventListener('pointerdown', boundHandlers.onPointerDown);\n element.addEventListener('pointermove', boundHandlers.onPointerMove);\n element.addEventListener('pointerup', boundHandlers.onPointerUp);\n element.addEventListener('pointercancel', boundHandlers.onPointerUp);\n element.addEventListener('pointerleave', boundHandlers.onPointerUp);\n element.addEventListener('wheel', boundHandlers.onWheel, { passive: false });\n element.addEventListener('contextmenu', boundHandlers.onContextMenu);\n \n element.style.touchAction = 'none';\n }\n \n /**\n * Detach event listeners.\n */\n detach(): void {\n const { element, boundHandlers } = this;\n \n element.removeEventListener('pointerdown', boundHandlers.onPointerDown);\n element.removeEventListener('pointermove', boundHandlers.onPointerMove);\n element.removeEventListener('pointerup', boundHandlers.onPointerUp);\n element.removeEventListener('pointercancel', boundHandlers.onPointerUp);\n element.removeEventListener('pointerleave', boundHandlers.onPointerUp);\n element.removeEventListener('wheel', boundHandlers.onWheel);\n element.removeEventListener('contextmenu', boundHandlers.onContextMenu);\n }\n \n /**\n * Set callback for camera changes.\n */\n onChange(callback: () => void): void {\n this.onChangeCallback = callback;\n }\n \n private notifyChange(): void {\n if (this.onChangeCallback) {\n this.onChangeCallback();\n }\n }\n \n private onPointerDown(e: PointerEvent): void {\n this.element.setPointerCapture(e.pointerId);\n \n this.pointers.set(e.pointerId, {\n id: e.pointerId,\n x: e.clientX,\n y: e.clientY,\n startX: e.clientX,\n startY: e.clientY,\n });\n \n if (this.pointers.size === 1) {\n // Single pointer - rotate or pan\n if (e.button === this.rotateButton && this.enableRotate) {\n this.isRotating = true;\n this.isPanning = false;\n } else if (e.button === this.panButton && this.enablePan) {\n this.isPanning = true;\n this.isRotating = false;\n }\n \n this.lastX = e.clientX;\n this.lastY = e.clientY;\n } else if (this.pointers.size === 2) {\n // Two pointers - pinch zoom\n this.isRotating = false;\n this.isPanning = false;\n this.lastPinchDistance = this.getPinchDistance();\n }\n }\n \n private onPointerMove(e: PointerEvent): void {\n const pointer = this.pointers.get(e.pointerId);\n if (!pointer) return;\n \n pointer.x = e.clientX;\n pointer.y = e.clientY;\n \n if (this.pointers.size === 1) {\n const deltaX = e.clientX - this.lastX;\n const deltaY = e.clientY - this.lastY;\n \n if (this.isRotating && this.enableRotate) {\n this.camera.rotate(\n -deltaX * this.rotateSpeed,\n deltaY * this.rotateSpeed\n );\n this.velocityTheta = -deltaX * this.rotateSpeed;\n this.velocityPhi = deltaY * this.rotateSpeed;\n this.notifyChange();\n } else if (this.isPanning && this.enablePan) {\n const panScale = this.camera.radius * this.panSpeed;\n // Invert Y so that moving mouse up moves content up (natural direction)\n this.camera.pan(-deltaX * panScale, -deltaY * panScale);\n this.notifyChange();\n }\n \n this.lastX = e.clientX;\n this.lastY = e.clientY;\n } else if (this.pointers.size === 2 && this.enableZoom) {\n // Pinch zoom\n const distance = this.getPinchDistance();\n const delta = this.lastPinchDistance - distance;\n \n this.camera.zoom(delta * this.zoomSpeed * this.camera.radius);\n this.lastPinchDistance = distance;\n this.notifyChange();\n }\n }\n \n private onPointerUp(e: PointerEvent): void {\n this.element.releasePointerCapture(e.pointerId);\n this.pointers.delete(e.pointerId);\n \n if (this.pointers.size === 0) {\n this.isRotating = false;\n this.isPanning = false;\n } else if (this.pointers.size === 1) {\n // Switched from pinch to single pointer\n const remaining = this.pointers.values().next().value;\n if (remaining) {\n this.lastX = remaining.x;\n this.lastY = remaining.y;\n }\n }\n }\n \n private onWheel(e: WheelEvent): void {\n e.preventDefault();\n \n if (!this.enableZoom) return;\n \n // Normalize wheel delta across browsers\n let delta = e.deltaY;\n if (e.deltaMode === 1) delta *= 40; // Lines\n if (e.deltaMode === 2) delta *= 800; // Pages\n \n // Zoom proportional to current radius\n const zoomAmount = delta * this.zoomSpeed * this.camera.radius * 0.1;\n this.camera.zoom(zoomAmount);\n this.velocityRadius = zoomAmount;\n this.notifyChange();\n }\n \n private getPinchDistance(): number {\n if (this.pointers.size < 2) return 0;\n \n const pointerArray = Array.from(this.pointers.values());\n const dx = pointerArray[0].x - pointerArray[1].x;\n const dy = pointerArray[0].y - pointerArray[1].y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n \n /**\n * Update damping (call each frame for smooth deceleration).\n * Returns true if camera is still moving.\n */\n update(): boolean {\n if (this.dampingFactor <= 0) return false;\n if (this.isRotating || this.isPanning) return false;\n \n const threshold = 0.0001;\n let moving = false;\n \n if (Math.abs(this.velocityTheta) > threshold || Math.abs(this.velocityPhi) > threshold) {\n this.camera.rotate(this.velocityTheta, this.velocityPhi);\n this.velocityTheta *= (1 - this.dampingFactor);\n this.velocityPhi *= (1 - this.dampingFactor);\n moving = true;\n }\n \n if (Math.abs(this.velocityRadius) > threshold) {\n this.camera.zoom(this.velocityRadius);\n this.velocityRadius *= (1 - this.dampingFactor);\n moving = true;\n }\n \n if (moving) {\n this.notifyChange();\n }\n \n return moving;\n }\n \n /**\n * Stop all momentum.\n */\n stopMomentum(): void {\n this.velocityTheta = 0;\n this.velocityPhi = 0;\n this.velocityRadius = 0;\n }\n \n /**\n * Clean up resources.\n */\n destroy(): void {\n this.detach();\n this.pointers.clear();\n }\n}\n","/**\n * GLSL shader sources for 3D instanced rendering.\n * WebGL2 / GLSL ES 3.00\n */\n\nexport const BUBBLE_VERT = `#version 300 es\nprecision highp float;\n\n// Base geometry vertex\nin vec3 a_position;\n\n// Per-instance attributes\nin vec3 a_instancePos;\nin float a_scale;\nin vec3 a_color;\n\n// Uniforms\nuniform mat4 u_viewProjection;\nuniform float u_opacity;\n\n// Varyings\nout vec3 v_color;\nout vec3 v_normal;\nout vec3 v_worldPos;\n\nvoid main() {\n // Scale and translate instance\n vec3 worldPos = (a_position * a_scale) + a_instancePos;\n \n gl_Position = u_viewProjection * vec4(worldPos, 1.0);\n \n v_color = a_color;\n v_normal = normalize(a_position); // For sphere, normal = normalized position\n v_worldPos = worldPos;\n}\n`;\n\nexport const BUBBLE_FRAG = `#version 300 es\nprecision highp float;\n\nin vec3 v_color;\nin vec3 v_normal;\nin vec3 v_worldPos;\n\nuniform float u_opacity;\nuniform vec3 u_lightDir;\nuniform float u_ambient;\n\nout vec4 fragColor;\n\nvoid main() {\n // Simple diffuse lighting\n vec3 normal = normalize(v_normal);\n vec3 lightDir = normalize(u_lightDir);\n \n float diff = max(dot(normal, lightDir), 0.0);\n float lighting = u_ambient + (1.0 - u_ambient) * diff;\n \n vec3 color = v_color * lighting;\n fragColor = vec4(color, u_opacity);\n}\n`;\n\nexport const BUBBLE_FLAT_FRAG = `#version 300 es\nprecision highp float;\n\nin vec3 v_color;\nin vec3 v_normal;\nin vec3 v_worldPos;\n\nuniform float u_opacity;\n\nout vec4 fragColor;\n\nvoid main() {\n fragColor = vec4(v_color, u_opacity);\n}\n`;\n\n// WebGL1 fallback shaders (GLSL ES 1.00)\nexport const BUBBLE_VERT_WEBGL1 = `\nprecision highp float;\n\n// Base geometry vertex\nattribute vec3 a_position;\n\n// Per-instance attributes\nattribute vec3 a_instancePos;\nattribute float a_scale;\nattribute vec3 a_color;\n\n// Uniforms\nuniform mat4 u_viewProjection;\nuniform float u_opacity;\n\n// Varyings\nvarying vec3 v_color;\nvarying vec3 v_normal;\nvarying vec3 v_worldPos;\n\nvoid main() {\n vec3 worldPos = (a_position * a_scale) + a_instancePos;\n \n gl_Position = u_viewProjection * vec4(worldPos, 1.0);\n \n v_color = a_color;\n v_normal = normalize(a_position);\n v_worldPos = worldPos;\n}\n`;\n\nexport const BUBBLE_FRAG_WEBGL1 = `\nprecision highp float;\n\nvarying vec3 v_color;\nvarying vec3 v_normal;\nvarying vec3 v_worldPos;\n\nuniform float u_opacity;\nuniform vec3 u_lightDir;\nuniform float u_ambient;\n\nvoid main() {\n vec3 normal = normalize(v_normal);\n vec3 lightDir = normalize(u_lightDir);\n \n float diff = max(dot(normal, lightDir), 0.0);\n float lighting = u_ambient + (1.0 - u_ambient) * diff;\n \n vec3 color = v_color * lighting;\n gl_FragColor = vec4(color, u_opacity);\n}\n`;\n\n// Axis/grid shaders\nexport const AXIS_VERT = `#version 300 es\nprecision highp float;\n\nin vec3 a_position;\nin vec3 a_color;\n\nuniform mat4 u_viewProjection;\n\nout vec3 v_color;\n\nvoid main() {\n gl_Position = u_viewProjection * vec4(a_position, 1.0);\n v_color = a_color;\n}\n`;\n\nexport const AXIS_FRAG = `#version 300 es\nprecision highp float;\n\nin vec3 v_color;\nout vec4 fragColor;\n\nvoid main() {\n fragColor = vec4(v_color, 1.0);\n}\n`;\n\n// Surface mesh shader with lighting\nexport const SURFACE_VERT = `#version 300 es\nprecision highp float;\n\nin vec3 a_position;\nin vec3 a_normal;\nin vec3 a_color;\n\nuniform mat4 u_viewProjection;\n\nout vec3 v_color;\nout vec3 v_normal;\nout vec3 v_worldPos;\n\nvoid main() {\n gl_Position = u_viewProjection * vec4(a_position, 1.0);\n v_color = a_color;\n v_normal = a_normal;\n v_worldPos = a_position;\n}\n`;\n\nexport const SURFACE_FRAG = `#version 300 es\nprecision highp float;\n\nin vec3 v_color;\nin vec3 v_normal;\nin vec3 v_worldPos;\n\nuniform float u_opacity;\nuniform vec3 u_lightDir;\nuniform float u_ambient;\n\nout vec4 fragColor;\n\nvoid main() {\n vec3 normal = normalize(v_normal);\n vec3 lightDir = normalize(u_lightDir);\n \n float diff = max(dot(normal, lightDir), 0.0);\n float lighting = u_ambient + (1.0 - u_ambient) * diff;\n \n vec3 color = v_color * lighting;\n fragColor = vec4(color, u_opacity);\n}\n`;\n\n// Line/point shader for PointLine3D, Impulse3D\nexport const LINE_POINT_VERT = `#version 300 es\nprecision highp float;\n\nin vec3 a_position;\nin vec3 a_color;\n\nuniform mat4 u_viewProjection;\nuniform float u_pointSize;\n\nout vec3 v_color;\n\nvoid main() {\n gl_Position = u_viewProjection * vec4(a_position, 1.0);\n gl_PointSize = u_pointSize;\n v_color = a_color;\n}\n`;\n\nexport const LINE_POINT_FRAG = `#version 300 es\nprecision highp float;\n\nin vec3 v_color;\nuniform float u_opacity;\n\nout vec4 fragColor;\n\nvoid main() {\n fragColor = vec4(v_color, u_opacity);\n}\n`;\n\n// Waterfall shader with gradient coloring and lighting\nexport const WATERFALL_VERT = `#version 300 es\nprecision highp float;\n\nin vec3 a_position;\nin vec3 a_color;\nin vec3 a_normal;\n\nuniform mat4 u_viewProjection;\n\nout vec3 v_color;\nout float v_depth;\nout vec3 v_normal;\n\nvoid main() {\n gl_Position = u_viewProjection * vec4(a_position, 1.0);\n v_color = a_color;\n v_depth = a_position.z;\n v_normal = a_normal;\n}\n`;\n\nexport const WATERFALL_FRAG = `#version 300 es\nprecision highp float;\n\nin vec3 v_color;\nin float v_depth;\nin vec3 v_normal;\n\nuniform float u_opacity;\nuniform float u_fadeStart;\nuniform float u_fadeEnd;\nuniform vec3 u_lightDir;\nuniform float u_ambient;\n\nout vec4 fragColor;\n\nvoid main() {\n // Lighting\n vec3 normal = normalize(v_normal);\n vec3 lightDir = normalize(u_lightDir);\n float diff = max(dot(normal, lightDir), 0.0);\n float lighting = u_ambient + (1.0 - u_ambient) * diff;\n \n // Fade based on depth (Z position)\n float fade = 1.0;\n if (u_fadeEnd > u_fadeStart) {\n fade = 1.0 - smoothstep(u_fadeStart, u_fadeEnd, v_depth);\n }\n \n fragColor = vec4(v_color * lighting, u_opacity * fade);\n}\n`;\n// Vector Field shader for Quiver plots\nexport const VECTOR_FIELD_VERT = `#version 300 es\nprecision highp float;\n\nin vec3 a_position; // Base geometry (e.g., arrow)\nin vec3 a_instancePos; // Origin of the vector\nin vec3 a_direction; // Direction vector [dx, dy, dz]\nin vec3 a_color;\nin vec3 a_normal;\n\nuniform mat4 u_viewProjection;\nuniform float u_scaleMultiplier;\n\nout vec3 v_color;\nout vec3 v_normal;\n\nvoid main() {\n float mag = length(a_direction);\n vec3 dir = normalize(a_direction);\n \n // Construct rotation matrix to align with direction\n vec3 up = abs(dir.y) < 0.99 ? vec3(0.0, 1.0, 0.0) : vec3(1.0, 0.0, 0.0);\n vec3 right = normalize(cross(up, dir));\n vec3 actualUp = cross(dir, right);\n mat3 rotation = mat3(right, actualUp, dir);\n \n v_normal = rotation * a_normal;\n \n // Scale based on magnitude\n vec3 scaledPos = a_position * mag * u_scaleMultiplier;\n \n // Rotate and translate\n vec3 worldPos = (rotation * scaledPos) + a_instancePos;\n \n gl_Position = u_viewProjection * vec4(worldPos, 1.0);\n v_color = a_color;\n}\n`;\n\nexport const VECTOR_FIELD_FRAG = `#version 300 es\nprecision highp float;\n\nin vec3 v_color;\nin vec3 v_normal;\nuniform float u_opacity;\nuniform vec3 u_lightDir;\nuniform float u_ambient;\nout vec4 fragColor;\n\nvoid main() {\n vec3 normal = normalize(v_normal);\n vec3 lightDir = normalize(u_lightDir);\n float diff = max(dot(normal, lightDir), 0.0);\n float lighting = u_ambient + (1.0 - u_ambient) * diff;\n fragColor = vec4(v_color * lighting, u_opacity);\n}\n`;\n// Point Cloud shader for massive datasets\nexport const POINT_CLOUD_VERT = `#version 300 es\nprecision highp float;\n\nin vec3 a_position;\nin vec3 a_color;\nin float a_size;\n\nuniform mat4 u_viewProjection;\nuniform float u_globalSize;\n\nout vec3 v_color;\n\nvoid main() {\n gl_Position = u_viewProjection * vec4(a_position, 1.0);\n gl_PointSize = a_size * u_globalSize;\n v_color = a_color;\n \n // Basic depth attenuation (points get smaller with distance)\n gl_PointSize /= gl_Position.w * 0.5;\n}\n`;\n\nexport const POINT_CLOUD_FRAG = `#version 300 es\nprecision highp float;\n\nin vec3 v_color;\nuniform float u_opacity;\nuniform bool u_circular;\n\nout vec4 fragColor;\n\nvoid main() {\n if (u_circular) {\n vec2 dist = gl_PointCoord - vec2(0.5);\n if (dot(dist, dist) > 0.25) discard;\n }\n \n fragColor = vec4(v_color, u_opacity);\n}\n`;\n// Voxel shader for volumetric data\nexport const VOXEL_VERT = `#version 300 es\nprecision highp float;\n\nin vec3 a_position; // Base cube vertex\nin vec3 a_instancePos; // Voxel center\nin float a_value; // Voxel intensity [0, 1]\n\nuniform mat4 u_viewProjection;\nuniform float u_voxelSize;\nuniform float u_threshold;\n\nout float v_value;\nout vec3 v_normal;\n\nvoid main() {\n if (a_value < u_threshold) {\n // Hide voxel if below threshold\n gl_Position = vec4(2.0, 2.0, 2.0, 1.0);\n return;\n }\n \n vec3 worldPos = (a_position * u_voxelSize) + a_instancePos;\n gl_Position = u_viewProjection * vec4(worldPos, 1.0);\n v_value = a_value;\n v_normal = normalize(a_position);\n}\n`;\n\nexport const VOXEL_FRAG = `#version 300 es\nprecision highp float;\n\nin float v_value;\nin vec3 v_normal;\n\nuniform float u_opacity;\nuniform vec3 u_lightDir;\nuniform float u_ambient;\n\nout vec4 fragColor;\n\n// Simple heatmap coloring\nvec3 heatmap(float t) {\n return vec3(t, 1.0 - t, 0.5 + sin(t * 3.14159) * 0.5);\n}\n\nvoid main() {\n vec3 normal = normalize(v_normal);\n vec3 lightDir = normalize(u_lightDir);\n float diff = max(dot(normal, lightDir), 0.0);\n float lighting = u_ambient + (1.0 - u_ambient) * diff;\n \n // Spectral colormap\n vec3 color = vec3(v_value, 0.2, 1.0 - v_value);\n if (v_value > 0.5) color = vec3(1.0, 1.0 - (v_value-0.5)*2.0, 0.0);\n \n fragColor = vec4(color * lighting, u_opacity * v_value);\n}\n`;\n// Ribbon shader for 3D paths with width\nexport const RIBBON_VERT = `#version 300 es\nprecision highp float;\n\nin vec3 a_position;\nin vec3 a_normal;\nin vec3 a_color;\n\nuniform mat4 u_viewProjection;\n\nout vec3 v_color;\nout vec3 v_normal;\n\nvoid main() {\n gl_Position = u_viewProjection * vec4(a_position, 1.0);\n v_color = a_color;\n v_normal = a_normal;\n}\n`;\n\nexport const RIBBON_FRAG = `#version 300 es\nprecision highp float;\n\nin vec3 v_color;\nin vec3 v_normal;\n\nuniform float u_opacity;\nuniform vec3 u_lightDir;\nuniform float u_ambient;\n\nout vec4 fragColor;\n\nvoid main() {\n vec3 normal = normalize(v_normal);\n vec3 lightDir = normalize(u_lightDir);\n float diff = max(dot(normal, lightDir), 0.0);\n float lighting = u_ambient + (1.0 - u_ambient) * diff;\n fragColor = vec4(v_color * lighting, u_opacity);\n}\n`;\n// Surface Bar (3D Histogram) shader\nexport const SURFACE_BAR_VERT = `#version 300 es\nprecision highp float;\n\nin vec3 a_position; // Base cube vertex [-0.5, 0.5]\nin vec3 a_instancePos; // Column base\nin float a_height; // Column height\nin vec3 a_color;\n\nuniform mat4 u_viewProjection;\nuniform float u_barWidth;\nuniform float u_barDepth;\n\nout vec3 v_color;\nout vec3 v_normal;\n\nvoid main() {\n vec3 pos = a_position;\n pos.x *= u_barWidth;\n pos.z *= u_barDepth;\n pos.y = (pos.y + 0.5) * a_height; \n \n vec3 worldPos = pos + a_instancePos;\n gl_Position = u_viewProjection * vec4(worldPos, 1.0);\n \n v_color = a_color;\n // Normals for a cube are essentially the vertex positions normalized if centered at 0\n // But since we offset Y, we just use the original sign for flat shading or simple lighting\n v_normal = normalize(a_position);\n}\n`;\n\nexport const SURFACE_BAR_FRAG = `#version 300 es\nprecision highp float;\n\nin vec3 v_color;\nin vec3 v_normal;\n\nuniform float u_opacity;\nuniform vec3 u_lightDir;\nuniform float u_ambient;\n\nout vec4 fragColor;\n\nvoid main() {\n vec3 normal = normalize(v_normal);\n vec3 lightDir = normalize(u_lightDir);\n float diff = max(dot(normal, lightDir), 0.0);\n float lighting = u_ambient + (1.0 - u_ambient) * diff;\n fragColor = vec4(v_color * lighting, u_opacity);\n}\n`;\n","/**\n * WebGL shader program compilation and management for 3D rendering.\n */\n\nimport {\n BUBBLE_VERT,\n BUBBLE_FRAG,\n BUBBLE_FLAT_FRAG,\n BUBBLE_VERT_WEBGL1,\n BUBBLE_FRAG_WEBGL1,\n AXIS_VERT,\n AXIS_FRAG,\n SURFACE_VERT,\n SURFACE_FRAG,\n LINE_POINT_VERT,\n LINE_POINT_FRAG,\n WATERFALL_VERT,\n WATERFALL_FRAG,\n VECTOR_FIELD_VERT,\n VECTOR_FIELD_FRAG,\n POINT_CLOUD_VERT,\n POINT_CLOUD_FRAG,\n VOXEL_VERT,\n VOXEL_FRAG,\n RIBBON_VERT,\n RIBBON_FRAG,\n SURFACE_BAR_VERT,\n SURFACE_BAR_FRAG,\n} from './sources';\n\nexport interface ShaderProgram3D {\n program: WebGLProgram;\n attributes: Record<string, number>;\n uniforms: Record<string, WebGLUniformLocation | null>;\n}\n\nexport interface ProgramBundle3D {\n bubbleProgram: ShaderProgram3D;\n bubbleFlatProgram: ShaderProgram3D;\n axisProgram: ShaderProgram3D;\n surfaceProgram: ShaderProgram3D;\n linePointProgram: ShaderProgram3D;\n waterfallProgram: ShaderProgram3D;\n vectorFieldProgram: ShaderProgram3D;\n pointCloudProgram: ShaderProgram3D;\n voxelProgram: ShaderProgram3D;\n ribbonProgram: ShaderProgram3D;\n surfaceBarProgram: ShaderProgram3D;\n}\n\nfunction createShader(\n gl: WebGL2RenderingContext | WebGLRenderingContext,\n source: string,\n type: number\n): WebGLShader {\n const shader = gl.createShader(type);\n if (!shader) throw new Error('Failed to create shader');\n\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const error = gl.getShaderInfoLog(shader);\n gl.deleteShader(shader);\n throw new Error(`Shader compilation error: ${error}`);\n }\n\n return shader;\n}\n\nfunction createProgram(\n gl: WebGL2RenderingContext | WebGLRenderingContext,\n vertSource: string,\n fragSource: string,\n attributeNames: string[],\n uniformNames: string[]\n): ShaderProgram3D {\n const vertShader = createShader(gl, vertSource, gl.VERTEX_SHADER);\n const fragShader = createShader(gl, fragSource, gl.FRAGMENT_SHADER);\n\n const program = gl.createProgram();\n if (!program) throw new Error('Failed to create program');\n\n gl.attachShader(program, vertShader);\n gl.attachShader(program, fragShader);\n gl.linkProgram(program);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const error = gl.getProgramInfoLog(program);\n gl.deleteProgram(program);\n throw new Error(`Program link error: ${error}`);\n }\n\n gl.deleteShader(vertShader);\n gl.deleteShader(fragShader);\n\n const attributes: Record<string, number> = {};\n for (const name of attributeNames) {\n attributes[name] = gl.getAttribLocation(program, name);\n }\n\n const uniforms: Record<string, WebGLUniformLocation | null> = {};\n for (const name of uniformNames) {\n uniforms[name] = gl.getUniformLocation(program, name);\n }\n\n return { program, attributes, uniforms };\n}\n\nexport function createProgramBundle3D(\n gl: WebGL2RenderingContext,\n useWebGL1Fallback = false\n): ProgramBundle3D {\n const bubbleAttribs = ['a_position', 'a_instancePos', 'a_scale', 'a_color'];\n const bubbleUniforms = ['u_viewProjection', 'u_opacity', 'u_lightDir', 'u_ambient'];\n\n const vertSource = useWebGL1Fallback ? BUBBLE_VERT_WEBGL1 : BUBBLE_VERT;\n const fragSource = useWebGL1Fallback ? BUBBLE_FRAG_WEBGL1 : BUBBLE_FRAG;\n\n const bubbleProgram = createProgram(\n gl,\n vertSource,\n fragSource,\n bubbleAttribs,\n bubbleUniforms\n );\n\n const bubbleFlatProgram = createProgram(\n gl,\n vertSource,\n useWebGL1Fallback ? BUBBLE_FRAG_WEBGL1 : BUBBLE_FLAT_FRAG,\n bubbleAttribs,\n ['u_viewProjection', 'u_opacity']\n );\n\n const axisProgram = createProgram(\n gl,\n AXIS_VERT,\n AXIS_FRAG,\n ['a_position', 'a_color'],\n ['u_viewProjection']\n );\n\n const surfaceProgram = createProgram(\n gl,\n SURFACE_VERT,\n SURFACE_FRAG,\n ['a_position', 'a_normal', 'a_color'],\n ['u_viewProjection', 'u_opacity', 'u_lightDir', 'u_ambient']\n );\n\n const linePointProgram = createProgram(\n gl,\n LINE_POINT_VERT,\n LINE_POINT_FRAG,\n ['a_position', 'a_color'],\n ['u_viewProjection', 'u_pointSize', 'u_opacity']\n );\n\n const waterfallProgram = createProgram(\n gl,\n WATERFALL_VERT,\n WATERFALL_FRAG,\n ['a_position', 'a_color', 'a_normal'],\n ['u_viewProjection', 'u_opacity', 'u_fadeStart', 'u_fadeEnd', 'u_lightDir', 'u_ambient']\n );\n\n const vectorFieldProgram = createProgram(\n gl,\n VECTOR_FIELD_VERT,\n VECTOR_FIELD_FRAG,\n ['a_position', 'a_normal', 'a_instancePos', 'a_direction', 'a_color'],\n ['u_viewProjection', 'u_opacity', 'u_scaleMultiplier', 'u_lightDir', 'u_ambient']\n );\n\n const pointCloudProgram = createProgram(\n gl,\n POINT_CLOUD_VERT,\n POINT_CLOUD_FRAG,\n ['a_position', 'a_color', 'a_size'],\n ['u_viewProjection', 'u_opacity', 'u_globalSize', 'u_circular']\n );\n\n const voxelProgram = createProgram(\n gl,\n VOXEL_VERT,\n VOXEL_FRAG,\n ['a_position', 'a_instancePos', 'a_value'],\n ['u_viewProjection', 'u_opacity', 'u_voxelSize', 'u_threshold', 'u_lightDir', 'u_ambient']\n );\n\n const ribbonProgram = createProgram(\n gl,\n RIBBON_VERT,\n RIBBON_FRAG,\n ['a_position', 'a_normal', 'a_color'],\n ['u_viewProjection', 'u_opacity', 'u_lightDir', 'u_ambient']\n );\n\n const surfaceBarProgram = createProgram(\n gl,\n SURFACE_BAR_VERT,\n SURFACE_BAR_FRAG,\n ['a_position', 'a_instancePos', 'a_height', 'a_color'],\n ['u_viewProjection', 'u_opacity', 'u_barWidth', 'u_barDepth', 'u_lightDir', 'u_ambient']\n );\n\n return {\n bubbleProgram,\n bubbleFlatProgram,\n axisProgram,\n surfaceProgram,\n linePointProgram,\n waterfallProgram,\n vectorFieldProgram,\n pointCloudProgram,\n voxelProgram,\n ribbonProgram,\n surfaceBarProgram,\n };\n}\n\nexport function deleteProgram(\n gl: WebGL2RenderingContext | WebGLRenderingContext,\n program: ShaderProgram3D\n): void {\n gl.deleteProgram(program.program);\n}\n\nexport function deleteProgramBundle(\n gl: WebGL2RenderingContext | WebGLRenderingContext,\n bundle: ProgramBundle3D\n): void {\n deleteProgram(gl, bundle.bubbleProgram);\n deleteProgram(gl, bundle.bubbleFlatProgram);\n deleteProgram(gl, bundle.axisProgram);\n deleteProgram(gl, bundle.surfaceProgram);\n deleteProgram(gl, bundle.linePointProgram);\n deleteProgram(gl, bundle.waterfallProgram);\n deleteProgram(gl, bundle.vectorFieldProgram);\n deleteProgram(gl, bundle.pointCloudProgram);\n deleteProgram(gl, bundle.voxelProgram);\n deleteProgram(gl, bundle.ribbonProgram);\n deleteProgram(gl, bundle.surfaceBarProgram);\n}\n","/**\n * 3D Axes Renderer\n * Renders X, Y, Z axes with:\n * - Grid lines on 3 wall planes (XZ floor, XY back, YZ side)\n * - Axis lines at the edges of the bounding box\n * - Tick marks with numeric labels\n * - Support for billboard text labels (rendered via 2D canvas overlay)\n */\n\nimport type { Bounds3D, Axis3DConfig } from './types';\n\n/** Axis label info for text overlay rendering */\nexport interface AxisLabel3D {\n text: string;\n worldPosition: [number, number, number];\n axis: 'x' | 'y' | 'z' | 'title';\n color: [number, number, number];\n}\n\n/** Full axis configuration with defaults applied */\nexport interface Axes3DOptions {\n /** X-axis configuration */\n xAxis?: Axis3DConfig & { label?: string; tickFormat?: (v: number) => string };\n /** Y-axis configuration */\n yAxis?: Axis3DConfig & { label?: string; tickFormat?: (v: number) => string };\n /** Z-axis configuration */\n zAxis?: Axis3DConfig & { label?: string; tickFormat?: (v: number) => string };\n /** Show axis lines */\n showAxes?: boolean;\n /** Show wall grids */\n showWallGrids?: boolean;\n /** Show floor grid (XZ plane) */\n showFloorGrid?: boolean;\n /** Grid line color */\n gridColor?: [number, number, number];\n /** Grid line opacity */\n gridOpacity?: number;\n /** Wall grid opacity (slightly more transparent) */\n wallGridOpacity?: number;\n /** Number of ticks per axis */\n tickCount?: number;\n /** Axis line width */\n lineWidth?: number;\n /** Box wireframe color */\n boxColor?: [number, number, number];\n /** Box wireframe opacity */\n boxOpacity?: number;\n}\n\n/** Default axis colors */\nconst AXIS_COLORS = {\n x: [0.9, 0.3, 0.3] as [number, number, number], // Red\n y: [0.3, 0.9, 0.3] as [number, number, number], // Green\n z: [0.3, 0.3, 0.9] as [number, number, number], // Blue\n grid: [0.4, 0.45, 0.5] as [number, number, number], // Subtle gray-blue\n box: [0.3, 0.35, 0.4] as [number, number, number], // Dark box edges\n};\n\nexport class Axes3D {\n private gl: WebGL2RenderingContext;\n \n // Line buffers\n private axisVAO: WebGLVertexArrayObject | null = null;\n private axisPositionBuffer: WebGLBuffer | null = null;\n private axisColorBuffer: WebGLBuffer | null = null;\n \n private gridVAO: WebGLVertexArrayObject | null = null;\n private gridPositionBuffer: WebGLBuffer | null = null;\n private gridColorBuffer: WebGLBuffer | null = null;\n \n private boxVAO: WebGLVertexArrayObject | null = null;\n private boxPositionBuffer: WebGLBuffer | null = null;\n private boxColorBuffer: WebGLBuffer | null = null;\n \n // Line shader program\n private lineProgram: WebGLProgram | null = null;\n private lineUniforms: { [key: string]: WebGLUniformLocation } = {};\n \n // Data\n private axisVertexCount = 0;\n private gridVertexCount = 0;\n private boxVertexCount = 0;\n private bounds: Bounds3D = { minX: -1, maxX: 1, minY: -1, maxY: 1, minZ: -1, maxZ: 1 };\n \n // Labels for text overlay\n private labels: AxisLabel3D[] = [];\n \n // Options\n private options: Required<Axes3DOptions>;\n \n constructor(gl: WebGL2RenderingContext, options?: Axes3DOptions) {\n this.gl = gl;\n \n // Apply defaults\n this.options = {\n xAxis: { visible: true, label: 'X', color: AXIS_COLORS.x, ...options?.xAxis },\n yAxis: { visible: true, label: 'Y', color: AXIS_COLORS.y, ...options?.yAxis },\n zAxis: { visible: true, label: 'Z', color: AXIS_COLORS.z, ...options?.zAxis },\n showAxes: options?.showAxes ?? true,\n showWallGrids: options?.showWallGrids ?? true,\n showFloorGrid: options?.showFloorGrid ?? true,\n gridColor: options?.gridColor ?? AXIS_COLORS.grid,\n gridOpacity: options?.gridOpacity ?? 0.4,\n wallGridOpacity: options?.wallGridOpacity ?? 0.2,\n tickCount: options?.tickCount ?? 5,\n lineWidth: options?.lineWidth ?? 1,\n boxColor: options?.boxColor ?? AXIS_COLORS.box,\n boxOpacity: options?.boxOpacity ?? 0.5,\n };\n \n this.initLineShader();\n this.initBuffers();\n }\n \n private initLineShader(): void {\n const { gl } = this;\n \n const vertexShaderSource = `#version 300 es\n in vec3 a_position;\n in vec3 a_color;\n \n uniform mat4 u_viewProjection;\n \n out vec3 v_color;\n \n void main() {\n gl_Position = u_viewProjection * vec4(a_position, 1.0);\n v_color = a_color;\n }\n `;\n \n const fragmentShaderSource = `#version 300 es\n precision highp float;\n \n in vec3 v_color;\n uniform float u_opacity;\n \n out vec4 fragColor;\n \n void main() {\n fragColor = vec4(v_color, u_opacity);\n }\n `;\n \n // Compile vertex shader\n const vertexShader = gl.createShader(gl.VERTEX_SHADER)!;\n gl.shaderSource(vertexShader, vertexShaderSource);\n gl.compileShader(vertexShader);\n \n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n console.error('Axes vertex shader error:', gl.getShaderInfoLog(vertexShader));\n return;\n }\n \n // Compile fragment shader\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER)!;\n gl.shaderSource(fragmentShader, fragmentShaderSource);\n gl.compileShader(fragmentShader);\n \n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n console.error('Axes fragment shader error:', gl.getShaderInfoLog(fragmentShader));\n return;\n }\n \n // Link program\n this.lineProgram = gl.createProgram()!;\n gl.attachShader(this.lineProgram, vertexShader);\n gl.attachShader(this.lineProgram, fragmentShader);\n gl.linkProgram(this.lineProgram);\n \n if (!gl.getProgramParameter(this.lineProgram, gl.LINK_STATUS)) {\n console.error('Axes program link error:', gl.getProgramInfoLog(this.lineProgram));\n return;\n }\n \n // Get uniform locations\n this.lineUniforms = {\n u_viewProjection: gl.getUniformLocation(this.lineProgram, 'u_viewProjection')!,\n u_opacity: gl.getUniformLocation(this.lineProgram, 'u_opacity')!,\n };\n \n // Cleanup\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n // Axis VAO\n this.axisVAO = gl.createVertexArray();\n this.axisPositionBuffer = gl.createBuffer();\n this.axisColorBuffer = gl.createBuffer();\n \n // Grid VAO\n this.gridVAO = gl.createVertexArray();\n this.gridPositionBuffer = gl.createBuffer();\n this.gridColorBuffer = gl.createBuffer();\n \n // Box VAO\n this.boxVAO = gl.createVertexArray();\n this.boxPositionBuffer = gl.createBuffer();\n this.boxColorBuffer = gl.createBuffer();\n }\n \n /**\n * Update axes geometry based on data bounds\n */\n updateBounds(bounds: Bounds3D): void {\n this.bounds = { ...bounds };\n this.buildBoxGeometry();\n this.buildGridGeometry();\n this.buildAxisGeometry();\n this.buildLabels();\n }\n \n private buildBoxGeometry(): void {\n const { gl, bounds, options } = this;\n \n const { minX, maxX, minY, maxY, minZ, maxZ } = bounds;\n \n const positions: number[] = [];\n const colors: number[] = [];\n const boxColor = options.boxColor;\n \n // Helper to add a line segment\n const addLine = (x1: number, y1: number, z1: number, x2: number, y2: number, z2: number) => {\n positions.push(x1, y1, z1, x2, y2, z2);\n colors.push(...boxColor, ...boxColor);\n };\n \n // Bottom face edges (Y = minY)\n addLine(minX, minY, minZ, maxX, minY, minZ);\n addLine(maxX, minY, minZ, maxX, minY, maxZ);\n addLine(maxX, minY, maxZ, minX, minY, maxZ);\n addLine(minX, minY, maxZ, minX, minY, minZ);\n \n // Top face edges (Y = maxY)\n addLine(minX, maxY, minZ, maxX, maxY, minZ);\n addLine(maxX, maxY, minZ, maxX, maxY, maxZ);\n addLine(maxX, maxY, maxZ, minX, maxY, maxZ);\n addLine(minX, maxY, maxZ, minX, maxY, minZ);\n \n // Vertical edges\n addLine(minX, minY, minZ, minX, maxY, minZ);\n addLine(maxX, minY, minZ, maxX, maxY, minZ);\n addLine(maxX, minY, maxZ, maxX, maxY, maxZ);\n addLine(minX, minY, maxZ, minX, maxY, maxZ);\n \n this.boxVertexCount = positions.length / 3;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.boxPositionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.boxColorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);\n }\n \n private buildGridGeometry(): void {\n const { gl, bounds, options } = this;\n \n const { minX, maxX, minY, maxY, minZ, maxZ } = bounds;\n const gridColor = options.gridColor;\n const tickCount = options.tickCount;\n \n const positions: number[] = [];\n const colors: number[] = [];\n \n // Helper to add grid line\n const addLine = (x1: number, y1: number, z1: number, x2: number, y2: number, z2: number) => {\n positions.push(x1, y1, z1, x2, y2, z2);\n colors.push(...gridColor, ...gridColor);\n };\n \n // Floor grid (XZ plane at Y = minY)\n if (options.showFloorGrid) {\n // Lines parallel to Z\n for (let i = 0; i <= tickCount; i++) {\n const x = minX + (maxX - minX) * (i / tickCount);\n addLine(x, minY, minZ, x, minY, maxZ);\n }\n // Lines parallel to X\n for (let i = 0; i <= tickCount; i++) {\n const z = minZ + (maxZ - minZ) * (i / tickCount);\n addLine(minX, minY, z, maxX, minY, z);\n }\n }\n \n // Back wall grid (XY plane at Z = minZ)\n if (options.showWallGrids) {\n // Lines parallel to Y\n for (let i = 0; i <= tickCount; i++) {\n const x = minX + (maxX - minX) * (i / tickCount);\n addLine(x, minY, minZ, x, maxY, minZ);\n }\n // Lines parallel to X\n for (let i = 0; i <= tickCount; i++) {\n const y = minY + (maxY - minY) * (i / tickCount);\n addLine(minX, y, minZ, maxX, y, minZ);\n }\n }\n \n // Left wall grid (YZ plane at X = minX)\n if (options.showWallGrids) {\n // Lines parallel to Z\n for (let i = 0; i <= tickCount; i++) {\n const y = minY + (maxY - minY) * (i / tickCount);\n addLine(minX, y, minZ, minX, y, maxZ);\n }\n // Lines parallel to Y\n for (let i = 0; i <= tickCount; i++) {\n const z = minZ + (maxZ - minZ) * (i / tickCount);\n addLine(minX, minY, z, minX, maxY, z);\n }\n }\n \n this.gridVertexCount = positions.length / 3;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.gridPositionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.gridColorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);\n }\n \n private buildAxisGeometry(): void {\n const { gl, bounds, options } = this;\n \n const { minX, maxX, minY, maxY, minZ, maxZ } = bounds;\n const tickLen = (maxX - minX) * 0.02;\n \n const positions: number[] = [];\n const colors: number[] = [];\n \n const addLine = (x1: number, y1: number, z1: number, x2: number, y2: number, z2: number, color: [number, number, number]) => {\n positions.push(x1, y1, z1, x2, y2, z2);\n colors.push(...color, ...color);\n };\n \n // X-axis at bottom-front edge\n if (options.xAxis.visible !== false) {\n const xColor = options.xAxis.color || AXIS_COLORS.x;\n // Main axis line\n addLine(minX, minY, maxZ, maxX, minY, maxZ, xColor);\n \n // Tick marks\n for (let i = 0; i <= options.tickCount; i++) {\n const x = minX + (maxX - minX) * (i / options.tickCount);\n addLine(x, minY, maxZ, x, minY - tickLen, maxZ, xColor);\n addLine(x, minY, maxZ, x, minY, maxZ + tickLen, xColor);\n }\n }\n \n // Y-axis at left-front edge\n if (options.yAxis.visible !== false) {\n const yColor = options.yAxis.color || AXIS_COLORS.y;\n // Main axis line\n addLine(minX, minY, maxZ, minX, maxY, maxZ, yColor);\n \n // Tick marks\n for (let i = 0; i <= options.tickCount; i++) {\n const y = minY + (maxY - minY) * (i / options.tickCount);\n addLine(minX, y, maxZ, minX - tickLen, y, maxZ, yColor);\n addLine(minX, y, maxZ, minX, y, maxZ + tickLen, yColor);\n }\n }\n \n // Z-axis at bottom-left edge\n if (options.zAxis.visible !== false) {\n const zColor = options.zAxis.color || AXIS_COLORS.z;\n // Main axis line\n addLine(minX, minY, minZ, minX, minY, maxZ, zColor);\n \n // Tick marks\n for (let i = 0; i <= options.tickCount; i++) {\n const z = minZ + (maxZ - minZ) * (i / options.tickCount);\n addLine(minX, minY, z, minX - tickLen, minY, z, zColor);\n addLine(minX, minY, z, minX, minY - tickLen, z, zColor);\n }\n }\n \n this.axisVertexCount = positions.length / 3;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.axisPositionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.axisColorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);\n }\n \n private buildLabels(): void {\n const { bounds, options } = this;\n const { minX, maxX, minY, maxY, minZ, maxZ } = bounds;\n \n this.labels = [];\n \n const formatNumber = (v: number): string => {\n if (Math.abs(v) < 0.001 && v !== 0) return v.toExponential(1);\n if (Math.abs(v) >= 10000) return v.toExponential(1);\n return v.toFixed(1);\n };\n \n const offset = (maxX - minX) * 0.08;\n \n // X-axis labels (at bottom-front)\n if (options.xAxis.visible !== false) {\n const xColor = options.xAxis.color || AXIS_COLORS.x;\n const formatter = options.xAxis.tickFormat || formatNumber;\n \n for (let i = 0; i <= options.tickCount; i++) {\n const t = i / options.tickCount;\n const x = minX + (maxX - minX) * t;\n const value = minX + (maxX - minX) * t;\n this.labels.push({\n text: formatter(value),\n worldPosition: [x, minY - offset, maxZ + offset],\n axis: 'x',\n color: xColor,\n });\n }\n \n // Axis title\n if (options.xAxis.label) {\n this.labels.push({\n text: options.xAxis.label,\n worldPosition: [(minX + maxX) / 2, minY - offset * 2.5, maxZ + offset],\n axis: 'title',\n color: xColor,\n });\n }\n }\n \n // Y-axis labels (at left-front)\n if (options.yAxis.visible !== false) {\n const yColor = options.yAxis.color || AXIS_COLORS.y;\n const formatter = options.yAxis.tickFormat || formatNumber;\n \n for (let i = 0; i <= options.tickCount; i++) {\n const t = i / options.tickCount;\n const y = minY + (maxY - minY) * t;\n const value = minY + (maxY - minY) * t;\n this.labels.push({\n text: formatter(value),\n worldPosition: [minX - offset, y, maxZ + offset],\n axis: 'y',\n color: yColor,\n });\n }\n \n // Axis title\n if (options.yAxis.label) {\n this.labels.push({\n text: options.yAxis.label,\n worldPosition: [minX - offset * 2.5, (minY + maxY) / 2, maxZ + offset],\n axis: 'title',\n color: yColor,\n });\n }\n }\n \n // Z-axis labels (at bottom-left)\n if (options.zAxis.visible !== false) {\n const zColor = options.zAxis.color || AXIS_COLORS.z;\n const formatter = options.zAxis.tickFormat || formatNumber;\n \n for (let i = 0; i <= options.tickCount; i++) {\n const t = i / options.tickCount;\n const z = minZ + (maxZ - minZ) * t;\n const value = minZ + (maxZ - minZ) * t;\n this.labels.push({\n text: formatter(value),\n worldPosition: [minX - offset, minY - offset, z],\n axis: 'z',\n color: zColor,\n });\n }\n \n // Axis title\n if (options.zAxis.label) {\n this.labels.push({\n text: options.zAxis.label,\n worldPosition: [minX - offset * 2.5, minY - offset, (minZ + maxZ) / 2],\n axis: 'title',\n color: zColor,\n });\n }\n }\n }\n \n /**\n * Render axes and grid\n */\n render(viewProjectionMatrix: Float32Array): void {\n const { gl, options } = this;\n \n if (!this.lineProgram) return;\n \n gl.useProgram(this.lineProgram);\n gl.uniformMatrix4fv(this.lineUniforms.u_viewProjection, false, viewProjectionMatrix);\n \n // Render box wireframe\n if (this.boxVertexCount > 0) {\n gl.uniform1f(this.lineUniforms.u_opacity, options.boxOpacity);\n this.renderLines(this.boxVAO!, this.boxPositionBuffer!, this.boxColorBuffer!, this.boxVertexCount);\n }\n \n // Render grids\n if (this.gridVertexCount > 0) {\n gl.uniform1f(this.lineUniforms.u_opacity, options.gridOpacity);\n this.renderLines(this.gridVAO!, this.gridPositionBuffer!, this.gridColorBuffer!, this.gridVertexCount);\n }\n \n // Render axes\n if (options.showAxes && this.axisVertexCount > 0) {\n gl.uniform1f(this.lineUniforms.u_opacity, 1.0);\n this.renderLines(this.axisVAO!, this.axisPositionBuffer!, this.axisColorBuffer!, this.axisVertexCount);\n }\n \n // Reset GL state for next renderer\n gl.useProgram(null);\n }\n \n private renderLines(vao: WebGLVertexArrayObject, posBuffer: WebGLBuffer, colorBuffer: WebGLBuffer, count: number): void {\n const { gl, lineProgram } = this;\n \n if (!lineProgram) return;\n \n gl.bindVertexArray(vao);\n \n // Position attribute\n const posLoc = gl.getAttribLocation(lineProgram, 'a_position');\n gl.bindBuffer(gl.ARRAY_BUFFER, posBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(posLoc, 0);\n \n // Color attribute\n const colorLoc = gl.getAttribLocation(lineProgram, 'a_color');\n gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(colorLoc, 0);\n \n // Draw lines\n gl.drawArrays(gl.LINES, 0, count);\n \n // Cleanup\n gl.disableVertexAttribArray(posLoc);\n gl.disableVertexAttribArray(colorLoc);\n gl.bindVertexArray(null);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);\n }\n \n /**\n * Get labels for 2D text overlay rendering.\n * Returns world positions that need to be projected to screen coordinates.\n */\n getLabels(): AxisLabel3D[] {\n return this.labels;\n }\n \n /**\n * Project a 3D world position to 2D screen coordinates.\n */\n projectToScreen(\n worldPos: [number, number, number],\n viewProjectionMatrix: Float32Array,\n canvasWidth: number,\n canvasHeight: number\n ): { x: number; y: number; visible: boolean } {\n // Transform to clip space\n const [wx, wy, wz] = worldPos;\n const m = viewProjectionMatrix;\n \n const clipX = m[0] * wx + m[4] * wy + m[8] * wz + m[12];\n const clipY = m[1] * wx + m[5] * wy + m[9] * wz + m[13];\n const clipZ = m[2] * wx + m[6] * wy + m[10] * wz + m[14];\n const clipW = m[3] * wx + m[7] * wy + m[11] * wz + m[15];\n \n // Perspective divide\n if (clipW <= 0) return { x: 0, y: 0, visible: false };\n \n const ndcX = clipX / clipW;\n const ndcY = clipY / clipW;\n const ndcZ = clipZ / clipW;\n \n // Check if visible (in front of camera and within view)\n const visible = ndcZ >= -1 && ndcZ <= 1 && \n ndcX >= -1.5 && ndcX <= 1.5 && \n ndcY >= -1.5 && ndcY <= 1.5;\n \n // Convert to screen coordinates\n const screenX = (ndcX + 1) * 0.5 * canvasWidth;\n const screenY = (1 - ndcY) * 0.5 * canvasHeight; // Flip Y\n \n return { x: screenX, y: screenY, visible };\n }\n \n /**\n * Update options\n */\n setOptions(options: Partial<Axes3DOptions>): void {\n Object.assign(this.options, options);\n this.buildBoxGeometry();\n this.buildGridGeometry();\n this.buildAxisGeometry();\n this.buildLabels();\n }\n \n /**\n * Cleanup resources\n */\n destroy(): void {\n const { gl } = this;\n \n if (this.axisVAO) gl.deleteVertexArray(this.axisVAO);\n if (this.axisPositionBuffer) gl.deleteBuffer(this.axisPositionBuffer);\n if (this.axisColorBuffer) gl.deleteBuffer(this.axisColorBuffer);\n \n if (this.gridVAO) gl.deleteVertexArray(this.gridVAO);\n if (this.gridPositionBuffer) gl.deleteBuffer(this.gridPositionBuffer);\n if (this.gridColorBuffer) gl.deleteBuffer(this.gridColorBuffer);\n \n if (this.boxVAO) gl.deleteVertexArray(this.boxVAO);\n if (this.boxPositionBuffer) gl.deleteBuffer(this.boxPositionBuffer);\n if (this.boxColorBuffer) gl.deleteBuffer(this.boxColorBuffer);\n \n if (this.lineProgram) gl.deleteProgram(this.lineProgram);\n }\n}\n","/**\n * 3D Tooltip for displaying information on hover.\n * Creates a DOM element that follows the mouse and shows data.\n */\n\nexport interface Tooltip3DOptions {\n /** CSS class for the tooltip container */\n className?: string;\n /** Offset from cursor in pixels */\n offsetX?: number;\n offsetY?: number;\n /** Custom formatter function */\n formatter?: (data: Tooltip3DData) => string;\n /** Show position coordinates */\n showPosition?: boolean;\n /** Show value/scale */\n showScale?: boolean;\n /** Show index */\n showIndex?: boolean;\n /** Decimal places for numbers */\n decimals?: number;\n}\n\nexport interface Tooltip3DData {\n index: number;\n position: [number, number, number];\n color?: [number, number, number];\n scale?: number;\n customData?: Record<string, any>;\n}\n\nexport class Tooltip3D {\n private container: HTMLElement;\n private element: HTMLElement;\n private options: Required<Omit<Tooltip3DOptions, 'formatter'>> & { formatter?: (data: Tooltip3DData) => string };\n private visible = false;\n \n constructor(container: HTMLElement, options: Tooltip3DOptions = {}) {\n this.container = container;\n this.options = {\n className: options.className ?? 'tooltip-3d',\n offsetX: options.offsetX ?? 15,\n offsetY: options.offsetY ?? 15,\n showPosition: options.showPosition ?? true,\n showScale: options.showScale ?? false,\n showIndex: options.showIndex ?? true,\n decimals: options.decimals ?? 2,\n formatter: options.formatter,\n };\n \n // Create tooltip element\n this.element = document.createElement('div');\n this.element.className = this.options.className;\n this.element.style.cssText = `\n position: absolute;\n pointer-events: none;\n z-index: 1000;\n padding: 8px 12px;\n background: rgba(0, 0, 0, 0.85);\n color: white;\n border-radius: 6px;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 12px;\n line-height: 1.4;\n white-space: nowrap;\n opacity: 0;\n transition: opacity 0.15s ease;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n border: 1px solid rgba(255, 255, 255, 0.1);\n `;\n \n document.body.appendChild(this.element);\n }\n \n /**\n * Show tooltip with data at screen position.\n */\n show(data: Tooltip3DData, screenX: number, screenY: number): void {\n const content = this.options.formatter\n ? this.options.formatter(data)\n : this.defaultFormat(data);\n \n this.element.innerHTML = content;\n this.visible = true;\n \n // Position relative to container\n const containerRect = this.container.getBoundingClientRect();\n const x = containerRect.left + screenX + this.options.offsetX;\n const y = containerRect.top + screenY + this.options.offsetY;\n \n // Keep within viewport\n const elementRect = this.element.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n \n let finalX = x;\n let finalY = y;\n \n if (x + elementRect.width > viewportWidth - 10) {\n finalX = x - elementRect.width - this.options.offsetX * 2;\n }\n if (y + elementRect.height > viewportHeight - 10) {\n finalY = y - elementRect.height - this.options.offsetY * 2;\n }\n \n this.element.style.left = `${finalX}px`;\n this.element.style.top = `${finalY}px`;\n this.element.style.opacity = '1';\n }\n \n /**\n * Hide the tooltip.\n */\n hide(): void {\n this.visible = false;\n this.element.style.opacity = '0';\n }\n \n /**\n * Check if tooltip is visible.\n */\n isVisible(): boolean {\n return this.visible;\n }\n \n /**\n * Default formatting for tooltip content.\n */\n private defaultFormat(data: Tooltip3DData): string {\n const lines: string[] = [];\n const d = this.options.decimals;\n \n if (this.options.showIndex) {\n lines.push(`<strong>Point ${data.index}</strong>`);\n }\n \n if (this.options.showPosition) {\n lines.push(`X: ${data.position[0].toFixed(d)}`);\n lines.push(`Y: ${data.position[1].toFixed(d)}`);\n lines.push(`Z: ${data.position[2].toFixed(d)}`);\n }\n \n if (this.options.showScale && data.scale !== undefined) {\n lines.push(`Size: ${data.scale.toFixed(d)}`);\n }\n \n // Color indicator\n if (data.color) {\n const r = Math.round(data.color[0] * 255);\n const g = Math.round(data.color[1] * 255);\n const b = Math.round(data.color[2] * 255);\n lines.push(`<span style=\"display:inline-block;width:12px;height:12px;background:rgb(${r},${g},${b});border-radius:2px;vertical-align:middle;margin-right:4px\"></span>RGB(${r}, ${g}, ${b})`);\n }\n \n // Custom data\n if (data.customData) {\n for (const [key, value] of Object.entries(data.customData)) {\n lines.push(`${key}: ${value}`);\n }\n }\n \n return lines.join('<br>');\n }\n \n /**\n * Update tooltip position (for mouse move without data change).\n */\n updatePosition(screenX: number, screenY: number): void {\n if (!this.visible) return;\n \n const containerRect = this.container.getBoundingClientRect();\n const x = containerRect.left + screenX + this.options.offsetX;\n const y = containerRect.top + screenY + this.options.offsetY;\n \n this.element.style.left = `${x}px`;\n this.element.style.top = `${y}px`;\n }\n \n /**\n * Destroy the tooltip.\n */\n destroy(): void {\n this.element.remove();\n }\n}\n\n/**\n * Create a hover handler for bubble charts.\n * Returns a function to attach to mouse move events.\n */\nexport function createHoverHandler(\n renderer: any, // Bubble3DRenderer\n tooltip: Tooltip3D,\n options: {\n debounceMs?: number;\n onHover?: (hit: { index: number; data: any } | null) => void;\n } = {}\n): (event: MouseEvent) => void {\n let lastHitIndex = -1;\n let debounceTimer: number | null = null;\n const debounceMs = options.debounceMs ?? 16; // ~60fps\n \n return (event: MouseEvent) => {\n if (debounceTimer !== null) {\n clearTimeout(debounceTimer);\n }\n \n debounceTimer = window.setTimeout(() => {\n const rect = (event.target as HTMLElement).getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n \n const hit = renderer.pickAtScreen(x, y);\n \n if (hit) {\n if (hit.index !== lastHitIndex) {\n lastHitIndex = hit.index;\n \n const bubbleData = renderer.getBubbleData(hit.index);\n if (bubbleData) {\n tooltip.show({\n index: hit.index,\n position: bubbleData.position,\n color: bubbleData.color,\n scale: bubbleData.scale,\n }, x, y);\n \n options.onHover?.({\n index: hit.index,\n data: bubbleData,\n });\n }\n } else {\n tooltip.updatePosition(x, y);\n }\n } else {\n if (lastHitIndex !== -1) {\n tooltip.hide();\n lastHitIndex = -1;\n options.onHover?.(null);\n }\n }\n \n debounceTimer = null;\n }, debounceMs);\n };\n}\n","/**\n * Minimal Vec3 utilities for 3D math.\n * No external dependencies.\n */\n\nexport type Vec3 = [number, number, number];\n\n/** Create a new Vec3 */\nexport function create(x = 0, y = 0, z = 0): Vec3 {\n return [x, y, z];\n}\n\n/** Clone a Vec3 */\nexport function clone(a: Vec3): Vec3 {\n return [a[0], a[1], a[2]];\n}\n\n/** Copy Vec3 a to out */\nexport function copy(out: Vec3, a: Vec3): Vec3 {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n\n/** Set Vec3 values */\nexport function set(out: Vec3, x: number, y: number, z: number): Vec3 {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n\n/** Add two Vec3: out = a + b */\nexport function add(out: Vec3, a: Vec3, b: Vec3): Vec3 {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n\n/** Subtract two Vec3: out = a - b */\nexport function subtract(out: Vec3, a: Vec3, b: Vec3): Vec3 {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n\n/** Scale Vec3: out = a * scalar */\nexport function scale(out: Vec3, a: Vec3, s: number): Vec3 {\n out[0] = a[0] * s;\n out[1] = a[1] * s;\n out[2] = a[2] * s;\n return out;\n}\n\n/** Normalize Vec3 */\nexport function normalize(out: Vec3, a: Vec3): Vec3 {\n const x = a[0], y = a[1], z = a[2];\n let len = x * x + y * y + z * z;\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n }\n out[0] = x * len;\n out[1] = y * len;\n out[2] = z * len;\n return out;\n}\n\n/** Dot product of two Vec3 */\nexport function dot(a: Vec3, b: Vec3): number {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\n/** Cross product: out = a × b */\nexport function cross(out: Vec3, a: Vec3, b: Vec3): Vec3 {\n const ax = a[0], ay = a[1], az = a[2];\n const bx = b[0], by = b[1], bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n\n/** Length of Vec3 */\nexport function length(a: Vec3): number {\n return Math.sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2]);\n}\n\n/** Squared length of Vec3 */\nexport function squaredLength(a: Vec3): number {\n return a[0] * a[0] + a[1] * a[1] + a[2] * a[2];\n}\n\n/** Distance between two Vec3 */\nexport function distance(a: Vec3, b: Vec3): number {\n const dx = b[0] - a[0];\n const dy = b[1] - a[1];\n const dz = b[2] - a[2];\n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n}\n\n/** Linear interpolation: out = a + t * (b - a) */\nexport function lerp(out: Vec3, a: Vec3, b: Vec3, t: number): Vec3 {\n out[0] = a[0] + t * (b[0] - a[0]);\n out[1] = a[1] + t * (b[1] - a[1]);\n out[2] = a[2] + t * (b[2] - a[2]);\n return out;\n}\n\n/** Negate Vec3: out = -a */\nexport function negate(out: Vec3, a: Vec3): Vec3 {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n\n/** Transform Vec3 by Mat4 (assumes w=1) */\nexport function transformMat4(out: Vec3, a: Vec3, m: Float32Array): Vec3 {\n const x = a[0], y = a[1], z = a[2];\n const w = m[3] * x + m[7] * y + m[11] * z + m[15] || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n","/**\n * 3D Raycasting utilities for picking/selection.\n * Implements ray-sphere intersection for bubble selection.\n */\n\nimport { Mat4 } from './math';\n\nexport interface Ray3D {\n origin: [number, number, number];\n direction: [number, number, number];\n}\n\nexport interface HitResult {\n index: number;\n distance: number;\n point: [number, number, number];\n}\n\n/**\n * Creates a ray from screen coordinates through the scene.\n * @param screenX Screen X coordinate (pixels from left)\n * @param screenY Screen Y coordinate (pixels from top)\n * @param canvasWidth Canvas width in pixels\n * @param canvasHeight Canvas height in pixels\n * @param viewProjectionMatrix Combined view-projection matrix\n * @returns Ray in world space\n */\nexport function createRayFromScreen(\n screenX: number,\n screenY: number,\n canvasWidth: number,\n canvasHeight: number,\n viewProjectionMatrix: Float32Array\n): Ray3D {\n // Convert screen coordinates to NDC (-1 to 1)\n const ndcX = (screenX / canvasWidth) * 2 - 1;\n const ndcY = -((screenY / canvasHeight) * 2 - 1); // Flip Y\n \n // Invert the view-projection matrix\n const invViewProj = Mat4.create();\n Mat4.invert(invViewProj, viewProjectionMatrix);\n \n // Create near and far points in NDC\n const nearPoint = [ndcX, ndcY, -1, 1] as const;\n const farPoint = [ndcX, ndcY, 1, 1] as const;\n \n // Transform to world space\n const nearWorld = transformPoint4(invViewProj, nearPoint);\n const farWorld = transformPoint4(invViewProj, farPoint);\n \n // Perspective divide\n const origin: [number, number, number] = [\n nearWorld[0] / nearWorld[3],\n nearWorld[1] / nearWorld[3],\n nearWorld[2] / nearWorld[3],\n ];\n \n const far: [number, number, number] = [\n farWorld[0] / farWorld[3],\n farWorld[1] / farWorld[3],\n farWorld[2] / farWorld[3],\n ];\n \n // Direction is far - near, normalized\n const direction: [number, number, number] = [\n far[0] - origin[0],\n far[1] - origin[1],\n far[2] - origin[2],\n ];\n \n const len = Math.sqrt(\n direction[0] * direction[0] +\n direction[1] * direction[1] +\n direction[2] * direction[2]\n );\n \n direction[0] /= len;\n direction[1] /= len;\n direction[2] /= len;\n \n return { origin, direction };\n}\n\n/**\n * Transform a 4D point by a 4x4 matrix.\n */\nfunction transformPoint4(\n m: Float32Array,\n p: readonly [number, number, number, number]\n): [number, number, number, number] {\n return [\n m[0] * p[0] + m[4] * p[1] + m[8] * p[2] + m[12] * p[3],\n m[1] * p[0] + m[5] * p[1] + m[9] * p[2] + m[13] * p[3],\n m[2] * p[0] + m[6] * p[1] + m[10] * p[2] + m[14] * p[3],\n m[3] * p[0] + m[7] * p[1] + m[11] * p[2] + m[15] * p[3],\n ];\n}\n\n/**\n * Test ray-sphere intersection.\n * @param ray The ray to test\n * @param center Sphere center\n * @param radius Sphere radius\n * @returns Distance to intersection, or null if no hit\n */\nexport function raySphereIntersection(\n ray: Ray3D,\n center: [number, number, number],\n radius: number\n): number | null {\n // Vector from ray origin to sphere center\n const oc: [number, number, number] = [\n ray.origin[0] - center[0],\n ray.origin[1] - center[1],\n ray.origin[2] - center[2],\n ];\n \n // Coefficients for quadratic equation\n // a = 1 (direction is normalized)\n const a = 1;\n const b = 2 * (\n oc[0] * ray.direction[0] +\n oc[1] * ray.direction[1] +\n oc[2] * ray.direction[2]\n );\n const c = (\n oc[0] * oc[0] +\n oc[1] * oc[1] +\n oc[2] * oc[2]\n ) - radius * radius;\n \n const discriminant = b * b - 4 * a * c;\n \n if (discriminant < 0) {\n return null; // No intersection\n }\n \n // Find the nearest positive root\n const sqrtD = Math.sqrt(discriminant);\n const t1 = (-b - sqrtD) / (2 * a);\n const t2 = (-b + sqrtD) / (2 * a);\n \n if (t1 > 0) return t1;\n if (t2 > 0) return t2;\n \n return null; // Intersection is behind ray origin\n}\n\n/**\n * Find the closest bubble hit by a ray.\n * @param ray The ray to test\n * @param positions Float32Array of positions (x,y,z interleaved)\n * @param scales Float32Array of scales (radii)\n * @param baseRadius Base radius multiplier\n * @returns Hit result or null if no hit\n */\nexport function pickBubble(\n ray: Ray3D,\n positions: Float32Array,\n scales: Float32Array,\n baseRadius = 1\n): HitResult | null {\n const count = scales.length;\n let closestHit: HitResult | null = null;\n \n for (let i = 0; i < count; i++) {\n const center: [number, number, number] = [\n positions[i * 3],\n positions[i * 3 + 1],\n positions[i * 3 + 2],\n ];\n const radius = scales[i] * baseRadius;\n \n const distance = raySphereIntersection(ray, center, radius);\n \n if (distance !== null) {\n if (closestHit === null || distance < closestHit.distance) {\n // Calculate hit point\n const point: [number, number, number] = [\n ray.origin[0] + ray.direction[0] * distance,\n ray.origin[1] + ray.direction[1] * distance,\n ray.origin[2] + ray.direction[2] * distance,\n ];\n \n closestHit = {\n index: i,\n distance,\n point,\n };\n }\n }\n }\n \n return closestHit;\n}\n\n/**\n * Batch pick bubbles - returns all bubbles within a tolerance of the ray.\n * More efficient for hover detection.\n */\nexport function pickBubblesInRange(\n ray: Ray3D,\n positions: Float32Array,\n scales: Float32Array,\n baseRadius = 1,\n maxResults = 10\n): HitResult[] {\n const count = scales.length;\n const hits: HitResult[] = [];\n \n for (let i = 0; i < count; i++) {\n const center: [number, number, number] = [\n positions[i * 3],\n positions[i * 3 + 1],\n positions[i * 3 + 2],\n ];\n const radius = scales[i] * baseRadius;\n \n const distance = raySphereIntersection(ray, center, radius);\n \n if (distance !== null) {\n const point: [number, number, number] = [\n ray.origin[0] + ray.direction[0] * distance,\n ray.origin[1] + ray.direction[1] * distance,\n ray.origin[2] + ray.direction[2] * distance,\n ];\n \n hits.push({ index: i, distance, point });\n \n if (hits.length >= maxResults) break;\n }\n }\n \n // Sort by distance\n hits.sort((a, b) => a.distance - b.distance);\n \n return hits;\n}\n\n/**\n * Calculate distance from a point to a ray (for approximate/fast picking).\n */\nexport function pointToRayDistance(\n ray: Ray3D,\n point: [number, number, number]\n): number {\n // Vector from ray origin to point\n const v: [number, number, number] = [\n point[0] - ray.origin[0],\n point[1] - ray.origin[1],\n point[2] - ray.origin[2],\n ];\n \n // Project onto ray direction\n const t = (\n v[0] * ray.direction[0] +\n v[1] * ray.direction[1] +\n v[2] * ray.direction[2]\n );\n \n // Closest point on ray\n const closest: [number, number, number] = [\n ray.origin[0] + ray.direction[0] * t,\n ray.origin[1] + ray.direction[1] * t,\n ray.origin[2] + ray.direction[2] * t,\n ];\n \n // Distance from point to closest point on ray\n const dx = point[0] - closest[0];\n const dy = point[1] - closest[1];\n const dz = point[2] - closest[2];\n \n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n}\n\n/**\n * Result of a surface mesh hit test\n */\nexport interface SurfaceHitResult {\n /** Distance from ray origin to hit point */\n distance: number;\n /** Hit point in world coordinates */\n point: [number, number, number];\n /** Grid row and column indices */\n row: number;\n col: number;\n /** Interpolated Y value at hit point */\n yValue: number;\n /** Barycentric coordinates for interpolation */\n baryU: number;\n baryV: number;\n}\n\n/**\n * Ray-triangle intersection using Möller-Trumbore algorithm.\n * Returns distance to intersection or null if no hit.\n */\nexport function rayTriangleIntersection(\n ray: Ray3D,\n v0: [number, number, number],\n v1: [number, number, number],\n v2: [number, number, number]\n): { distance: number; u: number; v: number } | null {\n const EPSILON = 0.000001;\n \n // Edge vectors\n const e1: [number, number, number] = [\n v1[0] - v0[0],\n v1[1] - v0[1],\n v1[2] - v0[2],\n ];\n const e2: [number, number, number] = [\n v2[0] - v0[0],\n v2[1] - v0[1],\n v2[2] - v0[2],\n ];\n \n // Cross product: ray.direction x e2\n const h: [number, number, number] = [\n ray.direction[1] * e2[2] - ray.direction[2] * e2[1],\n ray.direction[2] * e2[0] - ray.direction[0] * e2[2],\n ray.direction[0] * e2[1] - ray.direction[1] * e2[0],\n ];\n \n // Dot product: e1 . h\n const a = e1[0] * h[0] + e1[1] * h[1] + e1[2] * h[2];\n \n // Ray parallel to triangle\n if (a > -EPSILON && a < EPSILON) {\n return null;\n }\n \n const f = 1.0 / a;\n \n // Vector from v0 to ray origin\n const s: [number, number, number] = [\n ray.origin[0] - v0[0],\n ray.origin[1] - v0[1],\n ray.origin[2] - v0[2],\n ];\n \n // First barycentric coordinate\n const u = f * (s[0] * h[0] + s[1] * h[1] + s[2] * h[2]);\n \n if (u < 0.0 || u > 1.0) {\n return null;\n }\n \n // Cross product: s x e1\n const q: [number, number, number] = [\n s[1] * e1[2] - s[2] * e1[1],\n s[2] * e1[0] - s[0] * e1[2],\n s[0] * e1[1] - s[1] * e1[0],\n ];\n \n // Second barycentric coordinate\n const v = f * (ray.direction[0] * q[0] + ray.direction[1] * q[1] + ray.direction[2] * q[2]);\n \n if (v < 0.0 || u + v > 1.0) {\n return null;\n }\n \n // Distance to intersection\n const t = f * (e2[0] * q[0] + e2[1] * q[1] + e2[2] * q[2]);\n \n if (t > EPSILON) {\n return { distance: t, u, v };\n }\n \n return null;\n}\n\n/**\n * Pick a point on a surface mesh grid.\n * Tests ray against all triangles in the grid.\n * \n * @param ray The picking ray\n * @param xValues X coordinates array (columns)\n * @param zValues Z coordinates array (rows)\n * @param yValues Y values array (row-major: row * cols + col)\n * @returns Hit result or null if no intersection\n */\nexport function pickSurfaceMesh(\n ray: Ray3D,\n xValues: Float32Array,\n zValues: Float32Array,\n yValues: Float32Array\n): SurfaceHitResult | null {\n const cols = xValues.length;\n const rows = zValues.length;\n \n let closestHit: SurfaceHitResult | null = null;\n \n // Iterate through all quads (each quad = 2 triangles)\n for (let row = 0; row < rows - 1; row++) {\n for (let col = 0; col < cols - 1; col++) {\n // Get the 4 corners of the quad\n const i00 = row * cols + col;\n const i10 = row * cols + col + 1;\n const i01 = (row + 1) * cols + col;\n const i11 = (row + 1) * cols + col + 1;\n \n const v00: [number, number, number] = [xValues[col], yValues[i00], zValues[row]];\n const v10: [number, number, number] = [xValues[col + 1], yValues[i10], zValues[row]];\n const v01: [number, number, number] = [xValues[col], yValues[i01], zValues[row + 1]];\n const v11: [number, number, number] = [xValues[col + 1], yValues[i11], zValues[row + 1]];\n \n // Triangle 1: v00, v01, v10\n const hit1 = rayTriangleIntersection(ray, v00, v01, v10);\n if (hit1 && (closestHit === null || hit1.distance < closestHit.distance)) {\n const point: [number, number, number] = [\n ray.origin[0] + ray.direction[0] * hit1.distance,\n ray.origin[1] + ray.direction[1] * hit1.distance,\n ray.origin[2] + ray.direction[2] * hit1.distance,\n ];\n \n // Interpolate Y value using barycentric coordinates\n const w = 1 - hit1.u - hit1.v;\n const yInterp = w * yValues[i00] + hit1.u * yValues[i01] + hit1.v * yValues[i10];\n \n closestHit = {\n distance: hit1.distance,\n point,\n row,\n col,\n yValue: yInterp,\n baryU: hit1.u,\n baryV: hit1.v,\n };\n }\n \n // Triangle 2: v10, v01, v11\n const hit2 = rayTriangleIntersection(ray, v10, v01, v11);\n if (hit2 && (closestHit === null || hit2.distance < closestHit.distance)) {\n const point: [number, number, number] = [\n ray.origin[0] + ray.direction[0] * hit2.distance,\n ray.origin[1] + ray.direction[1] * hit2.distance,\n ray.origin[2] + ray.direction[2] * hit2.distance,\n ];\n \n const w = 1 - hit2.u - hit2.v;\n const yInterp = w * yValues[i10] + hit2.u * yValues[i01] + hit2.v * yValues[i11];\n \n closestHit = {\n distance: hit2.distance,\n point,\n row,\n col: col + 1,\n yValue: yInterp,\n baryU: hit2.u,\n baryV: hit2.v,\n };\n }\n }\n }\n \n return closestHit;\n}\n\n/**\n * Calculate the shortest distance between a ray and a line segment.\n * Useful for picking lines and thin tubes.\n */\nexport function raySegmentDistance(\n ray: Ray3D,\n p0: [number, number, number],\n p1: [number, number, number]\n): { distance: number; pointOnRay: [number, number, number]; pointOnSegment: [number, number, number]; t: number } {\n const v = [p1[0] - p0[0], p1[1] - p0[1], p1[2] - p0[2]];\n const u = ray.direction;\n const w = [ray.origin[0] - p0[0], ray.origin[1] - p0[1], ray.origin[2] - p0[2]];\n\n const a = u[0] * u[0] + u[1] * u[1] + u[2] * u[2];\n const b = u[0] * v[0] + u[1] * v[1] + u[2] * v[2];\n const c = v[0] * v[0] + v[1] * v[1] + v[2] * v[2];\n const d = u[0] * w[0] + u[1] * w[1] + u[2] * w[2];\n const e = v[0] * w[0] + v[1] * w[1] + v[2] * w[2];\n\n const D = a * c - b * b;\n let sc, tc;\n\n if (D < 0.0001) {\n sc = 0.0;\n tc = (b > c ? d / b : e / c);\n } else {\n sc = (b * e - c * d) / D;\n tc = (a * e - b * d) / D;\n }\n\n // Clamp tc to [0, 1] segment range\n tc = Math.max(0, Math.min(1, tc));\n \n // Point on ray P(sc) = origin + sc * direction (only if sc > 0)\n sc = Math.max(0, sc);\n\n const closestOnRay: [number, number, number] = [\n ray.origin[0] + sc * u[0],\n ray.origin[1] + sc * u[1],\n ray.origin[2] + sc * u[2]\n ];\n\n const closestOnSegment: [number, number, number] = [\n p0[0] + tc * v[0],\n p0[1] + tc * v[1],\n p0[2] + tc * v[2]\n ];\n\n const dx = closestOnRay[0] - closestOnSegment[0];\n const dy = closestOnRay[1] - closestOnSegment[1];\n const dz = closestOnRay[2] - closestOnSegment[2];\n const dist = Math.sqrt(dx * dx + dy * dy + dz * dz);\n\n return {\n distance: dist,\n pointOnRay: closestOnRay,\n pointOnSegment: closestOnSegment,\n t: tc\n };\n}\n\n/**\n * Pick a series index and point index from a 3D line.\n */\nexport function pickLine(\n ray: Ray3D,\n lines: { x: Float32Array; y: Float32Array; z: Float32Array }[],\n threshold: number = 0.5\n): { seriesIndex: number; pointIndex: number; distance: number; point: [number, number, number] } | null {\n let closest: { seriesIndex: number; pointIndex: number; distance: number; point: [number, number, number] } | null = null;\n let minDist = threshold;\n\n for (let s = 0; s < lines.length; s++) {\n const line = lines[s];\n for (let i = 0; i < line.x.length - 1; i++) {\n const p0: [number, number, number] = [line.x[i], line.y[i], line.z[i]];\n const p1: [number, number, number] = [line.x[i+1], line.y[i+1], line.z[i+1]];\n \n const res = raySegmentDistance(ray, p0, p1);\n if (res.distance < minDist) {\n minDist = res.distance;\n closest = {\n seriesIndex: s,\n pointIndex: i + (res.t > 0.5 ? 1 : 0),\n distance: res.distance,\n point: res.pointOnSegment\n };\n }\n }\n }\n\n return closest;\n}\n\n/**\n * Pick a point from an impulse/stem series.\n */\nexport function pickImpulse(\n ray: Ray3D,\n data: { x: Float32Array; y: Float32Array; z: Float32Array; baseY?: number },\n threshold: number = 0.3\n): { index: number; distance: number; point: [number, number, number] } | null {\n let closest: { index: number; distance: number; point: [number, number, number] } | null = null;\n let minDist = threshold;\n const baseY = data.baseY ?? 0;\n\n for (let i = 0; i < data.x.length; i++) {\n const p0: [number, number, number] = [data.x[i], baseY, data.z[i]];\n const p1: [number, number, number] = [data.x[i], data.y[i], data.z[i]];\n\n const res = raySegmentDistance(ray, p0, p1);\n if (res.distance < minDist) {\n minDist = res.distance;\n closest = {\n index: i,\n distance: res.distance,\n point: [data.x[i], data.y[i], data.z[i]]\n };\n }\n }\n\n return closest;\n}\n\n/**\n * Pick a series index and point index from a 3D area (curtain).\n * Checks the top line of the area.\n */\nexport function pickArea(\n ray: Ray3D,\n areas: { x: Float32Array; y: Float32Array; z: Float32Array; baseY?: number }[],\n threshold: number = 0.5\n): { seriesIndex: number; pointIndex: number; distance: number; point: [number, number, number] } | null {\n return pickLine(ray, areas, threshold);\n}\n\n\n\n","/**\n * Color palettes and themes for 3D charts\n * Provides optimized color schemes for both dark and light backgrounds\n */\n\nexport type ColorPalette = Array<[number, number, number]>;\n\nexport interface ColorTheme {\n /** Series color palette */\n seriesPalette: ColorPalette;\n /** Highlight color for hover states */\n highlightColor: [number, number, number];\n /** Default background color */\n backgroundColor?: [number, number, number, number];\n}\n\n/**\n * Dark theme - optimized for dark backgrounds\n * Uses vibrant, saturated colors that pop against dark backgrounds\n */\nexport const DARK_THEME: ColorTheme = {\n seriesPalette: [\n [0.3, 0.7, 1.0], // Bright Blue\n [1.0, 0.5, 0.3], // Bright Orange\n [0.3, 0.95, 0.6], // Bright Green\n [1.0, 0.4, 0.9], // Bright Magenta\n [1.0, 0.95, 0.3], // Bright Yellow\n [0.6, 0.4, 1.0], // Bright Purple\n [0.4, 0.95, 0.95], // Bright Cyan\n [1.0, 0.7, 0.4], // Bright Peach\n ],\n highlightColor: [1.0, 1.0, 0.9], // Bright white-yellow\n backgroundColor: [0.05, 0.05, 0.1, 1],\n};\n\n/**\n * Light theme - optimized for light backgrounds\n * Uses deeper, more saturated colors that stand out against white/light backgrounds\n */\nexport const LIGHT_THEME: ColorTheme = {\n seriesPalette: [\n [0.2, 0.4, 0.8], // Deep Blue\n [0.9, 0.4, 0.1], // Deep Orange\n [0.1, 0.6, 0.3], // Deep Green\n [0.7, 0.2, 0.6], // Deep Magenta\n [0.8, 0.7, 0.1], // Deep Yellow\n [0.4, 0.2, 0.7], // Deep Purple\n [0.1, 0.5, 0.6], // Deep Teal\n [0.7, 0.3, 0.2], // Deep Brown\n ],\n highlightColor: [0.1, 0.1, 0.5], // Deep navy blue for contrast\n backgroundColor: [0.95, 0.95, 0.98, 1],\n};\n\n/**\n * Auto-detect theme based on background color luminance\n */\nexport function getThemeFromBackground(\n backgroundColor: [number, number, number, number]\n): ColorTheme {\n const [r, g, b] = backgroundColor;\n // Calculate relative luminance\n const luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b;\n \n // If background is light (luminance > 0.5), use light theme\n return luminance > 0.5 ? LIGHT_THEME : DARK_THEME;\n}\n\n/**\n * Create a custom theme or merge with defaults\n */\nexport interface CustomThemeOptions {\n /** Custom series palette (overrides default) */\n seriesPalette?: ColorPalette;\n /** Custom highlight color (overrides default) */\n highlightColor?: [number, number, number];\n /** Base theme to use ('dark' | 'light' | 'auto') */\n baseTheme?: 'dark' | 'light' | 'auto';\n}\n\nexport function createTheme(\n options: CustomThemeOptions,\n backgroundColor?: [number, number, number, number]\n): ColorTheme {\n let baseTheme: ColorTheme;\n \n if (options.baseTheme === 'dark') {\n baseTheme = DARK_THEME;\n } else if (options.baseTheme === 'light') {\n baseTheme = LIGHT_THEME;\n } else {\n // Auto-detect from background\n baseTheme = backgroundColor \n ? getThemeFromBackground(backgroundColor)\n : DARK_THEME;\n }\n \n return {\n seriesPalette: options.seriesPalette ?? baseTheme.seriesPalette,\n highlightColor: options.highlightColor ?? baseTheme.highlightColor,\n backgroundColor: baseTheme.backgroundColor,\n };\n}\n","/**\n * Area 3D Renderer\n * Renders filled areas (curtain effect) as continuous surfaces.\n * Creates a mesh from a line down to a base plane.\n */\n\nimport { OrbitCamera, type OrbitCameraOptions } from './camera/OrbitCamera';\nimport { OrbitController, type OrbitControllerOptions } from './controls/OrbitController';\nimport {\n createProgramBundle3D,\n deleteProgramBundle,\n type ProgramBundle3D,\n} from './shader/programs';\nimport { Axes3D, type Axes3DOptions } from './Axes3D';\nimport { Tooltip3D, type Tooltip3DOptions } from './Tooltip3D';\nimport type {\n Renderer3DOptions,\n Bounds3D,\n RenderStats3D,\n Renderer3DEvent,\n Renderer3DEventCallback,\n} from './types';\nimport { createRayFromScreen, pickArea } from './Raycaster3D';\nimport { createTheme, type CustomThemeOptions, type ColorTheme } from './colorThemes';\n\nexport interface AreaSeriesData {\n /** X coordinates */\n x: Float32Array;\n /** Y coordinates (top of area) */\n y: Float32Array;\n /** Z coordinates */\n z: Float32Array;\n /** Base Y value (bottom of area, default: 0) */\n baseY?: number;\n /** Color per vertex (optional, RGB) */\n colors?: Float32Array;\n /** Single area color [r, g, b] */\n color?: [number, number, number];\n}\n\nexport interface Area3DRendererOptions extends Renderer3DOptions {\n camera?: OrbitCameraOptions;\n controls?: OrbitControllerOptions;\n axes?: Axes3DOptions;\n showAxes?: boolean;\n /** Opacity of areas (default: 0.8) */\n opacity?: number;\n /** Enable tooltips (default: true) */\n enableTooltip?: boolean;\n tooltip?: Tooltip3DOptions;\n /** Color theme options */\n theme?: CustomThemeOptions;\n}\n\nexport class Area3DRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGL2RenderingContext;\n private dpr: number;\n \n private programs: ProgramBundle3D;\n private camera: OrbitCamera;\n private controller: OrbitController;\n private axes: Axes3D | null = null;\n \n // Geometry buffers\n private vao: WebGLVertexArrayObject | null = null;\n private positionBuffer: WebGLBuffer | null = null;\n private normalBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n private indexCount = 0;\n \n private backgroundColor: [number, number, number, number] = [0.05, 0.05, 0.1, 1];\n private showAxes: boolean;\n private opacity: number;\n \n private areas: AreaSeriesData[] = [];\n private bounds: Bounds3D | null = null;\n \n private animationFrameId: number | null = null;\n private needsRender = true;\n \n private eventListeners: Map<string, Set<Renderer3DEventCallback>> = new Map();\n \n // Hover highlight\n private hoveredSeriesIndex: number | null = null;\n private colorTheme: ColorTheme;\n \n // Tooltip\n private tooltip: Tooltip3D | null = null;\n private enableTooltip: boolean;\n private lastHitIndex: { series: number, point: number } | null = null;\n private boundHandleMouseMove?: (e: MouseEvent) => void;\n private boundHandleMouseLeave?: () => void;\n \n // Stats\n private lastFrameTime = 0;\n private frameCount = 0;\n private fps = 0;\n private lastFpsUpdate = 0;\n \n constructor(options: Area3DRendererOptions) {\n this.canvas = options.canvas;\n this.dpr = window.devicePixelRatio || 1;\n this.showAxes = options.showAxes ?? true;\n this.opacity = options.opacity ?? 0.8;\n this.enableTooltip = options.enableTooltip ?? true;\n \n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor;\n }\n \n // Initialize color theme\n this.colorTheme = createTheme(options.theme || {}, this.backgroundColor);\n \n // Get WebGL2 context\n const gl = this.canvas.getContext('webgl2', {\n alpha: true,\n antialias: true,\n preserveDrawingBuffer: false,\n });\n \n if (!gl) {\n throw new Error('WebGL2 not supported');\n }\n this.gl = gl;\n \n // Enable depth testing and blending\n gl.enable(gl.DEPTH_TEST);\n gl.depthFunc(gl.LEQUAL);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n \n // Create shader programs\n this.programs = createProgramBundle3D(gl);\n \n // Create buffers\n this.initBuffers();\n \n // Create camera\n this.camera = new OrbitCamera(options.camera);\n \n // Create controller\n this.controller = new OrbitController(this.camera, this.canvas, options.controls);\n this.controller.onChange(() => {\n this.needsRender = true;\n this.emitEvent('cameraChange');\n });\n \n // Create axes\n if (this.showAxes) {\n this.axes = new Axes3D(gl, options.axes);\n }\n \n // Initialize tooltip\n if (this.enableTooltip) {\n this.tooltip = new Tooltip3D(this.canvas.parentElement || document.body, options.tooltip);\n \n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseLeave = this.handleMouseLeave.bind(this);\n this.canvas.addEventListener('mousemove', this.boundHandleMouseMove);\n this.canvas.addEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n \n // Handle resize\n this.resize();\n window.addEventListener('resize', this.handleResize);\n \n // Start render loop\n this.startRenderLoop();\n }\n\n private handleMouseMove(e: MouseEvent): void {\n if (this.areas.length === 0) return;\n \n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n \n const hit = this.pickAtScreen(x, y);\n \n // Update hovered series\n const newHoveredIndex = hit ? hit.seriesIndex : null;\n if (newHoveredIndex !== this.hoveredSeriesIndex) {\n this.hoveredSeriesIndex = newHoveredIndex;\n this.buildAreaGeometry();\n this.needsRender = true;\n }\n \n // Tooltip logic\n if (this.tooltip) {\n if (hit) {\n const isNew = !this.lastHitIndex || \n this.lastHitIndex.series !== hit.seriesIndex || \n this.lastHitIndex.point !== hit.pointIndex;\n \n if (isNew) {\n this.lastHitIndex = { series: hit.seriesIndex, point: hit.pointIndex };\n const area = this.areas[hit.seriesIndex];\n const color = area.color || [0.5, 0.7, 1.0];\n \n this.tooltip.show({\n index: hit.pointIndex,\n position: [area.x[hit.pointIndex], area.y[hit.pointIndex], area.z[hit.pointIndex]],\n color: color,\n customData: { series: hit.seriesIndex }\n }, x, y);\n } else {\n this.tooltip.updatePosition(x, y);\n }\n } else {\n if (this.lastHitIndex) {\n this.tooltip.hide();\n this.lastHitIndex = null;\n }\n }\n }\n }\n\n private handleMouseLeave(): void {\n // Reset highlight\n if (this.hoveredSeriesIndex !== null) {\n this.hoveredSeriesIndex = null;\n this.buildAreaGeometry();\n this.needsRender = true;\n }\n \n if (this.tooltip) {\n this.tooltip.hide();\n this.lastHitIndex = null;\n }\n }\n\n pickAtScreen(screenX: number, screenY: number) {\n if (this.areas.length === 0) return null;\n \n const { width, height } = this.getCanvasSize();\n const viewProj = this.camera.getViewProjectionMatrix();\n const ray = createRayFromScreen(screenX, screenY, width, height, viewProj);\n \n return pickArea(ray, this.areas, 0.5);\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n this.positionBuffer = gl.createBuffer();\n this.normalBuffer = gl.createBuffer();\n this.colorBuffer = gl.createBuffer();\n this.indexBuffer = gl.createBuffer();\n \n gl.bindVertexArray(null);\n }\n \n private handleResize = (): void => {\n this.resize();\n this.needsRender = true;\n };\n \n resize(): void {\n const { canvas, gl, dpr, camera } = this;\n \n const width = canvas.clientWidth;\n const height = canvas.clientHeight;\n \n canvas.width = width * dpr;\n canvas.height = height * dpr;\n \n gl.viewport(0, 0, canvas.width, canvas.height);\n camera.aspect = width / height;\n }\n \n /**\n * Set area data (single area or array of areas)\n */\n setData(areas: AreaSeriesData | AreaSeriesData[]): void {\n this.areas = Array.isArray(areas) ? areas : [areas];\n this.buildAreaGeometry();\n this.calculateBounds();\n \n if (this.axes && this.bounds) {\n this.axes.updateBounds(this.bounds);\n }\n \n this.needsRender = true;\n this.emitEvent('dataUpdate');\n }\n \n /**\n * Add a single area\n */\n addArea(area: AreaSeriesData): void {\n this.areas.push(area);\n this.buildAreaGeometry();\n this.calculateBounds();\n \n if (this.axes && this.bounds) {\n this.axes.updateBounds(this.bounds);\n }\n \n this.needsRender = true;\n }\n \n /**\n * Clear all areas\n */\n clearAreas(): void {\n this.areas = [];\n this.indexCount = 0;\n this.needsRender = true;\n }\n \n private buildAreaGeometry(): void {\n const { gl, areas } = this;\n \n if (areas.length === 0) {\n this.indexCount = 0;\n return;\n }\n \n const allPositions: number[] = [];\n const allNormals: number[] = [];\n const allColors: number[] = [];\n const allIndices: number[] = [];\n let vertexOffset = 0;\n \n // Get color palette from theme\n const colorPalette = this.colorTheme.seriesPalette;\n const highlightColor = this.colorTheme.highlightColor;\n \n for (let areaIdx = 0; areaIdx < areas.length; areaIdx++) {\n const area = areas[areaIdx];\n const pointCount = area.x.length;\n if (pointCount < 2) continue;\n \n // Use highlight color if this series is hovered\n const isHovered = areaIdx === this.hoveredSeriesIndex;\n const defaultColor = isHovered\n ? highlightColor\n : (area.color ?? colorPalette[areaIdx % colorPalette.length]);\n \n const baseY = area.baseY ?? 0;\n \n // For each segment, create a quad (2 triangles)\n // Top-left, Top-right, Bottom-left, Bottom-right pattern\n for (let i = 0; i < pointCount; i++) {\n const x = area.x[i];\n const y = area.y[i];\n const z = area.z[i];\n \n // Top vertex\n allPositions.push(x, y, z);\n // Bottom vertex\n allPositions.push(x, baseY, z);\n \n // Calculate normal (perpendicular to surface)\n // For a curtain, the normal points in the Z direction\n // (or we can calculate from adjacent points)\n let nx = 0, ny = 0, nz = 1;\n \n if (i < pointCount - 1) {\n // Forward direction\n const dx = area.x[i + 1] - area.x[i];\n const dy = area.y[i + 1] - area.y[i];\n const dz = area.z[i + 1] - area.z[i];\n \n // Cross product with up vector to get normal\n // normal = forward × up\n nx = dy * 0 - 0 * 1; // dz=0 assumed for curtain\n ny = 0 * dx - dx * 0;\n nz = dx * 1 - dy * 0;\n \n // Actually, for curtain facing outward, use perpendicular in XZ plane\n // Simplified: normal perpendicular to line direction in XZ\n const len = Math.sqrt(dx * dx + dz * dz);\n if (len > 0.001) {\n nx = -dz / len;\n ny = 0;\n nz = dx / len;\n }\n }\n \n // Same normal for top and bottom\n allNormals.push(nx, ny, nz);\n allNormals.push(nx, ny, nz);\n \n // Colors with gradient (darker at base)\n if (area.colors) {\n const r = area.colors[i * 3];\n const g = area.colors[i * 3 + 1];\n const b = area.colors[i * 3 + 2];\n allColors.push(r, g, b); // Top\n allColors.push(r * 0.5, g * 0.5, b * 0.5); // Bottom (darker)\n } else {\n allColors.push(defaultColor[0], defaultColor[1], defaultColor[2]); // Top\n allColors.push(defaultColor[0] * 0.5, defaultColor[1] * 0.5, defaultColor[2] * 0.6); // Bottom\n }\n \n // Generate indices (connect to next segment)\n if (i < pointCount - 1) {\n const topLeft = vertexOffset + i * 2;\n const bottomLeft = topLeft + 1;\n const topRight = topLeft + 2;\n const bottomRight = topLeft + 3;\n \n // Two triangles per quad\n allIndices.push(topLeft, bottomLeft, topRight);\n allIndices.push(topRight, bottomLeft, bottomRight);\n }\n }\n \n vertexOffset += pointCount * 2;\n }\n \n // Upload to GPU\n const positions = new Float32Array(allPositions);\n const normals = new Float32Array(allNormals);\n const colors = new Float32Array(allColors);\n const indices = new Uint32Array(allIndices);\n \n this.indexCount = indices.length;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, normals, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n }\n \n private calculateBounds(): void {\n if (this.areas.length === 0) {\n this.bounds = null;\n return;\n }\n \n let minX = Infinity, maxX = -Infinity;\n let minY = Infinity, maxY = -Infinity;\n let minZ = Infinity, maxZ = -Infinity;\n \n for (const area of this.areas) {\n const baseY = area.baseY ?? 0;\n if (baseY < minY) minY = baseY;\n \n for (let i = 0; i < area.x.length; i++) {\n if (area.x[i] < minX) minX = area.x[i];\n if (area.x[i] > maxX) maxX = area.x[i];\n if (area.y[i] < minY) minY = area.y[i];\n if (area.y[i] > maxY) maxY = area.y[i];\n if (area.z[i] < minZ) minZ = area.z[i];\n if (area.z[i] > maxZ) maxZ = area.z[i];\n }\n }\n \n this.bounds = { minX, maxX, minY, maxY, minZ, maxZ };\n }\n \n /**\n * Fit camera to show all data\n */\n fitToData(): void {\n if (!this.bounds) return;\n \n const { minX, maxX, minY, maxY, minZ, maxZ } = this.bounds;\n \n // Add 20% padding to bounds for better fit\n const dx = maxX - minX;\n const dy = maxY - minY;\n const dz = maxZ - minZ;\n const padding = 0.001;\n \n this.camera.fitToBounds(\n minX - dx * padding, minY - dy * padding, minZ - dz * padding,\n maxX + dx * padding, maxY + dy * padding, maxZ + dz * padding\n );\n \n // Closer fit\n this.camera.radius *= 1.05;\n \n this.needsRender = true;\n }\n \n getCanvasSize(): { width: number; height: number } {\n const rect = this.canvas.getBoundingClientRect();\n return { width: rect.width, height: rect.height };\n }\n\n /**\n * Render a single frame\n */\n render(): void {\n const { gl, camera, backgroundColor } = this;\n \n const startTime = performance.now();\n \n // Clear\n gl.clearColor(\n backgroundColor[0],\n backgroundColor[1],\n backgroundColor[2],\n backgroundColor[3]\n );\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n \n // Get view projection matrix\n const viewProj = camera.getViewProjectionMatrix();\n \n // Render axes first\n if (this.axes) {\n this.axes.render(viewProj);\n }\n \n // Render areas\n if (this.indexCount > 0) {\n const program = this.programs.surfaceProgram;\n gl.useProgram(program.program);\n \n gl.uniformMatrix4fv(program.uniforms['u_viewProjection'], false, viewProj);\n gl.uniform1f(program.uniforms['u_opacity'], this.opacity);\n gl.uniform3f(program.uniforms['u_lightDir'], 1, 1, 1);\n gl.uniform1f(program.uniforms['u_ambient'], 0.6);\n \n gl.bindVertexArray(this.vao);\n \n // Position\n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n // Normal\n const normalLoc = program.attributes['a_normal'];\n if (normalLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.enableVertexAttribArray(normalLoc);\n gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n // Color\n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.drawElements(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0);\n \n gl.bindVertexArray(null);\n }\n \n // Update stats\n const frameTime = performance.now() - startTime;\n this.lastFrameTime = frameTime;\n this.frameCount++;\n \n const now = performance.now();\n if (now - this.lastFpsUpdate >= 1000) {\n this.fps = this.frameCount;\n this.frameCount = 0;\n this.lastFpsUpdate = now;\n }\n \n this.emitEvent('render');\n }\n \n startRenderLoop(): void {\n if (this.animationFrameId !== null) return;\n \n const loop = (): void => {\n this.controller.update();\n \n if (this.needsRender) {\n this.render();\n this.needsRender = false;\n }\n \n this.animationFrameId = requestAnimationFrame(loop);\n };\n \n loop();\n }\n \n stopRenderLoop(): void {\n if (this.animationFrameId !== null) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n }\n \n getStats(): RenderStats3D {\n return {\n fps: this.fps,\n instanceCount: this.indexCount / 6,\n frameTime: this.lastFrameTime,\n drawCalls: 1,\n };\n }\n \n getCamera(): OrbitCamera {\n return this.camera;\n }\n \n getAxisLabels() {\n if (!this.axes) return [];\n return this.axes.getLabels();\n }\n\n getViewProjectionMatrix(): Float32Array {\n return this.camera.getViewProjectionMatrix();\n }\n\n projectToScreen(worldPos: [number, number, number]): { x: number; y: number; visible: boolean } {\n if (!this.axes) return { x: 0, y: 0, visible: false };\n const rect = this.canvas.getBoundingClientRect();\n const viewProj = this.camera.getViewProjectionMatrix();\n return this.axes.projectToScreen(worldPos, viewProj, rect.width, rect.height);\n }\n\n exportImage(\n format: 'png' | 'jpeg' | 'webp' = 'png',\n quality = 0.92,\n transparent = false\n ): string {\n const savedBg = [...this.backgroundColor];\n if (transparent && format === 'png') {\n this.backgroundColor = [0, 0, 0, 0];\n }\n this.render();\n this.backgroundColor = savedBg as [number, number, number, number];\n const mimeType = `image/${format}`;\n return this.canvas.toDataURL(mimeType, quality);\n }\n \n on(event: string, callback: Renderer3DEventCallback): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n \n off(event: string, callback: Renderer3DEventCallback): void {\n this.eventListeners.get(event)?.delete(callback);\n }\n \n private emitEvent(type: string): void {\n const listeners = this.eventListeners.get(type);\n if (!listeners) return;\n \n const event: Renderer3DEvent = {\n type: type as any,\n timestamp: performance.now(),\n stats: this.getStats(),\n camera: {\n target: [...this.camera.target] as [number, number, number],\n radius: this.camera.radius,\n theta: this.camera.theta,\n phi: this.camera.phi,\n fov: this.camera.fov,\n },\n };\n \n listeners.forEach(callback => callback(event));\n }\n \n destroy(): void {\n this.stopRenderLoop();\n \n window.removeEventListener('resize', this.handleResize);\n \n if (this.tooltip) {\n this.tooltip.destroy();\n if (this.boundHandleMouseMove) this.canvas.removeEventListener('mousemove', this.boundHandleMouseMove);\n if (this.boundHandleMouseLeave) this.canvas.removeEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n \n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.normalBuffer) gl.deleteBuffer(this.normalBuffer);\n if (this.colorBuffer) gl.deleteBuffer(this.colorBuffer);\n if (this.indexBuffer) gl.deleteBuffer(this.indexBuffer);\n \n this.controller.destroy();\n deleteProgramBundle(gl, this.programs);\n \n if (this.axes) {\n this.axes.destroy();\n }\n \n this.eventListeners.clear();\n }\n}\n","/**\n * Procedural geometry generation for 3D primitives.\n * Generates vertex positions and indices for instanced rendering.\n */\n\nexport interface GeometryData {\n positions: Float32Array;\n indices: Uint16Array;\n vertexCount: number;\n indexCount: number;\n}\n\n/**\n * Generate icosphere geometry (subdivided icosahedron).\n * Good for spherical bubbles with uniform vertex distribution.\n */\nexport function createIcosphere(subdivisions = 1): GeometryData {\n const t = (1 + Math.sqrt(5)) / 2;\n\n // Initial icosahedron vertices\n const vertices: number[] = [\n -1, t, 0, 1, t, 0, -1, -t, 0, 1, -t, 0,\n 0, -1, t, 0, 1, t, 0, -1, -t, 0, 1, -t,\n t, 0, -1, t, 0, 1, -t, 0, -1, -t, 0, 1,\n ];\n\n // Initial icosahedron faces (20 triangles)\n let faces: number[][] = [\n [0, 11, 5], [0, 5, 1], [0, 1, 7], [0, 7, 10], [0, 10, 11],\n [1, 5, 9], [5, 11, 4], [11, 10, 2], [10, 7, 6], [7, 1, 8],\n [3, 9, 4], [3, 4, 2], [3, 2, 6], [3, 6, 8], [3, 8, 9],\n [4, 9, 5], [2, 4, 11], [6, 2, 10], [8, 6, 7], [9, 8, 1],\n ];\n\n // Midpoint cache for subdivision\n const midpointCache = new Map<string, number>();\n\n function getMidpoint(v1: number, v2: number): number {\n const key = v1 < v2 ? `${v1}_${v2}` : `${v2}_${v1}`;\n if (midpointCache.has(key)) {\n return midpointCache.get(key)!;\n }\n\n const i1 = v1 * 3;\n const i2 = v2 * 3;\n const mx = (vertices[i1] + vertices[i2]) / 2;\n const my = (vertices[i1 + 1] + vertices[i2 + 1]) / 2;\n const mz = (vertices[i1 + 2] + vertices[i2 + 2]) / 2;\n\n const idx = vertices.length / 3;\n vertices.push(mx, my, mz);\n midpointCache.set(key, idx);\n return idx;\n }\n\n // Subdivide\n for (let i = 0; i < subdivisions; i++) {\n const newFaces: number[][] = [];\n for (const [a, b, c] of faces) {\n const ab = getMidpoint(a, b);\n const bc = getMidpoint(b, c);\n const ca = getMidpoint(c, a);\n newFaces.push([a, ab, ca], [b, bc, ab], [c, ca, bc], [ab, bc, ca]);\n }\n faces = newFaces;\n midpointCache.clear();\n }\n\n // Normalize vertices to unit sphere\n const positions = new Float32Array(vertices.length);\n for (let i = 0; i < vertices.length; i += 3) {\n const x = vertices[i], y = vertices[i + 1], z = vertices[i + 2];\n const len = Math.sqrt(x * x + y * y + z * z);\n positions[i] = x / len;\n positions[i + 1] = y / len;\n positions[i + 2] = z / len;\n }\n\n // Flatten faces to indices\n const indices = new Uint16Array(faces.length * 3);\n for (let i = 0; i < faces.length; i++) {\n indices[i * 3] = faces[i][0];\n indices[i * 3 + 1] = faces[i][1];\n indices[i * 3 + 2] = faces[i][2];\n }\n\n return {\n positions,\n indices,\n vertexCount: positions.length / 3,\n indexCount: indices.length,\n };\n}\n\n/**\n * Generate UV sphere geometry.\n * Good for textured spheres, less uniform distribution.\n */\nexport function createUVSphere(segments = 16, rings = 12): GeometryData {\n const positions: number[] = [];\n const indices: number[] = [];\n\n // Generate vertices\n for (let ring = 0; ring <= rings; ring++) {\n const phi = (ring / rings) * Math.PI;\n const sinPhi = Math.sin(phi);\n const cosPhi = Math.cos(phi);\n\n for (let seg = 0; seg <= segments; seg++) {\n const theta = (seg / segments) * Math.PI * 2;\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n\n positions.push(\n sinPhi * cosTheta,\n cosPhi,\n sinPhi * sinTheta\n );\n }\n }\n\n // Generate indices\n for (let ring = 0; ring < rings; ring++) {\n for (let seg = 0; seg < segments; seg++) {\n const curr = ring * (segments + 1) + seg;\n const next = curr + segments + 1;\n\n indices.push(curr, next, curr + 1);\n indices.push(curr + 1, next, next + 1);\n }\n }\n\n return {\n positions: new Float32Array(positions),\n indices: new Uint16Array(indices),\n vertexCount: positions.length / 3,\n indexCount: indices.length,\n };\n}\n\n/**\n * Generate low-poly cube geometry.\n * Fastest option, good for distant/small bubbles.\n */\nexport function createCube(): GeometryData {\n const positions = new Float32Array([\n // Front\n -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1,\n // Back\n -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1,\n // Top\n -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1,\n // Bottom\n -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1,\n // Right\n 1, -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1,\n // Left\n -1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1,\n ]);\n\n // Normalize to unit sphere-ish\n for (let i = 0; i < positions.length; i += 3) {\n const x = positions[i], y = positions[i + 1], z = positions[i + 2];\n const len = Math.sqrt(x * x + y * y + z * z);\n positions[i] = x / len;\n positions[i + 1] = y / len;\n positions[i + 2] = z / len;\n }\n\n const indices = new Uint16Array([\n 0, 1, 2, 0, 2, 3, // Front\n 4, 5, 6, 4, 6, 7, // Back\n 8, 9, 10, 8, 10, 11, // Top\n 12, 13, 14, 12, 14, 15, // Bottom\n 16, 17, 18, 16, 18, 19, // Right\n 20, 21, 22, 20, 22, 23, // Left\n ]);\n\n return {\n positions,\n indices,\n vertexCount: 24,\n indexCount: 36,\n };\n}\n\n/**\n * Generate billboard quad (always faces camera).\n * Most efficient for large numbers of small points.\n */\nexport function createBillboardQuad(): GeometryData {\n const positions = new Float32Array([\n -1, -1, 0,\n 1, -1, 0,\n 1, 1, 0,\n -1, 1, 0,\n ]);\n\n const indices = new Uint16Array([0, 1, 2, 0, 2, 3]);\n\n return {\n positions,\n indices,\n vertexCount: 4,\n indexCount: 6,\n };\n}\n/**\n * Generate a standard AABB cube for voxels.\n */\nexport function createVoxelCube(): GeometryData {\n const positions = new Float32Array([\n // Front\n -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5,\n // Back\n -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5,\n // Top\n -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, -0.5,\n // Bottom\n -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5,\n // Right\n 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5,\n // Left\n -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5, 0.5, -0.5,\n ]);\n\n const indices = new Uint16Array([\n 0, 1, 2, 0, 2, 3, // Front\n 4, 5, 6, 4, 6, 7, // Back\n 8, 9, 10, 8, 10, 11, // Top\n 12, 13, 14, 12, 14, 15, // Bottom\n 16, 17, 18, 16, 18, 19, // Right\n 20, 21, 22, 20, 22, 23, // Left\n ]);\n\n return {\n positions,\n indices,\n vertexCount: 24,\n indexCount: 36,\n };\n}\n","/**\n * Instanced mesh for efficient rendering of many identical geometries.\n * Uses WebGL2 instanced rendering for single draw call performance.\n */\n\nimport type { GeometryData } from './geometry';\nimport type { ShaderProgram3D } from '../shader/programs';\n\nexport interface InstanceData {\n positions: Float32Array; // xyz per instance (length = instanceCount * 3)\n scales: Float32Array; // scale per instance (length = instanceCount)\n colors: Float32Array; // rgb per instance (length = instanceCount * 3)\n}\n\nexport interface InstancedMeshOptions {\n geometry: GeometryData;\n maxInstances?: number;\n}\n\nexport class InstancedMesh {\n private gl: WebGL2RenderingContext;\n private vao: WebGLVertexArrayObject | null = null;\n \n // Geometry buffers\n private positionBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n \n // Instance buffers\n private instancePosBuffer: WebGLBuffer | null = null;\n private instanceScaleBuffer: WebGLBuffer | null = null;\n private instanceColorBuffer: WebGLBuffer | null = null;\n \n private geometry: GeometryData;\n private maxInstances: number;\n private instanceCount = 0;\n \n constructor(gl: WebGL2RenderingContext, options: InstancedMeshOptions) {\n this.gl = gl;\n this.geometry = options.geometry;\n this.maxInstances = options.maxInstances ?? 100000;\n \n this.initBuffers();\n }\n \n private initBuffers(): void {\n const { gl, geometry, maxInstances } = this;\n \n // Create VAO\n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n // Geometry position buffer\n this.positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, geometry.positions, gl.STATIC_DRAW);\n \n // Index buffer\n this.indexBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, geometry.indices, gl.STATIC_DRAW);\n \n // Instance position buffer (vec3 per instance)\n this.instancePosBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instancePosBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, maxInstances * 3 * 4, gl.DYNAMIC_DRAW);\n \n // Instance scale buffer (float per instance)\n this.instanceScaleBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceScaleBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, maxInstances * 4, gl.DYNAMIC_DRAW);\n \n // Instance color buffer (vec3 per instance)\n this.instanceColorBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceColorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, maxInstances * 3 * 4, gl.DYNAMIC_DRAW);\n \n gl.bindVertexArray(null);\n }\n \n /**\n * Update instance data. Call before render.\n */\n updateInstances(data: InstanceData): void {\n const { gl, maxInstances } = this;\n \n this.instanceCount = Math.min(data.positions.length / 3, maxInstances);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.instancePosBuffer);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, data.positions);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceScaleBuffer);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, data.scales);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceColorBuffer);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, data.colors);\n }\n \n /**\n * Render all instances with given shader program.\n */\n render(program: ShaderProgram3D): void {\n const { gl, geometry, instanceCount } = this;\n \n if (instanceCount === 0) return;\n \n gl.bindVertexArray(this.vao);\n \n // Setup geometry position attribute\n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(posLoc, 0); // Per vertex\n }\n \n // Setup instance position attribute\n const instancePosLoc = program.attributes['a_instancePos'];\n if (instancePosLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instancePosBuffer);\n gl.enableVertexAttribArray(instancePosLoc);\n gl.vertexAttribPointer(instancePosLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(instancePosLoc, 1); // Per instance\n }\n \n // Setup instance scale attribute\n const scaleLoc = program.attributes['a_scale'];\n if (scaleLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceScaleBuffer);\n gl.enableVertexAttribArray(scaleLoc);\n gl.vertexAttribPointer(scaleLoc, 1, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(scaleLoc, 1); // Per instance\n }\n \n // Setup instance color attribute\n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceColorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(colorLoc, 1); // Per instance\n }\n \n // Bind index buffer and draw\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.drawElementsInstanced(\n gl.TRIANGLES,\n geometry.indexCount,\n gl.UNSIGNED_SHORT,\n 0,\n instanceCount\n );\n \n gl.bindVertexArray(null);\n }\n \n /**\n * Get current instance count.\n */\n getInstanceCount(): number {\n return this.instanceCount;\n }\n \n /**\n * Clean up WebGL resources.\n */\n destroy(): void {\n const { gl } = this;\n \n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.indexBuffer) gl.deleteBuffer(this.indexBuffer);\n if (this.instancePosBuffer) gl.deleteBuffer(this.instancePosBuffer);\n if (this.instanceScaleBuffer) gl.deleteBuffer(this.instanceScaleBuffer);\n if (this.instanceColorBuffer) gl.deleteBuffer(this.instanceColorBuffer);\n \n this.vao = null;\n this.positionBuffer = null;\n this.indexBuffer = null;\n this.instancePosBuffer = null;\n this.instanceScaleBuffer = null;\n this.instanceColorBuffer = null;\n }\n}\n","/**\n * Main 3D Bubble renderer integrating all components.\n * Provides a high-level API for rendering instanced 3D bubbles.\n */\n\nimport { OrbitCamera, type OrbitCameraOptions } from './camera/OrbitCamera';\nimport { OrbitController, type OrbitControllerOptions } from './controls/OrbitController';\nimport {\n createIcosphere,\n createUVSphere,\n createCube,\n type GeometryData,\n} from './mesh/geometry';\nimport { InstancedMesh, type InstanceData } from './mesh/InstancedMesh';\nimport {\n createProgramBundle3D,\n deleteProgramBundle,\n type ProgramBundle3D,\n} from './shader/programs';\nimport { Axes3D, type Axes3DOptions } from './Axes3D';\nimport {\n createRayFromScreen,\n pickBubble,\n type Ray3D,\n type HitResult,\n} from './Raycaster3D';\nimport type {\n Bubble3DData,\n Bubble3DStyle,\n Renderer3DOptions,\n Bounds3D,\n RenderStats3D,\n Renderer3DEvent,\n Renderer3DEventCallback,\n} from './types';\nimport { Tooltip3D, type Tooltip3DOptions, type Tooltip3DData } from './Tooltip3D';\nimport { createTheme, type CustomThemeOptions, type ColorTheme } from './colorThemes';\n\nexport interface Bubble3DRendererOptions extends Renderer3DOptions {\n camera?: OrbitCameraOptions;\n controls?: OrbitControllerOptions;\n style?: Bubble3DStyle;\n autoRender?: boolean;\n /** Axes configuration */\n axes?: Axes3DOptions;\n /** Show axes (default: true) */\n showAxes?: boolean;\n /** Enable tooltips on hover (default: true) */\n enableTooltip?: boolean;\n /** Tooltip configuration */\n tooltip?: Tooltip3DOptions;\n /** Custom tooltip formatter */\n tooltipFormatter?: (data: Tooltip3DData) => string;\n /** Color theme options */\n theme?: CustomThemeOptions;\n}\n\nexport class Bubble3DRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGL2RenderingContext;\n private dpr: number;\n \n private programs: ProgramBundle3D;\n private mesh: InstancedMesh;\n private camera: OrbitCamera;\n private controller: OrbitController;\n private axes: Axes3D | null = null;\n \n private backgroundColor: [number, number, number, number] = [0.05, 0.05, 0.1, 1];\n private style: Required<Bubble3DStyle>;\n private showAxes: boolean;\n \n private instanceData: InstanceData | null = null;\n private bounds: Bounds3D | null = null;\n \n private animationFrameId: number | null = null;\n private autoRender: boolean;\n private needsRender = true;\n \n private eventListeners: Map<string, Set<Renderer3DEventCallback>> = new Map();\n \n // Tooltip\n private tooltip: Tooltip3D | null = null;\n private enableTooltip: boolean;\n private lastHitIndex = -1;\n private boundHandleMouseMove: ((e: MouseEvent) => void) | null = null;\n private boundHandleMouseLeave: (() => void) | null = null;\n \n // Stats\n private lastFrameTime = 0;\n private frameCount = 0;\n private fps = 0;\n private lastFpsUpdate = 0;\n \n // Color theme\n private colorTheme: ColorTheme;\n \n constructor(options: Bubble3DRendererOptions) {\n this.canvas = options.canvas;\n this.dpr = window.devicePixelRatio || 1;\n this.autoRender = options.autoRender ?? true;\n this.showAxes = options.showAxes ?? true;\n \n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor;\n }\n \n // Initialize color theme\n this.colorTheme = createTheme(options.theme || {}, this.backgroundColor);\n \n // Initialize style with defaults (using theme colors)\n this.style = {\n opacity: options.style?.opacity ?? 1,\n defaultColor: options.style?.defaultColor ?? this.colorTheme.seriesPalette[0],\n defaultScale: options.style?.defaultScale ?? 0.1,\n geometry: options.style?.geometry ?? 'icosphere',\n subdivisions: options.style?.subdivisions ?? 1,\n enableLighting: options.style?.enableLighting ?? true,\n lightDirection: options.style?.lightDirection ?? [1, 1, 1],\n ambient: options.style?.ambient ?? 0.4,\n };\n \n // Initialize WebGL2 context\n const gl = this.canvas.getContext('webgl2', {\n alpha: true,\n antialias: options.antialias ?? true,\n preserveDrawingBuffer: options.preserveDrawingBuffer ?? false,\n powerPreference: options.powerPreference ?? 'high-performance',\n });\n \n if (!gl) {\n throw new Error('WebGL2 not supported');\n }\n \n this.gl = gl;\n \n // Enable depth testing and blending\n gl.enable(gl.DEPTH_TEST);\n gl.depthFunc(gl.LEQUAL);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n \n // Create shader programs\n this.programs = createProgramBundle3D(gl);\n \n // Create geometry based on style\n const geometry = this.createGeometry();\n \n // Create instanced mesh\n this.mesh = new InstancedMesh(gl, {\n geometry,\n maxInstances: options.maxInstances ?? 100000,\n });\n \n // Create camera\n this.camera = new OrbitCamera(options.camera);\n \n // Create controller\n this.controller = new OrbitController(\n this.camera,\n this.canvas,\n options.controls\n );\n \n // Setup controller callback\n this.controller.onChange(() => {\n this.needsRender = true;\n this.emitEvent('cameraChange');\n });\n \n // Create axes renderer\n if (this.showAxes) {\n this.axes = new Axes3D(this.gl, options.axes);\n }\n \n // Initialize tooltip\n this.enableTooltip = options.enableTooltip ?? true;\n if (this.enableTooltip) {\n const tooltipOptions: Tooltip3DOptions = {\n ...options.tooltip,\n formatter: options.tooltipFormatter,\n };\n this.tooltip = new Tooltip3D(this.canvas.parentElement || document.body, tooltipOptions);\n \n // Setup hover handlers\n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseLeave = this.handleMouseLeave.bind(this);\n this.canvas.addEventListener('mousemove', this.boundHandleMouseMove);\n this.canvas.addEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n \n // Handle resize\n this.resize();\n window.addEventListener('resize', this.handleResize);\n \n // Start render loop if autoRender\n if (this.autoRender) {\n this.startRenderLoop();\n }\n }\n \n private handleMouseMove(e: MouseEvent): void {\n if (!this.tooltip || !this.instanceData) return;\n \n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n \n const hit = this.pickAtScreen(x, y);\n \n if (hit) {\n if (hit.index !== this.lastHitIndex) {\n this.lastHitIndex = hit.index;\n \n const bubbleData = this.getBubbleData(hit.index);\n if (bubbleData) {\n this.tooltip.show({\n index: hit.index,\n position: bubbleData.position,\n color: bubbleData.color,\n scale: bubbleData.scale,\n }, x, y);\n \n this.emitEvent('hover');\n }\n } else {\n this.tooltip.updatePosition(x, y);\n }\n } else {\n if (this.lastHitIndex !== -1) {\n this.tooltip.hide();\n this.lastHitIndex = -1;\n }\n }\n }\n \n private handleMouseLeave(): void {\n if (this.tooltip) {\n this.tooltip.hide();\n this.lastHitIndex = -1;\n }\n }\n \n private createGeometry(): GeometryData {\n switch (this.style.geometry) {\n case 'uvsphere':\n return createUVSphere(16, 12);\n case 'cube':\n return createCube();\n case 'icosphere':\n default:\n return createIcosphere(this.style.subdivisions);\n }\n }\n \n private handleResize = (): void => {\n this.resize();\n this.needsRender = true;\n this.emitEvent('resize');\n };\n \n /**\n * Resize canvas to match display size.\n */\n resize(): void {\n const rect = this.canvas.getBoundingClientRect();\n const width = rect.width * this.dpr;\n const height = rect.height * this.dpr;\n \n if (this.canvas.width !== width || this.canvas.height !== height) {\n this.canvas.width = width;\n this.canvas.height = height;\n this.gl.viewport(0, 0, width, height);\n this.camera.setAspect(width / height);\n }\n }\n \n /**\n * Set bubble data for rendering.\n */\n setData(data: Bubble3DData): void {\n const count = data.positions.length / 3;\n \n // Create scales array if not provided\n const scales = data.scales ?? new Float32Array(count).fill(this.style.defaultScale);\n \n // Create colors array if not provided\n let colors: Float32Array;\n if (data.colors) {\n colors = data.colors;\n } else {\n colors = new Float32Array(count * 3);\n const [r, g, b] = this.style.defaultColor;\n for (let i = 0; i < count; i++) {\n colors[i * 3] = r;\n colors[i * 3 + 1] = g;\n colors[i * 3 + 2] = b;\n }\n }\n \n this.instanceData = {\n positions: data.positions,\n scales,\n colors,\n };\n \n // Calculate bounds\n this.bounds = this.calculateBounds(data.positions);\n \n // Update axes with new bounds\n if (this.axes && this.bounds) {\n this.axes.updateBounds(this.bounds);\n }\n \n // Update mesh\n this.mesh.updateInstances(this.instanceData);\n \n this.needsRender = true;\n this.emitEvent('dataUpdate');\n }\n \n private calculateBounds(positions: Float32Array): Bounds3D {\n let minX = Infinity, maxX = -Infinity;\n let minY = Infinity, maxY = -Infinity;\n let minZ = Infinity, maxZ = -Infinity;\n \n for (let i = 0; i < positions.length; i += 3) {\n const x = positions[i];\n const y = positions[i + 1];\n const z = positions[i + 2];\n \n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n if (z < minZ) minZ = z;\n if (z > maxZ) maxZ = z;\n }\n \n return { minX, maxX, minY, maxY, minZ, maxZ };\n }\n \n /**\n * Fit camera to view all data.\n */\n fitToData(): void {\n if (this.bounds) {\n const { minX, maxX, minY, maxY, minZ, maxZ } = this.bounds;\n \n const dx = maxX - minX;\n const dy = maxY - minY;\n const dz = maxZ - minZ;\n const padding = 0.01;\n \n this.camera.fitToBounds(\n minX - dx * padding, minY - dy * padding, minZ - dz * padding,\n maxX + dx * padding, maxY + dy * padding, maxZ + dz * padding\n );\n \n this.camera.radius *= 1.05;\n this.needsRender = true;\n }\n }\n \n /**\n * Render a single frame.\n */\n render(): void {\n const { gl, programs, mesh, camera, style, backgroundColor } = this;\n \n const startTime = performance.now();\n \n // Clear\n gl.clearColor(\n backgroundColor[0],\n backgroundColor[1],\n backgroundColor[2],\n backgroundColor[3]\n );\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n \n if (!this.instanceData) return;\n \n // Get view projection matrix\n const viewProj = camera.getViewProjectionMatrix();\n \n // Render axes first (behind bubbles)\n if (this.axes) {\n this.axes.render(viewProj);\n }\n \n // Now set up and render bubbles\n // Select program based on lighting\n const program = style.enableLighting\n ? programs.bubbleProgram\n : programs.bubbleFlatProgram;\n \n gl.useProgram(program.program);\n \n // Set uniforms\n gl.uniformMatrix4fv(program.uniforms['u_viewProjection'], false, viewProj);\n gl.uniform1f(program.uniforms['u_opacity'], style.opacity);\n \n if (style.enableLighting) {\n const [lx, ly, lz] = style.lightDirection;\n gl.uniform3f(program.uniforms['u_lightDir'], lx, ly, lz);\n gl.uniform1f(program.uniforms['u_ambient'], style.ambient);\n }\n \n // Render instances\n mesh.render(program);\n \n // Update stats\n const frameTime = performance.now() - startTime;\n this.lastFrameTime = frameTime;\n this.frameCount++;\n \n const now = performance.now();\n if (now - this.lastFpsUpdate >= 1000) {\n this.fps = this.frameCount;\n this.frameCount = 0;\n this.lastFpsUpdate = now;\n }\n \n this.emitEvent('render');\n }\n \n /**\n * Start automatic render loop.\n */\n startRenderLoop(): void {\n if (this.animationFrameId !== null) return;\n \n const loop = (): void => {\n // Update controller damping\n const moving = this.controller.update();\n \n if (this.needsRender || moving) {\n this.render();\n this.needsRender = false;\n }\n \n this.animationFrameId = requestAnimationFrame(loop);\n };\n \n this.animationFrameId = requestAnimationFrame(loop);\n }\n \n /**\n * Stop automatic render loop.\n */\n stopRenderLoop(): void {\n if (this.animationFrameId !== null) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n }\n \n /**\n * Request a render on next frame.\n */\n requestRender(): void {\n this.needsRender = true;\n }\n \n /**\n * Get render statistics.\n */\n getStats(): RenderStats3D {\n return {\n instanceCount: this.mesh.getInstanceCount(),\n drawCalls: 1,\n frameTime: this.lastFrameTime,\n fps: this.fps,\n };\n }\n \n /**\n * Get camera instance for direct manipulation.\n */\n getCamera(): OrbitCamera {\n return this.camera;\n }\n \n /**\n * Get controller instance for configuration.\n */\n getController(): OrbitController {\n return this.controller;\n }\n \n /**\n * Update style options.\n */\n setStyle(style: Partial<Bubble3DStyle>): void {\n Object.assign(this.style, style);\n this.needsRender = true;\n }\n \n /**\n * Set background color.\n */\n setBackgroundColor(r: number, g: number, b: number, a = 1): void {\n this.backgroundColor = [r, g, b, a];\n this.needsRender = true;\n }\n \n /**\n * Add event listener.\n */\n on(event: string, callback: Renderer3DEventCallback): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n \n /**\n * Remove event listener.\n */\n off(event: string, callback: Renderer3DEventCallback): void {\n this.eventListeners.get(event)?.delete(callback);\n }\n \n private emitEvent(type: string): void {\n const listeners = this.eventListeners.get(type);\n if (!listeners) return;\n \n const event: Renderer3DEvent = {\n type: type as any,\n timestamp: performance.now(),\n stats: this.getStats(),\n camera: {\n target: [...this.camera.target] as [number, number, number],\n radius: this.camera.radius,\n theta: this.camera.theta,\n phi: this.camera.phi,\n fov: this.camera.fov,\n },\n };\n \n listeners.forEach(callback => {\n callback(event);\n });\n }\n \n /**\n * Get axis labels for 2D text overlay rendering.\n * Returns labels with world positions that need to be projected to screen.\n */\n getAxisLabels(): { text: string; worldPosition: [number, number, number]; axis: string; color: [number, number, number] }[] {\n if (!this.axes) return [];\n return this.axes.getLabels();\n }\n \n /**\n * Project world coordinates to screen coordinates.\n * Useful for positioning 2D overlay text.\n */\n projectToScreen(worldPos: [number, number, number]): { x: number; y: number; visible: boolean } {\n if (!this.axes) return { x: 0, y: 0, visible: false };\n \n const viewProj = this.camera.getViewProjectionMatrix();\n const rect = this.canvas.getBoundingClientRect();\n \n return this.axes.projectToScreen(worldPos, viewProj, rect.width, rect.height);\n }\n \n /**\n * Get the current view-projection matrix.\n */\n getViewProjectionMatrix(): Float32Array {\n return this.camera.getViewProjectionMatrix();\n }\n \n /**\n * Get canvas dimensions.\n */\n getCanvasSize(): { width: number; height: number } {\n const rect = this.canvas.getBoundingClientRect();\n return { width: rect.width, height: rect.height };\n }\n \n /**\n * Get WebGL context info.\n */\n getContextInfo(): Record<string, any> {\n const { gl } = this;\n return {\n renderer: gl.getParameter(gl.RENDERER),\n vendor: gl.getParameter(gl.VENDOR),\n version: gl.getParameter(gl.VERSION),\n maxTextureSize: gl.getParameter(gl.MAX_TEXTURE_SIZE),\n maxVertexAttribs: gl.getParameter(gl.MAX_VERTEX_ATTRIBS),\n maxVertexUniformVectors: gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS),\n };\n }\n \n /**\n * Pick a bubble at screen coordinates.\n * @param screenX X coordinate relative to canvas\n * @param screenY Y coordinate relative to canvas\n * @returns Hit result with bubble index, or null if no hit\n */\n pickAtScreen(screenX: number, screenY: number): HitResult | null {\n if (!this.instanceData) return null;\n \n const { width, height } = this.getCanvasSize();\n const viewProj = this.camera.getViewProjectionMatrix();\n \n const ray = createRayFromScreen(screenX, screenY, width, height, viewProj);\n \n return pickBubble(ray, this.instanceData.positions, this.instanceData.scales);\n }\n \n /**\n * Create a ray from screen coordinates.\n * Useful for custom picking logic.\n */\n createRay(screenX: number, screenY: number): Ray3D {\n const { width, height } = this.getCanvasSize();\n const viewProj = this.camera.getViewProjectionMatrix();\n return createRayFromScreen(screenX, screenY, width, height, viewProj);\n }\n \n /**\n * Get data for a specific bubble by index.\n */\n getBubbleData(index: number): { position: [number, number, number]; color: [number, number, number]; scale: number } | null {\n if (!this.instanceData || index < 0 || index >= this.instanceData.scales.length) {\n return null;\n }\n \n const i3 = index * 3;\n return {\n position: [\n this.instanceData.positions[i3],\n this.instanceData.positions[i3 + 1],\n this.instanceData.positions[i3 + 2],\n ],\n color: [\n this.instanceData.colors[i3],\n this.instanceData.colors[i3 + 1],\n this.instanceData.colors[i3 + 2],\n ],\n scale: this.instanceData.scales[index],\n };\n }\n /**\n * Export the current view as an image.\n * @param format Image format ('png' | 'jpeg' | 'webp')\n * @param quality Quality for jpeg/webp (0-1)\n * @param transparent Use transparent background (only for 'png')\n * @returns Data URL of the image\n */\n exportImage(\n format: 'png' | 'jpeg' | 'webp' = 'png',\n quality = 0.92,\n transparent = false\n ): string {\n // Save current background\n const savedBg = [...this.backgroundColor];\n \n // Set transparent background if requested\n if (transparent && format === 'png') {\n this.backgroundColor = [0, 0, 0, 0];\n }\n \n // Force a render to capture current state\n this.render();\n \n // Restore background\n this.backgroundColor = savedBg as [number, number, number, number];\n \n // Export canvas\n const mimeType = `image/${format}`;\n return this.canvas.toDataURL(mimeType, quality);\n }\n \n /**\n * Export the current view as a Blob.\n * @param format Image format ('png' | 'jpeg' | 'webp')\n * @param quality Quality for jpeg/webp (0-1)\n * @returns Promise that resolves to Blob\n */\n async exportImageBlob(\n format: 'png' | 'jpeg' | 'webp' = 'png',\n quality = 0.92\n ): Promise<Blob | null> {\n return new Promise((resolve) => {\n this.render();\n const mimeType = `image/${format}`;\n this.canvas.toBlob(resolve, mimeType, quality);\n });\n }\n \n /**\n * Download the current view as an image file.\n * @param filename Filename without extension\n * @param format Image format\n * @param quality Quality for jpeg/webp\n */\n downloadImage(\n filename = 'chart-3d',\n format: 'png' | 'jpeg' | 'webp' = 'png',\n quality = 0.92\n ): void {\n const dataUrl = this.exportImage(format, quality);\n const link = document.createElement('a');\n link.download = `${filename}.${format}`;\n link.href = dataUrl;\n link.click();\n }\n \n /**\n * Clean up all resources.\n */\n destroy(): void {\n this.stopRenderLoop();\n \n window.removeEventListener('resize', this.handleResize);\n \n // Clean up tooltip\n if (this.tooltip) {\n this.tooltip.destroy();\n if (this.boundHandleMouseMove) {\n this.canvas.removeEventListener('mousemove', this.boundHandleMouseMove);\n }\n if (this.boundHandleMouseLeave) {\n this.canvas.removeEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n }\n \n this.controller.destroy();\n this.mesh.destroy();\n deleteProgramBundle(this.gl, this.programs);\n \n if (this.axes) {\n this.axes.destroy();\n }\n \n this.eventListeners.clear();\n }\n}\n","/**\n * Impulse 3D Renderer\n * Renders stem/impulse plots with vertical lines from base plane to data points.\n * Uses cylinder geometry for smooth stems.\n */\n\nimport { OrbitCamera, type OrbitCameraOptions } from './camera/OrbitCamera';\nimport { OrbitController, type OrbitControllerOptions } from './controls/OrbitController';\nimport {\n createProgramBundle3D,\n deleteProgramBundle,\n type ProgramBundle3D,\n} from './shader/programs';\nimport { Axes3D, type Axes3DOptions } from './Axes3D';\nimport { Tooltip3D, type Tooltip3DOptions } from './Tooltip3D';\nimport type {\n Renderer3DOptions,\n Bounds3D,\n RenderStats3D,\n Renderer3DEvent,\n Renderer3DEventCallback,\n} from './types';\nimport { createTheme, type CustomThemeOptions, type ColorTheme } from './colorThemes';\nimport { createRayFromScreen, pickImpulse } from './Raycaster3D';\n\nexport interface ImpulseSeriesData {\n /** X coordinates */\n x: Float32Array;\n /** Y coordinates (top of stems) */\n y: Float32Array;\n /** Z coordinates */\n z: Float32Array;\n /** Base Y value (default: 0) */\n baseY?: number;\n /** Color per point (RGB) */\n colors?: Float32Array;\n /** Single color for all stems */\n color?: [number, number, number];\n}\n\nexport interface Impulse3DRendererOptions extends Renderer3DOptions {\n camera?: OrbitCameraOptions;\n controls?: OrbitControllerOptions;\n axes?: Axes3DOptions;\n showAxes?: boolean;\n /** Stem thickness (default: 0.03) */\n stemWidth?: number;\n /** Number of sides for cylinder (default: 6) */\n stemSides?: number;\n /** Show marker at top of stem (default: true) */\n showMarkers?: boolean;\n /** Marker size multiplier (default: 2) */\n markerSize?: number;\n /** Enable tooltips (default: true) */\n enableTooltip?: boolean;\n tooltip?: Tooltip3DOptions;\n /** Color theme options */\n theme?: CustomThemeOptions;\n}\n\nexport class Impulse3DRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGL2RenderingContext;\n private dpr: number;\n \n private programs: ProgramBundle3D;\n private camera: OrbitCamera;\n private controller: OrbitController;\n private axes: Axes3D | null = null;\n \n // Stem geometry buffers\n private stemVao: WebGLVertexArrayObject | null = null;\n private stemPositionBuffer: WebGLBuffer | null = null;\n private stemNormalBuffer: WebGLBuffer | null = null;\n private stemColorBuffer: WebGLBuffer | null = null;\n private stemIndexBuffer: WebGLBuffer | null = null;\n private stemIndexCount = 0;\n \n // Marker geometry buffers (spheres at top)\n private markerVao: WebGLVertexArrayObject | null = null;\n private markerPositionBuffer: WebGLBuffer | null = null;\n private markerNormalBuffer: WebGLBuffer | null = null;\n private markerColorBuffer: WebGLBuffer | null = null;\n private markerIndexBuffer: WebGLBuffer | null = null;\n private markerIndexCount = 0;\n \n private backgroundColor: [number, number, number, number] = [0.05, 0.05, 0.1, 1];\n private showAxes: boolean;\n private stemWidth: number;\n private stemSides: number;\n private showMarkers: boolean;\n private markerSize: number;\n \n private impulseData: ImpulseSeriesData | null = null;\n private bounds: Bounds3D | null = null;\n \n private animationFrameId: number | null = null;\n private needsRender = true;\n \n private eventListeners: Map<string, Set<Renderer3DEventCallback>> = new Map();\n \n // Tooltip\n private tooltip: Tooltip3D | null = null;\n private enableTooltip: boolean;\n private lastHitIndex: number = -1;\n private boundHandleMouseMove?: (e: MouseEvent) => void;\n private boundHandleMouseLeave?: () => void;\n \n // Stats\n private lastFrameTime = 0;\n private frameCount = 0;\n private fps = 0;\n private lastFpsUpdate = 0;\n \n // Color theme\n private colorTheme: ColorTheme;\n \n constructor(options: Impulse3DRendererOptions) {\n this.canvas = options.canvas;\n this.dpr = window.devicePixelRatio || 1;\n this.showAxes = options.showAxes ?? true;\n this.stemWidth = options.stemWidth ?? 0.03;\n this.stemSides = options.stemSides ?? 6;\n this.showMarkers = options.showMarkers ?? true;\n this.markerSize = options.markerSize ?? 2;\n this.enableTooltip = options.enableTooltip ?? true;\n \n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor;\n }\n \n // Initialize color theme\n this.colorTheme = createTheme(options.theme || {}, this.backgroundColor);\n \n // Get WebGL2 context\n const gl = this.canvas.getContext('webgl2', {\n alpha: true,\n antialias: true,\n preserveDrawingBuffer: false,\n });\n \n if (!gl) {\n throw new Error('WebGL2 not supported');\n }\n this.gl = gl;\n \n // Enable depth testing\n gl.enable(gl.DEPTH_TEST);\n gl.depthFunc(gl.LEQUAL);\n \n // Create shader programs\n this.programs = createProgramBundle3D(gl);\n \n // Create buffers\n this.initBuffers();\n \n // Create camera\n this.camera = new OrbitCamera(options.camera);\n \n // Create controller\n this.controller = new OrbitController(this.camera, this.canvas, options.controls);\n this.controller.onChange(() => {\n this.needsRender = true;\n this.emitEvent('cameraChange');\n });\n \n // Create axes\n if (this.showAxes) {\n this.axes = new Axes3D(gl, options.axes);\n }\n \n // Initialize tooltip\n if (this.enableTooltip) {\n this.tooltip = new Tooltip3D(this.canvas.parentElement || document.body, options.tooltip);\n \n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseLeave = this.handleMouseLeave.bind(this);\n this.canvas.addEventListener('mousemove', this.boundHandleMouseMove);\n this.canvas.addEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n \n // Handle resize\n this.resize();\n window.addEventListener('resize', this.handleResize);\n \n // Start render loop\n this.startRenderLoop();\n }\n\n private handleMouseMove(e: MouseEvent): void {\n if (!this.tooltip || !this.impulseData) return;\n \n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n \n const hit = this.pickAtScreen(x, y);\n \n if (hit) {\n if (hit.index !== this.lastHitIndex) {\n this.lastHitIndex = hit.index;\n const i3 = hit.index * 3;\n const color: [number, number, number] = this.impulseData.colors \n ? [this.impulseData.colors[i3], this.impulseData.colors[i3+1], this.impulseData.colors[i3+2]]\n : (this.impulseData.color || [0.5, 0.7, 1.0]);\n \n this.tooltip.show({\n index: hit.index,\n position: [this.impulseData.x[hit.index], this.impulseData.y[hit.index], this.impulseData.z[hit.index]],\n color: color,\n }, x, y);\n } else {\n this.tooltip.updatePosition(x, y);\n }\n } else {\n if (this.lastHitIndex !== -1) {\n this.tooltip.hide();\n this.lastHitIndex = -1;\n }\n }\n }\n\n private handleMouseLeave(): void {\n if (this.tooltip) {\n this.tooltip.hide();\n this.lastHitIndex = -1;\n }\n }\n\n pickAtScreen(screenX: number, screenY: number) {\n if (!this.impulseData) return null;\n \n const { width, height } = this.getCanvasSize();\n const viewProj = this.camera.getViewProjectionMatrix();\n const ray = createRayFromScreen(screenX, screenY, width, height, viewProj);\n \n return pickImpulse(ray, this.impulseData, this.stemWidth * 4);\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n // Stem buffers\n this.stemVao = gl.createVertexArray();\n this.stemPositionBuffer = gl.createBuffer();\n this.stemNormalBuffer = gl.createBuffer();\n this.stemColorBuffer = gl.createBuffer();\n this.stemIndexBuffer = gl.createBuffer();\n \n // Marker buffers\n this.markerVao = gl.createVertexArray();\n this.markerPositionBuffer = gl.createBuffer();\n this.markerNormalBuffer = gl.createBuffer();\n this.markerColorBuffer = gl.createBuffer();\n this.markerIndexBuffer = gl.createBuffer();\n }\n \n private handleResize = (): void => {\n this.resize();\n this.needsRender = true;\n };\n \n resize(): void {\n const { canvas, gl, dpr, camera } = this;\n \n const width = canvas.clientWidth;\n const height = canvas.clientHeight;\n \n canvas.width = width * dpr;\n canvas.height = height * dpr;\n \n gl.viewport(0, 0, canvas.width, canvas.height);\n camera.aspect = width / height;\n }\n \n /**\n * Set impulse data\n */\n setData(data: ImpulseSeriesData): void {\n this.impulseData = data;\n this.buildGeometry();\n this.calculateBounds();\n \n if (this.axes && this.bounds) {\n this.axes.updateBounds(this.bounds);\n }\n \n this.needsRender = true;\n this.emitEvent('dataUpdate');\n }\n \n private buildGeometry(): void {\n if (!this.impulseData) return;\n \n this.buildStemGeometry();\n if (this.showMarkers) {\n this.buildMarkerGeometry();\n }\n }\n \n private buildStemGeometry(): void {\n const { gl, stemWidth, stemSides, impulseData } = this;\n if (!impulseData) return;\n \n const count = impulseData.x.length;\n const defaultColor = impulseData.color ?? this.colorTheme.seriesPalette[0] as [number, number, number];\n const baseY = impulseData.baseY ?? 0;\n \n const allPositions: number[] = [];\n const allNormals: number[] = [];\n const allColors: number[] = [];\n const allIndices: number[] = [];\n let vertexOffset = 0;\n \n for (let i = 0; i < count; i++) {\n const x = impulseData.x[i];\n const y = impulseData.y[i];\n const z = impulseData.z[i];\n \n const r = impulseData.colors ? impulseData.colors[i * 3] : defaultColor[0];\n const g = impulseData.colors ? impulseData.colors[i * 3 + 1] : defaultColor[1];\n const b = impulseData.colors ? impulseData.colors[i * 3 + 2] : defaultColor[2];\n \n // Create cylinder for each stem\n // Bottom ring\n for (let s = 0; s <= stemSides; s++) {\n const angle = (s / stemSides) * Math.PI * 2;\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n \n const ox = cos * stemWidth;\n const oz = sin * stemWidth;\n \n // Bottom vertex\n allPositions.push(x + ox, baseY, z + oz);\n allNormals.push(cos, 0, sin);\n allColors.push(r * 0.5, g * 0.5, b * 0.5); // Darker at base\n \n // Top vertex\n allPositions.push(x + ox, y, z + oz);\n allNormals.push(cos, 0, sin);\n allColors.push(r, g, b);\n }\n \n // Indices for cylinder\n for (let s = 0; s < stemSides; s++) {\n const bl = vertexOffset + s * 2;\n const br = bl + 2;\n const tl = bl + 1;\n const tr = br + 1;\n \n allIndices.push(bl, br, tl);\n allIndices.push(tl, br, tr);\n }\n \n vertexOffset += (stemSides + 1) * 2;\n }\n \n // Upload to GPU\n const positions = new Float32Array(allPositions);\n const normals = new Float32Array(allNormals);\n const colors = new Float32Array(allColors);\n const indices = new Uint32Array(allIndices);\n \n this.stemIndexCount = indices.length;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.stemPositionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.stemNormalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, normals, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.stemColorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.stemIndexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n }\n \n private buildMarkerGeometry(): void {\n const { gl, stemWidth, markerSize, impulseData } = this;\n if (!impulseData) return;\n \n const count = impulseData.x.length;\n const defaultColor = impulseData.color ?? this.colorTheme.seriesPalette[0] as [number, number, number];\n const radius = stemWidth * markerSize;\n \n // Simple octahedron for markers (fast)\n const allPositions: number[] = [];\n const allNormals: number[] = [];\n const allColors: number[] = [];\n const allIndices: number[] = [];\n let vertexOffset = 0;\n \n // Octahedron template\n const octVerts = [\n [0, 1, 0], [1, 0, 0], [0, 0, 1],\n [-1, 0, 0], [0, 0, -1], [0, -1, 0]\n ];\n const octFaces = [\n [0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 1],\n [5, 2, 1], [5, 3, 2], [5, 4, 3], [5, 1, 4]\n ];\n \n for (let i = 0; i < count; i++) {\n const x = impulseData.x[i];\n const y = impulseData.y[i];\n const z = impulseData.z[i];\n \n const r = impulseData.colors ? impulseData.colors[i * 3] : defaultColor[0];\n const g = impulseData.colors ? impulseData.colors[i * 3 + 1] : defaultColor[1];\n const b = impulseData.colors ? impulseData.colors[i * 3 + 2] : defaultColor[2];\n \n // Add octahedron vertices\n for (const [ox, oy, oz] of octVerts) {\n allPositions.push(x + ox * radius, y + oy * radius, z + oz * radius);\n allNormals.push(ox, oy, oz);\n allColors.push(r, g, b);\n }\n \n // Add octahedron faces\n for (const [a, b2, c] of octFaces) {\n allIndices.push(vertexOffset + a, vertexOffset + b2, vertexOffset + c);\n }\n \n vertexOffset += 6;\n }\n \n // Upload to GPU\n const positions = new Float32Array(allPositions);\n const normals = new Float32Array(allNormals);\n const colors = new Float32Array(allColors);\n const indices = new Uint32Array(allIndices);\n \n this.markerIndexCount = indices.length;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.markerPositionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.markerNormalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, normals, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.markerColorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.markerIndexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n }\n \n private calculateBounds(): void {\n if (!this.impulseData) {\n this.bounds = null;\n return;\n }\n \n const data = this.impulseData;\n const baseY = data.baseY ?? 0;\n \n let minX = Infinity, maxX = -Infinity;\n let minY = baseY, maxY = -Infinity;\n let minZ = Infinity, maxZ = -Infinity;\n \n for (let i = 0; i < data.x.length; i++) {\n if (data.x[i] < minX) minX = data.x[i];\n if (data.x[i] > maxX) maxX = data.x[i];\n if (data.y[i] > maxY) maxY = data.y[i];\n if (data.z[i] < minZ) minZ = data.z[i];\n if (data.z[i] > maxZ) maxZ = data.z[i];\n }\n \n this.bounds = { minX, maxX, minY, maxY, minZ, maxZ };\n }\n \n /**\n * Fit camera to show all data\n */\n fitToData(): void {\n if (!this.bounds) return;\n \n const { minX, maxX, minY, maxY, minZ, maxZ } = this.bounds;\n \n // Add 20% padding to bounds for better fit\n const dx = maxX - minX;\n const dy = maxY - minY;\n const dz = maxZ - minZ;\n const padding = 0.05;\n \n this.camera.fitToBounds(\n minX - dx * padding, minY - dy * padding, minZ - dz * padding,\n maxX + dx * padding, maxY + dy * padding, maxZ + dz * padding\n );\n \n // Closer fit\n this.camera.radius *= 1.0;\n \n this.needsRender = true;\n }\n \n getCanvasSize(): { width: number; height: number } {\n const rect = this.canvas.getBoundingClientRect();\n return { width: rect.width, height: rect.height };\n }\n\n /**\n * Render a single frame\n */\n render(): void {\n const { gl, camera, backgroundColor } = this;\n \n const startTime = performance.now();\n \n // Clear\n gl.clearColor(\n backgroundColor[0],\n backgroundColor[1],\n backgroundColor[2],\n backgroundColor[3]\n );\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n \n // Get view projection matrix\n const viewProj = camera.getViewProjectionMatrix();\n \n // Render axes first\n if (this.axes) {\n this.axes.render(viewProj);\n }\n \n const program = this.programs.surfaceProgram;\n gl.useProgram(program.program);\n \n gl.uniformMatrix4fv(program.uniforms['u_viewProjection'], false, viewProj);\n gl.uniform1f(program.uniforms['u_opacity'], 1.0);\n gl.uniform3f(program.uniforms['u_lightDir'], 1, 1, 1);\n gl.uniform1f(program.uniforms['u_ambient'], 0.4);\n \n // Render stems\n if (this.stemIndexCount > 0) {\n this.renderBuffers(\n program,\n this.stemPositionBuffer,\n this.stemNormalBuffer,\n this.stemColorBuffer,\n this.stemIndexBuffer,\n this.stemIndexCount\n );\n }\n \n // Render markers\n if (this.showMarkers && this.markerIndexCount > 0) {\n this.renderBuffers(\n program,\n this.markerPositionBuffer,\n this.markerNormalBuffer,\n this.markerColorBuffer,\n this.markerIndexBuffer,\n this.markerIndexCount\n );\n }\n \n // Update stats\n const frameTime = performance.now() - startTime;\n this.lastFrameTime = frameTime;\n this.frameCount++;\n \n const now = performance.now();\n if (now - this.lastFpsUpdate >= 1000) {\n this.fps = this.frameCount;\n this.frameCount = 0;\n this.lastFpsUpdate = now;\n }\n \n this.emitEvent('render');\n }\n \n private renderBuffers(\n program: any,\n posBuffer: WebGLBuffer | null,\n normalBuffer: WebGLBuffer | null,\n colorBuffer: WebGLBuffer | null,\n indexBuffer: WebGLBuffer | null,\n indexCount: number\n ): void {\n const { gl } = this;\n \n // Position\n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0 && posBuffer) {\n gl.bindBuffer(gl.ARRAY_BUFFER, posBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n // Normal\n const normalLoc = program.attributes['a_normal'];\n if (normalLoc >= 0 && normalBuffer) {\n gl.bindBuffer(gl.ARRAY_BUFFER, normalBuffer);\n gl.enableVertexAttribArray(normalLoc);\n gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n // Color\n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0 && colorBuffer) {\n gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);\n gl.drawElements(gl.TRIANGLES, indexCount, gl.UNSIGNED_INT, 0);\n }\n \n startRenderLoop(): void {\n if (this.animationFrameId !== null) return;\n \n const loop = (): void => {\n this.controller.update();\n \n if (this.needsRender) {\n this.render();\n this.needsRender = false;\n }\n \n this.animationFrameId = requestAnimationFrame(loop);\n };\n \n loop();\n }\n \n stopRenderLoop(): void {\n if (this.animationFrameId !== null) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n }\n \n getStats(): RenderStats3D {\n return {\n fps: this.fps,\n instanceCount: this.impulseData?.x.length ?? 0,\n frameTime: this.lastFrameTime,\n drawCalls: this.showMarkers ? 2 : 1,\n };\n }\n \n getCamera(): OrbitCamera {\n return this.camera;\n }\n \n getAxisLabels() {\n if (!this.axes) return [];\n return this.axes.getLabels();\n }\n\n getViewProjectionMatrix(): Float32Array {\n return this.camera.getViewProjectionMatrix();\n }\n\n projectToScreen(worldPos: [number, number, number]): { x: number; y: number; visible: boolean } {\n if (!this.axes) return { x: 0, y: 0, visible: false };\n const rect = this.canvas.getBoundingClientRect();\n const viewProj = this.camera.getViewProjectionMatrix();\n return this.axes.projectToScreen(worldPos, viewProj, rect.width, rect.height);\n }\n\n exportImage(\n format: 'png' | 'jpeg' | 'webp' = 'png',\n quality = 0.92,\n transparent = false\n ): string {\n const savedBg = [...this.backgroundColor];\n if (transparent && format === 'png') {\n this.backgroundColor = [0, 0, 0, 0];\n }\n this.render();\n this.backgroundColor = savedBg as [number, number, number, number];\n const mimeType = `image/${format}`;\n return this.canvas.toDataURL(mimeType, quality);\n }\n \n on(event: string, callback: Renderer3DEventCallback): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n \n off(event: string, callback: Renderer3DEventCallback): void {\n this.eventListeners.get(event)?.delete(callback);\n }\n \n private emitEvent(type: string): void {\n const listeners = this.eventListeners.get(type);\n if (!listeners) return;\n \n const event: Renderer3DEvent = {\n type: type as any,\n timestamp: performance.now(),\n stats: this.getStats(),\n camera: {\n target: [...this.camera.target] as [number, number, number],\n radius: this.camera.radius,\n theta: this.camera.theta,\n phi: this.camera.phi,\n fov: this.camera.fov,\n },\n };\n \n listeners.forEach(callback => callback(event));\n }\n \n destroy(): void {\n this.stopRenderLoop();\n \n window.removeEventListener('resize', this.handleResize);\n \n if (this.tooltip) {\n this.tooltip.destroy();\n if (this.boundHandleMouseMove) this.canvas.removeEventListener('mousemove', this.boundHandleMouseMove);\n if (this.boundHandleMouseLeave) this.canvas.removeEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n \n const { gl } = this;\n \n // Stem buffers\n if (this.stemVao) gl.deleteVertexArray(this.stemVao);\n if (this.stemPositionBuffer) gl.deleteBuffer(this.stemPositionBuffer);\n if (this.stemNormalBuffer) gl.deleteBuffer(this.stemNormalBuffer);\n if (this.stemColorBuffer) gl.deleteBuffer(this.stemColorBuffer);\n if (this.stemIndexBuffer) gl.deleteBuffer(this.stemIndexBuffer);\n \n // Marker buffers\n if (this.markerVao) gl.deleteVertexArray(this.markerVao);\n if (this.markerPositionBuffer) gl.deleteBuffer(this.markerPositionBuffer);\n if (this.markerNormalBuffer) gl.deleteBuffer(this.markerNormalBuffer);\n if (this.markerColorBuffer) gl.deleteBuffer(this.markerColorBuffer);\n if (this.markerIndexBuffer) gl.deleteBuffer(this.markerIndexBuffer);\n \n this.controller.destroy();\n deleteProgramBundle(gl, this.programs);\n \n if (this.axes) {\n this.axes.destroy();\n }\n \n this.eventListeners.clear();\n }\n}\n","/**\n * Line 3D Renderer\n * Renders continuous 3D lines/tubes with configurable thickness.\n * Uses a tube geometry approach for smooth lines.\n */\n\nimport { OrbitCamera, type OrbitCameraOptions } from './camera/OrbitCamera';\nimport { OrbitController, type OrbitControllerOptions } from './controls/OrbitController';\nimport {\n createProgramBundle3D,\n deleteProgramBundle,\n type ProgramBundle3D,\n} from './shader/programs';\nimport { Axes3D, type Axes3DOptions } from './Axes3D';\nimport { Tooltip3D, type Tooltip3DOptions } from './Tooltip3D';\nimport type {\n Renderer3DOptions,\n Bounds3D,\n RenderStats3D,\n Renderer3DEvent,\n Renderer3DEventCallback,\n} from './types';\nimport { createRayFromScreen, pickLine } from './Raycaster3D';\n\nexport interface Line3DData {\n /** X coordinates */\n x: Float32Array;\n /** Y coordinates */\n y: Float32Array;\n /** Z coordinates */\n z: Float32Array;\n /** Color per vertex (optional, RGB) */\n colors?: Float32Array;\n /** Single line color [r, g, b] (used if colors not provided) */\n color?: [number, number, number];\n}\n\nexport interface Line3DRendererOptions extends Renderer3DOptions {\n camera?: OrbitCameraOptions;\n controls?: OrbitControllerOptions;\n axes?: Axes3DOptions;\n showAxes?: boolean;\n /** Line thickness in world units (default: 0.05) */\n lineWidth?: number;\n /** Number of segments around the tube (default: 8) */\n tubeSides?: number;\n /** Enable tooltips (default: true) */\n enableTooltip?: boolean;\n tooltip?: Tooltip3DOptions;\n}\n\nexport class Line3DRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGL2RenderingContext;\n private dpr: number;\n \n private programs: ProgramBundle3D;\n private camera: OrbitCamera;\n private controller: OrbitController;\n private axes: Axes3D | null = null;\n \n // Tube geometry buffers\n private vao: WebGLVertexArrayObject | null = null;\n private positionBuffer: WebGLBuffer | null = null;\n private normalBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n private indexCount = 0;\n \n private backgroundColor: [number, number, number, number] = [0.05, 0.05, 0.1, 1];\n private showAxes: boolean;\n private lineWidth: number;\n private tubeSides: number;\n \n private lines: Line3DData[] = [];\n private bounds: Bounds3D | null = null;\n \n private animationFrameId: number | null = null;\n private needsRender = true;\n \n private eventListeners: Map<string, Set<Renderer3DEventCallback>> = new Map();\n \n // Tooltip\n private tooltip: Tooltip3D | null = null;\n private enableTooltip: boolean;\n private lastHitIndex: { series: number, point: number } | null = null;\n private boundHandleMouseMove?: (e: MouseEvent) => void;\n private boundHandleMouseLeave?: () => void;\n \n // Stats\n private lastFrameTime = 0;\n private frameCount = 0;\n private fps = 0;\n private lastFpsUpdate = 0;\n \n constructor(options: Line3DRendererOptions) {\n this.canvas = options.canvas;\n this.dpr = window.devicePixelRatio || 1;\n this.showAxes = options.showAxes ?? true;\n this.lineWidth = options.lineWidth ?? 0.05;\n this.tubeSides = options.tubeSides ?? 8;\n this.enableTooltip = options.enableTooltip ?? true;\n \n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor;\n }\n \n // Get WebGL2 context\n const gl = this.canvas.getContext('webgl2', {\n alpha: true,\n antialias: true,\n preserveDrawingBuffer: false,\n });\n \n if (!gl) {\n throw new Error('WebGL2 not supported');\n }\n this.gl = gl;\n \n // Enable depth testing\n gl.enable(gl.DEPTH_TEST);\n gl.depthFunc(gl.LEQUAL);\n \n // Create shader programs\n this.programs = createProgramBundle3D(gl);\n \n // Create buffers\n this.initBuffers();\n \n // Create camera\n this.camera = new OrbitCamera(options.camera);\n \n // Create controller\n this.controller = new OrbitController(this.camera, this.canvas, options.controls);\n this.controller.onChange(() => {\n this.needsRender = true;\n this.emitEvent('cameraChange');\n });\n \n // Create axes\n if (this.showAxes) {\n this.axes = new Axes3D(gl, options.axes);\n }\n \n // Initialize tooltip\n if (this.enableTooltip) {\n this.tooltip = new Tooltip3D(this.canvas.parentElement || document.body, options.tooltip);\n \n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseLeave = this.handleMouseLeave.bind(this);\n this.canvas.addEventListener('mousemove', this.boundHandleMouseMove);\n this.canvas.addEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n \n // Handle resize\n this.resize();\n window.addEventListener('resize', this.handleResize);\n \n // Start render loop\n this.startRenderLoop();\n }\n\n private handleMouseMove(e: MouseEvent): void {\n if (!this.tooltip || this.lines.length === 0) return;\n \n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n \n const hit = this.pickAtScreen(x, y);\n \n if (hit) {\n const isNew = !this.lastHitIndex || \n this.lastHitIndex.series !== hit.seriesIndex || \n this.lastHitIndex.point !== hit.pointIndex;\n \n if (isNew) {\n this.lastHitIndex = { series: hit.seriesIndex, point: hit.pointIndex };\n const line = this.lines[hit.seriesIndex];\n const color = line.color || [0.5, 0.7, 1.0];\n \n this.tooltip.show({\n index: hit.pointIndex,\n position: [line.x[hit.pointIndex], line.y[hit.pointIndex], line.z[hit.pointIndex]],\n color: color,\n customData: { series: hit.seriesIndex }\n }, x, y);\n } else {\n this.tooltip.updatePosition(x, y);\n }\n } else {\n if (this.lastHitIndex) {\n this.tooltip.hide();\n this.lastHitIndex = null;\n }\n }\n }\n\n private handleMouseLeave(): void {\n if (this.tooltip) {\n this.tooltip.hide();\n this.lastHitIndex = null;\n }\n }\n\n pickAtScreen(screenX: number, screenY: number) {\n if (this.lines.length === 0) return null;\n \n const { width, height } = this.getCanvasSize();\n const viewProj = this.camera.getViewProjectionMatrix();\n const ray = createRayFromScreen(screenX, screenY, width, height, viewProj);\n \n return pickLine(ray, this.lines, this.lineWidth * 3);\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n this.positionBuffer = gl.createBuffer();\n this.normalBuffer = gl.createBuffer();\n this.colorBuffer = gl.createBuffer();\n this.indexBuffer = gl.createBuffer();\n \n gl.bindVertexArray(null);\n }\n \n private handleResize = (): void => {\n this.resize();\n this.needsRender = true;\n };\n \n resize(): void {\n const { canvas, gl, dpr, camera } = this;\n \n const width = canvas.clientWidth;\n const height = canvas.clientHeight;\n \n canvas.width = width * dpr;\n canvas.height = height * dpr;\n \n gl.viewport(0, 0, canvas.width, canvas.height);\n camera.aspect = width / height;\n }\n \n /**\n * Set line data (single line or array of lines)\n */\n setData(lines: Line3DData | Line3DData[]): void {\n this.lines = Array.isArray(lines) ? lines : [lines];\n this.buildTubeGeometry();\n this.calculateBounds();\n \n if (this.axes && this.bounds) {\n this.axes.updateBounds(this.bounds);\n }\n \n this.needsRender = true;\n this.emitEvent('dataUpdate');\n }\n \n /**\n * Add a single line\n */\n addLine(line: Line3DData): void {\n this.lines.push(line);\n this.buildTubeGeometry();\n this.calculateBounds();\n \n if (this.axes && this.bounds) {\n this.axes.updateBounds(this.bounds);\n }\n \n this.needsRender = true;\n }\n \n /**\n * Clear all lines\n */\n clearLines(): void {\n this.lines = [];\n this.indexCount = 0;\n this.needsRender = true;\n }\n \n private buildTubeGeometry(): void {\n const { gl, lineWidth, tubeSides, lines } = this;\n \n if (lines.length === 0) {\n this.indexCount = 0;\n return;\n }\n \n const allPositions: number[] = [];\n const allNormals: number[] = [];\n const allColors: number[] = [];\n const allIndices: number[] = [];\n let vertexOffset = 0;\n \n for (const line of lines) {\n const pointCount = line.x.length;\n if (pointCount < 2) continue;\n \n const defaultColor = line.color ?? [0.5, 0.7, 1.0];\n \n // Generate tube cross-section for each segment\n for (let i = 0; i < pointCount; i++) {\n // Current point\n const px = line.x[i];\n const py = line.y[i];\n const pz = line.z[i];\n \n // Calculate tangent direction\n let tx: number, ty: number, tz: number;\n if (i === 0) {\n // Forward difference for first point\n tx = line.x[1] - line.x[0];\n ty = line.y[1] - line.y[0];\n tz = line.z[1] - line.z[0];\n } else if (i === pointCount - 1) {\n // Backward difference for last point\n tx = line.x[i] - line.x[i - 1];\n ty = line.y[i] - line.y[i - 1];\n tz = line.z[i] - line.z[i - 1];\n } else {\n // Central difference for middle points\n tx = line.x[i + 1] - line.x[i - 1];\n ty = line.y[i + 1] - line.y[i - 1];\n tz = line.z[i + 1] - line.z[i - 1];\n }\n \n // Normalize tangent\n const tLen = Math.sqrt(tx * tx + ty * ty + tz * tz);\n if (tLen > 0.0001) {\n tx /= tLen;\n ty /= tLen;\n tz /= tLen;\n }\n \n // Find perpendicular vectors (Frenet frame approximation)\n // Use world up (0, 1, 0) unless tangent is nearly vertical\n let upX = 0, upY = 1, upZ = 0;\n if (Math.abs(ty) > 0.99) {\n upX = 1; upY = 0; upZ = 0;\n }\n \n // Normal = tangent × up\n let nx = ty * upZ - tz * upY;\n let ny = tz * upX - tx * upZ;\n let nz = tx * upY - ty * upX;\n const nLen = Math.sqrt(nx * nx + ny * ny + nz * nz);\n if (nLen > 0.0001) {\n nx /= nLen;\n ny /= nLen;\n nz /= nLen;\n }\n \n // Binormal = tangent × normal\n const bx = ty * nz - tz * ny;\n const by = tz * nx - tx * nz;\n const bz = tx * ny - ty * nx;\n \n // Generate circle of vertices around the point\n for (let s = 0; s < tubeSides; s++) {\n const angle = (s / tubeSides) * Math.PI * 2;\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n \n // Offset from center line\n const ox = (nx * cos + bx * sin) * lineWidth;\n const oy = (ny * cos + by * sin) * lineWidth;\n const oz = (nz * cos + bz * sin) * lineWidth;\n \n allPositions.push(px + ox, py + oy, pz + oz);\n allNormals.push(nx * cos + bx * sin, ny * cos + by * sin, nz * cos + bz * sin);\n \n // Color\n if (line.colors) {\n allColors.push(\n line.colors[i * 3],\n line.colors[i * 3 + 1],\n line.colors[i * 3 + 2]\n );\n } else {\n allColors.push(defaultColor[0], defaultColor[1], defaultColor[2]);\n }\n }\n \n // Generate indices (connect to next ring)\n if (i < pointCount - 1) {\n for (let s = 0; s < tubeSides; s++) {\n const current = vertexOffset + i * tubeSides + s;\n const next = vertexOffset + i * tubeSides + ((s + 1) % tubeSides);\n const currentNext = current + tubeSides;\n const nextNext = next + tubeSides;\n \n // Two triangles per quad\n allIndices.push(current, next, currentNext);\n allIndices.push(next, nextNext, currentNext);\n }\n }\n }\n \n vertexOffset += pointCount * tubeSides;\n }\n \n // Upload to GPU\n const positions = new Float32Array(allPositions);\n const normals = new Float32Array(allNormals);\n const colors = new Float32Array(allColors);\n const indices = new Uint32Array(allIndices);\n \n this.indexCount = indices.length;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, normals, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n }\n \n private calculateBounds(): void {\n if (this.lines.length === 0) {\n this.bounds = null;\n return;\n }\n \n let minX = Infinity, maxX = -Infinity;\n let minY = Infinity, maxY = -Infinity;\n let minZ = Infinity, maxZ = -Infinity;\n \n for (const line of this.lines) {\n for (let i = 0; i < line.x.length; i++) {\n if (line.x[i] < minX) minX = line.x[i];\n if (line.x[i] > maxX) maxX = line.x[i];\n if (line.y[i] < minY) minY = line.y[i];\n if (line.y[i] > maxY) maxY = line.y[i];\n if (line.z[i] < minZ) minZ = line.z[i];\n if (line.z[i] > maxZ) maxZ = line.z[i];\n }\n }\n \n this.bounds = { minX, maxX, minY, maxY, minZ, maxZ };\n }\n \n /**\n * Fit camera to show all data\n */\n fitToData(): void {\n if (!this.bounds) return;\n \n const { minX, maxX, minY, maxY, minZ, maxZ } = this.bounds;\n \n // Add 20% padding to bounds for better fit\n const dx = maxX - minX;\n const dy = maxY - minY;\n const dz = maxZ - minZ;\n const padding = 0.01;\n \n this.camera.fitToBounds(\n minX - dx * padding, minY - dy * padding, minZ - dz * padding,\n maxX + dx * padding, maxY + dy * padding, maxZ + dz * padding\n );\n \n // Closer fit\n this.camera.radius *= 1.05;\n \n this.needsRender = true;\n }\n \n getCanvasSize(): { width: number; height: number } {\n const rect = this.canvas.getBoundingClientRect();\n return { width: rect.width, height: rect.height };\n }\n\n /**\n * Render a single frame\n */\n render(): void {\n const { gl, camera, backgroundColor } = this;\n \n const startTime = performance.now();\n \n // Clear\n gl.clearColor(\n backgroundColor[0],\n backgroundColor[1],\n backgroundColor[2],\n backgroundColor[3]\n );\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n \n // Get view projection matrix\n const viewProj = camera.getViewProjectionMatrix();\n \n // Render axes first\n if (this.axes) {\n this.axes.render(viewProj);\n }\n \n // Render tubes\n if (this.indexCount > 0) {\n const program = this.programs.surfaceProgram;\n gl.useProgram(program.program);\n \n gl.uniformMatrix4fv(program.uniforms['u_viewProjection'], false, viewProj);\n gl.uniform1f(program.uniforms['u_opacity'], 1.0);\n gl.uniform3f(program.uniforms['u_lightDir'], 1, 1, 1);\n gl.uniform1f(program.uniforms['u_ambient'], 0.35);\n \n gl.bindVertexArray(this.vao);\n \n // Position\n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n // Normal\n const normalLoc = program.attributes['a_normal'];\n if (normalLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.enableVertexAttribArray(normalLoc);\n gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n // Color\n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.drawElements(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0);\n \n gl.bindVertexArray(null);\n }\n \n // Update stats\n const frameTime = performance.now() - startTime;\n this.lastFrameTime = frameTime;\n this.frameCount++;\n \n const now = performance.now();\n if (now - this.lastFpsUpdate >= 1000) {\n this.fps = this.frameCount;\n this.frameCount = 0;\n this.lastFpsUpdate = now;\n }\n \n this.emitEvent('render');\n }\n \n startRenderLoop(): void {\n if (this.animationFrameId !== null) return;\n \n const loop = (): void => {\n this.controller.update();\n \n if (this.needsRender) {\n this.render();\n this.needsRender = false;\n }\n \n this.animationFrameId = requestAnimationFrame(loop);\n };\n \n loop();\n }\n \n stopRenderLoop(): void {\n if (this.animationFrameId !== null) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n }\n \n getStats(): RenderStats3D {\n return {\n fps: this.fps,\n instanceCount: this.indexCount / 6, // Approximate triangle count\n frameTime: this.lastFrameTime,\n drawCalls: 1,\n };\n }\n \n getCamera(): OrbitCamera {\n return this.camera;\n }\n \n getAxisLabels() {\n if (!this.axes) return [];\n return this.axes.getLabels();\n }\n\n getViewProjectionMatrix(): Float32Array {\n return this.camera.getViewProjectionMatrix();\n }\n\n projectToScreen(worldPos: [number, number, number]): { x: number; y: number; visible: boolean } {\n if (!this.axes) return { x: 0, y: 0, visible: false };\n const rect = this.canvas.getBoundingClientRect();\n const viewProj = this.camera.getViewProjectionMatrix();\n return this.axes.projectToScreen(worldPos, viewProj, rect.width, rect.height);\n }\n\n exportImage(\n format: 'png' | 'jpeg' | 'webp' = 'png',\n quality = 0.92,\n transparent = false\n ): string {\n const savedBg = [...this.backgroundColor];\n if (transparent && format === 'png') {\n this.backgroundColor = [0, 0, 0, 0];\n }\n this.render();\n this.backgroundColor = savedBg as [number, number, number, number];\n const mimeType = `image/${format}`;\n return this.canvas.toDataURL(mimeType, quality);\n }\n \n on(event: string, callback: Renderer3DEventCallback): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n \n off(event: string, callback: Renderer3DEventCallback): void {\n this.eventListeners.get(event)?.delete(callback);\n }\n \n private emitEvent(type: string): void {\n const listeners = this.eventListeners.get(type);\n if (!listeners) return;\n \n const event: Renderer3DEvent = {\n type: type as any,\n timestamp: performance.now(),\n stats: this.getStats(),\n camera: {\n target: [...this.camera.target] as [number, number, number],\n radius: this.camera.radius,\n theta: this.camera.theta,\n phi: this.camera.phi,\n fov: this.camera.fov,\n },\n };\n \n listeners.forEach(callback => callback(event));\n }\n \n destroy(): void {\n this.stopRenderLoop();\n \n window.removeEventListener('resize', this.handleResize);\n \n if (this.tooltip) {\n this.tooltip.destroy();\n if (this.boundHandleMouseMove) this.canvas.removeEventListener('mousemove', this.boundHandleMouseMove);\n if (this.boundHandleMouseLeave) this.canvas.removeEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n \n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.normalBuffer) gl.deleteBuffer(this.normalBuffer);\n if (this.colorBuffer) gl.deleteBuffer(this.colorBuffer);\n if (this.indexBuffer) gl.deleteBuffer(this.indexBuffer);\n \n this.controller.destroy();\n deleteProgramBundle(gl, this.programs);\n \n if (this.axes) {\n this.axes.destroy();\n }\n \n this.eventListeners.clear();\n }\n}\n","/**\n * High-Density Point Cloud 3D Renderer\n * Renders millions of points using gl.POINTS and Point Sprites.\n * Optimized for massive datasets like LiDAR or medical imaging.\n */\n\nimport { OrbitCamera, type OrbitCameraOptions } from './camera/OrbitCamera';\nimport { OrbitController, type OrbitControllerOptions } from './controls/OrbitController';\nimport {\n createProgramBundle3D,\n deleteProgramBundle,\n type ProgramBundle3D,\n} from './shader/programs';\nimport { Axes3D, type Axes3DOptions } from './Axes3D';\nimport { Tooltip3D } from './Tooltip3D';\nimport { createRayFromScreen, pickBubble } from './Raycaster3D';\nimport type {\n Renderer3DOptions,\n Bounds3D,\n Renderer3DEventCallback,\n} from './types';\nimport { createTheme, type CustomThemeOptions, type ColorTheme } from './colorThemes';\n\nexport interface PointCloudData {\n /** Positions [x0, y0, z0, x1, y1, z1, ...] */\n positions: Float32Array;\n /** Colors per point [r0, g0, b0, ...] (optional) */\n colors?: Float32Array;\n /** Sizes per point (optional) */\n sizes?: Float32Array;\n}\n\nexport interface PointCloud3DRendererOptions extends Renderer3DOptions {\n camera?: OrbitCameraOptions;\n controls?: OrbitControllerOptions;\n axes?: Axes3DOptions;\n showAxes?: boolean;\n /** Global point size multiplier (default: 2.0) */\n pointSize?: number;\n /** Use circular points instead of squares (default: true) */\n circular?: boolean;\n /** Global opacity (default: 1.0) */\n opacity?: number;\n /** Color theme options */\n theme?: CustomThemeOptions;\n /** Enable tooltips */\n enableTooltip?: boolean;\n}\n\nexport class PointCloud3DRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGL2RenderingContext;\n private dpr: number;\n \n private programs: ProgramBundle3D;\n private camera: OrbitCamera;\n private controller: OrbitController;\n private axes: Axes3D | null = null;\n \n // Buffers\n private vao: WebGLVertexArrayObject | null = null;\n private positionBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private sizeBuffer: WebGLBuffer | null = null;\n private pointCount = 0;\n \n private backgroundColor: [number, number, number, number] = [0.05, 0.05, 0.1, 1];\n private globalPointSize: number;\n private circular: boolean;\n private opacity: number;\n \n private positions: Float32Array | null = null;\n private bounds: Bounds3D | null = null;\n \n private animationFrameId: number | null = null;\n private needsRender = true;\n private eventListeners: Map<string, Set<Renderer3DEventCallback>> = new Map();\n \n // Tooltip\n private tooltip: Tooltip3D | null = null;\n private lastHitIndex: number = -1;\n private boundHandleMouseMove?: (e: MouseEvent) => void;\n private boundHandleMouseLeave?: () => void;\n \n // Color theme\n private colorTheme: ColorTheme;\n\n constructor(options: PointCloud3DRendererOptions) {\n this.canvas = options.canvas;\n this.dpr = window.devicePixelRatio || 1;\n this.globalPointSize = options.pointSize ?? 2.0;\n this.circular = options.circular ?? true;\n this.opacity = options.opacity ?? 1.0;\n \n if (options.backgroundColor) this.backgroundColor = options.backgroundColor;\n \n // Initialize color theme\n this.colorTheme = createTheme(options.theme || {}, this.backgroundColor);\n\n const gl = this.canvas.getContext('webgl2', { alpha: true, antialias: true });\n if (!gl) throw new Error('WebGL2 not supported');\n this.gl = gl;\n\n gl.enable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n this.programs = createProgramBundle3D(gl);\n this.camera = new OrbitCamera(options.camera);\n this.controller = new OrbitController(this.camera, this.canvas, options.controls);\n this.controller.onChange(() => { this.needsRender = true; this.emitEvent('cameraChange'); });\n\n if (options.showAxes !== false) {\n this.axes = new Axes3D(gl, options.axes);\n }\n\n if (options.enableTooltip !== false) {\n this.tooltip = new Tooltip3D(this.canvas.parentElement || document.body);\n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseLeave = this.handleMouseLeave.bind(this);\n this.canvas.addEventListener('mousemove', this.boundHandleMouseMove);\n this.canvas.addEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n\n this.initBuffers();\n this.resize();\n window.addEventListener('resize', this.handleResize);\n this.startRenderLoop();\n }\n\n private initBuffers(): void {\n const { gl } = this;\n const program = this.programs.pointCloudProgram;\n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n\n this.positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n const posLoc = program.attributes.a_position;\n if (posLoc !== -1) {\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n this.colorBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n const colorLoc = program.attributes.a_color;\n if (colorLoc !== -1) {\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n this.sizeBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.sizeBuffer);\n const sizeLoc = program.attributes.a_size;\n if (sizeLoc !== -1) {\n gl.enableVertexAttribArray(sizeLoc);\n gl.vertexAttribPointer(sizeLoc, 1, gl.FLOAT, false, 0, 0);\n }\n\n gl.bindVertexArray(null);\n }\n\n setData(data: PointCloudData): void {\n this.positions = data.positions;\n this.pointCount = data.positions.length / 3;\n const { gl } = this;\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, data.positions, gl.DYNAMIC_DRAW);\n\n // Use theme color if no custom colors provided\n const defaultColor = this.colorTheme.seriesPalette[0];\n const colors = data.colors || this.generateThemeColors(this.pointCount, defaultColor);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n\n const sizes = data.sizes || new Float32Array(this.pointCount).fill(1.0);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.sizeBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, sizes, gl.DYNAMIC_DRAW);\n\n this.updateBounds();\n this.needsRender = true;\n }\n\n private updateBounds(): void {\n if (!this.positions) return;\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity, minZ = Infinity, maxZ = -Infinity;\n for (let i = 0; i < this.positions.length; i += 3) {\n const x = this.positions[i], y = this.positions[i+1], z = this.positions[i+2];\n if (x < minX) minX = x; if (x > maxX) maxX = x;\n if (y < minY) minY = y; if (y > maxY) maxY = y;\n if (z < minZ) minZ = z; if (z > maxZ) maxZ = z;\n }\n this.bounds = { minX, maxX, minY, maxY, minZ, maxZ };\n if (this.axes) this.axes.updateBounds(this.bounds);\n }\n \n private generateThemeColors(count: number, defaultColor: [number, number, number]): Float32Array {\n const colors = new Float32Array(count * 3);\n for (let i = 0; i < count; i++) {\n colors[i * 3] = defaultColor[0];\n colors[i * 3 + 1] = defaultColor[1];\n colors[i * 3 + 2] = defaultColor[2];\n }\n return colors;\n }\n\n render(): void {\n const { gl, camera } = this;\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n gl.clearColor(this.backgroundColor[0], this.backgroundColor[1], this.backgroundColor[2], this.backgroundColor[3]);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n\n const viewProj = camera.getViewProjectionMatrix() as Float32Array;\n if (this.axes) this.axes.render(viewProj);\n\n if (this.pointCount > 0 && this.vao) {\n const program = this.programs.pointCloudProgram;\n gl.useProgram(program.program);\n gl.uniformMatrix4fv(program.uniforms.u_viewProjection, false, viewProj);\n gl.uniform1f(program.uniforms.u_opacity, this.opacity);\n gl.uniform1f(program.uniforms.u_globalSize, this.globalPointSize * this.dpr);\n gl.uniform1i(program.uniforms.u_circular, this.circular ? 1 : 0);\n\n gl.bindVertexArray(this.vao);\n gl.drawArrays(gl.POINTS, 0, this.pointCount);\n gl.bindVertexArray(null);\n }\n this.emitEvent('render');\n }\n\n private startRenderLoop(): void {\n const loop = () => {\n const moving = this.controller.update();\n if (this.needsRender || moving) {\n this.render();\n this.needsRender = false;\n }\n this.animationFrameId = requestAnimationFrame(loop);\n };\n this.animationFrameId = requestAnimationFrame(loop);\n }\n\n fitToData(): void {\n if (!this.bounds) return;\n const { minX, maxX, minY, maxY, minZ, maxZ } = this.bounds;\n this.camera.fitToBounds(minX, minY, minZ, maxX, maxY, maxZ);\n this.camera.radius *= 1.2;\n this.needsRender = true;\n }\n\n private handleMouseMove(e: MouseEvent): void {\n if (!this.tooltip || !this.positions) return;\n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left, y = e.clientY - rect.top;\n \n // Efficiency: for PointCloud we only pick if not too many points or use spatial hashing.\n // For now, reuse pickBubble which is optimized with distance check.\n const { width, height } = this.getCanvasSize();\n const viewProj = this.camera.getViewProjectionMatrix() as Float32Array;\n const ray = createRayFromScreen(x, y, width, height, viewProj);\n const hit = pickBubble(ray, this.positions, new Float32Array(this.pointCount).fill(0.2));\n\n if (hit) {\n if (hit.index !== this.lastHitIndex) {\n this.lastHitIndex = hit.index;\n const i3 = hit.index * 3;\n this.tooltip.show({\n index: hit.index,\n position: [this.positions[i3], this.positions[i3+1], this.positions[i3+2]]\n }, x, y);\n } else {\n this.tooltip.updatePosition(x, y);\n }\n } else if (this.lastHitIndex !== -1) {\n this.tooltip.hide();\n this.lastHitIndex = -1;\n }\n }\n\n private handleMouseLeave(): void {\n if (this.tooltip) { this.tooltip.hide(); this.lastHitIndex = -1; }\n }\n\n private handleResize = () => { this.resize(); this.needsRender = true; }\n private resize(): void {\n const width = this.canvas.clientWidth, height = this.canvas.clientHeight;\n this.canvas.width = width * this.dpr; this.canvas.height = height * this.dpr;\n this.gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n this.camera.aspect = width / height;\n }\n getCanvasSize() { const rect = this.canvas.getBoundingClientRect(); return { width: rect.width, height: rect.height }; }\n \n getAxisLabels() {\n return this.axes?.getLabels() ?? [];\n }\n\n getViewProjectionMatrix() {\n return this.camera.getViewProjectionMatrix();\n }\n\n projectToScreen(worldPos: [number, number, number]) {\n if (!this.axes) return { x: 0, y: 0, visible: false };\n const { width, height } = this.getCanvasSize();\n return this.axes.projectToScreen(worldPos, this.camera.getViewProjectionMatrix(), width, height);\n }\n on(event: string, callback: Renderer3DEventCallback): void {\n if (!this.eventListeners.has(event)) this.eventListeners.set(event, new Set());\n this.eventListeners.get(event)!.add(callback);\n }\n private emitEvent(type: string): void {\n const listeners = this.eventListeners.get(type);\n if (!listeners) return;\n listeners.forEach(cb => cb({ \n type: type as any, timestamp: performance.now(), \n stats: { fps: 60, frameTime: 16, instanceCount: this.pointCount, drawCalls: 1 },\n camera: { target: [...this.camera.target] as any, radius: this.camera.radius, theta: this.camera.theta, phi: this.camera.phi, fov: this.camera.fov }\n }));\n }\n\n destroy(): void {\n window.removeEventListener('resize', this.handleResize);\n if (this.animationFrameId) cancelAnimationFrame(this.animationFrameId);\n if (this.tooltip) this.tooltip.destroy();\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n [this.positionBuffer, this.colorBuffer, this.sizeBuffer].forEach(b => b && gl.deleteBuffer(b));\n deleteProgramBundle(gl, this.programs);\n }\n}\n","/**\n * Ribbon 3D Renderer\n * Renders multiple series as 3D ribbons (tapes) with width and lighting.\n * Ideal for comparing multiple 3D profiles or time-series evolution.\n */\n\nimport { OrbitCamera, type OrbitCameraOptions } from './camera/OrbitCamera';\nimport { OrbitController, type OrbitControllerOptions } from './controls/OrbitController';\nimport {\n createProgramBundle3D,\n deleteProgramBundle,\n type ProgramBundle3D,\n} from './shader/programs';\nimport { Axes3D, type Axes3DOptions } from './Axes3D';\nimport { Tooltip3D } from './Tooltip3D';\nimport { createRayFromScreen, pickLine } from './Raycaster3D';\nimport type {\n Renderer3DOptions,\n Bounds3D,\n Renderer3DEventCallback,\n} from './types';\nimport { createTheme, type CustomThemeOptions, type ColorTheme } from './colorThemes';\n\nexport interface RibbonSeriesData {\n /** X coordinates */\n xValues: Float32Array;\n /** Y coordinates */\n yValues: Float32Array;\n /** Z center coordinate of this ribbon */\n z: number;\n /** Width of the ribbon along the Z axis (default 0.5) */\n width?: number;\n /** Color of the ribbon (default: [0.3, 0.8, 1.0]) */\n color?: [number, number, number];\n}\n\nexport interface Ribbon3DRendererOptions extends Renderer3DOptions {\n camera?: OrbitCameraOptions;\n controls?: OrbitControllerOptions;\n axes?: Axes3DOptions;\n showAxes?: boolean;\n /** Global opacity (default: 0.9) */\n opacity?: number;\n /** Enable tooltips */\n enableTooltip?: boolean;\n /** Color theme options */\n theme?: CustomThemeOptions;\n}\n\nexport class Ribbon3DRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGL2RenderingContext;\n private dpr: number;\n \n private programs: ProgramBundle3D;\n private camera: OrbitCamera;\n private controller: OrbitController;\n private axes: Axes3D | null = null;\n \n // Buffers\n private vao: WebGLVertexArrayObject | null = null;\n private positionBuffer: WebGLBuffer | null = null;\n private normalBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n private indexCount = 0;\n \n private backgroundColor: [number, number, number, number] = [0.05, 0.05, 0.1, 1];\n private opacity: number;\n \n private series: RibbonSeriesData[] = [];\n private bounds: Bounds3D | null = null;\n \n private animationFrameId: number | null = null;\n private needsRender = true;\n private eventListeners: Map<string, Set<Renderer3DEventCallback>> = new Map();\n \n // Hover highlight\n private hoveredSeriesIndex: number | null = null;\n private colorTheme: ColorTheme;\n \n // Tooltip\n private tooltip: Tooltip3D | null = null;\n private lastHitIndex: { series: number, point: number } | null = null;\n private boundHandleMouseMove?: (e: MouseEvent) => void;\n private boundHandleMouseLeave?: () => void;\n\n constructor(options: Ribbon3DRendererOptions) {\n this.canvas = options.canvas;\n this.dpr = window.devicePixelRatio || 1;\n this.opacity = options.opacity ?? 0.9;\n \n if (options.backgroundColor) this.backgroundColor = options.backgroundColor;\n \n // Initialize color theme\n this.colorTheme = createTheme(options.theme || {}, this.backgroundColor);\n\n const gl = this.canvas.getContext('webgl2', { alpha: true, antialias: true });\n if (!gl) throw new Error('WebGL2 not supported');\n this.gl = gl;\n\n gl.enable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n this.programs = createProgramBundle3D(gl);\n this.camera = new OrbitCamera(options.camera);\n this.controller = new OrbitController(this.camera, this.canvas, options.controls);\n this.controller.onChange(() => { this.needsRender = true; this.emitEvent('cameraChange'); });\n\n if (options.showAxes !== false) {\n this.axes = new Axes3D(gl, options.axes);\n }\n\n if (options.enableTooltip !== false) {\n this.tooltip = new Tooltip3D(this.canvas.parentElement || document.body);\n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseLeave = this.handleMouseLeave.bind(this);\n this.canvas.addEventListener('mousemove', this.boundHandleMouseMove);\n this.canvas.addEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n\n this.resize();\n window.addEventListener('resize', this.handleResize);\n this.startRenderLoop();\n }\n\n setData(series: RibbonSeriesData[]): void {\n this.series = series;\n this.updateGeometry();\n this.updateBounds();\n this.needsRender = true;\n }\n\n private updateBounds(): void {\n if (this.series.length === 0) return;\n \n let minX = Infinity, maxX = -Infinity;\n let minY = Infinity, maxY = -Infinity;\n let minZ = Infinity, maxZ = -Infinity;\n\n for (const s of this.series) {\n const halfW = (s.width ?? 0.5) / 2;\n if (s.z - halfW < minZ) minZ = s.z - halfW;\n if (s.z + halfW > maxZ) maxZ = s.z + halfW;\n\n for (let i = 0; i < s.xValues.length; i++) {\n const x = s.xValues[i], y = s.yValues[i];\n if (x < minX) minX = x; if (x > maxX) maxX = x;\n if (y < minY) minY = y; if (y > maxY) maxY = y;\n }\n }\n\n this.bounds = { minX, maxX, minY, maxY, minZ, maxZ };\n if (this.axes) this.axes.updateBounds(this.bounds);\n }\n\n private updateGeometry(): void {\n if (this.series.length === 0) return;\n const { gl } = this;\n\n const positions: number[] = [];\n const normals: number[] = [];\n const colors: number[] = [];\n const indices: number[] = [];\n let vertexOffset = 0;\n\n for (let seriesIdx = 0; seriesIdx < this.series.length; seriesIdx++) {\n const s = this.series[seriesIdx];\n \n // Use highlight color if this series is hovered\n const isHovered = seriesIdx === this.hoveredSeriesIndex;\n const col = isHovered \n ? this.colorTheme.highlightColor\n : (s.color || this.colorTheme.seriesPalette[seriesIdx % this.colorTheme.seriesPalette.length]);\n \n const halfW = (s.width ?? 0.5) / 2;\n const n = s.xValues.length;\n\n for (let i = 0; i < n; i++) {\n const x = s.xValues[i], y = s.yValues[i], z = s.z;\n\n // Calculate tangent for normal\n let dx = 0, dy = 1;\n if (i < n - 1) {\n dx = s.xValues[i+1] - x; dy = s.yValues[i+1] - y;\n } else if (i > 0) {\n dx = x - s.xValues[i-1]; dy = y - s.yValues[i-1];\n }\n \n const mag = Math.sqrt(dx*dx + dy*dy);\n const nx = mag > 0 ? dy/mag : 0;\n const ny = mag > 0 ? -dx/mag : 1;\n\n positions.push(x, y, z - halfW);\n positions.push(x, y, z + halfW);\n\n normals.push(nx, ny, 0);\n normals.push(nx, ny, 0);\n\n colors.push(...col);\n colors.push(...col);\n\n if (i < n - 1) {\n const v0 = vertexOffset + i * 2;\n const v1 = v0 + 1;\n const v2 = v0 + 2;\n const v3 = v0 + 3;\n indices.push(v0, v1, v2, v1, v3, v2);\n }\n }\n vertexOffset += n * 2;\n }\n\n const program = this.programs.ribbonProgram;\n if (!this.vao) this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n\n if (!this.positionBuffer) this.positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);\n const posLoc = program.attributes.a_position;\n if (posLoc !== -1) {\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n if (!this.normalBuffer) this.normalBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(normals), gl.STATIC_DRAW);\n const normalLoc = program.attributes.a_normal;\n if (normalLoc !== -1) {\n gl.enableVertexAttribArray(normalLoc);\n gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n if (!this.colorBuffer) this.colorBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);\n const colorLoc = program.attributes.a_color;\n if (colorLoc !== -1) {\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n if (!this.indexBuffer) this.indexBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array(indices), gl.STATIC_DRAW);\n this.indexCount = indices.length;\n\n gl.bindVertexArray(null);\n }\n\n render(): void {\n const { gl, camera } = this;\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n gl.clearColor(this.backgroundColor[0], this.backgroundColor[1], this.backgroundColor[2], this.backgroundColor[3]);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n\n const viewProj = camera.getViewProjectionMatrix() as Float32Array;\n if (this.axes) this.axes.render(viewProj);\n\n if (this.indexCount > 0 && this.vao) {\n const program = this.programs.ribbonProgram;\n gl.useProgram(program.program);\n gl.uniformMatrix4fv(program.uniforms.u_viewProjection, false, viewProj);\n gl.uniform1f(program.uniforms.u_opacity, this.opacity);\n gl.uniform3fv(program.uniforms.u_lightDir, new Float32Array([0.5, 1.0, 0.3]));\n gl.uniform1f(program.uniforms['u_ambient'], 0.6);\n\n gl.bindVertexArray(this.vao);\n gl.drawElements(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0);\n gl.bindVertexArray(null);\n }\n this.emitEvent('render');\n }\n\n private startRenderLoop(): void {\n const loop = () => {\n const moving = this.controller.update();\n if (this.needsRender || moving) {\n this.render();\n this.needsRender = false;\n }\n this.animationFrameId = requestAnimationFrame(loop);\n };\n this.animationFrameId = requestAnimationFrame(loop);\n }\n\n fitToData(): void {\n if (!this.bounds) return;\n const { minX, maxX, minY, maxY, minZ, maxZ } = this.bounds;\n this.camera.fitToBounds(minX, minY, minZ, maxX, maxY, maxZ);\n this.camera.radius *= 1.2;\n this.needsRender = true;\n }\n\n private handleMouseMove(e: MouseEvent): void {\n if (this.series.length === 0) return;\n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left, y = e.clientY - rect.top;\n \n // Pick based on center lines of ribbons\n const { width, height } = this.getCanvasSize();\n const viewProj = this.camera.getViewProjectionMatrix() as Float32Array;\n const ray = createRayFromScreen(x, y, width, height, viewProj);\n \n const lines = this.series.map(s => ({\n x: s.xValues, y: s.yValues,\n z: new Float32Array(s.xValues.length).fill(s.z)\n }));\n \n const hit = pickLine(ray, lines, 0.4);\n \n // Update hovered series\n const newHoveredIndex = hit ? hit.seriesIndex : null;\n if (newHoveredIndex !== this.hoveredSeriesIndex) {\n this.hoveredSeriesIndex = newHoveredIndex;\n this.updateGeometry();\n this.needsRender = true;\n }\n\n // Tooltip logic\n if (this.tooltip) {\n if (hit) {\n if (!this.lastHitIndex || this.lastHitIndex.series !== hit.seriesIndex || this.lastHitIndex.point !== hit.pointIndex) {\n this.lastHitIndex = { series: hit.seriesIndex, point: hit.pointIndex };\n const s = this.series[hit.seriesIndex];\n this.tooltip.show({\n index: hit.pointIndex,\n position: [s.xValues[hit.pointIndex], s.yValues[hit.pointIndex], s.z],\n color: s.color || [0.3, 0.8, 1.0],\n customData: { Series: hit.seriesIndex, Z: s.z.toFixed(2) }\n }, x, y);\n } else {\n this.tooltip.updatePosition(x, y);\n }\n } else if (this.lastHitIndex) {\n this.tooltip.hide();\n this.lastHitIndex = null;\n }\n }\n }\n\n private handleMouseLeave(): void {\n // Reset highlight\n if (this.hoveredSeriesIndex !== null) {\n this.hoveredSeriesIndex = null;\n this.updateGeometry();\n this.needsRender = true;\n }\n \n if (this.tooltip) { this.tooltip.hide(); this.lastHitIndex = null; }\n }\n\n private handleResize = () => { this.resize(); this.needsRender = true; }\n private resize(): void {\n const width = this.canvas.clientWidth, height = this.canvas.clientHeight;\n this.canvas.width = width * this.dpr; this.canvas.height = height * this.dpr;\n this.gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n this.camera.aspect = width / height;\n }\n getCanvasSize() { const rect = this.canvas.getBoundingClientRect(); return { width: rect.width, height: rect.height }; }\n \n getAxisLabels() {\n return this.axes?.getLabels() ?? [];\n }\n\n getViewProjectionMatrix() {\n return this.camera.getViewProjectionMatrix();\n }\n\n projectToScreen(worldPos: [number, number, number]) {\n if (!this.axes) return { x: 0, y: 0, visible: false };\n const { width, height } = this.getCanvasSize();\n return this.axes.projectToScreen(worldPos, this.camera.getViewProjectionMatrix(), width, height);\n }\n on(event: string, callback: Renderer3DEventCallback): void {\n if (!this.eventListeners.has(event)) this.eventListeners.set(event, new Set());\n this.eventListeners.get(event)!.add(callback);\n }\n private emitEvent(type: string): void {\n const listeners = this.eventListeners.get(type);\n if (!listeners) return;\n listeners.forEach(cb => cb({ \n type: type as any, timestamp: performance.now(), \n stats: { fps: 60, frameTime: 16, instanceCount: this.series.length, drawCalls: 1 },\n camera: { target: [...this.camera.target] as any, radius: this.camera.radius, theta: this.camera.theta, phi: this.camera.phi, fov: this.camera.fov }\n }));\n }\n\n destroy(): void {\n window.removeEventListener('resize', this.handleResize);\n if (this.animationFrameId) cancelAnimationFrame(this.animationFrameId);\n if (this.tooltip) this.tooltip.destroy();\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n [this.positionBuffer, this.normalBuffer, this.colorBuffer, this.indexBuffer].forEach(b => b && gl.deleteBuffer(b));\n deleteProgramBundle(gl, this.programs);\n }\n}\n","/**\n * Surface Bar 3D Renderer (3D Histogram)\n * Renders a grid of vertical bars on a 3D plane.\n * Optimized for 3D histograms, grid-based population density, or spatial data.\n */\n\nimport { OrbitCamera, type OrbitCameraOptions } from './camera/OrbitCamera';\nimport { OrbitController, type OrbitControllerOptions } from './controls/OrbitController';\nimport {\n createProgramBundle3D,\n deleteProgramBundle,\n type ProgramBundle3D,\n} from './shader/programs';\nimport { Axes3D, type Axes3DOptions } from './Axes3D';\nimport { Tooltip3D } from './Tooltip3D';\nimport { createRayFromScreen, pickBubble } from './Raycaster3D';\nimport { createVoxelCube } from './mesh';\nimport type {\n Renderer3DOptions,\n Bounds3D,\n Renderer3DEventCallback,\n} from './types';\nimport { createTheme, type CustomThemeOptions, type ColorTheme } from './colorThemes';\n\nexport interface SurfaceBarData {\n /** Number of rows in the grid (Z axis) */\n rows: number;\n /** Number of columns in the grid (X axis) */\n cols: number;\n /** Height values for each bar [v_0_0, v_0_1, ..., v_r-1_c-1] */\n heights: Float32Array;\n /** Colors per bar [r0, g0, b0, ...] (optional) */\n colors?: Float32Array;\n /** Origin point of the grid [x, y, z] (default [0,0,0]) */\n origin?: [number, number, number];\n /** Spacing between bars [dx, dz] (default [1,1]) */\n spacing?: [number, number];\n}\n\nexport interface SurfaceBar3DRendererOptions extends Renderer3DOptions {\n camera?: OrbitCameraOptions;\n controls?: OrbitControllerOptions;\n axes?: Axes3DOptions;\n showAxes?: boolean;\n /** Opacity (default: 1.0) */\n opacity?: number;\n /** Bar scale (default: 1.0) */\n barScale?: number;\n /** Color theme options */\n theme?: CustomThemeOptions;\n /** Enable tooltips */\n enableTooltip?: boolean;\n}\n\nexport class SurfaceBar3DRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGL2RenderingContext;\n private dpr: number;\n \n private programs: ProgramBundle3D;\n private camera: OrbitCamera;\n private controller: OrbitController;\n private axes: Axes3D | null = null;\n \n // Base cube geometry\n private vao: WebGLVertexArrayObject | null = null;\n private positionBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n private indexCount = 0;\n\n // Instance buffers\n private instancePosBuffer: WebGLBuffer | null = null;\n private heightBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private barCount = 0;\n \n private backgroundColor: [number, number, number, number] = [0.05, 0.05, 0.1, 1];\n private barWidth: number = 0.8;\n private barDepth: number = 0.8;\n private barScale: number;\n private opacity: number;\n \n private data: SurfaceBarData | null = null;\n private bounds: Bounds3D | null = null;\n \n private animationFrameId: number | null = null;\n private needsRender = true;\n private eventListeners: Map<string, Set<Renderer3DEventCallback>> = new Map();\n \n // Tooltip\n private tooltip: Tooltip3D | null = null;\n private lastHitIndex: number = -1;\n private boundHandleMouseMove?: (e: MouseEvent) => void;\n private boundHandleMouseLeave?: () => void;\n \n // Color theme\n private colorTheme: ColorTheme;\n\n constructor(options: SurfaceBar3DRendererOptions) {\n this.canvas = options.canvas;\n this.dpr = window.devicePixelRatio || 1;\n this.barScale = options.barScale ?? 0.8;\n this.opacity = options.opacity ?? 1.0;\n \n if (options.backgroundColor) this.backgroundColor = options.backgroundColor;\n \n // Initialize color theme\n this.colorTheme = createTheme(options.theme || {}, this.backgroundColor);\n\n const gl = this.canvas.getContext('webgl2', { alpha: true, antialias: true });\n if (!gl) throw new Error('WebGL2 not supported');\n this.gl = gl;\n\n gl.enable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n this.programs = createProgramBundle3D(gl);\n this.camera = new OrbitCamera(options.camera);\n this.controller = new OrbitController(this.camera, this.canvas, options.controls);\n this.controller.onChange(() => { this.needsRender = true; this.emitEvent('cameraChange'); });\n\n if (options.showAxes !== false) {\n this.axes = new Axes3D(gl, options.axes);\n }\n\n if (options.enableTooltip !== false) {\n this.tooltip = new Tooltip3D(this.canvas.parentElement || document.body);\n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseLeave = this.handleMouseLeave.bind(this);\n this.canvas.addEventListener('mousemove', this.boundHandleMouseMove);\n this.canvas.addEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n\n this.initBuffers();\n this.resize();\n window.addEventListener('resize', this.handleResize);\n this.startRenderLoop();\n }\n\n private initBuffers(): void {\n const { gl } = this;\n const cube = createVoxelCube();\n const program = this.programs.surfaceBarProgram;\n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n\n this.positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, cube.positions, gl.STATIC_DRAW);\n const posLoc = program.attributes.a_position;\n if (posLoc !== -1) {\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n this.indexBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, cube.indices, gl.STATIC_DRAW);\n this.indexCount = cube.indices.length;\n\n // Instance attributes\n this.instancePosBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instancePosBuffer);\n const instPosLoc = program.attributes.a_instancePos;\n if (instPosLoc !== -1) {\n gl.enableVertexAttribArray(instPosLoc);\n gl.vertexAttribPointer(instPosLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(instPosLoc, 1);\n }\n\n this.heightBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.heightBuffer);\n const heightLoc = program.attributes.a_height;\n if (heightLoc !== -1) {\n gl.enableVertexAttribArray(heightLoc);\n gl.vertexAttribPointer(heightLoc, 1, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(heightLoc, 1);\n }\n\n this.colorBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n const colorLoc = program.attributes.a_color;\n if (colorLoc !== -1) {\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(colorLoc, 1);\n }\n\n gl.bindVertexArray(null);\n }\n\n setData(data: SurfaceBarData): void {\n this.data = data;\n const { rows, cols, spacing = [1, 1], origin = [0, 0, 0] } = data;\n this.barCount = rows * cols;\n this.barWidth = spacing[0] * this.barScale;\n this.barDepth = spacing[1] * this.barScale;\n\n const positions = new Float32Array(this.barCount * 3);\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const i = (r * cols + c) * 3;\n positions[i] = origin[0] + c * spacing[0];\n positions[i + 1] = origin[1]; // Base Y\n positions[i + 2] = origin[2] + r * spacing[1];\n }\n }\n\n const { gl } = this;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instancePosBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.heightBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, data.heights, gl.STATIC_DRAW);\n\n // Use theme palette if no colors provided\n const colors = data.colors || this.generateThemeColors(this.barCount);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);\n\n this.updateBounds();\n this.needsRender = true;\n }\n\n private updateBounds(): void {\n if (!this.data) return;\n const { rows, cols, heights, spacing = [1, 1], origin = [0, 0, 0] } = this.data;\n \n let maxH = -Infinity, minH = Infinity;\n for (let i = 0; i < heights.length; i++) {\n if (heights[i] > maxH) maxH = heights[i];\n if (heights[i] < minH) minH = heights[i];\n }\n\n this.bounds = {\n minX: origin[0] - spacing[0]/2,\n maxX: origin[0] + (cols - 1) * spacing[0] + spacing[0]/2,\n minY: origin[1],\n maxY: origin[1] + maxH,\n minZ: origin[2] - spacing[1]/2,\n maxZ: origin[2] + (rows - 1) * spacing[1] + spacing[1]/2\n };\n if (this.axes) this.axes.updateBounds(this.bounds);\n }\n \n private generateThemeColors(count: number): Float32Array {\n const colors = new Float32Array(count * 3);\n const palette = this.colorTheme.seriesPalette;\n for (let i = 0; i < count; i++) {\n const c = palette[i % palette.length];\n colors[i * 3] = c[0];\n colors[i * 3 + 1] = c[1];\n colors[i * 3 + 2] = c[2];\n }\n return colors;\n }\n\n render(): void {\n const { gl, camera } = this;\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n gl.clearColor(this.backgroundColor[0], this.backgroundColor[1], this.backgroundColor[2], this.backgroundColor[3]);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n\n const viewProj = camera.getViewProjectionMatrix() as Float32Array;\n if (this.axes) this.axes.render(viewProj);\n\n if (this.barCount > 0 && this.vao) {\n const program = this.programs.surfaceBarProgram;\n gl.useProgram(program.program);\n gl.uniformMatrix4fv(program.uniforms.u_viewProjection, false, viewProj);\n gl.uniform1f(program.uniforms.u_opacity, this.opacity);\n gl.uniform1f(program.uniforms.u_barWidth, this.barWidth);\n gl.uniform1f(program.uniforms.u_barDepth, this.barDepth);\n gl.uniform3fv(program.uniforms.u_lightDir, new Float32Array([0.5, 1, 0.3]));\n\n gl.bindVertexArray(this.vao);\n gl.drawElementsInstanced(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_SHORT, 0, this.barCount);\n gl.bindVertexArray(null);\n }\n this.emitEvent('render');\n }\n\n private startRenderLoop(): void {\n const loop = () => {\n const moving = this.controller.update();\n if (this.needsRender || moving) {\n this.render();\n this.needsRender = false;\n }\n this.animationFrameId = requestAnimationFrame(loop);\n };\n this.animationFrameId = requestAnimationFrame(loop);\n }\n\n fitToData(): void {\n if (!this.bounds) return;\n const { minX, maxX, minY, maxY, minZ, maxZ } = this.bounds;\n this.camera.fitToBounds(minX, minY, minZ, maxX, maxY, maxZ);\n this.camera.radius *= 1.3;\n this.needsRender = true;\n }\n\n private handleMouseMove(e: MouseEvent): void {\n if (!this.tooltip || !this.data) return;\n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left, y = e.clientY - rect.top;\n \n const { width, height } = this.getCanvasSize();\n const viewProj = this.camera.getViewProjectionMatrix() as Float32Array;\n const ray = createRayFromScreen(x, y, width, height, viewProj);\n \n // Pick based on bar centers (offset by height/2)\n const { rows, cols, heights, spacing = [1,1], origin = [0,0,0] } = this.data;\n const centers = new Float32Array(this.barCount * 3);\n const radii = new Float32Array(this.barCount);\n\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const idx = r * cols + c;\n centers[idx*3] = origin[0] + c * spacing[0];\n centers[idx*3+1] = origin[1] + heights[idx] / 2;\n centers[idx*3+2] = origin[2] + r * spacing[1];\n radii[idx] = Math.max(this.barWidth, this.barDepth, heights[idx]) * 0.6;\n }\n }\n\n const hit = pickBubble(ray, centers, radii);\n\n if (hit) {\n if (hit.index !== this.lastHitIndex) {\n this.lastHitIndex = hit.index;\n const val = this.data.heights[hit.index];\n const r = Math.floor(hit.index / cols);\n const c = hit.index % cols;\n\n this.tooltip.show({\n index: hit.index,\n position: [centers[hit.index*3], origin[1] + heights[hit.index], centers[hit.index*3+2]],\n customData: { Height: val.toFixed(2), Row: r, Col: c }\n }, x, y);\n } else {\n this.tooltip.updatePosition(x, y);\n }\n } else if (this.lastHitIndex !== -1) {\n this.tooltip.hide();\n this.lastHitIndex = -1;\n }\n }\n\n private handleMouseLeave(): void {\n if (this.tooltip) { this.tooltip.hide(); this.lastHitIndex = -1; }\n }\n\n private handleResize = () => { this.resize(); this.needsRender = true; }\n private resize(): void {\n const width = this.canvas.clientWidth, height = this.canvas.clientHeight;\n this.canvas.width = width * this.dpr; this.canvas.height = height * this.dpr;\n this.gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n this.camera.aspect = width / height;\n }\n getCanvasSize() { const rect = this.canvas.getBoundingClientRect(); return { width: rect.width, height: rect.height }; }\n \n getAxisLabels() {\n return this.axes?.getLabels() ?? [];\n }\n\n getViewProjectionMatrix() {\n return this.camera.getViewProjectionMatrix();\n }\n\n projectToScreen(worldPos: [number, number, number]) {\n if (!this.axes) return { x: 0, y: 0, visible: false };\n const { width, height } = this.getCanvasSize();\n return this.axes.projectToScreen(worldPos, this.camera.getViewProjectionMatrix(), width, height);\n }\n \n on(event: string, callback: Renderer3DEventCallback): void {\n if (!this.eventListeners.has(event)) this.eventListeners.set(event, new Set());\n this.eventListeners.get(event)!.add(callback);\n }\n\n private emitEvent(type: string): void {\n const listeners = this.eventListeners.get(type);\n if (!listeners) return;\n listeners.forEach(cb => cb({ \n type: type as any, timestamp: performance.now(), \n stats: { fps: 60, frameTime: 16, instanceCount: this.barCount, drawCalls: 1 },\n camera: { target: [...this.camera.target] as any, radius: this.camera.radius, theta: this.camera.theta, phi: this.camera.phi, fov: this.camera.fov }\n }));\n }\n\n destroy(): void {\n window.removeEventListener('resize', this.handleResize);\n if (this.animationFrameId) cancelAnimationFrame(this.animationFrameId);\n if (this.tooltip) this.tooltip.destroy();\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n [this.positionBuffer, this.indexBuffer, this.instancePosBuffer, this.heightBuffer, this.colorBuffer].forEach(b => b && gl.deleteBuffer(b));\n deleteProgramBundle(gl, this.programs);\n }\n}\n","/**\n * Surface Mesh 3D renderer.\n * Renders a grid-based height map with optional colormap.\n */\n\nimport type { ShaderProgram3D } from '../shader/programs';\nimport type { SurfaceMesh3DData } from './types';\n\nexport interface SurfaceMeshOptions {\n maxVertices?: number;\n}\n\nexport class SurfaceMesh3D {\n private gl: WebGL2RenderingContext;\n private vao: WebGLVertexArrayObject | null = null;\n \n private positionBuffer: WebGLBuffer | null = null;\n private normalBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n private wireframeIndexBuffer: WebGLBuffer | null = null;\n \n private vertexCount = 0;\n private indexCount = 0;\n private wireframeIndexCount = 0;\n \n private cols = 0;\n private rows = 0;\n \n constructor(gl: WebGL2RenderingContext, _options: SurfaceMeshOptions = {}) {\n this.gl = gl;\n this.initBuffers();\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n this.positionBuffer = gl.createBuffer();\n this.normalBuffer = gl.createBuffer();\n this.colorBuffer = gl.createBuffer();\n this.indexBuffer = gl.createBuffer();\n this.wireframeIndexBuffer = gl.createBuffer();\n \n gl.bindVertexArray(null);\n }\n \n /**\n * Update mesh data from surface data.\n */\n updateData(data: SurfaceMesh3DData): void {\n const { gl } = this;\n \n this.cols = data.xValues.length;\n this.rows = data.zValues.length;\n this.vertexCount = this.cols * this.rows;\n \n // Generate positions\n const positions = new Float32Array(this.vertexCount * 3);\n const normals = new Float32Array(this.vertexCount * 3);\n \n for (let row = 0; row < this.rows; row++) {\n for (let col = 0; col < this.cols; col++) {\n const idx = row * this.cols + col;\n const i3 = idx * 3;\n \n positions[i3] = data.xValues[col];\n positions[i3 + 1] = data.yValues[idx];\n positions[i3 + 2] = data.zValues[row];\n }\n }\n \n // Calculate normals\n this.calculateNormals(positions, normals);\n \n // Generate colors from height or provided colors\n const colors = data.colors ?? this.generateHeightColors(data.yValues);\n \n // Generate triangle indices\n const indices = this.generateTriangleIndices();\n this.indexCount = indices.length;\n \n // Generate wireframe indices\n const wireframeIndices = this.generateWireframeIndices();\n this.wireframeIndexCount = wireframeIndices.length;\n \n // Upload to GPU\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, normals, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.wireframeIndexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, wireframeIndices, gl.STATIC_DRAW);\n }\n \n private calculateNormals(positions: Float32Array, normals: Float32Array): void {\n const { cols, rows } = this;\n \n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const idx = row * cols + col;\n const i3 = idx * 3;\n \n // Get neighboring heights for gradient\n const h = positions[i3 + 1];\n const hL = col > 0 ? positions[(idx - 1) * 3 + 1] : h;\n const hR = col < cols - 1 ? positions[(idx + 1) * 3 + 1] : h;\n const hD = row > 0 ? positions[(idx - cols) * 3 + 1] : h;\n const hU = row < rows - 1 ? positions[(idx + cols) * 3 + 1] : h;\n \n // Calculate normal from gradient\n const dx = (hR - hL) / 2;\n const dz = (hU - hD) / 2;\n \n const nx = -dx;\n const ny = 1;\n const nz = -dz;\n \n const len = Math.sqrt(nx * nx + ny * ny + nz * nz);\n normals[i3] = nx / len;\n normals[i3 + 1] = ny / len;\n normals[i3 + 2] = nz / len;\n }\n }\n }\n \n private generateHeightColors(yValues: Float32Array): Float32Array {\n const colors = new Float32Array(yValues.length * 3);\n \n // Find min/max\n let minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < yValues.length; i++) {\n if (yValues[i] < minY) minY = yValues[i];\n if (yValues[i] > maxY) maxY = yValues[i];\n }\n \n const range = maxY - minY || 1;\n \n // Viridis-like colormap\n for (let i = 0; i < yValues.length; i++) {\n const t = (yValues[i] - minY) / range;\n const i3 = i * 3;\n \n // Simplified viridis\n colors[i3] = 0.267 + t * 0.329; // R\n colors[i3 + 1] = 0.004 + t * 0.873; // G\n colors[i3 + 2] = 0.329 + t * 0.341; // B\n }\n \n return colors;\n }\n \n private generateTriangleIndices(): Uint32Array {\n const { cols, rows } = this;\n const indices: number[] = [];\n \n for (let row = 0; row < rows - 1; row++) {\n for (let col = 0; col < cols - 1; col++) {\n const topLeft = row * cols + col;\n const topRight = topLeft + 1;\n const bottomLeft = topLeft + cols;\n const bottomRight = bottomLeft + 1;\n \n // Two triangles per quad\n indices.push(topLeft, bottomLeft, topRight);\n indices.push(topRight, bottomLeft, bottomRight);\n }\n }\n \n return new Uint32Array(indices);\n }\n \n private generateWireframeIndices(): Uint32Array {\n const { cols, rows } = this;\n const indices: number[] = [];\n \n // Horizontal lines\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols - 1; col++) {\n const idx = row * cols + col;\n indices.push(idx, idx + 1);\n }\n }\n \n // Vertical lines\n for (let col = 0; col < cols; col++) {\n for (let row = 0; row < rows - 1; row++) {\n const idx = row * cols + col;\n indices.push(idx, idx + cols);\n }\n }\n \n return new Uint32Array(indices);\n }\n \n /**\n * Render the surface mesh.\n */\n render(program: ShaderProgram3D, wireframe = false): void {\n const { gl } = this;\n \n if (this.vertexCount === 0) return;\n \n gl.bindVertexArray(this.vao);\n \n // Position attribute\n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n // Normal attribute\n const normalLoc = program.attributes['a_normal'];\n if (normalLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.enableVertexAttribArray(normalLoc);\n gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n // Color attribute\n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n if (wireframe) {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.wireframeIndexBuffer);\n gl.drawElements(gl.LINES, this.wireframeIndexCount, gl.UNSIGNED_INT, 0);\n } else {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.drawElements(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0);\n }\n \n gl.bindVertexArray(null);\n }\n \n destroy(): void {\n const { gl } = this;\n \n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.normalBuffer) gl.deleteBuffer(this.normalBuffer);\n if (this.colorBuffer) gl.deleteBuffer(this.colorBuffer);\n if (this.indexBuffer) gl.deleteBuffer(this.indexBuffer);\n if (this.wireframeIndexBuffer) gl.deleteBuffer(this.wireframeIndexBuffer);\n }\n}\n","/**\n * Surface Mesh 3D Renderer\n * Complete renderer for surface mesh visualization with axes, camera, and controls.\n */\n\nimport { OrbitCamera, type OrbitCameraOptions } from './camera/OrbitCamera';\nimport { OrbitController, type OrbitControllerOptions } from './controls/OrbitController';\nimport { SurfaceMesh3D } from './series/SurfaceMesh3D';\nimport {\n createProgramBundle3D,\n deleteProgramBundle,\n type ProgramBundle3D,\n} from './shader/programs';\nimport { Axes3D, type Axes3DOptions } from './Axes3D';\nimport { Tooltip3D, type Tooltip3DOptions } from './Tooltip3D';\nimport { createRayFromScreen, pickSurfaceMesh } from './Raycaster3D';\nimport type { SurfaceMesh3DData } from './series/types';\nimport type {\n Renderer3DOptions,\n Bounds3D,\n RenderStats3D,\n Renderer3DEvent,\n Renderer3DEventCallback,\n} from './types';\n\nexport interface SurfaceMesh3DRendererOptions extends Renderer3DOptions {\n camera?: OrbitCameraOptions;\n controls?: OrbitControllerOptions;\n axes?: Axes3DOptions;\n showAxes?: boolean;\n wireframe?: boolean;\n opacity?: number;\n enableLighting?: boolean;\n ambient?: number;\n lightDirection?: [number, number, number];\n /** Enable tooltips on hover (default: true) */\n enableTooltip?: boolean;\n /** Tooltip configuration */\n tooltip?: Tooltip3DOptions;\n}\n\nexport class SurfaceMesh3DRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGL2RenderingContext;\n private dpr: number;\n \n private programs: ProgramBundle3D;\n private mesh: SurfaceMesh3D;\n private camera: OrbitCamera;\n private controller: OrbitController;\n private axes: Axes3D | null = null;\n \n private backgroundColor: [number, number, number, number] = [0.05, 0.05, 0.1, 1];\n private showAxes: boolean;\n private wireframe: boolean;\n private opacity: number;\n private enableLighting: boolean;\n private ambient: number;\n private lightDirection: [number, number, number];\n \n private bounds: Bounds3D | null = null;\n private vertexCount = 0;\n \n private animationFrameId: number | null = null;\n private needsRender = true;\n \n private eventListeners: Map<string, Set<Renderer3DEventCallback>> = new Map();\n \n // Tooltip\n private tooltip: Tooltip3D | null = null;\n private enableTooltipOption: boolean = true;\n private meshData: SurfaceMesh3DData | null = null;\n private boundHandleMouseMove: ((e: MouseEvent) => void) | null = null;\n private boundHandleMouseLeave: (() => void) | null = null;\n \n // Stats\n private lastFrameTime = 0;\n private frameCount = 0;\n private fps = 0;\n private lastFpsUpdate = 0;\n \n constructor(options: SurfaceMesh3DRendererOptions) {\n this.canvas = options.canvas;\n this.dpr = window.devicePixelRatio || 1;\n this.showAxes = options.showAxes ?? true;\n this.wireframe = options.wireframe ?? false;\n this.opacity = options.opacity ?? 1;\n this.enableLighting = options.enableLighting ?? true;\n this.ambient = options.ambient ?? 0.35;\n this.lightDirection = options.lightDirection ?? [1, 1, 1];\n \n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor;\n }\n \n // Get WebGL2 context\n const gl = this.canvas.getContext('webgl2', {\n alpha: true,\n antialias: true,\n preserveDrawingBuffer: false,\n });\n \n if (!gl) {\n throw new Error('WebGL2 not supported');\n }\n this.gl = gl;\n \n // Enable depth testing\n gl.enable(gl.DEPTH_TEST);\n gl.depthFunc(gl.LEQUAL);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n \n // Create shader programs\n this.programs = createProgramBundle3D(gl);\n \n // Create surface mesh\n this.mesh = new SurfaceMesh3D(gl);\n \n // Create camera\n this.camera = new OrbitCamera(options.camera);\n \n // Create controller\n this.controller = new OrbitController(this.camera, this.canvas, options.controls);\n this.controller.onChange(() => {\n this.needsRender = true;\n this.emitEvent('cameraChange');\n });\n \n // Create axes\n if (this.showAxes) {\n this.axes = new Axes3D(gl, options.axes);\n }\n \n // Initialize tooltip\n this.enableTooltipOption = options.enableTooltip ?? true;\n if (this.enableTooltipOption) {\n this.tooltip = new Tooltip3D(this.canvas.parentElement || document.body, {\n ...options.tooltip,\n showScale: false,\n showIndex: false,\n });\n \n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseLeave = this.handleMouseLeave.bind(this);\n this.canvas.addEventListener('mousemove', this.boundHandleMouseMove);\n this.canvas.addEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n \n // Handle resize\n this.resize();\n window.addEventListener('resize', this.handleResize);\n \n // Start render loop\n this.startRenderLoop();\n }\n \n private handleMouseMove(e: MouseEvent): void {\n if (!this.tooltip || !this.meshData) return;\n \n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n \n // Create ray from screen coordinates\n const viewProj = this.camera.getViewProjectionMatrix();\n const ray = createRayFromScreen(x, y, rect.width, rect.height, viewProj);\n \n // Test ray against surface mesh triangles\n const hit = pickSurfaceMesh(\n ray,\n this.meshData.xValues,\n this.meshData.zValues,\n this.meshData.yValues\n );\n \n if (hit) {\n // Only show tooltip when ray actually hits the surface\n this.tooltip.show({\n index: hit.row * this.meshData.xValues.length + hit.col,\n position: hit.point,\n }, x, y);\n } else {\n this.tooltip.hide();\n }\n }\n \n private handleMouseLeave(): void {\n if (this.tooltip) {\n this.tooltip.hide();\n }\n }\n \n private handleResize = (): void => {\n this.resize();\n this.needsRender = true;\n };\n \n resize(): void {\n const { canvas, gl, dpr, camera } = this;\n \n const width = canvas.clientWidth;\n const height = canvas.clientHeight;\n \n canvas.width = width * dpr;\n canvas.height = height * dpr;\n \n gl.viewport(0, 0, canvas.width, canvas.height);\n camera.aspect = width / height;\n }\n \n /**\n * Set surface mesh data\n */\n setData(data: SurfaceMesh3DData): void {\n this.mesh.updateData(data);\n this.meshData = data; // Store for tooltip hover\n this.vertexCount = data.xValues.length * data.zValues.length;\n \n // Calculate bounds\n this.bounds = this.calculateBounds(data);\n \n // Update axes\n if (this.axes && this.bounds) {\n this.axes.updateBounds(this.bounds);\n }\n \n this.needsRender = true;\n this.emitEvent('dataUpdate');\n }\n \n private calculateBounds(data: SurfaceMesh3DData): Bounds3D {\n const xMin = Math.min(...data.xValues);\n const xMax = Math.max(...data.xValues);\n const zMin = Math.min(...data.zValues);\n const zMax = Math.max(...data.zValues);\n \n let yMin = Infinity, yMax = -Infinity;\n for (let i = 0; i < data.yValues.length; i++) {\n if (data.yValues[i] < yMin) yMin = data.yValues[i];\n if (data.yValues[i] > yMax) yMax = data.yValues[i];\n }\n \n return { minX: xMin, maxX: xMax, minY: yMin, maxY: yMax, minZ: zMin, maxZ: zMax };\n }\n \n /**\n * Fit camera to show all data\n */\n fitToData(): void {\n if (!this.bounds) return;\n \n const { minX, maxX, minY, maxY, minZ, maxZ } = this.bounds;\n \n // Add 15% padding to bounds for better fit\n const dx = maxX - minX;\n const dy = maxY - minY;\n const dz = maxZ - minZ;\n const padding = 0.0001;\n \n this.camera.fitToBounds(\n minX - dx * padding, minY - dy * padding, minZ - dz * padding,\n maxX + dx * padding, maxY + dy * padding, maxZ + dz * padding\n );\n \n // Closer fit for impact\n this.camera.radius *= 1.05;\n \n this.needsRender = true;\n }\n \n /**\n * Render a single frame\n */\n render(): void {\n const { gl, programs, mesh, camera, backgroundColor } = this;\n \n const startTime = performance.now();\n \n // Clear\n gl.clearColor(\n backgroundColor[0],\n backgroundColor[1],\n backgroundColor[2],\n backgroundColor[3]\n );\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n \n // Get view projection matrix\n const viewProj = camera.getViewProjectionMatrix();\n \n // Render axes first\n if (this.axes) {\n this.axes.render(viewProj);\n }\n \n // Render surface mesh\n const program = programs.surfaceProgram;\n gl.useProgram(program.program);\n \n // Set uniforms\n gl.uniformMatrix4fv(program.uniforms['u_viewProjection'], false, viewProj);\n gl.uniform1f(program.uniforms['u_opacity'], this.opacity);\n \n if (this.enableLighting) {\n const [lx, ly, lz] = this.lightDirection;\n gl.uniform3f(program.uniforms['u_lightDir'], lx, ly, lz);\n gl.uniform1f(program.uniforms['u_ambient'], this.ambient);\n }\n \n mesh.render(program, this.wireframe);\n \n // Update stats\n const frameTime = performance.now() - startTime;\n this.lastFrameTime = frameTime;\n this.frameCount++;\n \n const now = performance.now();\n if (now - this.lastFpsUpdate >= 1000) {\n this.fps = this.frameCount;\n this.frameCount = 0;\n this.lastFpsUpdate = now;\n }\n \n this.emitEvent('render');\n }\n \n startRenderLoop(): void {\n if (this.animationFrameId !== null) return;\n \n const loop = (): void => {\n this.controller.update();\n \n if (this.needsRender) {\n this.render();\n this.needsRender = false;\n }\n \n this.animationFrameId = requestAnimationFrame(loop);\n };\n \n loop();\n }\n \n stopRenderLoop(): void {\n if (this.animationFrameId !== null) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n }\n \n /**\n * Set wireframe mode\n */\n setWireframe(enabled: boolean): void {\n this.wireframe = enabled;\n this.needsRender = true;\n }\n \n /**\n * Set background color\n */\n setBackgroundColor(color: [number, number, number, number]): void {\n this.backgroundColor = color;\n this.needsRender = true;\n }\n \n /**\n * Get rendering stats\n */\n getStats(): RenderStats3D {\n return {\n fps: this.fps,\n instanceCount: this.vertexCount,\n frameTime: this.lastFrameTime,\n drawCalls: 1,\n };\n }\n \n /**\n * Get the camera\n */\n getCamera(): OrbitCamera {\n return this.camera;\n }\n \n /**\n * Get axis labels for 2D text overlay\n */\n getAxisLabels(): { text: string; worldPosition: [number, number, number]; axis: string; color: [number, number, number] }[] {\n if (!this.axes) return [];\n return this.axes.getLabels();\n }\n \n /**\n * Project world coordinates to screen coordinates\n */\n projectToScreen(worldPos: [number, number, number]): { x: number; y: number; visible: boolean } {\n if (!this.axes) return { x: 0, y: 0, visible: false };\n \n const viewProj = this.camera.getViewProjectionMatrix();\n const rect = this.canvas.getBoundingClientRect();\n \n return this.axes.projectToScreen(worldPos, viewProj, rect.width, rect.height);\n }\n \n /**\n * Get the current view-projection matrix\n */\n getViewProjectionMatrix(): Float32Array {\n return this.camera.getViewProjectionMatrix();\n }\n \n /**\n * Get canvas dimensions\n */\n getCanvasSize(): { width: number; height: number } {\n const rect = this.canvas.getBoundingClientRect();\n return { width: rect.width, height: rect.height };\n }\n \n /**\n * Add event listener\n */\n on(event: string, callback: Renderer3DEventCallback): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n \n /**\n * Remove event listener\n */\n off(event: string, callback: Renderer3DEventCallback): void {\n this.eventListeners.get(event)?.delete(callback);\n }\n \n private emitEvent(type: string): void {\n const listeners = this.eventListeners.get(type);\n if (!listeners) return;\n \n const event: Renderer3DEvent = {\n type: type as any,\n timestamp: performance.now(),\n stats: this.getStats(),\n camera: {\n target: [...this.camera.target] as [number, number, number],\n radius: this.camera.radius,\n theta: this.camera.theta,\n phi: this.camera.phi,\n fov: this.camera.fov,\n },\n };\n \n listeners.forEach(callback => {\n callback(event);\n });\n }\n \n /**\n * Clean up all resources\n */\n destroy(): void {\n this.stopRenderLoop();\n \n window.removeEventListener('resize', this.handleResize);\n \n // Clean up tooltip\n if (this.tooltip) {\n this.tooltip.destroy();\n if (this.boundHandleMouseMove) {\n this.canvas.removeEventListener('mousemove', this.boundHandleMouseMove);\n }\n if (this.boundHandleMouseLeave) {\n this.canvas.removeEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n }\n \n this.controller.destroy();\n this.mesh.destroy();\n deleteProgramBundle(this.gl, this.programs);\n \n if (this.axes) {\n this.axes.destroy();\n }\n \n this.eventListeners.clear();\n }\n}\n","/**\n * Vector Field (Quiver) 3D Renderer\n * Renders an array of vectors (arrows/lines) oriented by direction and scaled by magnitude.\n * Uses instanced rendering for high performance.\n */\n\nimport { OrbitCamera, type OrbitCameraOptions } from './camera/OrbitCamera';\nimport { OrbitController, type OrbitControllerOptions } from './controls/OrbitController';\nimport {\n createProgramBundle3D,\n deleteProgramBundle,\n type ProgramBundle3D,\n} from './shader/programs';\nimport { Axes3D, type Axes3DOptions } from './Axes3D';\nimport { Tooltip3D } from './Tooltip3D';\nimport { createRayFromScreen, pickBubble } from './Raycaster3D';\nimport type {\n Renderer3DOptions,\n Bounds3D,\n Renderer3DEventCallback,\n} from './types';\nimport { createTheme, type CustomThemeOptions, type ColorTheme } from './colorThemes';\n\nexport interface VectorFieldData {\n /** Origin positions [x0, y0, z0, x1, y1, z1, ...] */\n positions: Float32Array;\n /** Direction vectors [dx0, dy0, dz0, dx1, dy1, dz1, ...] */\n directions: Float32Array;\n /** Colors per vector [r0, g0, b0, ...] (optional) */\n colors?: Float32Array;\n /** Single color for all vectors (default: [0.3, 0.8, 1.0]) */\n color?: [number, number, number];\n}\n\nexport interface VectorField3DRendererOptions extends Renderer3DOptions {\n camera?: OrbitCameraOptions;\n controls?: OrbitControllerOptions;\n axes?: Axes3DOptions;\n showAxes?: boolean;\n /** Arrow scale multiplier (default: 1.0) */\n scaleMultiplier?: number;\n /** Opacity for arrows (default: 0.9) */\n opacity?: number;\n /** Color theme options */\n theme?: CustomThemeOptions;\n /** Enable tooltips */\n enableTooltip?: boolean;\n}\n\nexport class VectorField3DRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGL2RenderingContext;\n private dpr: number;\n \n private programs: ProgramBundle3D;\n private camera: OrbitCamera;\n private controller: OrbitController;\n private axes: Axes3D | null = null;\n \n // Base arrow geometry\n private vao: WebGLVertexArrayObject | null = null;\n private positionBuffer: WebGLBuffer | null = null;\n private normalBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n private indexCount = 0;\n\n // Instance buffers\n private instancePosBuffer: WebGLBuffer | null = null;\n private instanceDirBuffer: WebGLBuffer | null = null;\n private instanceColorBuffer: WebGLBuffer | null = null;\n private vectorCount = 0;\n \n private backgroundColor: [number, number, number, number] = [0.05, 0.05, 0.1, 1];\n private scaleMultiplier: number;\n private opacity: number;\n \n private vectorData: VectorFieldData | null = null;\n private bounds: Bounds3D | null = null;\n \n private animationFrameId: number | null = null;\n private needsRender = true;\n private eventListeners: Map<string, Set<Renderer3DEventCallback>> = new Map();\n \n // Tooltip\n private tooltip: Tooltip3D | null = null;\n private lastHitIndex: number = -1;\n private boundHandleMouseMove?: (e: MouseEvent) => void;\n private boundHandleMouseLeave?: () => void;\n \n // Color theme\n private colorTheme: ColorTheme;\n\n constructor(options: VectorField3DRendererOptions) {\n this.canvas = options.canvas;\n this.dpr = window.devicePixelRatio || 1;\n this.scaleMultiplier = options.scaleMultiplier ?? 1.0;\n this.opacity = options.opacity ?? 1.0;\n \n if (options.backgroundColor) this.backgroundColor = options.backgroundColor;\n \n // Initialize color theme\n this.colorTheme = createTheme(options.theme || {}, this.backgroundColor);\n\n const gl = this.canvas.getContext('webgl2', { alpha: true, antialias: true });\n if (!gl) throw new Error('WebGL2 not supported');\n this.gl = gl;\n\n gl.enable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n this.programs = createProgramBundle3D(gl);\n this.camera = new OrbitCamera(options.camera);\n this.controller = new OrbitController(this.camera, this.canvas, options.controls);\n this.controller.onChange(() => { this.needsRender = true; this.emitEvent('cameraChange'); });\n\n if (options.showAxes !== false) {\n this.axes = new Axes3D(gl, options.axes);\n }\n\n if (options.enableTooltip !== false) {\n this.tooltip = new Tooltip3D(this.canvas.parentElement || document.body);\n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseLeave = this.handleMouseLeave.bind(this);\n this.canvas.addEventListener('mousemove', this.boundHandleMouseMove);\n this.canvas.addEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n\n this.initArrowGeometry();\n this.resize();\n window.addEventListener('resize', this.handleResize);\n this.startRenderLoop();\n }\n\n private initArrowGeometry(): void {\n const { gl } = this;\n // Simple arrow shape: box for stem, pyramid for head (simplified here to a pyramid/cone)\n // For now, let's use a simple long pyramid pointing in +Z\n const positions = new Float32Array([\n // Pyramid base\n -0.05, -0.05, 0.0,\n 0.05, -0.05, 0.0,\n 0.05, 0.05, 0.0,\n -0.05, 0.05, 0.0,\n // Tip\n 0.0, 0.0, 1.0\n ]);\n const normals = new Float32Array([\n 0.0, 0.0, -1.0, // base\n 0.0, 0.0, -1.0, \n 0.0, 0.0, -1.0,\n 0.0, 0.0, -1.0,\n 0.0, 1.0, 0.0 // approx tip normal\n ]);\n const indices = new Uint16Array([\n 0, 1, 2, 0, 2, 3, // base\n 0, 1, 4, 1, 2, 4, 2, 3, 4, 3, 0, 4 // sides\n ]);\n\n const program = this.programs.vectorFieldProgram;\n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n\n this.positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);\n const posLoc = program.attributes.a_position;\n if (posLoc !== -1) {\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n this.normalBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, normals, gl.STATIC_DRAW);\n const normalLoc = program.attributes.a_normal;\n if (normalLoc !== -1) {\n gl.enableVertexAttribArray(normalLoc);\n gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n this.indexBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n this.indexCount = indices.length;\n\n // Instance attributes\n this.instancePosBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instancePosBuffer);\n const instPosLoc = program.attributes.a_instancePos;\n if (instPosLoc !== -1) {\n gl.enableVertexAttribArray(instPosLoc);\n gl.vertexAttribPointer(instPosLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(instPosLoc, 1);\n }\n\n this.instanceDirBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceDirBuffer);\n const dirLoc = program.attributes.a_direction;\n if (dirLoc !== -1) {\n gl.enableVertexAttribArray(dirLoc);\n gl.vertexAttribPointer(dirLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(dirLoc, 1);\n }\n\n this.instanceColorBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceColorBuffer);\n const colorLoc = program.attributes.a_color;\n if (colorLoc !== -1) {\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(colorLoc, 1);\n }\n\n gl.bindVertexArray(null);\n }\n\n setData(data: VectorFieldData): void {\n this.vectorData = data;\n this.vectorCount = data.positions.length / 3;\n const { gl } = this;\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instancePosBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, data.positions, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceDirBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, data.directions, gl.STATIC_DRAW);\n\n // Use theme colors if no custom colors provided\n const defaultColor = data.color || this.colorTheme.seriesPalette[0] as [number, number, number];\n const colors = data.colors || new Float32Array(this.vectorCount * 3).fill(0).map((_, i) => defaultColor[i % 3]);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceColorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);\n\n this.updateBounds();\n this.needsRender = true;\n }\n\n private updateBounds(): void {\n if (!this.vectorData) return;\n const p = this.vectorData.positions;\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity, minZ = Infinity, maxZ = -Infinity;\n for (let i = 0; i < p.length; i += 3) {\n if (p[i] < minX) minX = p[i]; if (p[i] > maxX) maxX = p[i];\n if (p[i+1] < minY) minY = p[i+1]; if (p[i+1] > maxY) maxY = p[i+1];\n if (p[i+2] < minZ) minZ = p[i+2]; if (p[i+2] > maxZ) maxZ = p[i+2];\n }\n this.bounds = { minX, maxX, minY, maxY, minZ, maxZ };\n if (this.axes) this.axes.updateBounds(this.bounds);\n }\n\n render(): void {\n const { gl, camera } = this;\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n gl.clearColor(this.backgroundColor[0], this.backgroundColor[1], this.backgroundColor[2], this.backgroundColor[3]);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n\n const viewProj = camera.getViewProjectionMatrix() as Float32Array;\n if (this.axes) this.axes.render(viewProj);\n\n if (this.vectorCount > 0 && this.vao) {\n const program = this.programs.vectorFieldProgram;\n gl.useProgram(program.program);\n gl.uniformMatrix4fv(program.uniforms.u_viewProjection, false, viewProj);\n gl.uniform1f(program.uniforms.u_opacity, this.opacity);\n gl.uniform1f(program.uniforms.u_scaleMultiplier, this.scaleMultiplier);\n gl.uniform3fv(program.uniforms.u_lightDir, new Float32Array([0.5, 1.0, 0.3]));\n\n gl.bindVertexArray(this.vao);\n gl.drawElementsInstanced(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_SHORT, 0, this.vectorCount);\n gl.bindVertexArray(null);\n }\n this.emitEvent('render');\n }\n\n private startRenderLoop(): void {\n const loop = () => {\n const moving = this.controller.update();\n if (this.needsRender || moving) {\n this.render();\n this.needsRender = false;\n }\n this.animationFrameId = requestAnimationFrame(loop);\n };\n this.animationFrameId = requestAnimationFrame(loop);\n }\n\n fitToData(): void {\n if (!this.bounds) return;\n const { minX, maxX, minY, maxY, minZ, maxZ } = this.bounds;\n this.camera.fitToBounds(minX, minY, minZ, maxX, maxY, maxZ);\n this.camera.radius *= 1.2;\n this.needsRender = true;\n }\n\n private handleMouseMove(e: MouseEvent): void {\n if (!this.tooltip || !this.vectorData) return;\n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n \n // Simplificar: usamos pickBubble tratando los orígenes como esferas invisibles\n const { width, height } = this.getCanvasSize();\n const viewProj = this.camera.getViewProjectionMatrix() as Float32Array;\n const ray = createRayFromScreen(x, y, width, height, viewProj);\n const hit = pickBubble(ray, this.vectorData.positions, new Float32Array(this.vectorCount).fill(0.3));\n\n if (hit) {\n if (hit.index !== this.lastHitIndex) {\n this.lastHitIndex = hit.index;\n const i3 = hit.index * 3;\n const dx = this.vectorData.directions[i3];\n const dy = this.vectorData.directions[i3+1];\n const dz = this.vectorData.directions[i3+2];\n const mag = Math.sqrt(dx*dx + dy*dy + dz*dz);\n \n this.tooltip.show({\n index: hit.index,\n position: [this.vectorData.positions[i3], this.vectorData.positions[i3+1], this.vectorData.positions[i3+2]],\n customData: { Magnitude: mag.toFixed(3), Dir: `[${dx.toFixed(2)}, ${dy.toFixed(2)}, ${dz.toFixed(2)}]` }\n }, x, y);\n } else {\n this.tooltip.updatePosition(x, y);\n }\n } else if (this.lastHitIndex !== -1) {\n this.tooltip.hide();\n this.lastHitIndex = -1;\n }\n }\n\n private handleMouseLeave(): void {\n if (this.tooltip) { this.tooltip.hide(); this.lastHitIndex = -1; }\n }\n\n private handleResize = () => { this.resize(); this.needsRender = true; }\n private resize(): void {\n const width = this.canvas.clientWidth, height = this.canvas.clientHeight;\n this.canvas.width = width * this.dpr; this.canvas.height = height * this.dpr;\n this.gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n this.camera.aspect = width / height;\n }\n getCanvasSize() { const rect = this.canvas.getBoundingClientRect(); return { width: rect.width, height: rect.height }; }\n \n getAxisLabels() {\n return this.axes?.getLabels() ?? [];\n }\n\n getViewProjectionMatrix() {\n return this.camera.getViewProjectionMatrix();\n }\n\n projectToScreen(worldPos: [number, number, number]) {\n if (!this.axes) return { x: 0, y: 0, visible: false };\n const { width, height } = this.getCanvasSize();\n return this.axes.projectToScreen(worldPos, this.camera.getViewProjectionMatrix(), width, height);\n }\n on(event: string, callback: Renderer3DEventCallback): void {\n if (!this.eventListeners.has(event)) this.eventListeners.set(event, new Set());\n this.eventListeners.get(event)!.add(callback);\n }\n private emitEvent(type: string): void {\n const listeners = this.eventListeners.get(type);\n if (!listeners) return;\n listeners.forEach(cb => cb({ \n type: type as any, timestamp: performance.now(), \n stats: { fps: 60, frameTime: 16, instanceCount: this.vectorCount, drawCalls: 1 },\n camera: { target: [...this.camera.target] as any, radius: this.camera.radius, theta: this.camera.theta, phi: this.camera.phi, fov: this.camera.fov }\n }));\n }\n\n destroy(): void {\n window.removeEventListener('resize', this.handleResize);\n if (this.animationFrameId) cancelAnimationFrame(this.animationFrameId);\n if (this.tooltip) this.tooltip.destroy();\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n [this.positionBuffer, this.indexBuffer, this.instancePosBuffer, this.instanceDirBuffer, this.instanceColorBuffer].forEach(b => b && gl.deleteBuffer(b));\n deleteProgramBundle(gl, this.programs);\n }\n}\n","/**\n * Volumetric Voxel 3D Renderer\n * Renders a 3D grid of values as cubes (voxels).\n * Optimized for medical imaging (MRI/CT), geological data, or 3D heatmaps.\n */\n\nimport { OrbitCamera, type OrbitCameraOptions } from './camera/OrbitCamera';\nimport { OrbitController, type OrbitControllerOptions } from './controls/OrbitController';\nimport {\n createProgramBundle3D,\n deleteProgramBundle,\n type ProgramBundle3D,\n} from './shader/programs';\nimport { Axes3D, type Axes3DOptions } from './Axes3D';\nimport { Tooltip3D } from './Tooltip3D';\nimport { createRayFromScreen, pickBubble } from './Raycaster3D';\nimport { createVoxelCube } from './mesh';\nimport type {\n Renderer3DOptions,\n Bounds3D,\n Renderer3DEventCallback,\n} from './types';\nimport type { CustomThemeOptions } from './colorThemes';\n\nexport interface VoxelData {\n /** Dimensions of the 3D grid [nx, ny, nz] */\n dimensions: [number, number, number];\n /** Voxel values [v000, v100, ..., v(nx-1)(ny-1)(nz-1)] */\n values: Float32Array;\n /** Voxel positions [x0, y0, z0, ...] if not a regular grid (optional) */\n positions?: Float32Array;\n /** Origin point of the grid [x, y, z] (default [0,0,0]) */\n origin?: [number, number, number];\n /** Spacing between voxels [dx, dy, dz] (default [1,1,1]) */\n spacing?: [number, number, number];\n}\n\nexport interface Voxel3DRendererOptions extends Renderer3DOptions {\n camera?: OrbitCameraOptions;\n controls?: OrbitControllerOptions;\n axes?: Axes3DOptions;\n showAxes?: boolean;\n /** Size scale for each voxel cube (0.0 to 1.0, default 1.0) */\n voxelScale?: number;\n /** Threshold value: voxels below this won't be rendered (default 0.1) */\n threshold?: number;\n /** Global opacity (default: 1.0) */\n opacity?: number;\n /** Enable tooltips */\n enableTooltip?: boolean;\n /** Color theme options */\n theme?: CustomThemeOptions;\n}\n\nexport class Voxel3DRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGL2RenderingContext;\n private dpr: number;\n \n private programs: ProgramBundle3D;\n private camera: OrbitCamera;\n private controller: OrbitController;\n private axes: Axes3D | null = null;\n \n // Base cube geometry\n private vao: WebGLVertexArrayObject | null = null;\n private positionBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n private indexCount = 0;\n\n // Instance buffers\n private instancePosBuffer: WebGLBuffer | null = null;\n private instanceValueBuffer: WebGLBuffer | null = null;\n private voxelCount = 0;\n \n private backgroundColor: [number, number, number, number] = [0.05, 0.05, 0.1, 1];\n private voxelSize: number = 1.0;\n private voxelScale: number;\n private threshold: number;\n private opacity: number;\n \n private data: VoxelData | null = null;\n private bounds: Bounds3D | null = null;\n \n private animationFrameId: number | null = null;\n private needsRender = true;\n private eventListeners: Map<string, Set<Renderer3DEventCallback>> = new Map();\n \n // Tooltip\n private tooltip: Tooltip3D | null = null;\n private lastHitIndex: number = -1;\n private boundHandleMouseMove?: (e: MouseEvent) => void;\n private boundHandleMouseLeave?: () => void;\n\n constructor(options: Voxel3DRendererOptions) {\n this.canvas = options.canvas;\n this.dpr = window.devicePixelRatio || 1;\n this.voxelScale = options.voxelScale ?? 0.95;\n this.threshold = options.threshold ?? 0.1;\n this.opacity = options.opacity ?? 0.8;\n \n if (options.backgroundColor) this.backgroundColor = options.backgroundColor;\n\n const gl = this.canvas.getContext('webgl2', { alpha: true, antialias: true });\n if (!gl) throw new Error('WebGL2 not supported');\n this.gl = gl;\n\n gl.enable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n this.programs = createProgramBundle3D(gl);\n this.camera = new OrbitCamera(options.camera);\n this.controller = new OrbitController(this.camera, this.canvas, options.controls);\n this.controller.onChange(() => { this.needsRender = true; this.emitEvent('cameraChange'); });\n\n if (options.showAxes !== false) {\n this.axes = new Axes3D(gl, options.axes);\n }\n\n if (options.enableTooltip !== false) {\n this.tooltip = new Tooltip3D(this.canvas.parentElement || document.body);\n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseLeave = this.handleMouseLeave.bind(this);\n this.canvas.addEventListener('mousemove', this.boundHandleMouseMove);\n this.canvas.addEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n\n this.initCubeGeometry();\n this.resize();\n window.addEventListener('resize', this.handleResize);\n this.startRenderLoop();\n }\n\n private initCubeGeometry(): void {\n const { gl } = this;\n const cube = createVoxelCube();\n const program = this.programs.voxelProgram;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n\n this.positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, cube.positions, gl.STATIC_DRAW);\n const posLoc = program.attributes.a_position;\n if (posLoc !== -1) {\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n this.indexBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, cube.indices, gl.STATIC_DRAW);\n this.indexCount = cube.indices.length;\n\n // Instance attributes\n this.instancePosBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instancePosBuffer);\n const instPosLoc = program.attributes.a_instancePos;\n if (instPosLoc !== -1) {\n gl.enableVertexAttribArray(instPosLoc);\n gl.vertexAttribPointer(instPosLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(instPosLoc, 1);\n }\n\n this.instanceValueBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceValueBuffer);\n const valueLoc = program.attributes.a_value;\n if (valueLoc !== -1) {\n gl.enableVertexAttribArray(valueLoc);\n gl.vertexAttribPointer(valueLoc, 1, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(valueLoc, 1);\n }\n\n gl.bindVertexArray(null);\n }\n\n setData(data: VoxelData): void {\n this.data = data;\n const { dimensions, spacing = [1, 1, 1], origin = [0, 0, 0] } = data;\n const [nx, ny, nz] = dimensions;\n this.voxelCount = nx * ny * nz;\n this.voxelSize = Math.max(...spacing) * this.voxelScale;\n\n const positions = new Float32Array(this.voxelCount * 3);\n for (let z = 0; z < nz; z++) {\n for (let y = 0; y < ny; y++) {\n for (let x = 0; x < nx; x++) {\n const i = (z * nx * ny + y * nx + x) * 3;\n positions[i] = origin[0] + x * spacing[0];\n positions[i + 1] = origin[1] + y * spacing[1];\n positions[i + 2] = origin[2] + z * spacing[2];\n }\n }\n }\n\n const { gl } = this;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instancePosBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceValueBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, data.values, gl.STATIC_DRAW);\n\n this.updateBounds();\n this.needsRender = true;\n }\n\n private updateBounds(): void {\n if (!this.data) return;\n const { dimensions, spacing = [1, 1, 1], origin = [0, 0, 0] } = this.data;\n const [nx, ny, nz] = dimensions;\n \n this.bounds = {\n minX: origin[0],\n maxX: origin[0] + (nx - 1) * spacing[0],\n minY: origin[1],\n maxY: origin[1] + (ny - 1) * spacing[1],\n minZ: origin[2],\n maxZ: origin[2] + (nz - 1) * spacing[2]\n };\n if (this.axes) this.axes.updateBounds(this.bounds);\n }\n\n render(): void {\n const { gl, camera } = this;\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n gl.clearColor(this.backgroundColor[0], this.backgroundColor[1], this.backgroundColor[2], this.backgroundColor[3]);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n\n const viewProj = camera.getViewProjectionMatrix() as Float32Array;\n if (this.axes) this.axes.render(viewProj);\n\n if (this.voxelCount > 0 && this.vao) {\n const program = this.programs.voxelProgram;\n gl.useProgram(program.program);\n gl.uniformMatrix4fv(program.uniforms.u_viewProjection, false, viewProj);\n gl.uniform1f(program.uniforms.u_opacity, this.opacity);\n gl.uniform1f(program.uniforms.u_voxelSize, this.voxelSize);\n gl.uniform1f(program.uniforms.u_threshold, this.threshold);\n gl.uniform3fv(program.uniforms.u_lightDir, new Float32Array([1, 1, 1]));\n\n gl.bindVertexArray(this.vao);\n gl.drawElementsInstanced(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_SHORT, 0, this.voxelCount);\n gl.bindVertexArray(null);\n }\n this.emitEvent('render');\n }\n\n private startRenderLoop(): void {\n const loop = () => {\n const moving = this.controller.update();\n if (this.needsRender || moving) {\n this.render();\n this.needsRender = false;\n }\n this.animationFrameId = requestAnimationFrame(loop);\n };\n this.animationFrameId = requestAnimationFrame(loop);\n }\n\n fitToData(): void {\n if (!this.bounds) return;\n const { minX, maxX, minY, maxY, minZ, maxZ } = this.bounds;\n this.camera.fitToBounds(minX, minY, minZ, maxX, maxY, maxZ);\n this.camera.radius *= 1.3;\n this.needsRender = true;\n }\n\n private handleMouseMove(e: MouseEvent): void {\n if (!this.tooltip || !this.data) return;\n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left, y = e.clientY - rect.top;\n \n // Pick based on voxel centers\n const { width, height } = this.getCanvasSize();\n const viewProj = this.camera.getViewProjectionMatrix() as Float32Array;\n const ray = createRayFromScreen(x, y, width, height, viewProj);\n \n // We treat voxels as small bubbles for picking purposes\n const nx = this.data.dimensions[0], ny = this.data.dimensions[1], nz = this.data.dimensions[2];\n const positions = new Float32Array(this.voxelCount * 3);\n const { spacing = [1,1,1], origin = [0,0,0] } = this.data;\n\n for (let k = 0; k < nz; k++) {\n for (let j = 0; j < ny; j++) {\n for (let i = 0; i < nx; i++) {\n const idx = (k * nx * ny + j * nx + i);\n if (this.data.values[idx] < this.threshold) continue;\n positions[idx*3] = origin[0] + i * spacing[0];\n positions[idx*3+1] = origin[1] + j * spacing[1];\n positions[idx*3+2] = origin[2] + k * spacing[2];\n }\n }\n }\n\n const hit = pickBubble(ray, positions, new Float32Array(this.voxelCount).fill(this.voxelSize * 0.5));\n\n if (hit) {\n if (hit.index !== this.lastHitIndex) {\n this.lastHitIndex = hit.index;\n const val = this.data.values[hit.index];\n const nx = this.data.dimensions[0], ny = this.data.dimensions[1];\n const vz = Math.floor(hit.index / (nx * ny));\n const vy = Math.floor((hit.index % (nx * ny)) / nx);\n const vx = hit.index % nx;\n\n this.tooltip.show({\n index: hit.index,\n position: [positions[hit.index*3], positions[hit.index*3+1], positions[hit.index*3+2]],\n customData: { Value: val.toFixed(3), Coords: `(${vx}, ${vy}, ${vz})` }\n }, x, y);\n } else {\n this.tooltip.updatePosition(x, y);\n }\n } else if (this.lastHitIndex !== -1) {\n this.tooltip.hide();\n this.lastHitIndex = -1;\n }\n }\n\n private handleMouseLeave(): void {\n if (this.tooltip) { this.tooltip.hide(); this.lastHitIndex = -1; }\n }\n\n private handleResize = () => { this.resize(); this.needsRender = true; }\n private resize(): void {\n const width = this.canvas.clientWidth, height = this.canvas.clientHeight;\n this.canvas.width = width * this.dpr; this.canvas.height = height * this.dpr;\n this.gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n this.camera.aspect = width / height;\n }\n getCanvasSize() { const rect = this.canvas.getBoundingClientRect(); return { width: rect.width, height: rect.height }; }\n \n getAxisLabels() {\n return this.axes?.getLabels() ?? [];\n }\n\n getViewProjectionMatrix() {\n return this.camera.getViewProjectionMatrix();\n }\n\n projectToScreen(worldPos: [number, number, number]) {\n if (!this.axes) return { x: 0, y: 0, visible: false };\n const { width, height } = this.getCanvasSize();\n return this.axes.projectToScreen(worldPos, this.camera.getViewProjectionMatrix(), width, height);\n }\n \n on(event: string, callback: Renderer3DEventCallback): void {\n if (!this.eventListeners.has(event)) this.eventListeners.set(event, new Set());\n this.eventListeners.get(event)!.add(callback);\n }\n\n private emitEvent(type: string): void {\n const listeners = this.eventListeners.get(type);\n if (!listeners) return;\n listeners.forEach(cb => cb({ \n type: type as any, timestamp: performance.now(), \n stats: { fps: 60, frameTime: 16, instanceCount: this.voxelCount, drawCalls: 1 },\n camera: { target: [...this.camera.target] as any, radius: this.camera.radius, theta: this.camera.theta, phi: this.camera.phi, fov: this.camera.fov }\n }));\n }\n\n destroy(): void {\n window.removeEventListener('resize', this.handleResize);\n if (this.animationFrameId) cancelAnimationFrame(this.animationFrameId);\n if (this.tooltip) this.tooltip.destroy();\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n [this.positionBuffer, this.indexBuffer, this.instancePosBuffer, this.instanceValueBuffer].forEach(b => b && gl.deleteBuffer(b));\n deleteProgramBundle(gl, this.programs);\n }\n}\n","/**\n * Waterfall 3D Renderer\n * Renders multiple 3D series (lines or areas) offset along the Z-axis.\n * Ideal for spectrograms and time-series evolution.\n */\n\nimport { OrbitCamera, type OrbitCameraOptions } from './camera/OrbitCamera';\nimport { OrbitController, type OrbitControllerOptions } from './controls/OrbitController';\nimport {\n createProgramBundle3D,\n deleteProgramBundle,\n type ProgramBundle3D,\n} from './shader/programs';\nimport { Axes3D, type Axes3DOptions } from './Axes3D';\nimport { Tooltip3D } from './Tooltip3D';\nimport { createRayFromScreen, pickLine } from './Raycaster3D';\nimport type {\n Renderer3DOptions,\n Bounds3D,\n Renderer3DEvent,\n Renderer3DEventCallback,\n} from './types';\nimport { createTheme, type CustomThemeOptions, type ColorTheme } from './colorThemes';\n\nexport interface WaterfallSeriesData {\n /** Y values for this slice */\n yValues: Float32Array;\n /** Fixed Z coordinate for this slice */\n z: number;\n /** Color for this slice */\n color?: [number, number, number];\n}\n\nexport interface Waterfall3DRendererOptions extends Renderer3DOptions {\n camera?: OrbitCameraOptions;\n controls?: OrbitControllerOptions;\n axes?: Axes3DOptions;\n showAxes?: boolean;\n /** X values shared by all slices */\n xValues: Float32Array;\n /** Visual style: 'line' or 'area' (curtain) */\n sliceStyle?: 'line' | 'area';\n /** Base Y value (if sliceStyle is 'area') */\n baseY?: number;\n /** Global opacity */\n opacity?: number;\n /** Enable tooltips */\n enableTooltip?: boolean;\n /** Color theme options */\n theme?: CustomThemeOptions;\n}\n\nexport class Waterfall3DRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGL2RenderingContext;\n private dpr: number;\n \n private programs: ProgramBundle3D;\n private camera: OrbitCamera;\n private controller: OrbitController;\n private axes: Axes3D | null = null;\n \n // Buffers\n private vao: WebGLVertexArrayObject | null = null;\n private positionBuffer: WebGLBuffer | null = null;\n private normalBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n private indexCount = 0;\n \n private backgroundColor: [number, number, number, number] = [0.05, 0.05, 0.1, 1];\n private sliceStyle: 'line' | 'area';\n private baseY: number;\n private opacity: number;\n private xValues: Float32Array;\n \n private slices: WaterfallSeriesData[] = [];\n private bounds: Bounds3D | null = null;\n \n private animationFrameId: number | null = null;\n private needsRender = true;\n private eventListeners: Map<string, Set<Renderer3DEventCallback>> = new Map();\n \n // Hover highlight\n private hoveredSeriesIndex: number | null = null;\n private colorTheme: ColorTheme;\n \n // Tooltip\n private tooltip: Tooltip3D | null = null;\n private lastHitIndex: { slice: number, point: number } | null = null;\n private boundHandleMouseMove?: (e: MouseEvent) => void;\n private boundHandleMouseLeave?: () => void;\n\n constructor(options: Waterfall3DRendererOptions) {\n this.canvas = options.canvas;\n this.dpr = window.devicePixelRatio || 1;\n this.sliceStyle = options.sliceStyle ?? 'area';\n this.baseY = options.baseY ?? 0;\n this.opacity = options.opacity ?? 0.9;\n this.xValues = options.xValues;\n \n if (options.backgroundColor) this.backgroundColor = options.backgroundColor;\n \n // Initialize color theme\n this.colorTheme = createTheme(options.theme || {}, this.backgroundColor);\n\n const gl = this.canvas.getContext('webgl2', { alpha: true, antialias: true });\n if (!gl) throw new Error('WebGL2 not supported');\n this.gl = gl;\n\n gl.enable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n this.programs = createProgramBundle3D(gl);\n this.camera = new OrbitCamera(options.camera);\n this.controller = new OrbitController(this.camera, this.canvas, options.controls);\n this.controller.onChange(() => { this.needsRender = true; this.emitEvent('cameraChange'); });\n\n if (options.showAxes !== false) {\n this.axes = new Axes3D(gl, options.axes);\n }\n\n if (options.enableTooltip !== false) {\n this.tooltip = new Tooltip3D(this.canvas.parentElement || document.body);\n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseLeave = this.handleMouseLeave.bind(this);\n this.canvas.addEventListener('mousemove', this.boundHandleMouseMove);\n this.canvas.addEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n\n this.resize();\n window.addEventListener('resize', this.handleResize);\n this.startRenderLoop();\n }\n\n setData(slices: WaterfallSeriesData[]): void {\n this.slices = slices;\n this.updateGeometry();\n this.updateBounds();\n this.needsRender = true;\n }\n\n private updateBounds(): void {\n if (this.slices.length === 0 || this.xValues.length === 0) return;\n \n let minX = Infinity, maxX = -Infinity;\n let minY = this.baseY, maxY = -Infinity;\n let minZ = Infinity, maxZ = -Infinity;\n\n for (let i = 0; i < this.xValues.length; i++) {\n const x = this.xValues[i];\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n }\n\n for (const slice of this.slices) {\n if (slice.z < minZ) minZ = slice.z;\n if (slice.z > maxZ) maxZ = slice.z;\n for (let i = 0; i < slice.yValues.length; i++) {\n const y = slice.yValues[i];\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n }\n\n this.bounds = { minX, maxX, minY, maxY, minZ, maxZ };\n if (this.axes) this.axes.updateBounds(this.bounds);\n }\n\n private updateGeometry(): void {\n if (this.slices.length === 0) return;\n const { gl } = this;\n\n const positions: number[] = [];\n const normals: number[] = [];\n const colors: number[] = [];\n const indices: number[] = [];\n let vertexOffset = 0;\n\n // Get color palette from theme\n const colorPalette = this.colorTheme.seriesPalette;\n const highlightColor = this.colorTheme.highlightColor;\n\n for (let sliceIdx = 0; sliceIdx < this.slices.length; sliceIdx++) {\n const slice = this.slices[sliceIdx];\n \n // Use highlight color if this series is hovered\n const isHovered = sliceIdx === this.hoveredSeriesIndex;\n const sliceColor = isHovered \n ? highlightColor\n : (slice.color || colorPalette[sliceIdx % colorPalette.length]);\n \n for (let i = 0; i < this.xValues.length; i++) {\n const x = this.xValues[i];\n const y = slice.yValues[i];\n const z = slice.z;\n\n if (this.sliceStyle === 'area') {\n // Calculate normal for curtain (perpendicular to line direction in XZ plane)\n let nx = 0, ny = 0, nz = 1;\n if (i < this.xValues.length - 1) {\n const dx = this.xValues[i + 1] - x;\n const len = Math.sqrt(dx * dx);\n if (len > 0.001) {\n nx = 0;\n ny = 0;\n nz = 1;\n }\n }\n\n // Top vertex\n positions.push(x, y, z);\n normals.push(nx, ny, nz);\n colors.push(...sliceColor);\n \n // Bottom vertex\n positions.push(x, this.baseY, z);\n normals.push(nx, ny, nz);\n colors.push(...sliceColor); \n\n if (i < this.xValues.length - 1) {\n const v0 = vertexOffset + i * 2;\n const v1 = v0 + 1;\n const v2 = v0 + 2;\n const v3 = v0 + 3;\n indices.push(v0, v1, v2, v1, v3, v2);\n }\n } else {\n // Line style\n positions.push(x, y, z);\n normals.push(0, 0, 1);\n colors.push(...sliceColor);\n if (i < this.xValues.length - 1) {\n indices.push(vertexOffset + i, vertexOffset + i + 1);\n }\n }\n }\n vertexOffset += (this.sliceStyle === 'area' ? this.xValues.length * 2 : this.xValues.length);\n }\n\n const program = this.programs.waterfallProgram;\n if (!this.vao) this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n\n if (!this.positionBuffer) this.positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);\n const posLoc = program.attributes.a_position;\n if (posLoc !== -1) {\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n if (!this.normalBuffer) this.normalBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(normals), gl.STATIC_DRAW);\n const normalLoc = program.attributes.a_normal;\n if (normalLoc !== -1) {\n gl.enableVertexAttribArray(normalLoc);\n gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n if (!this.colorBuffer) this.colorBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);\n const colorLoc = program.attributes.a_color;\n if (colorLoc !== -1) {\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n if (!this.indexBuffer) this.indexBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array(indices), gl.STATIC_DRAW);\n this.indexCount = indices.length;\n\n gl.bindVertexArray(null);\n }\n\n render(): void {\n const { gl, camera } = this;\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n gl.clearColor(this.backgroundColor[0], this.backgroundColor[1], this.backgroundColor[2], this.backgroundColor[3]);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n\n const viewProj = camera.getViewProjectionMatrix() as Float32Array;\n\n if (this.axes) {\n this.axes.render(viewProj);\n }\n\n if (this.indexCount > 0 && this.vao) {\n const program = this.programs.waterfallProgram;\n gl.useProgram(program.program);\n gl.uniformMatrix4fv(program.uniforms.u_viewProjection, false, viewProj);\n gl.uniform1f(program.uniforms.u_opacity, this.opacity);\n \n gl.uniform1f(program.uniforms.u_fadeStart, -1000);\n gl.uniform1f(program.uniforms.u_fadeEnd, 1000);\n gl.uniform3fv(program.uniforms.u_lightDir, new Float32Array([0.5, 1.0, 0.3]));\n gl.uniform1f(program.uniforms.u_ambient, 0.6);\n\n gl.bindVertexArray(this.vao);\n if (this.sliceStyle === 'area') {\n gl.drawElements(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0);\n } else {\n gl.drawElements(gl.LINES, this.indexCount, gl.UNSIGNED_INT, 0);\n }\n gl.bindVertexArray(null);\n }\n \n this.emitEvent('render');\n }\n\n private startRenderLoop(): void {\n const loop = () => {\n const moving = this.controller.update();\n if (this.needsRender || moving) {\n this.render();\n this.needsRender = false;\n }\n this.animationFrameId = requestAnimationFrame(loop);\n };\n this.animationFrameId = requestAnimationFrame(loop);\n }\n\n fitToData(): void {\n if (!this.bounds) return;\n const { minX, maxX, minY, maxY, minZ, maxZ } = this.bounds;\n const dx = maxX - minX, dy = maxY - minY, dz = maxZ - minZ;\n const padding = 0.05;\n this.camera.fitToBounds(\n minX - dx * padding, minY - dy * padding, minZ - dz * padding,\n maxX + dx * padding, maxY + dy * padding, maxZ + dz * padding\n );\n this.camera.radius *= 1.1;\n this.needsRender = true;\n }\n\n private handleMouseMove(e: MouseEvent): void {\n if (this.slices.length === 0) return;\n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n \n const hit = this.pickAtScreen(x, y);\n \n // Update hovered series\n const newHoveredIndex = hit ? hit.seriesIndex : null;\n if (newHoveredIndex !== this.hoveredSeriesIndex) {\n this.hoveredSeriesIndex = newHoveredIndex;\n this.updateGeometry(); // Rebuild with highlight\n this.needsRender = true;\n }\n \n // Tooltip logic\n if (this.tooltip) {\n if (hit) {\n const isNew = !this.lastHitIndex || this.lastHitIndex.slice !== hit.seriesIndex || this.lastHitIndex.point !== hit.pointIndex;\n if (isNew) {\n this.lastHitIndex = { slice: hit.seriesIndex, point: hit.pointIndex };\n const slice = this.slices[hit.seriesIndex];\n this.tooltip.show({\n index: hit.pointIndex,\n position: [this.xValues[hit.pointIndex], slice.yValues[hit.pointIndex], slice.z],\n color: slice.color || [0.2, 0.6, 1.0],\n customData: { series: hit.seriesIndex, z: slice.z.toFixed(2) }\n }, x, y);\n } else {\n this.tooltip.updatePosition(x, y);\n }\n } else {\n if (this.lastHitIndex) {\n this.tooltip.hide();\n this.lastHitIndex = null;\n }\n }\n }\n }\n\n private handleMouseLeave(): void {\n // Reset highlight\n if (this.hoveredSeriesIndex !== null) {\n this.hoveredSeriesIndex = null;\n this.updateGeometry();\n this.needsRender = true;\n }\n \n if (this.tooltip) {\n this.tooltip.hide();\n this.lastHitIndex = null;\n }\n }\n\n pickAtScreen(screenX: number, screenY: number) {\n if (this.slices.length === 0) return null;\n const { width, height } = this.getCanvasSize();\n const viewProj = this.camera.getViewProjectionMatrix() as Float32Array;\n const ray = createRayFromScreen(screenX, screenY, width, height, viewProj);\n \n const lines = this.slices.map(s => ({\n x: this.xValues,\n y: s.yValues,\n z: new Float32Array(this.xValues.length).fill(s.z)\n }));\n \n return pickLine(ray, lines, 0.4);\n }\n\n private handleResize = (): void => {\n this.resize();\n this.needsRender = true;\n }\n\n private resize(): void {\n const width = this.canvas.clientWidth;\n const height = this.canvas.clientHeight;\n this.canvas.width = width * this.dpr;\n this.canvas.height = height * this.dpr;\n this.gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n this.camera.aspect = width / height;\n }\n\n getCanvasSize() {\n const rect = this.canvas.getBoundingClientRect();\n return { width: rect.width, height: rect.height };\n }\n\n getAxisLabels() {\n return this.axes?.getLabels() ?? [];\n }\n\n getViewProjectionMatrix() {\n return this.camera.getViewProjectionMatrix();\n }\n\n projectToScreen(worldPos: [number, number, number]) {\n if (!this.axes) return { x: 0, y: 0, visible: false };\n const { width, height } = this.getCanvasSize();\n return this.axes.projectToScreen(worldPos, this.camera.getViewProjectionMatrix(), width, height);\n }\n\n on(event: string, callback: Renderer3DEventCallback): void {\n if (!this.eventListeners.has(event)) this.eventListeners.set(event, new Set());\n this.eventListeners.get(event)!.add(callback);\n }\n\n private emitEvent(type: string): void {\n const listeners = this.eventListeners.get(type);\n if (!listeners) return;\n const event: Renderer3DEvent = {\n type: type as any,\n timestamp: performance.now(),\n stats: { fps: 60, frameTime: 16, instanceCount: this.slices.length, drawCalls: 1 },\n camera: { target: [...this.camera.target] as any, radius: this.camera.radius, theta: this.camera.theta, phi: this.camera.phi, fov: this.camera.fov }\n };\n listeners.forEach(cb => cb(event));\n }\n\n destroy(): void {\n window.removeEventListener('resize', this.handleResize);\n if (this.animationFrameId) cancelAnimationFrame(this.animationFrameId);\n if (this.tooltip) {\n this.tooltip.destroy();\n if (this.boundHandleMouseMove) this.canvas.removeEventListener('mousemove', this.boundHandleMouseMove);\n if (this.boundHandleMouseLeave) this.canvas.removeEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.normalBuffer) gl.deleteBuffer(this.normalBuffer);\n if (this.colorBuffer) gl.deleteBuffer(this.colorBuffer);\n if (this.indexBuffer) gl.deleteBuffer(this.indexBuffer);\n deleteProgramBundle(gl, this.programs);\n }\n}\n","/**\n * Point Line 3D renderer.\n * Renders connected points in 3D space with optional markers.\n */\n\nimport type { ShaderProgram3D } from '../shader/programs';\nimport type { PointLine3DData } from './types';\n\nexport class PointLine3D {\n private gl: WebGL2RenderingContext;\n private vao: WebGLVertexArrayObject | null = null;\n \n private positionBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n \n private pointCount = 0;\n private showPoints = true;\n private showLines = true;\n private lineWidth = 2;\n private pointSize = 6;\n \n constructor(gl: WebGL2RenderingContext) {\n this.gl = gl;\n this.initBuffers();\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n this.positionBuffer = gl.createBuffer();\n this.colorBuffer = gl.createBuffer();\n \n gl.bindVertexArray(null);\n }\n \n updateData(data: PointLine3DData): void {\n const { gl } = this;\n \n this.pointCount = data.positions.length / 3;\n this.showPoints = data.showPoints ?? true;\n this.showLines = data.showLines ?? true;\n this.lineWidth = data.lineWidth ?? 2;\n this.pointSize = data.pointSize ?? 6;\n \n // Default color if not provided\n const colors = data.colors ?? this.generateDefaultColors(this.pointCount);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, data.positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n }\n \n private generateDefaultColors(count: number): Float32Array {\n const colors = new Float32Array(count * 3);\n for (let i = 0; i < count; i++) {\n const t = i / (count - 1 || 1);\n colors[i * 3] = 0.2 + t * 0.6;\n colors[i * 3 + 1] = 0.6;\n colors[i * 3 + 2] = 1.0 - t * 0.4;\n }\n return colors;\n }\n \n render(program: ShaderProgram3D): void {\n const { gl } = this;\n \n if (this.pointCount === 0) return;\n \n gl.bindVertexArray(this.vao);\n \n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n if (this.showLines) {\n gl.lineWidth(this.lineWidth);\n gl.drawArrays(gl.LINE_STRIP, 0, this.pointCount);\n }\n \n if (this.showPoints) {\n if (program.uniforms['u_pointSize']) {\n gl.uniform1f(program.uniforms['u_pointSize'], this.pointSize);\n }\n gl.drawArrays(gl.POINTS, 0, this.pointCount);\n }\n \n gl.bindVertexArray(null);\n }\n \n destroy(): void {\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.colorBuffer) gl.deleteBuffer(this.colorBuffer);\n }\n}\n","/**\n * Column/Bar 3D renderer.\n * Renders 3D columns/bars at specified positions.\n */\n\nimport type { ShaderProgram3D } from '../shader/programs';\nimport type { Column3DData } from './types';\n\nexport class Column3D {\n private gl: WebGL2RenderingContext;\n private vao: WebGLVertexArrayObject | null = null;\n \n private positionBuffer: WebGLBuffer | null = null;\n private normalBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n \n private indexCount = 0;\n private columnCount = 0;\n \n constructor(gl: WebGL2RenderingContext) {\n this.gl = gl;\n this.initBuffers();\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n this.positionBuffer = gl.createBuffer();\n this.normalBuffer = gl.createBuffer();\n this.colorBuffer = gl.createBuffer();\n this.indexBuffer = gl.createBuffer();\n \n gl.bindVertexArray(null);\n }\n \n updateData(data: Column3DData): void {\n const { gl } = this;\n \n this.columnCount = data.xValues.length;\n const columnWidth = data.columnWidth ?? 0.8;\n const columnDepth = data.columnDepth ?? 0.8;\n \n // 24 vertices per column (6 faces * 4 vertices)\n const vertexCount = this.columnCount * 24;\n const positions = new Float32Array(vertexCount * 3);\n const normals = new Float32Array(vertexCount * 3);\n const colors = new Float32Array(vertexCount * 3);\n \n // 36 indices per column (6 faces * 2 triangles * 3 vertices)\n const indices: number[] = [];\n \n const hw = columnWidth / 2;\n const hd = columnDepth / 2;\n \n // Find min/max for color mapping\n let minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < this.columnCount; i++) {\n if (data.yValues[i] < minY) minY = data.yValues[i];\n if (data.yValues[i] > maxY) maxY = data.yValues[i];\n }\n const yRange = maxY - minY || 1;\n \n for (let i = 0; i < this.columnCount; i++) {\n const x = data.xValues[i];\n const z = data.zValues[i];\n const h = data.yValues[i];\n const baseIdx = i * 24;\n \n // Generate box vertices\n const box = this.generateBoxVertices(x, 0, z, hw, h, hd);\n \n for (let v = 0; v < 24; v++) {\n const vi = (baseIdx + v) * 3;\n positions[vi] = box.positions[v * 3];\n positions[vi + 1] = box.positions[v * 3 + 1];\n positions[vi + 2] = box.positions[v * 3 + 2];\n normals[vi] = box.normals[v * 3];\n normals[vi + 1] = box.normals[v * 3 + 1];\n normals[vi + 2] = box.normals[v * 3 + 2];\n \n // Color based on height or provided\n if (data.colors) {\n colors[vi] = data.colors[i * 3];\n colors[vi + 1] = data.colors[i * 3 + 1];\n colors[vi + 2] = data.colors[i * 3 + 2];\n } else {\n const t = (h - minY) / yRange;\n colors[vi] = 0.2 + t * 0.6;\n colors[vi + 1] = 0.4 + t * 0.4;\n colors[vi + 2] = 0.8;\n }\n }\n \n // Generate indices for this column\n for (let f = 0; f < 6; f++) {\n const faceBase = baseIdx + f * 4;\n indices.push(\n faceBase, faceBase + 1, faceBase + 2,\n faceBase, faceBase + 2, faceBase + 3\n );\n }\n }\n \n this.indexCount = indices.length;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, normals, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array(indices), gl.STATIC_DRAW);\n }\n \n private generateBoxVertices(\n cx: number, cy: number, cz: number,\n hw: number, h: number, hd: number\n ): { positions: Float32Array; normals: Float32Array } {\n const positions = new Float32Array(24 * 3);\n const normals = new Float32Array(24 * 3);\n \n const x0 = cx - hw, x1 = cx + hw;\n const y0 = cy, y1 = cy + h;\n const z0 = cz - hd, z1 = cz + hd;\n \n // Front face (z+)\n this.setQuad(positions, normals, 0,\n x0, y0, z1, x1, y0, z1, x1, y1, z1, x0, y1, z1,\n 0, 0, 1);\n \n // Back face (z-)\n this.setQuad(positions, normals, 4,\n x1, y0, z0, x0, y0, z0, x0, y1, z0, x1, y1, z0,\n 0, 0, -1);\n \n // Top face (y+)\n this.setQuad(positions, normals, 8,\n x0, y1, z1, x1, y1, z1, x1, y1, z0, x0, y1, z0,\n 0, 1, 0);\n \n // Bottom face (y-)\n this.setQuad(positions, normals, 12,\n x0, y0, z0, x1, y0, z0, x1, y0, z1, x0, y0, z1,\n 0, -1, 0);\n \n // Right face (x+)\n this.setQuad(positions, normals, 16,\n x1, y0, z1, x1, y0, z0, x1, y1, z0, x1, y1, z1,\n 1, 0, 0);\n \n // Left face (x-)\n this.setQuad(positions, normals, 20,\n x0, y0, z0, x0, y0, z1, x0, y1, z1, x0, y1, z0,\n -1, 0, 0);\n \n return { positions, normals };\n }\n \n private setQuad(\n positions: Float32Array, normals: Float32Array, offset: number,\n x0: number, y0: number, z0: number,\n x1: number, y1: number, z1: number,\n x2: number, y2: number, z2: number,\n x3: number, y3: number, z3: number,\n nx: number, ny: number, nz: number\n ): void {\n const pi = offset * 3;\n positions[pi] = x0; positions[pi + 1] = y0; positions[pi + 2] = z0;\n positions[pi + 3] = x1; positions[pi + 4] = y1; positions[pi + 5] = z1;\n positions[pi + 6] = x2; positions[pi + 7] = y2; positions[pi + 8] = z2;\n positions[pi + 9] = x3; positions[pi + 10] = y3; positions[pi + 11] = z3;\n \n for (let i = 0; i < 4; i++) {\n normals[pi + i * 3] = nx;\n normals[pi + i * 3 + 1] = ny;\n normals[pi + i * 3 + 2] = nz;\n }\n }\n \n render(program: ShaderProgram3D): void {\n const { gl } = this;\n \n if (this.indexCount === 0) return;\n \n gl.bindVertexArray(this.vao);\n \n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n const normalLoc = program.attributes['a_normal'];\n if (normalLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.enableVertexAttribArray(normalLoc);\n gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.drawElements(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0);\n \n gl.bindVertexArray(null);\n }\n \n destroy(): void {\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.normalBuffer) gl.deleteBuffer(this.normalBuffer);\n if (this.colorBuffer) gl.deleteBuffer(this.colorBuffer);\n if (this.indexBuffer) gl.deleteBuffer(this.indexBuffer);\n }\n}\n","/**\n * Waterfall 3D renderer.\n * Renders cascading spectral/time series data (like audio spectrograms).\n * Essential for scientific visualization of frequency/time data.\n */\n\nimport type { ShaderProgram3D } from '../shader/programs';\nimport type { Waterfall3DData } from './types';\n\nexport interface WaterfallOptions {\n maxSlices?: number;\n}\n\nexport class Waterfall3D {\n private gl: WebGL2RenderingContext;\n private vao: WebGLVertexArrayObject | null = null;\n \n private positionBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n \n private vertexCount = 0;\n private indexCount = 0;\n private sliceCount = 0;\n private pointsPerSlice = 0;\n \n private fillMode: 'solid' | 'wireframe' | 'gradient' = 'gradient';\n \n constructor(gl: WebGL2RenderingContext, _options: WaterfallOptions = {}) {\n this.gl = gl;\n this.initBuffers();\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n this.positionBuffer = gl.createBuffer();\n this.colorBuffer = gl.createBuffer();\n this.indexBuffer = gl.createBuffer();\n \n gl.bindVertexArray(null);\n }\n \n /**\n * Update waterfall data.\n * Each slice is a row of Y values at increasing Z positions.\n */\n updateData(data: Waterfall3DData): void {\n this.sliceCount = data.slices.length;\n if (this.sliceCount === 0) return;\n \n this.pointsPerSlice = data.xValues.length;\n this.fillMode = data.fillMode ?? 'gradient';\n \n const zStart = data.zStart ?? 0;\n const zStep = data.zStep;\n \n // Find global min/max for color mapping\n let minY = Infinity, maxY = -Infinity;\n for (const slice of data.slices) {\n for (let i = 0; i < slice.length; i++) {\n if (slice[i] < minY) minY = slice[i];\n if (slice[i] > maxY) maxY = slice[i];\n }\n }\n const yRange = maxY - minY || 1;\n \n if (this.fillMode === 'wireframe') {\n this.buildWireframe(data, zStart, zStep, minY, yRange);\n } else {\n this.buildSolid(data, zStart, zStep, minY, yRange);\n }\n }\n \n private buildWireframe(\n data: Waterfall3DData,\n zStart: number,\n zStep: number,\n minY: number,\n yRange: number\n ): void {\n const { gl, sliceCount, pointsPerSlice } = this;\n \n // Each slice is a line strip\n this.vertexCount = sliceCount * pointsPerSlice;\n \n const positions = new Float32Array(this.vertexCount * 3);\n const colors = new Float32Array(this.vertexCount * 3);\n \n for (let s = 0; s < sliceCount; s++) {\n const z = zStart + s * zStep;\n const slice = data.slices[s];\n \n for (let p = 0; p < pointsPerSlice; p++) {\n const idx = s * pointsPerSlice + p;\n const i3 = idx * 3;\n \n positions[i3] = data.xValues[p];\n positions[i3 + 1] = slice[p];\n positions[i3 + 2] = z;\n \n // Color by height\n const t = (slice[p] - minY) / yRange;\n this.applyColormap(colors, i3, t, data.colormap);\n }\n }\n \n // Line indices - one line strip per slice\n const indices: number[] = [];\n for (let s = 0; s < sliceCount; s++) {\n for (let p = 0; p < pointsPerSlice - 1; p++) {\n const idx = s * pointsPerSlice + p;\n indices.push(idx, idx + 1);\n }\n }\n \n this.indexCount = indices.length;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array(indices), gl.STATIC_DRAW);\n }\n \n private buildSolid(\n data: Waterfall3DData,\n zStart: number,\n zStep: number,\n minY: number,\n yRange: number\n ): void {\n const { gl, sliceCount, pointsPerSlice } = this;\n \n // For solid fill, we create quads between adjacent slices\n // Each quad has 4 vertices, 2 triangles\n const quadRows = sliceCount - 1;\n const quadCols = pointsPerSlice - 1;\n \n if (quadRows <= 0 || quadCols <= 0) {\n this.vertexCount = 0;\n this.indexCount = 0;\n return;\n }\n \n // Use indexed rendering with shared vertices\n this.vertexCount = sliceCount * pointsPerSlice;\n \n const positions = new Float32Array(this.vertexCount * 3);\n const colors = new Float32Array(this.vertexCount * 3);\n \n for (let s = 0; s < sliceCount; s++) {\n const z = zStart + s * zStep;\n const slice = data.slices[s];\n \n for (let p = 0; p < pointsPerSlice; p++) {\n const idx = s * pointsPerSlice + p;\n const i3 = idx * 3;\n \n positions[i3] = data.xValues[p];\n positions[i3 + 1] = slice[p];\n positions[i3 + 2] = z;\n \n const t = (slice[p] - minY) / yRange;\n this.applyColormap(colors, i3, t, data.colormap);\n }\n }\n \n // Triangle indices\n const indices: number[] = [];\n for (let s = 0; s < quadRows; s++) {\n for (let p = 0; p < quadCols; p++) {\n const topLeft = s * pointsPerSlice + p;\n const topRight = topLeft + 1;\n const bottomLeft = topLeft + pointsPerSlice;\n const bottomRight = bottomLeft + 1;\n \n // Two triangles per quad\n indices.push(topLeft, bottomLeft, topRight);\n indices.push(topRight, bottomLeft, bottomRight);\n }\n }\n \n this.indexCount = indices.length;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array(indices), gl.STATIC_DRAW);\n }\n \n private applyColormap(colors: Float32Array, i3: number, t: number, colormap?: string): void {\n // Clamp t to [0, 1]\n t = Math.max(0, Math.min(1, t));\n \n switch (colormap) {\n case 'jet':\n this.jetColormap(colors, i3, t);\n break;\n case 'hot':\n this.hotColormap(colors, i3, t);\n break;\n case 'cool':\n colors[i3] = t;\n colors[i3 + 1] = 1 - t;\n colors[i3 + 2] = 1;\n break;\n case 'grayscale':\n colors[i3] = t;\n colors[i3 + 1] = t;\n colors[i3 + 2] = t;\n break;\n case 'viridis':\n default:\n this.viridisColormap(colors, i3, t);\n break;\n }\n }\n \n private viridisColormap(colors: Float32Array, i3: number, t: number): void {\n // Simplified viridis approximation\n colors[i3] = 0.267 + t * 0.329 + t * t * 0.2;\n colors[i3 + 1] = 0.004 + t * 0.873;\n colors[i3 + 2] = 0.329 + t * 0.2 - t * t * 0.3;\n }\n \n private jetColormap(colors: Float32Array, i3: number, t: number): void {\n if (t < 0.25) {\n colors[i3] = 0;\n colors[i3 + 1] = 4 * t;\n colors[i3 + 2] = 1;\n } else if (t < 0.5) {\n colors[i3] = 0;\n colors[i3 + 1] = 1;\n colors[i3 + 2] = 1 - 4 * (t - 0.25);\n } else if (t < 0.75) {\n colors[i3] = 4 * (t - 0.5);\n colors[i3 + 1] = 1;\n colors[i3 + 2] = 0;\n } else {\n colors[i3] = 1;\n colors[i3 + 1] = 1 - 4 * (t - 0.75);\n colors[i3 + 2] = 0;\n }\n }\n \n private hotColormap(colors: Float32Array, i3: number, t: number): void {\n colors[i3] = Math.min(1, t * 3);\n colors[i3 + 1] = Math.max(0, Math.min(1, (t - 0.33) * 3));\n colors[i3 + 2] = Math.max(0, (t - 0.67) * 3);\n }\n \n /**\n * Add a new slice to the waterfall (for realtime updates).\n * Shifts existing slices back and adds new one at front.\n */\n pushSlice(yValues: Float32Array, data: Waterfall3DData): void {\n // Shift slices\n data.slices.pop();\n data.slices.unshift(yValues);\n \n // Rebuild mesh\n this.updateData(data);\n }\n \n render(program: ShaderProgram3D): void {\n const { gl } = this;\n \n if (this.indexCount === 0) return;\n \n gl.bindVertexArray(this.vao);\n \n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n \n if (this.fillMode === 'wireframe') {\n gl.drawElements(gl.LINES, this.indexCount, gl.UNSIGNED_INT, 0);\n } else {\n gl.drawElements(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0);\n }\n \n gl.bindVertexArray(null);\n }\n \n destroy(): void {\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.colorBuffer) gl.deleteBuffer(this.colorBuffer);\n if (this.indexBuffer) gl.deleteBuffer(this.indexBuffer);\n }\n}\n","/**\n * Scatter 3D renderer.\n * Renders individual points in 3D space with various symbols.\n */\n\nimport type { ShaderProgram3D } from '../shader/programs';\nimport type { Scatter3DData } from './types';\nimport { createIcosphere, createCube, type GeometryData } from '../mesh/geometry';\n\nexport class Scatter3D {\n private gl: WebGL2RenderingContext;\n private vao: WebGLVertexArrayObject | null = null;\n \n // Geometry buffers\n private geometryPosBuffer: WebGLBuffer | null = null;\n private geometryIndexBuffer: WebGLBuffer | null = null;\n \n // Instance buffers\n private instancePosBuffer: WebGLBuffer | null = null;\n private instanceColorBuffer: WebGLBuffer | null = null;\n private instanceSizeBuffer: WebGLBuffer | null = null;\n \n private geometry: GeometryData;\n private instanceCount = 0;\n private symbol: 'sphere' | 'cube' | 'diamond' | 'point' = 'sphere';\n \n constructor(gl: WebGL2RenderingContext) {\n this.gl = gl;\n this.geometry = createIcosphere(1);\n this.initBuffers();\n }\n \n private initBuffers(): void {\n const { gl, geometry } = this;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n // Geometry position buffer\n this.geometryPosBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.geometryPosBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, geometry.positions, gl.STATIC_DRAW);\n \n // Geometry index buffer\n this.geometryIndexBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.geometryIndexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, geometry.indices, gl.STATIC_DRAW);\n \n // Instance buffers\n this.instancePosBuffer = gl.createBuffer();\n this.instanceColorBuffer = gl.createBuffer();\n this.instanceSizeBuffer = gl.createBuffer();\n \n gl.bindVertexArray(null);\n }\n \n updateData(data: Scatter3DData): void {\n const { gl } = this;\n \n this.instanceCount = data.positions.length / 3;\n this.symbol = data.symbol ?? 'sphere';\n \n // Update geometry if symbol changed\n if (this.symbol === 'cube' || this.symbol === 'diamond') {\n this.geometry = createCube();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.geometryPosBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, this.geometry.positions, gl.STATIC_DRAW);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.geometryIndexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.geometry.indices, gl.STATIC_DRAW);\n }\n \n // Default colors\n const colors = data.colors ?? this.generateDefaultColors(this.instanceCount);\n \n // Default sizes\n const sizes = data.sizes ?? new Float32Array(this.instanceCount).fill(0.1);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.instancePosBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, data.positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceColorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceSizeBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, sizes, gl.DYNAMIC_DRAW);\n }\n \n private generateDefaultColors(count: number): Float32Array {\n const colors = new Float32Array(count * 3);\n for (let i = 0; i < count; i++) {\n colors[i * 3] = 0.2 + Math.random() * 0.6;\n colors[i * 3 + 1] = 0.4 + Math.random() * 0.4;\n colors[i * 3 + 2] = 0.6 + Math.random() * 0.4;\n }\n return colors;\n }\n \n render(program: ShaderProgram3D): void {\n const { gl, geometry, instanceCount } = this;\n \n if (instanceCount === 0) return;\n \n gl.bindVertexArray(this.vao);\n \n // Geometry position\n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.geometryPosBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(posLoc, 0);\n }\n \n // Instance position\n const instancePosLoc = program.attributes['a_instancePos'];\n if (instancePosLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instancePosBuffer);\n gl.enableVertexAttribArray(instancePosLoc);\n gl.vertexAttribPointer(instancePosLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(instancePosLoc, 1);\n }\n \n // Instance color\n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceColorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(colorLoc, 1);\n }\n \n // Instance size\n const scaleLoc = program.attributes['a_scale'];\n if (scaleLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceSizeBuffer);\n gl.enableVertexAttribArray(scaleLoc);\n gl.vertexAttribPointer(scaleLoc, 1, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(scaleLoc, 1);\n }\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.geometryIndexBuffer);\n gl.drawElementsInstanced(\n gl.TRIANGLES,\n geometry.indexCount,\n gl.UNSIGNED_SHORT,\n 0,\n instanceCount\n );\n \n gl.bindVertexArray(null);\n }\n \n destroy(): void {\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.geometryPosBuffer) gl.deleteBuffer(this.geometryPosBuffer);\n if (this.geometryIndexBuffer) gl.deleteBuffer(this.geometryIndexBuffer);\n if (this.instancePosBuffer) gl.deleteBuffer(this.instancePosBuffer);\n if (this.instanceColorBuffer) gl.deleteBuffer(this.instanceColorBuffer);\n if (this.instanceSizeBuffer) gl.deleteBuffer(this.instanceSizeBuffer);\n }\n}\n","/**\n * Ribbon 3D renderer.\n * Renders an extruded line with variable width in 3D space.\n */\n\nimport type { ShaderProgram3D } from '../shader/programs';\nimport type { Ribbon3DData } from './types';\n\nexport class Ribbon3D {\n private gl: WebGL2RenderingContext;\n private vao: WebGLVertexArrayObject | null = null;\n \n private positionBuffer: WebGLBuffer | null = null;\n private normalBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n \n private indexCount = 0;\n \n constructor(gl: WebGL2RenderingContext) {\n this.gl = gl;\n this.initBuffers();\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n this.positionBuffer = gl.createBuffer();\n this.normalBuffer = gl.createBuffer();\n this.colorBuffer = gl.createBuffer();\n this.indexBuffer = gl.createBuffer();\n \n gl.bindVertexArray(null);\n }\n \n updateData(data: Ribbon3DData): void {\n const { gl } = this;\n \n const pointCount = data.positions.length / 3;\n if (pointCount < 2) return;\n \n const defaultWidth = data.defaultWidth ?? 0.5;\n const widths = data.widths ?? new Float32Array(pointCount).fill(defaultWidth);\n \n // Generate ribbon mesh - 2 vertices per point (left and right edge)\n const vertexCount = pointCount * 2;\n const positions = new Float32Array(vertexCount * 3);\n const normals = new Float32Array(vertexCount * 3);\n const colors = new Float32Array(vertexCount * 3);\n \n // Calculate tangent and perpendicular at each point\n for (let i = 0; i < pointCount; i++) {\n const i3 = i * 3;\n const x = data.positions[i3];\n const y = data.positions[i3 + 1];\n const z = data.positions[i3 + 2];\n \n // Calculate tangent direction\n let tx = 0, ty = 0, tz = 0;\n \n if (i === 0) {\n tx = data.positions[3] - x;\n ty = data.positions[4] - y;\n tz = data.positions[5] - z;\n } else if (i === pointCount - 1) {\n tx = x - data.positions[i3 - 3];\n ty = y - data.positions[i3 - 2];\n tz = z - data.positions[i3 - 1];\n } else {\n tx = data.positions[i3 + 3] - data.positions[i3 - 3];\n ty = data.positions[i3 + 4] - data.positions[i3 - 2];\n tz = data.positions[i3 + 5] - data.positions[i3 - 1];\n }\n \n // Normalize tangent\n const tLen = Math.sqrt(tx * tx + ty * ty + tz * tz) || 1;\n tx /= tLen; ty /= tLen; tz /= tLen;\n \n // Calculate perpendicular (cross with up vector)\n const upX = 0, upY = 1, upZ = 0;\n let px = upY * tz - upZ * ty;\n let py = upZ * tx - upX * tz;\n let pz = upX * ty - upY * tx;\n \n const pLen = Math.sqrt(px * px + py * py + pz * pz) || 1;\n px /= pLen; py /= pLen; pz /= pLen;\n \n const hw = widths[i] / 2;\n \n // Left vertex\n const li = i * 2;\n const li3 = li * 3;\n positions[li3] = x - px * hw;\n positions[li3 + 1] = y - py * hw;\n positions[li3 + 2] = z - pz * hw;\n \n // Right vertex\n const ri = i * 2 + 1;\n const ri3 = ri * 3;\n positions[ri3] = x + px * hw;\n positions[ri3 + 1] = y + py * hw;\n positions[ri3 + 2] = z + pz * hw;\n \n // Normal (up)\n normals[li3] = upX; normals[li3 + 1] = upY; normals[li3 + 2] = upZ;\n normals[ri3] = upX; normals[ri3 + 1] = upY; normals[ri3 + 2] = upZ;\n \n // Colors\n if (data.colors) {\n colors[li3] = data.colors[i3];\n colors[li3 + 1] = data.colors[i3 + 1];\n colors[li3 + 2] = data.colors[i3 + 2];\n colors[ri3] = data.colors[i3];\n colors[ri3 + 1] = data.colors[i3 + 1];\n colors[ri3 + 2] = data.colors[i3 + 2];\n } else {\n const t = i / (pointCount - 1);\n colors[li3] = 0.2 + t * 0.6;\n colors[li3 + 1] = 0.5;\n colors[li3 + 2] = 0.8 - t * 0.3;\n colors[ri3] = colors[li3];\n colors[ri3 + 1] = colors[li3 + 1];\n colors[ri3 + 2] = colors[li3 + 2];\n }\n }\n \n // Generate triangle indices\n const indices: number[] = [];\n for (let i = 0; i < pointCount - 1; i++) {\n const bl = i * 2;\n const br = i * 2 + 1;\n const tl = (i + 1) * 2;\n const tr = (i + 1) * 2 + 1;\n \n indices.push(bl, br, tl);\n indices.push(tl, br, tr);\n }\n \n this.indexCount = indices.length;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, normals, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array(indices), gl.STATIC_DRAW);\n }\n \n render(program: ShaderProgram3D): void {\n const { gl } = this;\n \n if (this.indexCount === 0) return;\n \n gl.bindVertexArray(this.vao);\n \n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n const normalLoc = program.attributes['a_normal'];\n if (normalLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.enableVertexAttribArray(normalLoc);\n gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.drawElements(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0);\n \n gl.bindVertexArray(null);\n }\n \n destroy(): void {\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.normalBuffer) gl.deleteBuffer(this.normalBuffer);\n if (this.colorBuffer) gl.deleteBuffer(this.colorBuffer);\n if (this.indexBuffer) gl.deleteBuffer(this.indexBuffer);\n }\n}\n","/**\n * Area 3D renderer.\n * Renders filled area under a 3D line (like a curtain).\n */\n\nimport type { ShaderProgram3D } from '../shader/programs';\nimport type { Area3DData } from './types';\n\nexport class Area3D {\n private gl: WebGL2RenderingContext;\n private vao: WebGLVertexArrayObject | null = null;\n \n private positionBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n \n private indexCount = 0;\n private fillOpacity = 0.6;\n \n constructor(gl: WebGL2RenderingContext) {\n this.gl = gl;\n this.initBuffers();\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n this.positionBuffer = gl.createBuffer();\n this.colorBuffer = gl.createBuffer();\n this.indexBuffer = gl.createBuffer();\n \n gl.bindVertexArray(null);\n }\n \n updateData(data: Area3DData): void {\n const { gl } = this;\n \n const pointCount = data.positions.length / 3;\n if (pointCount < 2) return;\n \n const baseY = data.baseY ?? 0;\n this.fillOpacity = data.fillOpacity ?? 0.6;\n \n // 2 vertices per point (top and bottom)\n const vertexCount = pointCount * 2;\n const positions = new Float32Array(vertexCount * 3);\n const colors = new Float32Array(vertexCount * 3);\n \n for (let i = 0; i < pointCount; i++) {\n const i3 = i * 3;\n const x = data.positions[i3];\n const y = data.positions[i3 + 1];\n const z = data.positions[i3 + 2];\n \n // Top vertex (actual data point)\n const ti = i * 2;\n const ti3 = ti * 3;\n positions[ti3] = x;\n positions[ti3 + 1] = y;\n positions[ti3 + 2] = z;\n \n // Bottom vertex (at baseY)\n const bi = i * 2 + 1;\n const bi3 = bi * 3;\n positions[bi3] = x;\n positions[bi3 + 1] = baseY;\n positions[bi3 + 2] = z;\n \n // Colors\n if (data.colors) {\n colors[ti3] = data.colors[i3];\n colors[ti3 + 1] = data.colors[i3 + 1];\n colors[ti3 + 2] = data.colors[i3 + 2];\n colors[bi3] = data.colors[i3] * 0.7;\n colors[bi3 + 1] = data.colors[i3 + 1] * 0.7;\n colors[bi3 + 2] = data.colors[i3 + 2] * 0.7;\n } else {\n const t = i / (pointCount - 1);\n colors[ti3] = 0.2 + t * 0.6;\n colors[ti3 + 1] = 0.6;\n colors[ti3 + 2] = 0.9;\n colors[bi3] = colors[ti3] * 0.7;\n colors[bi3 + 1] = colors[ti3 + 1] * 0.7;\n colors[bi3 + 2] = colors[ti3 + 2] * 0.7;\n }\n }\n \n // Generate triangle indices\n const indices: number[] = [];\n for (let i = 0; i < pointCount - 1; i++) {\n const tl = i * 2;\n const bl = i * 2 + 1;\n const tr = (i + 1) * 2;\n const br = (i + 1) * 2 + 1;\n \n indices.push(tl, bl, tr);\n indices.push(tr, bl, br);\n }\n \n this.indexCount = indices.length;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array(indices), gl.STATIC_DRAW);\n }\n \n render(program: ShaderProgram3D): void {\n const { gl } = this;\n \n if (this.indexCount === 0) return;\n \n gl.bindVertexArray(this.vao);\n \n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n if (program.uniforms['u_opacity']) {\n gl.uniform1f(program.uniforms['u_opacity'], this.fillOpacity);\n }\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.drawElements(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0);\n \n gl.bindVertexArray(null);\n }\n \n destroy(): void {\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.colorBuffer) gl.deleteBuffer(this.colorBuffer);\n if (this.indexBuffer) gl.deleteBuffer(this.indexBuffer);\n }\n}\n","/**\n * Heatmap 3D renderer.\n * Renders a colored grid on the XZ plane based on intensity values.\n */\n\nimport type { ShaderProgram3D } from '../shader/programs';\nimport type { Heatmap3DData } from './types';\n\nexport class Heatmap3D {\n private gl: WebGL2RenderingContext;\n private vao: WebGLVertexArrayObject | null = null;\n \n private positionBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n \n private indexCount = 0;\n \n constructor(gl: WebGL2RenderingContext) {\n this.gl = gl;\n this.initBuffers();\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n this.positionBuffer = gl.createBuffer();\n this.colorBuffer = gl.createBuffer();\n this.indexBuffer = gl.createBuffer();\n \n gl.bindVertexArray(null);\n }\n \n updateData(data: Heatmap3DData): void {\n const { gl } = this;\n \n const cols = data.xValues.length;\n const rows = data.zValues.length;\n const vertexCount = cols * rows;\n \n // Find min/max for color mapping\n let minVal = data.minValue ?? Infinity;\n let maxVal = data.maxValue ?? -Infinity;\n \n if (minVal === Infinity || maxVal === -Infinity) {\n for (let i = 0; i < data.values.length; i++) {\n if (data.values[i] < minVal) minVal = data.values[i];\n if (data.values[i] > maxVal) maxVal = data.values[i];\n }\n }\n const range = maxVal - minVal || 1;\n \n const positions = new Float32Array(vertexCount * 3);\n const colors = new Float32Array(vertexCount * 3);\n \n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const idx = row * cols + col;\n const i3 = idx * 3;\n \n positions[i3] = data.xValues[col];\n positions[i3 + 1] = 0; // Flat on XZ plane\n positions[i3 + 2] = data.zValues[row];\n \n const t = (data.values[idx] - minVal) / range;\n this.applyColormap(colors, i3, t, data.colormap);\n }\n }\n \n // Generate indices\n const indices: number[] = [];\n for (let row = 0; row < rows - 1; row++) {\n for (let col = 0; col < cols - 1; col++) {\n const tl = row * cols + col;\n const tr = tl + 1;\n const bl = tl + cols;\n const br = bl + 1;\n \n indices.push(tl, bl, tr);\n indices.push(tr, bl, br);\n }\n }\n \n this.indexCount = indices.length;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array(indices), gl.STATIC_DRAW);\n }\n \n private applyColormap(colors: Float32Array, i3: number, t: number, colormap?: string): void {\n t = Math.max(0, Math.min(1, t));\n \n switch (colormap) {\n case 'jet':\n if (t < 0.25) {\n colors[i3] = 0; colors[i3 + 1] = 4 * t; colors[i3 + 2] = 1;\n } else if (t < 0.5) {\n colors[i3] = 0; colors[i3 + 1] = 1; colors[i3 + 2] = 1 - 4 * (t - 0.25);\n } else if (t < 0.75) {\n colors[i3] = 4 * (t - 0.5); colors[i3 + 1] = 1; colors[i3 + 2] = 0;\n } else {\n colors[i3] = 1; colors[i3 + 1] = 1 - 4 * (t - 0.75); colors[i3 + 2] = 0;\n }\n break;\n case 'hot':\n colors[i3] = Math.min(1, t * 3);\n colors[i3 + 1] = Math.max(0, Math.min(1, (t - 0.33) * 3));\n colors[i3 + 2] = Math.max(0, (t - 0.67) * 3);\n break;\n case 'grayscale':\n colors[i3] = t; colors[i3 + 1] = t; colors[i3 + 2] = t;\n break;\n case 'viridis':\n default:\n colors[i3] = 0.267 + t * 0.329 + t * t * 0.2;\n colors[i3 + 1] = 0.004 + t * 0.873;\n colors[i3 + 2] = 0.329 + t * 0.2 - t * t * 0.3;\n break;\n }\n }\n \n render(program: ShaderProgram3D): void {\n const { gl } = this;\n \n if (this.indexCount === 0) return;\n \n gl.bindVertexArray(this.vao);\n \n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.drawElements(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0);\n \n gl.bindVertexArray(null);\n }\n \n destroy(): void {\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.colorBuffer) gl.deleteBuffer(this.colorBuffer);\n if (this.indexBuffer) gl.deleteBuffer(this.indexBuffer);\n }\n}\n","/**\n * Impulse/Stem 3D renderer.\n * Renders vertical lines from a base plane to data points.\n */\n\nimport type { ShaderProgram3D } from '../shader/programs';\nimport type { Impulse3DData } from './types';\n\nexport class Impulse3D {\n private gl: WebGL2RenderingContext;\n private vao: WebGLVertexArrayObject | null = null;\n \n private positionBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n \n private vertexCount = 0;\n private showMarkers = true;\n \n constructor(gl: WebGL2RenderingContext) {\n this.gl = gl;\n this.initBuffers();\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n this.positionBuffer = gl.createBuffer();\n this.colorBuffer = gl.createBuffer();\n \n gl.bindVertexArray(null);\n }\n \n updateData(data: Impulse3DData): void {\n const { gl } = this;\n \n const pointCount = data.positions.length / 3;\n const baseY = data.baseY ?? 0;\n this.showMarkers = data.showMarkers ?? true;\n \n // 2 vertices per impulse (base and tip)\n this.vertexCount = pointCount * 2;\n \n const positions = new Float32Array(this.vertexCount * 3);\n const colors = new Float32Array(this.vertexCount * 3);\n \n for (let i = 0; i < pointCount; i++) {\n const i3 = i * 3;\n const x = data.positions[i3];\n const y = data.positions[i3 + 1];\n const z = data.positions[i3 + 2];\n \n // Base vertex\n const bi = i * 2;\n const bi3 = bi * 3;\n positions[bi3] = x;\n positions[bi3 + 1] = baseY;\n positions[bi3 + 2] = z;\n \n // Tip vertex\n const ti = i * 2 + 1;\n const ti3 = ti * 3;\n positions[ti3] = x;\n positions[ti3 + 1] = y;\n positions[ti3 + 2] = z;\n \n // Colors\n if (data.colors) {\n colors[bi3] = data.colors[i3] * 0.5;\n colors[bi3 + 1] = data.colors[i3 + 1] * 0.5;\n colors[bi3 + 2] = data.colors[i3 + 2] * 0.5;\n colors[ti3] = data.colors[i3];\n colors[ti3 + 1] = data.colors[i3 + 1];\n colors[ti3 + 2] = data.colors[i3 + 2];\n } else {\n const t = i / (pointCount - 1 || 1);\n colors[bi3] = 0.1; colors[bi3 + 1] = 0.3; colors[bi3 + 2] = 0.5;\n colors[ti3] = 0.2 + t * 0.6;\n colors[ti3 + 1] = 0.5 + t * 0.3;\n colors[ti3 + 2] = 0.9;\n }\n }\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n }\n \n render(program: ShaderProgram3D): void {\n const { gl } = this;\n \n if (this.vertexCount === 0) return;\n \n gl.bindVertexArray(this.vao);\n \n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n // Draw lines\n gl.drawArrays(gl.LINES, 0, this.vertexCount);\n \n // Draw markers at tips\n if (this.showMarkers) {\n if (program.uniforms['u_pointSize']) {\n gl.uniform1f(program.uniforms['u_pointSize'], 8);\n }\n // Draw only tip vertices (odd indices)\n for (let i = 1; i < this.vertexCount; i += 2) {\n gl.drawArrays(gl.POINTS, i, 1);\n }\n }\n \n gl.bindVertexArray(null);\n }\n \n destroy(): void {\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.colorBuffer) gl.deleteBuffer(this.colorBuffer);\n }\n}\n","/**\n * VeloPlot Engine - 3D Visualization Plugin\n * \n * This plugin provides 3D rendering capabilities including:\n * - Line3D, Area3D, Bubble3D, Impulse3D renderers\n * - Surface mesh and waterfall visualizations\n * - 3D axes with depth perspective\n * - Camera controls and raycasting\n * \n * @module plugins/3d\n */\n\n// Re-export all 3D functionality\nexport * from \"./Area3DRenderer\";\nexport * from \"./Bubble3DRenderer\";\nexport * from \"./Impulse3DRenderer\";\nexport * from \"./Line3DRenderer\";\nexport * from \"./PointCloud3DRenderer\";\nexport * from \"./Ribbon3DRenderer\";\nexport * from \"./SurfaceBar3DRenderer\";\nexport * from \"./SurfaceMesh3DRenderer\";\nexport * from \"./VectorField3DRenderer\";\nexport * from \"./Voxel3DRenderer\";\nexport * from \"./Waterfall3DRenderer\";\nexport * from \"./Axes3D\";\nexport * from \"./Tooltip3D\";\nexport * from \"./Raycaster3D\";\n\n// Math\nexport * from \"./math\";\n\n// Camera & Controls\nexport * from \"./camera\";\nexport * from \"./controls\";\n\nexport * from \"./colorThemes\";\n\n// Re-export series\nexport * from \"./series\";\n\nimport type { PluginManifest, ChartPlugin, PluginContext } from \"../types\";\n\n// ============================================\n// 3D Plugin Factory\n// ============================================\n\nexport interface Plugin3DConfig {\n /** Enable WebGL2 features if available (default: true) */\n preferWebGL2?: boolean;\n /** Default camera configuration */\n camera?: {\n position?: [number, number, number];\n target?: [number, number, number];\n fov?: number;\n };\n /** Enable orbit controls (default: true) */\n enableOrbitControls?: boolean;\n}\n\nconst manifest3D: PluginManifest = {\n name: \"velo-plot-3d\",\n version: \"1.0.0\",\n description: \"Advanced 3D visualization for velo-plot\",\n provides: [\"visualization\", \"3d\"],\n tags: [\"3d\", \"webgl\", \"surface\", \"mesh\"],\n};\n\n/**\n * VeloPlot 3D Plugin\n * \n * Provides interactive 3D charts, surfaces, and meshes.\n */\nexport function Plugin3D(config: Plugin3DConfig = {}): ChartPlugin<Plugin3DConfig> {\n return {\n manifest: manifest3D,\n\n onInit(ctx: PluginContext) {\n // Store configuration for later use\n ctx.storage.set(\"config\", config);\n },\n\n onConfigChange(_ctx: PluginContext, _newConfig: Plugin3DConfig) {\n },\n\n onDestroy(_ctx: PluginContext) {\n }\n };\n}\n\nexport default Plugin3D;\n"],"names":["create","out","identity","copy","a","multiply","b","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","a30","a31","a32","a33","b0","b1","b2","b3","perspective","fovY","aspect","near","far","f","nf","lookAt","eye","center","up","eyeX","eyeY","eyeZ","centerX","centerY","centerZ","upX","upY","upZ","z0","z1","z2","len","x0","x1","x2","y0","y1","y2","translate","v","x","y","z","scale","rotateX","rad","s","c","rotateY","rotateZ","invert","b00","b01","b02","b03","b04","b05","b06","b07","b08","b09","b10","b11","det","ortho","left","right","bottom","top","lr","bt","OrbitCamera","options","__publicField","Mat4.create","deltaTheta","deltaPhi","delta","factor","deltaX","deltaY","sinTheta","rightX","rightZ","theta","phi","radius","sinPhi","cosPhi","cosTheta","Mat4.lookAt","Mat4.perspective","Mat4.multiply","dx","dy","dz","minX","minY","minZ","maxX","maxY","maxZ","diagonal","OrbitController","camera","element","e","boundHandlers","callback","pointer","panScale","distance","remaining","zoomAmount","pointerArray","threshold","moving","BUBBLE_VERT","BUBBLE_FRAG","BUBBLE_FLAT_FRAG","BUBBLE_VERT_WEBGL1","BUBBLE_FRAG_WEBGL1","AXIS_VERT","AXIS_FRAG","SURFACE_VERT","SURFACE_FRAG","LINE_POINT_VERT","LINE_POINT_FRAG","WATERFALL_VERT","WATERFALL_FRAG","VECTOR_FIELD_VERT","VECTOR_FIELD_FRAG","POINT_CLOUD_VERT","POINT_CLOUD_FRAG","VOXEL_VERT","VOXEL_FRAG","RIBBON_VERT","RIBBON_FRAG","SURFACE_BAR_VERT","SURFACE_BAR_FRAG","createShader","gl","source","type","shader","error","createProgram","vertSource","fragSource","attributeNames","uniformNames","vertShader","fragShader","program","attributes","name","uniforms","createProgramBundle3D","useWebGL1Fallback","bubbleAttribs","bubbleUniforms","bubbleProgram","bubbleFlatProgram","axisProgram","surfaceProgram","linePointProgram","waterfallProgram","vectorFieldProgram","pointCloudProgram","voxelProgram","ribbonProgram","surfaceBarProgram","deleteProgram","deleteProgramBundle","bundle","AXIS_COLORS","Axes3D","vertexShaderSource","fragmentShaderSource","vertexShader","fragmentShader","bounds","positions","colors","boxColor","addLine","gridColor","tickCount","i","tickLen","color","xColor","yColor","zColor","formatNumber","offset","formatter","t","value","viewProjectionMatrix","vao","posBuffer","colorBuffer","count","lineProgram","posLoc","colorLoc","worldPos","canvasWidth","canvasHeight","wx","wy","wz","m","clipX","clipY","clipZ","clipW","ndcX","ndcY","ndcZ","visible","screenX","screenY","Tooltip3D","container","data","content","containerRect","elementRect","viewportWidth","viewportHeight","finalX","finalY","lines","d","r","g","key","createHoverHandler","renderer","tooltip","lastHitIndex","debounceTimer","debounceMs","event","_a","_b","rect","hit","bubbleData","clone","set","add","subtract","normalize","dot","cross","ax","ay","az","bx","by","bz","length","squaredLength","lerp","negate","transformMat4","w","createRayFromScreen","invViewProj","Mat4.invert","nearPoint","farPoint","nearWorld","transformPoint4","farWorld","origin","direction","p","raySphereIntersection","ray","oc","discriminant","sqrtD","t1","t2","pickBubble","scales","baseRadius","closestHit","point","pickBubblesInRange","maxResults","hits","pointToRayDistance","closest","rayTriangleIntersection","v0","v1","v2","e1","e2","h","q","pickSurfaceMesh","xValues","zValues","yValues","cols","rows","row","col","i00","i10","i01","i11","v00","v10","v01","v11","hit1","yInterp","hit2","raySegmentDistance","p0","p1","u","D","sc","tc","closestOnRay","closestOnSegment","pickLine","minDist","line","res","pickImpulse","baseY","pickArea","areas","DARK_THEME","LIGHT_THEME","getThemeFromBackground","backgroundColor","createTheme","baseTheme","Area3DRenderer","newHoveredIndex","area","width","height","viewProj","canvas","dpr","allPositions","allNormals","allColors","allIndices","vertexOffset","colorPalette","highlightColor","areaIdx","pointCount","defaultColor","nx","ny","nz","topLeft","bottomLeft","topRight","bottomRight","normals","indices","padding","startTime","normalLoc","frameTime","now","loop","format","quality","transparent","savedBg","mimeType","listeners","createIcosphere","subdivisions","vertices","faces","midpointCache","getMidpoint","i1","i2","mx","my","mz","idx","newFaces","ab","bc","ca","createUVSphere","segments","rings","ring","seg","curr","next","createCube","createVoxelCube","InstancedMesh","geometry","maxInstances","instanceCount","instancePosLoc","scaleLoc","Bubble3DRenderer","_c","_d","_e","_f","_g","_h","tooltipOptions","programs","mesh","style","lx","ly","lz","index","i3","resolve","filename","dataUrl","link","Impulse3DRenderer","stemWidth","stemSides","impulseData","angle","cos","sin","ox","oz","bl","br","tl","tr","markerSize","octVerts","octFaces","oy","normalBuffer","indexBuffer","indexCount","Line3DRenderer","lineWidth","tubeSides","px","py","pz","tx","ty","tz","tLen","nLen","current","currentNext","nextNext","PointCloud3DRenderer","sizeLoc","sizes","cb","Ribbon3DRenderer","series","halfW","seriesIdx","n","mag","v3","SurfaceBar3DRenderer","cube","instPosLoc","heightLoc","spacing","heights","maxH","minH","palette","centers","radii","val","SurfaceMesh3D","_options","wireframeIndices","hL","hR","hD","hU","range","wireframe","SurfaceMesh3DRenderer","xMin","xMax","zMin","zMax","yMin","yMax","enabled","VectorField3DRenderer","dirLoc","_","Voxel3DRenderer","valueLoc","dimensions","k","j","vz","vy","vx","Waterfall3DRenderer","slices","slice","sliceIdx","sliceColor","PointLine3D","Column3D","columnWidth","columnDepth","vertexCount","hw","hd","yRange","baseIdx","box","vi","faceBase","cx","cy","cz","x3","y3","z3","pi","Waterfall3D","zStart","zStep","sliceCount","pointsPerSlice","quadRows","quadCols","colormap","Scatter3D","Ribbon3D","defaultWidth","widths","pLen","li3","ri3","Area3D","ti3","bi3","Heatmap3D","minVal","maxVal","Impulse3D","manifest3D","Plugin3D","config","ctx","_ctx","_newConfig"],"mappings":"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"}
1
+ {"version":3,"file":"3d.js","sources":["../../src/plugins/3d/math/Mat4.ts","../../src/plugins/3d/camera/OrbitCamera.ts","../../src/plugins/3d/controls/OrbitController.ts","../../src/plugins/3d/shader/sources.ts","../../src/plugins/3d/shader/programs.ts","../../src/plugins/3d/Axes3D.ts","../../src/plugins/3d/Tooltip3D.ts","../../src/plugins/3d/math/Vec3.ts","../../src/plugins/3d/Raycaster3D.ts","../../src/plugins/3d/colorThemes.ts","../../src/plugins/3d/Area3DRenderer.ts","../../src/plugins/3d/mesh/geometry.ts","../../src/plugins/3d/mesh/InstancedMesh.ts","../../src/plugins/3d/Bubble3DRenderer.ts","../../src/plugins/3d/Impulse3DRenderer.ts","../../src/plugins/3d/Line3DRenderer.ts","../../src/plugins/3d/PointCloud3DRenderer.ts","../../src/plugins/3d/Ribbon3DRenderer.ts","../../src/plugins/3d/SurfaceBar3DRenderer.ts","../../src/plugins/3d/series/SurfaceMesh3D.ts","../../src/plugins/3d/SurfaceMesh3DRenderer.ts","../../src/plugins/3d/VectorField3DRenderer.ts","../../src/plugins/3d/Voxel3DRenderer.ts","../../src/plugins/3d/Waterfall3DRenderer.ts","../../src/plugins/3d/series/PointLine3D.ts","../../src/plugins/3d/series/Column3D.ts","../../src/plugins/3d/series/Waterfall3D.ts","../../src/plugins/3d/series/Scatter3D.ts","../../src/plugins/3d/series/Ribbon3D.ts","../../src/plugins/3d/series/Area3D.ts","../../src/plugins/3d/series/Heatmap3D.ts","../../src/plugins/3d/series/Impulse3D.ts","../../src/plugins/3d/index.ts"],"sourcesContent":["/**\n * Minimal 4x4 Matrix math for WebGL 3D rendering.\n * Column-major order (OpenGL/WebGL convention).\n * No external dependencies.\n */\n\nexport type Mat4 = Float32Array;\nexport type Vec3 = [number, number, number];\n\nconst EPSILON = 0.000001;\n\n/** Create identity matrix */\nexport function create(): Mat4 {\n const out = new Float32Array(16);\n out[0] = 1;\n out[5] = 1;\n out[10] = 1;\n out[15] = 1;\n return out;\n}\n\n/** Set matrix to identity */\nexport function identity(out: Mat4): Mat4 {\n out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0;\n out[4] = 0; out[5] = 1; out[6] = 0; out[7] = 0;\n out[8] = 0; out[9] = 0; out[10] = 1; out[11] = 0;\n out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1;\n return out;\n}\n\n/** Copy matrix a to out */\nexport function copy(out: Mat4, a: Mat4): Mat4 {\n out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3];\n out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7];\n out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11];\n out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15];\n return out;\n}\n\n/** Multiply two matrices: out = a * b */\nexport function multiply(out: Mat4, a: Mat4, b: Mat4): Mat4 {\n const a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n const a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n const a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n const a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n\n let b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n return out;\n}\n\n/** Create perspective projection matrix */\nexport function perspective(\n out: Mat4,\n fovY: number,\n aspect: number,\n near: number,\n far: number\n): Mat4 {\n const f = 1.0 / Math.tan(fovY / 2);\n const nf = 1 / (near - far);\n\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = 2 * far * near * nf;\n out[15] = 0;\n\n return out;\n}\n\n/** Create view matrix looking at target from eye position */\nexport function lookAt(\n out: Mat4,\n eye: Vec3,\n center: Vec3,\n up: Vec3\n): Mat4 {\n const eyeX = eye[0], eyeY = eye[1], eyeZ = eye[2];\n const centerX = center[0], centerY = center[1], centerZ = center[2];\n const upX = up[0], upY = up[1], upZ = up[2];\n\n let z0 = eyeX - centerX;\n let z1 = eyeY - centerY;\n let z2 = eyeZ - centerZ;\n\n let len = z0 * z0 + z1 * z1 + z2 * z2;\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n }\n\n let x0 = upY * z2 - upZ * z1;\n let x1 = upZ * z0 - upX * z2;\n let x2 = upX * z1 - upY * z0;\n\n len = x0 * x0 + x1 * x1 + x2 * x2;\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n const y0 = z1 * x2 - z2 * x1;\n const y1 = z2 * x0 - z0 * x2;\n const y2 = z0 * x1 - z1 * x0;\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyeX + x1 * eyeY + x2 * eyeZ);\n out[13] = -(y0 * eyeX + y1 * eyeY + y2 * eyeZ);\n out[14] = -(z0 * eyeX + z1 * eyeY + z2 * eyeZ);\n out[15] = 1;\n\n return out;\n}\n\n/** Translate matrix by vector v */\nexport function translate(out: Mat4, a: Mat4, v: Vec3): Mat4 {\n const x = v[0], y = v[1], z = v[2];\n\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n const a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n const a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n const a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n\n out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03;\n out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13;\n out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23;\n\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n\n return out;\n}\n\n/** Scale matrix by vector v */\nexport function scale(out: Mat4, a: Mat4, v: Vec3): Mat4 {\n const x = v[0], y = v[1], z = v[2];\n\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n\n return out;\n}\n\n/** Rotate matrix around X axis */\nexport function rotateX(out: Mat4, a: Mat4, rad: number): Mat4 {\n const s = Math.sin(rad);\n const c = Math.cos(rad);\n const a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n const a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n\n if (a !== out) {\n out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3];\n out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15];\n }\n\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n\n return out;\n}\n\n/** Rotate matrix around Y axis */\nexport function rotateY(out: Mat4, a: Mat4, rad: number): Mat4 {\n const s = Math.sin(rad);\n const c = Math.cos(rad);\n const a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n const a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n\n if (a !== out) {\n out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7];\n out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15];\n }\n\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n\n return out;\n}\n\n/** Rotate matrix around Z axis */\nexport function rotateZ(out: Mat4, a: Mat4, rad: number): Mat4 {\n const s = Math.sin(rad);\n const c = Math.cos(rad);\n const a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n const a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n\n if (a !== out) {\n out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11];\n out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15];\n }\n\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n\n return out;\n}\n\n/** Invert matrix */\nexport function invert(out: Mat4, a: Mat4): Mat4 | null {\n const a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n const a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n const a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n const a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n\n const b00 = a00 * a11 - a01 * a10;\n const b01 = a00 * a12 - a02 * a10;\n const b02 = a00 * a13 - a03 * a10;\n const b03 = a01 * a12 - a02 * a11;\n const b04 = a01 * a13 - a03 * a11;\n const b05 = a02 * a13 - a03 * a12;\n const b06 = a20 * a31 - a21 * a30;\n const b07 = a20 * a32 - a22 * a30;\n const b08 = a20 * a33 - a23 * a30;\n const b09 = a21 * a32 - a22 * a31;\n const b10 = a21 * a33 - a23 * a31;\n const b11 = a22 * a33 - a23 * a32;\n\n let det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (Math.abs(det) < EPSILON) {\n return null;\n }\n\n det = 1.0 / det;\n\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n\n return out;\n}\n\n/** Create orthographic projection matrix */\nexport function ortho(\n out: Mat4,\n left: number,\n right: number,\n bottom: number,\n top: number,\n near: number,\n far: number\n): Mat4 {\n const lr = 1 / (left - right);\n const bt = 1 / (bottom - top);\n const nf = 1 / (near - far);\n\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n\n return out;\n}\n","/**\n * Orbit camera for 3D scene navigation.\n * Uses spherical coordinates (theta, phi, radius) around a target point.\n */\n\nimport * as Mat4 from '../math/Mat4';\nimport type { Vec3 } from '../math/Mat4';\n\nexport interface OrbitCameraOptions {\n target?: Vec3;\n radius?: number;\n theta?: number; // Horizontal angle (radians)\n phi?: number; // Vertical angle (radians)\n fov?: number; // Field of view (radians)\n near?: number;\n far?: number;\n minRadius?: number;\n maxRadius?: number;\n minPhi?: number; // Prevent flipping at poles\n maxPhi?: number;\n}\n\nexport class OrbitCamera {\n // Target point to orbit around\n target: Vec3 = [0, 0, 0];\n \n // Spherical coordinates\n radius = 5;\n theta = 0; // Horizontal rotation\n phi = Math.PI / 4; // Vertical rotation (0 = top, PI = bottom)\n \n // Projection parameters\n fov = Math.PI / 4; // 45 degrees\n aspect = 1;\n near = 0.1;\n far = 1000;\n \n // Constraints\n minRadius = 0.5;\n maxRadius = 100;\n minPhi = 0.01;\n maxPhi = Math.PI - 0.01;\n \n // Cached matrices\n private viewMatrix: Mat4.Mat4;\n private projMatrix: Mat4.Mat4;\n private viewProjMatrix: Mat4.Mat4;\n private dirty = true;\n \n // Cached eye position\n private eye: Vec3 = [0, 0, 0];\n \n constructor(options: OrbitCameraOptions = {}) {\n this.viewMatrix = Mat4.create();\n this.projMatrix = Mat4.create();\n this.viewProjMatrix = Mat4.create();\n \n if (options.target) this.target = [...options.target];\n if (options.radius !== undefined) this.radius = options.radius;\n if (options.theta !== undefined) this.theta = options.theta;\n if (options.phi !== undefined) this.phi = options.phi;\n if (options.fov !== undefined) this.fov = options.fov;\n if (options.near !== undefined) this.near = options.near;\n if (options.far !== undefined) this.far = options.far;\n if (options.minRadius !== undefined) this.minRadius = options.minRadius;\n if (options.maxRadius !== undefined) this.maxRadius = options.maxRadius;\n if (options.minPhi !== undefined) this.minPhi = options.minPhi;\n if (options.maxPhi !== undefined) this.maxPhi = options.maxPhi;\n \n this.dirty = true;\n }\n \n /**\n * Set aspect ratio (width / height).\n */\n setAspect(aspect: number): void {\n if (this.aspect !== aspect) {\n this.aspect = aspect;\n this.dirty = true;\n }\n }\n \n /**\n * Rotate camera by delta angles.\n */\n rotate(deltaTheta: number, deltaPhi: number): void {\n this.theta += deltaTheta;\n this.phi = Math.max(this.minPhi, Math.min(this.maxPhi, this.phi + deltaPhi));\n this.dirty = true;\n }\n \n /**\n * Zoom camera by delta radius (positive = zoom out).\n */\n zoom(delta: number): void {\n this.radius = Math.max(this.minRadius, Math.min(this.maxRadius, this.radius + delta));\n this.dirty = true;\n }\n \n /**\n * Zoom by factor (1 = no change, <1 = zoom in, >1 = zoom out).\n */\n zoomFactor(factor: number): void {\n this.radius = Math.max(this.minRadius, Math.min(this.maxRadius, this.radius * factor));\n this.dirty = true;\n }\n \n /**\n * Pan camera target by world-space delta.\n */\n pan(deltaX: number, deltaY: number): void {\n // Calculate right and up vectors from current view\n const sinTheta = Math.sin(this.theta);\n const cosTheta = Math.cos(this.theta);\n \n // Right vector (perpendicular to view direction in XZ plane)\n const rightX = cosTheta;\n const rightZ = -sinTheta;\n \n // Up vector (world up for simplicity)\n const upY = 1;\n \n this.target[0] += rightX * deltaX;\n this.target[1] += upY * deltaY;\n this.target[2] += rightZ * deltaX;\n \n this.dirty = true;\n }\n \n /**\n * Set target position directly.\n */\n setTarget(x: number, y: number, z: number): void {\n this.target[0] = x;\n this.target[1] = y;\n this.target[2] = z;\n this.dirty = true;\n }\n \n /**\n * Set camera position from spherical coordinates.\n */\n setSpherical(theta: number, phi: number, radius: number): void {\n this.theta = theta;\n this.phi = Math.max(this.minPhi, Math.min(this.maxPhi, phi));\n this.radius = Math.max(this.minRadius, Math.min(this.maxRadius, radius));\n this.dirty = true;\n }\n \n /**\n * Update matrices if dirty.\n */\n private updateMatrices(): void {\n if (!this.dirty) return;\n \n // Calculate eye position from spherical coordinates\n const sinPhi = Math.sin(this.phi);\n const cosPhi = Math.cos(this.phi);\n const sinTheta = Math.sin(this.theta);\n const cosTheta = Math.cos(this.theta);\n \n this.eye[0] = this.target[0] + this.radius * sinPhi * sinTheta;\n this.eye[1] = this.target[1] + this.radius * cosPhi;\n this.eye[2] = this.target[2] + this.radius * sinPhi * cosTheta;\n \n // View matrix\n Mat4.lookAt(this.viewMatrix, this.eye, this.target, [0, 1, 0]);\n \n // Projection matrix\n Mat4.perspective(this.projMatrix, this.fov, this.aspect, this.near, this.far);\n \n // Combined view-projection matrix\n Mat4.multiply(this.viewProjMatrix, this.projMatrix, this.viewMatrix);\n \n this.dirty = false;\n }\n \n /**\n * Get view matrix.\n */\n getViewMatrix(): Mat4.Mat4 {\n this.updateMatrices();\n return this.viewMatrix;\n }\n \n /**\n * Get projection matrix.\n */\n getProjectionMatrix(): Mat4.Mat4 {\n this.updateMatrices();\n return this.projMatrix;\n }\n \n /**\n * Get combined view-projection matrix.\n */\n getViewProjectionMatrix(): Mat4.Mat4 {\n this.updateMatrices();\n return this.viewProjMatrix;\n }\n \n /**\n * Get current eye position.\n */\n getEyePosition(): Vec3 {\n this.updateMatrices();\n return [...this.eye] as Vec3;\n }\n \n /**\n * Get forward direction (normalized).\n */\n getForwardDirection(): Vec3 {\n this.updateMatrices();\n const dx = this.target[0] - this.eye[0];\n const dy = this.target[1] - this.eye[1];\n const dz = this.target[2] - this.eye[2];\n const len = Math.sqrt(dx * dx + dy * dy + dz * dz);\n return [dx / len, dy / len, dz / len];\n }\n \n /**\n * Reset camera to default position.\n */\n reset(): void {\n this.target = [0, 0, 0];\n this.radius = 5;\n this.theta = 0;\n this.phi = Math.PI / 4;\n this.dirty = true;\n }\n \n /**\n * Fit camera to view a bounding box.\n */\n fitToBounds(\n minX: number, minY: number, minZ: number,\n maxX: number, maxY: number, maxZ: number\n ): void {\n // Center target on bounds center\n this.target[0] = (minX + maxX) / 2;\n this.target[1] = (minY + maxY) / 2;\n this.target[2] = (minZ + maxZ) / 2;\n \n // Calculate radius to fit bounds\n const dx = maxX - minX;\n const dy = maxY - minY;\n const dz = maxZ - minZ;\n const diagonal = Math.sqrt(dx * dx + dy * dy + dz * dz);\n \n // Distance to fit diagonal in view\n this.radius = diagonal / (2 * Math.tan(this.fov / 2));\n this.radius = Math.max(this.minRadius, Math.min(this.maxRadius, this.radius));\n \n this.dirty = true;\n }\n}\n","/**\n * Orbit controller for mouse/touch interaction with OrbitCamera.\n * Handles rotation, zoom, and pan gestures.\n */\n\nimport type { OrbitCamera } from '../camera/OrbitCamera';\n\nexport interface OrbitControllerOptions {\n rotateSpeed?: number;\n zoomSpeed?: number;\n panSpeed?: number;\n enableRotate?: boolean;\n enableZoom?: boolean;\n enablePan?: boolean;\n rotateButton?: number; // 0 = left, 1 = middle, 2 = right\n panButton?: number;\n dampingFactor?: number; // 0 = no damping, 1 = instant stop\n}\n\ninterface PointerState {\n id: number;\n x: number;\n y: number;\n startX: number;\n startY: number;\n}\n\nexport class OrbitController {\n private camera: OrbitCamera;\n private element: HTMLElement;\n \n // Settings\n rotateSpeed = 0.005;\n zoomSpeed = 0.001;\n panSpeed = 0.003; // Reduced for less sensitivity\n enableRotate = true;\n enableZoom = true;\n enablePan = true;\n rotateButton = 0;\n panButton = 2;\n dampingFactor = 0.1;\n \n // State\n private isRotating = false;\n private isPanning = false;\n private lastX = 0;\n private lastY = 0;\n \n // Touch state\n private pointers: Map<number, PointerState> = new Map();\n private lastPinchDistance = 0;\n \n // Velocity for damping\n private velocityTheta = 0;\n private velocityPhi = 0;\n private velocityRadius = 0;\n \n // Callbacks\n private onChangeCallback?: () => void;\n \n // Bound handlers for cleanup\n private boundHandlers: {\n onPointerDown: (e: PointerEvent) => void;\n onPointerMove: (e: PointerEvent) => void;\n onPointerUp: (e: PointerEvent) => void;\n onWheel: (e: WheelEvent) => void;\n onContextMenu: (e: Event) => void;\n };\n \n constructor(\n camera: OrbitCamera,\n element: HTMLElement,\n options: OrbitControllerOptions = {}\n ) {\n this.camera = camera;\n this.element = element;\n \n if (options.rotateSpeed !== undefined) this.rotateSpeed = options.rotateSpeed;\n if (options.zoomSpeed !== undefined) this.zoomSpeed = options.zoomSpeed;\n if (options.panSpeed !== undefined) this.panSpeed = options.panSpeed;\n if (options.enableRotate !== undefined) this.enableRotate = options.enableRotate;\n if (options.enableZoom !== undefined) this.enableZoom = options.enableZoom;\n if (options.enablePan !== undefined) this.enablePan = options.enablePan;\n if (options.rotateButton !== undefined) this.rotateButton = options.rotateButton;\n if (options.panButton !== undefined) this.panButton = options.panButton;\n if (options.dampingFactor !== undefined) this.dampingFactor = options.dampingFactor;\n \n this.boundHandlers = {\n onPointerDown: this.onPointerDown.bind(this),\n onPointerMove: this.onPointerMove.bind(this),\n onPointerUp: this.onPointerUp.bind(this),\n onWheel: this.onWheel.bind(this),\n onContextMenu: (e: Event) => e.preventDefault(),\n };\n \n this.attach();\n }\n \n /**\n * Attach event listeners to element.\n */\n private attach(): void {\n const { element, boundHandlers } = this;\n \n element.addEventListener('pointerdown', boundHandlers.onPointerDown);\n element.addEventListener('pointermove', boundHandlers.onPointerMove);\n element.addEventListener('pointerup', boundHandlers.onPointerUp);\n element.addEventListener('pointercancel', boundHandlers.onPointerUp);\n element.addEventListener('pointerleave', boundHandlers.onPointerUp);\n element.addEventListener('wheel', boundHandlers.onWheel, { passive: false });\n element.addEventListener('contextmenu', boundHandlers.onContextMenu);\n \n element.style.touchAction = 'none';\n }\n \n /**\n * Detach event listeners.\n */\n detach(): void {\n const { element, boundHandlers } = this;\n \n element.removeEventListener('pointerdown', boundHandlers.onPointerDown);\n element.removeEventListener('pointermove', boundHandlers.onPointerMove);\n element.removeEventListener('pointerup', boundHandlers.onPointerUp);\n element.removeEventListener('pointercancel', boundHandlers.onPointerUp);\n element.removeEventListener('pointerleave', boundHandlers.onPointerUp);\n element.removeEventListener('wheel', boundHandlers.onWheel);\n element.removeEventListener('contextmenu', boundHandlers.onContextMenu);\n }\n \n /**\n * Set callback for camera changes.\n */\n onChange(callback: () => void): void {\n this.onChangeCallback = callback;\n }\n \n private notifyChange(): void {\n if (this.onChangeCallback) {\n this.onChangeCallback();\n }\n }\n \n private onPointerDown(e: PointerEvent): void {\n this.element.setPointerCapture(e.pointerId);\n \n this.pointers.set(e.pointerId, {\n id: e.pointerId,\n x: e.clientX,\n y: e.clientY,\n startX: e.clientX,\n startY: e.clientY,\n });\n \n if (this.pointers.size === 1) {\n // Single pointer - rotate or pan\n if (e.button === this.rotateButton && this.enableRotate) {\n this.isRotating = true;\n this.isPanning = false;\n } else if (e.button === this.panButton && this.enablePan) {\n this.isPanning = true;\n this.isRotating = false;\n }\n \n this.lastX = e.clientX;\n this.lastY = e.clientY;\n } else if (this.pointers.size === 2) {\n // Two pointers - pinch zoom\n this.isRotating = false;\n this.isPanning = false;\n this.lastPinchDistance = this.getPinchDistance();\n }\n }\n \n private onPointerMove(e: PointerEvent): void {\n const pointer = this.pointers.get(e.pointerId);\n if (!pointer) return;\n \n pointer.x = e.clientX;\n pointer.y = e.clientY;\n \n if (this.pointers.size === 1) {\n const deltaX = e.clientX - this.lastX;\n const deltaY = e.clientY - this.lastY;\n \n if (this.isRotating && this.enableRotate) {\n this.camera.rotate(\n -deltaX * this.rotateSpeed,\n deltaY * this.rotateSpeed\n );\n this.velocityTheta = -deltaX * this.rotateSpeed;\n this.velocityPhi = deltaY * this.rotateSpeed;\n this.notifyChange();\n } else if (this.isPanning && this.enablePan) {\n const panScale = this.camera.radius * this.panSpeed;\n // Invert Y so that moving mouse up moves content up (natural direction)\n this.camera.pan(-deltaX * panScale, -deltaY * panScale);\n this.notifyChange();\n }\n \n this.lastX = e.clientX;\n this.lastY = e.clientY;\n } else if (this.pointers.size === 2 && this.enableZoom) {\n // Pinch zoom\n const distance = this.getPinchDistance();\n const delta = this.lastPinchDistance - distance;\n \n this.camera.zoom(delta * this.zoomSpeed * this.camera.radius);\n this.lastPinchDistance = distance;\n this.notifyChange();\n }\n }\n \n private onPointerUp(e: PointerEvent): void {\n this.element.releasePointerCapture(e.pointerId);\n this.pointers.delete(e.pointerId);\n \n if (this.pointers.size === 0) {\n this.isRotating = false;\n this.isPanning = false;\n } else if (this.pointers.size === 1) {\n // Switched from pinch to single pointer\n const remaining = this.pointers.values().next().value;\n if (remaining) {\n this.lastX = remaining.x;\n this.lastY = remaining.y;\n }\n }\n }\n \n private onWheel(e: WheelEvent): void {\n e.preventDefault();\n \n if (!this.enableZoom) return;\n \n // Normalize wheel delta across browsers\n let delta = e.deltaY;\n if (e.deltaMode === 1) delta *= 40; // Lines\n if (e.deltaMode === 2) delta *= 800; // Pages\n \n // Zoom proportional to current radius\n const zoomAmount = delta * this.zoomSpeed * this.camera.radius * 0.1;\n this.camera.zoom(zoomAmount);\n this.velocityRadius = zoomAmount;\n this.notifyChange();\n }\n \n private getPinchDistance(): number {\n if (this.pointers.size < 2) return 0;\n \n const pointerArray = Array.from(this.pointers.values());\n const dx = pointerArray[0].x - pointerArray[1].x;\n const dy = pointerArray[0].y - pointerArray[1].y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n \n /**\n * Update damping (call each frame for smooth deceleration).\n * Returns true if camera is still moving.\n */\n update(): boolean {\n if (this.dampingFactor <= 0) return false;\n if (this.isRotating || this.isPanning) return false;\n \n const threshold = 0.0001;\n let moving = false;\n \n if (Math.abs(this.velocityTheta) > threshold || Math.abs(this.velocityPhi) > threshold) {\n this.camera.rotate(this.velocityTheta, this.velocityPhi);\n this.velocityTheta *= (1 - this.dampingFactor);\n this.velocityPhi *= (1 - this.dampingFactor);\n moving = true;\n }\n \n if (Math.abs(this.velocityRadius) > threshold) {\n this.camera.zoom(this.velocityRadius);\n this.velocityRadius *= (1 - this.dampingFactor);\n moving = true;\n }\n \n if (moving) {\n this.notifyChange();\n }\n \n return moving;\n }\n \n /**\n * Stop all momentum.\n */\n stopMomentum(): void {\n this.velocityTheta = 0;\n this.velocityPhi = 0;\n this.velocityRadius = 0;\n }\n \n /**\n * Clean up resources.\n */\n destroy(): void {\n this.detach();\n this.pointers.clear();\n }\n}\n","/**\n * GLSL shader sources for 3D instanced rendering.\n * WebGL2 / GLSL ES 3.00\n */\n\nexport const BUBBLE_VERT = `#version 300 es\nprecision highp float;\n\n// Base geometry vertex\nin vec3 a_position;\n\n// Per-instance attributes\nin vec3 a_instancePos;\nin float a_scale;\nin vec3 a_color;\n\n// Uniforms\nuniform mat4 u_viewProjection;\nuniform float u_opacity;\n\n// Varyings\nout vec3 v_color;\nout vec3 v_normal;\nout vec3 v_worldPos;\n\nvoid main() {\n // Scale and translate instance\n vec3 worldPos = (a_position * a_scale) + a_instancePos;\n \n gl_Position = u_viewProjection * vec4(worldPos, 1.0);\n \n v_color = a_color;\n v_normal = normalize(a_position); // For sphere, normal = normalized position\n v_worldPos = worldPos;\n}\n`;\n\nexport const BUBBLE_FRAG = `#version 300 es\nprecision highp float;\n\nin vec3 v_color;\nin vec3 v_normal;\nin vec3 v_worldPos;\n\nuniform float u_opacity;\nuniform vec3 u_lightDir;\nuniform float u_ambient;\n\nout vec4 fragColor;\n\nvoid main() {\n // Simple diffuse lighting\n vec3 normal = normalize(v_normal);\n vec3 lightDir = normalize(u_lightDir);\n \n float diff = max(dot(normal, lightDir), 0.0);\n float lighting = u_ambient + (1.0 - u_ambient) * diff;\n \n vec3 color = v_color * lighting;\n fragColor = vec4(color, u_opacity);\n}\n`;\n\nexport const BUBBLE_FLAT_FRAG = `#version 300 es\nprecision highp float;\n\nin vec3 v_color;\nin vec3 v_normal;\nin vec3 v_worldPos;\n\nuniform float u_opacity;\n\nout vec4 fragColor;\n\nvoid main() {\n fragColor = vec4(v_color, u_opacity);\n}\n`;\n\n// WebGL1 fallback shaders (GLSL ES 1.00)\nexport const BUBBLE_VERT_WEBGL1 = `\nprecision highp float;\n\n// Base geometry vertex\nattribute vec3 a_position;\n\n// Per-instance attributes\nattribute vec3 a_instancePos;\nattribute float a_scale;\nattribute vec3 a_color;\n\n// Uniforms\nuniform mat4 u_viewProjection;\nuniform float u_opacity;\n\n// Varyings\nvarying vec3 v_color;\nvarying vec3 v_normal;\nvarying vec3 v_worldPos;\n\nvoid main() {\n vec3 worldPos = (a_position * a_scale) + a_instancePos;\n \n gl_Position = u_viewProjection * vec4(worldPos, 1.0);\n \n v_color = a_color;\n v_normal = normalize(a_position);\n v_worldPos = worldPos;\n}\n`;\n\nexport const BUBBLE_FRAG_WEBGL1 = `\nprecision highp float;\n\nvarying vec3 v_color;\nvarying vec3 v_normal;\nvarying vec3 v_worldPos;\n\nuniform float u_opacity;\nuniform vec3 u_lightDir;\nuniform float u_ambient;\n\nvoid main() {\n vec3 normal = normalize(v_normal);\n vec3 lightDir = normalize(u_lightDir);\n \n float diff = max(dot(normal, lightDir), 0.0);\n float lighting = u_ambient + (1.0 - u_ambient) * diff;\n \n vec3 color = v_color * lighting;\n gl_FragColor = vec4(color, u_opacity);\n}\n`;\n\n// Axis/grid shaders\nexport const AXIS_VERT = `#version 300 es\nprecision highp float;\n\nin vec3 a_position;\nin vec3 a_color;\n\nuniform mat4 u_viewProjection;\n\nout vec3 v_color;\n\nvoid main() {\n gl_Position = u_viewProjection * vec4(a_position, 1.0);\n v_color = a_color;\n}\n`;\n\nexport const AXIS_FRAG = `#version 300 es\nprecision highp float;\n\nin vec3 v_color;\nout vec4 fragColor;\n\nvoid main() {\n fragColor = vec4(v_color, 1.0);\n}\n`;\n\n// Surface mesh shader with lighting\nexport const SURFACE_VERT = `#version 300 es\nprecision highp float;\n\nin vec3 a_position;\nin vec3 a_normal;\nin vec3 a_color;\n\nuniform mat4 u_viewProjection;\n\nout vec3 v_color;\nout vec3 v_normal;\nout vec3 v_worldPos;\n\nvoid main() {\n gl_Position = u_viewProjection * vec4(a_position, 1.0);\n v_color = a_color;\n v_normal = a_normal;\n v_worldPos = a_position;\n}\n`;\n\nexport const SURFACE_FRAG = `#version 300 es\nprecision highp float;\n\nin vec3 v_color;\nin vec3 v_normal;\nin vec3 v_worldPos;\n\nuniform float u_opacity;\nuniform vec3 u_lightDir;\nuniform float u_ambient;\n\nout vec4 fragColor;\n\nvoid main() {\n vec3 normal = normalize(v_normal);\n vec3 lightDir = normalize(u_lightDir);\n \n float diff = max(dot(normal, lightDir), 0.0);\n float lighting = u_ambient + (1.0 - u_ambient) * diff;\n \n vec3 color = v_color * lighting;\n fragColor = vec4(color, u_opacity);\n}\n`;\n\n// Line/point shader for PointLine3D, Impulse3D\nexport const LINE_POINT_VERT = `#version 300 es\nprecision highp float;\n\nin vec3 a_position;\nin vec3 a_color;\n\nuniform mat4 u_viewProjection;\nuniform float u_pointSize;\n\nout vec3 v_color;\n\nvoid main() {\n gl_Position = u_viewProjection * vec4(a_position, 1.0);\n gl_PointSize = u_pointSize;\n v_color = a_color;\n}\n`;\n\nexport const LINE_POINT_FRAG = `#version 300 es\nprecision highp float;\n\nin vec3 v_color;\nuniform float u_opacity;\n\nout vec4 fragColor;\n\nvoid main() {\n fragColor = vec4(v_color, u_opacity);\n}\n`;\n\n// Waterfall shader with gradient coloring and lighting\nexport const WATERFALL_VERT = `#version 300 es\nprecision highp float;\n\nin vec3 a_position;\nin vec3 a_color;\nin vec3 a_normal;\n\nuniform mat4 u_viewProjection;\n\nout vec3 v_color;\nout float v_depth;\nout vec3 v_normal;\n\nvoid main() {\n gl_Position = u_viewProjection * vec4(a_position, 1.0);\n v_color = a_color;\n v_depth = a_position.z;\n v_normal = a_normal;\n}\n`;\n\nexport const WATERFALL_FRAG = `#version 300 es\nprecision highp float;\n\nin vec3 v_color;\nin float v_depth;\nin vec3 v_normal;\n\nuniform float u_opacity;\nuniform float u_fadeStart;\nuniform float u_fadeEnd;\nuniform vec3 u_lightDir;\nuniform float u_ambient;\n\nout vec4 fragColor;\n\nvoid main() {\n // Lighting\n vec3 normal = normalize(v_normal);\n vec3 lightDir = normalize(u_lightDir);\n float diff = max(dot(normal, lightDir), 0.0);\n float lighting = u_ambient + (1.0 - u_ambient) * diff;\n \n // Fade based on depth (Z position)\n float fade = 1.0;\n if (u_fadeEnd > u_fadeStart) {\n fade = 1.0 - smoothstep(u_fadeStart, u_fadeEnd, v_depth);\n }\n \n fragColor = vec4(v_color * lighting, u_opacity * fade);\n}\n`;\n// Vector Field shader for Quiver plots\nexport const VECTOR_FIELD_VERT = `#version 300 es\nprecision highp float;\n\nin vec3 a_position; // Base geometry (e.g., arrow)\nin vec3 a_instancePos; // Origin of the vector\nin vec3 a_direction; // Direction vector [dx, dy, dz]\nin vec3 a_color;\nin vec3 a_normal;\n\nuniform mat4 u_viewProjection;\nuniform float u_scaleMultiplier;\n\nout vec3 v_color;\nout vec3 v_normal;\n\nvoid main() {\n float mag = length(a_direction);\n vec3 dir = normalize(a_direction);\n \n // Construct rotation matrix to align with direction\n vec3 up = abs(dir.y) < 0.99 ? vec3(0.0, 1.0, 0.0) : vec3(1.0, 0.0, 0.0);\n vec3 right = normalize(cross(up, dir));\n vec3 actualUp = cross(dir, right);\n mat3 rotation = mat3(right, actualUp, dir);\n \n v_normal = rotation * a_normal;\n \n // Scale based on magnitude\n vec3 scaledPos = a_position * mag * u_scaleMultiplier;\n \n // Rotate and translate\n vec3 worldPos = (rotation * scaledPos) + a_instancePos;\n \n gl_Position = u_viewProjection * vec4(worldPos, 1.0);\n v_color = a_color;\n}\n`;\n\nexport const VECTOR_FIELD_FRAG = `#version 300 es\nprecision highp float;\n\nin vec3 v_color;\nin vec3 v_normal;\nuniform float u_opacity;\nuniform vec3 u_lightDir;\nuniform float u_ambient;\nout vec4 fragColor;\n\nvoid main() {\n vec3 normal = normalize(v_normal);\n vec3 lightDir = normalize(u_lightDir);\n float diff = max(dot(normal, lightDir), 0.0);\n float lighting = u_ambient + (1.0 - u_ambient) * diff;\n fragColor = vec4(v_color * lighting, u_opacity);\n}\n`;\n// Point Cloud shader for massive datasets\nexport const POINT_CLOUD_VERT = `#version 300 es\nprecision highp float;\n\nin vec3 a_position;\nin vec3 a_color;\nin float a_size;\n\nuniform mat4 u_viewProjection;\nuniform float u_globalSize;\n\nout vec3 v_color;\n\nvoid main() {\n gl_Position = u_viewProjection * vec4(a_position, 1.0);\n gl_PointSize = a_size * u_globalSize;\n v_color = a_color;\n \n // Basic depth attenuation (points get smaller with distance)\n gl_PointSize /= gl_Position.w * 0.5;\n}\n`;\n\nexport const POINT_CLOUD_FRAG = `#version 300 es\nprecision highp float;\n\nin vec3 v_color;\nuniform float u_opacity;\nuniform bool u_circular;\n\nout vec4 fragColor;\n\nvoid main() {\n if (u_circular) {\n vec2 dist = gl_PointCoord - vec2(0.5);\n if (dot(dist, dist) > 0.25) discard;\n }\n \n fragColor = vec4(v_color, u_opacity);\n}\n`;\n// Voxel shader for volumetric data\nexport const VOXEL_VERT = `#version 300 es\nprecision highp float;\n\nin vec3 a_position; // Base cube vertex\nin vec3 a_instancePos; // Voxel center\nin float a_value; // Voxel intensity [0, 1]\n\nuniform mat4 u_viewProjection;\nuniform float u_voxelSize;\nuniform float u_threshold;\n\nout float v_value;\nout vec3 v_normal;\n\nvoid main() {\n if (a_value < u_threshold) {\n // Hide voxel if below threshold\n gl_Position = vec4(2.0, 2.0, 2.0, 1.0);\n return;\n }\n \n vec3 worldPos = (a_position * u_voxelSize) + a_instancePos;\n gl_Position = u_viewProjection * vec4(worldPos, 1.0);\n v_value = a_value;\n v_normal = normalize(a_position);\n}\n`;\n\nexport const VOXEL_FRAG = `#version 300 es\nprecision highp float;\n\nin float v_value;\nin vec3 v_normal;\n\nuniform float u_opacity;\nuniform vec3 u_lightDir;\nuniform float u_ambient;\n\nout vec4 fragColor;\n\n// Simple heatmap coloring\nvec3 heatmap(float t) {\n return vec3(t, 1.0 - t, 0.5 + sin(t * 3.14159) * 0.5);\n}\n\nvoid main() {\n vec3 normal = normalize(v_normal);\n vec3 lightDir = normalize(u_lightDir);\n float diff = max(dot(normal, lightDir), 0.0);\n float lighting = u_ambient + (1.0 - u_ambient) * diff;\n \n // Spectral colormap\n vec3 color = vec3(v_value, 0.2, 1.0 - v_value);\n if (v_value > 0.5) color = vec3(1.0, 1.0 - (v_value-0.5)*2.0, 0.0);\n \n fragColor = vec4(color * lighting, u_opacity * v_value);\n}\n`;\n// Ribbon shader for 3D paths with width\nexport const RIBBON_VERT = `#version 300 es\nprecision highp float;\n\nin vec3 a_position;\nin vec3 a_normal;\nin vec3 a_color;\n\nuniform mat4 u_viewProjection;\n\nout vec3 v_color;\nout vec3 v_normal;\n\nvoid main() {\n gl_Position = u_viewProjection * vec4(a_position, 1.0);\n v_color = a_color;\n v_normal = a_normal;\n}\n`;\n\nexport const RIBBON_FRAG = `#version 300 es\nprecision highp float;\n\nin vec3 v_color;\nin vec3 v_normal;\n\nuniform float u_opacity;\nuniform vec3 u_lightDir;\nuniform float u_ambient;\n\nout vec4 fragColor;\n\nvoid main() {\n vec3 normal = normalize(v_normal);\n vec3 lightDir = normalize(u_lightDir);\n float diff = max(dot(normal, lightDir), 0.0);\n float lighting = u_ambient + (1.0 - u_ambient) * diff;\n fragColor = vec4(v_color * lighting, u_opacity);\n}\n`;\n// Surface Bar (3D Histogram) shader\nexport const SURFACE_BAR_VERT = `#version 300 es\nprecision highp float;\n\nin vec3 a_position; // Base cube vertex [-0.5, 0.5]\nin vec3 a_instancePos; // Column base\nin float a_height; // Column height\nin vec3 a_color;\n\nuniform mat4 u_viewProjection;\nuniform float u_barWidth;\nuniform float u_barDepth;\n\nout vec3 v_color;\nout vec3 v_normal;\n\nvoid main() {\n vec3 pos = a_position;\n pos.x *= u_barWidth;\n pos.z *= u_barDepth;\n pos.y = (pos.y + 0.5) * a_height; \n \n vec3 worldPos = pos + a_instancePos;\n gl_Position = u_viewProjection * vec4(worldPos, 1.0);\n \n v_color = a_color;\n // Normals for a cube are essentially the vertex positions normalized if centered at 0\n // But since we offset Y, we just use the original sign for flat shading or simple lighting\n v_normal = normalize(a_position);\n}\n`;\n\nexport const SURFACE_BAR_FRAG = `#version 300 es\nprecision highp float;\n\nin vec3 v_color;\nin vec3 v_normal;\n\nuniform float u_opacity;\nuniform vec3 u_lightDir;\nuniform float u_ambient;\n\nout vec4 fragColor;\n\nvoid main() {\n vec3 normal = normalize(v_normal);\n vec3 lightDir = normalize(u_lightDir);\n float diff = max(dot(normal, lightDir), 0.0);\n float lighting = u_ambient + (1.0 - u_ambient) * diff;\n fragColor = vec4(v_color * lighting, u_opacity);\n}\n`;\n","/**\n * WebGL shader program compilation and management for 3D rendering.\n */\n\nimport {\n BUBBLE_VERT,\n BUBBLE_FRAG,\n BUBBLE_FLAT_FRAG,\n BUBBLE_VERT_WEBGL1,\n BUBBLE_FRAG_WEBGL1,\n AXIS_VERT,\n AXIS_FRAG,\n SURFACE_VERT,\n SURFACE_FRAG,\n LINE_POINT_VERT,\n LINE_POINT_FRAG,\n WATERFALL_VERT,\n WATERFALL_FRAG,\n VECTOR_FIELD_VERT,\n VECTOR_FIELD_FRAG,\n POINT_CLOUD_VERT,\n POINT_CLOUD_FRAG,\n VOXEL_VERT,\n VOXEL_FRAG,\n RIBBON_VERT,\n RIBBON_FRAG,\n SURFACE_BAR_VERT,\n SURFACE_BAR_FRAG,\n} from './sources';\n\nexport interface ShaderProgram3D {\n program: WebGLProgram;\n attributes: Record<string, number>;\n uniforms: Record<string, WebGLUniformLocation | null>;\n}\n\nexport interface ProgramBundle3D {\n bubbleProgram: ShaderProgram3D;\n bubbleFlatProgram: ShaderProgram3D;\n axisProgram: ShaderProgram3D;\n surfaceProgram: ShaderProgram3D;\n linePointProgram: ShaderProgram3D;\n waterfallProgram: ShaderProgram3D;\n vectorFieldProgram: ShaderProgram3D;\n pointCloudProgram: ShaderProgram3D;\n voxelProgram: ShaderProgram3D;\n ribbonProgram: ShaderProgram3D;\n surfaceBarProgram: ShaderProgram3D;\n}\n\nfunction createShader(\n gl: WebGL2RenderingContext | WebGLRenderingContext,\n source: string,\n type: number\n): WebGLShader {\n const shader = gl.createShader(type);\n if (!shader) throw new Error('Failed to create shader');\n\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const error = gl.getShaderInfoLog(shader);\n gl.deleteShader(shader);\n throw new Error(`Shader compilation error: ${error}`);\n }\n\n return shader;\n}\n\nfunction createProgram(\n gl: WebGL2RenderingContext | WebGLRenderingContext,\n vertSource: string,\n fragSource: string,\n attributeNames: string[],\n uniformNames: string[]\n): ShaderProgram3D {\n const vertShader = createShader(gl, vertSource, gl.VERTEX_SHADER);\n const fragShader = createShader(gl, fragSource, gl.FRAGMENT_SHADER);\n\n const program = gl.createProgram();\n if (!program) throw new Error('Failed to create program');\n\n gl.attachShader(program, vertShader);\n gl.attachShader(program, fragShader);\n gl.linkProgram(program);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const error = gl.getProgramInfoLog(program);\n gl.deleteProgram(program);\n throw new Error(`Program link error: ${error}`);\n }\n\n gl.deleteShader(vertShader);\n gl.deleteShader(fragShader);\n\n const attributes: Record<string, number> = {};\n for (const name of attributeNames) {\n attributes[name] = gl.getAttribLocation(program, name);\n }\n\n const uniforms: Record<string, WebGLUniformLocation | null> = {};\n for (const name of uniformNames) {\n uniforms[name] = gl.getUniformLocation(program, name);\n }\n\n return { program, attributes, uniforms };\n}\n\nexport function createProgramBundle3D(\n gl: WebGL2RenderingContext,\n useWebGL1Fallback = false\n): ProgramBundle3D {\n const bubbleAttribs = ['a_position', 'a_instancePos', 'a_scale', 'a_color'];\n const bubbleUniforms = ['u_viewProjection', 'u_opacity', 'u_lightDir', 'u_ambient'];\n\n const vertSource = useWebGL1Fallback ? BUBBLE_VERT_WEBGL1 : BUBBLE_VERT;\n const fragSource = useWebGL1Fallback ? BUBBLE_FRAG_WEBGL1 : BUBBLE_FRAG;\n\n const bubbleProgram = createProgram(\n gl,\n vertSource,\n fragSource,\n bubbleAttribs,\n bubbleUniforms\n );\n\n const bubbleFlatProgram = createProgram(\n gl,\n vertSource,\n useWebGL1Fallback ? BUBBLE_FRAG_WEBGL1 : BUBBLE_FLAT_FRAG,\n bubbleAttribs,\n ['u_viewProjection', 'u_opacity']\n );\n\n const axisProgram = createProgram(\n gl,\n AXIS_VERT,\n AXIS_FRAG,\n ['a_position', 'a_color'],\n ['u_viewProjection']\n );\n\n const surfaceProgram = createProgram(\n gl,\n SURFACE_VERT,\n SURFACE_FRAG,\n ['a_position', 'a_normal', 'a_color'],\n ['u_viewProjection', 'u_opacity', 'u_lightDir', 'u_ambient']\n );\n\n const linePointProgram = createProgram(\n gl,\n LINE_POINT_VERT,\n LINE_POINT_FRAG,\n ['a_position', 'a_color'],\n ['u_viewProjection', 'u_pointSize', 'u_opacity']\n );\n\n const waterfallProgram = createProgram(\n gl,\n WATERFALL_VERT,\n WATERFALL_FRAG,\n ['a_position', 'a_color', 'a_normal'],\n ['u_viewProjection', 'u_opacity', 'u_fadeStart', 'u_fadeEnd', 'u_lightDir', 'u_ambient']\n );\n\n const vectorFieldProgram = createProgram(\n gl,\n VECTOR_FIELD_VERT,\n VECTOR_FIELD_FRAG,\n ['a_position', 'a_normal', 'a_instancePos', 'a_direction', 'a_color'],\n ['u_viewProjection', 'u_opacity', 'u_scaleMultiplier', 'u_lightDir', 'u_ambient']\n );\n\n const pointCloudProgram = createProgram(\n gl,\n POINT_CLOUD_VERT,\n POINT_CLOUD_FRAG,\n ['a_position', 'a_color', 'a_size'],\n ['u_viewProjection', 'u_opacity', 'u_globalSize', 'u_circular']\n );\n\n const voxelProgram = createProgram(\n gl,\n VOXEL_VERT,\n VOXEL_FRAG,\n ['a_position', 'a_instancePos', 'a_value'],\n ['u_viewProjection', 'u_opacity', 'u_voxelSize', 'u_threshold', 'u_lightDir', 'u_ambient']\n );\n\n const ribbonProgram = createProgram(\n gl,\n RIBBON_VERT,\n RIBBON_FRAG,\n ['a_position', 'a_normal', 'a_color'],\n ['u_viewProjection', 'u_opacity', 'u_lightDir', 'u_ambient']\n );\n\n const surfaceBarProgram = createProgram(\n gl,\n SURFACE_BAR_VERT,\n SURFACE_BAR_FRAG,\n ['a_position', 'a_instancePos', 'a_height', 'a_color'],\n ['u_viewProjection', 'u_opacity', 'u_barWidth', 'u_barDepth', 'u_lightDir', 'u_ambient']\n );\n\n return {\n bubbleProgram,\n bubbleFlatProgram,\n axisProgram,\n surfaceProgram,\n linePointProgram,\n waterfallProgram,\n vectorFieldProgram,\n pointCloudProgram,\n voxelProgram,\n ribbonProgram,\n surfaceBarProgram,\n };\n}\n\nexport function deleteProgram(\n gl: WebGL2RenderingContext | WebGLRenderingContext,\n program: ShaderProgram3D\n): void {\n gl.deleteProgram(program.program);\n}\n\nexport function deleteProgramBundle(\n gl: WebGL2RenderingContext | WebGLRenderingContext,\n bundle: ProgramBundle3D\n): void {\n deleteProgram(gl, bundle.bubbleProgram);\n deleteProgram(gl, bundle.bubbleFlatProgram);\n deleteProgram(gl, bundle.axisProgram);\n deleteProgram(gl, bundle.surfaceProgram);\n deleteProgram(gl, bundle.linePointProgram);\n deleteProgram(gl, bundle.waterfallProgram);\n deleteProgram(gl, bundle.vectorFieldProgram);\n deleteProgram(gl, bundle.pointCloudProgram);\n deleteProgram(gl, bundle.voxelProgram);\n deleteProgram(gl, bundle.ribbonProgram);\n deleteProgram(gl, bundle.surfaceBarProgram);\n}\n","/**\n * 3D Axes Renderer\n * Renders X, Y, Z axes with:\n * - Grid lines on 3 wall planes (XZ floor, XY back, YZ side)\n * - Axis lines at the edges of the bounding box\n * - Tick marks with numeric labels\n * - Support for billboard text labels (rendered via 2D canvas overlay)\n */\n\nimport type { Bounds3D, Axis3DConfig } from './types';\n\n/** Axis label info for text overlay rendering */\nexport interface AxisLabel3D {\n text: string;\n worldPosition: [number, number, number];\n axis: 'x' | 'y' | 'z' | 'title';\n color: [number, number, number];\n}\n\n/** Full axis configuration with defaults applied */\nexport interface Axes3DOptions {\n /** X-axis configuration */\n xAxis?: Axis3DConfig & { label?: string; tickFormat?: (v: number) => string };\n /** Y-axis configuration */\n yAxis?: Axis3DConfig & { label?: string; tickFormat?: (v: number) => string };\n /** Z-axis configuration */\n zAxis?: Axis3DConfig & { label?: string; tickFormat?: (v: number) => string };\n /** Show axis lines */\n showAxes?: boolean;\n /** Show wall grids */\n showWallGrids?: boolean;\n /** Show floor grid (XZ plane) */\n showFloorGrid?: boolean;\n /** Grid line color */\n gridColor?: [number, number, number];\n /** Grid line opacity */\n gridOpacity?: number;\n /** Wall grid opacity (slightly more transparent) */\n wallGridOpacity?: number;\n /** Number of ticks per axis */\n tickCount?: number;\n /** Axis line width */\n lineWidth?: number;\n /** Box wireframe color */\n boxColor?: [number, number, number];\n /** Box wireframe opacity */\n boxOpacity?: number;\n}\n\n/** Default axis colors */\nconst AXIS_COLORS = {\n x: [0.9, 0.3, 0.3] as [number, number, number], // Red\n y: [0.3, 0.9, 0.3] as [number, number, number], // Green\n z: [0.3, 0.3, 0.9] as [number, number, number], // Blue\n grid: [0.4, 0.45, 0.5] as [number, number, number], // Subtle gray-blue\n box: [0.3, 0.35, 0.4] as [number, number, number], // Dark box edges\n};\n\nexport class Axes3D {\n private gl: WebGL2RenderingContext;\n \n // Line buffers\n private axisVAO: WebGLVertexArrayObject | null = null;\n private axisPositionBuffer: WebGLBuffer | null = null;\n private axisColorBuffer: WebGLBuffer | null = null;\n \n private gridVAO: WebGLVertexArrayObject | null = null;\n private gridPositionBuffer: WebGLBuffer | null = null;\n private gridColorBuffer: WebGLBuffer | null = null;\n \n private boxVAO: WebGLVertexArrayObject | null = null;\n private boxPositionBuffer: WebGLBuffer | null = null;\n private boxColorBuffer: WebGLBuffer | null = null;\n \n // Line shader program\n private lineProgram: WebGLProgram | null = null;\n private lineUniforms: { [key: string]: WebGLUniformLocation } = {};\n \n // Data\n private axisVertexCount = 0;\n private gridVertexCount = 0;\n private boxVertexCount = 0;\n private bounds: Bounds3D = { minX: -1, maxX: 1, minY: -1, maxY: 1, minZ: -1, maxZ: 1 };\n \n // Labels for text overlay\n private labels: AxisLabel3D[] = [];\n \n // Options\n private options: Required<Axes3DOptions>;\n \n constructor(gl: WebGL2RenderingContext, options?: Axes3DOptions) {\n this.gl = gl;\n \n // Apply defaults\n this.options = {\n xAxis: { visible: true, label: 'X', color: AXIS_COLORS.x, ...options?.xAxis },\n yAxis: { visible: true, label: 'Y', color: AXIS_COLORS.y, ...options?.yAxis },\n zAxis: { visible: true, label: 'Z', color: AXIS_COLORS.z, ...options?.zAxis },\n showAxes: options?.showAxes ?? true,\n showWallGrids: options?.showWallGrids ?? true,\n showFloorGrid: options?.showFloorGrid ?? true,\n gridColor: options?.gridColor ?? AXIS_COLORS.grid,\n gridOpacity: options?.gridOpacity ?? 0.4,\n wallGridOpacity: options?.wallGridOpacity ?? 0.2,\n tickCount: options?.tickCount ?? 5,\n lineWidth: options?.lineWidth ?? 1,\n boxColor: options?.boxColor ?? AXIS_COLORS.box,\n boxOpacity: options?.boxOpacity ?? 0.5,\n };\n \n this.initLineShader();\n this.initBuffers();\n }\n \n private initLineShader(): void {\n const { gl } = this;\n \n const vertexShaderSource = `#version 300 es\n in vec3 a_position;\n in vec3 a_color;\n \n uniform mat4 u_viewProjection;\n \n out vec3 v_color;\n \n void main() {\n gl_Position = u_viewProjection * vec4(a_position, 1.0);\n v_color = a_color;\n }\n `;\n \n const fragmentShaderSource = `#version 300 es\n precision highp float;\n \n in vec3 v_color;\n uniform float u_opacity;\n \n out vec4 fragColor;\n \n void main() {\n fragColor = vec4(v_color, u_opacity);\n }\n `;\n \n // Compile vertex shader\n const vertexShader = gl.createShader(gl.VERTEX_SHADER)!;\n gl.shaderSource(vertexShader, vertexShaderSource);\n gl.compileShader(vertexShader);\n \n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n console.error('Axes vertex shader error:', gl.getShaderInfoLog(vertexShader));\n return;\n }\n \n // Compile fragment shader\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER)!;\n gl.shaderSource(fragmentShader, fragmentShaderSource);\n gl.compileShader(fragmentShader);\n \n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n console.error('Axes fragment shader error:', gl.getShaderInfoLog(fragmentShader));\n return;\n }\n \n // Link program\n this.lineProgram = gl.createProgram()!;\n gl.attachShader(this.lineProgram, vertexShader);\n gl.attachShader(this.lineProgram, fragmentShader);\n gl.linkProgram(this.lineProgram);\n \n if (!gl.getProgramParameter(this.lineProgram, gl.LINK_STATUS)) {\n console.error('Axes program link error:', gl.getProgramInfoLog(this.lineProgram));\n return;\n }\n \n // Get uniform locations\n this.lineUniforms = {\n u_viewProjection: gl.getUniformLocation(this.lineProgram, 'u_viewProjection')!,\n u_opacity: gl.getUniformLocation(this.lineProgram, 'u_opacity')!,\n };\n \n // Cleanup\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n // Axis VAO\n this.axisVAO = gl.createVertexArray();\n this.axisPositionBuffer = gl.createBuffer();\n this.axisColorBuffer = gl.createBuffer();\n \n // Grid VAO\n this.gridVAO = gl.createVertexArray();\n this.gridPositionBuffer = gl.createBuffer();\n this.gridColorBuffer = gl.createBuffer();\n \n // Box VAO\n this.boxVAO = gl.createVertexArray();\n this.boxPositionBuffer = gl.createBuffer();\n this.boxColorBuffer = gl.createBuffer();\n }\n \n /**\n * Update axes geometry based on data bounds\n */\n updateBounds(bounds: Bounds3D): void {\n this.bounds = { ...bounds };\n this.buildBoxGeometry();\n this.buildGridGeometry();\n this.buildAxisGeometry();\n this.buildLabels();\n }\n \n private buildBoxGeometry(): void {\n const { gl, bounds, options } = this;\n \n const { minX, maxX, minY, maxY, minZ, maxZ } = bounds;\n \n const positions: number[] = [];\n const colors: number[] = [];\n const boxColor = options.boxColor;\n \n // Helper to add a line segment\n const addLine = (x1: number, y1: number, z1: number, x2: number, y2: number, z2: number) => {\n positions.push(x1, y1, z1, x2, y2, z2);\n colors.push(...boxColor, ...boxColor);\n };\n \n // Bottom face edges (Y = minY)\n addLine(minX, minY, minZ, maxX, minY, minZ);\n addLine(maxX, minY, minZ, maxX, minY, maxZ);\n addLine(maxX, minY, maxZ, minX, minY, maxZ);\n addLine(minX, minY, maxZ, minX, minY, minZ);\n \n // Top face edges (Y = maxY)\n addLine(minX, maxY, minZ, maxX, maxY, minZ);\n addLine(maxX, maxY, minZ, maxX, maxY, maxZ);\n addLine(maxX, maxY, maxZ, minX, maxY, maxZ);\n addLine(minX, maxY, maxZ, minX, maxY, minZ);\n \n // Vertical edges\n addLine(minX, minY, minZ, minX, maxY, minZ);\n addLine(maxX, minY, minZ, maxX, maxY, minZ);\n addLine(maxX, minY, maxZ, maxX, maxY, maxZ);\n addLine(minX, minY, maxZ, minX, maxY, maxZ);\n \n this.boxVertexCount = positions.length / 3;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.boxPositionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.boxColorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);\n }\n \n private buildGridGeometry(): void {\n const { gl, bounds, options } = this;\n \n const { minX, maxX, minY, maxY, minZ, maxZ } = bounds;\n const gridColor = options.gridColor;\n const tickCount = options.tickCount;\n \n const positions: number[] = [];\n const colors: number[] = [];\n \n // Helper to add grid line\n const addLine = (x1: number, y1: number, z1: number, x2: number, y2: number, z2: number) => {\n positions.push(x1, y1, z1, x2, y2, z2);\n colors.push(...gridColor, ...gridColor);\n };\n \n // Floor grid (XZ plane at Y = minY)\n if (options.showFloorGrid) {\n // Lines parallel to Z\n for (let i = 0; i <= tickCount; i++) {\n const x = minX + (maxX - minX) * (i / tickCount);\n addLine(x, minY, minZ, x, minY, maxZ);\n }\n // Lines parallel to X\n for (let i = 0; i <= tickCount; i++) {\n const z = minZ + (maxZ - minZ) * (i / tickCount);\n addLine(minX, minY, z, maxX, minY, z);\n }\n }\n \n // Back wall grid (XY plane at Z = minZ)\n if (options.showWallGrids) {\n // Lines parallel to Y\n for (let i = 0; i <= tickCount; i++) {\n const x = minX + (maxX - minX) * (i / tickCount);\n addLine(x, minY, minZ, x, maxY, minZ);\n }\n // Lines parallel to X\n for (let i = 0; i <= tickCount; i++) {\n const y = minY + (maxY - minY) * (i / tickCount);\n addLine(minX, y, minZ, maxX, y, minZ);\n }\n }\n \n // Left wall grid (YZ plane at X = minX)\n if (options.showWallGrids) {\n // Lines parallel to Z\n for (let i = 0; i <= tickCount; i++) {\n const y = minY + (maxY - minY) * (i / tickCount);\n addLine(minX, y, minZ, minX, y, maxZ);\n }\n // Lines parallel to Y\n for (let i = 0; i <= tickCount; i++) {\n const z = minZ + (maxZ - minZ) * (i / tickCount);\n addLine(minX, minY, z, minX, maxY, z);\n }\n }\n \n this.gridVertexCount = positions.length / 3;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.gridPositionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.gridColorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);\n }\n \n private buildAxisGeometry(): void {\n const { gl, bounds, options } = this;\n \n const { minX, maxX, minY, maxY, minZ, maxZ } = bounds;\n const tickLen = (maxX - minX) * 0.02;\n \n const positions: number[] = [];\n const colors: number[] = [];\n \n const addLine = (x1: number, y1: number, z1: number, x2: number, y2: number, z2: number, color: [number, number, number]) => {\n positions.push(x1, y1, z1, x2, y2, z2);\n colors.push(...color, ...color);\n };\n \n // X-axis at bottom-front edge\n if (options.xAxis.visible !== false) {\n const xColor = options.xAxis.color || AXIS_COLORS.x;\n // Main axis line\n addLine(minX, minY, maxZ, maxX, minY, maxZ, xColor);\n \n // Tick marks\n for (let i = 0; i <= options.tickCount; i++) {\n const x = minX + (maxX - minX) * (i / options.tickCount);\n addLine(x, minY, maxZ, x, minY - tickLen, maxZ, xColor);\n addLine(x, minY, maxZ, x, minY, maxZ + tickLen, xColor);\n }\n }\n \n // Y-axis at left-front edge\n if (options.yAxis.visible !== false) {\n const yColor = options.yAxis.color || AXIS_COLORS.y;\n // Main axis line\n addLine(minX, minY, maxZ, minX, maxY, maxZ, yColor);\n \n // Tick marks\n for (let i = 0; i <= options.tickCount; i++) {\n const y = minY + (maxY - minY) * (i / options.tickCount);\n addLine(minX, y, maxZ, minX - tickLen, y, maxZ, yColor);\n addLine(minX, y, maxZ, minX, y, maxZ + tickLen, yColor);\n }\n }\n \n // Z-axis at bottom-left edge\n if (options.zAxis.visible !== false) {\n const zColor = options.zAxis.color || AXIS_COLORS.z;\n // Main axis line\n addLine(minX, minY, minZ, minX, minY, maxZ, zColor);\n \n // Tick marks\n for (let i = 0; i <= options.tickCount; i++) {\n const z = minZ + (maxZ - minZ) * (i / options.tickCount);\n addLine(minX, minY, z, minX - tickLen, minY, z, zColor);\n addLine(minX, minY, z, minX, minY - tickLen, z, zColor);\n }\n }\n \n this.axisVertexCount = positions.length / 3;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.axisPositionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.axisColorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);\n }\n \n private buildLabels(): void {\n const { bounds, options } = this;\n const { minX, maxX, minY, maxY, minZ, maxZ } = bounds;\n \n this.labels = [];\n \n const formatNumber = (v: number): string => {\n if (Math.abs(v) < 0.001 && v !== 0) return v.toExponential(1);\n if (Math.abs(v) >= 10000) return v.toExponential(1);\n return v.toFixed(1);\n };\n \n const offset = (maxX - minX) * 0.08;\n \n // X-axis labels (at bottom-front)\n if (options.xAxis.visible !== false) {\n const xColor = options.xAxis.color || AXIS_COLORS.x;\n const formatter = options.xAxis.tickFormat || formatNumber;\n \n for (let i = 0; i <= options.tickCount; i++) {\n const t = i / options.tickCount;\n const x = minX + (maxX - minX) * t;\n const value = minX + (maxX - minX) * t;\n this.labels.push({\n text: formatter(value),\n worldPosition: [x, minY - offset, maxZ + offset],\n axis: 'x',\n color: xColor,\n });\n }\n \n // Axis title\n if (options.xAxis.label) {\n this.labels.push({\n text: options.xAxis.label,\n worldPosition: [(minX + maxX) / 2, minY - offset * 2.5, maxZ + offset],\n axis: 'title',\n color: xColor,\n });\n }\n }\n \n // Y-axis labels (at left-front)\n if (options.yAxis.visible !== false) {\n const yColor = options.yAxis.color || AXIS_COLORS.y;\n const formatter = options.yAxis.tickFormat || formatNumber;\n \n for (let i = 0; i <= options.tickCount; i++) {\n const t = i / options.tickCount;\n const y = minY + (maxY - minY) * t;\n const value = minY + (maxY - minY) * t;\n this.labels.push({\n text: formatter(value),\n worldPosition: [minX - offset, y, maxZ + offset],\n axis: 'y',\n color: yColor,\n });\n }\n \n // Axis title\n if (options.yAxis.label) {\n this.labels.push({\n text: options.yAxis.label,\n worldPosition: [minX - offset * 2.5, (minY + maxY) / 2, maxZ + offset],\n axis: 'title',\n color: yColor,\n });\n }\n }\n \n // Z-axis labels (at bottom-left)\n if (options.zAxis.visible !== false) {\n const zColor = options.zAxis.color || AXIS_COLORS.z;\n const formatter = options.zAxis.tickFormat || formatNumber;\n \n for (let i = 0; i <= options.tickCount; i++) {\n const t = i / options.tickCount;\n const z = minZ + (maxZ - minZ) * t;\n const value = minZ + (maxZ - minZ) * t;\n this.labels.push({\n text: formatter(value),\n worldPosition: [minX - offset, minY - offset, z],\n axis: 'z',\n color: zColor,\n });\n }\n \n // Axis title\n if (options.zAxis.label) {\n this.labels.push({\n text: options.zAxis.label,\n worldPosition: [minX - offset * 2.5, minY - offset, (minZ + maxZ) / 2],\n axis: 'title',\n color: zColor,\n });\n }\n }\n }\n \n /**\n * Render axes and grid\n */\n render(viewProjectionMatrix: Float32Array): void {\n const { gl, options } = this;\n \n if (!this.lineProgram) return;\n \n gl.useProgram(this.lineProgram);\n gl.uniformMatrix4fv(this.lineUniforms.u_viewProjection, false, viewProjectionMatrix);\n \n // Render box wireframe\n if (this.boxVertexCount > 0) {\n gl.uniform1f(this.lineUniforms.u_opacity, options.boxOpacity);\n this.renderLines(this.boxVAO!, this.boxPositionBuffer!, this.boxColorBuffer!, this.boxVertexCount);\n }\n \n // Render grids\n if (this.gridVertexCount > 0) {\n gl.uniform1f(this.lineUniforms.u_opacity, options.gridOpacity);\n this.renderLines(this.gridVAO!, this.gridPositionBuffer!, this.gridColorBuffer!, this.gridVertexCount);\n }\n \n // Render axes\n if (options.showAxes && this.axisVertexCount > 0) {\n gl.uniform1f(this.lineUniforms.u_opacity, 1.0);\n this.renderLines(this.axisVAO!, this.axisPositionBuffer!, this.axisColorBuffer!, this.axisVertexCount);\n }\n \n // Reset GL state for next renderer\n gl.useProgram(null);\n }\n \n private renderLines(vao: WebGLVertexArrayObject, posBuffer: WebGLBuffer, colorBuffer: WebGLBuffer, count: number): void {\n const { gl, lineProgram } = this;\n \n if (!lineProgram) return;\n \n gl.bindVertexArray(vao);\n \n // Position attribute\n const posLoc = gl.getAttribLocation(lineProgram, 'a_position');\n gl.bindBuffer(gl.ARRAY_BUFFER, posBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(posLoc, 0);\n \n // Color attribute\n const colorLoc = gl.getAttribLocation(lineProgram, 'a_color');\n gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(colorLoc, 0);\n \n // Draw lines\n gl.drawArrays(gl.LINES, 0, count);\n \n // Cleanup\n gl.disableVertexAttribArray(posLoc);\n gl.disableVertexAttribArray(colorLoc);\n gl.bindVertexArray(null);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);\n }\n \n /**\n * Get labels for 2D text overlay rendering.\n * Returns world positions that need to be projected to screen coordinates.\n */\n getLabels(): AxisLabel3D[] {\n return this.labels;\n }\n \n /**\n * Project a 3D world position to 2D screen coordinates.\n */\n projectToScreen(\n worldPos: [number, number, number],\n viewProjectionMatrix: Float32Array,\n canvasWidth: number,\n canvasHeight: number\n ): { x: number; y: number; visible: boolean } {\n // Transform to clip space\n const [wx, wy, wz] = worldPos;\n const m = viewProjectionMatrix;\n \n const clipX = m[0] * wx + m[4] * wy + m[8] * wz + m[12];\n const clipY = m[1] * wx + m[5] * wy + m[9] * wz + m[13];\n const clipZ = m[2] * wx + m[6] * wy + m[10] * wz + m[14];\n const clipW = m[3] * wx + m[7] * wy + m[11] * wz + m[15];\n \n // Perspective divide\n if (clipW <= 0) return { x: 0, y: 0, visible: false };\n \n const ndcX = clipX / clipW;\n const ndcY = clipY / clipW;\n const ndcZ = clipZ / clipW;\n \n // Check if visible (in front of camera and within view)\n const visible = ndcZ >= -1 && ndcZ <= 1 && \n ndcX >= -1.5 && ndcX <= 1.5 && \n ndcY >= -1.5 && ndcY <= 1.5;\n \n // Convert to screen coordinates\n const screenX = (ndcX + 1) * 0.5 * canvasWidth;\n const screenY = (1 - ndcY) * 0.5 * canvasHeight; // Flip Y\n \n return { x: screenX, y: screenY, visible };\n }\n \n /**\n * Update options\n */\n setOptions(options: Partial<Axes3DOptions>): void {\n Object.assign(this.options, options);\n this.buildBoxGeometry();\n this.buildGridGeometry();\n this.buildAxisGeometry();\n this.buildLabels();\n }\n \n /**\n * Cleanup resources\n */\n destroy(): void {\n const { gl } = this;\n \n if (this.axisVAO) gl.deleteVertexArray(this.axisVAO);\n if (this.axisPositionBuffer) gl.deleteBuffer(this.axisPositionBuffer);\n if (this.axisColorBuffer) gl.deleteBuffer(this.axisColorBuffer);\n \n if (this.gridVAO) gl.deleteVertexArray(this.gridVAO);\n if (this.gridPositionBuffer) gl.deleteBuffer(this.gridPositionBuffer);\n if (this.gridColorBuffer) gl.deleteBuffer(this.gridColorBuffer);\n \n if (this.boxVAO) gl.deleteVertexArray(this.boxVAO);\n if (this.boxPositionBuffer) gl.deleteBuffer(this.boxPositionBuffer);\n if (this.boxColorBuffer) gl.deleteBuffer(this.boxColorBuffer);\n \n if (this.lineProgram) gl.deleteProgram(this.lineProgram);\n }\n}\n","/**\n * 3D Tooltip for displaying information on hover.\n * Creates a DOM element that follows the mouse and shows data.\n */\n\nexport interface Tooltip3DOptions {\n /** CSS class for the tooltip container */\n className?: string;\n /** Offset from cursor in pixels */\n offsetX?: number;\n offsetY?: number;\n /** Custom formatter function */\n formatter?: (data: Tooltip3DData) => string;\n /** Show position coordinates */\n showPosition?: boolean;\n /** Show value/scale */\n showScale?: boolean;\n /** Show index */\n showIndex?: boolean;\n /** Decimal places for numbers */\n decimals?: number;\n}\n\nexport interface Tooltip3DData {\n index: number;\n position: [number, number, number];\n color?: [number, number, number];\n scale?: number;\n customData?: Record<string, any>;\n}\n\nexport class Tooltip3D {\n private container: HTMLElement;\n private element: HTMLElement;\n private options: Required<Omit<Tooltip3DOptions, 'formatter'>> & { formatter?: (data: Tooltip3DData) => string };\n private visible = false;\n \n constructor(container: HTMLElement, options: Tooltip3DOptions = {}) {\n this.container = container;\n this.options = {\n className: options.className ?? 'tooltip-3d',\n offsetX: options.offsetX ?? 15,\n offsetY: options.offsetY ?? 15,\n showPosition: options.showPosition ?? true,\n showScale: options.showScale ?? false,\n showIndex: options.showIndex ?? true,\n decimals: options.decimals ?? 2,\n formatter: options.formatter,\n };\n \n // Create tooltip element\n this.element = document.createElement('div');\n this.element.className = this.options.className;\n this.element.style.cssText = `\n position: absolute;\n pointer-events: none;\n z-index: 1000;\n padding: 8px 12px;\n background: rgba(0, 0, 0, 0.85);\n color: white;\n border-radius: 6px;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 12px;\n line-height: 1.4;\n white-space: nowrap;\n opacity: 0;\n transition: opacity 0.15s ease;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n border: 1px solid rgba(255, 255, 255, 0.1);\n `;\n \n document.body.appendChild(this.element);\n }\n \n /**\n * Show tooltip with data at screen position.\n */\n show(data: Tooltip3DData, screenX: number, screenY: number): void {\n const content = this.options.formatter\n ? this.options.formatter(data)\n : this.defaultFormat(data);\n \n this.element.innerHTML = content;\n this.visible = true;\n \n // Position relative to container\n const containerRect = this.container.getBoundingClientRect();\n const x = containerRect.left + screenX + this.options.offsetX;\n const y = containerRect.top + screenY + this.options.offsetY;\n \n // Keep within viewport\n const elementRect = this.element.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n \n let finalX = x;\n let finalY = y;\n \n if (x + elementRect.width > viewportWidth - 10) {\n finalX = x - elementRect.width - this.options.offsetX * 2;\n }\n if (y + elementRect.height > viewportHeight - 10) {\n finalY = y - elementRect.height - this.options.offsetY * 2;\n }\n \n this.element.style.left = `${finalX}px`;\n this.element.style.top = `${finalY}px`;\n this.element.style.opacity = '1';\n }\n \n /**\n * Hide the tooltip.\n */\n hide(): void {\n this.visible = false;\n this.element.style.opacity = '0';\n }\n \n /**\n * Check if tooltip is visible.\n */\n isVisible(): boolean {\n return this.visible;\n }\n \n /**\n * Default formatting for tooltip content.\n */\n private defaultFormat(data: Tooltip3DData): string {\n const lines: string[] = [];\n const d = this.options.decimals;\n \n if (this.options.showIndex) {\n lines.push(`<strong>Point ${data.index}</strong>`);\n }\n \n if (this.options.showPosition) {\n lines.push(`X: ${data.position[0].toFixed(d)}`);\n lines.push(`Y: ${data.position[1].toFixed(d)}`);\n lines.push(`Z: ${data.position[2].toFixed(d)}`);\n }\n \n if (this.options.showScale && data.scale !== undefined) {\n lines.push(`Size: ${data.scale.toFixed(d)}`);\n }\n \n // Color indicator\n if (data.color) {\n const r = Math.round(data.color[0] * 255);\n const g = Math.round(data.color[1] * 255);\n const b = Math.round(data.color[2] * 255);\n lines.push(`<span style=\"display:inline-block;width:12px;height:12px;background:rgb(${r},${g},${b});border-radius:2px;vertical-align:middle;margin-right:4px\"></span>RGB(${r}, ${g}, ${b})`);\n }\n \n // Custom data\n if (data.customData) {\n for (const [key, value] of Object.entries(data.customData)) {\n lines.push(`${key}: ${value}`);\n }\n }\n \n return lines.join('<br>');\n }\n \n /**\n * Update tooltip position (for mouse move without data change).\n */\n updatePosition(screenX: number, screenY: number): void {\n if (!this.visible) return;\n \n const containerRect = this.container.getBoundingClientRect();\n const x = containerRect.left + screenX + this.options.offsetX;\n const y = containerRect.top + screenY + this.options.offsetY;\n \n this.element.style.left = `${x}px`;\n this.element.style.top = `${y}px`;\n }\n \n /**\n * Destroy the tooltip.\n */\n destroy(): void {\n this.element.remove();\n }\n}\n\n/**\n * Create a hover handler for bubble charts.\n * Returns a function to attach to mouse move events.\n */\nexport function createHoverHandler(\n renderer: any, // Bubble3DRenderer\n tooltip: Tooltip3D,\n options: {\n debounceMs?: number;\n onHover?: (hit: { index: number; data: any } | null) => void;\n } = {}\n): (event: MouseEvent) => void {\n let lastHitIndex = -1;\n let debounceTimer: number | null = null;\n const debounceMs = options.debounceMs ?? 16; // ~60fps\n \n return (event: MouseEvent) => {\n if (debounceTimer !== null) {\n clearTimeout(debounceTimer);\n }\n \n debounceTimer = window.setTimeout(() => {\n const rect = (event.target as HTMLElement).getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n \n const hit = renderer.pickAtScreen(x, y);\n \n if (hit) {\n if (hit.index !== lastHitIndex) {\n lastHitIndex = hit.index;\n \n const bubbleData = renderer.getBubbleData(hit.index);\n if (bubbleData) {\n tooltip.show({\n index: hit.index,\n position: bubbleData.position,\n color: bubbleData.color,\n scale: bubbleData.scale,\n }, x, y);\n \n options.onHover?.({\n index: hit.index,\n data: bubbleData,\n });\n }\n } else {\n tooltip.updatePosition(x, y);\n }\n } else {\n if (lastHitIndex !== -1) {\n tooltip.hide();\n lastHitIndex = -1;\n options.onHover?.(null);\n }\n }\n \n debounceTimer = null;\n }, debounceMs);\n };\n}\n","/**\n * Minimal Vec3 utilities for 3D math.\n * No external dependencies.\n */\n\nexport type Vec3 = [number, number, number];\n\n/** Create a new Vec3 */\nexport function create(x = 0, y = 0, z = 0): Vec3 {\n return [x, y, z];\n}\n\n/** Clone a Vec3 */\nexport function clone(a: Vec3): Vec3 {\n return [a[0], a[1], a[2]];\n}\n\n/** Copy Vec3 a to out */\nexport function copy(out: Vec3, a: Vec3): Vec3 {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n\n/** Set Vec3 values */\nexport function set(out: Vec3, x: number, y: number, z: number): Vec3 {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n\n/** Add two Vec3: out = a + b */\nexport function add(out: Vec3, a: Vec3, b: Vec3): Vec3 {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n\n/** Subtract two Vec3: out = a - b */\nexport function subtract(out: Vec3, a: Vec3, b: Vec3): Vec3 {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n\n/** Scale Vec3: out = a * scalar */\nexport function scale(out: Vec3, a: Vec3, s: number): Vec3 {\n out[0] = a[0] * s;\n out[1] = a[1] * s;\n out[2] = a[2] * s;\n return out;\n}\n\n/** Normalize Vec3 */\nexport function normalize(out: Vec3, a: Vec3): Vec3 {\n const x = a[0], y = a[1], z = a[2];\n let len = x * x + y * y + z * z;\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n }\n out[0] = x * len;\n out[1] = y * len;\n out[2] = z * len;\n return out;\n}\n\n/** Dot product of two Vec3 */\nexport function dot(a: Vec3, b: Vec3): number {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\n/** Cross product: out = a × b */\nexport function cross(out: Vec3, a: Vec3, b: Vec3): Vec3 {\n const ax = a[0], ay = a[1], az = a[2];\n const bx = b[0], by = b[1], bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n\n/** Length of Vec3 */\nexport function length(a: Vec3): number {\n return Math.sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2]);\n}\n\n/** Squared length of Vec3 */\nexport function squaredLength(a: Vec3): number {\n return a[0] * a[0] + a[1] * a[1] + a[2] * a[2];\n}\n\n/** Distance between two Vec3 */\nexport function distance(a: Vec3, b: Vec3): number {\n const dx = b[0] - a[0];\n const dy = b[1] - a[1];\n const dz = b[2] - a[2];\n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n}\n\n/** Linear interpolation: out = a + t * (b - a) */\nexport function lerp(out: Vec3, a: Vec3, b: Vec3, t: number): Vec3 {\n out[0] = a[0] + t * (b[0] - a[0]);\n out[1] = a[1] + t * (b[1] - a[1]);\n out[2] = a[2] + t * (b[2] - a[2]);\n return out;\n}\n\n/** Negate Vec3: out = -a */\nexport function negate(out: Vec3, a: Vec3): Vec3 {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n\n/** Transform Vec3 by Mat4 (assumes w=1) */\nexport function transformMat4(out: Vec3, a: Vec3, m: Float32Array): Vec3 {\n const x = a[0], y = a[1], z = a[2];\n const w = m[3] * x + m[7] * y + m[11] * z + m[15] || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n","/**\n * 3D Raycasting utilities for picking/selection.\n * Implements ray-sphere intersection for bubble selection.\n */\n\nimport { Mat4 } from './math';\n\nexport interface Ray3D {\n origin: [number, number, number];\n direction: [number, number, number];\n}\n\nexport interface HitResult {\n index: number;\n distance: number;\n point: [number, number, number];\n}\n\n/**\n * Creates a ray from screen coordinates through the scene.\n * @param screenX Screen X coordinate (pixels from left)\n * @param screenY Screen Y coordinate (pixels from top)\n * @param canvasWidth Canvas width in pixels\n * @param canvasHeight Canvas height in pixels\n * @param viewProjectionMatrix Combined view-projection matrix\n * @returns Ray in world space\n */\nexport function createRayFromScreen(\n screenX: number,\n screenY: number,\n canvasWidth: number,\n canvasHeight: number,\n viewProjectionMatrix: Float32Array\n): Ray3D {\n // Convert screen coordinates to NDC (-1 to 1)\n const ndcX = (screenX / canvasWidth) * 2 - 1;\n const ndcY = -((screenY / canvasHeight) * 2 - 1); // Flip Y\n \n // Invert the view-projection matrix\n const invViewProj = Mat4.create();\n Mat4.invert(invViewProj, viewProjectionMatrix);\n \n // Create near and far points in NDC\n const nearPoint = [ndcX, ndcY, -1, 1] as const;\n const farPoint = [ndcX, ndcY, 1, 1] as const;\n \n // Transform to world space\n const nearWorld = transformPoint4(invViewProj, nearPoint);\n const farWorld = transformPoint4(invViewProj, farPoint);\n \n // Perspective divide\n const origin: [number, number, number] = [\n nearWorld[0] / nearWorld[3],\n nearWorld[1] / nearWorld[3],\n nearWorld[2] / nearWorld[3],\n ];\n \n const far: [number, number, number] = [\n farWorld[0] / farWorld[3],\n farWorld[1] / farWorld[3],\n farWorld[2] / farWorld[3],\n ];\n \n // Direction is far - near, normalized\n const direction: [number, number, number] = [\n far[0] - origin[0],\n far[1] - origin[1],\n far[2] - origin[2],\n ];\n \n const len = Math.sqrt(\n direction[0] * direction[0] +\n direction[1] * direction[1] +\n direction[2] * direction[2]\n );\n \n direction[0] /= len;\n direction[1] /= len;\n direction[2] /= len;\n \n return { origin, direction };\n}\n\n/**\n * Transform a 4D point by a 4x4 matrix.\n */\nfunction transformPoint4(\n m: Float32Array,\n p: readonly [number, number, number, number]\n): [number, number, number, number] {\n return [\n m[0] * p[0] + m[4] * p[1] + m[8] * p[2] + m[12] * p[3],\n m[1] * p[0] + m[5] * p[1] + m[9] * p[2] + m[13] * p[3],\n m[2] * p[0] + m[6] * p[1] + m[10] * p[2] + m[14] * p[3],\n m[3] * p[0] + m[7] * p[1] + m[11] * p[2] + m[15] * p[3],\n ];\n}\n\n/**\n * Test ray-sphere intersection.\n * @param ray The ray to test\n * @param center Sphere center\n * @param radius Sphere radius\n * @returns Distance to intersection, or null if no hit\n */\nexport function raySphereIntersection(\n ray: Ray3D,\n center: [number, number, number],\n radius: number\n): number | null {\n // Vector from ray origin to sphere center\n const oc: [number, number, number] = [\n ray.origin[0] - center[0],\n ray.origin[1] - center[1],\n ray.origin[2] - center[2],\n ];\n \n // Coefficients for quadratic equation\n // a = 1 (direction is normalized)\n const a = 1;\n const b = 2 * (\n oc[0] * ray.direction[0] +\n oc[1] * ray.direction[1] +\n oc[2] * ray.direction[2]\n );\n const c = (\n oc[0] * oc[0] +\n oc[1] * oc[1] +\n oc[2] * oc[2]\n ) - radius * radius;\n \n const discriminant = b * b - 4 * a * c;\n \n if (discriminant < 0) {\n return null; // No intersection\n }\n \n // Find the nearest positive root\n const sqrtD = Math.sqrt(discriminant);\n const t1 = (-b - sqrtD) / (2 * a);\n const t2 = (-b + sqrtD) / (2 * a);\n \n if (t1 > 0) return t1;\n if (t2 > 0) return t2;\n \n return null; // Intersection is behind ray origin\n}\n\n/**\n * Find the closest bubble hit by a ray.\n * @param ray The ray to test\n * @param positions Float32Array of positions (x,y,z interleaved)\n * @param scales Float32Array of scales (radii)\n * @param baseRadius Base radius multiplier\n * @returns Hit result or null if no hit\n */\nexport function pickBubble(\n ray: Ray3D,\n positions: Float32Array,\n scales: Float32Array,\n baseRadius = 1\n): HitResult | null {\n const count = scales.length;\n let closestHit: HitResult | null = null;\n \n for (let i = 0; i < count; i++) {\n const center: [number, number, number] = [\n positions[i * 3],\n positions[i * 3 + 1],\n positions[i * 3 + 2],\n ];\n const radius = scales[i] * baseRadius;\n \n const distance = raySphereIntersection(ray, center, radius);\n \n if (distance !== null) {\n if (closestHit === null || distance < closestHit.distance) {\n // Calculate hit point\n const point: [number, number, number] = [\n ray.origin[0] + ray.direction[0] * distance,\n ray.origin[1] + ray.direction[1] * distance,\n ray.origin[2] + ray.direction[2] * distance,\n ];\n \n closestHit = {\n index: i,\n distance,\n point,\n };\n }\n }\n }\n \n return closestHit;\n}\n\n/**\n * Batch pick bubbles - returns all bubbles within a tolerance of the ray.\n * More efficient for hover detection.\n */\nexport function pickBubblesInRange(\n ray: Ray3D,\n positions: Float32Array,\n scales: Float32Array,\n baseRadius = 1,\n maxResults = 10\n): HitResult[] {\n const count = scales.length;\n const hits: HitResult[] = [];\n \n for (let i = 0; i < count; i++) {\n const center: [number, number, number] = [\n positions[i * 3],\n positions[i * 3 + 1],\n positions[i * 3 + 2],\n ];\n const radius = scales[i] * baseRadius;\n \n const distance = raySphereIntersection(ray, center, radius);\n \n if (distance !== null) {\n const point: [number, number, number] = [\n ray.origin[0] + ray.direction[0] * distance,\n ray.origin[1] + ray.direction[1] * distance,\n ray.origin[2] + ray.direction[2] * distance,\n ];\n \n hits.push({ index: i, distance, point });\n \n if (hits.length >= maxResults) break;\n }\n }\n \n // Sort by distance\n hits.sort((a, b) => a.distance - b.distance);\n \n return hits;\n}\n\n/**\n * Calculate distance from a point to a ray (for approximate/fast picking).\n */\nexport function pointToRayDistance(\n ray: Ray3D,\n point: [number, number, number]\n): number {\n // Vector from ray origin to point\n const v: [number, number, number] = [\n point[0] - ray.origin[0],\n point[1] - ray.origin[1],\n point[2] - ray.origin[2],\n ];\n \n // Project onto ray direction\n const t = (\n v[0] * ray.direction[0] +\n v[1] * ray.direction[1] +\n v[2] * ray.direction[2]\n );\n \n // Closest point on ray\n const closest: [number, number, number] = [\n ray.origin[0] + ray.direction[0] * t,\n ray.origin[1] + ray.direction[1] * t,\n ray.origin[2] + ray.direction[2] * t,\n ];\n \n // Distance from point to closest point on ray\n const dx = point[0] - closest[0];\n const dy = point[1] - closest[1];\n const dz = point[2] - closest[2];\n \n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n}\n\n/**\n * Result of a surface mesh hit test\n */\nexport interface SurfaceHitResult {\n /** Distance from ray origin to hit point */\n distance: number;\n /** Hit point in world coordinates */\n point: [number, number, number];\n /** Grid row and column indices */\n row: number;\n col: number;\n /** Interpolated Y value at hit point */\n yValue: number;\n /** Barycentric coordinates for interpolation */\n baryU: number;\n baryV: number;\n}\n\n/**\n * Ray-triangle intersection using Möller-Trumbore algorithm.\n * Returns distance to intersection or null if no hit.\n */\nexport function rayTriangleIntersection(\n ray: Ray3D,\n v0: [number, number, number],\n v1: [number, number, number],\n v2: [number, number, number]\n): { distance: number; u: number; v: number } | null {\n const EPSILON = 0.000001;\n \n // Edge vectors\n const e1: [number, number, number] = [\n v1[0] - v0[0],\n v1[1] - v0[1],\n v1[2] - v0[2],\n ];\n const e2: [number, number, number] = [\n v2[0] - v0[0],\n v2[1] - v0[1],\n v2[2] - v0[2],\n ];\n \n // Cross product: ray.direction x e2\n const h: [number, number, number] = [\n ray.direction[1] * e2[2] - ray.direction[2] * e2[1],\n ray.direction[2] * e2[0] - ray.direction[0] * e2[2],\n ray.direction[0] * e2[1] - ray.direction[1] * e2[0],\n ];\n \n // Dot product: e1 . h\n const a = e1[0] * h[0] + e1[1] * h[1] + e1[2] * h[2];\n \n // Ray parallel to triangle\n if (a > -EPSILON && a < EPSILON) {\n return null;\n }\n \n const f = 1.0 / a;\n \n // Vector from v0 to ray origin\n const s: [number, number, number] = [\n ray.origin[0] - v0[0],\n ray.origin[1] - v0[1],\n ray.origin[2] - v0[2],\n ];\n \n // First barycentric coordinate\n const u = f * (s[0] * h[0] + s[1] * h[1] + s[2] * h[2]);\n \n if (u < 0.0 || u > 1.0) {\n return null;\n }\n \n // Cross product: s x e1\n const q: [number, number, number] = [\n s[1] * e1[2] - s[2] * e1[1],\n s[2] * e1[0] - s[0] * e1[2],\n s[0] * e1[1] - s[1] * e1[0],\n ];\n \n // Second barycentric coordinate\n const v = f * (ray.direction[0] * q[0] + ray.direction[1] * q[1] + ray.direction[2] * q[2]);\n \n if (v < 0.0 || u + v > 1.0) {\n return null;\n }\n \n // Distance to intersection\n const t = f * (e2[0] * q[0] + e2[1] * q[1] + e2[2] * q[2]);\n \n if (t > EPSILON) {\n return { distance: t, u, v };\n }\n \n return null;\n}\n\n/**\n * Pick a point on a surface mesh grid.\n * Tests ray against all triangles in the grid.\n * \n * @param ray The picking ray\n * @param xValues X coordinates array (columns)\n * @param zValues Z coordinates array (rows)\n * @param yValues Y values array (row-major: row * cols + col)\n * @returns Hit result or null if no intersection\n */\nexport function pickSurfaceMesh(\n ray: Ray3D,\n xValues: Float32Array,\n zValues: Float32Array,\n yValues: Float32Array\n): SurfaceHitResult | null {\n const cols = xValues.length;\n const rows = zValues.length;\n \n let closestHit: SurfaceHitResult | null = null;\n \n // Iterate through all quads (each quad = 2 triangles)\n for (let row = 0; row < rows - 1; row++) {\n for (let col = 0; col < cols - 1; col++) {\n // Get the 4 corners of the quad\n const i00 = row * cols + col;\n const i10 = row * cols + col + 1;\n const i01 = (row + 1) * cols + col;\n const i11 = (row + 1) * cols + col + 1;\n \n const v00: [number, number, number] = [xValues[col], yValues[i00], zValues[row]];\n const v10: [number, number, number] = [xValues[col + 1], yValues[i10], zValues[row]];\n const v01: [number, number, number] = [xValues[col], yValues[i01], zValues[row + 1]];\n const v11: [number, number, number] = [xValues[col + 1], yValues[i11], zValues[row + 1]];\n \n // Triangle 1: v00, v01, v10\n const hit1 = rayTriangleIntersection(ray, v00, v01, v10);\n if (hit1 && (closestHit === null || hit1.distance < closestHit.distance)) {\n const point: [number, number, number] = [\n ray.origin[0] + ray.direction[0] * hit1.distance,\n ray.origin[1] + ray.direction[1] * hit1.distance,\n ray.origin[2] + ray.direction[2] * hit1.distance,\n ];\n \n // Interpolate Y value using barycentric coordinates\n const w = 1 - hit1.u - hit1.v;\n const yInterp = w * yValues[i00] + hit1.u * yValues[i01] + hit1.v * yValues[i10];\n \n closestHit = {\n distance: hit1.distance,\n point,\n row,\n col,\n yValue: yInterp,\n baryU: hit1.u,\n baryV: hit1.v,\n };\n }\n \n // Triangle 2: v10, v01, v11\n const hit2 = rayTriangleIntersection(ray, v10, v01, v11);\n if (hit2 && (closestHit === null || hit2.distance < closestHit.distance)) {\n const point: [number, number, number] = [\n ray.origin[0] + ray.direction[0] * hit2.distance,\n ray.origin[1] + ray.direction[1] * hit2.distance,\n ray.origin[2] + ray.direction[2] * hit2.distance,\n ];\n \n const w = 1 - hit2.u - hit2.v;\n const yInterp = w * yValues[i10] + hit2.u * yValues[i01] + hit2.v * yValues[i11];\n \n closestHit = {\n distance: hit2.distance,\n point,\n row,\n col: col + 1,\n yValue: yInterp,\n baryU: hit2.u,\n baryV: hit2.v,\n };\n }\n }\n }\n \n return closestHit;\n}\n\n/**\n * Calculate the shortest distance between a ray and a line segment.\n * Useful for picking lines and thin tubes.\n */\nexport function raySegmentDistance(\n ray: Ray3D,\n p0: [number, number, number],\n p1: [number, number, number]\n): { distance: number; pointOnRay: [number, number, number]; pointOnSegment: [number, number, number]; t: number } {\n const v = [p1[0] - p0[0], p1[1] - p0[1], p1[2] - p0[2]];\n const u = ray.direction;\n const w = [ray.origin[0] - p0[0], ray.origin[1] - p0[1], ray.origin[2] - p0[2]];\n\n const a = u[0] * u[0] + u[1] * u[1] + u[2] * u[2];\n const b = u[0] * v[0] + u[1] * v[1] + u[2] * v[2];\n const c = v[0] * v[0] + v[1] * v[1] + v[2] * v[2];\n const d = u[0] * w[0] + u[1] * w[1] + u[2] * w[2];\n const e = v[0] * w[0] + v[1] * w[1] + v[2] * w[2];\n\n const D = a * c - b * b;\n let sc, tc;\n\n if (D < 0.0001) {\n sc = 0.0;\n tc = (b > c ? d / b : e / c);\n } else {\n sc = (b * e - c * d) / D;\n tc = (a * e - b * d) / D;\n }\n\n // Clamp tc to [0, 1] segment range\n tc = Math.max(0, Math.min(1, tc));\n \n // Point on ray P(sc) = origin + sc * direction (only if sc > 0)\n sc = Math.max(0, sc);\n\n const closestOnRay: [number, number, number] = [\n ray.origin[0] + sc * u[0],\n ray.origin[1] + sc * u[1],\n ray.origin[2] + sc * u[2]\n ];\n\n const closestOnSegment: [number, number, number] = [\n p0[0] + tc * v[0],\n p0[1] + tc * v[1],\n p0[2] + tc * v[2]\n ];\n\n const dx = closestOnRay[0] - closestOnSegment[0];\n const dy = closestOnRay[1] - closestOnSegment[1];\n const dz = closestOnRay[2] - closestOnSegment[2];\n const dist = Math.sqrt(dx * dx + dy * dy + dz * dz);\n\n return {\n distance: dist,\n pointOnRay: closestOnRay,\n pointOnSegment: closestOnSegment,\n t: tc\n };\n}\n\n/**\n * Pick a series index and point index from a 3D line.\n */\nexport function pickLine(\n ray: Ray3D,\n lines: { x: Float32Array; y: Float32Array; z: Float32Array }[],\n threshold: number = 0.5\n): { seriesIndex: number; pointIndex: number; distance: number; point: [number, number, number] } | null {\n let closest: { seriesIndex: number; pointIndex: number; distance: number; point: [number, number, number] } | null = null;\n let minDist = threshold;\n\n for (let s = 0; s < lines.length; s++) {\n const line = lines[s];\n for (let i = 0; i < line.x.length - 1; i++) {\n const p0: [number, number, number] = [line.x[i], line.y[i], line.z[i]];\n const p1: [number, number, number] = [line.x[i+1], line.y[i+1], line.z[i+1]];\n \n const res = raySegmentDistance(ray, p0, p1);\n if (res.distance < minDist) {\n minDist = res.distance;\n closest = {\n seriesIndex: s,\n pointIndex: i + (res.t > 0.5 ? 1 : 0),\n distance: res.distance,\n point: res.pointOnSegment\n };\n }\n }\n }\n\n return closest;\n}\n\n/**\n * Pick a point from an impulse/stem series.\n */\nexport function pickImpulse(\n ray: Ray3D,\n data: { x: Float32Array; y: Float32Array; z: Float32Array; baseY?: number },\n threshold: number = 0.3\n): { index: number; distance: number; point: [number, number, number] } | null {\n let closest: { index: number; distance: number; point: [number, number, number] } | null = null;\n let minDist = threshold;\n const baseY = data.baseY ?? 0;\n\n for (let i = 0; i < data.x.length; i++) {\n const p0: [number, number, number] = [data.x[i], baseY, data.z[i]];\n const p1: [number, number, number] = [data.x[i], data.y[i], data.z[i]];\n\n const res = raySegmentDistance(ray, p0, p1);\n if (res.distance < minDist) {\n minDist = res.distance;\n closest = {\n index: i,\n distance: res.distance,\n point: [data.x[i], data.y[i], data.z[i]]\n };\n }\n }\n\n return closest;\n}\n\n/**\n * Pick a series index and point index from a 3D area (curtain).\n * Checks the top line of the area.\n */\nexport function pickArea(\n ray: Ray3D,\n areas: { x: Float32Array; y: Float32Array; z: Float32Array; baseY?: number }[],\n threshold: number = 0.5\n): { seriesIndex: number; pointIndex: number; distance: number; point: [number, number, number] } | null {\n return pickLine(ray, areas, threshold);\n}\n\n\n\n","/**\n * Color palettes and themes for 3D charts\n * Provides optimized color schemes for both dark and light backgrounds\n */\n\nexport type ColorPalette = Array<[number, number, number]>;\n\nexport interface ColorTheme {\n /** Series color palette */\n seriesPalette: ColorPalette;\n /** Highlight color for hover states */\n highlightColor: [number, number, number];\n /** Default background color */\n backgroundColor?: [number, number, number, number];\n}\n\n/**\n * Dark theme - optimized for dark backgrounds\n * Uses vibrant, saturated colors that pop against dark backgrounds\n */\nexport const DARK_THEME: ColorTheme = {\n seriesPalette: [\n [0.3, 0.7, 1.0], // Bright Blue\n [1.0, 0.5, 0.3], // Bright Orange\n [0.3, 0.95, 0.6], // Bright Green\n [1.0, 0.4, 0.9], // Bright Magenta\n [1.0, 0.95, 0.3], // Bright Yellow\n [0.6, 0.4, 1.0], // Bright Purple\n [0.4, 0.95, 0.95], // Bright Cyan\n [1.0, 0.7, 0.4], // Bright Peach\n ],\n highlightColor: [1.0, 1.0, 0.9], // Bright white-yellow\n backgroundColor: [0.05, 0.05, 0.1, 1],\n};\n\n/**\n * Light theme - optimized for light backgrounds\n * Uses deeper, more saturated colors that stand out against white/light backgrounds\n */\nexport const LIGHT_THEME: ColorTheme = {\n seriesPalette: [\n [0.2, 0.4, 0.8], // Deep Blue\n [0.9, 0.4, 0.1], // Deep Orange\n [0.1, 0.6, 0.3], // Deep Green\n [0.7, 0.2, 0.6], // Deep Magenta\n [0.8, 0.7, 0.1], // Deep Yellow\n [0.4, 0.2, 0.7], // Deep Purple\n [0.1, 0.5, 0.6], // Deep Teal\n [0.7, 0.3, 0.2], // Deep Brown\n ],\n highlightColor: [0.1, 0.1, 0.5], // Deep navy blue for contrast\n backgroundColor: [0.95, 0.95, 0.98, 1],\n};\n\n/**\n * Auto-detect theme based on background color luminance\n */\nexport function getThemeFromBackground(\n backgroundColor: [number, number, number, number]\n): ColorTheme {\n const [r, g, b] = backgroundColor;\n // Calculate relative luminance\n const luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b;\n \n // If background is light (luminance > 0.5), use light theme\n return luminance > 0.5 ? LIGHT_THEME : DARK_THEME;\n}\n\n/**\n * Create a custom theme or merge with defaults\n */\nexport interface CustomThemeOptions {\n /** Custom series palette (overrides default) */\n seriesPalette?: ColorPalette;\n /** Custom highlight color (overrides default) */\n highlightColor?: [number, number, number];\n /** Base theme to use ('dark' | 'light' | 'auto') */\n baseTheme?: 'dark' | 'light' | 'auto';\n}\n\nexport function createTheme(\n options: CustomThemeOptions,\n backgroundColor?: [number, number, number, number]\n): ColorTheme {\n let baseTheme: ColorTheme;\n \n if (options.baseTheme === 'dark') {\n baseTheme = DARK_THEME;\n } else if (options.baseTheme === 'light') {\n baseTheme = LIGHT_THEME;\n } else {\n // Auto-detect from background\n baseTheme = backgroundColor \n ? getThemeFromBackground(backgroundColor)\n : DARK_THEME;\n }\n \n return {\n seriesPalette: options.seriesPalette ?? baseTheme.seriesPalette,\n highlightColor: options.highlightColor ?? baseTheme.highlightColor,\n backgroundColor: baseTheme.backgroundColor,\n };\n}\n","/**\n * Area 3D Renderer\n * Renders filled areas (curtain effect) as continuous surfaces.\n * Creates a mesh from a line down to a base plane.\n */\n\nimport { OrbitCamera, type OrbitCameraOptions } from './camera/OrbitCamera';\nimport { OrbitController, type OrbitControllerOptions } from './controls/OrbitController';\nimport {\n createProgramBundle3D,\n deleteProgramBundle,\n type ProgramBundle3D,\n} from './shader/programs';\nimport { Axes3D, type Axes3DOptions } from './Axes3D';\nimport { Tooltip3D, type Tooltip3DOptions } from './Tooltip3D';\nimport type {\n Renderer3DOptions,\n Bounds3D,\n RenderStats3D,\n Renderer3DEvent,\n Renderer3DEventCallback,\n} from './types';\nimport { createRayFromScreen, pickArea } from './Raycaster3D';\nimport { createTheme, type CustomThemeOptions, type ColorTheme } from './colorThemes';\n\nexport interface AreaSeriesData {\n /** X coordinates */\n x: Float32Array;\n /** Y coordinates (top of area) */\n y: Float32Array;\n /** Z coordinates */\n z: Float32Array;\n /** Base Y value (bottom of area, default: 0) */\n baseY?: number;\n /** Color per vertex (optional, RGB) */\n colors?: Float32Array;\n /** Single area color [r, g, b] */\n color?: [number, number, number];\n}\n\nexport interface Area3DRendererOptions extends Renderer3DOptions {\n camera?: OrbitCameraOptions;\n controls?: OrbitControllerOptions;\n axes?: Axes3DOptions;\n showAxes?: boolean;\n /** Opacity of areas (default: 0.8) */\n opacity?: number;\n /** Enable tooltips (default: true) */\n enableTooltip?: boolean;\n tooltip?: Tooltip3DOptions;\n /** Color theme options */\n theme?: CustomThemeOptions;\n}\n\nexport class Area3DRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGL2RenderingContext;\n private dpr: number;\n \n private programs: ProgramBundle3D;\n private camera: OrbitCamera;\n private controller: OrbitController;\n private axes: Axes3D | null = null;\n \n // Geometry buffers\n private vao: WebGLVertexArrayObject | null = null;\n private positionBuffer: WebGLBuffer | null = null;\n private normalBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n private indexCount = 0;\n \n private backgroundColor: [number, number, number, number] = [0.05, 0.05, 0.1, 1];\n private showAxes: boolean;\n private opacity: number;\n \n private areas: AreaSeriesData[] = [];\n private bounds: Bounds3D | null = null;\n \n private animationFrameId: number | null = null;\n private needsRender = true;\n \n private eventListeners: Map<string, Set<Renderer3DEventCallback>> = new Map();\n \n // Hover highlight\n private hoveredSeriesIndex: number | null = null;\n private colorTheme: ColorTheme;\n \n // Tooltip\n private tooltip: Tooltip3D | null = null;\n private enableTooltip: boolean;\n private lastHitIndex: { series: number, point: number } | null = null;\n private boundHandleMouseMove?: (e: MouseEvent) => void;\n private boundHandleMouseLeave?: () => void;\n \n // Stats\n private lastFrameTime = 0;\n private frameCount = 0;\n private fps = 0;\n private lastFpsUpdate = 0;\n \n constructor(options: Area3DRendererOptions) {\n this.canvas = options.canvas;\n this.dpr = window.devicePixelRatio || 1;\n this.showAxes = options.showAxes ?? true;\n this.opacity = options.opacity ?? 0.8;\n this.enableTooltip = options.enableTooltip ?? true;\n \n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor;\n }\n \n // Initialize color theme\n this.colorTheme = createTheme(options.theme || {}, this.backgroundColor);\n \n // Get WebGL2 context\n const gl = this.canvas.getContext('webgl2', {\n alpha: true,\n antialias: true,\n preserveDrawingBuffer: false,\n });\n \n if (!gl) {\n throw new Error('WebGL2 not supported');\n }\n this.gl = gl;\n \n // Enable depth testing and blending\n gl.enable(gl.DEPTH_TEST);\n gl.depthFunc(gl.LEQUAL);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n \n // Create shader programs\n this.programs = createProgramBundle3D(gl);\n \n // Create buffers\n this.initBuffers();\n \n // Create camera\n this.camera = new OrbitCamera(options.camera);\n \n // Create controller\n this.controller = new OrbitController(this.camera, this.canvas, options.controls);\n this.controller.onChange(() => {\n this.needsRender = true;\n this.emitEvent('cameraChange');\n });\n \n // Create axes\n if (this.showAxes) {\n this.axes = new Axes3D(gl, options.axes);\n }\n \n // Initialize tooltip\n if (this.enableTooltip) {\n this.tooltip = new Tooltip3D(this.canvas.parentElement || document.body, options.tooltip);\n \n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseLeave = this.handleMouseLeave.bind(this);\n this.canvas.addEventListener('mousemove', this.boundHandleMouseMove);\n this.canvas.addEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n \n // Handle resize\n this.resize();\n window.addEventListener('resize', this.handleResize);\n \n // Start render loop\n this.startRenderLoop();\n }\n\n private handleMouseMove(e: MouseEvent): void {\n if (this.areas.length === 0) return;\n \n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n \n const hit = this.pickAtScreen(x, y);\n \n // Update hovered series\n const newHoveredIndex = hit ? hit.seriesIndex : null;\n if (newHoveredIndex !== this.hoveredSeriesIndex) {\n this.hoveredSeriesIndex = newHoveredIndex;\n this.buildAreaGeometry();\n this.needsRender = true;\n }\n \n // Tooltip logic\n if (this.tooltip) {\n if (hit) {\n const isNew = !this.lastHitIndex || \n this.lastHitIndex.series !== hit.seriesIndex || \n this.lastHitIndex.point !== hit.pointIndex;\n \n if (isNew) {\n this.lastHitIndex = { series: hit.seriesIndex, point: hit.pointIndex };\n const area = this.areas[hit.seriesIndex];\n const color = area.color || [0.5, 0.7, 1.0];\n \n this.tooltip.show({\n index: hit.pointIndex,\n position: [area.x[hit.pointIndex], area.y[hit.pointIndex], area.z[hit.pointIndex]],\n color: color,\n customData: { series: hit.seriesIndex }\n }, x, y);\n } else {\n this.tooltip.updatePosition(x, y);\n }\n } else {\n if (this.lastHitIndex) {\n this.tooltip.hide();\n this.lastHitIndex = null;\n }\n }\n }\n }\n\n private handleMouseLeave(): void {\n // Reset highlight\n if (this.hoveredSeriesIndex !== null) {\n this.hoveredSeriesIndex = null;\n this.buildAreaGeometry();\n this.needsRender = true;\n }\n \n if (this.tooltip) {\n this.tooltip.hide();\n this.lastHitIndex = null;\n }\n }\n\n pickAtScreen(screenX: number, screenY: number) {\n if (this.areas.length === 0) return null;\n \n const { width, height } = this.getCanvasSize();\n const viewProj = this.camera.getViewProjectionMatrix();\n const ray = createRayFromScreen(screenX, screenY, width, height, viewProj);\n \n return pickArea(ray, this.areas, 0.5);\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n this.positionBuffer = gl.createBuffer();\n this.normalBuffer = gl.createBuffer();\n this.colorBuffer = gl.createBuffer();\n this.indexBuffer = gl.createBuffer();\n \n gl.bindVertexArray(null);\n }\n \n private handleResize = (): void => {\n this.resize();\n this.needsRender = true;\n };\n \n resize(): void {\n const { canvas, gl, dpr, camera } = this;\n \n const width = canvas.clientWidth;\n const height = canvas.clientHeight;\n \n canvas.width = width * dpr;\n canvas.height = height * dpr;\n \n gl.viewport(0, 0, canvas.width, canvas.height);\n camera.aspect = width / height;\n }\n \n /**\n * Set area data (single area or array of areas)\n */\n setData(areas: AreaSeriesData | AreaSeriesData[]): void {\n this.areas = Array.isArray(areas) ? areas : [areas];\n this.buildAreaGeometry();\n this.calculateBounds();\n \n if (this.axes && this.bounds) {\n this.axes.updateBounds(this.bounds);\n }\n \n this.needsRender = true;\n this.emitEvent('dataUpdate');\n }\n \n /**\n * Add a single area\n */\n addArea(area: AreaSeriesData): void {\n this.areas.push(area);\n this.buildAreaGeometry();\n this.calculateBounds();\n \n if (this.axes && this.bounds) {\n this.axes.updateBounds(this.bounds);\n }\n \n this.needsRender = true;\n }\n \n /**\n * Clear all areas\n */\n clearAreas(): void {\n this.areas = [];\n this.indexCount = 0;\n this.needsRender = true;\n }\n \n private buildAreaGeometry(): void {\n const { gl, areas } = this;\n \n if (areas.length === 0) {\n this.indexCount = 0;\n return;\n }\n \n const allPositions: number[] = [];\n const allNormals: number[] = [];\n const allColors: number[] = [];\n const allIndices: number[] = [];\n let vertexOffset = 0;\n \n // Get color palette from theme\n const colorPalette = this.colorTheme.seriesPalette;\n const highlightColor = this.colorTheme.highlightColor;\n \n for (let areaIdx = 0; areaIdx < areas.length; areaIdx++) {\n const area = areas[areaIdx];\n const pointCount = area.x.length;\n if (pointCount < 2) continue;\n \n // Use highlight color if this series is hovered\n const isHovered = areaIdx === this.hoveredSeriesIndex;\n const defaultColor = isHovered\n ? highlightColor\n : (area.color ?? colorPalette[areaIdx % colorPalette.length]);\n \n const baseY = area.baseY ?? 0;\n \n // For each segment, create a quad (2 triangles)\n // Top-left, Top-right, Bottom-left, Bottom-right pattern\n for (let i = 0; i < pointCount; i++) {\n const x = area.x[i];\n const y = area.y[i];\n const z = area.z[i];\n \n // Top vertex\n allPositions.push(x, y, z);\n // Bottom vertex\n allPositions.push(x, baseY, z);\n \n // Calculate normal (perpendicular to surface)\n // For a curtain, the normal points in the Z direction\n // (or we can calculate from adjacent points)\n let nx = 0, ny = 0, nz = 1;\n \n if (i < pointCount - 1) {\n // Forward direction\n const dx = area.x[i + 1] - area.x[i];\n const dy = area.y[i + 1] - area.y[i];\n const dz = area.z[i + 1] - area.z[i];\n \n // Cross product with up vector to get normal\n // normal = forward × up\n nx = dy * 0 - 0 * 1; // dz=0 assumed for curtain\n ny = 0 * dx - dx * 0;\n nz = dx * 1 - dy * 0;\n \n // Actually, for curtain facing outward, use perpendicular in XZ plane\n // Simplified: normal perpendicular to line direction in XZ\n const len = Math.sqrt(dx * dx + dz * dz);\n if (len > 0.001) {\n nx = -dz / len;\n ny = 0;\n nz = dx / len;\n }\n }\n \n // Same normal for top and bottom\n allNormals.push(nx, ny, nz);\n allNormals.push(nx, ny, nz);\n \n // Colors with gradient (darker at base)\n if (area.colors) {\n const r = area.colors[i * 3];\n const g = area.colors[i * 3 + 1];\n const b = area.colors[i * 3 + 2];\n allColors.push(r, g, b); // Top\n allColors.push(r * 0.5, g * 0.5, b * 0.5); // Bottom (darker)\n } else {\n allColors.push(defaultColor[0], defaultColor[1], defaultColor[2]); // Top\n allColors.push(defaultColor[0] * 0.5, defaultColor[1] * 0.5, defaultColor[2] * 0.6); // Bottom\n }\n \n // Generate indices (connect to next segment)\n if (i < pointCount - 1) {\n const topLeft = vertexOffset + i * 2;\n const bottomLeft = topLeft + 1;\n const topRight = topLeft + 2;\n const bottomRight = topLeft + 3;\n \n // Two triangles per quad\n allIndices.push(topLeft, bottomLeft, topRight);\n allIndices.push(topRight, bottomLeft, bottomRight);\n }\n }\n \n vertexOffset += pointCount * 2;\n }\n \n // Upload to GPU\n const positions = new Float32Array(allPositions);\n const normals = new Float32Array(allNormals);\n const colors = new Float32Array(allColors);\n const indices = new Uint32Array(allIndices);\n \n this.indexCount = indices.length;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, normals, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n }\n \n private calculateBounds(): void {\n if (this.areas.length === 0) {\n this.bounds = null;\n return;\n }\n \n let minX = Infinity, maxX = -Infinity;\n let minY = Infinity, maxY = -Infinity;\n let minZ = Infinity, maxZ = -Infinity;\n \n for (const area of this.areas) {\n const baseY = area.baseY ?? 0;\n if (baseY < minY) minY = baseY;\n \n for (let i = 0; i < area.x.length; i++) {\n if (area.x[i] < minX) minX = area.x[i];\n if (area.x[i] > maxX) maxX = area.x[i];\n if (area.y[i] < minY) minY = area.y[i];\n if (area.y[i] > maxY) maxY = area.y[i];\n if (area.z[i] < minZ) minZ = area.z[i];\n if (area.z[i] > maxZ) maxZ = area.z[i];\n }\n }\n \n this.bounds = { minX, maxX, minY, maxY, minZ, maxZ };\n }\n \n /**\n * Fit camera to show all data\n */\n fitToData(): void {\n if (!this.bounds) return;\n \n const { minX, maxX, minY, maxY, minZ, maxZ } = this.bounds;\n \n // Add 20% padding to bounds for better fit\n const dx = maxX - minX;\n const dy = maxY - minY;\n const dz = maxZ - minZ;\n const padding = 0.001;\n \n this.camera.fitToBounds(\n minX - dx * padding, minY - dy * padding, minZ - dz * padding,\n maxX + dx * padding, maxY + dy * padding, maxZ + dz * padding\n );\n \n // Closer fit\n this.camera.radius *= 1.05;\n \n this.needsRender = true;\n }\n \n getCanvasSize(): { width: number; height: number } {\n const rect = this.canvas.getBoundingClientRect();\n return { width: rect.width, height: rect.height };\n }\n\n /**\n * Render a single frame\n */\n render(): void {\n const { gl, camera, backgroundColor } = this;\n \n const startTime = performance.now();\n \n // Clear\n gl.clearColor(\n backgroundColor[0],\n backgroundColor[1],\n backgroundColor[2],\n backgroundColor[3]\n );\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n \n // Get view projection matrix\n const viewProj = camera.getViewProjectionMatrix();\n \n // Render axes first\n if (this.axes) {\n this.axes.render(viewProj);\n }\n \n // Render areas\n if (this.indexCount > 0) {\n const program = this.programs.surfaceProgram;\n gl.useProgram(program.program);\n \n gl.uniformMatrix4fv(program.uniforms['u_viewProjection'], false, viewProj);\n gl.uniform1f(program.uniforms['u_opacity'], this.opacity);\n gl.uniform3f(program.uniforms['u_lightDir'], 1, 1, 1);\n gl.uniform1f(program.uniforms['u_ambient'], 0.6);\n \n gl.bindVertexArray(this.vao);\n \n // Position\n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n // Normal\n const normalLoc = program.attributes['a_normal'];\n if (normalLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.enableVertexAttribArray(normalLoc);\n gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n // Color\n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.drawElements(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0);\n \n gl.bindVertexArray(null);\n }\n \n // Update stats\n const frameTime = performance.now() - startTime;\n this.lastFrameTime = frameTime;\n this.frameCount++;\n \n const now = performance.now();\n if (now - this.lastFpsUpdate >= 1000) {\n this.fps = this.frameCount;\n this.frameCount = 0;\n this.lastFpsUpdate = now;\n }\n \n this.emitEvent('render');\n }\n \n startRenderLoop(): void {\n if (this.animationFrameId !== null) return;\n \n const loop = (): void => {\n this.controller.update();\n \n if (this.needsRender) {\n this.render();\n this.needsRender = false;\n }\n \n this.animationFrameId = requestAnimationFrame(loop);\n };\n \n loop();\n }\n \n stopRenderLoop(): void {\n if (this.animationFrameId !== null) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n }\n \n getStats(): RenderStats3D {\n return {\n fps: this.fps,\n instanceCount: this.indexCount / 6,\n frameTime: this.lastFrameTime,\n drawCalls: 1,\n };\n }\n \n getCamera(): OrbitCamera {\n return this.camera;\n }\n \n getAxisLabels() {\n if (!this.axes) return [];\n return this.axes.getLabels();\n }\n\n getViewProjectionMatrix(): Float32Array {\n return this.camera.getViewProjectionMatrix();\n }\n\n projectToScreen(worldPos: [number, number, number]): { x: number; y: number; visible: boolean } {\n if (!this.axes) return { x: 0, y: 0, visible: false };\n const rect = this.canvas.getBoundingClientRect();\n const viewProj = this.camera.getViewProjectionMatrix();\n return this.axes.projectToScreen(worldPos, viewProj, rect.width, rect.height);\n }\n\n exportImage(\n format: 'png' | 'jpeg' | 'webp' = 'png',\n quality = 0.92,\n transparent = false\n ): string {\n const savedBg = [...this.backgroundColor];\n if (transparent && format === 'png') {\n this.backgroundColor = [0, 0, 0, 0];\n }\n this.render();\n this.backgroundColor = savedBg as [number, number, number, number];\n const mimeType = `image/${format}`;\n return this.canvas.toDataURL(mimeType, quality);\n }\n \n on(event: string, callback: Renderer3DEventCallback): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n \n off(event: string, callback: Renderer3DEventCallback): void {\n this.eventListeners.get(event)?.delete(callback);\n }\n \n private emitEvent(type: string): void {\n const listeners = this.eventListeners.get(type);\n if (!listeners) return;\n \n const event: Renderer3DEvent = {\n type: type as any,\n timestamp: performance.now(),\n stats: this.getStats(),\n camera: {\n target: [...this.camera.target] as [number, number, number],\n radius: this.camera.radius,\n theta: this.camera.theta,\n phi: this.camera.phi,\n fov: this.camera.fov,\n },\n };\n \n listeners.forEach(callback => callback(event));\n }\n \n destroy(): void {\n this.stopRenderLoop();\n \n window.removeEventListener('resize', this.handleResize);\n \n if (this.tooltip) {\n this.tooltip.destroy();\n if (this.boundHandleMouseMove) this.canvas.removeEventListener('mousemove', this.boundHandleMouseMove);\n if (this.boundHandleMouseLeave) this.canvas.removeEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n \n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.normalBuffer) gl.deleteBuffer(this.normalBuffer);\n if (this.colorBuffer) gl.deleteBuffer(this.colorBuffer);\n if (this.indexBuffer) gl.deleteBuffer(this.indexBuffer);\n \n this.controller.destroy();\n deleteProgramBundle(gl, this.programs);\n \n if (this.axes) {\n this.axes.destroy();\n }\n \n this.eventListeners.clear();\n }\n}\n","/**\n * Procedural geometry generation for 3D primitives.\n * Generates vertex positions and indices for instanced rendering.\n */\n\nexport interface GeometryData {\n positions: Float32Array;\n indices: Uint16Array;\n vertexCount: number;\n indexCount: number;\n}\n\n/**\n * Generate icosphere geometry (subdivided icosahedron).\n * Good for spherical bubbles with uniform vertex distribution.\n */\nexport function createIcosphere(subdivisions = 1): GeometryData {\n const t = (1 + Math.sqrt(5)) / 2;\n\n // Initial icosahedron vertices\n const vertices: number[] = [\n -1, t, 0, 1, t, 0, -1, -t, 0, 1, -t, 0,\n 0, -1, t, 0, 1, t, 0, -1, -t, 0, 1, -t,\n t, 0, -1, t, 0, 1, -t, 0, -1, -t, 0, 1,\n ];\n\n // Initial icosahedron faces (20 triangles)\n let faces: number[][] = [\n [0, 11, 5], [0, 5, 1], [0, 1, 7], [0, 7, 10], [0, 10, 11],\n [1, 5, 9], [5, 11, 4], [11, 10, 2], [10, 7, 6], [7, 1, 8],\n [3, 9, 4], [3, 4, 2], [3, 2, 6], [3, 6, 8], [3, 8, 9],\n [4, 9, 5], [2, 4, 11], [6, 2, 10], [8, 6, 7], [9, 8, 1],\n ];\n\n // Midpoint cache for subdivision\n const midpointCache = new Map<string, number>();\n\n function getMidpoint(v1: number, v2: number): number {\n const key = v1 < v2 ? `${v1}_${v2}` : `${v2}_${v1}`;\n if (midpointCache.has(key)) {\n return midpointCache.get(key)!;\n }\n\n const i1 = v1 * 3;\n const i2 = v2 * 3;\n const mx = (vertices[i1] + vertices[i2]) / 2;\n const my = (vertices[i1 + 1] + vertices[i2 + 1]) / 2;\n const mz = (vertices[i1 + 2] + vertices[i2 + 2]) / 2;\n\n const idx = vertices.length / 3;\n vertices.push(mx, my, mz);\n midpointCache.set(key, idx);\n return idx;\n }\n\n // Subdivide\n for (let i = 0; i < subdivisions; i++) {\n const newFaces: number[][] = [];\n for (const [a, b, c] of faces) {\n const ab = getMidpoint(a, b);\n const bc = getMidpoint(b, c);\n const ca = getMidpoint(c, a);\n newFaces.push([a, ab, ca], [b, bc, ab], [c, ca, bc], [ab, bc, ca]);\n }\n faces = newFaces;\n midpointCache.clear();\n }\n\n // Normalize vertices to unit sphere\n const positions = new Float32Array(vertices.length);\n for (let i = 0; i < vertices.length; i += 3) {\n const x = vertices[i], y = vertices[i + 1], z = vertices[i + 2];\n const len = Math.sqrt(x * x + y * y + z * z);\n positions[i] = x / len;\n positions[i + 1] = y / len;\n positions[i + 2] = z / len;\n }\n\n // Flatten faces to indices\n const indices = new Uint16Array(faces.length * 3);\n for (let i = 0; i < faces.length; i++) {\n indices[i * 3] = faces[i][0];\n indices[i * 3 + 1] = faces[i][1];\n indices[i * 3 + 2] = faces[i][2];\n }\n\n return {\n positions,\n indices,\n vertexCount: positions.length / 3,\n indexCount: indices.length,\n };\n}\n\n/**\n * Generate UV sphere geometry.\n * Good for textured spheres, less uniform distribution.\n */\nexport function createUVSphere(segments = 16, rings = 12): GeometryData {\n const positions: number[] = [];\n const indices: number[] = [];\n\n // Generate vertices\n for (let ring = 0; ring <= rings; ring++) {\n const phi = (ring / rings) * Math.PI;\n const sinPhi = Math.sin(phi);\n const cosPhi = Math.cos(phi);\n\n for (let seg = 0; seg <= segments; seg++) {\n const theta = (seg / segments) * Math.PI * 2;\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n\n positions.push(\n sinPhi * cosTheta,\n cosPhi,\n sinPhi * sinTheta\n );\n }\n }\n\n // Generate indices\n for (let ring = 0; ring < rings; ring++) {\n for (let seg = 0; seg < segments; seg++) {\n const curr = ring * (segments + 1) + seg;\n const next = curr + segments + 1;\n\n indices.push(curr, next, curr + 1);\n indices.push(curr + 1, next, next + 1);\n }\n }\n\n return {\n positions: new Float32Array(positions),\n indices: new Uint16Array(indices),\n vertexCount: positions.length / 3,\n indexCount: indices.length,\n };\n}\n\n/**\n * Generate low-poly cube geometry.\n * Fastest option, good for distant/small bubbles.\n */\nexport function createCube(): GeometryData {\n const positions = new Float32Array([\n // Front\n -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1,\n // Back\n -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1,\n // Top\n -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1,\n // Bottom\n -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1,\n // Right\n 1, -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1,\n // Left\n -1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1,\n ]);\n\n // Normalize to unit sphere-ish\n for (let i = 0; i < positions.length; i += 3) {\n const x = positions[i], y = positions[i + 1], z = positions[i + 2];\n const len = Math.sqrt(x * x + y * y + z * z);\n positions[i] = x / len;\n positions[i + 1] = y / len;\n positions[i + 2] = z / len;\n }\n\n const indices = new Uint16Array([\n 0, 1, 2, 0, 2, 3, // Front\n 4, 5, 6, 4, 6, 7, // Back\n 8, 9, 10, 8, 10, 11, // Top\n 12, 13, 14, 12, 14, 15, // Bottom\n 16, 17, 18, 16, 18, 19, // Right\n 20, 21, 22, 20, 22, 23, // Left\n ]);\n\n return {\n positions,\n indices,\n vertexCount: 24,\n indexCount: 36,\n };\n}\n\n/**\n * Generate billboard quad (always faces camera).\n * Most efficient for large numbers of small points.\n */\nexport function createBillboardQuad(): GeometryData {\n const positions = new Float32Array([\n -1, -1, 0,\n 1, -1, 0,\n 1, 1, 0,\n -1, 1, 0,\n ]);\n\n const indices = new Uint16Array([0, 1, 2, 0, 2, 3]);\n\n return {\n positions,\n indices,\n vertexCount: 4,\n indexCount: 6,\n };\n}\n/**\n * Generate a standard AABB cube for voxels.\n */\nexport function createVoxelCube(): GeometryData {\n const positions = new Float32Array([\n // Front\n -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5,\n // Back\n -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5,\n // Top\n -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, -0.5,\n // Bottom\n -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5,\n // Right\n 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5,\n // Left\n -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5, 0.5, -0.5,\n ]);\n\n const indices = new Uint16Array([\n 0, 1, 2, 0, 2, 3, // Front\n 4, 5, 6, 4, 6, 7, // Back\n 8, 9, 10, 8, 10, 11, // Top\n 12, 13, 14, 12, 14, 15, // Bottom\n 16, 17, 18, 16, 18, 19, // Right\n 20, 21, 22, 20, 22, 23, // Left\n ]);\n\n return {\n positions,\n indices,\n vertexCount: 24,\n indexCount: 36,\n };\n}\n","/**\n * Instanced mesh for efficient rendering of many identical geometries.\n * Uses WebGL2 instanced rendering for single draw call performance.\n */\n\nimport type { GeometryData } from './geometry';\nimport type { ShaderProgram3D } from '../shader/programs';\n\nexport interface InstanceData {\n positions: Float32Array; // xyz per instance (length = instanceCount * 3)\n scales: Float32Array; // scale per instance (length = instanceCount)\n colors: Float32Array; // rgb per instance (length = instanceCount * 3)\n}\n\nexport interface InstancedMeshOptions {\n geometry: GeometryData;\n maxInstances?: number;\n}\n\nexport class InstancedMesh {\n private gl: WebGL2RenderingContext;\n private vao: WebGLVertexArrayObject | null = null;\n \n // Geometry buffers\n private positionBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n \n // Instance buffers\n private instancePosBuffer: WebGLBuffer | null = null;\n private instanceScaleBuffer: WebGLBuffer | null = null;\n private instanceColorBuffer: WebGLBuffer | null = null;\n \n private geometry: GeometryData;\n private maxInstances: number;\n private instanceCount = 0;\n \n constructor(gl: WebGL2RenderingContext, options: InstancedMeshOptions) {\n this.gl = gl;\n this.geometry = options.geometry;\n this.maxInstances = options.maxInstances ?? 100000;\n \n this.initBuffers();\n }\n \n private initBuffers(): void {\n const { gl, geometry, maxInstances } = this;\n \n // Create VAO\n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n // Geometry position buffer\n this.positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, geometry.positions, gl.STATIC_DRAW);\n \n // Index buffer\n this.indexBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, geometry.indices, gl.STATIC_DRAW);\n \n // Instance position buffer (vec3 per instance)\n this.instancePosBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instancePosBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, maxInstances * 3 * 4, gl.DYNAMIC_DRAW);\n \n // Instance scale buffer (float per instance)\n this.instanceScaleBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceScaleBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, maxInstances * 4, gl.DYNAMIC_DRAW);\n \n // Instance color buffer (vec3 per instance)\n this.instanceColorBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceColorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, maxInstances * 3 * 4, gl.DYNAMIC_DRAW);\n \n gl.bindVertexArray(null);\n }\n \n /**\n * Update instance data. Call before render.\n */\n updateInstances(data: InstanceData): void {\n const { gl, maxInstances } = this;\n \n this.instanceCount = Math.min(data.positions.length / 3, maxInstances);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.instancePosBuffer);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, data.positions);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceScaleBuffer);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, data.scales);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceColorBuffer);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, data.colors);\n }\n \n /**\n * Render all instances with given shader program.\n */\n render(program: ShaderProgram3D): void {\n const { gl, geometry, instanceCount } = this;\n \n if (instanceCount === 0) return;\n \n gl.bindVertexArray(this.vao);\n \n // Setup geometry position attribute\n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(posLoc, 0); // Per vertex\n }\n \n // Setup instance position attribute\n const instancePosLoc = program.attributes['a_instancePos'];\n if (instancePosLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instancePosBuffer);\n gl.enableVertexAttribArray(instancePosLoc);\n gl.vertexAttribPointer(instancePosLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(instancePosLoc, 1); // Per instance\n }\n \n // Setup instance scale attribute\n const scaleLoc = program.attributes['a_scale'];\n if (scaleLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceScaleBuffer);\n gl.enableVertexAttribArray(scaleLoc);\n gl.vertexAttribPointer(scaleLoc, 1, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(scaleLoc, 1); // Per instance\n }\n \n // Setup instance color attribute\n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceColorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(colorLoc, 1); // Per instance\n }\n \n // Bind index buffer and draw\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.drawElementsInstanced(\n gl.TRIANGLES,\n geometry.indexCount,\n gl.UNSIGNED_SHORT,\n 0,\n instanceCount\n );\n \n gl.bindVertexArray(null);\n }\n \n /**\n * Get current instance count.\n */\n getInstanceCount(): number {\n return this.instanceCount;\n }\n \n /**\n * Clean up WebGL resources.\n */\n destroy(): void {\n const { gl } = this;\n \n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.indexBuffer) gl.deleteBuffer(this.indexBuffer);\n if (this.instancePosBuffer) gl.deleteBuffer(this.instancePosBuffer);\n if (this.instanceScaleBuffer) gl.deleteBuffer(this.instanceScaleBuffer);\n if (this.instanceColorBuffer) gl.deleteBuffer(this.instanceColorBuffer);\n \n this.vao = null;\n this.positionBuffer = null;\n this.indexBuffer = null;\n this.instancePosBuffer = null;\n this.instanceScaleBuffer = null;\n this.instanceColorBuffer = null;\n }\n}\n","/**\n * Main 3D Bubble renderer integrating all components.\n * Provides a high-level API for rendering instanced 3D bubbles.\n */\n\nimport { OrbitCamera, type OrbitCameraOptions } from './camera/OrbitCamera';\nimport { OrbitController, type OrbitControllerOptions } from './controls/OrbitController';\nimport {\n createIcosphere,\n createUVSphere,\n createCube,\n type GeometryData,\n} from './mesh/geometry';\nimport { InstancedMesh, type InstanceData } from './mesh/InstancedMesh';\nimport {\n createProgramBundle3D,\n deleteProgramBundle,\n type ProgramBundle3D,\n} from './shader/programs';\nimport { Axes3D, type Axes3DOptions } from './Axes3D';\nimport {\n createRayFromScreen,\n pickBubble,\n type Ray3D,\n type HitResult,\n} from './Raycaster3D';\nimport type {\n Bubble3DData,\n Bubble3DStyle,\n Renderer3DOptions,\n Bounds3D,\n RenderStats3D,\n Renderer3DEvent,\n Renderer3DEventCallback,\n} from './types';\nimport { Tooltip3D, type Tooltip3DOptions, type Tooltip3DData } from './Tooltip3D';\nimport { createTheme, type CustomThemeOptions, type ColorTheme } from './colorThemes';\n\nexport interface Bubble3DRendererOptions extends Renderer3DOptions {\n camera?: OrbitCameraOptions;\n controls?: OrbitControllerOptions;\n style?: Bubble3DStyle;\n autoRender?: boolean;\n /** Axes configuration */\n axes?: Axes3DOptions;\n /** Show axes (default: true) */\n showAxes?: boolean;\n /** Enable tooltips on hover (default: true) */\n enableTooltip?: boolean;\n /** Tooltip configuration */\n tooltip?: Tooltip3DOptions;\n /** Custom tooltip formatter */\n tooltipFormatter?: (data: Tooltip3DData) => string;\n /** Color theme options */\n theme?: CustomThemeOptions;\n}\n\nexport class Bubble3DRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGL2RenderingContext;\n private dpr: number;\n \n private programs: ProgramBundle3D;\n private mesh: InstancedMesh;\n private camera: OrbitCamera;\n private controller: OrbitController;\n private axes: Axes3D | null = null;\n \n private backgroundColor: [number, number, number, number] = [0.05, 0.05, 0.1, 1];\n private style: Required<Bubble3DStyle>;\n private showAxes: boolean;\n \n private instanceData: InstanceData | null = null;\n private bounds: Bounds3D | null = null;\n \n private animationFrameId: number | null = null;\n private autoRender: boolean;\n private needsRender = true;\n \n private eventListeners: Map<string, Set<Renderer3DEventCallback>> = new Map();\n \n // Tooltip\n private tooltip: Tooltip3D | null = null;\n private enableTooltip: boolean;\n private lastHitIndex = -1;\n private boundHandleMouseMove: ((e: MouseEvent) => void) | null = null;\n private boundHandleMouseLeave: (() => void) | null = null;\n \n // Stats\n private lastFrameTime = 0;\n private frameCount = 0;\n private fps = 0;\n private lastFpsUpdate = 0;\n \n // Color theme\n private colorTheme: ColorTheme;\n \n constructor(options: Bubble3DRendererOptions) {\n this.canvas = options.canvas;\n this.dpr = window.devicePixelRatio || 1;\n this.autoRender = options.autoRender ?? true;\n this.showAxes = options.showAxes ?? true;\n \n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor;\n }\n \n // Initialize color theme\n this.colorTheme = createTheme(options.theme || {}, this.backgroundColor);\n \n // Initialize style with defaults (using theme colors)\n this.style = {\n opacity: options.style?.opacity ?? 1,\n defaultColor: options.style?.defaultColor ?? this.colorTheme.seriesPalette[0],\n defaultScale: options.style?.defaultScale ?? 0.1,\n geometry: options.style?.geometry ?? 'icosphere',\n subdivisions: options.style?.subdivisions ?? 1,\n enableLighting: options.style?.enableLighting ?? true,\n lightDirection: options.style?.lightDirection ?? [1, 1, 1],\n ambient: options.style?.ambient ?? 0.4,\n };\n \n // Initialize WebGL2 context\n const gl = this.canvas.getContext('webgl2', {\n alpha: true,\n antialias: options.antialias ?? true,\n preserveDrawingBuffer: options.preserveDrawingBuffer ?? false,\n powerPreference: options.powerPreference ?? 'high-performance',\n });\n \n if (!gl) {\n throw new Error('WebGL2 not supported');\n }\n \n this.gl = gl;\n \n // Enable depth testing and blending\n gl.enable(gl.DEPTH_TEST);\n gl.depthFunc(gl.LEQUAL);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n \n // Create shader programs\n this.programs = createProgramBundle3D(gl);\n \n // Create geometry based on style\n const geometry = this.createGeometry();\n \n // Create instanced mesh\n this.mesh = new InstancedMesh(gl, {\n geometry,\n maxInstances: options.maxInstances ?? 100000,\n });\n \n // Create camera\n this.camera = new OrbitCamera(options.camera);\n \n // Create controller\n this.controller = new OrbitController(\n this.camera,\n this.canvas,\n options.controls\n );\n \n // Setup controller callback\n this.controller.onChange(() => {\n this.needsRender = true;\n this.emitEvent('cameraChange');\n });\n \n // Create axes renderer\n if (this.showAxes) {\n this.axes = new Axes3D(this.gl, options.axes);\n }\n \n // Initialize tooltip\n this.enableTooltip = options.enableTooltip ?? true;\n if (this.enableTooltip) {\n const tooltipOptions: Tooltip3DOptions = {\n ...options.tooltip,\n formatter: options.tooltipFormatter,\n };\n this.tooltip = new Tooltip3D(this.canvas.parentElement || document.body, tooltipOptions);\n \n // Setup hover handlers\n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseLeave = this.handleMouseLeave.bind(this);\n this.canvas.addEventListener('mousemove', this.boundHandleMouseMove);\n this.canvas.addEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n \n // Handle resize\n this.resize();\n window.addEventListener('resize', this.handleResize);\n \n // Start render loop if autoRender\n if (this.autoRender) {\n this.startRenderLoop();\n }\n }\n \n private handleMouseMove(e: MouseEvent): void {\n if (!this.tooltip || !this.instanceData) return;\n \n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n \n const hit = this.pickAtScreen(x, y);\n \n if (hit) {\n if (hit.index !== this.lastHitIndex) {\n this.lastHitIndex = hit.index;\n \n const bubbleData = this.getBubbleData(hit.index);\n if (bubbleData) {\n this.tooltip.show({\n index: hit.index,\n position: bubbleData.position,\n color: bubbleData.color,\n scale: bubbleData.scale,\n }, x, y);\n \n this.emitEvent('hover');\n }\n } else {\n this.tooltip.updatePosition(x, y);\n }\n } else {\n if (this.lastHitIndex !== -1) {\n this.tooltip.hide();\n this.lastHitIndex = -1;\n }\n }\n }\n \n private handleMouseLeave(): void {\n if (this.tooltip) {\n this.tooltip.hide();\n this.lastHitIndex = -1;\n }\n }\n \n private createGeometry(): GeometryData {\n switch (this.style.geometry) {\n case 'uvsphere':\n return createUVSphere(16, 12);\n case 'cube':\n return createCube();\n case 'icosphere':\n default:\n return createIcosphere(this.style.subdivisions);\n }\n }\n \n private handleResize = (): void => {\n this.resize();\n this.needsRender = true;\n this.emitEvent('resize');\n };\n \n /**\n * Resize canvas to match display size.\n */\n resize(): void {\n const rect = this.canvas.getBoundingClientRect();\n const width = rect.width * this.dpr;\n const height = rect.height * this.dpr;\n \n if (this.canvas.width !== width || this.canvas.height !== height) {\n this.canvas.width = width;\n this.canvas.height = height;\n this.gl.viewport(0, 0, width, height);\n this.camera.setAspect(width / height);\n }\n }\n \n /**\n * Set bubble data for rendering.\n */\n setData(data: Bubble3DData): void {\n const count = data.positions.length / 3;\n \n // Create scales array if not provided\n const scales = data.scales ?? new Float32Array(count).fill(this.style.defaultScale);\n \n // Create colors array if not provided\n let colors: Float32Array;\n if (data.colors) {\n colors = data.colors;\n } else {\n colors = new Float32Array(count * 3);\n const [r, g, b] = this.style.defaultColor;\n for (let i = 0; i < count; i++) {\n colors[i * 3] = r;\n colors[i * 3 + 1] = g;\n colors[i * 3 + 2] = b;\n }\n }\n \n this.instanceData = {\n positions: data.positions,\n scales,\n colors,\n };\n \n // Calculate bounds\n this.bounds = this.calculateBounds(data.positions);\n \n // Update axes with new bounds\n if (this.axes && this.bounds) {\n this.axes.updateBounds(this.bounds);\n }\n \n // Update mesh\n this.mesh.updateInstances(this.instanceData);\n \n this.needsRender = true;\n this.emitEvent('dataUpdate');\n }\n \n private calculateBounds(positions: Float32Array): Bounds3D {\n let minX = Infinity, maxX = -Infinity;\n let minY = Infinity, maxY = -Infinity;\n let minZ = Infinity, maxZ = -Infinity;\n \n for (let i = 0; i < positions.length; i += 3) {\n const x = positions[i];\n const y = positions[i + 1];\n const z = positions[i + 2];\n \n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n if (z < minZ) minZ = z;\n if (z > maxZ) maxZ = z;\n }\n \n return { minX, maxX, minY, maxY, minZ, maxZ };\n }\n \n /**\n * Fit camera to view all data.\n */\n fitToData(): void {\n if (this.bounds) {\n const { minX, maxX, minY, maxY, minZ, maxZ } = this.bounds;\n \n const dx = maxX - minX;\n const dy = maxY - minY;\n const dz = maxZ - minZ;\n const padding = 0.01;\n \n this.camera.fitToBounds(\n minX - dx * padding, minY - dy * padding, minZ - dz * padding,\n maxX + dx * padding, maxY + dy * padding, maxZ + dz * padding\n );\n \n this.camera.radius *= 1.05;\n this.needsRender = true;\n }\n }\n \n /**\n * Render a single frame.\n */\n render(): void {\n const { gl, programs, mesh, camera, style, backgroundColor } = this;\n \n const startTime = performance.now();\n \n // Clear\n gl.clearColor(\n backgroundColor[0],\n backgroundColor[1],\n backgroundColor[2],\n backgroundColor[3]\n );\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n \n if (!this.instanceData) return;\n \n // Get view projection matrix\n const viewProj = camera.getViewProjectionMatrix();\n \n // Render axes first (behind bubbles)\n if (this.axes) {\n this.axes.render(viewProj);\n }\n \n // Now set up and render bubbles\n // Select program based on lighting\n const program = style.enableLighting\n ? programs.bubbleProgram\n : programs.bubbleFlatProgram;\n \n gl.useProgram(program.program);\n \n // Set uniforms\n gl.uniformMatrix4fv(program.uniforms['u_viewProjection'], false, viewProj);\n gl.uniform1f(program.uniforms['u_opacity'], style.opacity);\n \n if (style.enableLighting) {\n const [lx, ly, lz] = style.lightDirection;\n gl.uniform3f(program.uniforms['u_lightDir'], lx, ly, lz);\n gl.uniform1f(program.uniforms['u_ambient'], style.ambient);\n }\n \n // Render instances\n mesh.render(program);\n \n // Update stats\n const frameTime = performance.now() - startTime;\n this.lastFrameTime = frameTime;\n this.frameCount++;\n \n const now = performance.now();\n if (now - this.lastFpsUpdate >= 1000) {\n this.fps = this.frameCount;\n this.frameCount = 0;\n this.lastFpsUpdate = now;\n }\n \n this.emitEvent('render');\n }\n \n /**\n * Start automatic render loop.\n */\n startRenderLoop(): void {\n if (this.animationFrameId !== null) return;\n \n const loop = (): void => {\n // Update controller damping\n const moving = this.controller.update();\n \n if (this.needsRender || moving) {\n this.render();\n this.needsRender = false;\n }\n \n this.animationFrameId = requestAnimationFrame(loop);\n };\n \n this.animationFrameId = requestAnimationFrame(loop);\n }\n \n /**\n * Stop automatic render loop.\n */\n stopRenderLoop(): void {\n if (this.animationFrameId !== null) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n }\n \n /**\n * Request a render on next frame.\n */\n requestRender(): void {\n this.needsRender = true;\n }\n \n /**\n * Get render statistics.\n */\n getStats(): RenderStats3D {\n return {\n instanceCount: this.mesh.getInstanceCount(),\n drawCalls: 1,\n frameTime: this.lastFrameTime,\n fps: this.fps,\n };\n }\n \n /**\n * Get camera instance for direct manipulation.\n */\n getCamera(): OrbitCamera {\n return this.camera;\n }\n \n /**\n * Get controller instance for configuration.\n */\n getController(): OrbitController {\n return this.controller;\n }\n \n /**\n * Update style options.\n */\n setStyle(style: Partial<Bubble3DStyle>): void {\n Object.assign(this.style, style);\n this.needsRender = true;\n }\n \n /**\n * Set background color.\n */\n setBackgroundColor(r: number, g: number, b: number, a = 1): void {\n this.backgroundColor = [r, g, b, a];\n this.needsRender = true;\n }\n \n /**\n * Add event listener.\n */\n on(event: string, callback: Renderer3DEventCallback): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n \n /**\n * Remove event listener.\n */\n off(event: string, callback: Renderer3DEventCallback): void {\n this.eventListeners.get(event)?.delete(callback);\n }\n \n private emitEvent(type: string): void {\n const listeners = this.eventListeners.get(type);\n if (!listeners) return;\n \n const event: Renderer3DEvent = {\n type: type as any,\n timestamp: performance.now(),\n stats: this.getStats(),\n camera: {\n target: [...this.camera.target] as [number, number, number],\n radius: this.camera.radius,\n theta: this.camera.theta,\n phi: this.camera.phi,\n fov: this.camera.fov,\n },\n };\n \n listeners.forEach(callback => {\n callback(event);\n });\n }\n \n /**\n * Get axis labels for 2D text overlay rendering.\n * Returns labels with world positions that need to be projected to screen.\n */\n getAxisLabels(): { text: string; worldPosition: [number, number, number]; axis: string; color: [number, number, number] }[] {\n if (!this.axes) return [];\n return this.axes.getLabels();\n }\n \n /**\n * Project world coordinates to screen coordinates.\n * Useful for positioning 2D overlay text.\n */\n projectToScreen(worldPos: [number, number, number]): { x: number; y: number; visible: boolean } {\n if (!this.axes) return { x: 0, y: 0, visible: false };\n \n const viewProj = this.camera.getViewProjectionMatrix();\n const rect = this.canvas.getBoundingClientRect();\n \n return this.axes.projectToScreen(worldPos, viewProj, rect.width, rect.height);\n }\n \n /**\n * Get the current view-projection matrix.\n */\n getViewProjectionMatrix(): Float32Array {\n return this.camera.getViewProjectionMatrix();\n }\n \n /**\n * Get canvas dimensions.\n */\n getCanvasSize(): { width: number; height: number } {\n const rect = this.canvas.getBoundingClientRect();\n return { width: rect.width, height: rect.height };\n }\n \n /**\n * Get WebGL context info.\n */\n getContextInfo(): Record<string, any> {\n const { gl } = this;\n return {\n renderer: gl.getParameter(gl.RENDERER),\n vendor: gl.getParameter(gl.VENDOR),\n version: gl.getParameter(gl.VERSION),\n maxTextureSize: gl.getParameter(gl.MAX_TEXTURE_SIZE),\n maxVertexAttribs: gl.getParameter(gl.MAX_VERTEX_ATTRIBS),\n maxVertexUniformVectors: gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS),\n };\n }\n \n /**\n * Pick a bubble at screen coordinates.\n * @param screenX X coordinate relative to canvas\n * @param screenY Y coordinate relative to canvas\n * @returns Hit result with bubble index, or null if no hit\n */\n pickAtScreen(screenX: number, screenY: number): HitResult | null {\n if (!this.instanceData) return null;\n \n const { width, height } = this.getCanvasSize();\n const viewProj = this.camera.getViewProjectionMatrix();\n \n const ray = createRayFromScreen(screenX, screenY, width, height, viewProj);\n \n return pickBubble(ray, this.instanceData.positions, this.instanceData.scales);\n }\n \n /**\n * Create a ray from screen coordinates.\n * Useful for custom picking logic.\n */\n createRay(screenX: number, screenY: number): Ray3D {\n const { width, height } = this.getCanvasSize();\n const viewProj = this.camera.getViewProjectionMatrix();\n return createRayFromScreen(screenX, screenY, width, height, viewProj);\n }\n \n /**\n * Get data for a specific bubble by index.\n */\n getBubbleData(index: number): { position: [number, number, number]; color: [number, number, number]; scale: number } | null {\n if (!this.instanceData || index < 0 || index >= this.instanceData.scales.length) {\n return null;\n }\n \n const i3 = index * 3;\n return {\n position: [\n this.instanceData.positions[i3],\n this.instanceData.positions[i3 + 1],\n this.instanceData.positions[i3 + 2],\n ],\n color: [\n this.instanceData.colors[i3],\n this.instanceData.colors[i3 + 1],\n this.instanceData.colors[i3 + 2],\n ],\n scale: this.instanceData.scales[index],\n };\n }\n /**\n * Export the current view as an image.\n * @param format Image format ('png' | 'jpeg' | 'webp')\n * @param quality Quality for jpeg/webp (0-1)\n * @param transparent Use transparent background (only for 'png')\n * @returns Data URL of the image\n */\n exportImage(\n format: 'png' | 'jpeg' | 'webp' = 'png',\n quality = 0.92,\n transparent = false\n ): string {\n // Save current background\n const savedBg = [...this.backgroundColor];\n \n // Set transparent background if requested\n if (transparent && format === 'png') {\n this.backgroundColor = [0, 0, 0, 0];\n }\n \n // Force a render to capture current state\n this.render();\n \n // Restore background\n this.backgroundColor = savedBg as [number, number, number, number];\n \n // Export canvas\n const mimeType = `image/${format}`;\n return this.canvas.toDataURL(mimeType, quality);\n }\n \n /**\n * Export the current view as a Blob.\n * @param format Image format ('png' | 'jpeg' | 'webp')\n * @param quality Quality for jpeg/webp (0-1)\n * @returns Promise that resolves to Blob\n */\n async exportImageBlob(\n format: 'png' | 'jpeg' | 'webp' = 'png',\n quality = 0.92\n ): Promise<Blob | null> {\n return new Promise((resolve) => {\n this.render();\n const mimeType = `image/${format}`;\n this.canvas.toBlob(resolve, mimeType, quality);\n });\n }\n \n /**\n * Download the current view as an image file.\n * @param filename Filename without extension\n * @param format Image format\n * @param quality Quality for jpeg/webp\n */\n downloadImage(\n filename = 'chart-3d',\n format: 'png' | 'jpeg' | 'webp' = 'png',\n quality = 0.92\n ): void {\n const dataUrl = this.exportImage(format, quality);\n const link = document.createElement('a');\n link.download = `${filename}.${format}`;\n link.href = dataUrl;\n link.click();\n }\n \n /**\n * Clean up all resources.\n */\n destroy(): void {\n this.stopRenderLoop();\n \n window.removeEventListener('resize', this.handleResize);\n \n // Clean up tooltip\n if (this.tooltip) {\n this.tooltip.destroy();\n if (this.boundHandleMouseMove) {\n this.canvas.removeEventListener('mousemove', this.boundHandleMouseMove);\n }\n if (this.boundHandleMouseLeave) {\n this.canvas.removeEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n }\n \n this.controller.destroy();\n this.mesh.destroy();\n deleteProgramBundle(this.gl, this.programs);\n \n if (this.axes) {\n this.axes.destroy();\n }\n \n this.eventListeners.clear();\n }\n}\n","/**\n * Impulse 3D Renderer\n * Renders stem/impulse plots with vertical lines from base plane to data points.\n * Uses cylinder geometry for smooth stems.\n */\n\nimport { OrbitCamera, type OrbitCameraOptions } from './camera/OrbitCamera';\nimport { OrbitController, type OrbitControllerOptions } from './controls/OrbitController';\nimport {\n createProgramBundle3D,\n deleteProgramBundle,\n type ProgramBundle3D,\n} from './shader/programs';\nimport { Axes3D, type Axes3DOptions } from './Axes3D';\nimport { Tooltip3D, type Tooltip3DOptions } from './Tooltip3D';\nimport type {\n Renderer3DOptions,\n Bounds3D,\n RenderStats3D,\n Renderer3DEvent,\n Renderer3DEventCallback,\n} from './types';\nimport { createTheme, type CustomThemeOptions, type ColorTheme } from './colorThemes';\nimport { createRayFromScreen, pickImpulse } from './Raycaster3D';\n\nexport interface ImpulseSeriesData {\n /** X coordinates */\n x: Float32Array;\n /** Y coordinates (top of stems) */\n y: Float32Array;\n /** Z coordinates */\n z: Float32Array;\n /** Base Y value (default: 0) */\n baseY?: number;\n /** Color per point (RGB) */\n colors?: Float32Array;\n /** Single color for all stems */\n color?: [number, number, number];\n}\n\nexport interface Impulse3DRendererOptions extends Renderer3DOptions {\n camera?: OrbitCameraOptions;\n controls?: OrbitControllerOptions;\n axes?: Axes3DOptions;\n showAxes?: boolean;\n /** Stem thickness (default: 0.03) */\n stemWidth?: number;\n /** Number of sides for cylinder (default: 6) */\n stemSides?: number;\n /** Show marker at top of stem (default: true) */\n showMarkers?: boolean;\n /** Marker size multiplier (default: 2) */\n markerSize?: number;\n /** Enable tooltips (default: true) */\n enableTooltip?: boolean;\n tooltip?: Tooltip3DOptions;\n /** Color theme options */\n theme?: CustomThemeOptions;\n}\n\nexport class Impulse3DRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGL2RenderingContext;\n private dpr: number;\n \n private programs: ProgramBundle3D;\n private camera: OrbitCamera;\n private controller: OrbitController;\n private axes: Axes3D | null = null;\n \n // Stem geometry buffers\n private stemVao: WebGLVertexArrayObject | null = null;\n private stemPositionBuffer: WebGLBuffer | null = null;\n private stemNormalBuffer: WebGLBuffer | null = null;\n private stemColorBuffer: WebGLBuffer | null = null;\n private stemIndexBuffer: WebGLBuffer | null = null;\n private stemIndexCount = 0;\n \n // Marker geometry buffers (spheres at top)\n private markerVao: WebGLVertexArrayObject | null = null;\n private markerPositionBuffer: WebGLBuffer | null = null;\n private markerNormalBuffer: WebGLBuffer | null = null;\n private markerColorBuffer: WebGLBuffer | null = null;\n private markerIndexBuffer: WebGLBuffer | null = null;\n private markerIndexCount = 0;\n \n private backgroundColor: [number, number, number, number] = [0.05, 0.05, 0.1, 1];\n private showAxes: boolean;\n private stemWidth: number;\n private stemSides: number;\n private showMarkers: boolean;\n private markerSize: number;\n \n private impulseData: ImpulseSeriesData | null = null;\n private bounds: Bounds3D | null = null;\n \n private animationFrameId: number | null = null;\n private needsRender = true;\n \n private eventListeners: Map<string, Set<Renderer3DEventCallback>> = new Map();\n \n // Tooltip\n private tooltip: Tooltip3D | null = null;\n private enableTooltip: boolean;\n private lastHitIndex: number = -1;\n private boundHandleMouseMove?: (e: MouseEvent) => void;\n private boundHandleMouseLeave?: () => void;\n \n // Stats\n private lastFrameTime = 0;\n private frameCount = 0;\n private fps = 0;\n private lastFpsUpdate = 0;\n \n // Color theme\n private colorTheme: ColorTheme;\n \n constructor(options: Impulse3DRendererOptions) {\n this.canvas = options.canvas;\n this.dpr = window.devicePixelRatio || 1;\n this.showAxes = options.showAxes ?? true;\n this.stemWidth = options.stemWidth ?? 0.03;\n this.stemSides = options.stemSides ?? 6;\n this.showMarkers = options.showMarkers ?? true;\n this.markerSize = options.markerSize ?? 2;\n this.enableTooltip = options.enableTooltip ?? true;\n \n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor;\n }\n \n // Initialize color theme\n this.colorTheme = createTheme(options.theme || {}, this.backgroundColor);\n \n // Get WebGL2 context\n const gl = this.canvas.getContext('webgl2', {\n alpha: true,\n antialias: true,\n preserveDrawingBuffer: false,\n });\n \n if (!gl) {\n throw new Error('WebGL2 not supported');\n }\n this.gl = gl;\n \n // Enable depth testing\n gl.enable(gl.DEPTH_TEST);\n gl.depthFunc(gl.LEQUAL);\n \n // Create shader programs\n this.programs = createProgramBundle3D(gl);\n \n // Create buffers\n this.initBuffers();\n \n // Create camera\n this.camera = new OrbitCamera(options.camera);\n \n // Create controller\n this.controller = new OrbitController(this.camera, this.canvas, options.controls);\n this.controller.onChange(() => {\n this.needsRender = true;\n this.emitEvent('cameraChange');\n });\n \n // Create axes\n if (this.showAxes) {\n this.axes = new Axes3D(gl, options.axes);\n }\n \n // Initialize tooltip\n if (this.enableTooltip) {\n this.tooltip = new Tooltip3D(this.canvas.parentElement || document.body, options.tooltip);\n \n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseLeave = this.handleMouseLeave.bind(this);\n this.canvas.addEventListener('mousemove', this.boundHandleMouseMove);\n this.canvas.addEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n \n // Handle resize\n this.resize();\n window.addEventListener('resize', this.handleResize);\n \n // Start render loop\n this.startRenderLoop();\n }\n\n private handleMouseMove(e: MouseEvent): void {\n if (!this.tooltip || !this.impulseData) return;\n \n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n \n const hit = this.pickAtScreen(x, y);\n \n if (hit) {\n if (hit.index !== this.lastHitIndex) {\n this.lastHitIndex = hit.index;\n const i3 = hit.index * 3;\n const color: [number, number, number] = this.impulseData.colors \n ? [this.impulseData.colors[i3], this.impulseData.colors[i3+1], this.impulseData.colors[i3+2]]\n : (this.impulseData.color || [0.5, 0.7, 1.0]);\n \n this.tooltip.show({\n index: hit.index,\n position: [this.impulseData.x[hit.index], this.impulseData.y[hit.index], this.impulseData.z[hit.index]],\n color: color,\n }, x, y);\n } else {\n this.tooltip.updatePosition(x, y);\n }\n } else {\n if (this.lastHitIndex !== -1) {\n this.tooltip.hide();\n this.lastHitIndex = -1;\n }\n }\n }\n\n private handleMouseLeave(): void {\n if (this.tooltip) {\n this.tooltip.hide();\n this.lastHitIndex = -1;\n }\n }\n\n pickAtScreen(screenX: number, screenY: number) {\n if (!this.impulseData) return null;\n \n const { width, height } = this.getCanvasSize();\n const viewProj = this.camera.getViewProjectionMatrix();\n const ray = createRayFromScreen(screenX, screenY, width, height, viewProj);\n \n return pickImpulse(ray, this.impulseData, this.stemWidth * 4);\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n // Stem buffers\n this.stemVao = gl.createVertexArray();\n this.stemPositionBuffer = gl.createBuffer();\n this.stemNormalBuffer = gl.createBuffer();\n this.stemColorBuffer = gl.createBuffer();\n this.stemIndexBuffer = gl.createBuffer();\n \n // Marker buffers\n this.markerVao = gl.createVertexArray();\n this.markerPositionBuffer = gl.createBuffer();\n this.markerNormalBuffer = gl.createBuffer();\n this.markerColorBuffer = gl.createBuffer();\n this.markerIndexBuffer = gl.createBuffer();\n }\n \n private handleResize = (): void => {\n this.resize();\n this.needsRender = true;\n };\n \n resize(): void {\n const { canvas, gl, dpr, camera } = this;\n \n const width = canvas.clientWidth;\n const height = canvas.clientHeight;\n \n canvas.width = width * dpr;\n canvas.height = height * dpr;\n \n gl.viewport(0, 0, canvas.width, canvas.height);\n camera.aspect = width / height;\n }\n \n /**\n * Set impulse data\n */\n setData(data: ImpulseSeriesData): void {\n this.impulseData = data;\n this.buildGeometry();\n this.calculateBounds();\n \n if (this.axes && this.bounds) {\n this.axes.updateBounds(this.bounds);\n }\n \n this.needsRender = true;\n this.emitEvent('dataUpdate');\n }\n \n private buildGeometry(): void {\n if (!this.impulseData) return;\n \n this.buildStemGeometry();\n if (this.showMarkers) {\n this.buildMarkerGeometry();\n }\n }\n \n private buildStemGeometry(): void {\n const { gl, stemWidth, stemSides, impulseData } = this;\n if (!impulseData) return;\n \n const count = impulseData.x.length;\n const defaultColor = impulseData.color ?? this.colorTheme.seriesPalette[0] as [number, number, number];\n const baseY = impulseData.baseY ?? 0;\n \n const allPositions: number[] = [];\n const allNormals: number[] = [];\n const allColors: number[] = [];\n const allIndices: number[] = [];\n let vertexOffset = 0;\n \n for (let i = 0; i < count; i++) {\n const x = impulseData.x[i];\n const y = impulseData.y[i];\n const z = impulseData.z[i];\n \n const r = impulseData.colors ? impulseData.colors[i * 3] : defaultColor[0];\n const g = impulseData.colors ? impulseData.colors[i * 3 + 1] : defaultColor[1];\n const b = impulseData.colors ? impulseData.colors[i * 3 + 2] : defaultColor[2];\n \n // Create cylinder for each stem\n // Bottom ring\n for (let s = 0; s <= stemSides; s++) {\n const angle = (s / stemSides) * Math.PI * 2;\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n \n const ox = cos * stemWidth;\n const oz = sin * stemWidth;\n \n // Bottom vertex\n allPositions.push(x + ox, baseY, z + oz);\n allNormals.push(cos, 0, sin);\n allColors.push(r * 0.5, g * 0.5, b * 0.5); // Darker at base\n \n // Top vertex\n allPositions.push(x + ox, y, z + oz);\n allNormals.push(cos, 0, sin);\n allColors.push(r, g, b);\n }\n \n // Indices for cylinder\n for (let s = 0; s < stemSides; s++) {\n const bl = vertexOffset + s * 2;\n const br = bl + 2;\n const tl = bl + 1;\n const tr = br + 1;\n \n allIndices.push(bl, br, tl);\n allIndices.push(tl, br, tr);\n }\n \n vertexOffset += (stemSides + 1) * 2;\n }\n \n // Upload to GPU\n const positions = new Float32Array(allPositions);\n const normals = new Float32Array(allNormals);\n const colors = new Float32Array(allColors);\n const indices = new Uint32Array(allIndices);\n \n this.stemIndexCount = indices.length;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.stemPositionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.stemNormalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, normals, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.stemColorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.stemIndexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n }\n \n private buildMarkerGeometry(): void {\n const { gl, stemWidth, markerSize, impulseData } = this;\n if (!impulseData) return;\n \n const count = impulseData.x.length;\n const defaultColor = impulseData.color ?? this.colorTheme.seriesPalette[0] as [number, number, number];\n const radius = stemWidth * markerSize;\n \n // Simple octahedron for markers (fast)\n const allPositions: number[] = [];\n const allNormals: number[] = [];\n const allColors: number[] = [];\n const allIndices: number[] = [];\n let vertexOffset = 0;\n \n // Octahedron template\n const octVerts = [\n [0, 1, 0], [1, 0, 0], [0, 0, 1],\n [-1, 0, 0], [0, 0, -1], [0, -1, 0]\n ];\n const octFaces = [\n [0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 1],\n [5, 2, 1], [5, 3, 2], [5, 4, 3], [5, 1, 4]\n ];\n \n for (let i = 0; i < count; i++) {\n const x = impulseData.x[i];\n const y = impulseData.y[i];\n const z = impulseData.z[i];\n \n const r = impulseData.colors ? impulseData.colors[i * 3] : defaultColor[0];\n const g = impulseData.colors ? impulseData.colors[i * 3 + 1] : defaultColor[1];\n const b = impulseData.colors ? impulseData.colors[i * 3 + 2] : defaultColor[2];\n \n // Add octahedron vertices\n for (const [ox, oy, oz] of octVerts) {\n allPositions.push(x + ox * radius, y + oy * radius, z + oz * radius);\n allNormals.push(ox, oy, oz);\n allColors.push(r, g, b);\n }\n \n // Add octahedron faces\n for (const [a, b2, c] of octFaces) {\n allIndices.push(vertexOffset + a, vertexOffset + b2, vertexOffset + c);\n }\n \n vertexOffset += 6;\n }\n \n // Upload to GPU\n const positions = new Float32Array(allPositions);\n const normals = new Float32Array(allNormals);\n const colors = new Float32Array(allColors);\n const indices = new Uint32Array(allIndices);\n \n this.markerIndexCount = indices.length;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.markerPositionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.markerNormalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, normals, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.markerColorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.markerIndexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n }\n \n private calculateBounds(): void {\n if (!this.impulseData) {\n this.bounds = null;\n return;\n }\n \n const data = this.impulseData;\n const baseY = data.baseY ?? 0;\n \n let minX = Infinity, maxX = -Infinity;\n const minY = baseY;\n let maxY = -Infinity;\n let minZ = Infinity, maxZ = -Infinity;\n \n for (let i = 0; i < data.x.length; i++) {\n if (data.x[i] < minX) minX = data.x[i];\n if (data.x[i] > maxX) maxX = data.x[i];\n if (data.y[i] > maxY) maxY = data.y[i];\n if (data.z[i] < minZ) minZ = data.z[i];\n if (data.z[i] > maxZ) maxZ = data.z[i];\n }\n \n this.bounds = { minX, maxX, minY, maxY, minZ, maxZ };\n }\n \n /**\n * Fit camera to show all data\n */\n fitToData(): void {\n if (!this.bounds) return;\n \n const { minX, maxX, minY, maxY, minZ, maxZ } = this.bounds;\n \n // Add 20% padding to bounds for better fit\n const dx = maxX - minX;\n const dy = maxY - minY;\n const dz = maxZ - minZ;\n const padding = 0.05;\n \n this.camera.fitToBounds(\n minX - dx * padding, minY - dy * padding, minZ - dz * padding,\n maxX + dx * padding, maxY + dy * padding, maxZ + dz * padding\n );\n \n // Closer fit\n this.camera.radius *= 1.0;\n \n this.needsRender = true;\n }\n \n getCanvasSize(): { width: number; height: number } {\n const rect = this.canvas.getBoundingClientRect();\n return { width: rect.width, height: rect.height };\n }\n\n /**\n * Render a single frame\n */\n render(): void {\n const { gl, camera, backgroundColor } = this;\n \n const startTime = performance.now();\n \n // Clear\n gl.clearColor(\n backgroundColor[0],\n backgroundColor[1],\n backgroundColor[2],\n backgroundColor[3]\n );\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n \n // Get view projection matrix\n const viewProj = camera.getViewProjectionMatrix();\n \n // Render axes first\n if (this.axes) {\n this.axes.render(viewProj);\n }\n \n const program = this.programs.surfaceProgram;\n gl.useProgram(program.program);\n \n gl.uniformMatrix4fv(program.uniforms['u_viewProjection'], false, viewProj);\n gl.uniform1f(program.uniforms['u_opacity'], 1.0);\n gl.uniform3f(program.uniforms['u_lightDir'], 1, 1, 1);\n gl.uniform1f(program.uniforms['u_ambient'], 0.4);\n \n // Render stems\n if (this.stemIndexCount > 0) {\n this.renderBuffers(\n program,\n this.stemPositionBuffer,\n this.stemNormalBuffer,\n this.stemColorBuffer,\n this.stemIndexBuffer,\n this.stemIndexCount\n );\n }\n \n // Render markers\n if (this.showMarkers && this.markerIndexCount > 0) {\n this.renderBuffers(\n program,\n this.markerPositionBuffer,\n this.markerNormalBuffer,\n this.markerColorBuffer,\n this.markerIndexBuffer,\n this.markerIndexCount\n );\n }\n \n // Update stats\n const frameTime = performance.now() - startTime;\n this.lastFrameTime = frameTime;\n this.frameCount++;\n \n const now = performance.now();\n if (now - this.lastFpsUpdate >= 1000) {\n this.fps = this.frameCount;\n this.frameCount = 0;\n this.lastFpsUpdate = now;\n }\n \n this.emitEvent('render');\n }\n \n private renderBuffers(\n program: any,\n posBuffer: WebGLBuffer | null,\n normalBuffer: WebGLBuffer | null,\n colorBuffer: WebGLBuffer | null,\n indexBuffer: WebGLBuffer | null,\n indexCount: number\n ): void {\n const { gl } = this;\n \n // Position\n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0 && posBuffer) {\n gl.bindBuffer(gl.ARRAY_BUFFER, posBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n // Normal\n const normalLoc = program.attributes['a_normal'];\n if (normalLoc >= 0 && normalBuffer) {\n gl.bindBuffer(gl.ARRAY_BUFFER, normalBuffer);\n gl.enableVertexAttribArray(normalLoc);\n gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n // Color\n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0 && colorBuffer) {\n gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);\n gl.drawElements(gl.TRIANGLES, indexCount, gl.UNSIGNED_INT, 0);\n }\n \n startRenderLoop(): void {\n if (this.animationFrameId !== null) return;\n \n const loop = (): void => {\n this.controller.update();\n \n if (this.needsRender) {\n this.render();\n this.needsRender = false;\n }\n \n this.animationFrameId = requestAnimationFrame(loop);\n };\n \n loop();\n }\n \n stopRenderLoop(): void {\n if (this.animationFrameId !== null) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n }\n \n getStats(): RenderStats3D {\n return {\n fps: this.fps,\n instanceCount: this.impulseData?.x.length ?? 0,\n frameTime: this.lastFrameTime,\n drawCalls: this.showMarkers ? 2 : 1,\n };\n }\n \n getCamera(): OrbitCamera {\n return this.camera;\n }\n \n getAxisLabels() {\n if (!this.axes) return [];\n return this.axes.getLabels();\n }\n\n getViewProjectionMatrix(): Float32Array {\n return this.camera.getViewProjectionMatrix();\n }\n\n projectToScreen(worldPos: [number, number, number]): { x: number; y: number; visible: boolean } {\n if (!this.axes) return { x: 0, y: 0, visible: false };\n const rect = this.canvas.getBoundingClientRect();\n const viewProj = this.camera.getViewProjectionMatrix();\n return this.axes.projectToScreen(worldPos, viewProj, rect.width, rect.height);\n }\n\n exportImage(\n format: 'png' | 'jpeg' | 'webp' = 'png',\n quality = 0.92,\n transparent = false\n ): string {\n const savedBg = [...this.backgroundColor];\n if (transparent && format === 'png') {\n this.backgroundColor = [0, 0, 0, 0];\n }\n this.render();\n this.backgroundColor = savedBg as [number, number, number, number];\n const mimeType = `image/${format}`;\n return this.canvas.toDataURL(mimeType, quality);\n }\n \n on(event: string, callback: Renderer3DEventCallback): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n \n off(event: string, callback: Renderer3DEventCallback): void {\n this.eventListeners.get(event)?.delete(callback);\n }\n \n private emitEvent(type: string): void {\n const listeners = this.eventListeners.get(type);\n if (!listeners) return;\n \n const event: Renderer3DEvent = {\n type: type as any,\n timestamp: performance.now(),\n stats: this.getStats(),\n camera: {\n target: [...this.camera.target] as [number, number, number],\n radius: this.camera.radius,\n theta: this.camera.theta,\n phi: this.camera.phi,\n fov: this.camera.fov,\n },\n };\n \n listeners.forEach(callback => callback(event));\n }\n \n destroy(): void {\n this.stopRenderLoop();\n \n window.removeEventListener('resize', this.handleResize);\n \n if (this.tooltip) {\n this.tooltip.destroy();\n if (this.boundHandleMouseMove) this.canvas.removeEventListener('mousemove', this.boundHandleMouseMove);\n if (this.boundHandleMouseLeave) this.canvas.removeEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n \n const { gl } = this;\n \n // Stem buffers\n if (this.stemVao) gl.deleteVertexArray(this.stemVao);\n if (this.stemPositionBuffer) gl.deleteBuffer(this.stemPositionBuffer);\n if (this.stemNormalBuffer) gl.deleteBuffer(this.stemNormalBuffer);\n if (this.stemColorBuffer) gl.deleteBuffer(this.stemColorBuffer);\n if (this.stemIndexBuffer) gl.deleteBuffer(this.stemIndexBuffer);\n \n // Marker buffers\n if (this.markerVao) gl.deleteVertexArray(this.markerVao);\n if (this.markerPositionBuffer) gl.deleteBuffer(this.markerPositionBuffer);\n if (this.markerNormalBuffer) gl.deleteBuffer(this.markerNormalBuffer);\n if (this.markerColorBuffer) gl.deleteBuffer(this.markerColorBuffer);\n if (this.markerIndexBuffer) gl.deleteBuffer(this.markerIndexBuffer);\n \n this.controller.destroy();\n deleteProgramBundle(gl, this.programs);\n \n if (this.axes) {\n this.axes.destroy();\n }\n \n this.eventListeners.clear();\n }\n}\n","/**\n * Line 3D Renderer\n * Renders continuous 3D lines/tubes with configurable thickness.\n * Uses a tube geometry approach for smooth lines.\n */\n\nimport { OrbitCamera, type OrbitCameraOptions } from './camera/OrbitCamera';\nimport { OrbitController, type OrbitControllerOptions } from './controls/OrbitController';\nimport {\n createProgramBundle3D,\n deleteProgramBundle,\n type ProgramBundle3D,\n} from './shader/programs';\nimport { Axes3D, type Axes3DOptions } from './Axes3D';\nimport { Tooltip3D, type Tooltip3DOptions } from './Tooltip3D';\nimport type {\n Renderer3DOptions,\n Bounds3D,\n RenderStats3D,\n Renderer3DEvent,\n Renderer3DEventCallback,\n} from './types';\nimport { createRayFromScreen, pickLine } from './Raycaster3D';\n\nexport interface Line3DData {\n /** X coordinates */\n x: Float32Array;\n /** Y coordinates */\n y: Float32Array;\n /** Z coordinates */\n z: Float32Array;\n /** Color per vertex (optional, RGB) */\n colors?: Float32Array;\n /** Single line color [r, g, b] (used if colors not provided) */\n color?: [number, number, number];\n}\n\nexport interface Line3DRendererOptions extends Renderer3DOptions {\n camera?: OrbitCameraOptions;\n controls?: OrbitControllerOptions;\n axes?: Axes3DOptions;\n showAxes?: boolean;\n /** Line thickness in world units (default: 0.05) */\n lineWidth?: number;\n /** Number of segments around the tube (default: 8) */\n tubeSides?: number;\n /** Enable tooltips (default: true) */\n enableTooltip?: boolean;\n tooltip?: Tooltip3DOptions;\n}\n\nexport class Line3DRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGL2RenderingContext;\n private dpr: number;\n \n private programs: ProgramBundle3D;\n private camera: OrbitCamera;\n private controller: OrbitController;\n private axes: Axes3D | null = null;\n \n // Tube geometry buffers\n private vao: WebGLVertexArrayObject | null = null;\n private positionBuffer: WebGLBuffer | null = null;\n private normalBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n private indexCount = 0;\n \n private backgroundColor: [number, number, number, number] = [0.05, 0.05, 0.1, 1];\n private showAxes: boolean;\n private lineWidth: number;\n private tubeSides: number;\n \n private lines: Line3DData[] = [];\n private bounds: Bounds3D | null = null;\n \n private animationFrameId: number | null = null;\n private needsRender = true;\n \n private eventListeners: Map<string, Set<Renderer3DEventCallback>> = new Map();\n \n // Tooltip\n private tooltip: Tooltip3D | null = null;\n private enableTooltip: boolean;\n private lastHitIndex: { series: number, point: number } | null = null;\n private boundHandleMouseMove?: (e: MouseEvent) => void;\n private boundHandleMouseLeave?: () => void;\n \n // Stats\n private lastFrameTime = 0;\n private frameCount = 0;\n private fps = 0;\n private lastFpsUpdate = 0;\n \n constructor(options: Line3DRendererOptions) {\n this.canvas = options.canvas;\n this.dpr = window.devicePixelRatio || 1;\n this.showAxes = options.showAxes ?? true;\n this.lineWidth = options.lineWidth ?? 0.05;\n this.tubeSides = options.tubeSides ?? 8;\n this.enableTooltip = options.enableTooltip ?? true;\n \n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor;\n }\n \n // Get WebGL2 context\n const gl = this.canvas.getContext('webgl2', {\n alpha: true,\n antialias: true,\n preserveDrawingBuffer: false,\n });\n \n if (!gl) {\n throw new Error('WebGL2 not supported');\n }\n this.gl = gl;\n \n // Enable depth testing\n gl.enable(gl.DEPTH_TEST);\n gl.depthFunc(gl.LEQUAL);\n \n // Create shader programs\n this.programs = createProgramBundle3D(gl);\n \n // Create buffers\n this.initBuffers();\n \n // Create camera\n this.camera = new OrbitCamera(options.camera);\n \n // Create controller\n this.controller = new OrbitController(this.camera, this.canvas, options.controls);\n this.controller.onChange(() => {\n this.needsRender = true;\n this.emitEvent('cameraChange');\n });\n \n // Create axes\n if (this.showAxes) {\n this.axes = new Axes3D(gl, options.axes);\n }\n \n // Initialize tooltip\n if (this.enableTooltip) {\n this.tooltip = new Tooltip3D(this.canvas.parentElement || document.body, options.tooltip);\n \n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseLeave = this.handleMouseLeave.bind(this);\n this.canvas.addEventListener('mousemove', this.boundHandleMouseMove);\n this.canvas.addEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n \n // Handle resize\n this.resize();\n window.addEventListener('resize', this.handleResize);\n \n // Start render loop\n this.startRenderLoop();\n }\n\n private handleMouseMove(e: MouseEvent): void {\n if (!this.tooltip || this.lines.length === 0) return;\n \n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n \n const hit = this.pickAtScreen(x, y);\n \n if (hit) {\n const isNew = !this.lastHitIndex || \n this.lastHitIndex.series !== hit.seriesIndex || \n this.lastHitIndex.point !== hit.pointIndex;\n \n if (isNew) {\n this.lastHitIndex = { series: hit.seriesIndex, point: hit.pointIndex };\n const line = this.lines[hit.seriesIndex];\n const color = line.color || [0.5, 0.7, 1.0];\n \n this.tooltip.show({\n index: hit.pointIndex,\n position: [line.x[hit.pointIndex], line.y[hit.pointIndex], line.z[hit.pointIndex]],\n color: color,\n customData: { series: hit.seriesIndex }\n }, x, y);\n } else {\n this.tooltip.updatePosition(x, y);\n }\n } else {\n if (this.lastHitIndex) {\n this.tooltip.hide();\n this.lastHitIndex = null;\n }\n }\n }\n\n private handleMouseLeave(): void {\n if (this.tooltip) {\n this.tooltip.hide();\n this.lastHitIndex = null;\n }\n }\n\n pickAtScreen(screenX: number, screenY: number) {\n if (this.lines.length === 0) return null;\n \n const { width, height } = this.getCanvasSize();\n const viewProj = this.camera.getViewProjectionMatrix();\n const ray = createRayFromScreen(screenX, screenY, width, height, viewProj);\n \n return pickLine(ray, this.lines, this.lineWidth * 3);\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n this.positionBuffer = gl.createBuffer();\n this.normalBuffer = gl.createBuffer();\n this.colorBuffer = gl.createBuffer();\n this.indexBuffer = gl.createBuffer();\n \n gl.bindVertexArray(null);\n }\n \n private handleResize = (): void => {\n this.resize();\n this.needsRender = true;\n };\n \n resize(): void {\n const { canvas, gl, dpr, camera } = this;\n \n const width = canvas.clientWidth;\n const height = canvas.clientHeight;\n \n canvas.width = width * dpr;\n canvas.height = height * dpr;\n \n gl.viewport(0, 0, canvas.width, canvas.height);\n camera.aspect = width / height;\n }\n \n /**\n * Set line data (single line or array of lines)\n */\n setData(lines: Line3DData | Line3DData[]): void {\n this.lines = Array.isArray(lines) ? lines : [lines];\n this.buildTubeGeometry();\n this.calculateBounds();\n \n if (this.axes && this.bounds) {\n this.axes.updateBounds(this.bounds);\n }\n \n this.needsRender = true;\n this.emitEvent('dataUpdate');\n }\n \n /**\n * Add a single line\n */\n addLine(line: Line3DData): void {\n this.lines.push(line);\n this.buildTubeGeometry();\n this.calculateBounds();\n \n if (this.axes && this.bounds) {\n this.axes.updateBounds(this.bounds);\n }\n \n this.needsRender = true;\n }\n \n /**\n * Clear all lines\n */\n clearLines(): void {\n this.lines = [];\n this.indexCount = 0;\n this.needsRender = true;\n }\n \n private buildTubeGeometry(): void {\n const { gl, lineWidth, tubeSides, lines } = this;\n \n if (lines.length === 0) {\n this.indexCount = 0;\n return;\n }\n \n const allPositions: number[] = [];\n const allNormals: number[] = [];\n const allColors: number[] = [];\n const allIndices: number[] = [];\n let vertexOffset = 0;\n \n for (const line of lines) {\n const pointCount = line.x.length;\n if (pointCount < 2) continue;\n \n const defaultColor = line.color ?? [0.5, 0.7, 1.0];\n \n // Generate tube cross-section for each segment\n for (let i = 0; i < pointCount; i++) {\n // Current point\n const px = line.x[i];\n const py = line.y[i];\n const pz = line.z[i];\n \n // Calculate tangent direction\n let tx: number, ty: number, tz: number;\n if (i === 0) {\n // Forward difference for first point\n tx = line.x[1] - line.x[0];\n ty = line.y[1] - line.y[0];\n tz = line.z[1] - line.z[0];\n } else if (i === pointCount - 1) {\n // Backward difference for last point\n tx = line.x[i] - line.x[i - 1];\n ty = line.y[i] - line.y[i - 1];\n tz = line.z[i] - line.z[i - 1];\n } else {\n // Central difference for middle points\n tx = line.x[i + 1] - line.x[i - 1];\n ty = line.y[i + 1] - line.y[i - 1];\n tz = line.z[i + 1] - line.z[i - 1];\n }\n \n // Normalize tangent\n const tLen = Math.sqrt(tx * tx + ty * ty + tz * tz);\n if (tLen > 0.0001) {\n tx /= tLen;\n ty /= tLen;\n tz /= tLen;\n }\n \n // Find perpendicular vectors (Frenet frame approximation)\n // Use world up (0, 1, 0) unless tangent is nearly vertical\n let upX = 0, upY = 1, upZ = 0;\n if (Math.abs(ty) > 0.99) {\n upX = 1; upY = 0; upZ = 0;\n }\n \n // Normal = tangent × up\n let nx = ty * upZ - tz * upY;\n let ny = tz * upX - tx * upZ;\n let nz = tx * upY - ty * upX;\n const nLen = Math.sqrt(nx * nx + ny * ny + nz * nz);\n if (nLen > 0.0001) {\n nx /= nLen;\n ny /= nLen;\n nz /= nLen;\n }\n \n // Binormal = tangent × normal\n const bx = ty * nz - tz * ny;\n const by = tz * nx - tx * nz;\n const bz = tx * ny - ty * nx;\n \n // Generate circle of vertices around the point\n for (let s = 0; s < tubeSides; s++) {\n const angle = (s / tubeSides) * Math.PI * 2;\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n \n // Offset from center line\n const ox = (nx * cos + bx * sin) * lineWidth;\n const oy = (ny * cos + by * sin) * lineWidth;\n const oz = (nz * cos + bz * sin) * lineWidth;\n \n allPositions.push(px + ox, py + oy, pz + oz);\n allNormals.push(nx * cos + bx * sin, ny * cos + by * sin, nz * cos + bz * sin);\n \n // Color\n if (line.colors) {\n allColors.push(\n line.colors[i * 3],\n line.colors[i * 3 + 1],\n line.colors[i * 3 + 2]\n );\n } else {\n allColors.push(defaultColor[0], defaultColor[1], defaultColor[2]);\n }\n }\n \n // Generate indices (connect to next ring)\n if (i < pointCount - 1) {\n for (let s = 0; s < tubeSides; s++) {\n const current = vertexOffset + i * tubeSides + s;\n const next = vertexOffset + i * tubeSides + ((s + 1) % tubeSides);\n const currentNext = current + tubeSides;\n const nextNext = next + tubeSides;\n \n // Two triangles per quad\n allIndices.push(current, next, currentNext);\n allIndices.push(next, nextNext, currentNext);\n }\n }\n }\n \n vertexOffset += pointCount * tubeSides;\n }\n \n // Upload to GPU\n const positions = new Float32Array(allPositions);\n const normals = new Float32Array(allNormals);\n const colors = new Float32Array(allColors);\n const indices = new Uint32Array(allIndices);\n \n this.indexCount = indices.length;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, normals, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n }\n \n private calculateBounds(): void {\n if (this.lines.length === 0) {\n this.bounds = null;\n return;\n }\n \n let minX = Infinity, maxX = -Infinity;\n let minY = Infinity, maxY = -Infinity;\n let minZ = Infinity, maxZ = -Infinity;\n \n for (const line of this.lines) {\n for (let i = 0; i < line.x.length; i++) {\n if (line.x[i] < minX) minX = line.x[i];\n if (line.x[i] > maxX) maxX = line.x[i];\n if (line.y[i] < minY) minY = line.y[i];\n if (line.y[i] > maxY) maxY = line.y[i];\n if (line.z[i] < minZ) minZ = line.z[i];\n if (line.z[i] > maxZ) maxZ = line.z[i];\n }\n }\n \n this.bounds = { minX, maxX, minY, maxY, minZ, maxZ };\n }\n \n /**\n * Fit camera to show all data\n */\n fitToData(): void {\n if (!this.bounds) return;\n \n const { minX, maxX, minY, maxY, minZ, maxZ } = this.bounds;\n \n // Add 20% padding to bounds for better fit\n const dx = maxX - minX;\n const dy = maxY - minY;\n const dz = maxZ - minZ;\n const padding = 0.01;\n \n this.camera.fitToBounds(\n minX - dx * padding, minY - dy * padding, minZ - dz * padding,\n maxX + dx * padding, maxY + dy * padding, maxZ + dz * padding\n );\n \n // Closer fit\n this.camera.radius *= 1.05;\n \n this.needsRender = true;\n }\n \n getCanvasSize(): { width: number; height: number } {\n const rect = this.canvas.getBoundingClientRect();\n return { width: rect.width, height: rect.height };\n }\n\n /**\n * Render a single frame\n */\n render(): void {\n const { gl, camera, backgroundColor } = this;\n \n const startTime = performance.now();\n \n // Clear\n gl.clearColor(\n backgroundColor[0],\n backgroundColor[1],\n backgroundColor[2],\n backgroundColor[3]\n );\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n \n // Get view projection matrix\n const viewProj = camera.getViewProjectionMatrix();\n \n // Render axes first\n if (this.axes) {\n this.axes.render(viewProj);\n }\n \n // Render tubes\n if (this.indexCount > 0) {\n const program = this.programs.surfaceProgram;\n gl.useProgram(program.program);\n \n gl.uniformMatrix4fv(program.uniforms['u_viewProjection'], false, viewProj);\n gl.uniform1f(program.uniforms['u_opacity'], 1.0);\n gl.uniform3f(program.uniforms['u_lightDir'], 1, 1, 1);\n gl.uniform1f(program.uniforms['u_ambient'], 0.35);\n \n gl.bindVertexArray(this.vao);\n \n // Position\n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n // Normal\n const normalLoc = program.attributes['a_normal'];\n if (normalLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.enableVertexAttribArray(normalLoc);\n gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n // Color\n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.drawElements(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0);\n \n gl.bindVertexArray(null);\n }\n \n // Update stats\n const frameTime = performance.now() - startTime;\n this.lastFrameTime = frameTime;\n this.frameCount++;\n \n const now = performance.now();\n if (now - this.lastFpsUpdate >= 1000) {\n this.fps = this.frameCount;\n this.frameCount = 0;\n this.lastFpsUpdate = now;\n }\n \n this.emitEvent('render');\n }\n \n startRenderLoop(): void {\n if (this.animationFrameId !== null) return;\n \n const loop = (): void => {\n this.controller.update();\n \n if (this.needsRender) {\n this.render();\n this.needsRender = false;\n }\n \n this.animationFrameId = requestAnimationFrame(loop);\n };\n \n loop();\n }\n \n stopRenderLoop(): void {\n if (this.animationFrameId !== null) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n }\n \n getStats(): RenderStats3D {\n return {\n fps: this.fps,\n instanceCount: this.indexCount / 6, // Approximate triangle count\n frameTime: this.lastFrameTime,\n drawCalls: 1,\n };\n }\n \n getCamera(): OrbitCamera {\n return this.camera;\n }\n \n getAxisLabels() {\n if (!this.axes) return [];\n return this.axes.getLabels();\n }\n\n getViewProjectionMatrix(): Float32Array {\n return this.camera.getViewProjectionMatrix();\n }\n\n projectToScreen(worldPos: [number, number, number]): { x: number; y: number; visible: boolean } {\n if (!this.axes) return { x: 0, y: 0, visible: false };\n const rect = this.canvas.getBoundingClientRect();\n const viewProj = this.camera.getViewProjectionMatrix();\n return this.axes.projectToScreen(worldPos, viewProj, rect.width, rect.height);\n }\n\n exportImage(\n format: 'png' | 'jpeg' | 'webp' = 'png',\n quality = 0.92,\n transparent = false\n ): string {\n const savedBg = [...this.backgroundColor];\n if (transparent && format === 'png') {\n this.backgroundColor = [0, 0, 0, 0];\n }\n this.render();\n this.backgroundColor = savedBg as [number, number, number, number];\n const mimeType = `image/${format}`;\n return this.canvas.toDataURL(mimeType, quality);\n }\n \n on(event: string, callback: Renderer3DEventCallback): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n \n off(event: string, callback: Renderer3DEventCallback): void {\n this.eventListeners.get(event)?.delete(callback);\n }\n \n private emitEvent(type: string): void {\n const listeners = this.eventListeners.get(type);\n if (!listeners) return;\n \n const event: Renderer3DEvent = {\n type: type as any,\n timestamp: performance.now(),\n stats: this.getStats(),\n camera: {\n target: [...this.camera.target] as [number, number, number],\n radius: this.camera.radius,\n theta: this.camera.theta,\n phi: this.camera.phi,\n fov: this.camera.fov,\n },\n };\n \n listeners.forEach(callback => callback(event));\n }\n \n destroy(): void {\n this.stopRenderLoop();\n \n window.removeEventListener('resize', this.handleResize);\n \n if (this.tooltip) {\n this.tooltip.destroy();\n if (this.boundHandleMouseMove) this.canvas.removeEventListener('mousemove', this.boundHandleMouseMove);\n if (this.boundHandleMouseLeave) this.canvas.removeEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n \n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.normalBuffer) gl.deleteBuffer(this.normalBuffer);\n if (this.colorBuffer) gl.deleteBuffer(this.colorBuffer);\n if (this.indexBuffer) gl.deleteBuffer(this.indexBuffer);\n \n this.controller.destroy();\n deleteProgramBundle(gl, this.programs);\n \n if (this.axes) {\n this.axes.destroy();\n }\n \n this.eventListeners.clear();\n }\n}\n","/**\n * High-Density Point Cloud 3D Renderer\n * Renders millions of points using gl.POINTS and Point Sprites.\n * Optimized for massive datasets like LiDAR or medical imaging.\n */\n\nimport { OrbitCamera, type OrbitCameraOptions } from './camera/OrbitCamera';\nimport { OrbitController, type OrbitControllerOptions } from './controls/OrbitController';\nimport {\n createProgramBundle3D,\n deleteProgramBundle,\n type ProgramBundle3D,\n} from './shader/programs';\nimport { Axes3D, type Axes3DOptions } from './Axes3D';\nimport { Tooltip3D } from './Tooltip3D';\nimport { createRayFromScreen, pickBubble } from './Raycaster3D';\nimport type {\n Renderer3DOptions,\n Bounds3D,\n Renderer3DEventCallback,\n} from './types';\nimport { createTheme, type CustomThemeOptions, type ColorTheme } from './colorThemes';\n\nexport interface PointCloudData {\n /** Positions [x0, y0, z0, x1, y1, z1, ...] */\n positions: Float32Array;\n /** Colors per point [r0, g0, b0, ...] (optional) */\n colors?: Float32Array;\n /** Sizes per point (optional) */\n sizes?: Float32Array;\n}\n\nexport interface PointCloud3DRendererOptions extends Renderer3DOptions {\n camera?: OrbitCameraOptions;\n controls?: OrbitControllerOptions;\n axes?: Axes3DOptions;\n showAxes?: boolean;\n /** Global point size multiplier (default: 2.0) */\n pointSize?: number;\n /** Use circular points instead of squares (default: true) */\n circular?: boolean;\n /** Global opacity (default: 1.0) */\n opacity?: number;\n /** Color theme options */\n theme?: CustomThemeOptions;\n /** Enable tooltips */\n enableTooltip?: boolean;\n}\n\nexport class PointCloud3DRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGL2RenderingContext;\n private dpr: number;\n \n private programs: ProgramBundle3D;\n private camera: OrbitCamera;\n private controller: OrbitController;\n private axes: Axes3D | null = null;\n \n // Buffers\n private vao: WebGLVertexArrayObject | null = null;\n private positionBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private sizeBuffer: WebGLBuffer | null = null;\n private pointCount = 0;\n \n private backgroundColor: [number, number, number, number] = [0.05, 0.05, 0.1, 1];\n private globalPointSize: number;\n private circular: boolean;\n private opacity: number;\n \n private positions: Float32Array | null = null;\n private bounds: Bounds3D | null = null;\n \n private animationFrameId: number | null = null;\n private needsRender = true;\n private eventListeners: Map<string, Set<Renderer3DEventCallback>> = new Map();\n \n // Tooltip\n private tooltip: Tooltip3D | null = null;\n private lastHitIndex: number = -1;\n private boundHandleMouseMove?: (e: MouseEvent) => void;\n private boundHandleMouseLeave?: () => void;\n \n // Color theme\n private colorTheme: ColorTheme;\n\n constructor(options: PointCloud3DRendererOptions) {\n this.canvas = options.canvas;\n this.dpr = window.devicePixelRatio || 1;\n this.globalPointSize = options.pointSize ?? 2.0;\n this.circular = options.circular ?? true;\n this.opacity = options.opacity ?? 1.0;\n \n if (options.backgroundColor) this.backgroundColor = options.backgroundColor;\n \n // Initialize color theme\n this.colorTheme = createTheme(options.theme || {}, this.backgroundColor);\n\n const gl = this.canvas.getContext('webgl2', { alpha: true, antialias: true });\n if (!gl) throw new Error('WebGL2 not supported');\n this.gl = gl;\n\n gl.enable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n this.programs = createProgramBundle3D(gl);\n this.camera = new OrbitCamera(options.camera);\n this.controller = new OrbitController(this.camera, this.canvas, options.controls);\n this.controller.onChange(() => { this.needsRender = true; this.emitEvent('cameraChange'); });\n\n if (options.showAxes !== false) {\n this.axes = new Axes3D(gl, options.axes);\n }\n\n if (options.enableTooltip !== false) {\n this.tooltip = new Tooltip3D(this.canvas.parentElement || document.body);\n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseLeave = this.handleMouseLeave.bind(this);\n this.canvas.addEventListener('mousemove', this.boundHandleMouseMove);\n this.canvas.addEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n\n this.initBuffers();\n this.resize();\n window.addEventListener('resize', this.handleResize);\n this.startRenderLoop();\n }\n\n private initBuffers(): void {\n const { gl } = this;\n const program = this.programs.pointCloudProgram;\n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n\n this.positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n const posLoc = program.attributes.a_position;\n if (posLoc !== -1) {\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n this.colorBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n const colorLoc = program.attributes.a_color;\n if (colorLoc !== -1) {\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n this.sizeBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.sizeBuffer);\n const sizeLoc = program.attributes.a_size;\n if (sizeLoc !== -1) {\n gl.enableVertexAttribArray(sizeLoc);\n gl.vertexAttribPointer(sizeLoc, 1, gl.FLOAT, false, 0, 0);\n }\n\n gl.bindVertexArray(null);\n }\n\n setData(data: PointCloudData): void {\n this.positions = data.positions;\n this.pointCount = data.positions.length / 3;\n const { gl } = this;\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, data.positions, gl.DYNAMIC_DRAW);\n\n // Use theme color if no custom colors provided\n const defaultColor = this.colorTheme.seriesPalette[0];\n const colors = data.colors || this.generateThemeColors(this.pointCount, defaultColor);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n\n const sizes = data.sizes || new Float32Array(this.pointCount).fill(1.0);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.sizeBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, sizes, gl.DYNAMIC_DRAW);\n\n this.updateBounds();\n this.needsRender = true;\n }\n\n private updateBounds(): void {\n if (!this.positions) return;\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity, minZ = Infinity, maxZ = -Infinity;\n for (let i = 0; i < this.positions.length; i += 3) {\n const x = this.positions[i], y = this.positions[i+1], z = this.positions[i+2];\n if (x < minX) minX = x; if (x > maxX) maxX = x;\n if (y < minY) minY = y; if (y > maxY) maxY = y;\n if (z < minZ) minZ = z; if (z > maxZ) maxZ = z;\n }\n this.bounds = { minX, maxX, minY, maxY, minZ, maxZ };\n if (this.axes) this.axes.updateBounds(this.bounds);\n }\n \n private generateThemeColors(count: number, defaultColor: [number, number, number]): Float32Array {\n const colors = new Float32Array(count * 3);\n for (let i = 0; i < count; i++) {\n colors[i * 3] = defaultColor[0];\n colors[i * 3 + 1] = defaultColor[1];\n colors[i * 3 + 2] = defaultColor[2];\n }\n return colors;\n }\n\n render(): void {\n const { gl, camera } = this;\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n gl.clearColor(this.backgroundColor[0], this.backgroundColor[1], this.backgroundColor[2], this.backgroundColor[3]);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n\n const viewProj = camera.getViewProjectionMatrix() as Float32Array;\n if (this.axes) this.axes.render(viewProj);\n\n if (this.pointCount > 0 && this.vao) {\n const program = this.programs.pointCloudProgram;\n gl.useProgram(program.program);\n gl.uniformMatrix4fv(program.uniforms.u_viewProjection, false, viewProj);\n gl.uniform1f(program.uniforms.u_opacity, this.opacity);\n gl.uniform1f(program.uniforms.u_globalSize, this.globalPointSize * this.dpr);\n gl.uniform1i(program.uniforms.u_circular, this.circular ? 1 : 0);\n\n gl.bindVertexArray(this.vao);\n gl.drawArrays(gl.POINTS, 0, this.pointCount);\n gl.bindVertexArray(null);\n }\n this.emitEvent('render');\n }\n\n private startRenderLoop(): void {\n const loop = () => {\n const moving = this.controller.update();\n if (this.needsRender || moving) {\n this.render();\n this.needsRender = false;\n }\n this.animationFrameId = requestAnimationFrame(loop);\n };\n this.animationFrameId = requestAnimationFrame(loop);\n }\n\n fitToData(): void {\n if (!this.bounds) return;\n const { minX, maxX, minY, maxY, minZ, maxZ } = this.bounds;\n this.camera.fitToBounds(minX, minY, minZ, maxX, maxY, maxZ);\n this.camera.radius *= 1.2;\n this.needsRender = true;\n }\n\n private handleMouseMove(e: MouseEvent): void {\n if (!this.tooltip || !this.positions) return;\n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left, y = e.clientY - rect.top;\n \n // Efficiency: for PointCloud we only pick if not too many points or use spatial hashing.\n // For now, reuse pickBubble which is optimized with distance check.\n const { width, height } = this.getCanvasSize();\n const viewProj = this.camera.getViewProjectionMatrix() as Float32Array;\n const ray = createRayFromScreen(x, y, width, height, viewProj);\n const hit = pickBubble(ray, this.positions, new Float32Array(this.pointCount).fill(0.2));\n\n if (hit) {\n if (hit.index !== this.lastHitIndex) {\n this.lastHitIndex = hit.index;\n const i3 = hit.index * 3;\n this.tooltip.show({\n index: hit.index,\n position: [this.positions[i3], this.positions[i3+1], this.positions[i3+2]]\n }, x, y);\n } else {\n this.tooltip.updatePosition(x, y);\n }\n } else if (this.lastHitIndex !== -1) {\n this.tooltip.hide();\n this.lastHitIndex = -1;\n }\n }\n\n private handleMouseLeave(): void {\n if (this.tooltip) { this.tooltip.hide(); this.lastHitIndex = -1; }\n }\n\n private handleResize = () => { this.resize(); this.needsRender = true; }\n private resize(): void {\n const width = this.canvas.clientWidth, height = this.canvas.clientHeight;\n this.canvas.width = width * this.dpr; this.canvas.height = height * this.dpr;\n this.gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n this.camera.aspect = width / height;\n }\n getCanvasSize() { const rect = this.canvas.getBoundingClientRect(); return { width: rect.width, height: rect.height }; }\n \n getAxisLabels() {\n return this.axes?.getLabels() ?? [];\n }\n\n getViewProjectionMatrix() {\n return this.camera.getViewProjectionMatrix();\n }\n\n projectToScreen(worldPos: [number, number, number]) {\n if (!this.axes) return { x: 0, y: 0, visible: false };\n const { width, height } = this.getCanvasSize();\n return this.axes.projectToScreen(worldPos, this.camera.getViewProjectionMatrix(), width, height);\n }\n on(event: string, callback: Renderer3DEventCallback): void {\n if (!this.eventListeners.has(event)) this.eventListeners.set(event, new Set());\n this.eventListeners.get(event)!.add(callback);\n }\n private emitEvent(type: string): void {\n const listeners = this.eventListeners.get(type);\n if (!listeners) return;\n listeners.forEach(cb => cb({ \n type: type as any, timestamp: performance.now(), \n stats: { fps: 60, frameTime: 16, instanceCount: this.pointCount, drawCalls: 1 },\n camera: { target: [...this.camera.target] as any, radius: this.camera.radius, theta: this.camera.theta, phi: this.camera.phi, fov: this.camera.fov }\n }));\n }\n\n destroy(): void {\n window.removeEventListener('resize', this.handleResize);\n if (this.animationFrameId) cancelAnimationFrame(this.animationFrameId);\n if (this.tooltip) this.tooltip.destroy();\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n [this.positionBuffer, this.colorBuffer, this.sizeBuffer].forEach(b => b && gl.deleteBuffer(b));\n deleteProgramBundle(gl, this.programs);\n }\n}\n","/**\n * Ribbon 3D Renderer\n * Renders multiple series as 3D ribbons (tapes) with width and lighting.\n * Ideal for comparing multiple 3D profiles or time-series evolution.\n */\n\nimport { OrbitCamera, type OrbitCameraOptions } from './camera/OrbitCamera';\nimport { OrbitController, type OrbitControllerOptions } from './controls/OrbitController';\nimport {\n createProgramBundle3D,\n deleteProgramBundle,\n type ProgramBundle3D,\n} from './shader/programs';\nimport { Axes3D, type Axes3DOptions } from './Axes3D';\nimport { Tooltip3D } from './Tooltip3D';\nimport { createRayFromScreen, pickLine } from './Raycaster3D';\nimport type {\n Renderer3DOptions,\n Bounds3D,\n Renderer3DEventCallback,\n} from './types';\nimport { createTheme, type CustomThemeOptions, type ColorTheme } from './colorThemes';\n\nexport interface RibbonSeriesData {\n /** X coordinates */\n xValues: Float32Array;\n /** Y coordinates */\n yValues: Float32Array;\n /** Z center coordinate of this ribbon */\n z: number;\n /** Width of the ribbon along the Z axis (default 0.5) */\n width?: number;\n /** Color of the ribbon (default: [0.3, 0.8, 1.0]) */\n color?: [number, number, number];\n}\n\nexport interface Ribbon3DRendererOptions extends Renderer3DOptions {\n camera?: OrbitCameraOptions;\n controls?: OrbitControllerOptions;\n axes?: Axes3DOptions;\n showAxes?: boolean;\n /** Global opacity (default: 0.9) */\n opacity?: number;\n /** Enable tooltips */\n enableTooltip?: boolean;\n /** Color theme options */\n theme?: CustomThemeOptions;\n}\n\nexport class Ribbon3DRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGL2RenderingContext;\n private dpr: number;\n \n private programs: ProgramBundle3D;\n private camera: OrbitCamera;\n private controller: OrbitController;\n private axes: Axes3D | null = null;\n \n // Buffers\n private vao: WebGLVertexArrayObject | null = null;\n private positionBuffer: WebGLBuffer | null = null;\n private normalBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n private indexCount = 0;\n \n private backgroundColor: [number, number, number, number] = [0.05, 0.05, 0.1, 1];\n private opacity: number;\n \n private series: RibbonSeriesData[] = [];\n private bounds: Bounds3D | null = null;\n \n private animationFrameId: number | null = null;\n private needsRender = true;\n private eventListeners: Map<string, Set<Renderer3DEventCallback>> = new Map();\n \n // Hover highlight\n private hoveredSeriesIndex: number | null = null;\n private colorTheme: ColorTheme;\n \n // Tooltip\n private tooltip: Tooltip3D | null = null;\n private lastHitIndex: { series: number, point: number } | null = null;\n private boundHandleMouseMove?: (e: MouseEvent) => void;\n private boundHandleMouseLeave?: () => void;\n\n constructor(options: Ribbon3DRendererOptions) {\n this.canvas = options.canvas;\n this.dpr = window.devicePixelRatio || 1;\n this.opacity = options.opacity ?? 0.9;\n \n if (options.backgroundColor) this.backgroundColor = options.backgroundColor;\n \n // Initialize color theme\n this.colorTheme = createTheme(options.theme || {}, this.backgroundColor);\n\n const gl = this.canvas.getContext('webgl2', { alpha: true, antialias: true });\n if (!gl) throw new Error('WebGL2 not supported');\n this.gl = gl;\n\n gl.enable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n this.programs = createProgramBundle3D(gl);\n this.camera = new OrbitCamera(options.camera);\n this.controller = new OrbitController(this.camera, this.canvas, options.controls);\n this.controller.onChange(() => { this.needsRender = true; this.emitEvent('cameraChange'); });\n\n if (options.showAxes !== false) {\n this.axes = new Axes3D(gl, options.axes);\n }\n\n if (options.enableTooltip !== false) {\n this.tooltip = new Tooltip3D(this.canvas.parentElement || document.body);\n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseLeave = this.handleMouseLeave.bind(this);\n this.canvas.addEventListener('mousemove', this.boundHandleMouseMove);\n this.canvas.addEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n\n this.resize();\n window.addEventListener('resize', this.handleResize);\n this.startRenderLoop();\n }\n\n setData(series: RibbonSeriesData[]): void {\n this.series = series;\n this.updateGeometry();\n this.updateBounds();\n this.needsRender = true;\n }\n\n private updateBounds(): void {\n if (this.series.length === 0) return;\n \n let minX = Infinity, maxX = -Infinity;\n let minY = Infinity, maxY = -Infinity;\n let minZ = Infinity, maxZ = -Infinity;\n\n for (const s of this.series) {\n const halfW = (s.width ?? 0.5) / 2;\n if (s.z - halfW < minZ) minZ = s.z - halfW;\n if (s.z + halfW > maxZ) maxZ = s.z + halfW;\n\n for (let i = 0; i < s.xValues.length; i++) {\n const x = s.xValues[i], y = s.yValues[i];\n if (x < minX) minX = x; if (x > maxX) maxX = x;\n if (y < minY) minY = y; if (y > maxY) maxY = y;\n }\n }\n\n this.bounds = { minX, maxX, minY, maxY, minZ, maxZ };\n if (this.axes) this.axes.updateBounds(this.bounds);\n }\n\n private updateGeometry(): void {\n if (this.series.length === 0) return;\n const { gl } = this;\n\n const positions: number[] = [];\n const normals: number[] = [];\n const colors: number[] = [];\n const indices: number[] = [];\n let vertexOffset = 0;\n\n for (let seriesIdx = 0; seriesIdx < this.series.length; seriesIdx++) {\n const s = this.series[seriesIdx];\n \n // Use highlight color if this series is hovered\n const isHovered = seriesIdx === this.hoveredSeriesIndex;\n const col = isHovered \n ? this.colorTheme.highlightColor\n : (s.color || this.colorTheme.seriesPalette[seriesIdx % this.colorTheme.seriesPalette.length]);\n \n const halfW = (s.width ?? 0.5) / 2;\n const n = s.xValues.length;\n\n for (let i = 0; i < n; i++) {\n const x = s.xValues[i], y = s.yValues[i], z = s.z;\n\n // Calculate tangent for normal\n let dx = 0, dy = 1;\n if (i < n - 1) {\n dx = s.xValues[i+1] - x; dy = s.yValues[i+1] - y;\n } else if (i > 0) {\n dx = x - s.xValues[i-1]; dy = y - s.yValues[i-1];\n }\n \n const mag = Math.sqrt(dx*dx + dy*dy);\n const nx = mag > 0 ? dy/mag : 0;\n const ny = mag > 0 ? -dx/mag : 1;\n\n positions.push(x, y, z - halfW);\n positions.push(x, y, z + halfW);\n\n normals.push(nx, ny, 0);\n normals.push(nx, ny, 0);\n\n colors.push(...col);\n colors.push(...col);\n\n if (i < n - 1) {\n const v0 = vertexOffset + i * 2;\n const v1 = v0 + 1;\n const v2 = v0 + 2;\n const v3 = v0 + 3;\n indices.push(v0, v1, v2, v1, v3, v2);\n }\n }\n vertexOffset += n * 2;\n }\n\n const program = this.programs.ribbonProgram;\n if (!this.vao) this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n\n if (!this.positionBuffer) this.positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);\n const posLoc = program.attributes.a_position;\n if (posLoc !== -1) {\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n if (!this.normalBuffer) this.normalBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(normals), gl.STATIC_DRAW);\n const normalLoc = program.attributes.a_normal;\n if (normalLoc !== -1) {\n gl.enableVertexAttribArray(normalLoc);\n gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n if (!this.colorBuffer) this.colorBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);\n const colorLoc = program.attributes.a_color;\n if (colorLoc !== -1) {\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n if (!this.indexBuffer) this.indexBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array(indices), gl.STATIC_DRAW);\n this.indexCount = indices.length;\n\n gl.bindVertexArray(null);\n }\n\n render(): void {\n const { gl, camera } = this;\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n gl.clearColor(this.backgroundColor[0], this.backgroundColor[1], this.backgroundColor[2], this.backgroundColor[3]);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n\n const viewProj = camera.getViewProjectionMatrix() as Float32Array;\n if (this.axes) this.axes.render(viewProj);\n\n if (this.indexCount > 0 && this.vao) {\n const program = this.programs.ribbonProgram;\n gl.useProgram(program.program);\n gl.uniformMatrix4fv(program.uniforms.u_viewProjection, false, viewProj);\n gl.uniform1f(program.uniforms.u_opacity, this.opacity);\n gl.uniform3fv(program.uniforms.u_lightDir, new Float32Array([0.5, 1.0, 0.3]));\n gl.uniform1f(program.uniforms['u_ambient'], 0.6);\n\n gl.bindVertexArray(this.vao);\n gl.drawElements(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0);\n gl.bindVertexArray(null);\n }\n this.emitEvent('render');\n }\n\n private startRenderLoop(): void {\n const loop = () => {\n const moving = this.controller.update();\n if (this.needsRender || moving) {\n this.render();\n this.needsRender = false;\n }\n this.animationFrameId = requestAnimationFrame(loop);\n };\n this.animationFrameId = requestAnimationFrame(loop);\n }\n\n fitToData(): void {\n if (!this.bounds) return;\n const { minX, maxX, minY, maxY, minZ, maxZ } = this.bounds;\n this.camera.fitToBounds(minX, minY, minZ, maxX, maxY, maxZ);\n this.camera.radius *= 1.2;\n this.needsRender = true;\n }\n\n private handleMouseMove(e: MouseEvent): void {\n if (this.series.length === 0) return;\n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left, y = e.clientY - rect.top;\n \n // Pick based on center lines of ribbons\n const { width, height } = this.getCanvasSize();\n const viewProj = this.camera.getViewProjectionMatrix() as Float32Array;\n const ray = createRayFromScreen(x, y, width, height, viewProj);\n \n const lines = this.series.map(s => ({\n x: s.xValues, y: s.yValues,\n z: new Float32Array(s.xValues.length).fill(s.z)\n }));\n \n const hit = pickLine(ray, lines, 0.4);\n \n // Update hovered series\n const newHoveredIndex = hit ? hit.seriesIndex : null;\n if (newHoveredIndex !== this.hoveredSeriesIndex) {\n this.hoveredSeriesIndex = newHoveredIndex;\n this.updateGeometry();\n this.needsRender = true;\n }\n\n // Tooltip logic\n if (this.tooltip) {\n if (hit) {\n if (!this.lastHitIndex || this.lastHitIndex.series !== hit.seriesIndex || this.lastHitIndex.point !== hit.pointIndex) {\n this.lastHitIndex = { series: hit.seriesIndex, point: hit.pointIndex };\n const s = this.series[hit.seriesIndex];\n this.tooltip.show({\n index: hit.pointIndex,\n position: [s.xValues[hit.pointIndex], s.yValues[hit.pointIndex], s.z],\n color: s.color || [0.3, 0.8, 1.0],\n customData: { Series: hit.seriesIndex, Z: s.z.toFixed(2) }\n }, x, y);\n } else {\n this.tooltip.updatePosition(x, y);\n }\n } else if (this.lastHitIndex) {\n this.tooltip.hide();\n this.lastHitIndex = null;\n }\n }\n }\n\n private handleMouseLeave(): void {\n // Reset highlight\n if (this.hoveredSeriesIndex !== null) {\n this.hoveredSeriesIndex = null;\n this.updateGeometry();\n this.needsRender = true;\n }\n \n if (this.tooltip) { this.tooltip.hide(); this.lastHitIndex = null; }\n }\n\n private handleResize = () => { this.resize(); this.needsRender = true; }\n private resize(): void {\n const width = this.canvas.clientWidth, height = this.canvas.clientHeight;\n this.canvas.width = width * this.dpr; this.canvas.height = height * this.dpr;\n this.gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n this.camera.aspect = width / height;\n }\n getCanvasSize() { const rect = this.canvas.getBoundingClientRect(); return { width: rect.width, height: rect.height }; }\n \n getAxisLabels() {\n return this.axes?.getLabels() ?? [];\n }\n\n getViewProjectionMatrix() {\n return this.camera.getViewProjectionMatrix();\n }\n\n projectToScreen(worldPos: [number, number, number]) {\n if (!this.axes) return { x: 0, y: 0, visible: false };\n const { width, height } = this.getCanvasSize();\n return this.axes.projectToScreen(worldPos, this.camera.getViewProjectionMatrix(), width, height);\n }\n on(event: string, callback: Renderer3DEventCallback): void {\n if (!this.eventListeners.has(event)) this.eventListeners.set(event, new Set());\n this.eventListeners.get(event)!.add(callback);\n }\n private emitEvent(type: string): void {\n const listeners = this.eventListeners.get(type);\n if (!listeners) return;\n listeners.forEach(cb => cb({ \n type: type as any, timestamp: performance.now(), \n stats: { fps: 60, frameTime: 16, instanceCount: this.series.length, drawCalls: 1 },\n camera: { target: [...this.camera.target] as any, radius: this.camera.radius, theta: this.camera.theta, phi: this.camera.phi, fov: this.camera.fov }\n }));\n }\n\n destroy(): void {\n window.removeEventListener('resize', this.handleResize);\n if (this.animationFrameId) cancelAnimationFrame(this.animationFrameId);\n if (this.tooltip) this.tooltip.destroy();\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n [this.positionBuffer, this.normalBuffer, this.colorBuffer, this.indexBuffer].forEach(b => b && gl.deleteBuffer(b));\n deleteProgramBundle(gl, this.programs);\n }\n}\n","/**\n * Surface Bar 3D Renderer (3D Histogram)\n * Renders a grid of vertical bars on a 3D plane.\n * Optimized for 3D histograms, grid-based population density, or spatial data.\n */\n\nimport { OrbitCamera, type OrbitCameraOptions } from './camera/OrbitCamera';\nimport { OrbitController, type OrbitControllerOptions } from './controls/OrbitController';\nimport {\n createProgramBundle3D,\n deleteProgramBundle,\n type ProgramBundle3D,\n} from './shader/programs';\nimport { Axes3D, type Axes3DOptions } from './Axes3D';\nimport { Tooltip3D } from './Tooltip3D';\nimport { createRayFromScreen, pickBubble } from './Raycaster3D';\nimport { createVoxelCube } from './mesh';\nimport type {\n Renderer3DOptions,\n Bounds3D,\n Renderer3DEventCallback,\n} from './types';\nimport { createTheme, type CustomThemeOptions, type ColorTheme } from './colorThemes';\n\nexport interface SurfaceBarData {\n /** Number of rows in the grid (Z axis) */\n rows: number;\n /** Number of columns in the grid (X axis) */\n cols: number;\n /** Height values for each bar [v_0_0, v_0_1, ..., v_r-1_c-1] */\n heights: Float32Array;\n /** Colors per bar [r0, g0, b0, ...] (optional) */\n colors?: Float32Array;\n /** Origin point of the grid [x, y, z] (default [0,0,0]) */\n origin?: [number, number, number];\n /** Spacing between bars [dx, dz] (default [1,1]) */\n spacing?: [number, number];\n}\n\nexport interface SurfaceBar3DRendererOptions extends Renderer3DOptions {\n camera?: OrbitCameraOptions;\n controls?: OrbitControllerOptions;\n axes?: Axes3DOptions;\n showAxes?: boolean;\n /** Opacity (default: 1.0) */\n opacity?: number;\n /** Bar scale (default: 1.0) */\n barScale?: number;\n /** Color theme options */\n theme?: CustomThemeOptions;\n /** Enable tooltips */\n enableTooltip?: boolean;\n}\n\nexport class SurfaceBar3DRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGL2RenderingContext;\n private dpr: number;\n \n private programs: ProgramBundle3D;\n private camera: OrbitCamera;\n private controller: OrbitController;\n private axes: Axes3D | null = null;\n \n // Base cube geometry\n private vao: WebGLVertexArrayObject | null = null;\n private positionBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n private indexCount = 0;\n\n // Instance buffers\n private instancePosBuffer: WebGLBuffer | null = null;\n private heightBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private barCount = 0;\n \n private backgroundColor: [number, number, number, number] = [0.05, 0.05, 0.1, 1];\n private barWidth: number = 0.8;\n private barDepth: number = 0.8;\n private barScale: number;\n private opacity: number;\n \n private data: SurfaceBarData | null = null;\n private bounds: Bounds3D | null = null;\n \n private animationFrameId: number | null = null;\n private needsRender = true;\n private eventListeners: Map<string, Set<Renderer3DEventCallback>> = new Map();\n \n // Tooltip\n private tooltip: Tooltip3D | null = null;\n private lastHitIndex: number = -1;\n private boundHandleMouseMove?: (e: MouseEvent) => void;\n private boundHandleMouseLeave?: () => void;\n \n // Color theme\n private colorTheme: ColorTheme;\n\n constructor(options: SurfaceBar3DRendererOptions) {\n this.canvas = options.canvas;\n this.dpr = window.devicePixelRatio || 1;\n this.barScale = options.barScale ?? 0.8;\n this.opacity = options.opacity ?? 1.0;\n \n if (options.backgroundColor) this.backgroundColor = options.backgroundColor;\n \n // Initialize color theme\n this.colorTheme = createTheme(options.theme || {}, this.backgroundColor);\n\n const gl = this.canvas.getContext('webgl2', { alpha: true, antialias: true });\n if (!gl) throw new Error('WebGL2 not supported');\n this.gl = gl;\n\n gl.enable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n this.programs = createProgramBundle3D(gl);\n this.camera = new OrbitCamera(options.camera);\n this.controller = new OrbitController(this.camera, this.canvas, options.controls);\n this.controller.onChange(() => { this.needsRender = true; this.emitEvent('cameraChange'); });\n\n if (options.showAxes !== false) {\n this.axes = new Axes3D(gl, options.axes);\n }\n\n if (options.enableTooltip !== false) {\n this.tooltip = new Tooltip3D(this.canvas.parentElement || document.body);\n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseLeave = this.handleMouseLeave.bind(this);\n this.canvas.addEventListener('mousemove', this.boundHandleMouseMove);\n this.canvas.addEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n\n this.initBuffers();\n this.resize();\n window.addEventListener('resize', this.handleResize);\n this.startRenderLoop();\n }\n\n private initBuffers(): void {\n const { gl } = this;\n const cube = createVoxelCube();\n const program = this.programs.surfaceBarProgram;\n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n\n this.positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, cube.positions, gl.STATIC_DRAW);\n const posLoc = program.attributes.a_position;\n if (posLoc !== -1) {\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n this.indexBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, cube.indices, gl.STATIC_DRAW);\n this.indexCount = cube.indices.length;\n\n // Instance attributes\n this.instancePosBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instancePosBuffer);\n const instPosLoc = program.attributes.a_instancePos;\n if (instPosLoc !== -1) {\n gl.enableVertexAttribArray(instPosLoc);\n gl.vertexAttribPointer(instPosLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(instPosLoc, 1);\n }\n\n this.heightBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.heightBuffer);\n const heightLoc = program.attributes.a_height;\n if (heightLoc !== -1) {\n gl.enableVertexAttribArray(heightLoc);\n gl.vertexAttribPointer(heightLoc, 1, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(heightLoc, 1);\n }\n\n this.colorBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n const colorLoc = program.attributes.a_color;\n if (colorLoc !== -1) {\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(colorLoc, 1);\n }\n\n gl.bindVertexArray(null);\n }\n\n setData(data: SurfaceBarData): void {\n this.data = data;\n const { rows, cols, spacing = [1, 1], origin = [0, 0, 0] } = data;\n this.barCount = rows * cols;\n this.barWidth = spacing[0] * this.barScale;\n this.barDepth = spacing[1] * this.barScale;\n\n const positions = new Float32Array(this.barCount * 3);\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const i = (r * cols + c) * 3;\n positions[i] = origin[0] + c * spacing[0];\n positions[i + 1] = origin[1]; // Base Y\n positions[i + 2] = origin[2] + r * spacing[1];\n }\n }\n\n const { gl } = this;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instancePosBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.heightBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, data.heights, gl.STATIC_DRAW);\n\n // Use theme palette if no colors provided\n const colors = data.colors || this.generateThemeColors(this.barCount);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);\n\n this.updateBounds();\n this.needsRender = true;\n }\n\n private updateBounds(): void {\n if (!this.data) return;\n const { rows, cols, heights, spacing = [1, 1], origin = [0, 0, 0] } = this.data;\n \n let maxH = -Infinity, minH = Infinity;\n for (let i = 0; i < heights.length; i++) {\n if (heights[i] > maxH) maxH = heights[i];\n if (heights[i] < minH) minH = heights[i];\n }\n\n this.bounds = {\n minX: origin[0] - spacing[0]/2,\n maxX: origin[0] + (cols - 1) * spacing[0] + spacing[0]/2,\n minY: origin[1],\n maxY: origin[1] + maxH,\n minZ: origin[2] - spacing[1]/2,\n maxZ: origin[2] + (rows - 1) * spacing[1] + spacing[1]/2\n };\n if (this.axes) this.axes.updateBounds(this.bounds);\n }\n \n private generateThemeColors(count: number): Float32Array {\n const colors = new Float32Array(count * 3);\n const palette = this.colorTheme.seriesPalette;\n for (let i = 0; i < count; i++) {\n const c = palette[i % palette.length];\n colors[i * 3] = c[0];\n colors[i * 3 + 1] = c[1];\n colors[i * 3 + 2] = c[2];\n }\n return colors;\n }\n\n render(): void {\n const { gl, camera } = this;\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n gl.clearColor(this.backgroundColor[0], this.backgroundColor[1], this.backgroundColor[2], this.backgroundColor[3]);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n\n const viewProj = camera.getViewProjectionMatrix() as Float32Array;\n if (this.axes) this.axes.render(viewProj);\n\n if (this.barCount > 0 && this.vao) {\n const program = this.programs.surfaceBarProgram;\n gl.useProgram(program.program);\n gl.uniformMatrix4fv(program.uniforms.u_viewProjection, false, viewProj);\n gl.uniform1f(program.uniforms.u_opacity, this.opacity);\n gl.uniform1f(program.uniforms.u_barWidth, this.barWidth);\n gl.uniform1f(program.uniforms.u_barDepth, this.barDepth);\n gl.uniform3fv(program.uniforms.u_lightDir, new Float32Array([0.5, 1, 0.3]));\n\n gl.bindVertexArray(this.vao);\n gl.drawElementsInstanced(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_SHORT, 0, this.barCount);\n gl.bindVertexArray(null);\n }\n this.emitEvent('render');\n }\n\n private startRenderLoop(): void {\n const loop = () => {\n const moving = this.controller.update();\n if (this.needsRender || moving) {\n this.render();\n this.needsRender = false;\n }\n this.animationFrameId = requestAnimationFrame(loop);\n };\n this.animationFrameId = requestAnimationFrame(loop);\n }\n\n fitToData(): void {\n if (!this.bounds) return;\n const { minX, maxX, minY, maxY, minZ, maxZ } = this.bounds;\n this.camera.fitToBounds(minX, minY, minZ, maxX, maxY, maxZ);\n this.camera.radius *= 1.3;\n this.needsRender = true;\n }\n\n private handleMouseMove(e: MouseEvent): void {\n if (!this.tooltip || !this.data) return;\n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left, y = e.clientY - rect.top;\n \n const { width, height } = this.getCanvasSize();\n const viewProj = this.camera.getViewProjectionMatrix() as Float32Array;\n const ray = createRayFromScreen(x, y, width, height, viewProj);\n \n // Pick based on bar centers (offset by height/2)\n const { rows, cols, heights, spacing = [1,1], origin = [0,0,0] } = this.data;\n const centers = new Float32Array(this.barCount * 3);\n const radii = new Float32Array(this.barCount);\n\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const idx = r * cols + c;\n centers[idx*3] = origin[0] + c * spacing[0];\n centers[idx*3+1] = origin[1] + heights[idx] / 2;\n centers[idx*3+2] = origin[2] + r * spacing[1];\n radii[idx] = Math.max(this.barWidth, this.barDepth, heights[idx]) * 0.6;\n }\n }\n\n const hit = pickBubble(ray, centers, radii);\n\n if (hit) {\n if (hit.index !== this.lastHitIndex) {\n this.lastHitIndex = hit.index;\n const val = this.data.heights[hit.index];\n const r = Math.floor(hit.index / cols);\n const c = hit.index % cols;\n\n this.tooltip.show({\n index: hit.index,\n position: [centers[hit.index*3], origin[1] + heights[hit.index], centers[hit.index*3+2]],\n customData: { Height: val.toFixed(2), Row: r, Col: c }\n }, x, y);\n } else {\n this.tooltip.updatePosition(x, y);\n }\n } else if (this.lastHitIndex !== -1) {\n this.tooltip.hide();\n this.lastHitIndex = -1;\n }\n }\n\n private handleMouseLeave(): void {\n if (this.tooltip) { this.tooltip.hide(); this.lastHitIndex = -1; }\n }\n\n private handleResize = () => { this.resize(); this.needsRender = true; }\n private resize(): void {\n const width = this.canvas.clientWidth, height = this.canvas.clientHeight;\n this.canvas.width = width * this.dpr; this.canvas.height = height * this.dpr;\n this.gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n this.camera.aspect = width / height;\n }\n getCanvasSize() { const rect = this.canvas.getBoundingClientRect(); return { width: rect.width, height: rect.height }; }\n \n getAxisLabels() {\n return this.axes?.getLabels() ?? [];\n }\n\n getViewProjectionMatrix() {\n return this.camera.getViewProjectionMatrix();\n }\n\n projectToScreen(worldPos: [number, number, number]) {\n if (!this.axes) return { x: 0, y: 0, visible: false };\n const { width, height } = this.getCanvasSize();\n return this.axes.projectToScreen(worldPos, this.camera.getViewProjectionMatrix(), width, height);\n }\n \n on(event: string, callback: Renderer3DEventCallback): void {\n if (!this.eventListeners.has(event)) this.eventListeners.set(event, new Set());\n this.eventListeners.get(event)!.add(callback);\n }\n\n private emitEvent(type: string): void {\n const listeners = this.eventListeners.get(type);\n if (!listeners) return;\n listeners.forEach(cb => cb({ \n type: type as any, timestamp: performance.now(), \n stats: { fps: 60, frameTime: 16, instanceCount: this.barCount, drawCalls: 1 },\n camera: { target: [...this.camera.target] as any, radius: this.camera.radius, theta: this.camera.theta, phi: this.camera.phi, fov: this.camera.fov }\n }));\n }\n\n destroy(): void {\n window.removeEventListener('resize', this.handleResize);\n if (this.animationFrameId) cancelAnimationFrame(this.animationFrameId);\n if (this.tooltip) this.tooltip.destroy();\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n [this.positionBuffer, this.indexBuffer, this.instancePosBuffer, this.heightBuffer, this.colorBuffer].forEach(b => b && gl.deleteBuffer(b));\n deleteProgramBundle(gl, this.programs);\n }\n}\n","/**\n * Surface Mesh 3D renderer.\n * Renders a grid-based height map with optional colormap.\n */\n\nimport type { ShaderProgram3D } from '../shader/programs';\nimport type { SurfaceMesh3DData } from './types';\n\nexport interface SurfaceMeshOptions {\n maxVertices?: number;\n}\n\nexport class SurfaceMesh3D {\n private gl: WebGL2RenderingContext;\n private vao: WebGLVertexArrayObject | null = null;\n \n private positionBuffer: WebGLBuffer | null = null;\n private normalBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n private wireframeIndexBuffer: WebGLBuffer | null = null;\n \n private vertexCount = 0;\n private indexCount = 0;\n private wireframeIndexCount = 0;\n \n private cols = 0;\n private rows = 0;\n \n constructor(gl: WebGL2RenderingContext, _options: SurfaceMeshOptions = {}) {\n this.gl = gl;\n this.initBuffers();\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n this.positionBuffer = gl.createBuffer();\n this.normalBuffer = gl.createBuffer();\n this.colorBuffer = gl.createBuffer();\n this.indexBuffer = gl.createBuffer();\n this.wireframeIndexBuffer = gl.createBuffer();\n \n gl.bindVertexArray(null);\n }\n \n /**\n * Update mesh data from surface data.\n */\n updateData(data: SurfaceMesh3DData): void {\n const { gl } = this;\n \n this.cols = data.xValues.length;\n this.rows = data.zValues.length;\n this.vertexCount = this.cols * this.rows;\n \n // Generate positions\n const positions = new Float32Array(this.vertexCount * 3);\n const normals = new Float32Array(this.vertexCount * 3);\n \n for (let row = 0; row < this.rows; row++) {\n for (let col = 0; col < this.cols; col++) {\n const idx = row * this.cols + col;\n const i3 = idx * 3;\n \n positions[i3] = data.xValues[col];\n positions[i3 + 1] = data.yValues[idx];\n positions[i3 + 2] = data.zValues[row];\n }\n }\n \n // Calculate normals\n this.calculateNormals(positions, normals);\n \n // Generate colors from height or provided colors\n const colors = data.colors ?? this.generateHeightColors(data.yValues);\n \n // Generate triangle indices\n const indices = this.generateTriangleIndices();\n this.indexCount = indices.length;\n \n // Generate wireframe indices\n const wireframeIndices = this.generateWireframeIndices();\n this.wireframeIndexCount = wireframeIndices.length;\n \n // Upload to GPU\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, normals, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.wireframeIndexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, wireframeIndices, gl.STATIC_DRAW);\n }\n \n private calculateNormals(positions: Float32Array, normals: Float32Array): void {\n const { cols, rows } = this;\n \n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const idx = row * cols + col;\n const i3 = idx * 3;\n \n // Get neighboring heights for gradient\n const h = positions[i3 + 1];\n const hL = col > 0 ? positions[(idx - 1) * 3 + 1] : h;\n const hR = col < cols - 1 ? positions[(idx + 1) * 3 + 1] : h;\n const hD = row > 0 ? positions[(idx - cols) * 3 + 1] : h;\n const hU = row < rows - 1 ? positions[(idx + cols) * 3 + 1] : h;\n \n // Calculate normal from gradient\n const dx = (hR - hL) / 2;\n const dz = (hU - hD) / 2;\n \n const nx = -dx;\n const ny = 1;\n const nz = -dz;\n \n const len = Math.sqrt(nx * nx + ny * ny + nz * nz);\n normals[i3] = nx / len;\n normals[i3 + 1] = ny / len;\n normals[i3 + 2] = nz / len;\n }\n }\n }\n \n private generateHeightColors(yValues: Float32Array): Float32Array {\n const colors = new Float32Array(yValues.length * 3);\n \n // Find min/max\n let minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < yValues.length; i++) {\n if (yValues[i] < minY) minY = yValues[i];\n if (yValues[i] > maxY) maxY = yValues[i];\n }\n \n const range = maxY - minY || 1;\n \n // Viridis-like colormap\n for (let i = 0; i < yValues.length; i++) {\n const t = (yValues[i] - minY) / range;\n const i3 = i * 3;\n \n // Simplified viridis\n colors[i3] = 0.267 + t * 0.329; // R\n colors[i3 + 1] = 0.004 + t * 0.873; // G\n colors[i3 + 2] = 0.329 + t * 0.341; // B\n }\n \n return colors;\n }\n \n private generateTriangleIndices(): Uint32Array {\n const { cols, rows } = this;\n const indices: number[] = [];\n \n for (let row = 0; row < rows - 1; row++) {\n for (let col = 0; col < cols - 1; col++) {\n const topLeft = row * cols + col;\n const topRight = topLeft + 1;\n const bottomLeft = topLeft + cols;\n const bottomRight = bottomLeft + 1;\n \n // Two triangles per quad\n indices.push(topLeft, bottomLeft, topRight);\n indices.push(topRight, bottomLeft, bottomRight);\n }\n }\n \n return new Uint32Array(indices);\n }\n \n private generateWireframeIndices(): Uint32Array {\n const { cols, rows } = this;\n const indices: number[] = [];\n \n // Horizontal lines\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols - 1; col++) {\n const idx = row * cols + col;\n indices.push(idx, idx + 1);\n }\n }\n \n // Vertical lines\n for (let col = 0; col < cols; col++) {\n for (let row = 0; row < rows - 1; row++) {\n const idx = row * cols + col;\n indices.push(idx, idx + cols);\n }\n }\n \n return new Uint32Array(indices);\n }\n \n /**\n * Render the surface mesh.\n */\n render(program: ShaderProgram3D, wireframe = false): void {\n const { gl } = this;\n \n if (this.vertexCount === 0) return;\n \n gl.bindVertexArray(this.vao);\n \n // Position attribute\n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n // Normal attribute\n const normalLoc = program.attributes['a_normal'];\n if (normalLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.enableVertexAttribArray(normalLoc);\n gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n // Color attribute\n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n if (wireframe) {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.wireframeIndexBuffer);\n gl.drawElements(gl.LINES, this.wireframeIndexCount, gl.UNSIGNED_INT, 0);\n } else {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.drawElements(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0);\n }\n \n gl.bindVertexArray(null);\n }\n \n destroy(): void {\n const { gl } = this;\n \n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.normalBuffer) gl.deleteBuffer(this.normalBuffer);\n if (this.colorBuffer) gl.deleteBuffer(this.colorBuffer);\n if (this.indexBuffer) gl.deleteBuffer(this.indexBuffer);\n if (this.wireframeIndexBuffer) gl.deleteBuffer(this.wireframeIndexBuffer);\n }\n}\n","/**\n * Surface Mesh 3D Renderer\n * Complete renderer for surface mesh visualization with axes, camera, and controls.\n */\n\nimport { OrbitCamera, type OrbitCameraOptions } from './camera/OrbitCamera';\nimport { OrbitController, type OrbitControllerOptions } from './controls/OrbitController';\nimport { SurfaceMesh3D } from './series/SurfaceMesh3D';\nimport {\n createProgramBundle3D,\n deleteProgramBundle,\n type ProgramBundle3D,\n} from './shader/programs';\nimport { Axes3D, type Axes3DOptions } from './Axes3D';\nimport { Tooltip3D, type Tooltip3DOptions } from './Tooltip3D';\nimport { createRayFromScreen, pickSurfaceMesh } from './Raycaster3D';\nimport type { SurfaceMesh3DData } from './series/types';\nimport type {\n Renderer3DOptions,\n Bounds3D,\n RenderStats3D,\n Renderer3DEvent,\n Renderer3DEventCallback,\n} from './types';\n\nexport interface SurfaceMesh3DRendererOptions extends Renderer3DOptions {\n camera?: OrbitCameraOptions;\n controls?: OrbitControllerOptions;\n axes?: Axes3DOptions;\n showAxes?: boolean;\n wireframe?: boolean;\n opacity?: number;\n enableLighting?: boolean;\n ambient?: number;\n lightDirection?: [number, number, number];\n /** Enable tooltips on hover (default: true) */\n enableTooltip?: boolean;\n /** Tooltip configuration */\n tooltip?: Tooltip3DOptions;\n}\n\nexport class SurfaceMesh3DRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGL2RenderingContext;\n private dpr: number;\n \n private programs: ProgramBundle3D;\n private mesh: SurfaceMesh3D;\n private camera: OrbitCamera;\n private controller: OrbitController;\n private axes: Axes3D | null = null;\n \n private backgroundColor: [number, number, number, number] = [0.05, 0.05, 0.1, 1];\n private showAxes: boolean;\n private wireframe: boolean;\n private opacity: number;\n private enableLighting: boolean;\n private ambient: number;\n private lightDirection: [number, number, number];\n \n private bounds: Bounds3D | null = null;\n private vertexCount = 0;\n \n private animationFrameId: number | null = null;\n private needsRender = true;\n \n private eventListeners: Map<string, Set<Renderer3DEventCallback>> = new Map();\n \n // Tooltip\n private tooltip: Tooltip3D | null = null;\n private enableTooltipOption: boolean = true;\n private meshData: SurfaceMesh3DData | null = null;\n private boundHandleMouseMove: ((e: MouseEvent) => void) | null = null;\n private boundHandleMouseLeave: (() => void) | null = null;\n \n // Stats\n private lastFrameTime = 0;\n private frameCount = 0;\n private fps = 0;\n private lastFpsUpdate = 0;\n \n constructor(options: SurfaceMesh3DRendererOptions) {\n this.canvas = options.canvas;\n this.dpr = window.devicePixelRatio || 1;\n this.showAxes = options.showAxes ?? true;\n this.wireframe = options.wireframe ?? false;\n this.opacity = options.opacity ?? 1;\n this.enableLighting = options.enableLighting ?? true;\n this.ambient = options.ambient ?? 0.35;\n this.lightDirection = options.lightDirection ?? [1, 1, 1];\n \n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor;\n }\n \n // Get WebGL2 context\n const gl = this.canvas.getContext('webgl2', {\n alpha: true,\n antialias: true,\n preserveDrawingBuffer: false,\n });\n \n if (!gl) {\n throw new Error('WebGL2 not supported');\n }\n this.gl = gl;\n \n // Enable depth testing\n gl.enable(gl.DEPTH_TEST);\n gl.depthFunc(gl.LEQUAL);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n \n // Create shader programs\n this.programs = createProgramBundle3D(gl);\n \n // Create surface mesh\n this.mesh = new SurfaceMesh3D(gl);\n \n // Create camera\n this.camera = new OrbitCamera(options.camera);\n \n // Create controller\n this.controller = new OrbitController(this.camera, this.canvas, options.controls);\n this.controller.onChange(() => {\n this.needsRender = true;\n this.emitEvent('cameraChange');\n });\n \n // Create axes\n if (this.showAxes) {\n this.axes = new Axes3D(gl, options.axes);\n }\n \n // Initialize tooltip\n this.enableTooltipOption = options.enableTooltip ?? true;\n if (this.enableTooltipOption) {\n this.tooltip = new Tooltip3D(this.canvas.parentElement || document.body, {\n ...options.tooltip,\n showScale: false,\n showIndex: false,\n });\n \n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseLeave = this.handleMouseLeave.bind(this);\n this.canvas.addEventListener('mousemove', this.boundHandleMouseMove);\n this.canvas.addEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n \n // Handle resize\n this.resize();\n window.addEventListener('resize', this.handleResize);\n \n // Start render loop\n this.startRenderLoop();\n }\n \n private handleMouseMove(e: MouseEvent): void {\n if (!this.tooltip || !this.meshData) return;\n \n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n \n // Create ray from screen coordinates\n const viewProj = this.camera.getViewProjectionMatrix();\n const ray = createRayFromScreen(x, y, rect.width, rect.height, viewProj);\n \n // Test ray against surface mesh triangles\n const hit = pickSurfaceMesh(\n ray,\n this.meshData.xValues,\n this.meshData.zValues,\n this.meshData.yValues\n );\n \n if (hit) {\n // Only show tooltip when ray actually hits the surface\n this.tooltip.show({\n index: hit.row * this.meshData.xValues.length + hit.col,\n position: hit.point,\n }, x, y);\n } else {\n this.tooltip.hide();\n }\n }\n \n private handleMouseLeave(): void {\n if (this.tooltip) {\n this.tooltip.hide();\n }\n }\n \n private handleResize = (): void => {\n this.resize();\n this.needsRender = true;\n };\n \n resize(): void {\n const { canvas, gl, dpr, camera } = this;\n \n const width = canvas.clientWidth;\n const height = canvas.clientHeight;\n \n canvas.width = width * dpr;\n canvas.height = height * dpr;\n \n gl.viewport(0, 0, canvas.width, canvas.height);\n camera.aspect = width / height;\n }\n \n /**\n * Set surface mesh data\n */\n setData(data: SurfaceMesh3DData): void {\n this.mesh.updateData(data);\n this.meshData = data; // Store for tooltip hover\n this.vertexCount = data.xValues.length * data.zValues.length;\n \n // Calculate bounds\n this.bounds = this.calculateBounds(data);\n \n // Update axes\n if (this.axes && this.bounds) {\n this.axes.updateBounds(this.bounds);\n }\n \n this.needsRender = true;\n this.emitEvent('dataUpdate');\n }\n \n private calculateBounds(data: SurfaceMesh3DData): Bounds3D {\n const xMin = Math.min(...data.xValues);\n const xMax = Math.max(...data.xValues);\n const zMin = Math.min(...data.zValues);\n const zMax = Math.max(...data.zValues);\n \n let yMin = Infinity, yMax = -Infinity;\n for (let i = 0; i < data.yValues.length; i++) {\n if (data.yValues[i] < yMin) yMin = data.yValues[i];\n if (data.yValues[i] > yMax) yMax = data.yValues[i];\n }\n \n return { minX: xMin, maxX: xMax, minY: yMin, maxY: yMax, minZ: zMin, maxZ: zMax };\n }\n \n /**\n * Fit camera to show all data\n */\n fitToData(): void {\n if (!this.bounds) return;\n \n const { minX, maxX, minY, maxY, minZ, maxZ } = this.bounds;\n \n // Add 15% padding to bounds for better fit\n const dx = maxX - minX;\n const dy = maxY - minY;\n const dz = maxZ - minZ;\n const padding = 0.0001;\n \n this.camera.fitToBounds(\n minX - dx * padding, minY - dy * padding, minZ - dz * padding,\n maxX + dx * padding, maxY + dy * padding, maxZ + dz * padding\n );\n \n // Closer fit for impact\n this.camera.radius *= 1.05;\n \n this.needsRender = true;\n }\n \n /**\n * Render a single frame\n */\n render(): void {\n const { gl, programs, mesh, camera, backgroundColor } = this;\n \n const startTime = performance.now();\n \n // Clear\n gl.clearColor(\n backgroundColor[0],\n backgroundColor[1],\n backgroundColor[2],\n backgroundColor[3]\n );\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n \n // Get view projection matrix\n const viewProj = camera.getViewProjectionMatrix();\n \n // Render axes first\n if (this.axes) {\n this.axes.render(viewProj);\n }\n \n // Render surface mesh\n const program = programs.surfaceProgram;\n gl.useProgram(program.program);\n \n // Set uniforms\n gl.uniformMatrix4fv(program.uniforms['u_viewProjection'], false, viewProj);\n gl.uniform1f(program.uniforms['u_opacity'], this.opacity);\n \n if (this.enableLighting) {\n const [lx, ly, lz] = this.lightDirection;\n gl.uniform3f(program.uniforms['u_lightDir'], lx, ly, lz);\n gl.uniform1f(program.uniforms['u_ambient'], this.ambient);\n }\n \n mesh.render(program, this.wireframe);\n \n // Update stats\n const frameTime = performance.now() - startTime;\n this.lastFrameTime = frameTime;\n this.frameCount++;\n \n const now = performance.now();\n if (now - this.lastFpsUpdate >= 1000) {\n this.fps = this.frameCount;\n this.frameCount = 0;\n this.lastFpsUpdate = now;\n }\n \n this.emitEvent('render');\n }\n \n startRenderLoop(): void {\n if (this.animationFrameId !== null) return;\n \n const loop = (): void => {\n this.controller.update();\n \n if (this.needsRender) {\n this.render();\n this.needsRender = false;\n }\n \n this.animationFrameId = requestAnimationFrame(loop);\n };\n \n loop();\n }\n \n stopRenderLoop(): void {\n if (this.animationFrameId !== null) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n }\n \n /**\n * Set wireframe mode\n */\n setWireframe(enabled: boolean): void {\n this.wireframe = enabled;\n this.needsRender = true;\n }\n \n /**\n * Set background color\n */\n setBackgroundColor(color: [number, number, number, number]): void {\n this.backgroundColor = color;\n this.needsRender = true;\n }\n \n /**\n * Get rendering stats\n */\n getStats(): RenderStats3D {\n return {\n fps: this.fps,\n instanceCount: this.vertexCount,\n frameTime: this.lastFrameTime,\n drawCalls: 1,\n };\n }\n \n /**\n * Get the camera\n */\n getCamera(): OrbitCamera {\n return this.camera;\n }\n \n /**\n * Get axis labels for 2D text overlay\n */\n getAxisLabels(): { text: string; worldPosition: [number, number, number]; axis: string; color: [number, number, number] }[] {\n if (!this.axes) return [];\n return this.axes.getLabels();\n }\n \n /**\n * Project world coordinates to screen coordinates\n */\n projectToScreen(worldPos: [number, number, number]): { x: number; y: number; visible: boolean } {\n if (!this.axes) return { x: 0, y: 0, visible: false };\n \n const viewProj = this.camera.getViewProjectionMatrix();\n const rect = this.canvas.getBoundingClientRect();\n \n return this.axes.projectToScreen(worldPos, viewProj, rect.width, rect.height);\n }\n \n /**\n * Get the current view-projection matrix\n */\n getViewProjectionMatrix(): Float32Array {\n return this.camera.getViewProjectionMatrix();\n }\n \n /**\n * Get canvas dimensions\n */\n getCanvasSize(): { width: number; height: number } {\n const rect = this.canvas.getBoundingClientRect();\n return { width: rect.width, height: rect.height };\n }\n \n /**\n * Add event listener\n */\n on(event: string, callback: Renderer3DEventCallback): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n \n /**\n * Remove event listener\n */\n off(event: string, callback: Renderer3DEventCallback): void {\n this.eventListeners.get(event)?.delete(callback);\n }\n \n private emitEvent(type: string): void {\n const listeners = this.eventListeners.get(type);\n if (!listeners) return;\n \n const event: Renderer3DEvent = {\n type: type as any,\n timestamp: performance.now(),\n stats: this.getStats(),\n camera: {\n target: [...this.camera.target] as [number, number, number],\n radius: this.camera.radius,\n theta: this.camera.theta,\n phi: this.camera.phi,\n fov: this.camera.fov,\n },\n };\n \n listeners.forEach(callback => {\n callback(event);\n });\n }\n \n /**\n * Clean up all resources\n */\n destroy(): void {\n this.stopRenderLoop();\n \n window.removeEventListener('resize', this.handleResize);\n \n // Clean up tooltip\n if (this.tooltip) {\n this.tooltip.destroy();\n if (this.boundHandleMouseMove) {\n this.canvas.removeEventListener('mousemove', this.boundHandleMouseMove);\n }\n if (this.boundHandleMouseLeave) {\n this.canvas.removeEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n }\n \n this.controller.destroy();\n this.mesh.destroy();\n deleteProgramBundle(this.gl, this.programs);\n \n if (this.axes) {\n this.axes.destroy();\n }\n \n this.eventListeners.clear();\n }\n}\n","/**\n * Vector Field (Quiver) 3D Renderer\n * Renders an array of vectors (arrows/lines) oriented by direction and scaled by magnitude.\n * Uses instanced rendering for high performance.\n */\n\nimport { OrbitCamera, type OrbitCameraOptions } from './camera/OrbitCamera';\nimport { OrbitController, type OrbitControllerOptions } from './controls/OrbitController';\nimport {\n createProgramBundle3D,\n deleteProgramBundle,\n type ProgramBundle3D,\n} from './shader/programs';\nimport { Axes3D, type Axes3DOptions } from './Axes3D';\nimport { Tooltip3D } from './Tooltip3D';\nimport { createRayFromScreen, pickBubble } from './Raycaster3D';\nimport type {\n Renderer3DOptions,\n Bounds3D,\n Renderer3DEventCallback,\n} from './types';\nimport { createTheme, type CustomThemeOptions, type ColorTheme } from './colorThemes';\n\nexport interface VectorFieldData {\n /** Origin positions [x0, y0, z0, x1, y1, z1, ...] */\n positions: Float32Array;\n /** Direction vectors [dx0, dy0, dz0, dx1, dy1, dz1, ...] */\n directions: Float32Array;\n /** Colors per vector [r0, g0, b0, ...] (optional) */\n colors?: Float32Array;\n /** Single color for all vectors (default: [0.3, 0.8, 1.0]) */\n color?: [number, number, number];\n}\n\nexport interface VectorField3DRendererOptions extends Renderer3DOptions {\n camera?: OrbitCameraOptions;\n controls?: OrbitControllerOptions;\n axes?: Axes3DOptions;\n showAxes?: boolean;\n /** Arrow scale multiplier (default: 1.0) */\n scaleMultiplier?: number;\n /** Opacity for arrows (default: 0.9) */\n opacity?: number;\n /** Color theme options */\n theme?: CustomThemeOptions;\n /** Enable tooltips */\n enableTooltip?: boolean;\n}\n\nexport class VectorField3DRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGL2RenderingContext;\n private dpr: number;\n \n private programs: ProgramBundle3D;\n private camera: OrbitCamera;\n private controller: OrbitController;\n private axes: Axes3D | null = null;\n \n // Base arrow geometry\n private vao: WebGLVertexArrayObject | null = null;\n private positionBuffer: WebGLBuffer | null = null;\n private normalBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n private indexCount = 0;\n\n // Instance buffers\n private instancePosBuffer: WebGLBuffer | null = null;\n private instanceDirBuffer: WebGLBuffer | null = null;\n private instanceColorBuffer: WebGLBuffer | null = null;\n private vectorCount = 0;\n \n private backgroundColor: [number, number, number, number] = [0.05, 0.05, 0.1, 1];\n private scaleMultiplier: number;\n private opacity: number;\n \n private vectorData: VectorFieldData | null = null;\n private bounds: Bounds3D | null = null;\n \n private animationFrameId: number | null = null;\n private needsRender = true;\n private eventListeners: Map<string, Set<Renderer3DEventCallback>> = new Map();\n \n // Tooltip\n private tooltip: Tooltip3D | null = null;\n private lastHitIndex: number = -1;\n private boundHandleMouseMove?: (e: MouseEvent) => void;\n private boundHandleMouseLeave?: () => void;\n \n // Color theme\n private colorTheme: ColorTheme;\n\n constructor(options: VectorField3DRendererOptions) {\n this.canvas = options.canvas;\n this.dpr = window.devicePixelRatio || 1;\n this.scaleMultiplier = options.scaleMultiplier ?? 1.0;\n this.opacity = options.opacity ?? 1.0;\n \n if (options.backgroundColor) this.backgroundColor = options.backgroundColor;\n \n // Initialize color theme\n this.colorTheme = createTheme(options.theme || {}, this.backgroundColor);\n\n const gl = this.canvas.getContext('webgl2', { alpha: true, antialias: true });\n if (!gl) throw new Error('WebGL2 not supported');\n this.gl = gl;\n\n gl.enable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n this.programs = createProgramBundle3D(gl);\n this.camera = new OrbitCamera(options.camera);\n this.controller = new OrbitController(this.camera, this.canvas, options.controls);\n this.controller.onChange(() => { this.needsRender = true; this.emitEvent('cameraChange'); });\n\n if (options.showAxes !== false) {\n this.axes = new Axes3D(gl, options.axes);\n }\n\n if (options.enableTooltip !== false) {\n this.tooltip = new Tooltip3D(this.canvas.parentElement || document.body);\n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseLeave = this.handleMouseLeave.bind(this);\n this.canvas.addEventListener('mousemove', this.boundHandleMouseMove);\n this.canvas.addEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n\n this.initArrowGeometry();\n this.resize();\n window.addEventListener('resize', this.handleResize);\n this.startRenderLoop();\n }\n\n private initArrowGeometry(): void {\n const { gl } = this;\n // Simple arrow shape: box for stem, pyramid for head (simplified here to a pyramid/cone)\n // For now, let's use a simple long pyramid pointing in +Z\n const positions = new Float32Array([\n // Pyramid base\n -0.05, -0.05, 0.0,\n 0.05, -0.05, 0.0,\n 0.05, 0.05, 0.0,\n -0.05, 0.05, 0.0,\n // Tip\n 0.0, 0.0, 1.0\n ]);\n const normals = new Float32Array([\n 0.0, 0.0, -1.0, // base\n 0.0, 0.0, -1.0, \n 0.0, 0.0, -1.0,\n 0.0, 0.0, -1.0,\n 0.0, 1.0, 0.0 // approx tip normal\n ]);\n const indices = new Uint16Array([\n 0, 1, 2, 0, 2, 3, // base\n 0, 1, 4, 1, 2, 4, 2, 3, 4, 3, 0, 4 // sides\n ]);\n\n const program = this.programs.vectorFieldProgram;\n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n\n this.positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);\n const posLoc = program.attributes.a_position;\n if (posLoc !== -1) {\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n this.normalBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, normals, gl.STATIC_DRAW);\n const normalLoc = program.attributes.a_normal;\n if (normalLoc !== -1) {\n gl.enableVertexAttribArray(normalLoc);\n gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n this.indexBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n this.indexCount = indices.length;\n\n // Instance attributes\n this.instancePosBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instancePosBuffer);\n const instPosLoc = program.attributes.a_instancePos;\n if (instPosLoc !== -1) {\n gl.enableVertexAttribArray(instPosLoc);\n gl.vertexAttribPointer(instPosLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(instPosLoc, 1);\n }\n\n this.instanceDirBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceDirBuffer);\n const dirLoc = program.attributes.a_direction;\n if (dirLoc !== -1) {\n gl.enableVertexAttribArray(dirLoc);\n gl.vertexAttribPointer(dirLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(dirLoc, 1);\n }\n\n this.instanceColorBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceColorBuffer);\n const colorLoc = program.attributes.a_color;\n if (colorLoc !== -1) {\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(colorLoc, 1);\n }\n\n gl.bindVertexArray(null);\n }\n\n setData(data: VectorFieldData): void {\n this.vectorData = data;\n this.vectorCount = data.positions.length / 3;\n const { gl } = this;\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instancePosBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, data.positions, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceDirBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, data.directions, gl.STATIC_DRAW);\n\n // Use theme colors if no custom colors provided\n const defaultColor = data.color || this.colorTheme.seriesPalette[0] as [number, number, number];\n const colors = data.colors || new Float32Array(this.vectorCount * 3).fill(0).map((_, i) => defaultColor[i % 3]);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceColorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);\n\n this.updateBounds();\n this.needsRender = true;\n }\n\n private updateBounds(): void {\n if (!this.vectorData) return;\n const p = this.vectorData.positions;\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity, minZ = Infinity, maxZ = -Infinity;\n for (let i = 0; i < p.length; i += 3) {\n if (p[i] < minX) minX = p[i]; if (p[i] > maxX) maxX = p[i];\n if (p[i+1] < minY) minY = p[i+1]; if (p[i+1] > maxY) maxY = p[i+1];\n if (p[i+2] < minZ) minZ = p[i+2]; if (p[i+2] > maxZ) maxZ = p[i+2];\n }\n this.bounds = { minX, maxX, minY, maxY, minZ, maxZ };\n if (this.axes) this.axes.updateBounds(this.bounds);\n }\n\n render(): void {\n const { gl, camera } = this;\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n gl.clearColor(this.backgroundColor[0], this.backgroundColor[1], this.backgroundColor[2], this.backgroundColor[3]);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n\n const viewProj = camera.getViewProjectionMatrix() as Float32Array;\n if (this.axes) this.axes.render(viewProj);\n\n if (this.vectorCount > 0 && this.vao) {\n const program = this.programs.vectorFieldProgram;\n gl.useProgram(program.program);\n gl.uniformMatrix4fv(program.uniforms.u_viewProjection, false, viewProj);\n gl.uniform1f(program.uniforms.u_opacity, this.opacity);\n gl.uniform1f(program.uniforms.u_scaleMultiplier, this.scaleMultiplier);\n gl.uniform3fv(program.uniforms.u_lightDir, new Float32Array([0.5, 1.0, 0.3]));\n\n gl.bindVertexArray(this.vao);\n gl.drawElementsInstanced(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_SHORT, 0, this.vectorCount);\n gl.bindVertexArray(null);\n }\n this.emitEvent('render');\n }\n\n private startRenderLoop(): void {\n const loop = () => {\n const moving = this.controller.update();\n if (this.needsRender || moving) {\n this.render();\n this.needsRender = false;\n }\n this.animationFrameId = requestAnimationFrame(loop);\n };\n this.animationFrameId = requestAnimationFrame(loop);\n }\n\n fitToData(): void {\n if (!this.bounds) return;\n const { minX, maxX, minY, maxY, minZ, maxZ } = this.bounds;\n this.camera.fitToBounds(minX, minY, minZ, maxX, maxY, maxZ);\n this.camera.radius *= 1.2;\n this.needsRender = true;\n }\n\n private handleMouseMove(e: MouseEvent): void {\n if (!this.tooltip || !this.vectorData) return;\n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n \n // Simplificar: usamos pickBubble tratando los orígenes como esferas invisibles\n const { width, height } = this.getCanvasSize();\n const viewProj = this.camera.getViewProjectionMatrix() as Float32Array;\n const ray = createRayFromScreen(x, y, width, height, viewProj);\n const hit = pickBubble(ray, this.vectorData.positions, new Float32Array(this.vectorCount).fill(0.3));\n\n if (hit) {\n if (hit.index !== this.lastHitIndex) {\n this.lastHitIndex = hit.index;\n const i3 = hit.index * 3;\n const dx = this.vectorData.directions[i3];\n const dy = this.vectorData.directions[i3+1];\n const dz = this.vectorData.directions[i3+2];\n const mag = Math.sqrt(dx*dx + dy*dy + dz*dz);\n \n this.tooltip.show({\n index: hit.index,\n position: [this.vectorData.positions[i3], this.vectorData.positions[i3+1], this.vectorData.positions[i3+2]],\n customData: { Magnitude: mag.toFixed(3), Dir: `[${dx.toFixed(2)}, ${dy.toFixed(2)}, ${dz.toFixed(2)}]` }\n }, x, y);\n } else {\n this.tooltip.updatePosition(x, y);\n }\n } else if (this.lastHitIndex !== -1) {\n this.tooltip.hide();\n this.lastHitIndex = -1;\n }\n }\n\n private handleMouseLeave(): void {\n if (this.tooltip) { this.tooltip.hide(); this.lastHitIndex = -1; }\n }\n\n private handleResize = () => { this.resize(); this.needsRender = true; }\n private resize(): void {\n const width = this.canvas.clientWidth, height = this.canvas.clientHeight;\n this.canvas.width = width * this.dpr; this.canvas.height = height * this.dpr;\n this.gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n this.camera.aspect = width / height;\n }\n getCanvasSize() { const rect = this.canvas.getBoundingClientRect(); return { width: rect.width, height: rect.height }; }\n \n getAxisLabels() {\n return this.axes?.getLabels() ?? [];\n }\n\n getViewProjectionMatrix() {\n return this.camera.getViewProjectionMatrix();\n }\n\n projectToScreen(worldPos: [number, number, number]) {\n if (!this.axes) return { x: 0, y: 0, visible: false };\n const { width, height } = this.getCanvasSize();\n return this.axes.projectToScreen(worldPos, this.camera.getViewProjectionMatrix(), width, height);\n }\n on(event: string, callback: Renderer3DEventCallback): void {\n if (!this.eventListeners.has(event)) this.eventListeners.set(event, new Set());\n this.eventListeners.get(event)!.add(callback);\n }\n private emitEvent(type: string): void {\n const listeners = this.eventListeners.get(type);\n if (!listeners) return;\n listeners.forEach(cb => cb({ \n type: type as any, timestamp: performance.now(), \n stats: { fps: 60, frameTime: 16, instanceCount: this.vectorCount, drawCalls: 1 },\n camera: { target: [...this.camera.target] as any, radius: this.camera.radius, theta: this.camera.theta, phi: this.camera.phi, fov: this.camera.fov }\n }));\n }\n\n destroy(): void {\n window.removeEventListener('resize', this.handleResize);\n if (this.animationFrameId) cancelAnimationFrame(this.animationFrameId);\n if (this.tooltip) this.tooltip.destroy();\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n [this.positionBuffer, this.indexBuffer, this.instancePosBuffer, this.instanceDirBuffer, this.instanceColorBuffer].forEach(b => b && gl.deleteBuffer(b));\n deleteProgramBundle(gl, this.programs);\n }\n}\n","/**\n * Volumetric Voxel 3D Renderer\n * Renders a 3D grid of values as cubes (voxels).\n * Optimized for medical imaging (MRI/CT), geological data, or 3D heatmaps.\n */\n\nimport { OrbitCamera, type OrbitCameraOptions } from './camera/OrbitCamera';\nimport { OrbitController, type OrbitControllerOptions } from './controls/OrbitController';\nimport {\n createProgramBundle3D,\n deleteProgramBundle,\n type ProgramBundle3D,\n} from './shader/programs';\nimport { Axes3D, type Axes3DOptions } from './Axes3D';\nimport { Tooltip3D } from './Tooltip3D';\nimport { createRayFromScreen, pickBubble } from './Raycaster3D';\nimport { createVoxelCube } from './mesh';\nimport type {\n Renderer3DOptions,\n Bounds3D,\n Renderer3DEventCallback,\n} from './types';\nimport type { CustomThemeOptions } from './colorThemes';\n\nexport interface VoxelData {\n /** Dimensions of the 3D grid [nx, ny, nz] */\n dimensions: [number, number, number];\n /** Voxel values [v000, v100, ..., v(nx-1)(ny-1)(nz-1)] */\n values: Float32Array;\n /** Voxel positions [x0, y0, z0, ...] if not a regular grid (optional) */\n positions?: Float32Array;\n /** Origin point of the grid [x, y, z] (default [0,0,0]) */\n origin?: [number, number, number];\n /** Spacing between voxels [dx, dy, dz] (default [1,1,1]) */\n spacing?: [number, number, number];\n}\n\nexport interface Voxel3DRendererOptions extends Renderer3DOptions {\n camera?: OrbitCameraOptions;\n controls?: OrbitControllerOptions;\n axes?: Axes3DOptions;\n showAxes?: boolean;\n /** Size scale for each voxel cube (0.0 to 1.0, default 1.0) */\n voxelScale?: number;\n /** Threshold value: voxels below this won't be rendered (default 0.1) */\n threshold?: number;\n /** Global opacity (default: 1.0) */\n opacity?: number;\n /** Enable tooltips */\n enableTooltip?: boolean;\n /** Color theme options */\n theme?: CustomThemeOptions;\n}\n\nexport class Voxel3DRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGL2RenderingContext;\n private dpr: number;\n \n private programs: ProgramBundle3D;\n private camera: OrbitCamera;\n private controller: OrbitController;\n private axes: Axes3D | null = null;\n \n // Base cube geometry\n private vao: WebGLVertexArrayObject | null = null;\n private positionBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n private indexCount = 0;\n\n // Instance buffers\n private instancePosBuffer: WebGLBuffer | null = null;\n private instanceValueBuffer: WebGLBuffer | null = null;\n private voxelCount = 0;\n \n private backgroundColor: [number, number, number, number] = [0.05, 0.05, 0.1, 1];\n private voxelSize: number = 1.0;\n private voxelScale: number;\n private threshold: number;\n private opacity: number;\n \n private data: VoxelData | null = null;\n private bounds: Bounds3D | null = null;\n \n private animationFrameId: number | null = null;\n private needsRender = true;\n private eventListeners: Map<string, Set<Renderer3DEventCallback>> = new Map();\n \n // Tooltip\n private tooltip: Tooltip3D | null = null;\n private lastHitIndex: number = -1;\n private boundHandleMouseMove?: (e: MouseEvent) => void;\n private boundHandleMouseLeave?: () => void;\n\n constructor(options: Voxel3DRendererOptions) {\n this.canvas = options.canvas;\n this.dpr = window.devicePixelRatio || 1;\n this.voxelScale = options.voxelScale ?? 0.95;\n this.threshold = options.threshold ?? 0.1;\n this.opacity = options.opacity ?? 0.8;\n \n if (options.backgroundColor) this.backgroundColor = options.backgroundColor;\n\n const gl = this.canvas.getContext('webgl2', { alpha: true, antialias: true });\n if (!gl) throw new Error('WebGL2 not supported');\n this.gl = gl;\n\n gl.enable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n this.programs = createProgramBundle3D(gl);\n this.camera = new OrbitCamera(options.camera);\n this.controller = new OrbitController(this.camera, this.canvas, options.controls);\n this.controller.onChange(() => { this.needsRender = true; this.emitEvent('cameraChange'); });\n\n if (options.showAxes !== false) {\n this.axes = new Axes3D(gl, options.axes);\n }\n\n if (options.enableTooltip !== false) {\n this.tooltip = new Tooltip3D(this.canvas.parentElement || document.body);\n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseLeave = this.handleMouseLeave.bind(this);\n this.canvas.addEventListener('mousemove', this.boundHandleMouseMove);\n this.canvas.addEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n\n this.initCubeGeometry();\n this.resize();\n window.addEventListener('resize', this.handleResize);\n this.startRenderLoop();\n }\n\n private initCubeGeometry(): void {\n const { gl } = this;\n const cube = createVoxelCube();\n const program = this.programs.voxelProgram;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n\n this.positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, cube.positions, gl.STATIC_DRAW);\n const posLoc = program.attributes.a_position;\n if (posLoc !== -1) {\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n this.indexBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, cube.indices, gl.STATIC_DRAW);\n this.indexCount = cube.indices.length;\n\n // Instance attributes\n this.instancePosBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instancePosBuffer);\n const instPosLoc = program.attributes.a_instancePos;\n if (instPosLoc !== -1) {\n gl.enableVertexAttribArray(instPosLoc);\n gl.vertexAttribPointer(instPosLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(instPosLoc, 1);\n }\n\n this.instanceValueBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceValueBuffer);\n const valueLoc = program.attributes.a_value;\n if (valueLoc !== -1) {\n gl.enableVertexAttribArray(valueLoc);\n gl.vertexAttribPointer(valueLoc, 1, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(valueLoc, 1);\n }\n\n gl.bindVertexArray(null);\n }\n\n setData(data: VoxelData): void {\n this.data = data;\n const { dimensions, spacing = [1, 1, 1], origin = [0, 0, 0] } = data;\n const [nx, ny, nz] = dimensions;\n this.voxelCount = nx * ny * nz;\n this.voxelSize = Math.max(...spacing) * this.voxelScale;\n\n const positions = new Float32Array(this.voxelCount * 3);\n for (let z = 0; z < nz; z++) {\n for (let y = 0; y < ny; y++) {\n for (let x = 0; x < nx; x++) {\n const i = (z * nx * ny + y * nx + x) * 3;\n positions[i] = origin[0] + x * spacing[0];\n positions[i + 1] = origin[1] + y * spacing[1];\n positions[i + 2] = origin[2] + z * spacing[2];\n }\n }\n }\n\n const { gl } = this;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instancePosBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceValueBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, data.values, gl.STATIC_DRAW);\n\n this.updateBounds();\n this.needsRender = true;\n }\n\n private updateBounds(): void {\n if (!this.data) return;\n const { dimensions, spacing = [1, 1, 1], origin = [0, 0, 0] } = this.data;\n const [nx, ny, nz] = dimensions;\n \n this.bounds = {\n minX: origin[0],\n maxX: origin[0] + (nx - 1) * spacing[0],\n minY: origin[1],\n maxY: origin[1] + (ny - 1) * spacing[1],\n minZ: origin[2],\n maxZ: origin[2] + (nz - 1) * spacing[2]\n };\n if (this.axes) this.axes.updateBounds(this.bounds);\n }\n\n render(): void {\n const { gl, camera } = this;\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n gl.clearColor(this.backgroundColor[0], this.backgroundColor[1], this.backgroundColor[2], this.backgroundColor[3]);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n\n const viewProj = camera.getViewProjectionMatrix() as Float32Array;\n if (this.axes) this.axes.render(viewProj);\n\n if (this.voxelCount > 0 && this.vao) {\n const program = this.programs.voxelProgram;\n gl.useProgram(program.program);\n gl.uniformMatrix4fv(program.uniforms.u_viewProjection, false, viewProj);\n gl.uniform1f(program.uniforms.u_opacity, this.opacity);\n gl.uniform1f(program.uniforms.u_voxelSize, this.voxelSize);\n gl.uniform1f(program.uniforms.u_threshold, this.threshold);\n gl.uniform3fv(program.uniforms.u_lightDir, new Float32Array([1, 1, 1]));\n\n gl.bindVertexArray(this.vao);\n gl.drawElementsInstanced(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_SHORT, 0, this.voxelCount);\n gl.bindVertexArray(null);\n }\n this.emitEvent('render');\n }\n\n private startRenderLoop(): void {\n const loop = () => {\n const moving = this.controller.update();\n if (this.needsRender || moving) {\n this.render();\n this.needsRender = false;\n }\n this.animationFrameId = requestAnimationFrame(loop);\n };\n this.animationFrameId = requestAnimationFrame(loop);\n }\n\n fitToData(): void {\n if (!this.bounds) return;\n const { minX, maxX, minY, maxY, minZ, maxZ } = this.bounds;\n this.camera.fitToBounds(minX, minY, minZ, maxX, maxY, maxZ);\n this.camera.radius *= 1.3;\n this.needsRender = true;\n }\n\n private handleMouseMove(e: MouseEvent): void {\n if (!this.tooltip || !this.data) return;\n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left, y = e.clientY - rect.top;\n \n // Pick based on voxel centers\n const { width, height } = this.getCanvasSize();\n const viewProj = this.camera.getViewProjectionMatrix() as Float32Array;\n const ray = createRayFromScreen(x, y, width, height, viewProj);\n \n // We treat voxels as small bubbles for picking purposes\n const nx = this.data.dimensions[0], ny = this.data.dimensions[1], nz = this.data.dimensions[2];\n const positions = new Float32Array(this.voxelCount * 3);\n const { spacing = [1,1,1], origin = [0,0,0] } = this.data;\n\n for (let k = 0; k < nz; k++) {\n for (let j = 0; j < ny; j++) {\n for (let i = 0; i < nx; i++) {\n const idx = (k * nx * ny + j * nx + i);\n if (this.data.values[idx] < this.threshold) continue;\n positions[idx*3] = origin[0] + i * spacing[0];\n positions[idx*3+1] = origin[1] + j * spacing[1];\n positions[idx*3+2] = origin[2] + k * spacing[2];\n }\n }\n }\n\n const hit = pickBubble(ray, positions, new Float32Array(this.voxelCount).fill(this.voxelSize * 0.5));\n\n if (hit) {\n if (hit.index !== this.lastHitIndex) {\n this.lastHitIndex = hit.index;\n const val = this.data.values[hit.index];\n const nx = this.data.dimensions[0], ny = this.data.dimensions[1];\n const vz = Math.floor(hit.index / (nx * ny));\n const vy = Math.floor((hit.index % (nx * ny)) / nx);\n const vx = hit.index % nx;\n\n this.tooltip.show({\n index: hit.index,\n position: [positions[hit.index*3], positions[hit.index*3+1], positions[hit.index*3+2]],\n customData: { Value: val.toFixed(3), Coords: `(${vx}, ${vy}, ${vz})` }\n }, x, y);\n } else {\n this.tooltip.updatePosition(x, y);\n }\n } else if (this.lastHitIndex !== -1) {\n this.tooltip.hide();\n this.lastHitIndex = -1;\n }\n }\n\n private handleMouseLeave(): void {\n if (this.tooltip) { this.tooltip.hide(); this.lastHitIndex = -1; }\n }\n\n private handleResize = () => { this.resize(); this.needsRender = true; }\n private resize(): void {\n const width = this.canvas.clientWidth, height = this.canvas.clientHeight;\n this.canvas.width = width * this.dpr; this.canvas.height = height * this.dpr;\n this.gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n this.camera.aspect = width / height;\n }\n getCanvasSize() { const rect = this.canvas.getBoundingClientRect(); return { width: rect.width, height: rect.height }; }\n \n getAxisLabels() {\n return this.axes?.getLabels() ?? [];\n }\n\n getViewProjectionMatrix() {\n return this.camera.getViewProjectionMatrix();\n }\n\n projectToScreen(worldPos: [number, number, number]) {\n if (!this.axes) return { x: 0, y: 0, visible: false };\n const { width, height } = this.getCanvasSize();\n return this.axes.projectToScreen(worldPos, this.camera.getViewProjectionMatrix(), width, height);\n }\n \n on(event: string, callback: Renderer3DEventCallback): void {\n if (!this.eventListeners.has(event)) this.eventListeners.set(event, new Set());\n this.eventListeners.get(event)!.add(callback);\n }\n\n private emitEvent(type: string): void {\n const listeners = this.eventListeners.get(type);\n if (!listeners) return;\n listeners.forEach(cb => cb({ \n type: type as any, timestamp: performance.now(), \n stats: { fps: 60, frameTime: 16, instanceCount: this.voxelCount, drawCalls: 1 },\n camera: { target: [...this.camera.target] as any, radius: this.camera.radius, theta: this.camera.theta, phi: this.camera.phi, fov: this.camera.fov }\n }));\n }\n\n destroy(): void {\n window.removeEventListener('resize', this.handleResize);\n if (this.animationFrameId) cancelAnimationFrame(this.animationFrameId);\n if (this.tooltip) this.tooltip.destroy();\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n [this.positionBuffer, this.indexBuffer, this.instancePosBuffer, this.instanceValueBuffer].forEach(b => b && gl.deleteBuffer(b));\n deleteProgramBundle(gl, this.programs);\n }\n}\n","/**\n * Waterfall 3D Renderer\n * Renders multiple 3D series (lines or areas) offset along the Z-axis.\n * Ideal for spectrograms and time-series evolution.\n */\n\nimport { OrbitCamera, type OrbitCameraOptions } from './camera/OrbitCamera';\nimport { OrbitController, type OrbitControllerOptions } from './controls/OrbitController';\nimport {\n createProgramBundle3D,\n deleteProgramBundle,\n type ProgramBundle3D,\n} from './shader/programs';\nimport { Axes3D, type Axes3DOptions } from './Axes3D';\nimport { Tooltip3D } from './Tooltip3D';\nimport { createRayFromScreen, pickLine } from './Raycaster3D';\nimport type {\n Renderer3DOptions,\n Bounds3D,\n Renderer3DEvent,\n Renderer3DEventCallback,\n} from './types';\nimport { createTheme, type CustomThemeOptions, type ColorTheme } from './colorThemes';\n\nexport interface WaterfallSeriesData {\n /** Y values for this slice */\n yValues: Float32Array;\n /** Fixed Z coordinate for this slice */\n z: number;\n /** Color for this slice */\n color?: [number, number, number];\n}\n\nexport interface Waterfall3DRendererOptions extends Renderer3DOptions {\n camera?: OrbitCameraOptions;\n controls?: OrbitControllerOptions;\n axes?: Axes3DOptions;\n showAxes?: boolean;\n /** X values shared by all slices */\n xValues: Float32Array;\n /** Visual style: 'line' or 'area' (curtain) */\n sliceStyle?: 'line' | 'area';\n /** Base Y value (if sliceStyle is 'area') */\n baseY?: number;\n /** Global opacity */\n opacity?: number;\n /** Enable tooltips */\n enableTooltip?: boolean;\n /** Color theme options */\n theme?: CustomThemeOptions;\n}\n\nexport class Waterfall3DRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGL2RenderingContext;\n private dpr: number;\n \n private programs: ProgramBundle3D;\n private camera: OrbitCamera;\n private controller: OrbitController;\n private axes: Axes3D | null = null;\n \n // Buffers\n private vao: WebGLVertexArrayObject | null = null;\n private positionBuffer: WebGLBuffer | null = null;\n private normalBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n private indexCount = 0;\n \n private backgroundColor: [number, number, number, number] = [0.05, 0.05, 0.1, 1];\n private sliceStyle: 'line' | 'area';\n private baseY: number;\n private opacity: number;\n private xValues: Float32Array;\n \n private slices: WaterfallSeriesData[] = [];\n private bounds: Bounds3D | null = null;\n \n private animationFrameId: number | null = null;\n private needsRender = true;\n private eventListeners: Map<string, Set<Renderer3DEventCallback>> = new Map();\n \n // Hover highlight\n private hoveredSeriesIndex: number | null = null;\n private colorTheme: ColorTheme;\n \n // Tooltip\n private tooltip: Tooltip3D | null = null;\n private lastHitIndex: { slice: number, point: number } | null = null;\n private boundHandleMouseMove?: (e: MouseEvent) => void;\n private boundHandleMouseLeave?: () => void;\n\n constructor(options: Waterfall3DRendererOptions) {\n this.canvas = options.canvas;\n this.dpr = window.devicePixelRatio || 1;\n this.sliceStyle = options.sliceStyle ?? 'area';\n this.baseY = options.baseY ?? 0;\n this.opacity = options.opacity ?? 0.9;\n this.xValues = options.xValues;\n \n if (options.backgroundColor) this.backgroundColor = options.backgroundColor;\n \n // Initialize color theme\n this.colorTheme = createTheme(options.theme || {}, this.backgroundColor);\n\n const gl = this.canvas.getContext('webgl2', { alpha: true, antialias: true });\n if (!gl) throw new Error('WebGL2 not supported');\n this.gl = gl;\n\n gl.enable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n this.programs = createProgramBundle3D(gl);\n this.camera = new OrbitCamera(options.camera);\n this.controller = new OrbitController(this.camera, this.canvas, options.controls);\n this.controller.onChange(() => { this.needsRender = true; this.emitEvent('cameraChange'); });\n\n if (options.showAxes !== false) {\n this.axes = new Axes3D(gl, options.axes);\n }\n\n if (options.enableTooltip !== false) {\n this.tooltip = new Tooltip3D(this.canvas.parentElement || document.body);\n this.boundHandleMouseMove = this.handleMouseMove.bind(this);\n this.boundHandleMouseLeave = this.handleMouseLeave.bind(this);\n this.canvas.addEventListener('mousemove', this.boundHandleMouseMove);\n this.canvas.addEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n\n this.resize();\n window.addEventListener('resize', this.handleResize);\n this.startRenderLoop();\n }\n\n setData(slices: WaterfallSeriesData[]): void {\n this.slices = slices;\n this.updateGeometry();\n this.updateBounds();\n this.needsRender = true;\n }\n\n private updateBounds(): void {\n if (this.slices.length === 0 || this.xValues.length === 0) return;\n \n let minX = Infinity, maxX = -Infinity;\n let minY = this.baseY, maxY = -Infinity;\n let minZ = Infinity, maxZ = -Infinity;\n\n for (let i = 0; i < this.xValues.length; i++) {\n const x = this.xValues[i];\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n }\n\n for (const slice of this.slices) {\n if (slice.z < minZ) minZ = slice.z;\n if (slice.z > maxZ) maxZ = slice.z;\n for (let i = 0; i < slice.yValues.length; i++) {\n const y = slice.yValues[i];\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n }\n\n this.bounds = { minX, maxX, minY, maxY, minZ, maxZ };\n if (this.axes) this.axes.updateBounds(this.bounds);\n }\n\n private updateGeometry(): void {\n if (this.slices.length === 0) return;\n const { gl } = this;\n\n const positions: number[] = [];\n const normals: number[] = [];\n const colors: number[] = [];\n const indices: number[] = [];\n let vertexOffset = 0;\n\n // Get color palette from theme\n const colorPalette = this.colorTheme.seriesPalette;\n const highlightColor = this.colorTheme.highlightColor;\n\n for (let sliceIdx = 0; sliceIdx < this.slices.length; sliceIdx++) {\n const slice = this.slices[sliceIdx];\n \n // Use highlight color if this series is hovered\n const isHovered = sliceIdx === this.hoveredSeriesIndex;\n const sliceColor = isHovered \n ? highlightColor\n : (slice.color || colorPalette[sliceIdx % colorPalette.length]);\n \n for (let i = 0; i < this.xValues.length; i++) {\n const x = this.xValues[i];\n const y = slice.yValues[i];\n const z = slice.z;\n\n if (this.sliceStyle === 'area') {\n // Calculate normal for curtain (perpendicular to line direction in XZ plane)\n let nx = 0, ny = 0, nz = 1;\n if (i < this.xValues.length - 1) {\n const dx = this.xValues[i + 1] - x;\n const len = Math.sqrt(dx * dx);\n if (len > 0.001) {\n nx = 0;\n ny = 0;\n nz = 1;\n }\n }\n\n // Top vertex\n positions.push(x, y, z);\n normals.push(nx, ny, nz);\n colors.push(...sliceColor);\n \n // Bottom vertex\n positions.push(x, this.baseY, z);\n normals.push(nx, ny, nz);\n colors.push(...sliceColor); \n\n if (i < this.xValues.length - 1) {\n const v0 = vertexOffset + i * 2;\n const v1 = v0 + 1;\n const v2 = v0 + 2;\n const v3 = v0 + 3;\n indices.push(v0, v1, v2, v1, v3, v2);\n }\n } else {\n // Line style\n positions.push(x, y, z);\n normals.push(0, 0, 1);\n colors.push(...sliceColor);\n if (i < this.xValues.length - 1) {\n indices.push(vertexOffset + i, vertexOffset + i + 1);\n }\n }\n }\n vertexOffset += (this.sliceStyle === 'area' ? this.xValues.length * 2 : this.xValues.length);\n }\n\n const program = this.programs.waterfallProgram;\n if (!this.vao) this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n\n if (!this.positionBuffer) this.positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);\n const posLoc = program.attributes.a_position;\n if (posLoc !== -1) {\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n if (!this.normalBuffer) this.normalBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(normals), gl.STATIC_DRAW);\n const normalLoc = program.attributes.a_normal;\n if (normalLoc !== -1) {\n gl.enableVertexAttribArray(normalLoc);\n gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n if (!this.colorBuffer) this.colorBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);\n const colorLoc = program.attributes.a_color;\n if (colorLoc !== -1) {\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n\n if (!this.indexBuffer) this.indexBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array(indices), gl.STATIC_DRAW);\n this.indexCount = indices.length;\n\n gl.bindVertexArray(null);\n }\n\n render(): void {\n const { gl, camera } = this;\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n gl.clearColor(this.backgroundColor[0], this.backgroundColor[1], this.backgroundColor[2], this.backgroundColor[3]);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n\n const viewProj = camera.getViewProjectionMatrix() as Float32Array;\n\n if (this.axes) {\n this.axes.render(viewProj);\n }\n\n if (this.indexCount > 0 && this.vao) {\n const program = this.programs.waterfallProgram;\n gl.useProgram(program.program);\n gl.uniformMatrix4fv(program.uniforms.u_viewProjection, false, viewProj);\n gl.uniform1f(program.uniforms.u_opacity, this.opacity);\n \n gl.uniform1f(program.uniforms.u_fadeStart, -1000);\n gl.uniform1f(program.uniforms.u_fadeEnd, 1000);\n gl.uniform3fv(program.uniforms.u_lightDir, new Float32Array([0.5, 1.0, 0.3]));\n gl.uniform1f(program.uniforms.u_ambient, 0.6);\n\n gl.bindVertexArray(this.vao);\n if (this.sliceStyle === 'area') {\n gl.drawElements(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0);\n } else {\n gl.drawElements(gl.LINES, this.indexCount, gl.UNSIGNED_INT, 0);\n }\n gl.bindVertexArray(null);\n }\n \n this.emitEvent('render');\n }\n\n private startRenderLoop(): void {\n const loop = () => {\n const moving = this.controller.update();\n if (this.needsRender || moving) {\n this.render();\n this.needsRender = false;\n }\n this.animationFrameId = requestAnimationFrame(loop);\n };\n this.animationFrameId = requestAnimationFrame(loop);\n }\n\n fitToData(): void {\n if (!this.bounds) return;\n const { minX, maxX, minY, maxY, minZ, maxZ } = this.bounds;\n const dx = maxX - minX, dy = maxY - minY, dz = maxZ - minZ;\n const padding = 0.05;\n this.camera.fitToBounds(\n minX - dx * padding, minY - dy * padding, minZ - dz * padding,\n maxX + dx * padding, maxY + dy * padding, maxZ + dz * padding\n );\n this.camera.radius *= 1.1;\n this.needsRender = true;\n }\n\n private handleMouseMove(e: MouseEvent): void {\n if (this.slices.length === 0) return;\n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n \n const hit = this.pickAtScreen(x, y);\n \n // Update hovered series\n const newHoveredIndex = hit ? hit.seriesIndex : null;\n if (newHoveredIndex !== this.hoveredSeriesIndex) {\n this.hoveredSeriesIndex = newHoveredIndex;\n this.updateGeometry(); // Rebuild with highlight\n this.needsRender = true;\n }\n \n // Tooltip logic\n if (this.tooltip) {\n if (hit) {\n const isNew = !this.lastHitIndex || this.lastHitIndex.slice !== hit.seriesIndex || this.lastHitIndex.point !== hit.pointIndex;\n if (isNew) {\n this.lastHitIndex = { slice: hit.seriesIndex, point: hit.pointIndex };\n const slice = this.slices[hit.seriesIndex];\n this.tooltip.show({\n index: hit.pointIndex,\n position: [this.xValues[hit.pointIndex], slice.yValues[hit.pointIndex], slice.z],\n color: slice.color || [0.2, 0.6, 1.0],\n customData: { series: hit.seriesIndex, z: slice.z.toFixed(2) }\n }, x, y);\n } else {\n this.tooltip.updatePosition(x, y);\n }\n } else {\n if (this.lastHitIndex) {\n this.tooltip.hide();\n this.lastHitIndex = null;\n }\n }\n }\n }\n\n private handleMouseLeave(): void {\n // Reset highlight\n if (this.hoveredSeriesIndex !== null) {\n this.hoveredSeriesIndex = null;\n this.updateGeometry();\n this.needsRender = true;\n }\n \n if (this.tooltip) {\n this.tooltip.hide();\n this.lastHitIndex = null;\n }\n }\n\n pickAtScreen(screenX: number, screenY: number) {\n if (this.slices.length === 0) return null;\n const { width, height } = this.getCanvasSize();\n const viewProj = this.camera.getViewProjectionMatrix() as Float32Array;\n const ray = createRayFromScreen(screenX, screenY, width, height, viewProj);\n \n const lines = this.slices.map(s => ({\n x: this.xValues,\n y: s.yValues,\n z: new Float32Array(this.xValues.length).fill(s.z)\n }));\n \n return pickLine(ray, lines, 0.4);\n }\n\n private handleResize = (): void => {\n this.resize();\n this.needsRender = true;\n }\n\n private resize(): void {\n const width = this.canvas.clientWidth;\n const height = this.canvas.clientHeight;\n this.canvas.width = width * this.dpr;\n this.canvas.height = height * this.dpr;\n this.gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n this.camera.aspect = width / height;\n }\n\n getCanvasSize() {\n const rect = this.canvas.getBoundingClientRect();\n return { width: rect.width, height: rect.height };\n }\n\n getAxisLabels() {\n return this.axes?.getLabels() ?? [];\n }\n\n getViewProjectionMatrix() {\n return this.camera.getViewProjectionMatrix();\n }\n\n projectToScreen(worldPos: [number, number, number]) {\n if (!this.axes) return { x: 0, y: 0, visible: false };\n const { width, height } = this.getCanvasSize();\n return this.axes.projectToScreen(worldPos, this.camera.getViewProjectionMatrix(), width, height);\n }\n\n on(event: string, callback: Renderer3DEventCallback): void {\n if (!this.eventListeners.has(event)) this.eventListeners.set(event, new Set());\n this.eventListeners.get(event)!.add(callback);\n }\n\n private emitEvent(type: string): void {\n const listeners = this.eventListeners.get(type);\n if (!listeners) return;\n const event: Renderer3DEvent = {\n type: type as any,\n timestamp: performance.now(),\n stats: { fps: 60, frameTime: 16, instanceCount: this.slices.length, drawCalls: 1 },\n camera: { target: [...this.camera.target] as any, radius: this.camera.radius, theta: this.camera.theta, phi: this.camera.phi, fov: this.camera.fov }\n };\n listeners.forEach(cb => cb(event));\n }\n\n destroy(): void {\n window.removeEventListener('resize', this.handleResize);\n if (this.animationFrameId) cancelAnimationFrame(this.animationFrameId);\n if (this.tooltip) {\n this.tooltip.destroy();\n if (this.boundHandleMouseMove) this.canvas.removeEventListener('mousemove', this.boundHandleMouseMove);\n if (this.boundHandleMouseLeave) this.canvas.removeEventListener('mouseleave', this.boundHandleMouseLeave);\n }\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.normalBuffer) gl.deleteBuffer(this.normalBuffer);\n if (this.colorBuffer) gl.deleteBuffer(this.colorBuffer);\n if (this.indexBuffer) gl.deleteBuffer(this.indexBuffer);\n deleteProgramBundle(gl, this.programs);\n }\n}\n","/**\n * Point Line 3D renderer.\n * Renders connected points in 3D space with optional markers.\n */\n\nimport type { ShaderProgram3D } from '../shader/programs';\nimport type { PointLine3DData } from './types';\n\nexport class PointLine3D {\n private gl: WebGL2RenderingContext;\n private vao: WebGLVertexArrayObject | null = null;\n \n private positionBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n \n private pointCount = 0;\n private showPoints = true;\n private showLines = true;\n private lineWidth = 2;\n private pointSize = 6;\n \n constructor(gl: WebGL2RenderingContext) {\n this.gl = gl;\n this.initBuffers();\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n this.positionBuffer = gl.createBuffer();\n this.colorBuffer = gl.createBuffer();\n \n gl.bindVertexArray(null);\n }\n \n updateData(data: PointLine3DData): void {\n const { gl } = this;\n \n this.pointCount = data.positions.length / 3;\n this.showPoints = data.showPoints ?? true;\n this.showLines = data.showLines ?? true;\n this.lineWidth = data.lineWidth ?? 2;\n this.pointSize = data.pointSize ?? 6;\n \n // Default color if not provided\n const colors = data.colors ?? this.generateDefaultColors(this.pointCount);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, data.positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n }\n \n private generateDefaultColors(count: number): Float32Array {\n const colors = new Float32Array(count * 3);\n for (let i = 0; i < count; i++) {\n const t = i / (count - 1 || 1);\n colors[i * 3] = 0.2 + t * 0.6;\n colors[i * 3 + 1] = 0.6;\n colors[i * 3 + 2] = 1.0 - t * 0.4;\n }\n return colors;\n }\n \n render(program: ShaderProgram3D): void {\n const { gl } = this;\n \n if (this.pointCount === 0) return;\n \n gl.bindVertexArray(this.vao);\n \n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n if (this.showLines) {\n gl.lineWidth(this.lineWidth);\n gl.drawArrays(gl.LINE_STRIP, 0, this.pointCount);\n }\n \n if (this.showPoints) {\n if (program.uniforms['u_pointSize']) {\n gl.uniform1f(program.uniforms['u_pointSize'], this.pointSize);\n }\n gl.drawArrays(gl.POINTS, 0, this.pointCount);\n }\n \n gl.bindVertexArray(null);\n }\n \n destroy(): void {\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.colorBuffer) gl.deleteBuffer(this.colorBuffer);\n }\n}\n","/**\n * Column/Bar 3D renderer.\n * Renders 3D columns/bars at specified positions.\n */\n\nimport type { ShaderProgram3D } from '../shader/programs';\nimport type { Column3DData } from './types';\n\nexport class Column3D {\n private gl: WebGL2RenderingContext;\n private vao: WebGLVertexArrayObject | null = null;\n \n private positionBuffer: WebGLBuffer | null = null;\n private normalBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n \n private indexCount = 0;\n private columnCount = 0;\n \n constructor(gl: WebGL2RenderingContext) {\n this.gl = gl;\n this.initBuffers();\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n this.positionBuffer = gl.createBuffer();\n this.normalBuffer = gl.createBuffer();\n this.colorBuffer = gl.createBuffer();\n this.indexBuffer = gl.createBuffer();\n \n gl.bindVertexArray(null);\n }\n \n updateData(data: Column3DData): void {\n const { gl } = this;\n \n this.columnCount = data.xValues.length;\n const columnWidth = data.columnWidth ?? 0.8;\n const columnDepth = data.columnDepth ?? 0.8;\n \n // 24 vertices per column (6 faces * 4 vertices)\n const vertexCount = this.columnCount * 24;\n const positions = new Float32Array(vertexCount * 3);\n const normals = new Float32Array(vertexCount * 3);\n const colors = new Float32Array(vertexCount * 3);\n \n // 36 indices per column (6 faces * 2 triangles * 3 vertices)\n const indices: number[] = [];\n \n const hw = columnWidth / 2;\n const hd = columnDepth / 2;\n \n // Find min/max for color mapping\n let minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < this.columnCount; i++) {\n if (data.yValues[i] < minY) minY = data.yValues[i];\n if (data.yValues[i] > maxY) maxY = data.yValues[i];\n }\n const yRange = maxY - minY || 1;\n \n for (let i = 0; i < this.columnCount; i++) {\n const x = data.xValues[i];\n const z = data.zValues[i];\n const h = data.yValues[i];\n const baseIdx = i * 24;\n \n // Generate box vertices\n const box = this.generateBoxVertices(x, 0, z, hw, h, hd);\n \n for (let v = 0; v < 24; v++) {\n const vi = (baseIdx + v) * 3;\n positions[vi] = box.positions[v * 3];\n positions[vi + 1] = box.positions[v * 3 + 1];\n positions[vi + 2] = box.positions[v * 3 + 2];\n normals[vi] = box.normals[v * 3];\n normals[vi + 1] = box.normals[v * 3 + 1];\n normals[vi + 2] = box.normals[v * 3 + 2];\n \n // Color based on height or provided\n if (data.colors) {\n colors[vi] = data.colors[i * 3];\n colors[vi + 1] = data.colors[i * 3 + 1];\n colors[vi + 2] = data.colors[i * 3 + 2];\n } else {\n const t = (h - minY) / yRange;\n colors[vi] = 0.2 + t * 0.6;\n colors[vi + 1] = 0.4 + t * 0.4;\n colors[vi + 2] = 0.8;\n }\n }\n \n // Generate indices for this column\n for (let f = 0; f < 6; f++) {\n const faceBase = baseIdx + f * 4;\n indices.push(\n faceBase, faceBase + 1, faceBase + 2,\n faceBase, faceBase + 2, faceBase + 3\n );\n }\n }\n \n this.indexCount = indices.length;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, normals, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array(indices), gl.STATIC_DRAW);\n }\n \n private generateBoxVertices(\n cx: number, cy: number, cz: number,\n hw: number, h: number, hd: number\n ): { positions: Float32Array; normals: Float32Array } {\n const positions = new Float32Array(24 * 3);\n const normals = new Float32Array(24 * 3);\n \n const x0 = cx - hw, x1 = cx + hw;\n const y0 = cy, y1 = cy + h;\n const z0 = cz - hd, z1 = cz + hd;\n \n // Front face (z+)\n this.setQuad(positions, normals, 0,\n x0, y0, z1, x1, y0, z1, x1, y1, z1, x0, y1, z1,\n 0, 0, 1);\n \n // Back face (z-)\n this.setQuad(positions, normals, 4,\n x1, y0, z0, x0, y0, z0, x0, y1, z0, x1, y1, z0,\n 0, 0, -1);\n \n // Top face (y+)\n this.setQuad(positions, normals, 8,\n x0, y1, z1, x1, y1, z1, x1, y1, z0, x0, y1, z0,\n 0, 1, 0);\n \n // Bottom face (y-)\n this.setQuad(positions, normals, 12,\n x0, y0, z0, x1, y0, z0, x1, y0, z1, x0, y0, z1,\n 0, -1, 0);\n \n // Right face (x+)\n this.setQuad(positions, normals, 16,\n x1, y0, z1, x1, y0, z0, x1, y1, z0, x1, y1, z1,\n 1, 0, 0);\n \n // Left face (x-)\n this.setQuad(positions, normals, 20,\n x0, y0, z0, x0, y0, z1, x0, y1, z1, x0, y1, z0,\n -1, 0, 0);\n \n return { positions, normals };\n }\n \n private setQuad(\n positions: Float32Array, normals: Float32Array, offset: number,\n x0: number, y0: number, z0: number,\n x1: number, y1: number, z1: number,\n x2: number, y2: number, z2: number,\n x3: number, y3: number, z3: number,\n nx: number, ny: number, nz: number\n ): void {\n const pi = offset * 3;\n positions[pi] = x0; positions[pi + 1] = y0; positions[pi + 2] = z0;\n positions[pi + 3] = x1; positions[pi + 4] = y1; positions[pi + 5] = z1;\n positions[pi + 6] = x2; positions[pi + 7] = y2; positions[pi + 8] = z2;\n positions[pi + 9] = x3; positions[pi + 10] = y3; positions[pi + 11] = z3;\n \n for (let i = 0; i < 4; i++) {\n normals[pi + i * 3] = nx;\n normals[pi + i * 3 + 1] = ny;\n normals[pi + i * 3 + 2] = nz;\n }\n }\n \n render(program: ShaderProgram3D): void {\n const { gl } = this;\n \n if (this.indexCount === 0) return;\n \n gl.bindVertexArray(this.vao);\n \n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n const normalLoc = program.attributes['a_normal'];\n if (normalLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.enableVertexAttribArray(normalLoc);\n gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.drawElements(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0);\n \n gl.bindVertexArray(null);\n }\n \n destroy(): void {\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.normalBuffer) gl.deleteBuffer(this.normalBuffer);\n if (this.colorBuffer) gl.deleteBuffer(this.colorBuffer);\n if (this.indexBuffer) gl.deleteBuffer(this.indexBuffer);\n }\n}\n","/**\n * Waterfall 3D renderer.\n * Renders cascading spectral/time series data (like audio spectrograms).\n * Essential for scientific visualization of frequency/time data.\n */\n\nimport type { ShaderProgram3D } from '../shader/programs';\nimport type { Waterfall3DData } from './types';\n\nexport interface WaterfallOptions {\n maxSlices?: number;\n}\n\nexport class Waterfall3D {\n private gl: WebGL2RenderingContext;\n private vao: WebGLVertexArrayObject | null = null;\n \n private positionBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n \n private vertexCount = 0;\n private indexCount = 0;\n private sliceCount = 0;\n private pointsPerSlice = 0;\n \n private fillMode: 'solid' | 'wireframe' | 'gradient' = 'gradient';\n \n constructor(gl: WebGL2RenderingContext, _options: WaterfallOptions = {}) {\n this.gl = gl;\n this.initBuffers();\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n this.positionBuffer = gl.createBuffer();\n this.colorBuffer = gl.createBuffer();\n this.indexBuffer = gl.createBuffer();\n \n gl.bindVertexArray(null);\n }\n \n /**\n * Update waterfall data.\n * Each slice is a row of Y values at increasing Z positions.\n */\n updateData(data: Waterfall3DData): void {\n this.sliceCount = data.slices.length;\n if (this.sliceCount === 0) return;\n \n this.pointsPerSlice = data.xValues.length;\n this.fillMode = data.fillMode ?? 'gradient';\n \n const zStart = data.zStart ?? 0;\n const zStep = data.zStep;\n \n // Find global min/max for color mapping\n let minY = Infinity, maxY = -Infinity;\n for (const slice of data.slices) {\n for (let i = 0; i < slice.length; i++) {\n if (slice[i] < minY) minY = slice[i];\n if (slice[i] > maxY) maxY = slice[i];\n }\n }\n const yRange = maxY - minY || 1;\n \n if (this.fillMode === 'wireframe') {\n this.buildWireframe(data, zStart, zStep, minY, yRange);\n } else {\n this.buildSolid(data, zStart, zStep, minY, yRange);\n }\n }\n \n private buildWireframe(\n data: Waterfall3DData,\n zStart: number,\n zStep: number,\n minY: number,\n yRange: number\n ): void {\n const { gl, sliceCount, pointsPerSlice } = this;\n \n // Each slice is a line strip\n this.vertexCount = sliceCount * pointsPerSlice;\n \n const positions = new Float32Array(this.vertexCount * 3);\n const colors = new Float32Array(this.vertexCount * 3);\n \n for (let s = 0; s < sliceCount; s++) {\n const z = zStart + s * zStep;\n const slice = data.slices[s];\n \n for (let p = 0; p < pointsPerSlice; p++) {\n const idx = s * pointsPerSlice + p;\n const i3 = idx * 3;\n \n positions[i3] = data.xValues[p];\n positions[i3 + 1] = slice[p];\n positions[i3 + 2] = z;\n \n // Color by height\n const t = (slice[p] - minY) / yRange;\n this.applyColormap(colors, i3, t, data.colormap);\n }\n }\n \n // Line indices - one line strip per slice\n const indices: number[] = [];\n for (let s = 0; s < sliceCount; s++) {\n for (let p = 0; p < pointsPerSlice - 1; p++) {\n const idx = s * pointsPerSlice + p;\n indices.push(idx, idx + 1);\n }\n }\n \n this.indexCount = indices.length;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array(indices), gl.STATIC_DRAW);\n }\n \n private buildSolid(\n data: Waterfall3DData,\n zStart: number,\n zStep: number,\n minY: number,\n yRange: number\n ): void {\n const { gl, sliceCount, pointsPerSlice } = this;\n \n // For solid fill, we create quads between adjacent slices\n // Each quad has 4 vertices, 2 triangles\n const quadRows = sliceCount - 1;\n const quadCols = pointsPerSlice - 1;\n \n if (quadRows <= 0 || quadCols <= 0) {\n this.vertexCount = 0;\n this.indexCount = 0;\n return;\n }\n \n // Use indexed rendering with shared vertices\n this.vertexCount = sliceCount * pointsPerSlice;\n \n const positions = new Float32Array(this.vertexCount * 3);\n const colors = new Float32Array(this.vertexCount * 3);\n \n for (let s = 0; s < sliceCount; s++) {\n const z = zStart + s * zStep;\n const slice = data.slices[s];\n \n for (let p = 0; p < pointsPerSlice; p++) {\n const idx = s * pointsPerSlice + p;\n const i3 = idx * 3;\n \n positions[i3] = data.xValues[p];\n positions[i3 + 1] = slice[p];\n positions[i3 + 2] = z;\n \n const t = (slice[p] - minY) / yRange;\n this.applyColormap(colors, i3, t, data.colormap);\n }\n }\n \n // Triangle indices\n const indices: number[] = [];\n for (let s = 0; s < quadRows; s++) {\n for (let p = 0; p < quadCols; p++) {\n const topLeft = s * pointsPerSlice + p;\n const topRight = topLeft + 1;\n const bottomLeft = topLeft + pointsPerSlice;\n const bottomRight = bottomLeft + 1;\n \n // Two triangles per quad\n indices.push(topLeft, bottomLeft, topRight);\n indices.push(topRight, bottomLeft, bottomRight);\n }\n }\n \n this.indexCount = indices.length;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array(indices), gl.STATIC_DRAW);\n }\n \n private applyColormap(colors: Float32Array, i3: number, t: number, colormap?: string): void {\n // Clamp t to [0, 1]\n t = Math.max(0, Math.min(1, t));\n \n switch (colormap) {\n case 'jet':\n this.jetColormap(colors, i3, t);\n break;\n case 'hot':\n this.hotColormap(colors, i3, t);\n break;\n case 'cool':\n colors[i3] = t;\n colors[i3 + 1] = 1 - t;\n colors[i3 + 2] = 1;\n break;\n case 'grayscale':\n colors[i3] = t;\n colors[i3 + 1] = t;\n colors[i3 + 2] = t;\n break;\n case 'viridis':\n default:\n this.viridisColormap(colors, i3, t);\n break;\n }\n }\n \n private viridisColormap(colors: Float32Array, i3: number, t: number): void {\n // Simplified viridis approximation\n colors[i3] = 0.267 + t * 0.329 + t * t * 0.2;\n colors[i3 + 1] = 0.004 + t * 0.873;\n colors[i3 + 2] = 0.329 + t * 0.2 - t * t * 0.3;\n }\n \n private jetColormap(colors: Float32Array, i3: number, t: number): void {\n if (t < 0.25) {\n colors[i3] = 0;\n colors[i3 + 1] = 4 * t;\n colors[i3 + 2] = 1;\n } else if (t < 0.5) {\n colors[i3] = 0;\n colors[i3 + 1] = 1;\n colors[i3 + 2] = 1 - 4 * (t - 0.25);\n } else if (t < 0.75) {\n colors[i3] = 4 * (t - 0.5);\n colors[i3 + 1] = 1;\n colors[i3 + 2] = 0;\n } else {\n colors[i3] = 1;\n colors[i3 + 1] = 1 - 4 * (t - 0.75);\n colors[i3 + 2] = 0;\n }\n }\n \n private hotColormap(colors: Float32Array, i3: number, t: number): void {\n colors[i3] = Math.min(1, t * 3);\n colors[i3 + 1] = Math.max(0, Math.min(1, (t - 0.33) * 3));\n colors[i3 + 2] = Math.max(0, (t - 0.67) * 3);\n }\n \n /**\n * Add a new slice to the waterfall (for realtime updates).\n * Shifts existing slices back and adds new one at front.\n */\n pushSlice(yValues: Float32Array, data: Waterfall3DData): void {\n // Shift slices\n data.slices.pop();\n data.slices.unshift(yValues);\n \n // Rebuild mesh\n this.updateData(data);\n }\n \n render(program: ShaderProgram3D): void {\n const { gl } = this;\n \n if (this.indexCount === 0) return;\n \n gl.bindVertexArray(this.vao);\n \n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n \n if (this.fillMode === 'wireframe') {\n gl.drawElements(gl.LINES, this.indexCount, gl.UNSIGNED_INT, 0);\n } else {\n gl.drawElements(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0);\n }\n \n gl.bindVertexArray(null);\n }\n \n destroy(): void {\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.colorBuffer) gl.deleteBuffer(this.colorBuffer);\n if (this.indexBuffer) gl.deleteBuffer(this.indexBuffer);\n }\n}\n","/**\n * Scatter 3D renderer.\n * Renders individual points in 3D space with various symbols.\n */\n\nimport type { ShaderProgram3D } from '../shader/programs';\nimport type { Scatter3DData } from './types';\nimport { createIcosphere, createCube, type GeometryData } from '../mesh/geometry';\n\nexport class Scatter3D {\n private gl: WebGL2RenderingContext;\n private vao: WebGLVertexArrayObject | null = null;\n \n // Geometry buffers\n private geometryPosBuffer: WebGLBuffer | null = null;\n private geometryIndexBuffer: WebGLBuffer | null = null;\n \n // Instance buffers\n private instancePosBuffer: WebGLBuffer | null = null;\n private instanceColorBuffer: WebGLBuffer | null = null;\n private instanceSizeBuffer: WebGLBuffer | null = null;\n \n private geometry: GeometryData;\n private instanceCount = 0;\n private symbol: 'sphere' | 'cube' | 'diamond' | 'point' = 'sphere';\n \n constructor(gl: WebGL2RenderingContext) {\n this.gl = gl;\n this.geometry = createIcosphere(1);\n this.initBuffers();\n }\n \n private initBuffers(): void {\n const { gl, geometry } = this;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n // Geometry position buffer\n this.geometryPosBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.geometryPosBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, geometry.positions, gl.STATIC_DRAW);\n \n // Geometry index buffer\n this.geometryIndexBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.geometryIndexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, geometry.indices, gl.STATIC_DRAW);\n \n // Instance buffers\n this.instancePosBuffer = gl.createBuffer();\n this.instanceColorBuffer = gl.createBuffer();\n this.instanceSizeBuffer = gl.createBuffer();\n \n gl.bindVertexArray(null);\n }\n \n updateData(data: Scatter3DData): void {\n const { gl } = this;\n \n this.instanceCount = data.positions.length / 3;\n this.symbol = data.symbol ?? 'sphere';\n \n // Update geometry if symbol changed\n if (this.symbol === 'cube' || this.symbol === 'diamond') {\n this.geometry = createCube();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.geometryPosBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, this.geometry.positions, gl.STATIC_DRAW);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.geometryIndexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.geometry.indices, gl.STATIC_DRAW);\n }\n \n // Default colors\n const colors = data.colors ?? this.generateDefaultColors(this.instanceCount);\n \n // Default sizes\n const sizes = data.sizes ?? new Float32Array(this.instanceCount).fill(0.1);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.instancePosBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, data.positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceColorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceSizeBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, sizes, gl.DYNAMIC_DRAW);\n }\n \n private generateDefaultColors(count: number): Float32Array {\n const colors = new Float32Array(count * 3);\n for (let i = 0; i < count; i++) {\n colors[i * 3] = 0.2 + Math.random() * 0.6;\n colors[i * 3 + 1] = 0.4 + Math.random() * 0.4;\n colors[i * 3 + 2] = 0.6 + Math.random() * 0.4;\n }\n return colors;\n }\n \n render(program: ShaderProgram3D): void {\n const { gl, geometry, instanceCount } = this;\n \n if (instanceCount === 0) return;\n \n gl.bindVertexArray(this.vao);\n \n // Geometry position\n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.geometryPosBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(posLoc, 0);\n }\n \n // Instance position\n const instancePosLoc = program.attributes['a_instancePos'];\n if (instancePosLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instancePosBuffer);\n gl.enableVertexAttribArray(instancePosLoc);\n gl.vertexAttribPointer(instancePosLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(instancePosLoc, 1);\n }\n \n // Instance color\n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceColorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(colorLoc, 1);\n }\n \n // Instance size\n const scaleLoc = program.attributes['a_scale'];\n if (scaleLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceSizeBuffer);\n gl.enableVertexAttribArray(scaleLoc);\n gl.vertexAttribPointer(scaleLoc, 1, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(scaleLoc, 1);\n }\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.geometryIndexBuffer);\n gl.drawElementsInstanced(\n gl.TRIANGLES,\n geometry.indexCount,\n gl.UNSIGNED_SHORT,\n 0,\n instanceCount\n );\n \n gl.bindVertexArray(null);\n }\n \n destroy(): void {\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.geometryPosBuffer) gl.deleteBuffer(this.geometryPosBuffer);\n if (this.geometryIndexBuffer) gl.deleteBuffer(this.geometryIndexBuffer);\n if (this.instancePosBuffer) gl.deleteBuffer(this.instancePosBuffer);\n if (this.instanceColorBuffer) gl.deleteBuffer(this.instanceColorBuffer);\n if (this.instanceSizeBuffer) gl.deleteBuffer(this.instanceSizeBuffer);\n }\n}\n","/**\n * Ribbon 3D renderer.\n * Renders an extruded line with variable width in 3D space.\n */\n\nimport type { ShaderProgram3D } from '../shader/programs';\nimport type { Ribbon3DData } from './types';\n\nexport class Ribbon3D {\n private gl: WebGL2RenderingContext;\n private vao: WebGLVertexArrayObject | null = null;\n \n private positionBuffer: WebGLBuffer | null = null;\n private normalBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n \n private indexCount = 0;\n \n constructor(gl: WebGL2RenderingContext) {\n this.gl = gl;\n this.initBuffers();\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n this.positionBuffer = gl.createBuffer();\n this.normalBuffer = gl.createBuffer();\n this.colorBuffer = gl.createBuffer();\n this.indexBuffer = gl.createBuffer();\n \n gl.bindVertexArray(null);\n }\n \n updateData(data: Ribbon3DData): void {\n const { gl } = this;\n \n const pointCount = data.positions.length / 3;\n if (pointCount < 2) return;\n \n const defaultWidth = data.defaultWidth ?? 0.5;\n const widths = data.widths ?? new Float32Array(pointCount).fill(defaultWidth);\n \n // Generate ribbon mesh - 2 vertices per point (left and right edge)\n const vertexCount = pointCount * 2;\n const positions = new Float32Array(vertexCount * 3);\n const normals = new Float32Array(vertexCount * 3);\n const colors = new Float32Array(vertexCount * 3);\n \n // Calculate tangent and perpendicular at each point\n for (let i = 0; i < pointCount; i++) {\n const i3 = i * 3;\n const x = data.positions[i3];\n const y = data.positions[i3 + 1];\n const z = data.positions[i3 + 2];\n \n // Calculate tangent direction\n let tx = 0, ty = 0, tz = 0;\n \n if (i === 0) {\n tx = data.positions[3] - x;\n ty = data.positions[4] - y;\n tz = data.positions[5] - z;\n } else if (i === pointCount - 1) {\n tx = x - data.positions[i3 - 3];\n ty = y - data.positions[i3 - 2];\n tz = z - data.positions[i3 - 1];\n } else {\n tx = data.positions[i3 + 3] - data.positions[i3 - 3];\n ty = data.positions[i3 + 4] - data.positions[i3 - 2];\n tz = data.positions[i3 + 5] - data.positions[i3 - 1];\n }\n \n // Normalize tangent\n const tLen = Math.sqrt(tx * tx + ty * ty + tz * tz) || 1;\n tx /= tLen; ty /= tLen; tz /= tLen;\n \n // Calculate perpendicular (cross with up vector)\n const upX = 0, upY = 1, upZ = 0;\n let px = upY * tz - upZ * ty;\n let py = upZ * tx - upX * tz;\n let pz = upX * ty - upY * tx;\n \n const pLen = Math.sqrt(px * px + py * py + pz * pz) || 1;\n px /= pLen; py /= pLen; pz /= pLen;\n \n const hw = widths[i] / 2;\n \n // Left vertex\n const li = i * 2;\n const li3 = li * 3;\n positions[li3] = x - px * hw;\n positions[li3 + 1] = y - py * hw;\n positions[li3 + 2] = z - pz * hw;\n \n // Right vertex\n const ri = i * 2 + 1;\n const ri3 = ri * 3;\n positions[ri3] = x + px * hw;\n positions[ri3 + 1] = y + py * hw;\n positions[ri3 + 2] = z + pz * hw;\n \n // Normal (up)\n normals[li3] = upX; normals[li3 + 1] = upY; normals[li3 + 2] = upZ;\n normals[ri3] = upX; normals[ri3 + 1] = upY; normals[ri3 + 2] = upZ;\n \n // Colors\n if (data.colors) {\n colors[li3] = data.colors[i3];\n colors[li3 + 1] = data.colors[i3 + 1];\n colors[li3 + 2] = data.colors[i3 + 2];\n colors[ri3] = data.colors[i3];\n colors[ri3 + 1] = data.colors[i3 + 1];\n colors[ri3 + 2] = data.colors[i3 + 2];\n } else {\n const t = i / (pointCount - 1);\n colors[li3] = 0.2 + t * 0.6;\n colors[li3 + 1] = 0.5;\n colors[li3 + 2] = 0.8 - t * 0.3;\n colors[ri3] = colors[li3];\n colors[ri3 + 1] = colors[li3 + 1];\n colors[ri3 + 2] = colors[li3 + 2];\n }\n }\n \n // Generate triangle indices\n const indices: number[] = [];\n for (let i = 0; i < pointCount - 1; i++) {\n const bl = i * 2;\n const br = i * 2 + 1;\n const tl = (i + 1) * 2;\n const tr = (i + 1) * 2 + 1;\n \n indices.push(bl, br, tl);\n indices.push(tl, br, tr);\n }\n \n this.indexCount = indices.length;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, normals, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array(indices), gl.STATIC_DRAW);\n }\n \n render(program: ShaderProgram3D): void {\n const { gl } = this;\n \n if (this.indexCount === 0) return;\n \n gl.bindVertexArray(this.vao);\n \n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n const normalLoc = program.attributes['a_normal'];\n if (normalLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.enableVertexAttribArray(normalLoc);\n gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.drawElements(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0);\n \n gl.bindVertexArray(null);\n }\n \n destroy(): void {\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.normalBuffer) gl.deleteBuffer(this.normalBuffer);\n if (this.colorBuffer) gl.deleteBuffer(this.colorBuffer);\n if (this.indexBuffer) gl.deleteBuffer(this.indexBuffer);\n }\n}\n","/**\n * Area 3D renderer.\n * Renders filled area under a 3D line (like a curtain).\n */\n\nimport type { ShaderProgram3D } from '../shader/programs';\nimport type { Area3DData } from './types';\n\nexport class Area3D {\n private gl: WebGL2RenderingContext;\n private vao: WebGLVertexArrayObject | null = null;\n \n private positionBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n \n private indexCount = 0;\n private fillOpacity = 0.6;\n \n constructor(gl: WebGL2RenderingContext) {\n this.gl = gl;\n this.initBuffers();\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n this.positionBuffer = gl.createBuffer();\n this.colorBuffer = gl.createBuffer();\n this.indexBuffer = gl.createBuffer();\n \n gl.bindVertexArray(null);\n }\n \n updateData(data: Area3DData): void {\n const { gl } = this;\n \n const pointCount = data.positions.length / 3;\n if (pointCount < 2) return;\n \n const baseY = data.baseY ?? 0;\n this.fillOpacity = data.fillOpacity ?? 0.6;\n \n // 2 vertices per point (top and bottom)\n const vertexCount = pointCount * 2;\n const positions = new Float32Array(vertexCount * 3);\n const colors = new Float32Array(vertexCount * 3);\n \n for (let i = 0; i < pointCount; i++) {\n const i3 = i * 3;\n const x = data.positions[i3];\n const y = data.positions[i3 + 1];\n const z = data.positions[i3 + 2];\n \n // Top vertex (actual data point)\n const ti = i * 2;\n const ti3 = ti * 3;\n positions[ti3] = x;\n positions[ti3 + 1] = y;\n positions[ti3 + 2] = z;\n \n // Bottom vertex (at baseY)\n const bi = i * 2 + 1;\n const bi3 = bi * 3;\n positions[bi3] = x;\n positions[bi3 + 1] = baseY;\n positions[bi3 + 2] = z;\n \n // Colors\n if (data.colors) {\n colors[ti3] = data.colors[i3];\n colors[ti3 + 1] = data.colors[i3 + 1];\n colors[ti3 + 2] = data.colors[i3 + 2];\n colors[bi3] = data.colors[i3] * 0.7;\n colors[bi3 + 1] = data.colors[i3 + 1] * 0.7;\n colors[bi3 + 2] = data.colors[i3 + 2] * 0.7;\n } else {\n const t = i / (pointCount - 1);\n colors[ti3] = 0.2 + t * 0.6;\n colors[ti3 + 1] = 0.6;\n colors[ti3 + 2] = 0.9;\n colors[bi3] = colors[ti3] * 0.7;\n colors[bi3 + 1] = colors[ti3 + 1] * 0.7;\n colors[bi3 + 2] = colors[ti3 + 2] * 0.7;\n }\n }\n \n // Generate triangle indices\n const indices: number[] = [];\n for (let i = 0; i < pointCount - 1; i++) {\n const tl = i * 2;\n const bl = i * 2 + 1;\n const tr = (i + 1) * 2;\n const br = (i + 1) * 2 + 1;\n \n indices.push(tl, bl, tr);\n indices.push(tr, bl, br);\n }\n \n this.indexCount = indices.length;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array(indices), gl.STATIC_DRAW);\n }\n \n render(program: ShaderProgram3D): void {\n const { gl } = this;\n \n if (this.indexCount === 0) return;\n \n gl.bindVertexArray(this.vao);\n \n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n if (program.uniforms['u_opacity']) {\n gl.uniform1f(program.uniforms['u_opacity'], this.fillOpacity);\n }\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.drawElements(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0);\n \n gl.bindVertexArray(null);\n }\n \n destroy(): void {\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.colorBuffer) gl.deleteBuffer(this.colorBuffer);\n if (this.indexBuffer) gl.deleteBuffer(this.indexBuffer);\n }\n}\n","/**\n * Heatmap 3D renderer.\n * Renders a colored grid on the XZ plane based on intensity values.\n */\n\nimport type { ShaderProgram3D } from '../shader/programs';\nimport type { Heatmap3DData } from './types';\n\nexport class Heatmap3D {\n private gl: WebGL2RenderingContext;\n private vao: WebGLVertexArrayObject | null = null;\n \n private positionBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private indexBuffer: WebGLBuffer | null = null;\n \n private indexCount = 0;\n \n constructor(gl: WebGL2RenderingContext) {\n this.gl = gl;\n this.initBuffers();\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n this.positionBuffer = gl.createBuffer();\n this.colorBuffer = gl.createBuffer();\n this.indexBuffer = gl.createBuffer();\n \n gl.bindVertexArray(null);\n }\n \n updateData(data: Heatmap3DData): void {\n const { gl } = this;\n \n const cols = data.xValues.length;\n const rows = data.zValues.length;\n const vertexCount = cols * rows;\n \n // Find min/max for color mapping\n let minVal = data.minValue ?? Infinity;\n let maxVal = data.maxValue ?? -Infinity;\n \n if (minVal === Infinity || maxVal === -Infinity) {\n for (let i = 0; i < data.values.length; i++) {\n if (data.values[i] < minVal) minVal = data.values[i];\n if (data.values[i] > maxVal) maxVal = data.values[i];\n }\n }\n const range = maxVal - minVal || 1;\n \n const positions = new Float32Array(vertexCount * 3);\n const colors = new Float32Array(vertexCount * 3);\n \n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const idx = row * cols + col;\n const i3 = idx * 3;\n \n positions[i3] = data.xValues[col];\n positions[i3 + 1] = 0; // Flat on XZ plane\n positions[i3 + 2] = data.zValues[row];\n \n const t = (data.values[idx] - minVal) / range;\n this.applyColormap(colors, i3, t, data.colormap);\n }\n }\n \n // Generate indices\n const indices: number[] = [];\n for (let row = 0; row < rows - 1; row++) {\n for (let col = 0; col < cols - 1; col++) {\n const tl = row * cols + col;\n const tr = tl + 1;\n const bl = tl + cols;\n const br = bl + 1;\n \n indices.push(tl, bl, tr);\n indices.push(tr, bl, br);\n }\n }\n \n this.indexCount = indices.length;\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array(indices), gl.STATIC_DRAW);\n }\n \n private applyColormap(colors: Float32Array, i3: number, t: number, colormap?: string): void {\n t = Math.max(0, Math.min(1, t));\n \n switch (colormap) {\n case 'jet':\n if (t < 0.25) {\n colors[i3] = 0; colors[i3 + 1] = 4 * t; colors[i3 + 2] = 1;\n } else if (t < 0.5) {\n colors[i3] = 0; colors[i3 + 1] = 1; colors[i3 + 2] = 1 - 4 * (t - 0.25);\n } else if (t < 0.75) {\n colors[i3] = 4 * (t - 0.5); colors[i3 + 1] = 1; colors[i3 + 2] = 0;\n } else {\n colors[i3] = 1; colors[i3 + 1] = 1 - 4 * (t - 0.75); colors[i3 + 2] = 0;\n }\n break;\n case 'hot':\n colors[i3] = Math.min(1, t * 3);\n colors[i3 + 1] = Math.max(0, Math.min(1, (t - 0.33) * 3));\n colors[i3 + 2] = Math.max(0, (t - 0.67) * 3);\n break;\n case 'grayscale':\n colors[i3] = t; colors[i3 + 1] = t; colors[i3 + 2] = t;\n break;\n case 'viridis':\n default:\n colors[i3] = 0.267 + t * 0.329 + t * t * 0.2;\n colors[i3 + 1] = 0.004 + t * 0.873;\n colors[i3 + 2] = 0.329 + t * 0.2 - t * t * 0.3;\n break;\n }\n }\n \n render(program: ShaderProgram3D): void {\n const { gl } = this;\n \n if (this.indexCount === 0) return;\n \n gl.bindVertexArray(this.vao);\n \n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.drawElements(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0);\n \n gl.bindVertexArray(null);\n }\n \n destroy(): void {\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.colorBuffer) gl.deleteBuffer(this.colorBuffer);\n if (this.indexBuffer) gl.deleteBuffer(this.indexBuffer);\n }\n}\n","/**\n * Impulse/Stem 3D renderer.\n * Renders vertical lines from a base plane to data points.\n */\n\nimport type { ShaderProgram3D } from '../shader/programs';\nimport type { Impulse3DData } from './types';\n\nexport class Impulse3D {\n private gl: WebGL2RenderingContext;\n private vao: WebGLVertexArrayObject | null = null;\n \n private positionBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n \n private vertexCount = 0;\n private showMarkers = true;\n \n constructor(gl: WebGL2RenderingContext) {\n this.gl = gl;\n this.initBuffers();\n }\n \n private initBuffers(): void {\n const { gl } = this;\n \n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n \n this.positionBuffer = gl.createBuffer();\n this.colorBuffer = gl.createBuffer();\n \n gl.bindVertexArray(null);\n }\n \n updateData(data: Impulse3DData): void {\n const { gl } = this;\n \n const pointCount = data.positions.length / 3;\n const baseY = data.baseY ?? 0;\n this.showMarkers = data.showMarkers ?? true;\n \n // 2 vertices per impulse (base and tip)\n this.vertexCount = pointCount * 2;\n \n const positions = new Float32Array(this.vertexCount * 3);\n const colors = new Float32Array(this.vertexCount * 3);\n \n for (let i = 0; i < pointCount; i++) {\n const i3 = i * 3;\n const x = data.positions[i3];\n const y = data.positions[i3 + 1];\n const z = data.positions[i3 + 2];\n \n // Base vertex\n const bi = i * 2;\n const bi3 = bi * 3;\n positions[bi3] = x;\n positions[bi3 + 1] = baseY;\n positions[bi3 + 2] = z;\n \n // Tip vertex\n const ti = i * 2 + 1;\n const ti3 = ti * 3;\n positions[ti3] = x;\n positions[ti3 + 1] = y;\n positions[ti3 + 2] = z;\n \n // Colors\n if (data.colors) {\n colors[bi3] = data.colors[i3] * 0.5;\n colors[bi3 + 1] = data.colors[i3 + 1] * 0.5;\n colors[bi3 + 2] = data.colors[i3 + 2] * 0.5;\n colors[ti3] = data.colors[i3];\n colors[ti3 + 1] = data.colors[i3 + 1];\n colors[ti3 + 2] = data.colors[i3 + 2];\n } else {\n const t = i / (pointCount - 1 || 1);\n colors[bi3] = 0.1; colors[bi3 + 1] = 0.3; colors[bi3 + 2] = 0.5;\n colors[ti3] = 0.2 + t * 0.6;\n colors[ti3 + 1] = 0.5 + t * 0.3;\n colors[ti3 + 2] = 0.9;\n }\n }\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n \n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n }\n \n render(program: ShaderProgram3D): void {\n const { gl } = this;\n \n if (this.vertexCount === 0) return;\n \n gl.bindVertexArray(this.vao);\n \n const posLoc = program.attributes['a_position'];\n if (posLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.enableVertexAttribArray(posLoc);\n gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n const colorLoc = program.attributes['a_color'];\n if (colorLoc >= 0) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.enableVertexAttribArray(colorLoc);\n gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, 0, 0);\n }\n \n // Draw lines\n gl.drawArrays(gl.LINES, 0, this.vertexCount);\n \n // Draw markers at tips\n if (this.showMarkers) {\n if (program.uniforms['u_pointSize']) {\n gl.uniform1f(program.uniforms['u_pointSize'], 8);\n }\n // Draw only tip vertices (odd indices)\n for (let i = 1; i < this.vertexCount; i += 2) {\n gl.drawArrays(gl.POINTS, i, 1);\n }\n }\n \n gl.bindVertexArray(null);\n }\n \n destroy(): void {\n const { gl } = this;\n if (this.vao) gl.deleteVertexArray(this.vao);\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.colorBuffer) gl.deleteBuffer(this.colorBuffer);\n }\n}\n","/**\n * VeloPlot Engine - 3D Visualization Plugin\n * \n * This plugin provides 3D rendering capabilities including:\n * - Line3D, Area3D, Bubble3D, Impulse3D renderers\n * - Surface mesh and waterfall visualizations\n * - 3D axes with depth perspective\n * - Camera controls and raycasting\n * \n * @module plugins/3d\n */\n\n// Re-export all 3D functionality\nexport * from \"./Area3DRenderer\";\nexport * from \"./Bubble3DRenderer\";\nexport * from \"./Impulse3DRenderer\";\nexport * from \"./Line3DRenderer\";\nexport * from \"./PointCloud3DRenderer\";\nexport * from \"./Ribbon3DRenderer\";\nexport * from \"./SurfaceBar3DRenderer\";\nexport * from \"./SurfaceMesh3DRenderer\";\nexport * from \"./VectorField3DRenderer\";\nexport * from \"./Voxel3DRenderer\";\nexport * from \"./Waterfall3DRenderer\";\nexport * from \"./Axes3D\";\nexport * from \"./Tooltip3D\";\nexport * from \"./Raycaster3D\";\n\n// Math\nexport * from \"./math\";\n\n// Camera & Controls\nexport * from \"./camera\";\nexport * from \"./controls\";\n\nexport * from \"./colorThemes\";\n\n// Re-export series\nexport * from \"./series\";\n\nimport type { PluginManifest, ChartPlugin, PluginContext } from \"../types\";\n\n// ============================================\n// 3D Plugin Factory\n// ============================================\n\nexport interface Plugin3DConfig {\n /** Enable WebGL2 features if available (default: true) */\n preferWebGL2?: boolean;\n /** Default camera configuration */\n camera?: {\n position?: [number, number, number];\n target?: [number, number, number];\n fov?: number;\n };\n /** Enable orbit controls (default: true) */\n enableOrbitControls?: boolean;\n}\n\nconst manifest3D: PluginManifest = {\n name: \"velo-plot-3d\",\n version: \"1.0.0\",\n description: \"Advanced 3D visualization for velo-plot\",\n provides: [\"visualization\", \"3d\"],\n tags: [\"3d\", \"webgl\", \"surface\", \"mesh\"],\n};\n\n/**\n * VeloPlot 3D Plugin\n * \n * Provides interactive 3D charts, surfaces, and meshes.\n */\nexport function Plugin3D(config: Plugin3DConfig = {}): ChartPlugin<Plugin3DConfig> {\n return {\n manifest: manifest3D,\n\n onInit(ctx: PluginContext) {\n // Store configuration for later use\n ctx.storage.set(\"config\", config);\n },\n\n onConfigChange(_ctx: PluginContext, _newConfig: Plugin3DConfig) {\n },\n\n onDestroy(_ctx: PluginContext) {\n }\n };\n}\n\nexport default Plugin3D;\n"],"names":["create","out","identity","copy","a","multiply","b","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","a30","a31","a32","a33","b0","b1","b2","b3","perspective","fovY","aspect","near","far","f","nf","lookAt","eye","center","up","eyeX","eyeY","eyeZ","centerX","centerY","centerZ","upX","upY","upZ","z0","z1","z2","len","x0","x1","x2","y0","y1","y2","translate","v","x","y","z","scale","rotateX","rad","s","c","rotateY","rotateZ","invert","b00","b01","b02","b03","b04","b05","b06","b07","b08","b09","b10","b11","det","ortho","left","right","bottom","top","lr","bt","OrbitCamera","options","__publicField","Mat4.create","deltaTheta","deltaPhi","delta","factor","deltaX","deltaY","sinTheta","rightX","rightZ","theta","phi","radius","sinPhi","cosPhi","cosTheta","Mat4.lookAt","Mat4.perspective","Mat4.multiply","dx","dy","dz","minX","minY","minZ","maxX","maxY","maxZ","diagonal","OrbitController","camera","element","e","boundHandlers","callback","pointer","panScale","distance","remaining","zoomAmount","pointerArray","threshold","moving","BUBBLE_VERT","BUBBLE_FRAG","BUBBLE_FLAT_FRAG","BUBBLE_VERT_WEBGL1","BUBBLE_FRAG_WEBGL1","AXIS_VERT","AXIS_FRAG","SURFACE_VERT","SURFACE_FRAG","LINE_POINT_VERT","LINE_POINT_FRAG","WATERFALL_VERT","WATERFALL_FRAG","VECTOR_FIELD_VERT","VECTOR_FIELD_FRAG","POINT_CLOUD_VERT","POINT_CLOUD_FRAG","VOXEL_VERT","VOXEL_FRAG","RIBBON_VERT","RIBBON_FRAG","SURFACE_BAR_VERT","SURFACE_BAR_FRAG","createShader","gl","source","type","shader","error","createProgram","vertSource","fragSource","attributeNames","uniformNames","vertShader","fragShader","program","attributes","name","uniforms","createProgramBundle3D","useWebGL1Fallback","bubbleAttribs","bubbleUniforms","bubbleProgram","bubbleFlatProgram","axisProgram","surfaceProgram","linePointProgram","waterfallProgram","vectorFieldProgram","pointCloudProgram","voxelProgram","ribbonProgram","surfaceBarProgram","deleteProgram","deleteProgramBundle","bundle","AXIS_COLORS","Axes3D","vertexShaderSource","fragmentShaderSource","vertexShader","fragmentShader","bounds","positions","colors","boxColor","addLine","gridColor","tickCount","i","tickLen","color","xColor","yColor","zColor","formatNumber","offset","formatter","t","value","viewProjectionMatrix","vao","posBuffer","colorBuffer","count","lineProgram","posLoc","colorLoc","worldPos","canvasWidth","canvasHeight","wx","wy","wz","m","clipX","clipY","clipZ","clipW","ndcX","ndcY","ndcZ","visible","screenX","screenY","Tooltip3D","container","data","content","containerRect","elementRect","viewportWidth","viewportHeight","finalX","finalY","lines","d","r","g","key","createHoverHandler","renderer","tooltip","lastHitIndex","debounceTimer","debounceMs","event","_a","_b","rect","hit","bubbleData","clone","set","add","subtract","normalize","dot","cross","ax","ay","az","bx","by","bz","length","squaredLength","lerp","negate","transformMat4","w","createRayFromScreen","invViewProj","Mat4.invert","nearPoint","farPoint","nearWorld","transformPoint4","farWorld","origin","direction","p","raySphereIntersection","ray","oc","discriminant","sqrtD","t1","t2","pickBubble","scales","baseRadius","closestHit","point","pickBubblesInRange","maxResults","hits","pointToRayDistance","closest","rayTriangleIntersection","v0","v1","v2","e1","e2","h","q","pickSurfaceMesh","xValues","zValues","yValues","cols","rows","row","col","i00","i10","i01","i11","v00","v10","v01","v11","hit1","yInterp","hit2","raySegmentDistance","p0","p1","u","D","sc","tc","closestOnRay","closestOnSegment","pickLine","minDist","line","res","pickImpulse","baseY","pickArea","areas","DARK_THEME","LIGHT_THEME","getThemeFromBackground","backgroundColor","createTheme","baseTheme","Area3DRenderer","newHoveredIndex","area","width","height","viewProj","canvas","dpr","allPositions","allNormals","allColors","allIndices","vertexOffset","colorPalette","highlightColor","areaIdx","pointCount","defaultColor","nx","ny","nz","topLeft","bottomLeft","topRight","bottomRight","normals","indices","padding","startTime","normalLoc","frameTime","now","loop","format","quality","transparent","savedBg","mimeType","listeners","createIcosphere","subdivisions","vertices","faces","midpointCache","getMidpoint","i1","i2","mx","my","mz","idx","newFaces","ab","bc","ca","createUVSphere","segments","rings","ring","seg","curr","next","createCube","createVoxelCube","InstancedMesh","geometry","maxInstances","instanceCount","instancePosLoc","scaleLoc","Bubble3DRenderer","_c","_d","_e","_f","_g","_h","tooltipOptions","programs","mesh","style","lx","ly","lz","index","i3","resolve","filename","dataUrl","link","Impulse3DRenderer","stemWidth","stemSides","impulseData","angle","cos","sin","ox","oz","bl","br","tl","tr","markerSize","octVerts","octFaces","oy","normalBuffer","indexBuffer","indexCount","Line3DRenderer","lineWidth","tubeSides","px","py","pz","tx","ty","tz","tLen","nLen","current","currentNext","nextNext","PointCloud3DRenderer","sizeLoc","sizes","cb","Ribbon3DRenderer","series","halfW","seriesIdx","n","mag","v3","SurfaceBar3DRenderer","cube","instPosLoc","heightLoc","spacing","heights","maxH","minH","palette","centers","radii","val","SurfaceMesh3D","_options","wireframeIndices","hL","hR","hD","hU","range","wireframe","SurfaceMesh3DRenderer","xMin","xMax","zMin","zMax","yMin","yMax","enabled","VectorField3DRenderer","dirLoc","_","Voxel3DRenderer","valueLoc","dimensions","k","j","vz","vy","vx","Waterfall3DRenderer","slices","slice","sliceIdx","sliceColor","PointLine3D","Column3D","columnWidth","columnDepth","vertexCount","hw","hd","yRange","baseIdx","box","vi","faceBase","cx","cy","cz","x3","y3","z3","pi","Waterfall3D","zStart","zStep","sliceCount","pointsPerSlice","quadRows","quadCols","colormap","Scatter3D","Ribbon3D","defaultWidth","widths","pLen","li3","ri3","Area3D","ti3","bi3","Heatmap3D","minVal","maxVal","Impulse3D","manifest3D","Plugin3D","config","ctx","_ctx","_newConfig"],"mappings":";;;AAYO,SAASA,IAAe;AAC7B,QAAMC,IAAM,IAAI,aAAa,EAAE;AAC/B,SAAAA,EAAI,CAAC,IAAI,GACTA,EAAI,CAAC,IAAI,GACTA,EAAI,EAAE,IAAI,GACVA,EAAI,EAAE,IAAI,GACHA;AACT;AAGO,SAASC,GAASD,GAAiB;AACxC,SAAAA,EAAI,CAAC,IAAI,GAAGA,EAAI,CAAC,IAAI,GAAGA,EAAI,CAAC,IAAI,GAAGA,EAAI,CAAC,IAAI,GAC7CA,EAAI,CAAC,IAAI,GAAGA,EAAI,CAAC,IAAI,GAAGA,EAAI,CAAC,IAAI,GAAGA,EAAI,CAAC,IAAI,GAC7CA,EAAI,CAAC,IAAI,GAAGA,EAAI,CAAC,IAAI,GAAGA,EAAI,EAAE,IAAI,GAAGA,EAAI,EAAE,IAAI,GAC/CA,EAAI,EAAE,IAAI,GAAGA,EAAI,EAAE,IAAI,GAAGA,EAAI,EAAE,IAAI,GAAGA,EAAI,EAAE,IAAI,GAC1CA;AACT;AAGO,SAASE,GAAKF,GAAWG,GAAe;AAC7C,SAAAH,EAAI,CAAC,IAAIG,EAAE,CAAC,GAAGH,EAAI,CAAC,IAAIG,EAAE,CAAC,GAAGH,EAAI,CAAC,IAAIG,EAAE,CAAC,GAAGH,EAAI,CAAC,IAAIG,EAAE,CAAC,GACzDH,EAAI,CAAC,IAAIG,EAAE,CAAC,GAAGH,EAAI,CAAC,IAAIG,EAAE,CAAC,GAAGH,EAAI,CAAC,IAAIG,EAAE,CAAC,GAAGH,EAAI,CAAC,IAAIG,EAAE,CAAC,GACzDH,EAAI,CAAC,IAAIG,EAAE,CAAC,GAAGH,EAAI,CAAC,IAAIG,EAAE,CAAC,GAAGH,EAAI,EAAE,IAAIG,EAAE,EAAE,GAAGH,EAAI,EAAE,IAAIG,EAAE,EAAE,GAC7DH,EAAI,EAAE,IAAIG,EAAE,EAAE,GAAGH,EAAI,EAAE,IAAIG,EAAE,EAAE,GAAGH,EAAI,EAAE,IAAIG,EAAE,EAAE,GAAGH,EAAI,EAAE,IAAIG,EAAE,EAAE,GAC1DH;AACT;AAGO,SAASI,GAASJ,GAAWG,GAASE,GAAe;AAC1D,QAAMC,IAAMH,EAAE,CAAC,GAAGI,IAAMJ,EAAE,CAAC,GAAGK,IAAML,EAAE,CAAC,GAAGM,IAAMN,EAAE,CAAC,GAC7CO,IAAMP,EAAE,CAAC,GAAGQ,IAAMR,EAAE,CAAC,GAAGS,IAAMT,EAAE,CAAC,GAAGU,IAAMV,EAAE,CAAC,GAC7CW,IAAMX,EAAE,CAAC,GAAGY,IAAMZ,EAAE,CAAC,GAAGa,IAAMb,EAAE,EAAE,GAAGc,IAAMd,EAAE,EAAE,GAC/Ce,IAAMf,EAAE,EAAE,GAAGgB,IAAMhB,EAAE,EAAE,GAAGiB,IAAMjB,EAAE,EAAE,GAAGkB,IAAMlB,EAAE,EAAE;AAEvD,MAAImB,IAAKjB,EAAE,CAAC,GAAGkB,IAAKlB,EAAE,CAAC,GAAGmB,IAAKnB,EAAE,CAAC,GAAGoB,IAAKpB,EAAE,CAAC;AAC7C,SAAAL,EAAI,CAAC,IAAIsB,IAAKhB,IAAMiB,IAAKb,IAAMc,IAAKV,IAAMW,IAAKP,GAC/ClB,EAAI,CAAC,IAAIsB,IAAKf,IAAMgB,IAAKZ,IAAMa,IAAKT,IAAMU,IAAKN,GAC/CnB,EAAI,CAAC,IAAIsB,IAAKd,IAAMe,IAAKX,IAAMY,IAAKR,IAAMS,IAAKL,GAC/CpB,EAAI,CAAC,IAAIsB,IAAKb,IAAMc,IAAKV,IAAMW,IAAKP,IAAMQ,IAAKJ,GAE/CC,IAAKjB,EAAE,CAAC,GAAGkB,IAAKlB,EAAE,CAAC,GAAGmB,IAAKnB,EAAE,CAAC,GAAGoB,IAAKpB,EAAE,CAAC,GACzCL,EAAI,CAAC,IAAIsB,IAAKhB,IAAMiB,IAAKb,IAAMc,IAAKV,IAAMW,IAAKP,GAC/ClB,EAAI,CAAC,IAAIsB,IAAKf,IAAMgB,IAAKZ,IAAMa,IAAKT,IAAMU,IAAKN,GAC/CnB,EAAI,CAAC,IAAIsB,IAAKd,IAAMe,IAAKX,IAAMY,IAAKR,IAAMS,IAAKL,GAC/CpB,EAAI,CAAC,IAAIsB,IAAKb,IAAMc,IAAKV,IAAMW,IAAKP,IAAMQ,IAAKJ,GAE/CC,IAAKjB,EAAE,CAAC,GAAGkB,IAAKlB,EAAE,CAAC,GAAGmB,IAAKnB,EAAE,EAAE,GAAGoB,IAAKpB,EAAE,EAAE,GAC3CL,EAAI,CAAC,IAAIsB,IAAKhB,IAAMiB,IAAKb,IAAMc,IAAKV,IAAMW,IAAKP,GAC/ClB,EAAI,CAAC,IAAIsB,IAAKf,IAAMgB,IAAKZ,IAAMa,IAAKT,IAAMU,IAAKN,GAC/CnB,EAAI,EAAE,IAAIsB,IAAKd,IAAMe,IAAKX,IAAMY,IAAKR,IAAMS,IAAKL,GAChDpB,EAAI,EAAE,IAAIsB,IAAKb,IAAMc,IAAKV,IAAMW,IAAKP,IAAMQ,IAAKJ,GAEhDC,IAAKjB,EAAE,EAAE,GAAGkB,IAAKlB,EAAE,EAAE,GAAGmB,IAAKnB,EAAE,EAAE,GAAGoB,IAAKpB,EAAE,EAAE,GAC7CL,EAAI,EAAE,IAAIsB,IAAKhB,IAAMiB,IAAKb,IAAMc,IAAKV,IAAMW,IAAKP,GAChDlB,EAAI,EAAE,IAAIsB,IAAKf,IAAMgB,IAAKZ,IAAMa,IAAKT,IAAMU,IAAKN,GAChDnB,EAAI,EAAE,IAAIsB,IAAKd,IAAMe,IAAKX,IAAMY,IAAKR,IAAMS,IAAKL,GAChDpB,EAAI,EAAE,IAAIsB,IAAKb,IAAMc,IAAKV,IAAMW,IAAKP,IAAMQ,IAAKJ,GAEzCrB;AACT;AAGO,SAAS0B,GACd1B,GACA2B,GACAC,GACAC,GACAC,GACM;AACN,QAAMC,IAAI,IAAM,KAAK,IAAIJ,IAAO,CAAC,GAC3BK,IAAK,KAAKH,IAAOC;AAEvB,SAAA9B,EAAI,CAAC,IAAI+B,IAAIH,GACb5B,EAAI,CAAC,IAAI,GACTA,EAAI,CAAC,IAAI,GACTA,EAAI,CAAC,IAAI,GACTA,EAAI,CAAC,IAAI,GACTA,EAAI,CAAC,IAAI+B,GACT/B,EAAI,CAAC,IAAI,GACTA,EAAI,CAAC,IAAI,GACTA,EAAI,CAAC,IAAI,GACTA,EAAI,CAAC,IAAI,GACTA,EAAI,EAAE,KAAK8B,IAAMD,KAAQG,GACzBhC,EAAI,EAAE,IAAI,IACVA,EAAI,EAAE,IAAI,GACVA,EAAI,EAAE,IAAI,GACVA,EAAI,EAAE,IAAI,IAAI8B,IAAMD,IAAOG,GAC3BhC,EAAI,EAAE,IAAI,GAEHA;AACT;AAGO,SAASiC,GACdjC,GACAkC,GACAC,GACAC,GACM;AACN,QAAMC,IAAOH,EAAI,CAAC,GAAGI,IAAOJ,EAAI,CAAC,GAAGK,IAAOL,EAAI,CAAC,GAC1CM,IAAUL,EAAO,CAAC,GAAGM,IAAUN,EAAO,CAAC,GAAGO,IAAUP,EAAO,CAAC,GAC5DQ,IAAMP,EAAG,CAAC,GAAGQ,IAAMR,EAAG,CAAC,GAAGS,IAAMT,EAAG,CAAC;AAE1C,MAAIU,IAAKT,IAAOG,GACZO,IAAKT,IAAOG,GACZO,IAAKT,IAAOG,GAEZO,IAAMH,IAAKA,IAAKC,IAAKA,IAAKC,IAAKA;AACnC,EAAIC,IAAM,MACRA,IAAM,IAAI,KAAK,KAAKA,CAAG,GACvBH,KAAMG,GACNF,KAAME,GACND,KAAMC;AAGR,MAAIC,IAAKN,IAAMI,IAAKH,IAAME,GACtBI,IAAKN,IAAMC,IAAKH,IAAMK,GACtBI,IAAKT,IAAMI,IAAKH,IAAME;AAE1B,EAAAG,IAAMC,IAAKA,IAAKC,IAAKA,IAAKC,IAAKA,GAC3BH,IAAM,MACRA,IAAM,IAAI,KAAK,KAAKA,CAAG,GACvBC,KAAMD,GACNE,KAAMF,GACNG,KAAMH;AAGR,QAAMI,IAAKN,IAAKK,IAAKJ,IAAKG,GACpBG,IAAKN,IAAKE,IAAKJ,IAAKM,GACpBG,IAAKT,IAAKK,IAAKJ,IAAKG;AAE1B,SAAAlD,EAAI,CAAC,IAAIkD,GACTlD,EAAI,CAAC,IAAIqD,GACTrD,EAAI,CAAC,IAAI8C,GACT9C,EAAI,CAAC,IAAI,GACTA,EAAI,CAAC,IAAImD,GACTnD,EAAI,CAAC,IAAIsD,GACTtD,EAAI,CAAC,IAAI+C,GACT/C,EAAI,CAAC,IAAI,GACTA,EAAI,CAAC,IAAIoD,GACTpD,EAAI,CAAC,IAAIuD,GACTvD,EAAI,EAAE,IAAIgD,GACVhD,EAAI,EAAE,IAAI,GACVA,EAAI,EAAE,IAAI,EAAEkD,IAAKb,IAAOc,IAAKb,IAAOc,IAAKb,IACzCvC,EAAI,EAAE,IAAI,EAAEqD,IAAKhB,IAAOiB,IAAKhB,IAAOiB,IAAKhB,IACzCvC,EAAI,EAAE,IAAI,EAAE8C,IAAKT,IAAOU,IAAKT,IAAOU,IAAKT,IACzCvC,EAAI,EAAE,IAAI,GAEHA;AACT;AAGO,SAASwD,GAAUxD,GAAWG,GAASsD,GAAe;AAC3D,QAAMC,IAAID,EAAE,CAAC,GAAGE,IAAIF,EAAE,CAAC,GAAGG,IAAIH,EAAE,CAAC;AAEjC,MAAItD,MAAMH;AACR,IAAAA,EAAI,EAAE,IAAIG,EAAE,CAAC,IAAIuD,IAAIvD,EAAE,CAAC,IAAIwD,IAAIxD,EAAE,CAAC,IAAIyD,IAAIzD,EAAE,EAAE,GAC/CH,EAAI,EAAE,IAAIG,EAAE,CAAC,IAAIuD,IAAIvD,EAAE,CAAC,IAAIwD,IAAIxD,EAAE,CAAC,IAAIyD,IAAIzD,EAAE,EAAE,GAC/CH,EAAI,EAAE,IAAIG,EAAE,CAAC,IAAIuD,IAAIvD,EAAE,CAAC,IAAIwD,IAAIxD,EAAE,EAAE,IAAIyD,IAAIzD,EAAE,EAAE,GAChDH,EAAI,EAAE,IAAIG,EAAE,CAAC,IAAIuD,IAAIvD,EAAE,CAAC,IAAIwD,IAAIxD,EAAE,EAAE,IAAIyD,IAAIzD,EAAE,EAAE;AAAA,OAC3C;AACL,UAAMG,IAAMH,EAAE,CAAC,GAAGI,IAAMJ,EAAE,CAAC,GAAGK,IAAML,EAAE,CAAC,GAAGM,IAAMN,EAAE,CAAC,GAC7CO,IAAMP,EAAE,CAAC,GAAGQ,IAAMR,EAAE,CAAC,GAAGS,IAAMT,EAAE,CAAC,GAAGU,IAAMV,EAAE,CAAC,GAC7CW,IAAMX,EAAE,CAAC,GAAGY,IAAMZ,EAAE,CAAC,GAAGa,IAAMb,EAAE,EAAE,GAAGc,IAAMd,EAAE,EAAE;AAErD,IAAAH,EAAI,CAAC,IAAIM,GAAKN,EAAI,CAAC,IAAIO,GAAKP,EAAI,CAAC,IAAIQ,GAAKR,EAAI,CAAC,IAAIS,GACnDT,EAAI,CAAC,IAAIU,GAAKV,EAAI,CAAC,IAAIW,GAAKX,EAAI,CAAC,IAAIY,GAAKZ,EAAI,CAAC,IAAIa,GACnDb,EAAI,CAAC,IAAIc,GAAKd,EAAI,CAAC,IAAIe,GAAKf,EAAI,EAAE,IAAIgB,GAAKhB,EAAI,EAAE,IAAIiB,GAErDjB,EAAI,EAAE,IAAIM,IAAMoD,IAAIhD,IAAMiD,IAAI7C,IAAM8C,IAAIzD,EAAE,EAAE,GAC5CH,EAAI,EAAE,IAAIO,IAAMmD,IAAI/C,IAAMgD,IAAI5C,IAAM6C,IAAIzD,EAAE,EAAE,GAC5CH,EAAI,EAAE,IAAIQ,IAAMkD,IAAI9C,IAAM+C,IAAI3C,IAAM4C,IAAIzD,EAAE,EAAE,GAC5CH,EAAI,EAAE,IAAIS,IAAMiD,IAAI7C,IAAM8C,IAAI1C,IAAM2C,IAAIzD,EAAE,EAAE;AAAA,EAC9C;AAEA,SAAOH;AACT;AAGO,SAAS6D,GAAM7D,GAAWG,GAASsD,GAAe;AACvD,QAAMC,IAAID,EAAE,CAAC,GAAGE,IAAIF,EAAE,CAAC,GAAGG,IAAIH,EAAE,CAAC;AAEjC,SAAAzD,EAAI,CAAC,IAAIG,EAAE,CAAC,IAAIuD,GAChB1D,EAAI,CAAC,IAAIG,EAAE,CAAC,IAAIuD,GAChB1D,EAAI,CAAC,IAAIG,EAAE,CAAC,IAAIuD,GAChB1D,EAAI,CAAC,IAAIG,EAAE,CAAC,IAAIuD,GAChB1D,EAAI,CAAC,IAAIG,EAAE,CAAC,IAAIwD,GAChB3D,EAAI,CAAC,IAAIG,EAAE,CAAC,IAAIwD,GAChB3D,EAAI,CAAC,IAAIG,EAAE,CAAC,IAAIwD,GAChB3D,EAAI,CAAC,IAAIG,EAAE,CAAC,IAAIwD,GAChB3D,EAAI,CAAC,IAAIG,EAAE,CAAC,IAAIyD,GAChB5D,EAAI,CAAC,IAAIG,EAAE,CAAC,IAAIyD,GAChB5D,EAAI,EAAE,IAAIG,EAAE,EAAE,IAAIyD,GAClB5D,EAAI,EAAE,IAAIG,EAAE,EAAE,IAAIyD,GAClB5D,EAAI,EAAE,IAAIG,EAAE,EAAE,GACdH,EAAI,EAAE,IAAIG,EAAE,EAAE,GACdH,EAAI,EAAE,IAAIG,EAAE,EAAE,GACdH,EAAI,EAAE,IAAIG,EAAE,EAAE,GAEPH;AACT;AAGO,SAAS8D,GAAQ9D,GAAWG,GAAS4D,GAAmB;AAC7D,QAAMC,IAAI,KAAK,IAAID,CAAG,GAChBE,IAAI,KAAK,IAAIF,CAAG,GAChBrD,IAAMP,EAAE,CAAC,GAAGQ,IAAMR,EAAE,CAAC,GAAGS,IAAMT,EAAE,CAAC,GAAGU,IAAMV,EAAE,CAAC,GAC7CW,IAAMX,EAAE,CAAC,GAAGY,IAAMZ,EAAE,CAAC,GAAGa,IAAMb,EAAE,EAAE,GAAGc,IAAMd,EAAE,EAAE;AAErD,SAAIA,MAAMH,MACRA,EAAI,CAAC,IAAIG,EAAE,CAAC,GAAGH,EAAI,CAAC,IAAIG,EAAE,CAAC,GAAGH,EAAI,CAAC,IAAIG,EAAE,CAAC,GAAGH,EAAI,CAAC,IAAIG,EAAE,CAAC,GACzDH,EAAI,EAAE,IAAIG,EAAE,EAAE,GAAGH,EAAI,EAAE,IAAIG,EAAE,EAAE,GAAGH,EAAI,EAAE,IAAIG,EAAE,EAAE,GAAGH,EAAI,EAAE,IAAIG,EAAE,EAAE,IAGnEH,EAAI,CAAC,IAAIU,IAAMuD,IAAInD,IAAMkD,GACzBhE,EAAI,CAAC,IAAIW,IAAMsD,IAAIlD,IAAMiD,GACzBhE,EAAI,CAAC,IAAIY,IAAMqD,IAAIjD,IAAMgD,GACzBhE,EAAI,CAAC,IAAIa,IAAMoD,IAAIhD,IAAM+C,GACzBhE,EAAI,CAAC,IAAIc,IAAMmD,IAAIvD,IAAMsD,GACzBhE,EAAI,CAAC,IAAIe,IAAMkD,IAAItD,IAAMqD,GACzBhE,EAAI,EAAE,IAAIgB,IAAMiD,IAAIrD,IAAMoD,GAC1BhE,EAAI,EAAE,IAAIiB,IAAMgD,IAAIpD,IAAMmD,GAEnBhE;AACT;AAGO,SAASkE,GAAQlE,GAAWG,GAAS4D,GAAmB;AAC7D,QAAMC,IAAI,KAAK,IAAID,CAAG,GAChBE,IAAI,KAAK,IAAIF,CAAG,GAChBzD,IAAMH,EAAE,CAAC,GAAGI,IAAMJ,EAAE,CAAC,GAAGK,IAAML,EAAE,CAAC,GAAGM,IAAMN,EAAE,CAAC,GAC7CW,IAAMX,EAAE,CAAC,GAAGY,IAAMZ,EAAE,CAAC,GAAGa,IAAMb,EAAE,EAAE,GAAGc,IAAMd,EAAE,EAAE;AAErD,SAAIA,MAAMH,MACRA,EAAI,CAAC,IAAIG,EAAE,CAAC,GAAGH,EAAI,CAAC,IAAIG,EAAE,CAAC,GAAGH,EAAI,CAAC,IAAIG,EAAE,CAAC,GAAGH,EAAI,CAAC,IAAIG,EAAE,CAAC,GACzDH,EAAI,EAAE,IAAIG,EAAE,EAAE,GAAGH,EAAI,EAAE,IAAIG,EAAE,EAAE,GAAGH,EAAI,EAAE,IAAIG,EAAE,EAAE,GAAGH,EAAI,EAAE,IAAIG,EAAE,EAAE,IAGnEH,EAAI,CAAC,IAAIM,IAAM2D,IAAInD,IAAMkD,GACzBhE,EAAI,CAAC,IAAIO,IAAM0D,IAAIlD,IAAMiD,GACzBhE,EAAI,CAAC,IAAIQ,IAAMyD,IAAIjD,IAAMgD,GACzBhE,EAAI,CAAC,IAAIS,IAAMwD,IAAIhD,IAAM+C,GACzBhE,EAAI,CAAC,IAAIM,IAAM0D,IAAIlD,IAAMmD,GACzBjE,EAAI,CAAC,IAAIO,IAAMyD,IAAIjD,IAAMkD,GACzBjE,EAAI,EAAE,IAAIQ,IAAMwD,IAAIhD,IAAMiD,GAC1BjE,EAAI,EAAE,IAAIS,IAAMuD,IAAI/C,IAAMgD,GAEnBjE;AACT;AAGO,SAASmE,GAAQnE,GAAWG,GAAS4D,GAAmB;AAC7D,QAAMC,IAAI,KAAK,IAAID,CAAG,GAChBE,IAAI,KAAK,IAAIF,CAAG,GAChBzD,IAAMH,EAAE,CAAC,GAAGI,IAAMJ,EAAE,CAAC,GAAGK,IAAML,EAAE,CAAC,GAAGM,IAAMN,EAAE,CAAC,GAC7CO,IAAMP,EAAE,CAAC,GAAGQ,IAAMR,EAAE,CAAC,GAAGS,IAAMT,EAAE,CAAC,GAAGU,IAAMV,EAAE,CAAC;AAEnD,SAAIA,MAAMH,MACRA,EAAI,CAAC,IAAIG,EAAE,CAAC,GAAGH,EAAI,CAAC,IAAIG,EAAE,CAAC,GAAGH,EAAI,EAAE,IAAIG,EAAE,EAAE,GAAGH,EAAI,EAAE,IAAIG,EAAE,EAAE,GAC7DH,EAAI,EAAE,IAAIG,EAAE,EAAE,GAAGH,EAAI,EAAE,IAAIG,EAAE,EAAE,GAAGH,EAAI,EAAE,IAAIG,EAAE,EAAE,GAAGH,EAAI,EAAE,IAAIG,EAAE,EAAE,IAGnEH,EAAI,CAAC,IAAIM,IAAM2D,IAAIvD,IAAMsD,GACzBhE,EAAI,CAAC,IAAIO,IAAM0D,IAAItD,IAAMqD,GACzBhE,EAAI,CAAC,IAAIQ,IAAMyD,IAAIrD,IAAMoD,GACzBhE,EAAI,CAAC,IAAIS,IAAMwD,IAAIpD,IAAMmD,GACzBhE,EAAI,CAAC,IAAIU,IAAMuD,IAAI3D,IAAM0D,GACzBhE,EAAI,CAAC,IAAIW,IAAMsD,IAAI1D,IAAMyD,GACzBhE,EAAI,CAAC,IAAIY,IAAMqD,IAAIzD,IAAMwD,GACzBhE,EAAI,CAAC,IAAIa,IAAMoD,IAAIxD,IAAMuD,GAElBhE;AACT;AAGO,SAASoE,GAAOpE,GAAWG,GAAsB;AACtD,QAAMG,IAAMH,EAAE,CAAC,GAAGI,IAAMJ,EAAE,CAAC,GAAGK,IAAML,EAAE,CAAC,GAAGM,IAAMN,EAAE,CAAC,GAC7CO,IAAMP,EAAE,CAAC,GAAGQ,IAAMR,EAAE,CAAC,GAAGS,IAAMT,EAAE,CAAC,GAAGU,IAAMV,EAAE,CAAC,GAC7CW,IAAMX,EAAE,CAAC,GAAGY,IAAMZ,EAAE,CAAC,GAAGa,IAAMb,EAAE,EAAE,GAAGc,IAAMd,EAAE,EAAE,GAC/Ce,IAAMf,EAAE,EAAE,GAAGgB,IAAMhB,EAAE,EAAE,GAAGiB,IAAMjB,EAAE,EAAE,GAAGkB,IAAMlB,EAAE,EAAE,GAEjDkE,IAAM/D,IAAMK,IAAMJ,IAAMG,GACxB4D,IAAMhE,IAAMM,IAAMJ,IAAME,GACxB6D,IAAMjE,IAAMO,IAAMJ,IAAMC,GACxB8D,IAAMjE,IAAMK,IAAMJ,IAAMG,GACxB8D,IAAMlE,IAAMM,IAAMJ,IAAME,GACxB+D,IAAMlE,IAAMK,IAAMJ,IAAMG,GACxB+D,IAAM7D,IAAMK,IAAMJ,IAAMG,GACxB0D,IAAM9D,IAAMM,IAAMJ,IAAME,GACxB2D,IAAM/D,IAAMO,IAAMJ,IAAMC,GACxB4D,IAAM/D,IAAMK,IAAMJ,IAAMG,GACxB4D,IAAMhE,IAAMM,IAAMJ,IAAME,GACxB6D,IAAMhE,IAAMK,IAAMJ,IAAMG;AAE9B,MAAI6D,IAAMZ,IAAMW,IAAMV,IAAMS,IAAMR,IAAMO,IAAMN,IAAMK,IAAMJ,IAAMG,IAAMF,IAAMC;AAE5E,SAAI,KAAK,IAAIM,CAAG,IAAI,OACX,QAGTA,IAAM,IAAMA,GAEZjF,EAAI,CAAC,KAAKW,IAAMqE,IAAMpE,IAAMmE,IAAMlE,IAAMiE,KAAOG,GAC/CjF,EAAI,CAAC,KAAKQ,IAAMuE,IAAMxE,IAAMyE,IAAMvE,IAAMqE,KAAOG,GAC/CjF,EAAI,CAAC,KAAKmB,IAAMuD,IAAMtD,IAAMqD,IAAMpD,IAAMmD,KAAOS,GAC/CjF,EAAI,CAAC,KAAKgB,IAAMyD,IAAM1D,IAAM2D,IAAMzD,IAAMuD,KAAOS,GAC/CjF,EAAI,CAAC,KAAKY,IAAMiE,IAAMnE,IAAMsE,IAAMnE,IAAM+D,KAAOK,GAC/CjF,EAAI,CAAC,KAAKM,IAAM0E,IAAMxE,IAAMqE,IAAMpE,IAAMmE,KAAOK,GAC/CjF,EAAI,CAAC,KAAKoB,IAAMmD,IAAMrD,IAAMwD,IAAMrD,IAAMiD,KAAOW,GAC/CjF,EAAI,CAAC,KAAKc,IAAM4D,IAAM1D,IAAMuD,IAAMtD,IAAMqD,KAAOW,GAC/CjF,EAAI,CAAC,KAAKU,IAAMqE,IAAMpE,IAAMkE,IAAMhE,IAAM8D,KAAOM,GAC/CjF,EAAI,CAAC,KAAKO,IAAMsE,IAAMvE,IAAMyE,IAAMtE,IAAMkE,KAAOM,GAC/CjF,EAAI,EAAE,KAAKkB,IAAMuD,IAAMtD,IAAMoD,IAAMlD,IAAMgD,KAAOY,GAChDjF,EAAI,EAAE,KAAKe,IAAMwD,IAAMzD,IAAM2D,IAAMxD,IAAMoD,KAAOY,GAChDjF,EAAI,EAAE,KAAKW,IAAMiE,IAAMlE,IAAMoE,IAAMlE,IAAM+D,KAAOM,GAChDjF,EAAI,EAAE,KAAKM,IAAMwE,IAAMvE,IAAMqE,IAAMpE,IAAMmE,KAAOM,GAChDjF,EAAI,EAAE,KAAKmB,IAAMmD,IAAMpD,IAAMsD,IAAMpD,IAAMiD,KAAOY,GAChDjF,EAAI,EAAE,KAAKc,IAAM0D,IAAMzD,IAAMuD,IAAMtD,IAAMqD,KAAOY,GAEzCjF;AACT;AAGO,SAASkF,GACdlF,GACAmF,GACAC,GACAC,GACAC,GACAzD,GACAC,GACM;AACN,QAAMyD,IAAK,KAAKJ,IAAOC,IACjBI,IAAK,KAAKH,IAASC,IACnBtD,IAAK,KAAKH,IAAOC;AAEvB,SAAA9B,EAAI,CAAC,IAAI,KAAKuF,GACdvF,EAAI,CAAC,IAAI,GACTA,EAAI,CAAC,IAAI,GACTA,EAAI,CAAC,IAAI,GACTA,EAAI,CAAC,IAAI,GACTA,EAAI,CAAC,IAAI,KAAKwF,GACdxF,EAAI,CAAC,IAAI,GACTA,EAAI,CAAC,IAAI,GACTA,EAAI,CAAC,IAAI,GACTA,EAAI,CAAC,IAAI,GACTA,EAAI,EAAE,IAAI,IAAIgC,GACdhC,EAAI,EAAE,IAAI,GACVA,EAAI,EAAE,KAAKmF,IAAOC,KAASG,GAC3BvF,EAAI,EAAE,KAAKsF,IAAMD,KAAUG,GAC3BxF,EAAI,EAAE,KAAK8B,IAAMD,KAAQG,GACzBhC,EAAI,EAAE,IAAI,GAEHA;AACT;;;;;;;;;;;;;;;;;ACxVO,MAAMyF,EAAY;AAAA,EA8BvB,YAAYC,IAA8B,IAAI;AA5B9C;AAAA,IAAAC,EAAA,gBAAe,CAAC,GAAG,GAAG,CAAC;AAGvB;AAAA,IAAAA,EAAA,gBAAS;AACT,IAAAA,EAAA,eAAQ;AACR;AAAA,IAAAA,EAAA,aAAM,KAAK,KAAK;AAGhB;AAAA;AAAA,IAAAA,EAAA,aAAM,KAAK,KAAK;AAChB;AAAA,IAAAA,EAAA,gBAAS;AACT,IAAAA,EAAA,cAAO;AACP,IAAAA,EAAA,aAAM;AAGN;AAAA,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,gBAAS;AACT,IAAAA,EAAA,gBAAS,KAAK,KAAK;AAGX;AAAA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,eAAQ;AAGR;AAAA,IAAAA,EAAA,aAAY,CAAC,GAAG,GAAG,CAAC;AAG1B,SAAK,aAAaC,EAAK,GACvB,KAAK,aAAaA,EAAK,GACvB,KAAK,iBAAiBA,EAAK,GAEvBF,EAAQ,WAAQ,KAAK,SAAS,CAAC,GAAGA,EAAQ,MAAM,IAChDA,EAAQ,WAAW,WAAW,KAAK,SAASA,EAAQ,SACpDA,EAAQ,UAAU,WAAW,KAAK,QAAQA,EAAQ,QAClDA,EAAQ,QAAQ,WAAW,KAAK,MAAMA,EAAQ,MAC9CA,EAAQ,QAAQ,WAAW,KAAK,MAAMA,EAAQ,MAC9CA,EAAQ,SAAS,WAAW,KAAK,OAAOA,EAAQ,OAChDA,EAAQ,QAAQ,WAAW,KAAK,MAAMA,EAAQ,MAC9CA,EAAQ,cAAc,WAAW,KAAK,YAAYA,EAAQ,YAC1DA,EAAQ,cAAc,WAAW,KAAK,YAAYA,EAAQ,YAC1DA,EAAQ,WAAW,WAAW,KAAK,SAASA,EAAQ,SACpDA,EAAQ,WAAW,WAAW,KAAK,SAASA,EAAQ,SAExD,KAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU9D,GAAsB;AAC9B,IAAI,KAAK,WAAWA,MAClB,KAAK,SAASA,GACd,KAAK,QAAQ;AAAA,EAEjB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAOiE,GAAoBC,GAAwB;AACjD,SAAK,SAASD,GACd,KAAK,MAAM,KAAK,IAAI,KAAK,QAAQ,KAAK,IAAI,KAAK,QAAQ,KAAK,MAAMC,CAAQ,CAAC,GAC3E,KAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,KAAKC,GAAqB;AACxB,SAAK,SAAS,KAAK,IAAI,KAAK,WAAW,KAAK,IAAI,KAAK,WAAW,KAAK,SAASA,CAAK,CAAC,GACpF,KAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,WAAWC,GAAsB;AAC/B,SAAK,SAAS,KAAK,IAAI,KAAK,WAAW,KAAK,IAAI,KAAK,WAAW,KAAK,SAASA,CAAM,CAAC,GACrF,KAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,IAAIC,GAAgBC,GAAsB;AAExC,UAAMC,IAAW,KAAK,IAAI,KAAK,KAAK,GAI9BC,IAHW,KAAK,IAAI,KAAK,KAAK,GAI9BC,IAAS,CAACF,GAGVvD,IAAM;AAEZ,SAAK,OAAO,CAAC,KAAKwD,IAASH,GAC3B,KAAK,OAAO,CAAC,KAAKrD,IAAMsD,GACxB,KAAK,OAAO,CAAC,KAAKG,IAASJ,GAE3B,KAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,UAAUvC,GAAWC,GAAWC,GAAiB;AAC/C,SAAK,OAAO,CAAC,IAAIF,GACjB,KAAK,OAAO,CAAC,IAAIC,GACjB,KAAK,OAAO,CAAC,IAAIC,GACjB,KAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa0C,GAAeC,GAAaC,GAAsB;AAC7D,SAAK,QAAQF,GACb,KAAK,MAAM,KAAK,IAAI,KAAK,QAAQ,KAAK,IAAI,KAAK,QAAQC,CAAG,CAAC,GAC3D,KAAK,SAAS,KAAK,IAAI,KAAK,WAAW,KAAK,IAAI,KAAK,WAAWC,CAAM,CAAC,GACvE,KAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAuB;AAC7B,QAAI,CAAC,KAAK,MAAO;AAGjB,UAAMC,IAAS,KAAK,IAAI,KAAK,GAAG,GAC1BC,IAAS,KAAK,IAAI,KAAK,GAAG,GAC1BP,IAAW,KAAK,IAAI,KAAK,KAAK,GAC9BQ,IAAW,KAAK,IAAI,KAAK,KAAK;AAEpC,SAAK,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,KAAK,SAASF,IAASN,GACtD,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,KAAK,SAASO,GAC7C,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,KAAK,SAASD,IAASE,GAGtDC,GAAY,KAAK,YAAY,KAAK,KAAK,KAAK,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,GAG7DC,GAAiB,KAAK,YAAY,KAAK,KAAK,KAAK,QAAQ,KAAK,MAAM,KAAK,GAAG,GAG5EC,GAAc,KAAK,gBAAgB,KAAK,YAAY,KAAK,UAAU,GAEnE,KAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,gBAA2B;AACzB,gBAAK,eAAA,GACE,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAiC;AAC/B,gBAAK,eAAA,GACE,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,0BAAqC;AACnC,gBAAK,eAAA,GACE,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAuB;AACrB,gBAAK,eAAA,GACE,CAAC,GAAG,KAAK,GAAG;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,sBAA4B;AAC1B,SAAK,eAAA;AACL,UAAMC,IAAK,KAAK,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,GAChCC,IAAK,KAAK,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,GAChCC,IAAK,KAAK,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,GAChChE,IAAM,KAAK,KAAK8D,IAAKA,IAAKC,IAAKA,IAAKC,IAAKA,CAAE;AACjD,WAAO,CAACF,IAAK9D,GAAK+D,IAAK/D,GAAKgE,IAAKhE,CAAG;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,SAAS,CAAC,GAAG,GAAG,CAAC,GACtB,KAAK,SAAS,GACd,KAAK,QAAQ,GACb,KAAK,MAAM,KAAK,KAAK,GACrB,KAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,YACEiE,GAAcC,GAAcC,GAC5BC,GAAcC,GAAcC,GACtB;AAEN,SAAK,OAAO,CAAC,KAAKL,IAAOG,KAAQ,GACjC,KAAK,OAAO,CAAC,KAAKF,IAAOG,KAAQ,GACjC,KAAK,OAAO,CAAC,KAAKF,IAAOG,KAAQ;AAGjC,UAAMR,IAAKM,IAAOH,GACZF,IAAKM,IAAOH,GACZF,IAAKM,IAAOH,GACZI,IAAW,KAAK,KAAKT,IAAKA,IAAKC,IAAKA,IAAKC,IAAKA,CAAE;AAGtD,SAAK,SAASO,KAAY,IAAI,KAAK,IAAI,KAAK,MAAM,CAAC,IACnD,KAAK,SAAS,KAAK,IAAI,KAAK,WAAW,KAAK,IAAI,KAAK,WAAW,KAAK,MAAM,CAAC,GAE5E,KAAK,QAAQ;AAAA,EACf;AACF;ACrOO,MAAMC,EAAgB;AAAA,EA0C3B,YACEC,GACAC,GACAjC,IAAkC,CAAA,GAClC;AA7CM,IAAAC,EAAA;AACA,IAAAA,EAAA;AAGR;AAAA,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,kBAAW;AACX;AAAA,IAAAA,EAAA,sBAAe;AACf,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,sBAAe;AACf,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,uBAAgB;AAGR;AAAA,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,eAAQ;AACR,IAAAA,EAAA,eAAQ;AAGR;AAAA,IAAAA,EAAA,sCAA0C,IAAA;AAC1C,IAAAA,EAAA,2BAAoB;AAGpB;AAAA,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,wBAAiB;AAGjB;AAAA,IAAAA,EAAA;AAGA;AAAA,IAAAA,EAAA;AAaN,SAAK,SAAS+B,GACd,KAAK,UAAUC,GAEXjC,EAAQ,gBAAgB,WAAW,KAAK,cAAcA,EAAQ,cAC9DA,EAAQ,cAAc,WAAW,KAAK,YAAYA,EAAQ,YAC1DA,EAAQ,aAAa,WAAW,KAAK,WAAWA,EAAQ,WACxDA,EAAQ,iBAAiB,WAAW,KAAK,eAAeA,EAAQ,eAChEA,EAAQ,eAAe,WAAW,KAAK,aAAaA,EAAQ,aAC5DA,EAAQ,cAAc,WAAW,KAAK,YAAYA,EAAQ,YAC1DA,EAAQ,iBAAiB,WAAW,KAAK,eAAeA,EAAQ,eAChEA,EAAQ,cAAc,WAAW,KAAK,YAAYA,EAAQ,YAC1DA,EAAQ,kBAAkB,WAAW,KAAK,gBAAgBA,EAAQ,gBAEtE,KAAK,gBAAgB;AAAA,MACnB,eAAe,KAAK,cAAc,KAAK,IAAI;AAAA,MAC3C,eAAe,KAAK,cAAc,KAAK,IAAI;AAAA,MAC3C,aAAa,KAAK,YAAY,KAAK,IAAI;AAAA,MACvC,SAAS,KAAK,QAAQ,KAAK,IAAI;AAAA,MAC/B,eAAe,CAACkC,MAAaA,EAAE,eAAA;AAAA,IAAe,GAGhD,KAAK,OAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAe;AACrB,UAAM,EAAE,SAAAD,GAAS,eAAAE,EAAA,IAAkB;AAEnC,IAAAF,EAAQ,iBAAiB,eAAeE,EAAc,aAAa,GACnEF,EAAQ,iBAAiB,eAAeE,EAAc,aAAa,GACnEF,EAAQ,iBAAiB,aAAaE,EAAc,WAAW,GAC/DF,EAAQ,iBAAiB,iBAAiBE,EAAc,WAAW,GACnEF,EAAQ,iBAAiB,gBAAgBE,EAAc,WAAW,GAClEF,EAAQ,iBAAiB,SAASE,EAAc,SAAS,EAAE,SAAS,IAAO,GAC3EF,EAAQ,iBAAiB,eAAeE,EAAc,aAAa,GAEnEF,EAAQ,MAAM,cAAc;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,SAAe;AACb,UAAM,EAAE,SAAAA,GAAS,eAAAE,EAAA,IAAkB;AAEnC,IAAAF,EAAQ,oBAAoB,eAAeE,EAAc,aAAa,GACtEF,EAAQ,oBAAoB,eAAeE,EAAc,aAAa,GACtEF,EAAQ,oBAAoB,aAAaE,EAAc,WAAW,GAClEF,EAAQ,oBAAoB,iBAAiBE,EAAc,WAAW,GACtEF,EAAQ,oBAAoB,gBAAgBE,EAAc,WAAW,GACrEF,EAAQ,oBAAoB,SAASE,EAAc,OAAO,GAC1DF,EAAQ,oBAAoB,eAAeE,EAAc,aAAa;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKA,SAASC,GAA4B;AACnC,SAAK,mBAAmBA;AAAA,EAC1B;AAAA,EAEQ,eAAqB;AAC3B,IAAI,KAAK,oBACP,KAAK,iBAAA;AAAA,EAET;AAAA,EAEQ,cAAc,GAAuB;AAC3C,SAAK,QAAQ,kBAAkB,EAAE,SAAS,GAE1C,KAAK,SAAS,IAAI,EAAE,WAAW;AAAA,MAC7B,IAAI,EAAE;AAAA,MACN,GAAG,EAAE;AAAA,MACL,GAAG,EAAE;AAAA,MACL,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE;AAAA,IAAA,CACX,GAEG,KAAK,SAAS,SAAS,KAErB,EAAE,WAAW,KAAK,gBAAgB,KAAK,gBACzC,KAAK,aAAa,IAClB,KAAK,YAAY,MACR,EAAE,WAAW,KAAK,aAAa,KAAK,cAC7C,KAAK,YAAY,IACjB,KAAK,aAAa,KAGpB,KAAK,QAAQ,EAAE,SACf,KAAK,QAAQ,EAAE,WACN,KAAK,SAAS,SAAS,MAEhC,KAAK,aAAa,IAClB,KAAK,YAAY,IACjB,KAAK,oBAAoB,KAAK,iBAAA;AAAA,EAElC;AAAA,EAEQ,cAAc,GAAuB;AAC3C,UAAMC,IAAU,KAAK,SAAS,IAAI,EAAE,SAAS;AAC7C,QAAKA;AAKL,UAHAA,EAAQ,IAAI,EAAE,SACdA,EAAQ,IAAI,EAAE,SAEV,KAAK,SAAS,SAAS,GAAG;AAC5B,cAAM9B,IAAS,EAAE,UAAU,KAAK,OAC1BC,IAAS,EAAE,UAAU,KAAK;AAEhC,YAAI,KAAK,cAAc,KAAK;AAC1B,eAAK,OAAO;AAAA,YACV,CAACD,IAAS,KAAK;AAAA,YACfC,IAAS,KAAK;AAAA,UAAA,GAEhB,KAAK,gBAAgB,CAACD,IAAS,KAAK,aACpC,KAAK,cAAcC,IAAS,KAAK,aACjC,KAAK,aAAA;AAAA,iBACI,KAAK,aAAa,KAAK,WAAW;AAC3C,gBAAM8B,IAAW,KAAK,OAAO,SAAS,KAAK;AAE3C,eAAK,OAAO,IAAI,CAAC/B,IAAS+B,GAAU,CAAC9B,IAAS8B,CAAQ,GACtD,KAAK,aAAA;AAAA,QACP;AAEA,aAAK,QAAQ,EAAE,SACf,KAAK,QAAQ,EAAE;AAAA,MACjB,WAAW,KAAK,SAAS,SAAS,KAAK,KAAK,YAAY;AAEtD,cAAMC,IAAW,KAAK,iBAAA,GAChBlC,IAAQ,KAAK,oBAAoBkC;AAEvC,aAAK,OAAO,KAAKlC,IAAQ,KAAK,YAAY,KAAK,OAAO,MAAM,GAC5D,KAAK,oBAAoBkC,GACzB,KAAK,aAAA;AAAA,MACP;AAAA;AAAA,EACF;AAAA,EAEQ,YAAY,GAAuB;AAIzC,QAHA,KAAK,QAAQ,sBAAsB,EAAE,SAAS,GAC9C,KAAK,SAAS,OAAO,EAAE,SAAS,GAE5B,KAAK,SAAS,SAAS;AACzB,WAAK,aAAa,IAClB,KAAK,YAAY;AAAA,aACR,KAAK,SAAS,SAAS,GAAG;AAEnC,YAAMC,IAAY,KAAK,SAAS,OAAA,EAAS,OAAO;AAChD,MAAIA,MACF,KAAK,QAAQA,EAAU,GACvB,KAAK,QAAQA,EAAU;AAAA,IAE3B;AAAA,EACF;AAAA,EAEQ,QAAQ,GAAqB;AAGnC,QAFA,EAAE,eAAA,GAEE,CAAC,KAAK,WAAY;AAGtB,QAAInC,IAAQ,EAAE;AACd,IAAI,EAAE,cAAc,MAAGA,KAAS,KAC5B,EAAE,cAAc,MAAGA,KAAS;AAGhC,UAAMoC,IAAapC,IAAQ,KAAK,YAAY,KAAK,OAAO,SAAS;AACjE,SAAK,OAAO,KAAKoC,CAAU,GAC3B,KAAK,iBAAiBA,GACtB,KAAK,aAAA;AAAA,EACP;AAAA,EAEQ,mBAA2B;AACjC,QAAI,KAAK,SAAS,OAAO,EAAG,QAAO;AAEnC,UAAMC,IAAe,MAAM,KAAK,KAAK,SAAS,QAAQ,GAChDrB,IAAKqB,EAAa,CAAC,EAAE,IAAIA,EAAa,CAAC,EAAE,GACzCpB,IAAKoB,EAAa,CAAC,EAAE,IAAIA,EAAa,CAAC,EAAE;AAC/C,WAAO,KAAK,KAAKrB,IAAKA,IAAKC,IAAKA,CAAE;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAkB;AAEhB,QADI,KAAK,iBAAiB,KACtB,KAAK,cAAc,KAAK,UAAW,QAAO;AAE9C,UAAMqB,IAAY;AAClB,QAAIC,IAAS;AAEb,YAAI,KAAK,IAAI,KAAK,aAAa,IAAID,KAAa,KAAK,IAAI,KAAK,WAAW,IAAIA,OAC3E,KAAK,OAAO,OAAO,KAAK,eAAe,KAAK,WAAW,GACvD,KAAK,iBAAkB,IAAI,KAAK,eAChC,KAAK,eAAgB,IAAI,KAAK,eAC9BC,IAAS,KAGP,KAAK,IAAI,KAAK,cAAc,IAAID,MAClC,KAAK,OAAO,KAAK,KAAK,cAAc,GACpC,KAAK,kBAAmB,IAAI,KAAK,eACjCC,IAAS,KAGPA,KACF,KAAK,aAAA,GAGAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAqB;AACnB,SAAK,gBAAgB,GACrB,KAAK,cAAc,GACnB,KAAK,iBAAiB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,SAAK,OAAA,GACL,KAAK,SAAS,MAAA;AAAA,EAChB;AACF;AC1SO,MAAMC,KAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAgCdC,KAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA0BdC,KAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAiBnBC,KAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA+BrBC,KAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAwBrBC,KAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAgBZC,KAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAYZC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAqBfC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA0BfC,KAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAkBlBC,KAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAclBC,KAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAqBjBC,KAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAgCjBC,KAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAsCpBC,KAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAmBpBC,KAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAsBnBC,KAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAmBnBC,KAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA4BbC,KAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA+BbC,KAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAmBdC,KAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAqBdC,KAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA+BnBC,KAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACzdhC,SAASC,GACPC,GACAC,GACAC,GACa;AACb,QAAMC,IAASH,EAAG,aAAaE,CAAI;AACnC,MAAI,CAACC,EAAQ,OAAM,IAAI,MAAM,yBAAyB;AAKtD,MAHAH,EAAG,aAAaG,GAAQF,CAAM,GAC9BD,EAAG,cAAcG,CAAM,GAEnB,CAACH,EAAG,mBAAmBG,GAAQH,EAAG,cAAc,GAAG;AACrD,UAAMI,IAAQJ,EAAG,iBAAiBG,CAAM;AACxC,UAAAH,EAAG,aAAaG,CAAM,GAChB,IAAI,MAAM,6BAA6BC,CAAK,EAAE;AAAA,EACtD;AAEA,SAAOD;AACT;AAEA,SAASE,EACPL,GACAM,GACAC,GACAC,GACAC,GACiB;AACjB,QAAMC,IAAaX,GAAaC,GAAIM,GAAYN,EAAG,aAAa,GAC1DW,IAAaZ,GAAaC,GAAIO,GAAYP,EAAG,eAAe,GAE5DY,IAAUZ,EAAG,cAAA;AACnB,MAAI,CAACY,EAAS,OAAM,IAAI,MAAM,0BAA0B;AAMxD,MAJAZ,EAAG,aAAaY,GAASF,CAAU,GACnCV,EAAG,aAAaY,GAASD,CAAU,GACnCX,EAAG,YAAYY,CAAO,GAElB,CAACZ,EAAG,oBAAoBY,GAASZ,EAAG,WAAW,GAAG;AACpD,UAAMI,IAAQJ,EAAG,kBAAkBY,CAAO;AAC1C,UAAAZ,EAAG,cAAcY,CAAO,GAClB,IAAI,MAAM,uBAAuBR,CAAK,EAAE;AAAA,EAChD;AAEA,EAAAJ,EAAG,aAAaU,CAAU,GAC1BV,EAAG,aAAaW,CAAU;AAE1B,QAAME,IAAqC,CAAA;AAC3C,aAAWC,KAAQN;AACjB,IAAAK,EAAWC,CAAI,IAAId,EAAG,kBAAkBY,GAASE,CAAI;AAGvD,QAAMC,IAAwD,CAAA;AAC9D,aAAWD,KAAQL;AACjB,IAAAM,EAASD,CAAI,IAAId,EAAG,mBAAmBY,GAASE,CAAI;AAGtD,SAAO,EAAE,SAAAF,GAAS,YAAAC,GAAY,UAAAE,EAAA;AAChC;AAEO,SAASC,EACdhB,GACAiB,IAAoB,IACH;AACjB,QAAMC,IAAgB,CAAC,cAAc,iBAAiB,WAAW,SAAS,GACpEC,IAAiB,CAAC,oBAAoB,aAAa,cAAc,WAAW,GAE5Eb,IAAaW,IAAoBtC,KAAqBH,IAGtD4C,IAAgBf;AAAA,IACpBL;AAAA,IACAM;AAAA,IAJiBW,IAAoBrC,KAAqBH;AAAA,IAM1DyC;AAAA,IACAC;AAAA,EAAA,GAGIE,IAAoBhB;AAAA,IACxBL;AAAA,IACAM;AAAA,IACAW,IAAoBrC,KAAqBF;AAAA,IACzCwC;AAAA,IACA,CAAC,oBAAoB,WAAW;AAAA,EAAA,GAG5BI,IAAcjB;AAAA,IAClBL;AAAA,IACAnB;AAAA,IACAC;AAAA,IACA,CAAC,cAAc,SAAS;AAAA,IACxB,CAAC,kBAAkB;AAAA,EAAA,GAGfyC,IAAiBlB;AAAA,IACrBL;AAAA,IACAjB;AAAA,IACAC;AAAA,IACA,CAAC,cAAc,YAAY,SAAS;AAAA,IACpC,CAAC,oBAAoB,aAAa,cAAc,WAAW;AAAA,EAAA,GAGvDwC,IAAmBnB;AAAA,IACvBL;AAAA,IACAf;AAAA,IACAC;AAAA,IACA,CAAC,cAAc,SAAS;AAAA,IACxB,CAAC,oBAAoB,eAAe,WAAW;AAAA,EAAA,GAG3CuC,IAAmBpB;AAAA,IACvBL;AAAA,IACAb;AAAA,IACAC;AAAA,IACA,CAAC,cAAc,WAAW,UAAU;AAAA,IACpC,CAAC,oBAAoB,aAAa,eAAe,aAAa,cAAc,WAAW;AAAA,EAAA,GAGnFsC,IAAqBrB;AAAA,IACzBL;AAAA,IACAX;AAAA,IACAC;AAAA,IACA,CAAC,cAAc,YAAY,iBAAiB,eAAe,SAAS;AAAA,IACpE,CAAC,oBAAoB,aAAa,qBAAqB,cAAc,WAAW;AAAA,EAAA,GAG5EqC,IAAoBtB;AAAA,IACxBL;AAAA,IACAT;AAAA,IACAC;AAAA,IACA,CAAC,cAAc,WAAW,QAAQ;AAAA,IAClC,CAAC,oBAAoB,aAAa,gBAAgB,YAAY;AAAA,EAAA,GAG1DoC,IAAevB;AAAA,IACnBL;AAAA,IACAP;AAAA,IACAC;AAAA,IACA,CAAC,cAAc,iBAAiB,SAAS;AAAA,IACzC,CAAC,oBAAoB,aAAa,eAAe,eAAe,cAAc,WAAW;AAAA,EAAA,GAGrFmC,IAAgBxB;AAAA,IACpBL;AAAA,IACAL;AAAA,IACAC;AAAA,IACA,CAAC,cAAc,YAAY,SAAS;AAAA,IACpC,CAAC,oBAAoB,aAAa,cAAc,WAAW;AAAA,EAAA,GAGvDkC,IAAoBzB;AAAA,IACxBL;AAAA,IACAH;AAAA,IACAC;AAAA,IACA,CAAC,cAAc,iBAAiB,YAAY,SAAS;AAAA,IACrD,CAAC,oBAAoB,aAAa,cAAc,cAAc,cAAc,WAAW;AAAA,EAAA;AAGzF,SAAO;AAAA,IACL,eAAAsB;AAAA,IACA,mBAAAC;AAAA,IACA,aAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,eAAAC;AAAA,IACA,mBAAAC;AAAA,EAAA;AAEJ;AAEO,SAASC,EACd/B,GACAY,GACM;AACN,EAAAZ,EAAG,cAAcY,EAAQ,OAAO;AAClC;AAEO,SAASoB,EACdhC,GACAiC,GACM;AACN,EAAAF,EAAc/B,GAAIiC,EAAO,aAAa,GACtCF,EAAc/B,GAAIiC,EAAO,iBAAiB,GAC1CF,EAAc/B,GAAIiC,EAAO,WAAW,GACpCF,EAAc/B,GAAIiC,EAAO,cAAc,GACvCF,EAAc/B,GAAIiC,EAAO,gBAAgB,GACzCF,EAAc/B,GAAIiC,EAAO,gBAAgB,GACzCF,EAAc/B,GAAIiC,EAAO,kBAAkB,GAC3CF,EAAc/B,GAAIiC,EAAO,iBAAiB,GAC1CF,EAAc/B,GAAIiC,EAAO,YAAY,GACrCF,EAAc/B,GAAIiC,EAAO,aAAa,GACtCF,EAAc/B,GAAIiC,EAAO,iBAAiB;AAC5C;AClMA,MAAMC,IAAc;AAAA,EAClB,GAAG,CAAC,KAAK,KAAK,GAAG;AAAA;AAAA,EACjB,GAAG,CAAC,KAAK,KAAK,GAAG;AAAA;AAAA,EACjB,GAAG,CAAC,KAAK,KAAK,GAAG;AAAA;AAAA,EACjB,MAAM,CAAC,KAAK,MAAM,GAAG;AAAA;AAAA,EACrB,KAAK,CAAC,KAAK,MAAM,GAAG;AAAA;AACtB;AAEO,MAAMC,EAAO;AAAA,EAgClB,YAAYnC,GAA4BrE,GAAyB;AA/BzD,IAAAC,EAAA;AAGA;AAAA,IAAAA,EAAA,iBAAyC;AACzC,IAAAA,EAAA,4BAAyC;AACzC,IAAAA,EAAA,yBAAsC;AAEtC,IAAAA,EAAA,iBAAyC;AACzC,IAAAA,EAAA,4BAAyC;AACzC,IAAAA,EAAA,yBAAsC;AAEtC,IAAAA,EAAA,gBAAwC;AACxC,IAAAA,EAAA,2BAAwC;AACxC,IAAAA,EAAA,wBAAqC;AAGrC;AAAA,IAAAA,EAAA,qBAAmC;AACnC,IAAAA,EAAA,sBAAwD,CAAA;AAGxD;AAAA,IAAAA,EAAA,yBAAkB;AAClB,IAAAA,EAAA,yBAAkB;AAClB,IAAAA,EAAA,wBAAiB;AACjB,IAAAA,EAAA,gBAAmB,EAAE,MAAM,IAAI,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,MAAM,IAAI,MAAM,EAAA;AAG3E;AAAA,IAAAA,EAAA,gBAAwB,CAAA;AAGxB;AAAA,IAAAA,EAAA;AAGN,SAAK,KAAKoE,GAGV,KAAK,UAAU;AAAA,MACb,OAAO,EAAE,SAAS,IAAM,OAAO,KAAK,OAAOkC,EAAY,GAAG,GAAGvG,KAAA,gBAAAA,EAAS,MAAA;AAAA,MACtE,OAAO,EAAE,SAAS,IAAM,OAAO,KAAK,OAAOuG,EAAY,GAAG,GAAGvG,KAAA,gBAAAA,EAAS,MAAA;AAAA,MACtE,OAAO,EAAE,SAAS,IAAM,OAAO,KAAK,OAAOuG,EAAY,GAAG,GAAGvG,KAAA,gBAAAA,EAAS,MAAA;AAAA,MACtE,WAAUA,KAAA,gBAAAA,EAAS,aAAY;AAAA,MAC/B,gBAAeA,KAAA,gBAAAA,EAAS,kBAAiB;AAAA,MACzC,gBAAeA,KAAA,gBAAAA,EAAS,kBAAiB;AAAA,MACzC,YAAWA,KAAA,gBAAAA,EAAS,cAAauG,EAAY;AAAA,MAC7C,cAAavG,KAAA,gBAAAA,EAAS,gBAAe;AAAA,MACrC,kBAAiBA,KAAA,gBAAAA,EAAS,oBAAmB;AAAA,MAC7C,YAAWA,KAAA,gBAAAA,EAAS,cAAa;AAAA,MACjC,YAAWA,KAAA,gBAAAA,EAAS,cAAa;AAAA,MACjC,WAAUA,KAAA,gBAAAA,EAAS,aAAYuG,EAAY;AAAA,MAC3C,aAAYvG,KAAA,gBAAAA,EAAS,eAAc;AAAA,IAAA,GAGrC,KAAK,eAAA,GACL,KAAK,YAAA;AAAA,EACP;AAAA,EAEQ,iBAAuB;AAC7B,UAAM,EAAE,IAAAqE,MAAO,MAEToC,IAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAcrBC,IAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAcvBC,IAAetC,EAAG,aAAaA,EAAG,aAAa;AAIrD,QAHAA,EAAG,aAAasC,GAAcF,CAAkB,GAChDpC,EAAG,cAAcsC,CAAY,GAEzB,CAACtC,EAAG,mBAAmBsC,GAActC,EAAG,cAAc,GAAG;AAC3D,cAAQ,MAAM,6BAA6BA,EAAG,iBAAiBsC,CAAY,CAAC;AAC5E;AAAA,IACF;AAGA,UAAMC,IAAiBvC,EAAG,aAAaA,EAAG,eAAe;AAIzD,QAHAA,EAAG,aAAauC,GAAgBF,CAAoB,GACpDrC,EAAG,cAAcuC,CAAc,GAE3B,CAACvC,EAAG,mBAAmBuC,GAAgBvC,EAAG,cAAc,GAAG;AAC7D,cAAQ,MAAM,+BAA+BA,EAAG,iBAAiBuC,CAAc,CAAC;AAChF;AAAA,IACF;AAQA,QALA,KAAK,cAAcvC,EAAG,cAAA,GACtBA,EAAG,aAAa,KAAK,aAAasC,CAAY,GAC9CtC,EAAG,aAAa,KAAK,aAAauC,CAAc,GAChDvC,EAAG,YAAY,KAAK,WAAW,GAE3B,CAACA,EAAG,oBAAoB,KAAK,aAAaA,EAAG,WAAW,GAAG;AAC7D,cAAQ,MAAM,4BAA4BA,EAAG,kBAAkB,KAAK,WAAW,CAAC;AAChF;AAAA,IACF;AAGA,SAAK,eAAe;AAAA,MAClB,kBAAkBA,EAAG,mBAAmB,KAAK,aAAa,kBAAkB;AAAA,MAC5E,WAAWA,EAAG,mBAAmB,KAAK,aAAa,WAAW;AAAA,IAAA,GAIhEA,EAAG,aAAasC,CAAY,GAC5BtC,EAAG,aAAauC,CAAc;AAAA,EAChC;AAAA,EAEQ,cAAoB;AAC1B,UAAM,EAAE,IAAAvC,MAAO;AAGf,SAAK,UAAUA,EAAG,kBAAA,GAClB,KAAK,qBAAqBA,EAAG,aAAA,GAC7B,KAAK,kBAAkBA,EAAG,aAAA,GAG1B,KAAK,UAAUA,EAAG,kBAAA,GAClB,KAAK,qBAAqBA,EAAG,aAAA,GAC7B,KAAK,kBAAkBA,EAAG,aAAA,GAG1B,KAAK,SAASA,EAAG,kBAAA,GACjB,KAAK,oBAAoBA,EAAG,aAAA,GAC5B,KAAK,iBAAiBA,EAAG,aAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAawC,GAAwB;AACnC,SAAK,SAAS,EAAE,GAAGA,EAAA,GACnB,KAAK,iBAAA,GACL,KAAK,kBAAA,GACL,KAAK,kBAAA,GACL,KAAK,YAAA;AAAA,EACP;AAAA,EAEQ,mBAAyB;AAC/B,UAAM,EAAE,IAAAxC,GAAI,QAAAwC,GAAQ,SAAA7G,EAAA,IAAY,MAE1B,EAAE,MAAAwB,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,MAASgF,GAEzCC,IAAsB,CAAA,GACtBC,IAAmB,CAAA,GACnBC,IAAWhH,EAAQ,UAGnBiH,IAAU,CAACxJ,GAAYG,GAAYP,GAAYK,GAAYG,GAAYP,MAAe;AAC1F,MAAAwJ,EAAU,KAAKrJ,GAAIG,GAAIP,GAAIK,GAAIG,GAAIP,CAAE,GACrCyJ,EAAO,KAAK,GAAGC,GAAU,GAAGA,CAAQ;AAAA,IACtC;AAGA,IAAAC,EAAQzF,GAAMC,GAAMC,GAAMC,GAAMF,GAAMC,CAAI,GAC1CuF,EAAQtF,GAAMF,GAAMC,GAAMC,GAAMF,GAAMI,CAAI,GAC1CoF,EAAQtF,GAAMF,GAAMI,GAAML,GAAMC,GAAMI,CAAI,GAC1CoF,EAAQzF,GAAMC,GAAMI,GAAML,GAAMC,GAAMC,CAAI,GAG1CuF,EAAQzF,GAAMI,GAAMF,GAAMC,GAAMC,GAAMF,CAAI,GAC1CuF,EAAQtF,GAAMC,GAAMF,GAAMC,GAAMC,GAAMC,CAAI,GAC1CoF,EAAQtF,GAAMC,GAAMC,GAAML,GAAMI,GAAMC,CAAI,GAC1CoF,EAAQzF,GAAMI,GAAMC,GAAML,GAAMI,GAAMF,CAAI,GAG1CuF,EAAQzF,GAAMC,GAAMC,GAAMF,GAAMI,GAAMF,CAAI,GAC1CuF,EAAQtF,GAAMF,GAAMC,GAAMC,GAAMC,GAAMF,CAAI,GAC1CuF,EAAQtF,GAAMF,GAAMI,GAAMF,GAAMC,GAAMC,CAAI,GAC1CoF,EAAQzF,GAAMC,GAAMI,GAAML,GAAMI,GAAMC,CAAI,GAE1C,KAAK,iBAAiBiF,EAAU,SAAS,GAEzCzC,EAAG,WAAWA,EAAG,cAAc,KAAK,iBAAiB,GACrDA,EAAG,WAAWA,EAAG,cAAc,IAAI,aAAayC,CAAS,GAAGzC,EAAG,WAAW,GAE1EA,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,WAAWA,EAAG,cAAc,IAAI,aAAa0C,CAAM,GAAG1C,EAAG,WAAW;AAAA,EACzE;AAAA,EAEQ,oBAA0B;AAChC,UAAM,EAAE,IAAAA,GAAI,QAAAwC,GAAQ,SAAA7G,EAAA,IAAY,MAE1B,EAAE,MAAAwB,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,MAASgF,GACzCK,IAAYlH,EAAQ,WACpBmH,IAAYnH,EAAQ,WAEpB8G,IAAsB,CAAA,GACtBC,IAAmB,CAAA,GAGnBE,IAAU,CAACxJ,GAAYG,GAAYP,GAAYK,GAAYG,GAAYP,MAAe;AAC1F,MAAAwJ,EAAU,KAAKrJ,GAAIG,GAAIP,GAAIK,GAAIG,GAAIP,CAAE,GACrCyJ,EAAO,KAAK,GAAGG,GAAW,GAAGA,CAAS;AAAA,IACxC;AAGA,QAAIlH,EAAQ,eAAe;AAEzB,eAASoH,IAAI,GAAGA,KAAKD,GAAWC,KAAK;AACnC,cAAMpJ,IAAIwD,KAAQG,IAAOH,MAAS4F,IAAID;AACtC,QAAAF,EAAQjJ,GAAGyD,GAAMC,GAAM1D,GAAGyD,GAAMI,CAAI;AAAA,MACtC;AAEA,eAASuF,IAAI,GAAGA,KAAKD,GAAWC,KAAK;AACnC,cAAMlJ,IAAIwD,KAAQG,IAAOH,MAAS0F,IAAID;AACtC,QAAAF,EAAQzF,GAAMC,GAAMvD,GAAGyD,GAAMF,GAAMvD,CAAC;AAAA,MACtC;AAAA,IACF;AAGA,QAAI8B,EAAQ,eAAe;AAEzB,eAASoH,IAAI,GAAGA,KAAKD,GAAWC,KAAK;AACnC,cAAMpJ,IAAIwD,KAAQG,IAAOH,MAAS4F,IAAID;AACtC,QAAAF,EAAQjJ,GAAGyD,GAAMC,GAAM1D,GAAG4D,GAAMF,CAAI;AAAA,MACtC;AAEA,eAAS0F,IAAI,GAAGA,KAAKD,GAAWC,KAAK;AACnC,cAAMnJ,IAAIwD,KAAQG,IAAOH,MAAS2F,IAAID;AACtC,QAAAF,EAAQzF,GAAMvD,GAAGyD,GAAMC,GAAM1D,GAAGyD,CAAI;AAAA,MACtC;AAAA,IACF;AAGA,QAAI1B,EAAQ,eAAe;AAEzB,eAASoH,IAAI,GAAGA,KAAKD,GAAWC,KAAK;AACnC,cAAMnJ,IAAIwD,KAAQG,IAAOH,MAAS2F,IAAID;AACtC,QAAAF,EAAQzF,GAAMvD,GAAGyD,GAAMF,GAAMvD,GAAG4D,CAAI;AAAA,MACtC;AAEA,eAASuF,IAAI,GAAGA,KAAKD,GAAWC,KAAK;AACnC,cAAMlJ,IAAIwD,KAAQG,IAAOH,MAAS0F,IAAID;AACtC,QAAAF,EAAQzF,GAAMC,GAAMvD,GAAGsD,GAAMI,GAAM1D,CAAC;AAAA,MACtC;AAAA,IACF;AAEA,SAAK,kBAAkB4I,EAAU,SAAS,GAE1CzC,EAAG,WAAWA,EAAG,cAAc,KAAK,kBAAkB,GACtDA,EAAG,WAAWA,EAAG,cAAc,IAAI,aAAayC,CAAS,GAAGzC,EAAG,WAAW,GAE1EA,EAAG,WAAWA,EAAG,cAAc,KAAK,eAAe,GACnDA,EAAG,WAAWA,EAAG,cAAc,IAAI,aAAa0C,CAAM,GAAG1C,EAAG,WAAW;AAAA,EACzE;AAAA,EAEQ,oBAA0B;AAChC,UAAM,EAAE,IAAAA,GAAI,QAAAwC,GAAQ,SAAA7G,EAAA,IAAY,MAE1B,EAAE,MAAAwB,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,MAASgF,GACzCQ,KAAW1F,IAAOH,KAAQ,MAE1BsF,IAAsB,CAAA,GACtBC,IAAmB,CAAA,GAEnBE,IAAU,CAACxJ,GAAYG,GAAYP,GAAYK,GAAYG,GAAYP,GAAYgK,MAAoC;AAC3H,MAAAR,EAAU,KAAKrJ,GAAIG,GAAIP,GAAIK,GAAIG,GAAIP,CAAE,GACrCyJ,EAAO,KAAK,GAAGO,GAAO,GAAGA,CAAK;AAAA,IAChC;AAGA,QAAItH,EAAQ,MAAM,YAAY,IAAO;AACnC,YAAMuH,IAASvH,EAAQ,MAAM,SAASuG,EAAY;AAElD,MAAAU,EAAQzF,GAAMC,GAAMI,GAAMF,GAAMF,GAAMI,GAAM0F,CAAM;AAGlD,eAASH,IAAI,GAAGA,KAAKpH,EAAQ,WAAWoH,KAAK;AAC3C,cAAMpJ,IAAIwD,KAAQG,IAAOH,MAAS4F,IAAIpH,EAAQ;AAC9C,QAAAiH,EAAQjJ,GAAGyD,GAAMI,GAAM7D,GAAGyD,IAAO4F,GAASxF,GAAM0F,CAAM,GACtDN,EAAQjJ,GAAGyD,GAAMI,GAAM7D,GAAGyD,GAAMI,IAAOwF,GAASE,CAAM;AAAA,MACxD;AAAA,IACF;AAGA,QAAIvH,EAAQ,MAAM,YAAY,IAAO;AACnC,YAAMwH,IAASxH,EAAQ,MAAM,SAASuG,EAAY;AAElD,MAAAU,EAAQzF,GAAMC,GAAMI,GAAML,GAAMI,GAAMC,GAAM2F,CAAM;AAGlD,eAASJ,IAAI,GAAGA,KAAKpH,EAAQ,WAAWoH,KAAK;AAC3C,cAAMnJ,IAAIwD,KAAQG,IAAOH,MAAS2F,IAAIpH,EAAQ;AAC9C,QAAAiH,EAAQzF,GAAMvD,GAAG4D,GAAML,IAAO6F,GAASpJ,GAAG4D,GAAM2F,CAAM,GACtDP,EAAQzF,GAAMvD,GAAG4D,GAAML,GAAMvD,GAAG4D,IAAOwF,GAASG,CAAM;AAAA,MACxD;AAAA,IACF;AAGA,QAAIxH,EAAQ,MAAM,YAAY,IAAO;AACnC,YAAMyH,IAASzH,EAAQ,MAAM,SAASuG,EAAY;AAElD,MAAAU,EAAQzF,GAAMC,GAAMC,GAAMF,GAAMC,GAAMI,GAAM4F,CAAM;AAGlD,eAASL,IAAI,GAAGA,KAAKpH,EAAQ,WAAWoH,KAAK;AAC3C,cAAMlJ,IAAIwD,KAAQG,IAAOH,MAAS0F,IAAIpH,EAAQ;AAC9C,QAAAiH,EAAQzF,GAAMC,GAAMvD,GAAGsD,IAAO6F,GAAS5F,GAAMvD,GAAGuJ,CAAM,GACtDR,EAAQzF,GAAMC,GAAMvD,GAAGsD,GAAMC,IAAO4F,GAASnJ,GAAGuJ,CAAM;AAAA,MACxD;AAAA,IACF;AAEA,SAAK,kBAAkBX,EAAU,SAAS,GAE1CzC,EAAG,WAAWA,EAAG,cAAc,KAAK,kBAAkB,GACtDA,EAAG,WAAWA,EAAG,cAAc,IAAI,aAAayC,CAAS,GAAGzC,EAAG,WAAW,GAE1EA,EAAG,WAAWA,EAAG,cAAc,KAAK,eAAe,GACnDA,EAAG,WAAWA,EAAG,cAAc,IAAI,aAAa0C,CAAM,GAAG1C,EAAG,WAAW;AAAA,EACzE;AAAA,EAEQ,cAAoB;AAC1B,UAAM,EAAE,QAAAwC,GAAQ,SAAA7G,EAAA,IAAY,MACtB,EAAE,MAAAwB,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,MAASgF;AAE/C,SAAK,SAAS,CAAA;AAEd,UAAMa,IAAe,CAAC3J,MAChB,KAAK,IAAIA,CAAC,IAAI,QAASA,MAAM,KAC7B,KAAK,IAAIA,CAAC,KAAK,MAAcA,EAAE,cAAc,CAAC,IAC3CA,EAAE,QAAQ,CAAC,GAGd4J,KAAUhG,IAAOH,KAAQ;AAG/B,QAAIxB,EAAQ,MAAM,YAAY,IAAO;AACnC,YAAMuH,IAASvH,EAAQ,MAAM,SAASuG,EAAY,GAC5CqB,IAAY5H,EAAQ,MAAM,cAAc0H;AAE9C,eAASN,IAAI,GAAGA,KAAKpH,EAAQ,WAAWoH,KAAK;AAC3C,cAAMS,IAAIT,IAAIpH,EAAQ,WAChBhC,IAAIwD,KAAQG,IAAOH,KAAQqG,GAC3BC,IAAQtG,KAAQG,IAAOH,KAAQqG;AACrC,aAAK,OAAO,KAAK;AAAA,UACf,MAAMD,EAAUE,CAAK;AAAA,UACrB,eAAe,CAAC9J,GAAGyD,IAAOkG,GAAQ9F,IAAO8F,CAAM;AAAA,UAC/C,MAAM;AAAA,UACN,OAAOJ;AAAA,QAAA,CACR;AAAA,MACH;AAGA,MAAIvH,EAAQ,MAAM,SAChB,KAAK,OAAO,KAAK;AAAA,QACf,MAAMA,EAAQ,MAAM;AAAA,QACpB,eAAe,EAAEwB,IAAOG,KAAQ,GAAGF,IAAOkG,IAAS,KAAK9F,IAAO8F,CAAM;AAAA,QACrE,MAAM;AAAA,QACN,OAAOJ;AAAA,MAAA,CACR;AAAA,IAEL;AAGA,QAAIvH,EAAQ,MAAM,YAAY,IAAO;AACnC,YAAMwH,IAASxH,EAAQ,MAAM,SAASuG,EAAY,GAC5CqB,IAAY5H,EAAQ,MAAM,cAAc0H;AAE9C,eAASN,IAAI,GAAGA,KAAKpH,EAAQ,WAAWoH,KAAK;AAC3C,cAAMS,IAAIT,IAAIpH,EAAQ,WAChB/B,IAAIwD,KAAQG,IAAOH,KAAQoG,GAC3BC,IAAQrG,KAAQG,IAAOH,KAAQoG;AACrC,aAAK,OAAO,KAAK;AAAA,UACf,MAAMD,EAAUE,CAAK;AAAA,UACrB,eAAe,CAACtG,IAAOmG,GAAQ1J,GAAG4D,IAAO8F,CAAM;AAAA,UAC/C,MAAM;AAAA,UACN,OAAOH;AAAA,QAAA,CACR;AAAA,MACH;AAGA,MAAIxH,EAAQ,MAAM,SAChB,KAAK,OAAO,KAAK;AAAA,QACf,MAAMA,EAAQ,MAAM;AAAA,QACpB,eAAe,CAACwB,IAAOmG,IAAS,MAAMlG,IAAOG,KAAQ,GAAGC,IAAO8F,CAAM;AAAA,QACrE,MAAM;AAAA,QACN,OAAOH;AAAA,MAAA,CACR;AAAA,IAEL;AAGA,QAAIxH,EAAQ,MAAM,YAAY,IAAO;AACnC,YAAMyH,IAASzH,EAAQ,MAAM,SAASuG,EAAY,GAC5CqB,IAAY5H,EAAQ,MAAM,cAAc0H;AAE9C,eAASN,IAAI,GAAGA,KAAKpH,EAAQ,WAAWoH,KAAK;AAC3C,cAAMS,IAAIT,IAAIpH,EAAQ,WAChB9B,IAAIwD,KAAQG,IAAOH,KAAQmG,GAC3BC,IAAQpG,KAAQG,IAAOH,KAAQmG;AACrC,aAAK,OAAO,KAAK;AAAA,UACf,MAAMD,EAAUE,CAAK;AAAA,UACrB,eAAe,CAACtG,IAAOmG,GAAQlG,IAAOkG,GAAQzJ,CAAC;AAAA,UAC/C,MAAM;AAAA,UACN,OAAOuJ;AAAA,QAAA,CACR;AAAA,MACH;AAGA,MAAIzH,EAAQ,MAAM,SAChB,KAAK,OAAO,KAAK;AAAA,QACf,MAAMA,EAAQ,MAAM;AAAA,QACpB,eAAe,CAACwB,IAAOmG,IAAS,KAAKlG,IAAOkG,IAASjG,IAAOG,KAAQ,CAAC;AAAA,QACrE,MAAM;AAAA,QACN,OAAO4F;AAAA,MAAA,CACR;AAAA,IAEL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAOM,GAA0C;AAC/C,UAAM,EAAE,IAAA1D,GAAI,SAAArE,EAAA,IAAY;AAExB,IAAK,KAAK,gBAEVqE,EAAG,WAAW,KAAK,WAAW,GAC9BA,EAAG,iBAAiB,KAAK,aAAa,kBAAkB,IAAO0D,CAAoB,GAG/E,KAAK,iBAAiB,MACxB1D,EAAG,UAAU,KAAK,aAAa,WAAWrE,EAAQ,UAAU,GAC5D,KAAK,YAAY,KAAK,QAAS,KAAK,mBAAoB,KAAK,gBAAiB,KAAK,cAAc,IAI/F,KAAK,kBAAkB,MACzBqE,EAAG,UAAU,KAAK,aAAa,WAAWrE,EAAQ,WAAW,GAC7D,KAAK,YAAY,KAAK,SAAU,KAAK,oBAAqB,KAAK,iBAAkB,KAAK,eAAe,IAInGA,EAAQ,YAAY,KAAK,kBAAkB,MAC7CqE,EAAG,UAAU,KAAK,aAAa,WAAW,CAAG,GAC7C,KAAK,YAAY,KAAK,SAAU,KAAK,oBAAqB,KAAK,iBAAkB,KAAK,eAAe,IAIvGA,EAAG,WAAW,IAAI;AAAA,EACpB;AAAA,EAEQ,YAAY2D,GAA6BC,GAAwBC,GAA0BC,GAAqB;AACtH,UAAM,EAAE,IAAA9D,GAAI,aAAA+D,EAAA,IAAgB;AAE5B,QAAI,CAACA,EAAa;AAElB,IAAA/D,EAAG,gBAAgB2D,CAAG;AAGtB,UAAMK,IAAShE,EAAG,kBAAkB+D,GAAa,YAAY;AAC7D,IAAA/D,EAAG,WAAWA,EAAG,cAAc4D,CAAS,GACxC5D,EAAG,wBAAwBgE,CAAM,GACjChE,EAAG,oBAAoBgE,GAAQ,GAAGhE,EAAG,OAAO,IAAO,GAAG,CAAC,GACvDA,EAAG,oBAAoBgE,GAAQ,CAAC;AAGhC,UAAMC,IAAWjE,EAAG,kBAAkB+D,GAAa,SAAS;AAC5D,IAAA/D,EAAG,WAAWA,EAAG,cAAc6D,CAAW,GAC1C7D,EAAG,wBAAwBiE,CAAQ,GACnCjE,EAAG,oBAAoBiE,GAAU,GAAGjE,EAAG,OAAO,IAAO,GAAG,CAAC,GACzDA,EAAG,oBAAoBiE,GAAU,CAAC,GAGlCjE,EAAG,WAAWA,EAAG,OAAO,GAAG8D,CAAK,GAGhC9D,EAAG,yBAAyBgE,CAAM,GAClChE,EAAG,yBAAyBiE,CAAQ,GACpCjE,EAAG,gBAAgB,IAAI,GACvBA,EAAG,WAAWA,EAAG,cAAc,IAAI,GACnCA,EAAG,WAAWA,EAAG,sBAAsB,IAAI;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAA2B;AACzB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,gBACEkE,GACAR,GACAS,GACAC,GAC4C;AAE5C,UAAM,CAACC,GAAIC,GAAIC,CAAE,IAAIL,GACfM,IAAId,GAEJe,IAAQD,EAAE,CAAC,IAAIH,IAAKG,EAAE,CAAC,IAAIF,IAAKE,EAAE,CAAC,IAAID,IAAKC,EAAE,EAAE,GAChDE,IAAQF,EAAE,CAAC,IAAIH,IAAKG,EAAE,CAAC,IAAIF,IAAKE,EAAE,CAAC,IAAID,IAAKC,EAAE,EAAE,GAChDG,IAAQH,EAAE,CAAC,IAAIH,IAAKG,EAAE,CAAC,IAAIF,IAAKE,EAAE,EAAE,IAAID,IAAKC,EAAE,EAAE,GACjDI,IAAQJ,EAAE,CAAC,IAAIH,IAAKG,EAAE,CAAC,IAAIF,IAAKE,EAAE,EAAE,IAAID,IAAKC,EAAE,EAAE;AAGvD,QAAII,KAAS,EAAG,QAAO,EAAE,GAAG,GAAG,GAAG,GAAG,SAAS,GAAA;AAE9C,UAAMC,IAAOJ,IAAQG,GACfE,IAAOJ,IAAQE,GACfG,IAAOJ,IAAQC,GAGfI,IAAUD,KAAQ,MAAMA,KAAQ,KACvBF,KAAQ,QAAQA,KAAQ,OACxBC,KAAQ,QAAQA,KAAQ,KAGjCG,KAAWJ,IAAO,KAAK,MAAMV,GAC7Be,KAAW,IAAIJ,KAAQ,MAAMV;AAEnC,WAAO,EAAE,GAAGa,GAAS,GAAGC,GAAS,SAAAF,EAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAWrJ,GAAuC;AAChD,WAAO,OAAO,KAAK,SAASA,CAAO,GACnC,KAAK,iBAAA,GACL,KAAK,kBAAA,GACL,KAAK,kBAAA,GACL,KAAK,YAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,UAAM,EAAE,IAAAqE,MAAO;AAEf,IAAI,KAAK,WAASA,EAAG,kBAAkB,KAAK,OAAO,GAC/C,KAAK,sBAAoBA,EAAG,aAAa,KAAK,kBAAkB,GAChE,KAAK,mBAAiBA,EAAG,aAAa,KAAK,eAAe,GAE1D,KAAK,WAASA,EAAG,kBAAkB,KAAK,OAAO,GAC/C,KAAK,sBAAoBA,EAAG,aAAa,KAAK,kBAAkB,GAChE,KAAK,mBAAiBA,EAAG,aAAa,KAAK,eAAe,GAE1D,KAAK,UAAQA,EAAG,kBAAkB,KAAK,MAAM,GAC7C,KAAK,qBAAmBA,EAAG,aAAa,KAAK,iBAAiB,GAC9D,KAAK,kBAAgBA,EAAG,aAAa,KAAK,cAAc,GAExD,KAAK,eAAaA,EAAG,cAAc,KAAK,WAAW;AAAA,EACzD;AACF;ACvlBO,MAAMmF,EAAU;AAAA,EAMrB,YAAYC,GAAwBzJ,IAA4B,IAAI;AAL5D,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,iBAAU;AAGhB,SAAK,YAAYwJ,GACjB,KAAK,UAAU;AAAA,MACb,WAAWzJ,EAAQ,aAAa;AAAA,MAChC,SAASA,EAAQ,WAAW;AAAA,MAC5B,SAASA,EAAQ,WAAW;AAAA,MAC5B,cAAcA,EAAQ,gBAAgB;AAAA,MACtC,WAAWA,EAAQ,aAAa;AAAA,MAChC,WAAWA,EAAQ,aAAa;AAAA,MAChC,UAAUA,EAAQ,YAAY;AAAA,MAC9B,WAAWA,EAAQ;AAAA,IAAA,GAIrB,KAAK,UAAU,SAAS,cAAc,KAAK,GAC3C,KAAK,QAAQ,YAAY,KAAK,QAAQ,WACtC,KAAK,QAAQ,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAkB7B,SAAS,KAAK,YAAY,KAAK,OAAO;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK0J,GAAqBJ,GAAiBC,GAAuB;AAChE,UAAMI,IAAU,KAAK,QAAQ,YACzB,KAAK,QAAQ,UAAUD,CAAI,IAC3B,KAAK,cAAcA,CAAI;AAE3B,SAAK,QAAQ,YAAYC,GACzB,KAAK,UAAU;AAGf,UAAMC,IAAgB,KAAK,UAAU,sBAAA,GAC/B5L,IAAI4L,EAAc,OAAON,IAAU,KAAK,QAAQ,SAChDrL,IAAI2L,EAAc,MAAML,IAAU,KAAK,QAAQ,SAG/CM,IAAc,KAAK,QAAQ,sBAAA,GAC3BC,IAAgB,OAAO,YACvBC,IAAiB,OAAO;AAE9B,QAAIC,IAAShM,GACTiM,IAAShM;AAEb,IAAID,IAAI6L,EAAY,QAAQC,IAAgB,OAC1CE,IAAShM,IAAI6L,EAAY,QAAQ,KAAK,QAAQ,UAAU,IAEtD5L,IAAI4L,EAAY,SAASE,IAAiB,OAC5CE,IAAShM,IAAI4L,EAAY,SAAS,KAAK,QAAQ,UAAU,IAG3D,KAAK,QAAQ,MAAM,OAAO,GAAGG,CAAM,MACnC,KAAK,QAAQ,MAAM,MAAM,GAAGC,CAAM,MAClC,KAAK,QAAQ,MAAM,UAAU;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAa;AACX,SAAK,UAAU,IACf,KAAK,QAAQ,MAAM,UAAU;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,YAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAcP,GAA6B;AACjD,UAAMQ,IAAkB,CAAA,GAClBC,IAAI,KAAK,QAAQ;AAiBvB,QAfI,KAAK,QAAQ,aACfD,EAAM,KAAK,iBAAiBR,EAAK,KAAK,WAAW,GAG/C,KAAK,QAAQ,iBACfQ,EAAM,KAAK,MAAMR,EAAK,SAAS,CAAC,EAAE,QAAQS,CAAC,CAAC,EAAE,GAC9CD,EAAM,KAAK,MAAMR,EAAK,SAAS,CAAC,EAAE,QAAQS,CAAC,CAAC,EAAE,GAC9CD,EAAM,KAAK,MAAMR,EAAK,SAAS,CAAC,EAAE,QAAQS,CAAC,CAAC,EAAE,IAG5C,KAAK,QAAQ,aAAaT,EAAK,UAAU,UAC3CQ,EAAM,KAAK,SAASR,EAAK,MAAM,QAAQS,CAAC,CAAC,EAAE,GAIzCT,EAAK,OAAO;AACd,YAAMU,IAAI,KAAK,MAAMV,EAAK,MAAM,CAAC,IAAI,GAAG,GAClCW,IAAI,KAAK,MAAMX,EAAK,MAAM,CAAC,IAAI,GAAG,GAClC/O,IAAI,KAAK,MAAM+O,EAAK,MAAM,CAAC,IAAI,GAAG;AACxC,MAAAQ,EAAM,KAAK,2EAA2EE,CAAC,IAAIC,CAAC,IAAI1P,CAAC,0EAA0EyP,CAAC,KAAKC,CAAC,KAAK1P,CAAC,GAAG;AAAA,IAC7L;AAGA,QAAI+O,EAAK;AACP,iBAAW,CAACY,GAAKxC,CAAK,KAAK,OAAO,QAAQ4B,EAAK,UAAU;AACvD,QAAAQ,EAAM,KAAK,GAAGI,CAAG,KAAKxC,CAAK,EAAE;AAIjC,WAAOoC,EAAM,KAAK,MAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,eAAeZ,GAAiBC,GAAuB;AACrD,QAAI,CAAC,KAAK,QAAS;AAEnB,UAAMK,IAAgB,KAAK,UAAU,sBAAA,GAC/B5L,IAAI4L,EAAc,OAAON,IAAU,KAAK,QAAQ,SAChDrL,IAAI2L,EAAc,MAAML,IAAU,KAAK,QAAQ;AAErD,SAAK,QAAQ,MAAM,OAAO,GAAGvL,CAAC,MAC9B,KAAK,QAAQ,MAAM,MAAM,GAAGC,CAAC;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,SAAK,QAAQ,OAAA;AAAA,EACf;AACF;AAMO,SAASsM,GACdC,GACAC,GACAzK,IAGI,CAAA,GACyB;AAC7B,MAAI0K,IAAe,IACfC,IAA+B;AACnC,QAAMC,IAAa5K,EAAQ,cAAc;AAEzC,SAAO,CAAC6K,MAAsB;AAC5B,IAAIF,MAAkB,QACpB,aAAaA,CAAa,GAG5BA,IAAgB,OAAO,WAAW,MAAM;ANtM5C,UAAAG,GAAAC;AMuMM,YAAMC,IAAQH,EAAM,OAAuB,sBAAA,GACrC7M,IAAI6M,EAAM,UAAUG,EAAK,MACzB/M,IAAI4M,EAAM,UAAUG,EAAK,KAEzBC,IAAMT,EAAS,aAAaxM,GAAGC,CAAC;AAEtC,UAAIgN;AACF,YAAIA,EAAI,UAAUP,GAAc;AAC9B,UAAAA,IAAeO,EAAI;AAEnB,gBAAMC,IAAaV,EAAS,cAAcS,EAAI,KAAK;AACnD,UAAIC,MACFT,EAAQ,KAAK;AAAA,YACX,OAAOQ,EAAI;AAAA,YACX,UAAUC,EAAW;AAAA,YACrB,OAAOA,EAAW;AAAA,YAClB,OAAOA,EAAW;AAAA,UAAA,GACjBlN,GAAGC,CAAC,IAEP6M,IAAA9K,EAAQ,YAAR,QAAA8K,EAAA,KAAA9K,GAAkB;AAAA,YAChB,OAAOiL,EAAI;AAAA,YACX,MAAMC;AAAA,UAAA;AAAA,QAGZ;AACE,UAAAT,EAAQ,eAAezM,GAAGC,CAAC;AAAA;AAG7B,QAAIyM,MAAiB,OACnBD,EAAQ,KAAA,GACRC,IAAe,KACfK,IAAA/K,EAAQ,YAAR,QAAA+K,EAAA,KAAA/K,GAAkB;AAItB,MAAA2K,IAAgB;AAAA,IAClB,GAAGC,CAAU;AAAA,EACf;AACF;AC9OO,SAASvQ,GAAO2D,IAAI,GAAGC,IAAI,GAAGC,IAAI,GAAS;AAChD,SAAO,CAACF,GAAGC,GAAGC,CAAC;AACjB;AAGO,SAASiN,GAAM1Q,GAAe;AACnC,SAAO,CAACA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AAC1B;AAGO,SAASD,GAAKF,GAAWG,GAAe;AAC7C,SAAAH,EAAI,CAAC,IAAIG,EAAE,CAAC,GACZH,EAAI,CAAC,IAAIG,EAAE,CAAC,GACZH,EAAI,CAAC,IAAIG,EAAE,CAAC,GACLH;AACT;AAGO,SAAS8Q,GAAI9Q,GAAW0D,GAAWC,GAAWC,GAAiB;AACpE,SAAA5D,EAAI,CAAC,IAAI0D,GACT1D,EAAI,CAAC,IAAI2D,GACT3D,EAAI,CAAC,IAAI4D,GACF5D;AACT;AAGO,SAAS+Q,GAAI/Q,GAAWG,GAASE,GAAe;AACrD,SAAAL,EAAI,CAAC,IAAIG,EAAE,CAAC,IAAIE,EAAE,CAAC,GACnBL,EAAI,CAAC,IAAIG,EAAE,CAAC,IAAIE,EAAE,CAAC,GACnBL,EAAI,CAAC,IAAIG,EAAE,CAAC,IAAIE,EAAE,CAAC,GACZL;AACT;AAGO,SAASgR,GAAShR,GAAWG,GAASE,GAAe;AAC1D,SAAAL,EAAI,CAAC,IAAIG,EAAE,CAAC,IAAIE,EAAE,CAAC,GACnBL,EAAI,CAAC,IAAIG,EAAE,CAAC,IAAIE,EAAE,CAAC,GACnBL,EAAI,CAAC,IAAIG,EAAE,CAAC,IAAIE,EAAE,CAAC,GACZL;AACT;AAGO,SAAS6D,GAAM7D,GAAWG,GAAS6D,GAAiB;AACzD,SAAAhE,EAAI,CAAC,IAAIG,EAAE,CAAC,IAAI6D,GAChBhE,EAAI,CAAC,IAAIG,EAAE,CAAC,IAAI6D,GAChBhE,EAAI,CAAC,IAAIG,EAAE,CAAC,IAAI6D,GACThE;AACT;AAGO,SAASiR,GAAUjR,GAAWG,GAAe;AAClD,QAAMuD,IAAIvD,EAAE,CAAC,GAAGwD,IAAIxD,EAAE,CAAC,GAAGyD,IAAIzD,EAAE,CAAC;AACjC,MAAI8C,IAAMS,IAAIA,IAAIC,IAAIA,IAAIC,IAAIA;AAC9B,SAAIX,IAAM,MACRA,IAAM,IAAI,KAAK,KAAKA,CAAG,IAEzBjD,EAAI,CAAC,IAAI0D,IAAIT,GACbjD,EAAI,CAAC,IAAI2D,IAAIV,GACbjD,EAAI,CAAC,IAAI4D,IAAIX,GACNjD;AACT;AAGO,SAASkR,GAAI/Q,GAASE,GAAiB;AAC5C,SAAOF,EAAE,CAAC,IAAIE,EAAE,CAAC,IAAIF,EAAE,CAAC,IAAIE,EAAE,CAAC,IAAIF,EAAE,CAAC,IAAIE,EAAE,CAAC;AAC/C;AAGO,SAAS8Q,GAAMnR,GAAWG,GAASE,GAAe;AACvD,QAAM+Q,IAAKjR,EAAE,CAAC,GAAGkR,IAAKlR,EAAE,CAAC,GAAGmR,IAAKnR,EAAE,CAAC,GAC9BoR,IAAKlR,EAAE,CAAC,GAAGmR,IAAKnR,EAAE,CAAC,GAAGoR,IAAKpR,EAAE,CAAC;AACpC,SAAAL,EAAI,CAAC,IAAIqR,IAAKI,IAAKH,IAAKE,GACxBxR,EAAI,CAAC,IAAIsR,IAAKC,IAAKH,IAAKK,GACxBzR,EAAI,CAAC,IAAIoR,IAAKI,IAAKH,IAAKE,GACjBvR;AACT;AAGO,SAAS0R,GAAOvR,GAAiB;AACtC,SAAO,KAAK,KAAKA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,CAAC;AAC1D;AAGO,SAASwR,GAAcxR,GAAiB;AAC7C,SAAOA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC;AAC/C;AAGO,SAAS8H,GAAS9H,GAASE,GAAiB;AACjD,QAAM0G,IAAK1G,EAAE,CAAC,IAAIF,EAAE,CAAC,GACf6G,IAAK3G,EAAE,CAAC,IAAIF,EAAE,CAAC,GACf8G,IAAK5G,EAAE,CAAC,IAAIF,EAAE,CAAC;AACrB,SAAO,KAAK,KAAK4G,IAAKA,IAAKC,IAAKA,IAAKC,IAAKA,CAAE;AAC9C;AAGO,SAAS2K,GAAK5R,GAAWG,GAASE,GAASkN,GAAiB;AACjE,SAAAvN,EAAI,CAAC,IAAIG,EAAE,CAAC,IAAIoN,KAAKlN,EAAE,CAAC,IAAIF,EAAE,CAAC,IAC/BH,EAAI,CAAC,IAAIG,EAAE,CAAC,IAAIoN,KAAKlN,EAAE,CAAC,IAAIF,EAAE,CAAC,IAC/BH,EAAI,CAAC,IAAIG,EAAE,CAAC,IAAIoN,KAAKlN,EAAE,CAAC,IAAIF,EAAE,CAAC,IACxBH;AACT;AAGO,SAAS6R,GAAO7R,GAAWG,GAAe;AAC/C,SAAAH,EAAI,CAAC,IAAI,CAACG,EAAE,CAAC,GACbH,EAAI,CAAC,IAAI,CAACG,EAAE,CAAC,GACbH,EAAI,CAAC,IAAI,CAACG,EAAE,CAAC,GACNH;AACT;AAGO,SAAS8R,GAAc9R,GAAWG,GAASoO,GAAuB;AACvE,QAAM7K,IAAIvD,EAAE,CAAC,GAAGwD,IAAIxD,EAAE,CAAC,GAAGyD,IAAIzD,EAAE,CAAC,GAC3B4R,IAAIxD,EAAE,CAAC,IAAI7K,IAAI6K,EAAE,CAAC,IAAI5K,IAAI4K,EAAE,EAAE,IAAI3K,IAAI2K,EAAE,EAAE,KAAK;AACrD,SAAAvO,EAAI,CAAC,KAAKuO,EAAE,CAAC,IAAI7K,IAAI6K,EAAE,CAAC,IAAI5K,IAAI4K,EAAE,CAAC,IAAI3K,IAAI2K,EAAE,EAAE,KAAKwD,GACpD/R,EAAI,CAAC,KAAKuO,EAAE,CAAC,IAAI7K,IAAI6K,EAAE,CAAC,IAAI5K,IAAI4K,EAAE,CAAC,IAAI3K,IAAI2K,EAAE,EAAE,KAAKwD,GACpD/R,EAAI,CAAC,KAAKuO,EAAE,CAAC,IAAI7K,IAAI6K,EAAE,CAAC,IAAI5K,IAAI4K,EAAE,EAAE,IAAI3K,IAAI2K,EAAE,EAAE,KAAKwD,GAC9C/R;AACT;;;;;;;;;;;;;;;;;;;;ACpGO,SAASgS,EACdhD,GACAC,GACAf,GACAC,GACAV,GACO;AAEP,QAAMmB,IAAQI,IAAUd,IAAe,IAAI,GACrCW,IAAO,EAAGI,IAAUd,IAAgB,IAAI,IAGxC8D,IAAcrM,EAAK;AACzBsM,EAAAA,GAAYD,GAAaxE,CAAoB;AAG7C,QAAM0E,IAAY,CAACvD,GAAMC,GAAM,IAAI,CAAC,GAC9BuD,IAAW,CAACxD,GAAMC,GAAM,GAAG,CAAC,GAG5BwD,IAAYC,GAAgBL,GAAaE,CAAS,GAClDI,IAAWD,GAAgBL,GAAaG,CAAQ,GAGhDI,IAAmC;AAAA,IACvCH,EAAU,CAAC,IAAIA,EAAU,CAAC;AAAA,IAC1BA,EAAU,CAAC,IAAIA,EAAU,CAAC;AAAA,IAC1BA,EAAU,CAAC,IAAIA,EAAU,CAAC;AAAA,EAAA,GAGtBvQ,IAAgC;AAAA,IACpCyQ,EAAS,CAAC,IAAIA,EAAS,CAAC;AAAA,IACxBA,EAAS,CAAC,IAAIA,EAAS,CAAC;AAAA,IACxBA,EAAS,CAAC,IAAIA,EAAS,CAAC;AAAA,EAAA,GAIpBE,IAAsC;AAAA,IAC1C3Q,EAAI,CAAC,IAAI0Q,EAAO,CAAC;AAAA,IACjB1Q,EAAI,CAAC,IAAI0Q,EAAO,CAAC;AAAA,IACjB1Q,EAAI,CAAC,IAAI0Q,EAAO,CAAC;AAAA,EAAA,GAGbvP,IAAM,KAAK;AAAA,IACfwP,EAAU,CAAC,IAAIA,EAAU,CAAC,IAC1BA,EAAU,CAAC,IAAIA,EAAU,CAAC,IAC1BA,EAAU,CAAC,IAAIA,EAAU,CAAC;AAAA,EAAA;AAG5B,SAAAA,EAAU,CAAC,KAAKxP,GAChBwP,EAAU,CAAC,KAAKxP,GAChBwP,EAAU,CAAC,KAAKxP,GAET,EAAE,QAAAuP,GAAQ,WAAAC,EAAA;AACnB;AAKA,SAASH,GACP/D,GACAmE,GACkC;AAClC,SAAO;AAAA,IACLnE,EAAE,CAAC,IAAImE,EAAE,CAAC,IAAInE,EAAE,CAAC,IAAImE,EAAE,CAAC,IAAInE,EAAE,CAAC,IAAImE,EAAE,CAAC,IAAInE,EAAE,EAAE,IAAImE,EAAE,CAAC;AAAA,IACrDnE,EAAE,CAAC,IAAImE,EAAE,CAAC,IAAInE,EAAE,CAAC,IAAImE,EAAE,CAAC,IAAInE,EAAE,CAAC,IAAImE,EAAE,CAAC,IAAInE,EAAE,EAAE,IAAImE,EAAE,CAAC;AAAA,IACrDnE,EAAE,CAAC,IAAImE,EAAE,CAAC,IAAInE,EAAE,CAAC,IAAImE,EAAE,CAAC,IAAInE,EAAE,EAAE,IAAImE,EAAE,CAAC,IAAInE,EAAE,EAAE,IAAImE,EAAE,CAAC;AAAA,IACtDnE,EAAE,CAAC,IAAImE,EAAE,CAAC,IAAInE,EAAE,CAAC,IAAImE,EAAE,CAAC,IAAInE,EAAE,EAAE,IAAImE,EAAE,CAAC,IAAInE,EAAE,EAAE,IAAImE,EAAE,CAAC;AAAA,EAAA;AAE1D;AASO,SAASC,GACdC,GACAzQ,GACAqE,GACe;AAEf,QAAMqM,IAA+B;AAAA,IACnCD,EAAI,OAAO,CAAC,IAAIzQ,EAAO,CAAC;AAAA,IACxByQ,EAAI,OAAO,CAAC,IAAIzQ,EAAO,CAAC;AAAA,IACxByQ,EAAI,OAAO,CAAC,IAAIzQ,EAAO,CAAC;AAAA,EAAA,GAKpBhC,IAAI,GACJE,IAAI,KACRwS,EAAG,CAAC,IAAID,EAAI,UAAU,CAAC,IACvBC,EAAG,CAAC,IAAID,EAAI,UAAU,CAAC,IACvBC,EAAG,CAAC,IAAID,EAAI,UAAU,CAAC,IAEnB3O,IACJ4O,EAAG,CAAC,IAAIA,EAAG,CAAC,IACZA,EAAG,CAAC,IAAIA,EAAG,CAAC,IACZA,EAAG,CAAC,IAAIA,EAAG,CAAC,IACVrM,IAASA,GAEPsM,IAAezS,IAAIA,IAAI,IAAIF,IAAI8D;AAErC,MAAI6O,IAAe;AACjB,WAAO;AAIT,QAAMC,IAAQ,KAAK,KAAKD,CAAY,GAC9BE,KAAM,CAAC3S,IAAI0S,MAAU,IAAI5S,IACzB8S,KAAM,CAAC5S,IAAI0S,MAAU,IAAI5S;AAE/B,SAAI6S,IAAK,IAAUA,IACfC,IAAK,IAAUA,IAEZ;AACT;AAUO,SAASC,EACdN,GACApG,GACA2G,GACAC,IAAa,GACK;AAClB,QAAMvF,IAAQsF,EAAO;AACrB,MAAIE,IAA+B;AAEnC,WAASvG,IAAI,GAAGA,IAAIe,GAAOf,KAAK;AAC9B,UAAM3K,IAAmC;AAAA,MACvCqK,EAAUM,IAAI,CAAC;AAAA,MACfN,EAAUM,IAAI,IAAI,CAAC;AAAA,MACnBN,EAAUM,IAAI,IAAI,CAAC;AAAA,IAAA,GAEftG,IAAS2M,EAAOrG,CAAC,IAAIsG,GAErBnL,IAAW0K,GAAsBC,GAAKzQ,GAAQqE,CAAM;AAE1D,QAAIyB,MAAa,SACXoL,MAAe,QAAQpL,IAAWoL,EAAW,WAAU;AAEzD,YAAMC,IAAkC;AAAA,QACtCV,EAAI,OAAO,CAAC,IAAIA,EAAI,UAAU,CAAC,IAAI3K;AAAA,QACnC2K,EAAI,OAAO,CAAC,IAAIA,EAAI,UAAU,CAAC,IAAI3K;AAAA,QACnC2K,EAAI,OAAO,CAAC,IAAIA,EAAI,UAAU,CAAC,IAAI3K;AAAA,MAAA;AAGrC,MAAAoL,IAAa;AAAA,QACX,OAAOvG;AAAA,QACP,UAAA7E;AAAA,QACA,OAAAqL;AAAA,MAAA;AAAA,IAEJ;AAAA,EAEJ;AAEA,SAAOD;AACT;AAMO,SAASE,GACdX,GACApG,GACA2G,GACAC,IAAa,GACbI,IAAa,IACA;AACb,QAAM3F,IAAQsF,EAAO,QACfM,IAAoB,CAAA;AAE1B,WAAS3G,IAAI,GAAGA,IAAIe,GAAOf,KAAK;AAC9B,UAAM3K,IAAmC;AAAA,MACvCqK,EAAUM,IAAI,CAAC;AAAA,MACfN,EAAUM,IAAI,IAAI,CAAC;AAAA,MACnBN,EAAUM,IAAI,IAAI,CAAC;AAAA,IAAA,GAEftG,IAAS2M,EAAOrG,CAAC,IAAIsG,GAErBnL,IAAW0K,GAAsBC,GAAKzQ,GAAQqE,CAAM;AAE1D,QAAIyB,MAAa,MAAM;AACrB,YAAMqL,IAAkC;AAAA,QACtCV,EAAI,OAAO,CAAC,IAAIA,EAAI,UAAU,CAAC,IAAI3K;AAAA,QACnC2K,EAAI,OAAO,CAAC,IAAIA,EAAI,UAAU,CAAC,IAAI3K;AAAA,QACnC2K,EAAI,OAAO,CAAC,IAAIA,EAAI,UAAU,CAAC,IAAI3K;AAAA,MAAA;AAKrC,UAFAwL,EAAK,KAAK,EAAE,OAAO3G,GAAG,UAAA7E,GAAU,OAAAqL,GAAO,GAEnCG,EAAK,UAAUD,EAAY;AAAA,IACjC;AAAA,EACF;AAGA,SAAAC,EAAK,KAAK,CAACtT,GAAGE,MAAMF,EAAE,WAAWE,EAAE,QAAQ,GAEpCoT;AACT;AAKO,SAASC,GACdd,GACAU,GACQ;AAER,QAAM7P,IAA8B;AAAA,IAClC6P,EAAM,CAAC,IAAIV,EAAI,OAAO,CAAC;AAAA,IACvBU,EAAM,CAAC,IAAIV,EAAI,OAAO,CAAC;AAAA,IACvBU,EAAM,CAAC,IAAIV,EAAI,OAAO,CAAC;AAAA,EAAA,GAInBrF,IACJ9J,EAAE,CAAC,IAAImP,EAAI,UAAU,CAAC,IACtBnP,EAAE,CAAC,IAAImP,EAAI,UAAU,CAAC,IACtBnP,EAAE,CAAC,IAAImP,EAAI,UAAU,CAAC,GAIlBe,IAAoC;AAAA,IACxCf,EAAI,OAAO,CAAC,IAAIA,EAAI,UAAU,CAAC,IAAIrF;AAAA,IACnCqF,EAAI,OAAO,CAAC,IAAIA,EAAI,UAAU,CAAC,IAAIrF;AAAA,IACnCqF,EAAI,OAAO,CAAC,IAAIA,EAAI,UAAU,CAAC,IAAIrF;AAAA,EAAA,GAI/BxG,IAAKuM,EAAM,CAAC,IAAIK,EAAQ,CAAC,GACzB3M,IAAKsM,EAAM,CAAC,IAAIK,EAAQ,CAAC,GACzB1M,IAAKqM,EAAM,CAAC,IAAIK,EAAQ,CAAC;AAE/B,SAAO,KAAK,KAAK5M,IAAKA,IAAKC,IAAKA,IAAKC,IAAKA,CAAE;AAC9C;AAwBO,SAAS2M,GACdhB,GACAiB,GACAC,GACAC,GACmD;AAInD,QAAMC,IAA+B;AAAA,IACnCF,EAAG,CAAC,IAAID,EAAG,CAAC;AAAA,IACZC,EAAG,CAAC,IAAID,EAAG,CAAC;AAAA,IACZC,EAAG,CAAC,IAAID,EAAG,CAAC;AAAA,EAAA,GAERI,IAA+B;AAAA,IACnCF,EAAG,CAAC,IAAIF,EAAG,CAAC;AAAA,IACZE,EAAG,CAAC,IAAIF,EAAG,CAAC;AAAA,IACZE,EAAG,CAAC,IAAIF,EAAG,CAAC;AAAA,EAAA,GAIRK,IAA8B;AAAA,IAClCtB,EAAI,UAAU,CAAC,IAAIqB,EAAG,CAAC,IAAIrB,EAAI,UAAU,CAAC,IAAIqB,EAAG,CAAC;AAAA,IAClDrB,EAAI,UAAU,CAAC,IAAIqB,EAAG,CAAC,IAAIrB,EAAI,UAAU,CAAC,IAAIqB,EAAG,CAAC;AAAA,IAClDrB,EAAI,UAAU,CAAC,IAAIqB,EAAG,CAAC,IAAIrB,EAAI,UAAU,CAAC,IAAIqB,EAAG,CAAC;AAAA,EAAA,GAI9C9T,IAAI6T,EAAG,CAAC,IAAIE,EAAE,CAAC,IAAIF,EAAG,CAAC,IAAIE,EAAE,CAAC,IAAIF,EAAG,CAAC,IAAIE,EAAE,CAAC;AAGnD,MAAI/T,IAAI,SAAYA,IAAI;AACtB,WAAO;AAGT,QAAM4B,IAAI,IAAM5B,GAGV6D,IAA8B;AAAA,IAClC4O,EAAI,OAAO,CAAC,IAAIiB,EAAG,CAAC;AAAA,IACpBjB,EAAI,OAAO,CAAC,IAAIiB,EAAG,CAAC;AAAA,IACpBjB,EAAI,OAAO,CAAC,IAAIiB,EAAG,CAAC;AAAA,EAAA,GAIhB,IAAI9R,KAAKiC,EAAE,CAAC,IAAIkQ,EAAE,CAAC,IAAIlQ,EAAE,CAAC,IAAIkQ,EAAE,CAAC,IAAIlQ,EAAE,CAAC,IAAIkQ,EAAE,CAAC;AAErD,MAAI,IAAI,KAAO,IAAI;AACjB,WAAO;AAIT,QAAMC,IAA8B;AAAA,IAClCnQ,EAAE,CAAC,IAAIgQ,EAAG,CAAC,IAAIhQ,EAAE,CAAC,IAAIgQ,EAAG,CAAC;AAAA,IAC1BhQ,EAAE,CAAC,IAAIgQ,EAAG,CAAC,IAAIhQ,EAAE,CAAC,IAAIgQ,EAAG,CAAC;AAAA,IAC1BhQ,EAAE,CAAC,IAAIgQ,EAAG,CAAC,IAAIhQ,EAAE,CAAC,IAAIgQ,EAAG,CAAC;AAAA,EAAA,GAItBvQ,IAAI1B,KAAK6Q,EAAI,UAAU,CAAC,IAAIuB,EAAE,CAAC,IAAIvB,EAAI,UAAU,CAAC,IAAIuB,EAAE,CAAC,IAAIvB,EAAI,UAAU,CAAC,IAAIuB,EAAE,CAAC;AAEzF,MAAI1Q,IAAI,KAAO,IAAIA,IAAI;AACrB,WAAO;AAIT,QAAM8J,IAAIxL,KAAKkS,EAAG,CAAC,IAAIE,EAAE,CAAC,IAAIF,EAAG,CAAC,IAAIE,EAAE,CAAC,IAAIF,EAAG,CAAC,IAAIE,EAAE,CAAC;AAExD,SAAI5G,IAAI,OACC,EAAE,UAAUA,GAAG,GAAG,GAAA9J,EAAA,IAGpB;AACT;AAYO,SAAS2Q,GACdxB,GACAyB,GACAC,GACAC,GACyB;AACzB,QAAMC,IAAOH,EAAQ,QACfI,IAAOH,EAAQ;AAErB,MAAIjB,IAAsC;AAG1C,WAASqB,IAAM,GAAGA,IAAMD,IAAO,GAAGC;AAChC,aAASC,IAAM,GAAGA,IAAMH,IAAO,GAAGG,KAAO;AAEvC,YAAMC,IAAMF,IAAMF,IAAOG,GACnBE,IAAMH,IAAMF,IAAOG,IAAM,GACzBG,KAAOJ,IAAM,KAAKF,IAAOG,GACzBI,KAAOL,IAAM,KAAKF,IAAOG,IAAM,GAE/BK,IAAgC,CAACX,EAAQM,CAAG,GAAGJ,EAAQK,CAAG,GAAGN,EAAQI,CAAG,CAAC,GACzEO,IAAgC,CAACZ,EAAQM,IAAM,CAAC,GAAGJ,EAAQM,CAAG,GAAGP,EAAQI,CAAG,CAAC,GAC7EQ,IAAgC,CAACb,EAAQM,CAAG,GAAGJ,EAAQO,CAAG,GAAGR,EAAQI,IAAM,CAAC,CAAC,GAC7ES,IAAgC,CAACd,EAAQM,IAAM,CAAC,GAAGJ,EAAQQ,CAAG,GAAGT,EAAQI,IAAM,CAAC,CAAC,GAGjFU,IAAOxB,GAAwBhB,GAAKoC,GAAKE,GAAKD,CAAG;AACvD,UAAIG,MAAS/B,MAAe,QAAQ+B,EAAK,WAAW/B,EAAW,WAAW;AACxE,cAAMC,IAAkC;AAAA,UACtCV,EAAI,OAAO,CAAC,IAAIA,EAAI,UAAU,CAAC,IAAIwC,EAAK;AAAA,UACxCxC,EAAI,OAAO,CAAC,IAAIA,EAAI,UAAU,CAAC,IAAIwC,EAAK;AAAA,UACxCxC,EAAI,OAAO,CAAC,IAAIA,EAAI,UAAU,CAAC,IAAIwC,EAAK;AAAA,QAAA,GAKpCC,KADI,IAAID,EAAK,IAAIA,EAAK,KACRb,EAAQK,CAAG,IAAIQ,EAAK,IAAIb,EAAQO,CAAG,IAAIM,EAAK,IAAIb,EAAQM,CAAG;AAE/E,QAAAxB,IAAa;AAAA,UACX,UAAU+B,EAAK;AAAA,UACf,OAAA9B;AAAA,UACA,KAAAoB;AAAA,UACA,KAAAC;AAAA,UACA,QAAQU;AAAA,UACR,OAAOD,EAAK;AAAA,UACZ,OAAOA,EAAK;AAAA,QAAA;AAAA,MAEhB;AAGA,YAAME,IAAO1B,GAAwBhB,GAAKqC,GAAKC,GAAKC,CAAG;AACvD,UAAIG,MAASjC,MAAe,QAAQiC,EAAK,WAAWjC,EAAW,WAAW;AACxE,cAAMC,IAAkC;AAAA,UACtCV,EAAI,OAAO,CAAC,IAAIA,EAAI,UAAU,CAAC,IAAI0C,EAAK;AAAA,UACxC1C,EAAI,OAAO,CAAC,IAAIA,EAAI,UAAU,CAAC,IAAI0C,EAAK;AAAA,UACxC1C,EAAI,OAAO,CAAC,IAAIA,EAAI,UAAU,CAAC,IAAI0C,EAAK;AAAA,QAAA,GAIpCD,KADI,IAAIC,EAAK,IAAIA,EAAK,KACRf,EAAQM,CAAG,IAAIS,EAAK,IAAIf,EAAQO,CAAG,IAAIQ,EAAK,IAAIf,EAAQQ,CAAG;AAE/E,QAAA1B,IAAa;AAAA,UACX,UAAUiC,EAAK;AAAA,UACf,OAAAhC;AAAA,UACA,KAAAoB;AAAA,UACA,KAAKC,IAAM;AAAA,UACX,QAAQU;AAAA,UACR,OAAOC,EAAK;AAAA,UACZ,OAAOA,EAAK;AAAA,QAAA;AAAA,MAEhB;AAAA,IACF;AAGF,SAAOjC;AACT;AAMO,SAASkC,GACd3C,GACA4C,GACAC,GACiH;AACjH,QAAMhS,IAAI,CAACgS,EAAG,CAAC,IAAID,EAAG,CAAC,GAAGC,EAAG,CAAC,IAAID,EAAG,CAAC,GAAGC,EAAG,CAAC,IAAID,EAAG,CAAC,CAAC,GAChDE,IAAI9C,EAAI,WACRb,IAAI,CAACa,EAAI,OAAO,CAAC,IAAI4C,EAAG,CAAC,GAAG5C,EAAI,OAAO,CAAC,IAAI4C,EAAG,CAAC,GAAG5C,EAAI,OAAO,CAAC,IAAI4C,EAAG,CAAC,CAAC,GAExErV,IAAIuV,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,GAC1CrV,IAAIqV,EAAE,CAAC,IAAIjS,EAAE,CAAC,IAAIiS,EAAE,CAAC,IAAIjS,EAAE,CAAC,IAAIiS,EAAE,CAAC,IAAIjS,EAAE,CAAC,GAC1CQ,IAAIR,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,GAC1CoM,IAAI6F,EAAE,CAAC,IAAI3D,EAAE,CAAC,IAAI2D,EAAE,CAAC,IAAI3D,EAAE,CAAC,IAAI2D,EAAE,CAAC,IAAI3D,EAAE,CAAC,GAC1CnK,IAAInE,EAAE,CAAC,IAAIsO,EAAE,CAAC,IAAItO,EAAE,CAAC,IAAIsO,EAAE,CAAC,IAAItO,EAAE,CAAC,IAAIsO,EAAE,CAAC,GAE1C4D,IAAIxV,IAAI8D,IAAI5D,IAAIA;AACtB,MAAIuV,GAAIC;AAER,EAAIF,IAAI,QACNC,IAAK,GACLC,IAAMxV,IAAI4D,IAAI4L,IAAIxP,IAAIuH,IAAI3D,MAE1B2R,KAAMvV,IAAIuH,IAAI3D,IAAI4L,KAAK8F,GACvBE,KAAM1V,IAAIyH,IAAIvH,IAAIwP,KAAK8F,IAIzBE,IAAK,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGA,CAAE,CAAC,GAGhCD,IAAK,KAAK,IAAI,GAAGA,CAAE;AAEnB,QAAME,IAAyC;AAAA,IAC7ClD,EAAI,OAAO,CAAC,IAAIgD,IAAKF,EAAE,CAAC;AAAA,IACxB9C,EAAI,OAAO,CAAC,IAAIgD,IAAKF,EAAE,CAAC;AAAA,IACxB9C,EAAI,OAAO,CAAC,IAAIgD,IAAKF,EAAE,CAAC;AAAA,EAAA,GAGpBK,IAA6C;AAAA,IACjDP,EAAG,CAAC,IAAIK,IAAKpS,EAAE,CAAC;AAAA,IAChB+R,EAAG,CAAC,IAAIK,IAAKpS,EAAE,CAAC;AAAA,IAChB+R,EAAG,CAAC,IAAIK,IAAKpS,EAAE,CAAC;AAAA,EAAA,GAGZsD,IAAK+O,EAAa,CAAC,IAAIC,EAAiB,CAAC,GACzC/O,IAAK8O,EAAa,CAAC,IAAIC,EAAiB,CAAC,GACzC9O,IAAK6O,EAAa,CAAC,IAAIC,EAAiB,CAAC;AAG/C,SAAO;AAAA,IACL,UAHW,KAAK,KAAKhP,IAAKA,IAAKC,IAAKA,IAAKC,IAAKA,CAAE;AAAA,IAIhD,YAAY6O;AAAA,IACZ,gBAAgBC;AAAA,IAChB,GAAGF;AAAA,EAAA;AAEP;AAKO,SAASG,EACdpD,GACAhD,GACAvH,IAAoB,KACmF;AACvG,MAAIsL,IAAiH,MACjHsC,IAAU5N;AAEd,WAASrE,IAAI,GAAGA,IAAI4L,EAAM,QAAQ5L,KAAK;AACrC,UAAMkS,IAAOtG,EAAM5L,CAAC;AACpB,aAAS8I,IAAI,GAAGA,IAAIoJ,EAAK,EAAE,SAAS,GAAGpJ,KAAK;AAC1C,YAAM0I,IAA+B,CAACU,EAAK,EAAEpJ,CAAC,GAAGoJ,EAAK,EAAEpJ,CAAC,GAAGoJ,EAAK,EAAEpJ,CAAC,CAAC,GAC/D2I,IAA+B,CAACS,EAAK,EAAEpJ,IAAE,CAAC,GAAGoJ,EAAK,EAAEpJ,IAAE,CAAC,GAAGoJ,EAAK,EAAEpJ,IAAE,CAAC,CAAC,GAErEqJ,IAAMZ,GAAmB3C,GAAK4C,GAAIC,CAAE;AAC1C,MAAIU,EAAI,WAAWF,MACjBA,IAAUE,EAAI,UACdxC,IAAU;AAAA,QACR,aAAa3P;AAAA,QACb,YAAY8I,KAAKqJ,EAAI,IAAI,MAAM,IAAI;AAAA,QACnC,UAAUA,EAAI;AAAA,QACd,OAAOA,EAAI;AAAA,MAAA;AAAA,IAGjB;AAAA,EACF;AAEA,SAAOxC;AACT;AAKO,SAASyC,GACdxD,GACAxD,GACA/G,IAAoB,KACyD;AAC7E,MAAIsL,IAAuF,MACvFsC,IAAU5N;AACd,QAAMgO,IAAQjH,EAAK,SAAS;AAE5B,WAAStC,IAAI,GAAGA,IAAIsC,EAAK,EAAE,QAAQtC,KAAK;AACtC,UAAM0I,IAA+B,CAACpG,EAAK,EAAEtC,CAAC,GAAGuJ,GAAOjH,EAAK,EAAEtC,CAAC,CAAC,GAC3D2I,IAA+B,CAACrG,EAAK,EAAEtC,CAAC,GAAGsC,EAAK,EAAEtC,CAAC,GAAGsC,EAAK,EAAEtC,CAAC,CAAC,GAE/DqJ,IAAMZ,GAAmB3C,GAAK4C,GAAIC,CAAE;AAC1C,IAAIU,EAAI,WAAWF,MACjBA,IAAUE,EAAI,UACdxC,IAAU;AAAA,MACR,OAAO7G;AAAA,MACP,UAAUqJ,EAAI;AAAA,MACd,OAAO,CAAC/G,EAAK,EAAEtC,CAAC,GAAGsC,EAAK,EAAEtC,CAAC,GAAGsC,EAAK,EAAEtC,CAAC,CAAC;AAAA,IAAA;AAAA,EAG7C;AAEA,SAAO6G;AACT;AAMO,SAAS2C,GACd1D,GACA2D,GACAlO,IAAoB,KACmF;AACvG,SAAO2N,EAASpD,GAAK2D,GAAOlO,CAAS;AACvC;AC7jBO,MAAMmO,IAAyB;AAAA,EACpC,eAAe;AAAA,IACb,CAAC,KAAK,KAAK,CAAG;AAAA;AAAA,IACd,CAAC,GAAK,KAAK,GAAG;AAAA;AAAA,IACd,CAAC,KAAK,MAAM,GAAG;AAAA;AAAA,IACf,CAAC,GAAK,KAAK,GAAG;AAAA;AAAA,IACd,CAAC,GAAK,MAAM,GAAG;AAAA;AAAA,IACf,CAAC,KAAK,KAAK,CAAG;AAAA;AAAA,IACd,CAAC,KAAK,MAAM,IAAI;AAAA;AAAA,IAChB,CAAC,GAAK,KAAK,GAAG;AAAA;AAAA,EAAA;AAAA,EAEhB,gBAAgB,CAAC,GAAK,GAAK,GAAG;AAAA;AAAA,EAC9B,iBAAiB,CAAC,MAAM,MAAM,KAAK,CAAC;AACtC,GAMaC,KAA0B;AAAA,EACrC,eAAe;AAAA,IACb,CAAC,KAAK,KAAK,GAAG;AAAA;AAAA,IACd,CAAC,KAAK,KAAK,GAAG;AAAA;AAAA,IACd,CAAC,KAAK,KAAK,GAAG;AAAA;AAAA,IACd,CAAC,KAAK,KAAK,GAAG;AAAA;AAAA,IACd,CAAC,KAAK,KAAK,GAAG;AAAA;AAAA,IACd,CAAC,KAAK,KAAK,GAAG;AAAA;AAAA,IACd,CAAC,KAAK,KAAK,GAAG;AAAA;AAAA,IACd,CAAC,KAAK,KAAK,GAAG;AAAA;AAAA,EAAA;AAAA,EAEhB,gBAAgB,CAAC,KAAK,KAAK,GAAG;AAAA;AAAA,EAC9B,iBAAiB,CAAC,MAAM,MAAM,MAAM,CAAC;AACvC;AAKO,SAASC,GACdC,GACY;AACZ,QAAM,CAAC7G,GAAGC,GAAG1P,CAAC,IAAIsW;AAKlB,SAHkB,SAAS7G,IAAI,SAASC,IAAI,SAAS1P,IAGlC,MAAMoW,KAAcD;AACzC;AAcO,SAASI,EACdlR,GACAiR,GACY;AACZ,MAAIE;AAEJ,SAAInR,EAAQ,cAAc,SACxBmR,IAAYL,IACH9Q,EAAQ,cAAc,UAC/BmR,IAAYJ,KAGZI,IAAYF,IACRD,GAAuBC,CAAe,IACtCH,GAGC;AAAA,IACL,eAAe9Q,EAAQ,iBAAiBmR,EAAU;AAAA,IAClD,gBAAgBnR,EAAQ,kBAAkBmR,EAAU;AAAA,IACpD,iBAAiBA,EAAU;AAAA,EAAA;AAE/B;AChDO,MAAMC,GAAe;AAAA,EA+C1B,YAAYpR,GAAgC;AA9CpC,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,cAAsB;AAGtB;AAAA,IAAAA,EAAA,aAAqC;AACrC,IAAAA,EAAA,wBAAqC;AACrC,IAAAA,EAAA,sBAAmC;AACnC,IAAAA,EAAA,qBAAkC;AAClC,IAAAA,EAAA,qBAAkC;AAClC,IAAAA,EAAA,oBAAa;AAEb,IAAAA,EAAA,yBAAoD,CAAC,MAAM,MAAM,KAAK,CAAC;AACvE,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA,eAA0B,CAAA;AAC1B,IAAAA,EAAA,gBAA0B;AAE1B,IAAAA,EAAA,0BAAkC;AAClC,IAAAA,EAAA,qBAAc;AAEd,IAAAA,EAAA,4CAAgE,IAAA;AAGhE;AAAA,IAAAA,EAAA,4BAAoC;AACpC,IAAAA,EAAA;AAGA;AAAA,IAAAA,EAAA,iBAA4B;AAC5B,IAAAA,EAAA;AACA,IAAAA,EAAA,sBAAyD;AACzD,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGA;AAAA,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,aAAM;AACN,IAAAA,EAAA,uBAAgB;AA8JhB,IAAAA,EAAA,sBAAe,MAAY;AACjC,WAAK,OAAA,GACL,KAAK,cAAc;AAAA,IACrB;AA9JE,SAAK,SAASD,EAAQ,QACtB,KAAK,MAAM,OAAO,oBAAoB,GACtC,KAAK,WAAWA,EAAQ,YAAY,IACpC,KAAK,UAAUA,EAAQ,WAAW,KAClC,KAAK,gBAAgBA,EAAQ,iBAAiB,IAE1CA,EAAQ,oBACV,KAAK,kBAAkBA,EAAQ,kBAIjC,KAAK,aAAakR,EAAYlR,EAAQ,SAAS,CAAA,GAAI,KAAK,eAAe;AAGvE,UAAMqE,IAAK,KAAK,OAAO,WAAW,UAAU;AAAA,MAC1C,OAAO;AAAA,MACP,WAAW;AAAA,MACX,uBAAuB;AAAA,IAAA,CACxB;AAED,QAAI,CAACA;AACH,YAAM,IAAI,MAAM,sBAAsB;AAExC,SAAK,KAAKA,GAGVA,EAAG,OAAOA,EAAG,UAAU,GACvBA,EAAG,UAAUA,EAAG,MAAM,GACtBA,EAAG,OAAOA,EAAG,KAAK,GAClBA,EAAG,UAAUA,EAAG,WAAWA,EAAG,mBAAmB,GAGjD,KAAK,WAAWgB,EAAsBhB,CAAE,GAGxC,KAAK,YAAA,GAGL,KAAK,SAAS,IAAItE,EAAYC,EAAQ,MAAM,GAG5C,KAAK,aAAa,IAAI+B,EAAgB,KAAK,QAAQ,KAAK,QAAQ/B,EAAQ,QAAQ,GAChF,KAAK,WAAW,SAAS,MAAM;AAC7B,WAAK,cAAc,IACnB,KAAK,UAAU,cAAc;AAAA,IAC/B,CAAC,GAGG,KAAK,aACP,KAAK,OAAO,IAAIwG,EAAOnC,GAAIrE,EAAQ,IAAI,IAIrC,KAAK,kBACP,KAAK,UAAU,IAAIwJ,EAAU,KAAK,OAAO,iBAAiB,SAAS,MAAMxJ,EAAQ,OAAO,GAExF,KAAK,uBAAuB,KAAK,gBAAgB,KAAK,IAAI,GAC1D,KAAK,wBAAwB,KAAK,iBAAiB,KAAK,IAAI,GAC5D,KAAK,OAAO,iBAAiB,aAAa,KAAK,oBAAoB,GACnE,KAAK,OAAO,iBAAiB,cAAc,KAAK,qBAAqB,IAIvE,KAAK,OAAA,GACL,OAAO,iBAAiB,UAAU,KAAK,YAAY,GAGnD,KAAK,gBAAA;AAAA,EACP;AAAA,EAEQ,gBAAgB,GAAqB;AAC3C,QAAI,KAAK,MAAM,WAAW,EAAG;AAE7B,UAAMgL,IAAO,KAAK,OAAO,sBAAA,GACnBhN,IAAI,EAAE,UAAUgN,EAAK,MACrB/M,IAAI,EAAE,UAAU+M,EAAK,KAErBC,IAAM,KAAK,aAAajN,GAAGC,CAAC,GAG5BoT,IAAkBpG,IAAMA,EAAI,cAAc;AAQhD,QAPIoG,MAAoB,KAAK,uBAC3B,KAAK,qBAAqBA,GAC1B,KAAK,kBAAA,GACL,KAAK,cAAc,KAIjB,KAAK;AACP,UAAIpG;AAKF,YAJc,CAAC,KAAK,gBACP,KAAK,aAAa,WAAWA,EAAI,eACjC,KAAK,aAAa,UAAUA,EAAI,YAElC;AACT,eAAK,eAAe,EAAE,QAAQA,EAAI,aAAa,OAAOA,EAAI,WAAA;AAC1D,gBAAMqG,IAAO,KAAK,MAAMrG,EAAI,WAAW,GACjC3D,IAAQgK,EAAK,SAAS,CAAC,KAAK,KAAK,CAAG;AAE1C,eAAK,QAAQ,KAAK;AAAA,YAChB,OAAOrG,EAAI;AAAA,YACX,UAAU,CAACqG,EAAK,EAAErG,EAAI,UAAU,GAAGqG,EAAK,EAAErG,EAAI,UAAU,GAAGqG,EAAK,EAAErG,EAAI,UAAU,CAAC;AAAA,YACjF,OAAA3D;AAAA,YACA,YAAY,EAAE,QAAQ2D,EAAI,YAAA;AAAA,UAAY,GACrCjN,GAAGC,CAAC;AAAA,QACT;AACE,eAAK,QAAQ,eAAeD,GAAGC,CAAC;AAAA;AAGlC,QAAI,KAAK,iBACP,KAAK,QAAQ,KAAA,GACb,KAAK,eAAe;AAAA,EAI5B;AAAA,EAEQ,mBAAyB;AAE/B,IAAI,KAAK,uBAAuB,SAC9B,KAAK,qBAAqB,MAC1B,KAAK,kBAAA,GACL,KAAK,cAAc,KAGjB,KAAK,YACP,KAAK,QAAQ,KAAA,GACb,KAAK,eAAe;AAAA,EAExB;AAAA,EAEA,aAAaqL,GAAiBC,GAAiB;AAC7C,QAAI,KAAK,MAAM,WAAW,EAAG,QAAO;AAEpC,UAAM,EAAE,OAAAgI,GAAO,QAAAC,MAAW,KAAK,cAAA,GACzBC,IAAW,KAAK,OAAO,wBAAA,GACvBvE,IAAMZ,EAAoBhD,GAASC,GAASgI,GAAOC,GAAQC,CAAQ;AAEzE,WAAOb,GAAS1D,GAAK,KAAK,OAAO,GAAG;AAAA,EACtC;AAAA,EAEQ,cAAoB;AAC1B,UAAM,EAAE,IAAA7I,MAAO;AAEf,SAAK,MAAMA,EAAG,kBAAA,GACdA,EAAG,gBAAgB,KAAK,GAAG,GAE3B,KAAK,iBAAiBA,EAAG,aAAA,GACzB,KAAK,eAAeA,EAAG,aAAA,GACvB,KAAK,cAAcA,EAAG,aAAA,GACtB,KAAK,cAAcA,EAAG,aAAA,GAEtBA,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAOA,SAAe;AACb,UAAM,EAAE,QAAAqN,GAAQ,IAAArN,GAAI,KAAAsN,GAAK,QAAA3P,MAAW,MAE9BuP,IAAQG,EAAO,aACfF,IAASE,EAAO;AAEtB,IAAAA,EAAO,QAAQH,IAAQI,GACvBD,EAAO,SAASF,IAASG,GAEzBtN,EAAG,SAAS,GAAG,GAAGqN,EAAO,OAAOA,EAAO,MAAM,GAC7C1P,EAAO,SAASuP,IAAQC;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQX,GAAgD;AACtD,SAAK,QAAQ,MAAM,QAAQA,CAAK,IAAIA,IAAQ,CAACA,CAAK,GAClD,KAAK,kBAAA,GACL,KAAK,gBAAA,GAED,KAAK,QAAQ,KAAK,UACpB,KAAK,KAAK,aAAa,KAAK,MAAM,GAGpC,KAAK,cAAc,IACnB,KAAK,UAAU,YAAY;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQS,GAA4B;AAClC,SAAK,MAAM,KAAKA,CAAI,GACpB,KAAK,kBAAA,GACL,KAAK,gBAAA,GAED,KAAK,QAAQ,KAAK,UACpB,KAAK,KAAK,aAAa,KAAK,MAAM,GAGpC,KAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACjB,SAAK,QAAQ,CAAA,GACb,KAAK,aAAa,GAClB,KAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,oBAA0B;AAChC,UAAM,EAAE,IAAAjN,GAAI,OAAAwM,EAAA,IAAU;AAEtB,QAAIA,EAAM,WAAW,GAAG;AACtB,WAAK,aAAa;AAClB;AAAA,IACF;AAEA,UAAMe,IAAyB,CAAA,GACzBC,IAAuB,CAAA,GACvBC,IAAsB,CAAA,GACtBC,IAAuB,CAAA;AAC7B,QAAIC,IAAe;AAGnB,UAAMC,IAAe,KAAK,WAAW,eAC/BC,IAAiB,KAAK,WAAW;AAEvC,aAASC,IAAU,GAAGA,IAAUtB,EAAM,QAAQsB,KAAW;AACvD,YAAMb,IAAOT,EAAMsB,CAAO,GACpBC,IAAad,EAAK,EAAE;AAC1B,UAAIc,IAAa,EAAG;AAIpB,YAAMC,IADYF,MAAY,KAAK,qBAE/BD,IACCZ,EAAK,SAASW,EAAaE,IAAUF,EAAa,MAAM,GAEvDtB,IAAQW,EAAK,SAAS;AAI5B,eAASlK,IAAI,GAAGA,IAAIgL,GAAYhL,KAAK;AACnC,cAAMpJ,IAAIsT,EAAK,EAAElK,CAAC,GACZnJ,IAAIqT,EAAK,EAAElK,CAAC,GACZlJ,IAAIoT,EAAK,EAAElK,CAAC;AAGlB,QAAAwK,EAAa,KAAK5T,GAAGC,GAAGC,CAAC,GAEzB0T,EAAa,KAAK5T,GAAG2S,GAAOzS,CAAC;AAK7B,YAAIoU,IAAK,GAAGC,IAAK,GAAGC,IAAK;AAEzB,YAAIpL,IAAIgL,IAAa,GAAG;AAEtB,gBAAM/Q,IAAKiQ,EAAK,EAAElK,IAAI,CAAC,IAAIkK,EAAK,EAAElK,CAAC,GAC7B9F,IAAKgQ,EAAK,EAAElK,IAAI,CAAC,IAAIkK,EAAK,EAAElK,CAAC,GAC7B7F,IAAK+P,EAAK,EAAElK,IAAI,CAAC,IAAIkK,EAAK,EAAElK,CAAC;AAInC,UAAAkL,IAAKhR,IAAK,IAAI,IAAI,GAClBiR,IAAK,IAAIlR,IAAKA,IAAK,GACnBmR,IAAKnR,IAAK,IAAIC,IAAK;AAInB,gBAAM/D,IAAM,KAAK,KAAK8D,IAAKA,IAAKE,IAAKA,CAAE;AACvC,UAAIhE,IAAM,SACR+U,IAAK,CAAC/Q,IAAKhE,GACXgV,IAAK,GACLC,IAAKnR,IAAK9D;AAAA,QAEd;AAOA,YAJAsU,EAAW,KAAKS,GAAIC,GAAIC,CAAE,GAC1BX,EAAW,KAAKS,GAAIC,GAAIC,CAAE,GAGtBlB,EAAK,QAAQ;AACf,gBAAMlH,IAAIkH,EAAK,OAAOlK,IAAI,CAAC,GACrBiD,IAAIiH,EAAK,OAAOlK,IAAI,IAAI,CAAC,GACzBzM,IAAI2W,EAAK,OAAOlK,IAAI,IAAI,CAAC;AAC/B,UAAA0K,EAAU,KAAK1H,GAAGC,GAAG1P,CAAC,GACtBmX,EAAU,KAAK1H,IAAI,KAAKC,IAAI,KAAK1P,IAAI,GAAG;AAAA,QAC1C;AACE,UAAAmX,EAAU,KAAKO,EAAa,CAAC,GAAGA,EAAa,CAAC,GAAGA,EAAa,CAAC,CAAC,GAChEP,EAAU,KAAKO,EAAa,CAAC,IAAI,KAAKA,EAAa,CAAC,IAAI,KAAKA,EAAa,CAAC,IAAI,GAAG;AAIpF,YAAIjL,IAAIgL,IAAa,GAAG;AACtB,gBAAMK,IAAUT,IAAe5K,IAAI,GAC7BsL,IAAaD,IAAU,GACvBE,IAAWF,IAAU,GACrBG,IAAcH,IAAU;AAG9B,UAAAV,EAAW,KAAKU,GAASC,GAAYC,CAAQ,GAC7CZ,EAAW,KAAKY,GAAUD,GAAYE,CAAW;AAAA,QACnD;AAAA,MACF;AAEA,MAAAZ,KAAgBI,IAAa;AAAA,IAC/B;AAGA,UAAMtL,IAAY,IAAI,aAAa8K,CAAY,GACzCiB,IAAU,IAAI,aAAahB,CAAU,GACrC9K,IAAS,IAAI,aAAa+K,CAAS,GACnCgB,IAAU,IAAI,YAAYf,CAAU;AAE1C,SAAK,aAAae,EAAQ,QAE1BzO,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,WAAWA,EAAG,cAAcyC,GAAWzC,EAAG,YAAY,GAEzDA,EAAG,WAAWA,EAAG,cAAc,KAAK,YAAY,GAChDA,EAAG,WAAWA,EAAG,cAAcwO,GAASxO,EAAG,YAAY,GAEvDA,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,WAAWA,EAAG,cAAc0C,GAAQ1C,EAAG,YAAY,GAEtDA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GACvDA,EAAG,WAAWA,EAAG,sBAAsByO,GAASzO,EAAG,WAAW;AAAA,EAChE;AAAA,EAEQ,kBAAwB;AAC9B,QAAI,KAAK,MAAM,WAAW,GAAG;AAC3B,WAAK,SAAS;AACd;AAAA,IACF;AAEA,QAAI7C,IAAO,OAAUG,IAAO,QACxBF,IAAO,OAAUG,IAAO,QACxBF,IAAO,OAAUG,IAAO;AAE5B,eAAWyP,KAAQ,KAAK,OAAO;AAC7B,YAAMX,IAAQW,EAAK,SAAS;AAC5B,MAAIX,IAAQlP,MAAMA,IAAOkP;AAEzB,eAASvJ,IAAI,GAAGA,IAAIkK,EAAK,EAAE,QAAQlK;AACjC,QAAIkK,EAAK,EAAElK,CAAC,IAAI5F,MAAMA,IAAO8P,EAAK,EAAElK,CAAC,IACjCkK,EAAK,EAAElK,CAAC,IAAIzF,MAAMA,IAAO2P,EAAK,EAAElK,CAAC,IACjCkK,EAAK,EAAElK,CAAC,IAAI3F,MAAMA,IAAO6P,EAAK,EAAElK,CAAC,IACjCkK,EAAK,EAAElK,CAAC,IAAIxF,MAAMA,IAAO0P,EAAK,EAAElK,CAAC,IACjCkK,EAAK,EAAElK,CAAC,IAAI1F,MAAMA,IAAO4P,EAAK,EAAElK,CAAC,IACjCkK,EAAK,EAAElK,CAAC,IAAIvF,MAAMA,IAAOyP,EAAK,EAAElK,CAAC;AAAA,IAEzC;AAEA,SAAK,SAAS,EAAE,MAAA5F,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,EAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,YAAkB;AAChB,QAAI,CAAC,KAAK,OAAQ;AAElB,UAAM,EAAE,MAAAL,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,MAAS,KAAK,QAG9CR,IAAKM,IAAOH,GACZF,IAAKM,IAAOH,GACZF,IAAKM,IAAOH,GACZqR,IAAU;AAEhB,SAAK,OAAO;AAAA,MACVvR,IAAOH,IAAK0R;AAAA,MAAStR,IAAOH,IAAKyR;AAAA,MAASrR,IAAOH,IAAKwR;AAAA,MACtDpR,IAAON,IAAK0R;AAAA,MAASnR,IAAON,IAAKyR;AAAA,MAASlR,IAAON,IAAKwR;AAAA,IAAA,GAIxD,KAAK,OAAO,UAAU,MAEtB,KAAK,cAAc;AAAA,EACrB;AAAA,EAEA,gBAAmD;AACjD,UAAM/H,IAAO,KAAK,OAAO,sBAAA;AACzB,WAAO,EAAE,OAAOA,EAAK,OAAO,QAAQA,EAAK,OAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,SAAe;AACb,UAAM,EAAE,IAAA3G,GAAI,QAAArC,GAAQ,iBAAAiP,EAAA,IAAoB,MAElC+B,IAAY,YAAY,IAAA;AAG9B,IAAA3O,EAAG;AAAA,MACD4M,EAAgB,CAAC;AAAA,MACjBA,EAAgB,CAAC;AAAA,MACjBA,EAAgB,CAAC;AAAA,MACjBA,EAAgB,CAAC;AAAA,IAAA,GAEnB5M,EAAG,MAAMA,EAAG,mBAAmBA,EAAG,gBAAgB;AAGlD,UAAMoN,IAAWzP,EAAO,wBAAA;AAQxB,QALI,KAAK,QACP,KAAK,KAAK,OAAOyP,CAAQ,GAIvB,KAAK,aAAa,GAAG;AACvB,YAAMxM,IAAU,KAAK,SAAS;AAC9B,MAAAZ,EAAG,WAAWY,EAAQ,OAAO,GAE7BZ,EAAG,iBAAiBY,EAAQ,SAAS,kBAAqB,IAAOwM,CAAQ,GACzEpN,EAAG,UAAUY,EAAQ,SAAS,WAAc,KAAK,OAAO,GACxDZ,EAAG,UAAUY,EAAQ,SAAS,YAAe,GAAG,GAAG,CAAC,GACpDZ,EAAG,UAAUY,EAAQ,SAAS,WAAc,GAAG,GAE/CZ,EAAG,gBAAgB,KAAK,GAAG;AAG3B,YAAMgE,IAASpD,EAAQ,WAAW;AAClC,MAAIoD,KAAU,MACZhE,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,wBAAwBgE,CAAM,GACjChE,EAAG,oBAAoBgE,GAAQ,GAAGhE,EAAG,OAAO,IAAO,GAAG,CAAC;AAIzD,YAAM4O,IAAYhO,EAAQ,WAAW;AACrC,MAAIgO,KAAa,MACf5O,EAAG,WAAWA,EAAG,cAAc,KAAK,YAAY,GAChDA,EAAG,wBAAwB4O,CAAS,GACpC5O,EAAG,oBAAoB4O,GAAW,GAAG5O,EAAG,OAAO,IAAO,GAAG,CAAC;AAI5D,YAAMiE,IAAWrD,EAAQ,WAAW;AACpC,MAAIqD,KAAY,MACdjE,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,wBAAwBiE,CAAQ,GACnCjE,EAAG,oBAAoBiE,GAAU,GAAGjE,EAAG,OAAO,IAAO,GAAG,CAAC,IAG3DA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GACvDA,EAAG,aAAaA,EAAG,WAAW,KAAK,YAAYA,EAAG,cAAc,CAAC,GAEjEA,EAAG,gBAAgB,IAAI;AAAA,IACzB;AAGA,UAAM6O,IAAY,YAAY,IAAA,IAAQF;AACtC,SAAK,gBAAgBE,GACrB,KAAK;AAEL,UAAMC,IAAM,YAAY,IAAA;AACxB,IAAIA,IAAM,KAAK,iBAAiB,QAC9B,KAAK,MAAM,KAAK,YAChB,KAAK,aAAa,GAClB,KAAK,gBAAgBA,IAGvB,KAAK,UAAU,QAAQ;AAAA,EACzB;AAAA,EAEA,kBAAwB;AACtB,QAAI,KAAK,qBAAqB,KAAM;AAEpC,UAAMC,IAAO,MAAY;AACvB,WAAK,WAAW,OAAA,GAEZ,KAAK,gBACP,KAAK,OAAA,GACL,KAAK,cAAc,KAGrB,KAAK,mBAAmB,sBAAsBA,CAAI;AAAA,IACpD;AAEA,IAAAA,EAAA;AAAA,EACF;AAAA,EAEA,iBAAuB;AACrB,IAAI,KAAK,qBAAqB,SAC5B,qBAAqB,KAAK,gBAAgB,GAC1C,KAAK,mBAAmB;AAAA,EAE5B;AAAA,EAEA,WAA0B;AACxB,WAAO;AAAA,MACL,KAAK,KAAK;AAAA,MACV,eAAe,KAAK,aAAa;AAAA,MACjC,WAAW,KAAK;AAAA,MAChB,WAAW;AAAA,IAAA;AAAA,EAEf;AAAA,EAEA,YAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,gBAAgB;AACd,WAAK,KAAK,OACH,KAAK,KAAK,UAAA,IADM,CAAA;AAAA,EAEzB;AAAA,EAEA,0BAAwC;AACtC,WAAO,KAAK,OAAO,wBAAA;AAAA,EACrB;AAAA,EAEA,gBAAgB7K,GAAgF;AAC9F,QAAI,CAAC,KAAK,KAAM,QAAO,EAAE,GAAG,GAAG,GAAG,GAAG,SAAS,GAAA;AAC9C,UAAMyC,IAAO,KAAK,OAAO,sBAAA,GACnByG,IAAW,KAAK,OAAO,wBAAA;AAC7B,WAAO,KAAK,KAAK,gBAAgBlJ,GAAUkJ,GAAUzG,EAAK,OAAOA,EAAK,MAAM;AAAA,EAC9E;AAAA,EAEA,YACEqI,IAAkC,OAClCC,IAAU,MACVC,IAAc,IACN;AACR,UAAMC,IAAU,CAAC,GAAG,KAAK,eAAe;AACxC,IAAID,KAAeF,MAAW,UAC5B,KAAK,kBAAkB,CAAC,GAAG,GAAG,GAAG,CAAC,IAEpC,KAAK,OAAA,GACL,KAAK,kBAAkBG;AACvB,UAAMC,IAAW,SAASJ,CAAM;AAChC,WAAO,KAAK,OAAO,UAAUI,GAAUH,CAAO;AAAA,EAChD;AAAA,EAEA,GAAGzI,GAAezI,GAAyC;AACzD,IAAK,KAAK,eAAe,IAAIyI,CAAK,KAChC,KAAK,eAAe,IAAIA,GAAO,oBAAI,KAAK,GAE1C,KAAK,eAAe,IAAIA,CAAK,EAAG,IAAIzI,CAAQ;AAAA,EAC9C;AAAA,EAEA,IAAIyI,GAAezI,GAAyC;AVnoB9D,QAAA0I;AUooBI,KAAAA,IAAA,KAAK,eAAe,IAAID,CAAK,MAA7B,QAAAC,EAAgC,OAAO1I;AAAA,EACzC;AAAA,EAEQ,UAAUmC,GAAoB;AACpC,UAAMmP,IAAY,KAAK,eAAe,IAAInP,CAAI;AAC9C,QAAI,CAACmP,EAAW;AAEhB,UAAM7I,IAAyB;AAAA,MAC7B,MAAAtG;AAAA,MACA,WAAW,YAAY,IAAA;AAAA,MACvB,OAAO,KAAK,SAAA;AAAA,MACZ,QAAQ;AAAA,QACN,QAAQ,CAAC,GAAG,KAAK,OAAO,MAAM;AAAA,QAC9B,QAAQ,KAAK,OAAO;AAAA,QACpB,OAAO,KAAK,OAAO;AAAA,QACnB,KAAK,KAAK,OAAO;AAAA,QACjB,KAAK,KAAK,OAAO;AAAA,MAAA;AAAA,IACnB;AAGF,IAAAmP,EAAU,QAAQ,CAAAtR,MAAYA,EAASyI,CAAK,CAAC;AAAA,EAC/C;AAAA,EAEA,UAAgB;AACd,SAAK,eAAA,GAEL,OAAO,oBAAoB,UAAU,KAAK,YAAY,GAElD,KAAK,YACP,KAAK,QAAQ,QAAA,GACT,KAAK,wBAAsB,KAAK,OAAO,oBAAoB,aAAa,KAAK,oBAAoB,GACjG,KAAK,yBAAuB,KAAK,OAAO,oBAAoB,cAAc,KAAK,qBAAqB;AAG1G,UAAM,EAAE,IAAAxG,MAAO;AACf,IAAI,KAAK,OAAKA,EAAG,kBAAkB,KAAK,GAAG,GACvC,KAAK,kBAAgBA,EAAG,aAAa,KAAK,cAAc,GACxD,KAAK,gBAAcA,EAAG,aAAa,KAAK,YAAY,GACpD,KAAK,eAAaA,EAAG,aAAa,KAAK,WAAW,GAClD,KAAK,eAAaA,EAAG,aAAa,KAAK,WAAW,GAEtD,KAAK,WAAW,QAAA,GAChBgC,EAAoBhC,GAAI,KAAK,QAAQ,GAEjC,KAAK,QACP,KAAK,KAAK,QAAA,GAGZ,KAAK,eAAe,MAAA;AAAA,EACtB;AACF;AC/qBO,SAASsP,GAAgBC,IAAe,GAAiB;AAC9D,QAAM/L,KAAK,IAAI,KAAK,KAAK,CAAC,KAAK,GAGzBgM,IAAqB;AAAA,IACzB;AAAA,IAAIhM;AAAA,IAAG;AAAA,IAAK;AAAA,IAAGA;AAAA,IAAG;AAAA,IAAK;AAAA,IAAI,CAACA;AAAA,IAAG;AAAA,IAAK;AAAA,IAAG,CAACA;AAAA,IAAG;AAAA,IAC3C;AAAA,IAAG;AAAA,IAAIA;AAAA,IAAK;AAAA,IAAG;AAAA,IAAGA;AAAA,IAAK;AAAA,IAAG;AAAA,IAAI,CAACA;AAAA,IAAK;AAAA,IAAG;AAAA,IAAG,CAACA;AAAA,IAC3CA;AAAA,IAAG;AAAA,IAAG;AAAA,IAAMA;AAAA,IAAG;AAAA,IAAG;AAAA,IAAK,CAACA;AAAA,IAAG;AAAA,IAAG;AAAA,IAAM,CAACA;AAAA,IAAG;AAAA,IAAG;AAAA,EAAA;AAI7C,MAAIiM,IAAoB;AAAA,IACtB,CAAC,GAAG,IAAI,CAAC;AAAA,IAAG,CAAC,GAAG,GAAG,CAAC;AAAA,IAAG,CAAC,GAAG,GAAG,CAAC;AAAA,IAAG,CAAC,GAAG,GAAG,EAAE;AAAA,IAAG,CAAC,GAAG,IAAI,EAAE;AAAA,IACxD,CAAC,GAAG,GAAG,CAAC;AAAA,IAAG,CAAC,GAAG,IAAI,CAAC;AAAA,IAAG,CAAC,IAAI,IAAI,CAAC;AAAA,IAAG,CAAC,IAAI,GAAG,CAAC;AAAA,IAAG,CAAC,GAAG,GAAG,CAAC;AAAA,IACxD,CAAC,GAAG,GAAG,CAAC;AAAA,IAAG,CAAC,GAAG,GAAG,CAAC;AAAA,IAAG,CAAC,GAAG,GAAG,CAAC;AAAA,IAAG,CAAC,GAAG,GAAG,CAAC;AAAA,IAAG,CAAC,GAAG,GAAG,CAAC;AAAA,IACpD,CAAC,GAAG,GAAG,CAAC;AAAA,IAAG,CAAC,GAAG,GAAG,EAAE;AAAA,IAAG,CAAC,GAAG,GAAG,EAAE;AAAA,IAAG,CAAC,GAAG,GAAG,CAAC;AAAA,IAAG,CAAC,GAAG,GAAG,CAAC;AAAA,EAAA;AAIxD,QAAMC,wBAAoB,IAAA;AAE1B,WAASC,EAAY5F,GAAYC,GAAoB;AACnD,UAAM/D,IAAM8D,IAAKC,IAAK,GAAGD,CAAE,IAAIC,CAAE,KAAK,GAAGA,CAAE,IAAID,CAAE;AACjD,QAAI2F,EAAc,IAAIzJ,CAAG;AACvB,aAAOyJ,EAAc,IAAIzJ,CAAG;AAG9B,UAAM2J,IAAK7F,IAAK,GACV8F,IAAK7F,IAAK,GACV8F,KAAMN,EAASI,CAAE,IAAIJ,EAASK,CAAE,KAAK,GACrCE,KAAMP,EAASI,IAAK,CAAC,IAAIJ,EAASK,IAAK,CAAC,KAAK,GAC7CG,KAAMR,EAASI,IAAK,CAAC,IAAIJ,EAASK,IAAK,CAAC,KAAK,GAE7CI,IAAMT,EAAS,SAAS;AAC9B,WAAAA,EAAS,KAAKM,GAAIC,GAAIC,CAAE,GACxBN,EAAc,IAAIzJ,GAAKgK,CAAG,GACnBA;AAAA,EACT;AAGA,WAASlN,IAAI,GAAGA,IAAIwM,GAAcxM,KAAK;AACrC,UAAMmN,IAAuB,CAAA;AAC7B,eAAW,CAAC9Z,GAAGE,GAAG4D,CAAC,KAAKuV,GAAO;AAC7B,YAAMU,IAAKR,EAAYvZ,GAAGE,CAAC,GACrB8Z,IAAKT,EAAYrZ,GAAG4D,CAAC,GACrBmW,IAAKV,EAAYzV,GAAG9D,CAAC;AAC3B,MAAA8Z,EAAS,KAAK,CAAC9Z,GAAG+Z,GAAIE,CAAE,GAAG,CAAC/Z,GAAG8Z,GAAID,CAAE,GAAG,CAACjW,GAAGmW,GAAID,CAAE,GAAG,CAACD,GAAIC,GAAIC,CAAE,CAAC;AAAA,IACnE;AACA,IAAAZ,IAAQS,GACRR,EAAc,MAAA;AAAA,EAChB;AAGA,QAAMjN,IAAY,IAAI,aAAa+M,EAAS,MAAM;AAClD,WAASzM,IAAI,GAAGA,IAAIyM,EAAS,QAAQzM,KAAK,GAAG;AAC3C,UAAMpJ,IAAI6V,EAASzM,CAAC,GAAGnJ,IAAI4V,EAASzM,IAAI,CAAC,GAAGlJ,IAAI2V,EAASzM,IAAI,CAAC,GACxD7J,IAAM,KAAK,KAAKS,IAAIA,IAAIC,IAAIA,IAAIC,IAAIA,CAAC;AAC3C,IAAA4I,EAAUM,CAAC,IAAIpJ,IAAIT,GACnBuJ,EAAUM,IAAI,CAAC,IAAInJ,IAAIV,GACvBuJ,EAAUM,IAAI,CAAC,IAAIlJ,IAAIX;AAAA,EACzB;AAGA,QAAMuV,IAAU,IAAI,YAAYgB,EAAM,SAAS,CAAC;AAChD,WAAS1M,IAAI,GAAGA,IAAI0M,EAAM,QAAQ1M;AAChC,IAAA0L,EAAQ1L,IAAI,CAAC,IAAI0M,EAAM1M,CAAC,EAAE,CAAC,GAC3B0L,EAAQ1L,IAAI,IAAI,CAAC,IAAI0M,EAAM1M,CAAC,EAAE,CAAC,GAC/B0L,EAAQ1L,IAAI,IAAI,CAAC,IAAI0M,EAAM1M,CAAC,EAAE,CAAC;AAGjC,SAAO;AAAA,IACL,WAAAN;AAAA,IACA,SAAAgM;AAAA,IACA,aAAahM,EAAU,SAAS;AAAA,IAChC,YAAYgM,EAAQ;AAAA,EAAA;AAExB;AAMO,SAAS6B,GAAeC,IAAW,IAAIC,IAAQ,IAAkB;AACtE,QAAM/N,IAAsB,CAAA,GACtBgM,IAAoB,CAAA;AAG1B,WAASgC,IAAO,GAAGA,KAAQD,GAAOC,KAAQ;AACxC,UAAMjU,IAAOiU,IAAOD,IAAS,KAAK,IAC5B9T,IAAS,KAAK,IAAIF,CAAG,GACrBG,IAAS,KAAK,IAAIH,CAAG;AAE3B,aAASkU,IAAM,GAAGA,KAAOH,GAAUG,KAAO;AACxC,YAAMnU,IAASmU,IAAMH,IAAY,KAAK,KAAK,GACrCnU,IAAW,KAAK,IAAIG,CAAK,GACzBK,IAAW,KAAK,IAAIL,CAAK;AAE/B,MAAAkG,EAAU;AAAA,QACR/F,IAASE;AAAA,QACTD;AAAA,QACAD,IAASN;AAAA,MAAA;AAAA,IAEb;AAAA,EACF;AAGA,WAASqU,IAAO,GAAGA,IAAOD,GAAOC;AAC/B,aAASC,IAAM,GAAGA,IAAMH,GAAUG,KAAO;AACvC,YAAMC,IAAOF,KAAQF,IAAW,KAAKG,GAC/BE,IAAOD,IAAOJ,IAAW;AAE/B,MAAA9B,EAAQ,KAAKkC,GAAMC,GAAMD,IAAO,CAAC,GACjClC,EAAQ,KAAKkC,IAAO,GAAGC,GAAMA,IAAO,CAAC;AAAA,IACvC;AAGF,SAAO;AAAA,IACL,WAAW,IAAI,aAAanO,CAAS;AAAA,IACrC,SAAS,IAAI,YAAYgM,CAAO;AAAA,IAChC,aAAahM,EAAU,SAAS;AAAA,IAChC,YAAYgM,EAAQ;AAAA,EAAA;AAExB;AAMO,SAASoC,KAA2B;AACzC,QAAMpO,IAAY,IAAI,aAAa;AAAA;AAAA,IAEjC;AAAA,IAAI;AAAA,IAAK;AAAA,IAAK;AAAA,IAAG;AAAA,IAAK;AAAA,IAAK;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAK;AAAA,IAAI;AAAA;AAAA,IAEhD;AAAA,IAAI;AAAA,IAAI;AAAA,IAAK;AAAA,IAAK;AAAA,IAAG;AAAA,IAAM;AAAA,IAAI;AAAA,IAAG;AAAA,IAAM;AAAA,IAAG;AAAA,IAAI;AAAA;AAAA,IAE/C;AAAA,IAAK;AAAA,IAAG;AAAA,IAAK;AAAA,IAAK;AAAA,IAAI;AAAA,IAAK;AAAA,IAAI;AAAA,IAAI;AAAA,IAAK;AAAA,IAAI;AAAA,IAAG;AAAA;AAAA,IAE/C;AAAA,IAAI;AAAA,IAAI;AAAA,IAAM;AAAA,IAAG;AAAA,IAAI;AAAA,IAAM;AAAA,IAAG;AAAA,IAAK;AAAA,IAAI;AAAA,IAAI;AAAA,IAAK;AAAA;AAAA,IAE/C;AAAA,IAAG;AAAA,IAAI;AAAA,IAAM;AAAA,IAAI;AAAA,IAAG;AAAA,IAAM;AAAA,IAAI;AAAA,IAAI;AAAA,IAAK;AAAA,IAAG;AAAA,IAAK;AAAA;AAAA,IAEhD;AAAA,IAAI;AAAA,IAAI;AAAA,IAAK;AAAA,IAAI;AAAA,IAAK;AAAA,IAAI;AAAA,IAAK;AAAA,IAAI;AAAA,IAAI;AAAA,IAAK;AAAA,IAAG;AAAA,EAAA,CAChD;AAGD,WAASM,IAAI,GAAGA,IAAIN,EAAU,QAAQM,KAAK,GAAG;AAC5C,UAAMpJ,IAAI8I,EAAUM,CAAC,GAAGnJ,IAAI6I,EAAUM,IAAI,CAAC,GAAGlJ,IAAI4I,EAAUM,IAAI,CAAC,GAC3D7J,IAAM,KAAK,KAAKS,IAAIA,IAAIC,IAAIA,IAAIC,IAAIA,CAAC;AAC3C,IAAA4I,EAAUM,CAAC,IAAIpJ,IAAIT,GACnBuJ,EAAUM,IAAI,CAAC,IAAInJ,IAAIV,GACvBuJ,EAAUM,IAAI,CAAC,IAAIlJ,IAAIX;AAAA,EACzB;AAEA,QAAMuV,IAAU,IAAI,YAAY;AAAA,IAC9B;AAAA,IAAG;AAAA,IAAG;AAAA,IAAK;AAAA,IAAG;AAAA,IAAG;AAAA;AAAA,IACjB;AAAA,IAAG;AAAA,IAAG;AAAA,IAAK;AAAA,IAAG;AAAA,IAAG;AAAA;AAAA,IACjB;AAAA,IAAG;AAAA,IAAG;AAAA,IAAK;AAAA,IAAG;AAAA,IAAI;AAAA;AAAA,IAClB;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA;AAAA,IACpB;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA;AAAA,IACpB;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA;AAAA,EAAA,CACrB;AAED,SAAO;AAAA,IACL,WAAAhM;AAAA,IACA,SAAAgM;AAAA,IACA,aAAa;AAAA,IACb,YAAY;AAAA,EAAA;AAEhB;AA0BO,SAASqC,KAAgC;AAC9C,QAAMrO,IAAY,IAAI,aAAa;AAAA;AAAA,IAEjC;AAAA,IAAM;AAAA,IAAO;AAAA,IAAO;AAAA,IAAK;AAAA,IAAO;AAAA,IAAO;AAAA,IAAM;AAAA,IAAM;AAAA,IAAM;AAAA,IAAO;AAAA,IAAM;AAAA;AAAA,IAEtE;AAAA,IAAM;AAAA,IAAM;AAAA,IAAO;AAAA,IAAO;AAAA,IAAK;AAAA,IAAQ;AAAA,IAAM;AAAA,IAAK;AAAA,IAAQ;AAAA,IAAK;AAAA,IAAM;AAAA;AAAA,IAErE;AAAA,IAAO;AAAA,IAAK;AAAA,IAAO;AAAA,IAAO;AAAA,IAAM;AAAA,IAAO;AAAA,IAAM;AAAA,IAAM;AAAA,IAAO;AAAA,IAAM;AAAA,IAAK;AAAA;AAAA,IAErE;AAAA,IAAM;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAK;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAK;AAAA,IAAO;AAAA,IAAM;AAAA,IAAM;AAAA,IAAO;AAAA;AAAA,IAErE;AAAA,IAAK;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAM;AAAA,IAAK;AAAA,IAAQ;AAAA,IAAM;AAAA,IAAM;AAAA,IAAO;AAAA,IAAK;AAAA,IAAO;AAAA;AAAA,IAEtE;AAAA,IAAM;AAAA,IAAM;AAAA,IAAO;AAAA,IAAM;AAAA,IAAO;AAAA,IAAM;AAAA,IAAO;AAAA,IAAM;AAAA,IAAM;AAAA,IAAO;AAAA,IAAK;AAAA,EAAA,CACtE,GAEKgM,IAAU,IAAI,YAAY;AAAA,IAC9B;AAAA,IAAG;AAAA,IAAG;AAAA,IAAK;AAAA,IAAG;AAAA,IAAG;AAAA;AAAA,IACjB;AAAA,IAAG;AAAA,IAAG;AAAA,IAAK;AAAA,IAAG;AAAA,IAAG;AAAA;AAAA,IACjB;AAAA,IAAG;AAAA,IAAG;AAAA,IAAK;AAAA,IAAG;AAAA,IAAI;AAAA;AAAA,IAClB;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA;AAAA,IACpB;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA;AAAA,IACpB;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA;AAAA,EAAA,CACrB;AAED,SAAO;AAAA,IACL,WAAAhM;AAAA,IACA,SAAAgM;AAAA,IACA,aAAa;AAAA,IACb,YAAY;AAAA,EAAA;AAEhB;AC9NO,MAAMsC,GAAc;AAAA,EAiBzB,YAAY/Q,GAA4BrE,GAA+B;AAhB/D,IAAAC,EAAA;AACA,IAAAA,EAAA,aAAqC;AAGrC;AAAA,IAAAA,EAAA,wBAAqC;AACrC,IAAAA,EAAA,qBAAkC;AAGlC;AAAA,IAAAA,EAAA,2BAAwC;AACxC,IAAAA,EAAA,6BAA0C;AAC1C,IAAAA,EAAA,6BAA0C;AAE1C,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,uBAAgB;AAGtB,SAAK,KAAKoE,GACV,KAAK,WAAWrE,EAAQ,UACxB,KAAK,eAAeA,EAAQ,gBAAgB,KAE5C,KAAK,YAAA;AAAA,EACP;AAAA,EAEQ,cAAoB;AAC1B,UAAM,EAAE,IAAAqE,GAAI,UAAAgR,GAAU,cAAAC,EAAA,IAAiB;AAGvC,SAAK,MAAMjR,EAAG,kBAAA,GACdA,EAAG,gBAAgB,KAAK,GAAG,GAG3B,KAAK,iBAAiBA,EAAG,aAAA,GACzBA,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,WAAWA,EAAG,cAAcgR,EAAS,WAAWhR,EAAG,WAAW,GAGjE,KAAK,cAAcA,EAAG,aAAA,GACtBA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GACvDA,EAAG,WAAWA,EAAG,sBAAsBgR,EAAS,SAAShR,EAAG,WAAW,GAGvE,KAAK,oBAAoBA,EAAG,aAAA,GAC5BA,EAAG,WAAWA,EAAG,cAAc,KAAK,iBAAiB,GACrDA,EAAG,WAAWA,EAAG,cAAciR,IAAe,IAAI,GAAGjR,EAAG,YAAY,GAGpE,KAAK,sBAAsBA,EAAG,aAAA,GAC9BA,EAAG,WAAWA,EAAG,cAAc,KAAK,mBAAmB,GACvDA,EAAG,WAAWA,EAAG,cAAciR,IAAe,GAAGjR,EAAG,YAAY,GAGhE,KAAK,sBAAsBA,EAAG,aAAA,GAC9BA,EAAG,WAAWA,EAAG,cAAc,KAAK,mBAAmB,GACvDA,EAAG,WAAWA,EAAG,cAAciR,IAAe,IAAI,GAAGjR,EAAG,YAAY,GAEpEA,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgBqF,GAA0B;AACxC,UAAM,EAAE,IAAArF,GAAI,cAAAiR,EAAA,IAAiB;AAE7B,SAAK,gBAAgB,KAAK,IAAI5L,EAAK,UAAU,SAAS,GAAG4L,CAAY,GAErEjR,EAAG,WAAWA,EAAG,cAAc,KAAK,iBAAiB,GACrDA,EAAG,cAAcA,EAAG,cAAc,GAAGqF,EAAK,SAAS,GAEnDrF,EAAG,WAAWA,EAAG,cAAc,KAAK,mBAAmB,GACvDA,EAAG,cAAcA,EAAG,cAAc,GAAGqF,EAAK,MAAM,GAEhDrF,EAAG,WAAWA,EAAG,cAAc,KAAK,mBAAmB,GACvDA,EAAG,cAAcA,EAAG,cAAc,GAAGqF,EAAK,MAAM;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAOzE,GAAgC;AACrC,UAAM,EAAE,IAAAZ,GAAI,UAAAgR,GAAU,eAAAE,EAAA,IAAkB;AAExC,QAAIA,MAAkB,EAAG;AAEzB,IAAAlR,EAAG,gBAAgB,KAAK,GAAG;AAG3B,UAAMgE,IAASpD,EAAQ,WAAW;AAClC,IAAIoD,KAAU,MACZhE,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,wBAAwBgE,CAAM,GACjChE,EAAG,oBAAoBgE,GAAQ,GAAGhE,EAAG,OAAO,IAAO,GAAG,CAAC,GACvDA,EAAG,oBAAoBgE,GAAQ,CAAC;AAIlC,UAAMmN,IAAiBvQ,EAAQ,WAAW;AAC1C,IAAIuQ,KAAkB,MACpBnR,EAAG,WAAWA,EAAG,cAAc,KAAK,iBAAiB,GACrDA,EAAG,wBAAwBmR,CAAc,GACzCnR,EAAG,oBAAoBmR,GAAgB,GAAGnR,EAAG,OAAO,IAAO,GAAG,CAAC,GAC/DA,EAAG,oBAAoBmR,GAAgB,CAAC;AAI1C,UAAMC,IAAWxQ,EAAQ,WAAW;AACpC,IAAIwQ,KAAY,MACdpR,EAAG,WAAWA,EAAG,cAAc,KAAK,mBAAmB,GACvDA,EAAG,wBAAwBoR,CAAQ,GACnCpR,EAAG,oBAAoBoR,GAAU,GAAGpR,EAAG,OAAO,IAAO,GAAG,CAAC,GACzDA,EAAG,oBAAoBoR,GAAU,CAAC;AAIpC,UAAMnN,IAAWrD,EAAQ,WAAW;AACpC,IAAIqD,KAAY,MACdjE,EAAG,WAAWA,EAAG,cAAc,KAAK,mBAAmB,GACvDA,EAAG,wBAAwBiE,CAAQ,GACnCjE,EAAG,oBAAoBiE,GAAU,GAAGjE,EAAG,OAAO,IAAO,GAAG,CAAC,GACzDA,EAAG,oBAAoBiE,GAAU,CAAC,IAIpCjE,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GACvDA,EAAG;AAAA,MACDA,EAAG;AAAA,MACHgR,EAAS;AAAA,MACThR,EAAG;AAAA,MACH;AAAA,MACAkR;AAAA,IAAA,GAGFlR,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,mBAA2B;AACzB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,UAAM,EAAE,IAAAA,MAAO;AAEf,IAAI,KAAK,OAAKA,EAAG,kBAAkB,KAAK,GAAG,GACvC,KAAK,kBAAgBA,EAAG,aAAa,KAAK,cAAc,GACxD,KAAK,eAAaA,EAAG,aAAa,KAAK,WAAW,GAClD,KAAK,qBAAmBA,EAAG,aAAa,KAAK,iBAAiB,GAC9D,KAAK,uBAAqBA,EAAG,aAAa,KAAK,mBAAmB,GAClE,KAAK,uBAAqBA,EAAG,aAAa,KAAK,mBAAmB,GAEtE,KAAK,MAAM,MACX,KAAK,iBAAiB,MACtB,KAAK,cAAc,MACnB,KAAK,oBAAoB,MACzB,KAAK,sBAAsB,MAC3B,KAAK,sBAAsB;AAAA,EAC7B;AACF;AC9HO,MAAMqR,GAAiB;AAAA,EAwC5B,YAAY1V,GAAkC;AAvCtC,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,cAAsB;AAEtB,IAAAA,EAAA,yBAAoD,CAAC,MAAM,MAAM,KAAK,CAAC;AACvE,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA,sBAAoC;AACpC,IAAAA,EAAA,gBAA0B;AAE1B,IAAAA,EAAA,0BAAkC;AAClC,IAAAA,EAAA;AACA,IAAAA,EAAA,qBAAc;AAEd,IAAAA,EAAA,4CAAgE,IAAA;AAGhE;AAAA,IAAAA,EAAA,iBAA4B;AAC5B,IAAAA,EAAA;AACA,IAAAA,EAAA,sBAAe;AACf,IAAAA,EAAA,8BAAyD;AACzD,IAAAA,EAAA,+BAA6C;AAG7C;AAAA,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,aAAM;AACN,IAAAA,EAAA,uBAAgB;AAGhB;AAAA,IAAAA,EAAA;AAgKA,IAAAA,EAAA,sBAAe,MAAY;AACjC,WAAK,OAAA,GACL,KAAK,cAAc,IACnB,KAAK,UAAU,QAAQ;AAAA,IACzB;Ab1PF,QAAA6K,GAAAC,GAAA4K,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC;AayFI,SAAK,SAAShW,EAAQ,QACtB,KAAK,MAAM,OAAO,oBAAoB,GACtC,KAAK,aAAaA,EAAQ,cAAc,IACxC,KAAK,WAAWA,EAAQ,YAAY,IAEhCA,EAAQ,oBACV,KAAK,kBAAkBA,EAAQ,kBAIjC,KAAK,aAAakR,EAAYlR,EAAQ,SAAS,CAAA,GAAI,KAAK,eAAe,GAGvE,KAAK,QAAQ;AAAA,MACX,WAAS8K,IAAA9K,EAAQ,UAAR,gBAAA8K,EAAe,YAAW;AAAA,MACnC,gBAAcC,IAAA/K,EAAQ,UAAR,gBAAA+K,EAAe,iBAAgB,KAAK,WAAW,cAAc,CAAC;AAAA,MAC5E,gBAAc4K,IAAA3V,EAAQ,UAAR,gBAAA2V,EAAe,iBAAgB;AAAA,MAC7C,YAAUC,IAAA5V,EAAQ,UAAR,gBAAA4V,EAAe,aAAY;AAAA,MACrC,gBAAcC,IAAA7V,EAAQ,UAAR,gBAAA6V,EAAe,iBAAgB;AAAA,MAC7C,kBAAgBC,IAAA9V,EAAQ,UAAR,gBAAA8V,EAAe,mBAAkB;AAAA,MACjD,kBAAgBC,IAAA/V,EAAQ,UAAR,gBAAA+V,EAAe,mBAAkB,CAAC,GAAG,GAAG,CAAC;AAAA,MACzD,WAASC,IAAAhW,EAAQ,UAAR,gBAAAgW,EAAe,YAAW;AAAA,IAAA;AAIrC,UAAM3R,IAAK,KAAK,OAAO,WAAW,UAAU;AAAA,MAC1C,OAAO;AAAA,MACP,WAAWrE,EAAQ,aAAa;AAAA,MAChC,uBAAuBA,EAAQ,yBAAyB;AAAA,MACxD,iBAAiBA,EAAQ,mBAAmB;AAAA,IAAA,CAC7C;AAED,QAAI,CAACqE;AACH,YAAM,IAAI,MAAM,sBAAsB;AAGxC,SAAK,KAAKA,GAGVA,EAAG,OAAOA,EAAG,UAAU,GACvBA,EAAG,UAAUA,EAAG,MAAM,GACtBA,EAAG,OAAOA,EAAG,KAAK,GAClBA,EAAG,UAAUA,EAAG,WAAWA,EAAG,mBAAmB,GAGjD,KAAK,WAAWgB,EAAsBhB,CAAE;AAGxC,UAAMgR,IAAW,KAAK,eAAA;AA+BtB,QA5BA,KAAK,OAAO,IAAID,GAAc/Q,GAAI;AAAA,MAChC,UAAAgR;AAAA,MACA,cAAcrV,EAAQ,gBAAgB;AAAA,IAAA,CACvC,GAGD,KAAK,SAAS,IAAID,EAAYC,EAAQ,MAAM,GAG5C,KAAK,aAAa,IAAI+B;AAAA,MACpB,KAAK;AAAA,MACL,KAAK;AAAA,MACL/B,EAAQ;AAAA,IAAA,GAIV,KAAK,WAAW,SAAS,MAAM;AAC7B,WAAK,cAAc,IACnB,KAAK,UAAU,cAAc;AAAA,IAC/B,CAAC,GAGG,KAAK,aACP,KAAK,OAAO,IAAIwG,EAAO,KAAK,IAAIxG,EAAQ,IAAI,IAI9C,KAAK,gBAAgBA,EAAQ,iBAAiB,IAC1C,KAAK,eAAe;AACtB,YAAMiW,IAAmC;AAAA,QACvC,GAAGjW,EAAQ;AAAA,QACX,WAAWA,EAAQ;AAAA,MAAA;AAErB,WAAK,UAAU,IAAIwJ,EAAU,KAAK,OAAO,iBAAiB,SAAS,MAAMyM,CAAc,GAGvF,KAAK,uBAAuB,KAAK,gBAAgB,KAAK,IAAI,GAC1D,KAAK,wBAAwB,KAAK,iBAAiB,KAAK,IAAI,GAC5D,KAAK,OAAO,iBAAiB,aAAa,KAAK,oBAAoB,GACnE,KAAK,OAAO,iBAAiB,cAAc,KAAK,qBAAqB;AAAA,IACvE;AAGA,SAAK,OAAA,GACL,OAAO,iBAAiB,UAAU,KAAK,YAAY,GAG/C,KAAK,cACP,KAAK,gBAAA;AAAA,EAET;AAAA,EAEQ,gBAAgB,GAAqB;AAC3C,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,aAAc;AAEzC,UAAMjL,IAAO,KAAK,OAAO,sBAAA,GACnBhN,IAAI,EAAE,UAAUgN,EAAK,MACrB/M,IAAI,EAAE,UAAU+M,EAAK,KAErBC,IAAM,KAAK,aAAajN,GAAGC,CAAC;AAElC,QAAIgN;AACF,UAAIA,EAAI,UAAU,KAAK,cAAc;AACnC,aAAK,eAAeA,EAAI;AAExB,cAAMC,IAAa,KAAK,cAAcD,EAAI,KAAK;AAC/C,QAAIC,MACF,KAAK,QAAQ,KAAK;AAAA,UAChB,OAAOD,EAAI;AAAA,UACX,UAAUC,EAAW;AAAA,UACrB,OAAOA,EAAW;AAAA,UAClB,OAAOA,EAAW;AAAA,QAAA,GACjBlN,GAAGC,CAAC,GAEP,KAAK,UAAU,OAAO;AAAA,MAE1B;AACE,aAAK,QAAQ,eAAeD,GAAGC,CAAC;AAAA;AAGlC,MAAI,KAAK,iBAAiB,OACxB,KAAK,QAAQ,KAAA,GACb,KAAK,eAAe;AAAA,EAG1B;AAAA,EAEQ,mBAAyB;AAC/B,IAAI,KAAK,YACP,KAAK,QAAQ,KAAA,GACb,KAAK,eAAe;AAAA,EAExB;AAAA,EAEQ,iBAA+B;AACrC,YAAQ,KAAK,MAAM,UAAA;AAAA,MACjB,KAAK;AACH,eAAO0W,GAAe,IAAI,EAAE;AAAA,MAC9B,KAAK;AACH,eAAOO,GAAA;AAAA,MACT,KAAK;AAAA,MACL;AACE,eAAOvB,GAAgB,KAAK,MAAM,YAAY;AAAA,IAAA;AAAA,EAEpD;AAAA;AAAA;AAAA;AAAA,EAWA,SAAe;AACb,UAAM3I,IAAO,KAAK,OAAO,sBAAA,GACnBuG,IAAQvG,EAAK,QAAQ,KAAK,KAC1BwG,IAASxG,EAAK,SAAS,KAAK;AAElC,KAAI,KAAK,OAAO,UAAUuG,KAAS,KAAK,OAAO,WAAWC,OACxD,KAAK,OAAO,QAAQD,GACpB,KAAK,OAAO,SAASC,GACrB,KAAK,GAAG,SAAS,GAAG,GAAGD,GAAOC,CAAM,GACpC,KAAK,OAAO,UAAUD,IAAQC,CAAM;AAAA,EAExC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ9H,GAA0B;AAChC,UAAMvB,IAAQuB,EAAK,UAAU,SAAS,GAGhC+D,IAAS/D,EAAK,UAAU,IAAI,aAAavB,CAAK,EAAE,KAAK,KAAK,MAAM,YAAY;AAGlF,QAAIpB;AACJ,QAAI2C,EAAK;AACP,MAAA3C,IAAS2C,EAAK;AAAA,SACT;AACL,MAAA3C,IAAS,IAAI,aAAaoB,IAAQ,CAAC;AACnC,YAAM,CAACiC,GAAGC,GAAG1P,CAAC,IAAI,KAAK,MAAM;AAC7B,eAASyM,IAAI,GAAGA,IAAIe,GAAOf;AACzB,QAAAL,EAAOK,IAAI,CAAC,IAAIgD,GAChBrD,EAAOK,IAAI,IAAI,CAAC,IAAIiD,GACpBtD,EAAOK,IAAI,IAAI,CAAC,IAAIzM;AAAA,IAExB;AAEA,SAAK,eAAe;AAAA,MAClB,WAAW+O,EAAK;AAAA,MAChB,QAAA+D;AAAA,MACA,QAAA1G;AAAA,IAAA,GAIF,KAAK,SAAS,KAAK,gBAAgB2C,EAAK,SAAS,GAG7C,KAAK,QAAQ,KAAK,UACpB,KAAK,KAAK,aAAa,KAAK,MAAM,GAIpC,KAAK,KAAK,gBAAgB,KAAK,YAAY,GAE3C,KAAK,cAAc,IACnB,KAAK,UAAU,YAAY;AAAA,EAC7B;AAAA,EAEQ,gBAAgB5C,GAAmC;AACzD,QAAItF,IAAO,OAAUG,IAAO,QACxBF,IAAO,OAAUG,IAAO,QACxBF,IAAO,OAAUG,IAAO;AAE5B,aAASuF,IAAI,GAAGA,IAAIN,EAAU,QAAQM,KAAK,GAAG;AAC5C,YAAMpJ,IAAI8I,EAAUM,CAAC,GACfnJ,IAAI6I,EAAUM,IAAI,CAAC,GACnBlJ,IAAI4I,EAAUM,IAAI,CAAC;AAEzB,MAAIpJ,IAAIwD,MAAMA,IAAOxD,IACjBA,IAAI2D,MAAMA,IAAO3D,IACjBC,IAAIwD,MAAMA,IAAOxD,IACjBA,IAAI2D,MAAMA,IAAO3D,IACjBC,IAAIwD,MAAMA,IAAOxD,IACjBA,IAAI2D,MAAMA,IAAO3D;AAAA,IACvB;AAEA,WAAO,EAAE,MAAAsD,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,EAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAkB;AAChB,QAAI,KAAK,QAAQ;AACf,YAAM,EAAE,MAAAL,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,MAAS,KAAK,QAE9CR,IAAKM,IAAOH,GACZF,IAAKM,IAAOH,GACZF,IAAKM,IAAOH,GACZqR,IAAU;AAEhB,WAAK,OAAO;AAAA,QACVvR,IAAOH,IAAK0R;AAAA,QAAStR,IAAOH,IAAKyR;AAAA,QAASrR,IAAOH,IAAKwR;AAAA,QACtDpR,IAAON,IAAK0R;AAAA,QAASnR,IAAON,IAAKyR;AAAA,QAASlR,IAAON,IAAKwR;AAAA,MAAA,GAGxD,KAAK,OAAO,UAAU,MACtB,KAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAe;AACb,UAAM,EAAE,IAAA1O,GAAI,UAAA6R,GAAU,MAAAC,GAAM,QAAAnU,GAAQ,OAAAoU,GAAO,iBAAAnF,MAAoB,MAEzD+B,IAAY,YAAY,IAAA;AAW9B,QARA3O,EAAG;AAAA,MACD4M,EAAgB,CAAC;AAAA,MACjBA,EAAgB,CAAC;AAAA,MACjBA,EAAgB,CAAC;AAAA,MACjBA,EAAgB,CAAC;AAAA,IAAA,GAEnB5M,EAAG,MAAMA,EAAG,mBAAmBA,EAAG,gBAAgB,GAE9C,CAAC,KAAK,aAAc;AAGxB,UAAMoN,IAAWzP,EAAO,wBAAA;AAGxB,IAAI,KAAK,QACP,KAAK,KAAK,OAAOyP,CAAQ;AAK3B,UAAMxM,IAAUmR,EAAM,iBAClBF,EAAS,gBACTA,EAAS;AAQb,QANA7R,EAAG,WAAWY,EAAQ,OAAO,GAG7BZ,EAAG,iBAAiBY,EAAQ,SAAS,kBAAqB,IAAOwM,CAAQ,GACzEpN,EAAG,UAAUY,EAAQ,SAAS,WAAcmR,EAAM,OAAO,GAErDA,EAAM,gBAAgB;AACxB,YAAM,CAACC,GAAIC,GAAIC,CAAE,IAAIH,EAAM;AAC3B,MAAA/R,EAAG,UAAUY,EAAQ,SAAS,YAAeoR,GAAIC,GAAIC,CAAE,GACvDlS,EAAG,UAAUY,EAAQ,SAAS,WAAcmR,EAAM,OAAO;AAAA,IAC3D;AAGA,IAAAD,EAAK,OAAOlR,CAAO;AAGnB,UAAMiO,IAAY,YAAY,IAAA,IAAQF;AACtC,SAAK,gBAAgBE,GACrB,KAAK;AAEL,UAAMC,IAAM,YAAY,IAAA;AACxB,IAAIA,IAAM,KAAK,iBAAiB,QAC9B,KAAK,MAAM,KAAK,YAChB,KAAK,aAAa,GAClB,KAAK,gBAAgBA,IAGvB,KAAK,UAAU,QAAQ;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAwB;AACtB,QAAI,KAAK,qBAAqB,KAAM;AAEpC,UAAMC,IAAO,MAAY;AAEvB,YAAMxQ,IAAS,KAAK,WAAW,OAAA;AAE/B,OAAI,KAAK,eAAeA,OACtB,KAAK,OAAA,GACL,KAAK,cAAc,KAGrB,KAAK,mBAAmB,sBAAsBwQ,CAAI;AAAA,IACpD;AAEA,SAAK,mBAAmB,sBAAsBA,CAAI;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAuB;AACrB,IAAI,KAAK,qBAAqB,SAC5B,qBAAqB,KAAK,gBAAgB,GAC1C,KAAK,mBAAmB;AAAA,EAE5B;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAsB;AACpB,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,WAA0B;AACxB,WAAO;AAAA,MACL,eAAe,KAAK,KAAK,iBAAA;AAAA,MACzB,WAAW;AAAA,MACX,WAAW,KAAK;AAAA,MAChB,KAAK,KAAK;AAAA,IAAA;AAAA,EAEd;AAAA;AAAA;AAAA;AAAA,EAKA,YAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAiC;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,SAASgD,GAAqC;AAC5C,WAAO,OAAO,KAAK,OAAOA,CAAK,GAC/B,KAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmBhM,GAAWC,GAAW1P,GAAWF,IAAI,GAAS;AAC/D,SAAK,kBAAkB,CAAC2P,GAAGC,GAAG1P,GAAGF,CAAC,GAClC,KAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,GAAGoQ,GAAezI,GAAyC;AACzD,IAAK,KAAK,eAAe,IAAIyI,CAAK,KAChC,KAAK,eAAe,IAAIA,GAAO,oBAAI,KAAK,GAE1C,KAAK,eAAe,IAAIA,CAAK,EAAG,IAAIzI,CAAQ;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,IAAIyI,GAAezI,GAAyC;Ab/f9D,QAAA0I;AaggBI,KAAAA,IAAA,KAAK,eAAe,IAAID,CAAK,MAA7B,QAAAC,EAAgC,OAAO1I;AAAA,EACzC;AAAA,EAEQ,UAAUmC,GAAoB;AACpC,UAAMmP,IAAY,KAAK,eAAe,IAAInP,CAAI;AAC9C,QAAI,CAACmP,EAAW;AAEhB,UAAM7I,IAAyB;AAAA,MAC7B,MAAAtG;AAAA,MACA,WAAW,YAAY,IAAA;AAAA,MACvB,OAAO,KAAK,SAAA;AAAA,MACZ,QAAQ;AAAA,QACN,QAAQ,CAAC,GAAG,KAAK,OAAO,MAAM;AAAA,QAC9B,QAAQ,KAAK,OAAO;AAAA,QACpB,OAAO,KAAK,OAAO;AAAA,QACnB,KAAK,KAAK,OAAO;AAAA,QACjB,KAAK,KAAK,OAAO;AAAA,MAAA;AAAA,IACnB;AAGF,IAAAmP,EAAU,QAAQ,CAAAtR,MAAY;AAC5B,MAAAA,EAASyI,CAAK;AAAA,IAChB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAA4H;AAC1H,WAAK,KAAK,OACH,KAAK,KAAK,UAAA,IADM,CAAA;AAAA,EAEzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgBtC,GAAgF;AAC9F,QAAI,CAAC,KAAK,KAAM,QAAO,EAAE,GAAG,GAAG,GAAG,GAAG,SAAS,GAAA;AAE9C,UAAMkJ,IAAW,KAAK,OAAO,wBAAA,GACvBzG,IAAO,KAAK,OAAO,sBAAA;AAEzB,WAAO,KAAK,KAAK,gBAAgBzC,GAAUkJ,GAAUzG,EAAK,OAAOA,EAAK,MAAM;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA,EAKA,0BAAwC;AACtC,WAAO,KAAK,OAAO,wBAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAmD;AACjD,UAAMA,IAAO,KAAK,OAAO,sBAAA;AACzB,WAAO,EAAE,OAAOA,EAAK,OAAO,QAAQA,EAAK,OAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAsC;AACpC,UAAM,EAAE,IAAA3G,MAAO;AACf,WAAO;AAAA,MACL,UAAUA,EAAG,aAAaA,EAAG,QAAQ;AAAA,MACrC,QAAQA,EAAG,aAAaA,EAAG,MAAM;AAAA,MACjC,SAASA,EAAG,aAAaA,EAAG,OAAO;AAAA,MACnC,gBAAgBA,EAAG,aAAaA,EAAG,gBAAgB;AAAA,MACnD,kBAAkBA,EAAG,aAAaA,EAAG,kBAAkB;AAAA,MACvD,yBAAyBA,EAAG,aAAaA,EAAG,0BAA0B;AAAA,IAAA;AAAA,EAE1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAaiF,GAAiBC,GAAmC;AAC/D,QAAI,CAAC,KAAK,aAAc,QAAO;AAE/B,UAAM,EAAE,OAAAgI,GAAO,QAAAC,MAAW,KAAK,cAAA,GACzBC,IAAW,KAAK,OAAO,wBAAA,GAEvBvE,IAAMZ,EAAoBhD,GAASC,GAASgI,GAAOC,GAAQC,CAAQ;AAEzE,WAAOjE,EAAWN,GAAK,KAAK,aAAa,WAAW,KAAK,aAAa,MAAM;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU5D,GAAiBC,GAAwB;AACjD,UAAM,EAAE,OAAAgI,GAAO,QAAAC,MAAW,KAAK,cAAA,GACzBC,IAAW,KAAK,OAAO,wBAAA;AAC7B,WAAOnF,EAAoBhD,GAASC,GAASgI,GAAOC,GAAQC,CAAQ;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc+E,GAA8G;AAC1H,QAAI,CAAC,KAAK,gBAAgBA,IAAQ,KAAKA,KAAS,KAAK,aAAa,OAAO;AACvE,aAAO;AAGT,UAAMC,IAAKD,IAAQ;AACnB,WAAO;AAAA,MACL,UAAU;AAAA,QACR,KAAK,aAAa,UAAUC,CAAE;AAAA,QAC9B,KAAK,aAAa,UAAUA,IAAK,CAAC;AAAA,QAClC,KAAK,aAAa,UAAUA,IAAK,CAAC;AAAA,MAAA;AAAA,MAEpC,OAAO;AAAA,QACL,KAAK,aAAa,OAAOA,CAAE;AAAA,QAC3B,KAAK,aAAa,OAAOA,IAAK,CAAC;AAAA,QAC/B,KAAK,aAAa,OAAOA,IAAK,CAAC;AAAA,MAAA;AAAA,MAEjC,OAAO,KAAK,aAAa,OAAOD,CAAK;AAAA,IAAA;AAAA,EAEzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YACEnD,IAAkC,OAClCC,IAAU,MACVC,IAAc,IACN;AAER,UAAMC,IAAU,CAAC,GAAG,KAAK,eAAe;AAGxC,IAAID,KAAeF,MAAW,UAC5B,KAAK,kBAAkB,CAAC,GAAG,GAAG,GAAG,CAAC,IAIpC,KAAK,OAAA,GAGL,KAAK,kBAAkBG;AAGvB,UAAMC,IAAW,SAASJ,CAAM;AAChC,WAAO,KAAK,OAAO,UAAUI,GAAUH,CAAO;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,gBACJD,IAAkC,OAClCC,IAAU,MACY;AACtB,WAAO,IAAI,QAAQ,CAACoD,MAAY;AAC9B,WAAK,OAAA;AACL,YAAMjD,IAAW,SAASJ,CAAM;AAChC,WAAK,OAAO,OAAOqD,GAASjD,GAAUH,CAAO;AAAA,IAC/C,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cACEqD,IAAW,YACXtD,IAAkC,OAClCC,IAAU,MACJ;AACN,UAAMsD,IAAU,KAAK,YAAYvD,GAAQC,CAAO,GAC1CuD,IAAO,SAAS,cAAc,GAAG;AACvC,IAAAA,EAAK,WAAW,GAAGF,CAAQ,IAAItD,CAAM,IACrCwD,EAAK,OAAOD,GACZC,EAAK,MAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,SAAK,eAAA,GAEL,OAAO,oBAAoB,UAAU,KAAK,YAAY,GAGlD,KAAK,YACP,KAAK,QAAQ,QAAA,GACT,KAAK,wBACP,KAAK,OAAO,oBAAoB,aAAa,KAAK,oBAAoB,GAEpE,KAAK,yBACP,KAAK,OAAO,oBAAoB,cAAc,KAAK,qBAAqB,IAI5E,KAAK,WAAW,QAAA,GAChB,KAAK,KAAK,QAAA,GACVxQ,EAAoB,KAAK,IAAI,KAAK,QAAQ,GAEtC,KAAK,QACP,KAAK,KAAK,QAAA,GAGZ,KAAK,eAAe,MAAA;AAAA,EACtB;AACF;AC3qBO,MAAMyQ,GAAkB;AAAA,EAyD7B,YAAY9W,GAAmC;AAxDvC,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,cAAsB;AAGtB;AAAA,IAAAA,EAAA,iBAAyC;AACzC,IAAAA,EAAA,4BAAyC;AACzC,IAAAA,EAAA,0BAAuC;AACvC,IAAAA,EAAA,yBAAsC;AACtC,IAAAA,EAAA,yBAAsC;AACtC,IAAAA,EAAA,wBAAiB;AAGjB;AAAA,IAAAA,EAAA,mBAA2C;AAC3C,IAAAA,EAAA,8BAA2C;AAC3C,IAAAA,EAAA,4BAAyC;AACzC,IAAAA,EAAA,2BAAwC;AACxC,IAAAA,EAAA,2BAAwC;AACxC,IAAAA,EAAA,0BAAmB;AAEnB,IAAAA,EAAA,yBAAoD,CAAC,MAAM,MAAM,KAAK,CAAC;AACvE,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA,qBAAwC;AACxC,IAAAA,EAAA,gBAA0B;AAE1B,IAAAA,EAAA,0BAAkC;AAClC,IAAAA,EAAA,qBAAc;AAEd,IAAAA,EAAA,4CAAgE,IAAA;AAGhE;AAAA,IAAAA,EAAA,iBAA4B;AAC5B,IAAAA,EAAA;AACA,IAAAA,EAAA,sBAAuB;AACvB,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGA;AAAA,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,aAAM;AACN,IAAAA,EAAA,uBAAgB;AAGhB;AAAA,IAAAA,EAAA;AA8IA,IAAAA,EAAA,sBAAe,MAAY;AACjC,WAAK,OAAA,GACL,KAAK,cAAc;AAAA,IACrB;AA9IE,SAAK,SAASD,EAAQ,QACtB,KAAK,MAAM,OAAO,oBAAoB,GACtC,KAAK,WAAWA,EAAQ,YAAY,IACpC,KAAK,YAAYA,EAAQ,aAAa,MACtC,KAAK,YAAYA,EAAQ,aAAa,GACtC,KAAK,cAAcA,EAAQ,eAAe,IAC1C,KAAK,aAAaA,EAAQ,cAAc,GACxC,KAAK,gBAAgBA,EAAQ,iBAAiB,IAE1CA,EAAQ,oBACV,KAAK,kBAAkBA,EAAQ,kBAIjC,KAAK,aAAakR,EAAYlR,EAAQ,SAAS,CAAA,GAAI,KAAK,eAAe;AAGvE,UAAMqE,IAAK,KAAK,OAAO,WAAW,UAAU;AAAA,MAC1C,OAAO;AAAA,MACP,WAAW;AAAA,MACX,uBAAuB;AAAA,IAAA,CACxB;AAED,QAAI,CAACA;AACH,YAAM,IAAI,MAAM,sBAAsB;AAExC,SAAK,KAAKA,GAGVA,EAAG,OAAOA,EAAG,UAAU,GACvBA,EAAG,UAAUA,EAAG,MAAM,GAGtB,KAAK,WAAWgB,EAAsBhB,CAAE,GAGxC,KAAK,YAAA,GAGL,KAAK,SAAS,IAAItE,EAAYC,EAAQ,MAAM,GAG5C,KAAK,aAAa,IAAI+B,EAAgB,KAAK,QAAQ,KAAK,QAAQ/B,EAAQ,QAAQ,GAChF,KAAK,WAAW,SAAS,MAAM;AAC7B,WAAK,cAAc,IACnB,KAAK,UAAU,cAAc;AAAA,IAC/B,CAAC,GAGG,KAAK,aACP,KAAK,OAAO,IAAIwG,EAAOnC,GAAIrE,EAAQ,IAAI,IAIrC,KAAK,kBACP,KAAK,UAAU,IAAIwJ,EAAU,KAAK,OAAO,iBAAiB,SAAS,MAAMxJ,EAAQ,OAAO,GAExF,KAAK,uBAAuB,KAAK,gBAAgB,KAAK,IAAI,GAC1D,KAAK,wBAAwB,KAAK,iBAAiB,KAAK,IAAI,GAC5D,KAAK,OAAO,iBAAiB,aAAa,KAAK,oBAAoB,GACnE,KAAK,OAAO,iBAAiB,cAAc,KAAK,qBAAqB,IAIvE,KAAK,OAAA,GACL,OAAO,iBAAiB,UAAU,KAAK,YAAY,GAGnD,KAAK,gBAAA;AAAA,EACP;AAAA,EAEQ,gBAAgB,GAAqB;AAC3C,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,YAAa;AAExC,UAAMgL,IAAO,KAAK,OAAO,sBAAA,GACnBhN,IAAI,EAAE,UAAUgN,EAAK,MACrB/M,IAAI,EAAE,UAAU+M,EAAK,KAErBC,IAAM,KAAK,aAAajN,GAAGC,CAAC;AAElC,QAAIgN;AACF,UAAIA,EAAI,UAAU,KAAK,cAAc;AACnC,aAAK,eAAeA,EAAI;AACxB,cAAMwL,IAAKxL,EAAI,QAAQ,GACjB3D,IAAkC,KAAK,YAAY,SACrD,CAAC,KAAK,YAAY,OAAOmP,CAAE,GAAG,KAAK,YAAY,OAAOA,IAAG,CAAC,GAAG,KAAK,YAAY,OAAOA,IAAG,CAAC,CAAC,IACzF,KAAK,YAAY,SAAS,CAAC,KAAK,KAAK,CAAG;AAE7C,aAAK,QAAQ,KAAK;AAAA,UAChB,OAAOxL,EAAI;AAAA,UACX,UAAU,CAAC,KAAK,YAAY,EAAEA,EAAI,KAAK,GAAG,KAAK,YAAY,EAAEA,EAAI,KAAK,GAAG,KAAK,YAAY,EAAEA,EAAI,KAAK,CAAC;AAAA,UACtG,OAAA3D;AAAA,QAAA,GACCtJ,GAAGC,CAAC;AAAA,MACT;AACE,aAAK,QAAQ,eAAeD,GAAGC,CAAC;AAAA;AAGlC,MAAI,KAAK,iBAAiB,OACxB,KAAK,QAAQ,KAAA,GACb,KAAK,eAAe;AAAA,EAG1B;AAAA,EAEQ,mBAAyB;AAC/B,IAAI,KAAK,YACP,KAAK,QAAQ,KAAA,GACb,KAAK,eAAe;AAAA,EAExB;AAAA,EAEA,aAAaqL,GAAiBC,GAAiB;AAC7C,QAAI,CAAC,KAAK,YAAa,QAAO;AAE9B,UAAM,EAAE,OAAAgI,GAAO,QAAAC,MAAW,KAAK,cAAA,GACzBC,IAAW,KAAK,OAAO,wBAAA,GACvBvE,IAAMZ,EAAoBhD,GAASC,GAASgI,GAAOC,GAAQC,CAAQ;AAEzE,WAAOf,GAAYxD,GAAK,KAAK,aAAa,KAAK,YAAY,CAAC;AAAA,EAC9D;AAAA,EAEQ,cAAoB;AAC1B,UAAM,EAAE,IAAA7I,MAAO;AAGf,SAAK,UAAUA,EAAG,kBAAA,GAClB,KAAK,qBAAqBA,EAAG,aAAA,GAC7B,KAAK,mBAAmBA,EAAG,aAAA,GAC3B,KAAK,kBAAkBA,EAAG,aAAA,GAC1B,KAAK,kBAAkBA,EAAG,aAAA,GAG1B,KAAK,YAAYA,EAAG,kBAAA,GACpB,KAAK,uBAAuBA,EAAG,aAAA,GAC/B,KAAK,qBAAqBA,EAAG,aAAA,GAC7B,KAAK,oBAAoBA,EAAG,aAAA,GAC5B,KAAK,oBAAoBA,EAAG,aAAA;AAAA,EAC9B;AAAA,EAOA,SAAe;AACb,UAAM,EAAE,QAAAqN,GAAQ,IAAArN,GAAI,KAAAsN,GAAK,QAAA3P,MAAW,MAE9BuP,IAAQG,EAAO,aACfF,IAASE,EAAO;AAEtB,IAAAA,EAAO,QAAQH,IAAQI,GACvBD,EAAO,SAASF,IAASG,GAEzBtN,EAAG,SAAS,GAAG,GAAGqN,EAAO,OAAOA,EAAO,MAAM,GAC7C1P,EAAO,SAASuP,IAAQC;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ9H,GAA+B;AACrC,SAAK,cAAcA,GACnB,KAAK,cAAA,GACL,KAAK,gBAAA,GAED,KAAK,QAAQ,KAAK,UACpB,KAAK,KAAK,aAAa,KAAK,MAAM,GAGpC,KAAK,cAAc,IACnB,KAAK,UAAU,YAAY;AAAA,EAC7B;AAAA,EAEQ,gBAAsB;AAC5B,IAAK,KAAK,gBAEV,KAAK,kBAAA,GACD,KAAK,eACP,KAAK,oBAAA;AAAA,EAET;AAAA,EAEQ,oBAA0B;AAChC,UAAM,EAAE,IAAArF,GAAI,WAAA0S,GAAW,WAAAC,GAAW,aAAAC,MAAgB;AAClD,QAAI,CAACA,EAAa;AAElB,UAAM9O,IAAQ8O,EAAY,EAAE,QACtB5E,IAAe4E,EAAY,SAAS,KAAK,WAAW,cAAc,CAAC,GACnEtG,IAAQsG,EAAY,SAAS,GAE7BrF,IAAyB,CAAA,GACzBC,IAAuB,CAAA,GACvBC,IAAsB,CAAA,GACtBC,IAAuB,CAAA;AAC7B,QAAIC,IAAe;AAEnB,aAAS5K,IAAI,GAAGA,IAAIe,GAAOf,KAAK;AAC9B,YAAMpJ,IAAIiZ,EAAY,EAAE7P,CAAC,GACnBnJ,IAAIgZ,EAAY,EAAE7P,CAAC,GACnBlJ,IAAI+Y,EAAY,EAAE7P,CAAC,GAEnBgD,IAAI6M,EAAY,SAASA,EAAY,OAAO7P,IAAI,CAAC,IAAIiL,EAAa,CAAC,GACnEhI,IAAI4M,EAAY,SAASA,EAAY,OAAO7P,IAAI,IAAI,CAAC,IAAIiL,EAAa,CAAC,GACvE1X,IAAIsc,EAAY,SAASA,EAAY,OAAO7P,IAAI,IAAI,CAAC,IAAIiL,EAAa,CAAC;AAI7E,eAAS/T,IAAI,GAAGA,KAAK0Y,GAAW1Y,KAAK;AACnC,cAAM4Y,IAAS5Y,IAAI0Y,IAAa,KAAK,KAAK,GACpCG,IAAM,KAAK,IAAID,CAAK,GACpBE,IAAM,KAAK,IAAIF,CAAK,GAEpBG,IAAKF,IAAMJ,GACXO,IAAKF,IAAML;AAGjB,QAAAnF,EAAa,KAAK5T,IAAIqZ,GAAI1G,GAAOzS,IAAIoZ,CAAE,GACvCzF,EAAW,KAAKsF,GAAK,GAAGC,CAAG,GAC3BtF,EAAU,KAAK1H,IAAI,KAAKC,IAAI,KAAK1P,IAAI,GAAG,GAGxCiX,EAAa,KAAK5T,IAAIqZ,GAAIpZ,GAAGC,IAAIoZ,CAAE,GACnCzF,EAAW,KAAKsF,GAAK,GAAGC,CAAG,GAC3BtF,EAAU,KAAK1H,GAAGC,GAAG1P,CAAC;AAAA,MACxB;AAGA,eAAS2D,IAAI,GAAGA,IAAI0Y,GAAW1Y,KAAK;AAClC,cAAMiZ,IAAKvF,IAAe1T,IAAI,GACxBkZ,IAAKD,IAAK,GACVE,IAAKF,IAAK,GACVG,IAAKF,IAAK;AAEhB,QAAAzF,EAAW,KAAKwF,GAAIC,GAAIC,CAAE,GAC1B1F,EAAW,KAAK0F,GAAID,GAAIE,CAAE;AAAA,MAC5B;AAEA,MAAA1F,MAAiBgF,IAAY,KAAK;AAAA,IACpC;AAGA,UAAMlQ,IAAY,IAAI,aAAa8K,CAAY,GACzCiB,IAAU,IAAI,aAAahB,CAAU,GACrC9K,IAAS,IAAI,aAAa+K,CAAS,GACnCgB,IAAU,IAAI,YAAYf,CAAU;AAE1C,SAAK,iBAAiBe,EAAQ,QAE9BzO,EAAG,WAAWA,EAAG,cAAc,KAAK,kBAAkB,GACtDA,EAAG,WAAWA,EAAG,cAAcyC,GAAWzC,EAAG,YAAY,GAEzDA,EAAG,WAAWA,EAAG,cAAc,KAAK,gBAAgB,GACpDA,EAAG,WAAWA,EAAG,cAAcwO,GAASxO,EAAG,YAAY,GAEvDA,EAAG,WAAWA,EAAG,cAAc,KAAK,eAAe,GACnDA,EAAG,WAAWA,EAAG,cAAc0C,GAAQ1C,EAAG,YAAY,GAEtDA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,eAAe,GAC3DA,EAAG,WAAWA,EAAG,sBAAsByO,GAASzO,EAAG,WAAW;AAAA,EAChE;AAAA,EAEQ,sBAA4B;AAClC,UAAM,EAAE,IAAAA,GAAI,WAAA0S,GAAW,YAAAY,GAAY,aAAAV,MAAgB;AACnD,QAAI,CAACA,EAAa;AAElB,UAAM9O,IAAQ8O,EAAY,EAAE,QACtB5E,IAAe4E,EAAY,SAAS,KAAK,WAAW,cAAc,CAAC,GACnEnW,IAASiW,IAAYY,GAGrB/F,IAAyB,CAAA,GACzBC,IAAuB,CAAA,GACvBC,IAAsB,CAAA,GACtBC,IAAuB,CAAA;AAC7B,QAAIC,IAAe;AAGnB,UAAM4F,IAAW;AAAA,MACf,CAAC,GAAG,GAAG,CAAC;AAAA,MAAG,CAAC,GAAG,GAAG,CAAC;AAAA,MAAG,CAAC,GAAG,GAAG,CAAC;AAAA,MAC9B,CAAC,IAAI,GAAG,CAAC;AAAA,MAAG,CAAC,GAAG,GAAG,EAAE;AAAA,MAAG,CAAC,GAAG,IAAI,CAAC;AAAA,IAAA,GAE7BC,IAAW;AAAA,MACf,CAAC,GAAG,GAAG,CAAC;AAAA,MAAG,CAAC,GAAG,GAAG,CAAC;AAAA,MAAG,CAAC,GAAG,GAAG,CAAC;AAAA,MAAG,CAAC,GAAG,GAAG,CAAC;AAAA,MACzC,CAAC,GAAG,GAAG,CAAC;AAAA,MAAG,CAAC,GAAG,GAAG,CAAC;AAAA,MAAG,CAAC,GAAG,GAAG,CAAC;AAAA,MAAG,CAAC,GAAG,GAAG,CAAC;AAAA,IAAA;AAG3C,aAASzQ,IAAI,GAAGA,IAAIe,GAAOf,KAAK;AAC9B,YAAMpJ,IAAIiZ,EAAY,EAAE7P,CAAC,GACnBnJ,IAAIgZ,EAAY,EAAE7P,CAAC,GACnBlJ,IAAI+Y,EAAY,EAAE7P,CAAC,GAEnBgD,IAAI6M,EAAY,SAASA,EAAY,OAAO7P,IAAI,CAAC,IAAIiL,EAAa,CAAC,GACnEhI,IAAI4M,EAAY,SAASA,EAAY,OAAO7P,IAAI,IAAI,CAAC,IAAIiL,EAAa,CAAC,GACvE1X,IAAIsc,EAAY,SAASA,EAAY,OAAO7P,IAAI,IAAI,CAAC,IAAIiL,EAAa,CAAC;AAG7E,iBAAW,CAACgF,GAAIS,GAAIR,CAAE,KAAKM;AACzB,QAAAhG,EAAa,KAAK5T,IAAIqZ,IAAKvW,GAAQ7C,IAAI6Z,IAAKhX,GAAQ5C,IAAIoZ,IAAKxW,CAAM,GACnE+Q,EAAW,KAAKwF,GAAIS,GAAIR,CAAE,GAC1BxF,EAAU,KAAK1H,GAAGC,GAAG1P,CAAC;AAIxB,iBAAW,CAACF,GAAGqB,GAAIyC,CAAC,KAAKsZ;AACvB,QAAA9F,EAAW,KAAKC,IAAevX,GAAGuX,IAAelW,GAAIkW,IAAezT,CAAC;AAGvE,MAAAyT,KAAgB;AAAA,IAClB;AAGA,UAAMlL,IAAY,IAAI,aAAa8K,CAAY,GACzCiB,IAAU,IAAI,aAAahB,CAAU,GACrC9K,IAAS,IAAI,aAAa+K,CAAS,GACnCgB,IAAU,IAAI,YAAYf,CAAU;AAE1C,SAAK,mBAAmBe,EAAQ,QAEhCzO,EAAG,WAAWA,EAAG,cAAc,KAAK,oBAAoB,GACxDA,EAAG,WAAWA,EAAG,cAAcyC,GAAWzC,EAAG,YAAY,GAEzDA,EAAG,WAAWA,EAAG,cAAc,KAAK,kBAAkB,GACtDA,EAAG,WAAWA,EAAG,cAAcwO,GAASxO,EAAG,YAAY,GAEvDA,EAAG,WAAWA,EAAG,cAAc,KAAK,iBAAiB,GACrDA,EAAG,WAAWA,EAAG,cAAc0C,GAAQ1C,EAAG,YAAY,GAEtDA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,iBAAiB,GAC7DA,EAAG,WAAWA,EAAG,sBAAsByO,GAASzO,EAAG,WAAW;AAAA,EAChE;AAAA,EAEQ,kBAAwB;AAC9B,QAAI,CAAC,KAAK,aAAa;AACrB,WAAK,SAAS;AACd;AAAA,IACF;AAEA,UAAMqF,IAAO,KAAK,aACZiH,IAAQjH,EAAK,SAAS;AAE5B,QAAIlI,IAAO,OAAUG,IAAO;AAC5B,UAAMF,IAAOkP;AACb,QAAI/O,IAAO,QACPF,IAAO,OAAUG,IAAO;AAE5B,aAASuF,IAAI,GAAGA,IAAIsC,EAAK,EAAE,QAAQtC;AACjC,MAAIsC,EAAK,EAAEtC,CAAC,IAAI5F,MAAMA,IAAOkI,EAAK,EAAEtC,CAAC,IACjCsC,EAAK,EAAEtC,CAAC,IAAIzF,MAAMA,IAAO+H,EAAK,EAAEtC,CAAC,IACjCsC,EAAK,EAAEtC,CAAC,IAAIxF,MAAMA,IAAO8H,EAAK,EAAEtC,CAAC,IACjCsC,EAAK,EAAEtC,CAAC,IAAI1F,MAAMA,IAAOgI,EAAK,EAAEtC,CAAC,IACjCsC,EAAK,EAAEtC,CAAC,IAAIvF,MAAMA,IAAO6H,EAAK,EAAEtC,CAAC;AAGvC,SAAK,SAAS,EAAE,MAAA5F,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,EAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,YAAkB;AAChB,QAAI,CAAC,KAAK,OAAQ;AAElB,UAAM,EAAE,MAAAL,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,MAAS,KAAK,QAG9CR,IAAKM,IAAOH,GACZF,IAAKM,IAAOH,GACZF,IAAKM,IAAOH,GACZqR,IAAU;AAEhB,SAAK,OAAO;AAAA,MACVvR,IAAOH,IAAK0R;AAAA,MAAStR,IAAOH,IAAKyR;AAAA,MAASrR,IAAOH,IAAKwR;AAAA,MACtDpR,IAAON,IAAK0R;AAAA,MAASnR,IAAON,IAAKyR;AAAA,MAASlR,IAAON,IAAKwR;AAAA,IAAA,GAIxD,KAAK,OAAO,UAAU,GAEtB,KAAK,cAAc;AAAA,EACrB;AAAA,EAEA,gBAAmD;AACjD,UAAM/H,IAAO,KAAK,OAAO,sBAAA;AACzB,WAAO,EAAE,OAAOA,EAAK,OAAO,QAAQA,EAAK,OAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,SAAe;AACb,UAAM,EAAE,IAAA3G,GAAI,QAAArC,GAAQ,iBAAAiP,EAAA,IAAoB,MAElC+B,IAAY,YAAY,IAAA;AAG9B,IAAA3O,EAAG;AAAA,MACD4M,EAAgB,CAAC;AAAA,MACjBA,EAAgB,CAAC;AAAA,MACjBA,EAAgB,CAAC;AAAA,MACjBA,EAAgB,CAAC;AAAA,IAAA,GAEnB5M,EAAG,MAAMA,EAAG,mBAAmBA,EAAG,gBAAgB;AAGlD,UAAMoN,IAAWzP,EAAO,wBAAA;AAGxB,IAAI,KAAK,QACP,KAAK,KAAK,OAAOyP,CAAQ;AAG3B,UAAMxM,IAAU,KAAK,SAAS;AAC9B,IAAAZ,EAAG,WAAWY,EAAQ,OAAO,GAE7BZ,EAAG,iBAAiBY,EAAQ,SAAS,kBAAqB,IAAOwM,CAAQ,GACzEpN,EAAG,UAAUY,EAAQ,SAAS,WAAc,CAAG,GAC/CZ,EAAG,UAAUY,EAAQ,SAAS,YAAe,GAAG,GAAG,CAAC,GACpDZ,EAAG,UAAUY,EAAQ,SAAS,WAAc,GAAG,GAG3C,KAAK,iBAAiB,KACxB,KAAK;AAAA,MACHA;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IAAA,GAKL,KAAK,eAAe,KAAK,mBAAmB,KAC9C,KAAK;AAAA,MACHA;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IAAA;AAKT,UAAMiO,IAAY,YAAY,IAAA,IAAQF;AACtC,SAAK,gBAAgBE,GACrB,KAAK;AAEL,UAAMC,IAAM,YAAY,IAAA;AACxB,IAAIA,IAAM,KAAK,iBAAiB,QAC9B,KAAK,MAAM,KAAK,YAChB,KAAK,aAAa,GAClB,KAAK,gBAAgBA,IAGvB,KAAK,UAAU,QAAQ;AAAA,EACzB;AAAA,EAEQ,cACNlO,GACAgD,GACA8P,GACA7P,GACA8P,GACAC,GACM;AACN,UAAM,EAAE,IAAA5T,MAAO,MAGTgE,IAASpD,EAAQ,WAAW;AAClC,IAAIoD,KAAU,KAAKJ,MACjB5D,EAAG,WAAWA,EAAG,cAAc4D,CAAS,GACxC5D,EAAG,wBAAwBgE,CAAM,GACjChE,EAAG,oBAAoBgE,GAAQ,GAAGhE,EAAG,OAAO,IAAO,GAAG,CAAC;AAIzD,UAAM4O,IAAYhO,EAAQ,WAAW;AACrC,IAAIgO,KAAa,KAAK8E,MACpB1T,EAAG,WAAWA,EAAG,cAAc0T,CAAY,GAC3C1T,EAAG,wBAAwB4O,CAAS,GACpC5O,EAAG,oBAAoB4O,GAAW,GAAG5O,EAAG,OAAO,IAAO,GAAG,CAAC;AAI5D,UAAMiE,IAAWrD,EAAQ,WAAW;AACpC,IAAIqD,KAAY,KAAKJ,MACnB7D,EAAG,WAAWA,EAAG,cAAc6D,CAAW,GAC1C7D,EAAG,wBAAwBiE,CAAQ,GACnCjE,EAAG,oBAAoBiE,GAAU,GAAGjE,EAAG,OAAO,IAAO,GAAG,CAAC,IAG3DA,EAAG,WAAWA,EAAG,sBAAsB2T,CAAW,GAClD3T,EAAG,aAAaA,EAAG,WAAW4T,GAAY5T,EAAG,cAAc,CAAC;AAAA,EAC9D;AAAA,EAEA,kBAAwB;AACtB,QAAI,KAAK,qBAAqB,KAAM;AAEpC,UAAM+O,IAAO,MAAY;AACvB,WAAK,WAAW,OAAA,GAEZ,KAAK,gBACP,KAAK,OAAA,GACL,KAAK,cAAc,KAGrB,KAAK,mBAAmB,sBAAsBA,CAAI;AAAA,IACpD;AAEA,IAAAA,EAAA;AAAA,EACF;AAAA,EAEA,iBAAuB;AACrB,IAAI,KAAK,qBAAqB,SAC5B,qBAAqB,KAAK,gBAAgB,GAC1C,KAAK,mBAAmB;AAAA,EAE5B;AAAA,EAEA,WAA0B;AdrnB5B,QAAAtI;AcsnBI,WAAO;AAAA,MACL,KAAK,KAAK;AAAA,MACV,iBAAeA,IAAA,KAAK,gBAAL,gBAAAA,EAAkB,EAAE,WAAU;AAAA,MAC7C,WAAW,KAAK;AAAA,MAChB,WAAW,KAAK,cAAc,IAAI;AAAA,IAAA;AAAA,EAEtC;AAAA,EAEA,YAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,gBAAgB;AACd,WAAK,KAAK,OACH,KAAK,KAAK,UAAA,IADM,CAAA;AAAA,EAEzB;AAAA,EAEA,0BAAwC;AACtC,WAAO,KAAK,OAAO,wBAAA;AAAA,EACrB;AAAA,EAEA,gBAAgBvC,GAAgF;AAC9F,QAAI,CAAC,KAAK,KAAM,QAAO,EAAE,GAAG,GAAG,GAAG,GAAG,SAAS,GAAA;AAC9C,UAAMyC,IAAO,KAAK,OAAO,sBAAA,GACnByG,IAAW,KAAK,OAAO,wBAAA;AAC7B,WAAO,KAAK,KAAK,gBAAgBlJ,GAAUkJ,GAAUzG,EAAK,OAAOA,EAAK,MAAM;AAAA,EAC9E;AAAA,EAEA,YACEqI,IAAkC,OAClCC,IAAU,MACVC,IAAc,IACN;AACR,UAAMC,IAAU,CAAC,GAAG,KAAK,eAAe;AACxC,IAAID,KAAeF,MAAW,UAC5B,KAAK,kBAAkB,CAAC,GAAG,GAAG,GAAG,CAAC,IAEpC,KAAK,OAAA,GACL,KAAK,kBAAkBG;AACvB,UAAMC,IAAW,SAASJ,CAAM;AAChC,WAAO,KAAK,OAAO,UAAUI,GAAUH,CAAO;AAAA,EAChD;AAAA,EAEA,GAAGzI,GAAezI,GAAyC;AACzD,IAAK,KAAK,eAAe,IAAIyI,CAAK,KAChC,KAAK,eAAe,IAAIA,GAAO,oBAAI,KAAK,GAE1C,KAAK,eAAe,IAAIA,CAAK,EAAG,IAAIzI,CAAQ;AAAA,EAC9C;AAAA,EAEA,IAAIyI,GAAezI,GAAyC;AdxqB9D,QAAA0I;AcyqBI,KAAAA,IAAA,KAAK,eAAe,IAAID,CAAK,MAA7B,QAAAC,EAAgC,OAAO1I;AAAA,EACzC;AAAA,EAEQ,UAAUmC,GAAoB;AACpC,UAAMmP,IAAY,KAAK,eAAe,IAAInP,CAAI;AAC9C,QAAI,CAACmP,EAAW;AAEhB,UAAM7I,IAAyB;AAAA,MAC7B,MAAAtG;AAAA,MACA,WAAW,YAAY,IAAA;AAAA,MACvB,OAAO,KAAK,SAAA;AAAA,MACZ,QAAQ;AAAA,QACN,QAAQ,CAAC,GAAG,KAAK,OAAO,MAAM;AAAA,QAC9B,QAAQ,KAAK,OAAO;AAAA,QACpB,OAAO,KAAK,OAAO;AAAA,QACnB,KAAK,KAAK,OAAO;AAAA,QACjB,KAAK,KAAK,OAAO;AAAA,MAAA;AAAA,IACnB;AAGF,IAAAmP,EAAU,QAAQ,CAAAtR,MAAYA,EAASyI,CAAK,CAAC;AAAA,EAC/C;AAAA,EAEA,UAAgB;AACd,SAAK,eAAA,GAEL,OAAO,oBAAoB,UAAU,KAAK,YAAY,GAElD,KAAK,YACP,KAAK,QAAQ,QAAA,GACT,KAAK,wBAAsB,KAAK,OAAO,oBAAoB,aAAa,KAAK,oBAAoB,GACjG,KAAK,yBAAuB,KAAK,OAAO,oBAAoB,cAAc,KAAK,qBAAqB;AAG1G,UAAM,EAAE,IAAAxG,MAAO;AAGf,IAAI,KAAK,WAASA,EAAG,kBAAkB,KAAK,OAAO,GAC/C,KAAK,sBAAoBA,EAAG,aAAa,KAAK,kBAAkB,GAChE,KAAK,oBAAkBA,EAAG,aAAa,KAAK,gBAAgB,GAC5D,KAAK,mBAAiBA,EAAG,aAAa,KAAK,eAAe,GAC1D,KAAK,mBAAiBA,EAAG,aAAa,KAAK,eAAe,GAG1D,KAAK,aAAWA,EAAG,kBAAkB,KAAK,SAAS,GACnD,KAAK,wBAAsBA,EAAG,aAAa,KAAK,oBAAoB,GACpE,KAAK,sBAAoBA,EAAG,aAAa,KAAK,kBAAkB,GAChE,KAAK,qBAAmBA,EAAG,aAAa,KAAK,iBAAiB,GAC9D,KAAK,qBAAmBA,EAAG,aAAa,KAAK,iBAAiB,GAElE,KAAK,WAAW,QAAA,GAChBgC,EAAoBhC,GAAI,KAAK,QAAQ,GAEjC,KAAK,QACP,KAAK,KAAK,QAAA,GAGZ,KAAK,eAAe,MAAA;AAAA,EACtB;AACF;AC1rBO,MAAM6T,GAAe;AAAA,EA4C1B,YAAYlY,GAAgC;AA3CpC,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,cAAsB;AAGtB;AAAA,IAAAA,EAAA,aAAqC;AACrC,IAAAA,EAAA,wBAAqC;AACrC,IAAAA,EAAA,sBAAmC;AACnC,IAAAA,EAAA,qBAAkC;AAClC,IAAAA,EAAA,qBAAkC;AAClC,IAAAA,EAAA,oBAAa;AAEb,IAAAA,EAAA,yBAAoD,CAAC,MAAM,MAAM,KAAK,CAAC;AACvE,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA,eAAsB,CAAA;AACtB,IAAAA,EAAA,gBAA0B;AAE1B,IAAAA,EAAA,0BAAkC;AAClC,IAAAA,EAAA,qBAAc;AAEd,IAAAA,EAAA,4CAAgE,IAAA;AAGhE;AAAA,IAAAA,EAAA,iBAA4B;AAC5B,IAAAA,EAAA;AACA,IAAAA,EAAA,sBAAyD;AACzD,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGA;AAAA,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,aAAM;AACN,IAAAA,EAAA,uBAAgB;AAwIhB,IAAAA,EAAA,sBAAe,MAAY;AACjC,WAAK,OAAA,GACL,KAAK,cAAc;AAAA,IACrB;AAxIE,SAAK,SAASD,EAAQ,QACtB,KAAK,MAAM,OAAO,oBAAoB,GACtC,KAAK,WAAWA,EAAQ,YAAY,IACpC,KAAK,YAAYA,EAAQ,aAAa,MACtC,KAAK,YAAYA,EAAQ,aAAa,GACtC,KAAK,gBAAgBA,EAAQ,iBAAiB,IAE1CA,EAAQ,oBACV,KAAK,kBAAkBA,EAAQ;AAIjC,UAAMqE,IAAK,KAAK,OAAO,WAAW,UAAU;AAAA,MAC1C,OAAO;AAAA,MACP,WAAW;AAAA,MACX,uBAAuB;AAAA,IAAA,CACxB;AAED,QAAI,CAACA;AACH,YAAM,IAAI,MAAM,sBAAsB;AAExC,SAAK,KAAKA,GAGVA,EAAG,OAAOA,EAAG,UAAU,GACvBA,EAAG,UAAUA,EAAG,MAAM,GAGtB,KAAK,WAAWgB,EAAsBhB,CAAE,GAGxC,KAAK,YAAA,GAGL,KAAK,SAAS,IAAItE,EAAYC,EAAQ,MAAM,GAG5C,KAAK,aAAa,IAAI+B,EAAgB,KAAK,QAAQ,KAAK,QAAQ/B,EAAQ,QAAQ,GAChF,KAAK,WAAW,SAAS,MAAM;AAC7B,WAAK,cAAc,IACnB,KAAK,UAAU,cAAc;AAAA,IAC/B,CAAC,GAGG,KAAK,aACP,KAAK,OAAO,IAAIwG,EAAOnC,GAAIrE,EAAQ,IAAI,IAIrC,KAAK,kBACP,KAAK,UAAU,IAAIwJ,EAAU,KAAK,OAAO,iBAAiB,SAAS,MAAMxJ,EAAQ,OAAO,GAExF,KAAK,uBAAuB,KAAK,gBAAgB,KAAK,IAAI,GAC1D,KAAK,wBAAwB,KAAK,iBAAiB,KAAK,IAAI,GAC5D,KAAK,OAAO,iBAAiB,aAAa,KAAK,oBAAoB,GACnE,KAAK,OAAO,iBAAiB,cAAc,KAAK,qBAAqB,IAIvE,KAAK,OAAA,GACL,OAAO,iBAAiB,UAAU,KAAK,YAAY,GAGnD,KAAK,gBAAA;AAAA,EACP;AAAA,EAEQ,gBAAgB,GAAqB;AAC3C,QAAI,CAAC,KAAK,WAAW,KAAK,MAAM,WAAW,EAAG;AAE9C,UAAMgL,IAAO,KAAK,OAAO,sBAAA,GACnBhN,IAAI,EAAE,UAAUgN,EAAK,MACrB/M,IAAI,EAAE,UAAU+M,EAAK,KAErBC,IAAM,KAAK,aAAajN,GAAGC,CAAC;AAElC,QAAIgN;AAKF,UAJc,CAAC,KAAK,gBACP,KAAK,aAAa,WAAWA,EAAI,eACjC,KAAK,aAAa,UAAUA,EAAI,YAElC;AACT,aAAK,eAAe,EAAE,QAAQA,EAAI,aAAa,OAAOA,EAAI,WAAA;AAC1D,cAAMuF,IAAO,KAAK,MAAMvF,EAAI,WAAW,GACjC3D,IAAQkJ,EAAK,SAAS,CAAC,KAAK,KAAK,CAAG;AAE1C,aAAK,QAAQ,KAAK;AAAA,UAChB,OAAOvF,EAAI;AAAA,UACX,UAAU,CAACuF,EAAK,EAAEvF,EAAI,UAAU,GAAGuF,EAAK,EAAEvF,EAAI,UAAU,GAAGuF,EAAK,EAAEvF,EAAI,UAAU,CAAC;AAAA,UACjF,OAAA3D;AAAA,UACA,YAAY,EAAE,QAAQ2D,EAAI,YAAA;AAAA,QAAY,GACrCjN,GAAGC,CAAC;AAAA,MACT;AACE,aAAK,QAAQ,eAAeD,GAAGC,CAAC;AAAA;AAGlC,MAAI,KAAK,iBACP,KAAK,QAAQ,KAAA,GACb,KAAK,eAAe;AAAA,EAG1B;AAAA,EAEQ,mBAAyB;AAC/B,IAAI,KAAK,YACP,KAAK,QAAQ,KAAA,GACb,KAAK,eAAe;AAAA,EAExB;AAAA,EAEA,aAAaqL,GAAiBC,GAAiB;AAC7C,QAAI,KAAK,MAAM,WAAW,EAAG,QAAO;AAEpC,UAAM,EAAE,OAAAgI,GAAO,QAAAC,MAAW,KAAK,cAAA,GACzBC,IAAW,KAAK,OAAO,wBAAA,GACvBvE,IAAMZ,EAAoBhD,GAASC,GAASgI,GAAOC,GAAQC,CAAQ;AAEzE,WAAOnB,EAASpD,GAAK,KAAK,OAAO,KAAK,YAAY,CAAC;AAAA,EACrD;AAAA,EAEQ,cAAoB;AAC1B,UAAM,EAAE,IAAA7I,MAAO;AAEf,SAAK,MAAMA,EAAG,kBAAA,GACdA,EAAG,gBAAgB,KAAK,GAAG,GAE3B,KAAK,iBAAiBA,EAAG,aAAA,GACzB,KAAK,eAAeA,EAAG,aAAA,GACvB,KAAK,cAAcA,EAAG,aAAA,GACtB,KAAK,cAAcA,EAAG,aAAA,GAEtBA,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAOA,SAAe;AACb,UAAM,EAAE,QAAAqN,GAAQ,IAAArN,GAAI,KAAAsN,GAAK,QAAA3P,MAAW,MAE9BuP,IAAQG,EAAO,aACfF,IAASE,EAAO;AAEtB,IAAAA,EAAO,QAAQH,IAAQI,GACvBD,EAAO,SAASF,IAASG,GAEzBtN,EAAG,SAAS,GAAG,GAAGqN,EAAO,OAAOA,EAAO,MAAM,GAC7C1P,EAAO,SAASuP,IAAQC;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQtH,GAAwC;AAC9C,SAAK,QAAQ,MAAM,QAAQA,CAAK,IAAIA,IAAQ,CAACA,CAAK,GAClD,KAAK,kBAAA,GACL,KAAK,gBAAA,GAED,KAAK,QAAQ,KAAK,UACpB,KAAK,KAAK,aAAa,KAAK,MAAM,GAGpC,KAAK,cAAc,IACnB,KAAK,UAAU,YAAY;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQsG,GAAwB;AAC9B,SAAK,MAAM,KAAKA,CAAI,GACpB,KAAK,kBAAA,GACL,KAAK,gBAAA,GAED,KAAK,QAAQ,KAAK,UACpB,KAAK,KAAK,aAAa,KAAK,MAAM,GAGpC,KAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACjB,SAAK,QAAQ,CAAA,GACb,KAAK,aAAa,GAClB,KAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,oBAA0B;AAChC,UAAM,EAAE,IAAAnM,GAAI,WAAA8T,GAAW,WAAAC,GAAW,OAAAlO,MAAU;AAE5C,QAAIA,EAAM,WAAW,GAAG;AACtB,WAAK,aAAa;AAClB;AAAA,IACF;AAEA,UAAM0H,IAAyB,CAAA,GACzBC,IAAuB,CAAA,GACvBC,IAAsB,CAAA,GACtBC,IAAuB,CAAA;AAC7B,QAAIC,IAAe;AAEnB,eAAWxB,KAAQtG,GAAO;AACxB,YAAMkI,IAAa5B,EAAK,EAAE;AAC1B,UAAI4B,IAAa,EAAG;AAEpB,YAAMC,IAAe7B,EAAK,SAAS,CAAC,KAAK,KAAK,CAAG;AAGjD,eAASpJ,IAAI,GAAGA,IAAIgL,GAAYhL,KAAK;AAEnC,cAAMiR,IAAK7H,EAAK,EAAEpJ,CAAC,GACbkR,IAAK9H,EAAK,EAAEpJ,CAAC,GACbmR,IAAK/H,EAAK,EAAEpJ,CAAC;AAGnB,YAAIoR,GAAYC,GAAYC;AAC5B,QAAItR,MAAM,KAERoR,IAAKhI,EAAK,EAAE,CAAC,IAAIA,EAAK,EAAE,CAAC,GACzBiI,IAAKjI,EAAK,EAAE,CAAC,IAAIA,EAAK,EAAE,CAAC,GACzBkI,IAAKlI,EAAK,EAAE,CAAC,IAAIA,EAAK,EAAE,CAAC,KAChBpJ,MAAMgL,IAAa,KAE5BoG,IAAKhI,EAAK,EAAEpJ,CAAC,IAAIoJ,EAAK,EAAEpJ,IAAI,CAAC,GAC7BqR,IAAKjI,EAAK,EAAEpJ,CAAC,IAAIoJ,EAAK,EAAEpJ,IAAI,CAAC,GAC7BsR,IAAKlI,EAAK,EAAEpJ,CAAC,IAAIoJ,EAAK,EAAEpJ,IAAI,CAAC,MAG7BoR,IAAKhI,EAAK,EAAEpJ,IAAI,CAAC,IAAIoJ,EAAK,EAAEpJ,IAAI,CAAC,GACjCqR,IAAKjI,EAAK,EAAEpJ,IAAI,CAAC,IAAIoJ,EAAK,EAAEpJ,IAAI,CAAC,GACjCsR,IAAKlI,EAAK,EAAEpJ,IAAI,CAAC,IAAIoJ,EAAK,EAAEpJ,IAAI,CAAC;AAInC,cAAMuR,IAAO,KAAK,KAAKH,IAAKA,IAAKC,IAAKA,IAAKC,IAAKA,CAAE;AAClD,QAAIC,IAAO,SACTH,KAAMG,GACNF,KAAME,GACND,KAAMC;AAKR,YAAI1b,IAAM,GAAGC,IAAM,GAAGC,IAAM;AAC5B,QAAI,KAAK,IAAIsb,CAAE,IAAI,SACjBxb,IAAM,GAAGC,IAAM,GAAGC,IAAM;AAI1B,YAAImV,IAAKmG,IAAKtb,IAAMub,IAAKxb,GACrBqV,IAAKmG,IAAKzb,IAAMub,IAAKrb,GACrBqV,IAAKgG,IAAKtb,IAAMub,IAAKxb;AACzB,cAAM2b,IAAO,KAAK,KAAKtG,IAAKA,IAAKC,IAAKA,IAAKC,IAAKA,CAAE;AAClD,QAAIoG,IAAO,SACTtG,KAAMsG,GACNrG,KAAMqG,GACNpG,KAAMoG;AAIR,cAAM/M,IAAK4M,IAAKjG,IAAKkG,IAAKnG,GACpBzG,KAAK4M,IAAKpG,IAAKkG,IAAKhG,GACpBzG,KAAKyM,IAAKjG,IAAKkG,IAAKnG;AAG1B,iBAAShU,IAAI,GAAGA,IAAI8Z,GAAW9Z,KAAK;AAClC,gBAAM4Y,IAAS5Y,IAAI8Z,IAAa,KAAK,KAAK,GACpCjB,IAAM,KAAK,IAAID,CAAK,GACpBE,IAAM,KAAK,IAAIF,CAAK,GAGpBG,KAAM/E,IAAK6E,IAAMtL,IAAKuL,KAAOe,GAC7BL,MAAMvF,IAAK4E,IAAMrL,KAAKsL,KAAOe,GAC7Bb,MAAM9E,IAAK2E,IAAMpL,KAAKqL,KAAOe;AAEnC,UAAAvG,EAAa,KAAKyG,IAAKhB,GAAIiB,IAAKR,IAAIS,IAAKjB,EAAE,GAC3CzF,EAAW,KAAKS,IAAK6E,IAAMtL,IAAKuL,GAAK7E,IAAK4E,IAAMrL,KAAKsL,GAAK5E,IAAK2E,IAAMpL,KAAKqL,CAAG,GAGzE5G,EAAK,SACPsB,EAAU;AAAA,YACRtB,EAAK,OAAOpJ,IAAI,CAAC;AAAA,YACjBoJ,EAAK,OAAOpJ,IAAI,IAAI,CAAC;AAAA,YACrBoJ,EAAK,OAAOpJ,IAAI,IAAI,CAAC;AAAA,UAAA,IAGvB0K,EAAU,KAAKO,EAAa,CAAC,GAAGA,EAAa,CAAC,GAAGA,EAAa,CAAC,CAAC;AAAA,QAEpE;AAGA,YAAIjL,IAAIgL,IAAa;AACnB,mBAAS9T,IAAI,GAAGA,IAAI8Z,GAAW9Z,KAAK;AAClC,kBAAMua,IAAU7G,IAAe5K,IAAIgR,IAAY9Z,GACzC2W,IAAOjD,IAAe5K,IAAIgR,KAAc9Z,IAAI,KAAK8Z,GACjDU,IAAcD,IAAUT,GACxBW,IAAW9D,IAAOmD;AAGxB,YAAArG,EAAW,KAAK8G,GAAS5D,GAAM6D,CAAW,GAC1C/G,EAAW,KAAKkD,GAAM8D,GAAUD,CAAW;AAAA,UAC7C;AAAA,MAEJ;AAEA,MAAA9G,KAAgBI,IAAagG;AAAA,IAC/B;AAGA,UAAMtR,IAAY,IAAI,aAAa8K,CAAY,GACzCiB,IAAU,IAAI,aAAahB,CAAU,GACrC9K,IAAS,IAAI,aAAa+K,CAAS,GACnCgB,IAAU,IAAI,YAAYf,CAAU;AAE1C,SAAK,aAAae,EAAQ,QAE1BzO,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,WAAWA,EAAG,cAAcyC,GAAWzC,EAAG,YAAY,GAEzDA,EAAG,WAAWA,EAAG,cAAc,KAAK,YAAY,GAChDA,EAAG,WAAWA,EAAG,cAAcwO,GAASxO,EAAG,YAAY,GAEvDA,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,WAAWA,EAAG,cAAc0C,GAAQ1C,EAAG,YAAY,GAEtDA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GACvDA,EAAG,WAAWA,EAAG,sBAAsByO,GAASzO,EAAG,WAAW;AAAA,EAChE;AAAA,EAEQ,kBAAwB;AAC9B,QAAI,KAAK,MAAM,WAAW,GAAG;AAC3B,WAAK,SAAS;AACd;AAAA,IACF;AAEA,QAAI7C,IAAO,OAAUG,IAAO,QACxBF,IAAO,OAAUG,IAAO,QACxBF,IAAO,OAAUG,IAAO;AAE5B,eAAW2O,KAAQ,KAAK;AACtB,eAASpJ,IAAI,GAAGA,IAAIoJ,EAAK,EAAE,QAAQpJ;AACjC,QAAIoJ,EAAK,EAAEpJ,CAAC,IAAI5F,MAAMA,IAAOgP,EAAK,EAAEpJ,CAAC,IACjCoJ,EAAK,EAAEpJ,CAAC,IAAIzF,MAAMA,IAAO6O,EAAK,EAAEpJ,CAAC,IACjCoJ,EAAK,EAAEpJ,CAAC,IAAI3F,MAAMA,IAAO+O,EAAK,EAAEpJ,CAAC,IACjCoJ,EAAK,EAAEpJ,CAAC,IAAIxF,MAAMA,IAAO4O,EAAK,EAAEpJ,CAAC,IACjCoJ,EAAK,EAAEpJ,CAAC,IAAI1F,MAAMA,IAAO8O,EAAK,EAAEpJ,CAAC,IACjCoJ,EAAK,EAAEpJ,CAAC,IAAIvF,MAAMA,IAAO2O,EAAK,EAAEpJ,CAAC;AAIzC,SAAK,SAAS,EAAE,MAAA5F,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,EAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,YAAkB;AAChB,QAAI,CAAC,KAAK,OAAQ;AAElB,UAAM,EAAE,MAAAL,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,MAAS,KAAK,QAG9CR,IAAKM,IAAOH,GACZF,IAAKM,IAAOH,GACZF,IAAKM,IAAOH,GACZqR,IAAU;AAEhB,SAAK,OAAO;AAAA,MACVvR,IAAOH,IAAK0R;AAAA,MAAStR,IAAOH,IAAKyR;AAAA,MAASrR,IAAOH,IAAKwR;AAAA,MACtDpR,IAAON,IAAK0R;AAAA,MAASnR,IAAON,IAAKyR;AAAA,MAASlR,IAAON,IAAKwR;AAAA,IAAA,GAIxD,KAAK,OAAO,UAAU,MAEtB,KAAK,cAAc;AAAA,EACrB;AAAA,EAEA,gBAAmD;AACjD,UAAM/H,IAAO,KAAK,OAAO,sBAAA;AACzB,WAAO,EAAE,OAAOA,EAAK,OAAO,QAAQA,EAAK,OAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,SAAe;AACb,UAAM,EAAE,IAAA3G,GAAI,QAAArC,GAAQ,iBAAAiP,EAAA,IAAoB,MAElC+B,IAAY,YAAY,IAAA;AAG9B,IAAA3O,EAAG;AAAA,MACD4M,EAAgB,CAAC;AAAA,MACjBA,EAAgB,CAAC;AAAA,MACjBA,EAAgB,CAAC;AAAA,MACjBA,EAAgB,CAAC;AAAA,IAAA,GAEnB5M,EAAG,MAAMA,EAAG,mBAAmBA,EAAG,gBAAgB;AAGlD,UAAMoN,IAAWzP,EAAO,wBAAA;AAQxB,QALI,KAAK,QACP,KAAK,KAAK,OAAOyP,CAAQ,GAIvB,KAAK,aAAa,GAAG;AACvB,YAAMxM,IAAU,KAAK,SAAS;AAC9B,MAAAZ,EAAG,WAAWY,EAAQ,OAAO,GAE7BZ,EAAG,iBAAiBY,EAAQ,SAAS,kBAAqB,IAAOwM,CAAQ,GACzEpN,EAAG,UAAUY,EAAQ,SAAS,WAAc,CAAG,GAC/CZ,EAAG,UAAUY,EAAQ,SAAS,YAAe,GAAG,GAAG,CAAC,GACpDZ,EAAG,UAAUY,EAAQ,SAAS,WAAc,IAAI,GAEhDZ,EAAG,gBAAgB,KAAK,GAAG;AAG3B,YAAMgE,IAASpD,EAAQ,WAAW;AAClC,MAAIoD,KAAU,MACZhE,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,wBAAwBgE,CAAM,GACjChE,EAAG,oBAAoBgE,GAAQ,GAAGhE,EAAG,OAAO,IAAO,GAAG,CAAC;AAIzD,YAAM4O,IAAYhO,EAAQ,WAAW;AACrC,MAAIgO,KAAa,MACf5O,EAAG,WAAWA,EAAG,cAAc,KAAK,YAAY,GAChDA,EAAG,wBAAwB4O,CAAS,GACpC5O,EAAG,oBAAoB4O,GAAW,GAAG5O,EAAG,OAAO,IAAO,GAAG,CAAC;AAI5D,YAAMiE,IAAWrD,EAAQ,WAAW;AACpC,MAAIqD,KAAY,MACdjE,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,wBAAwBiE,CAAQ,GACnCjE,EAAG,oBAAoBiE,GAAU,GAAGjE,EAAG,OAAO,IAAO,GAAG,CAAC,IAG3DA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GACvDA,EAAG,aAAaA,EAAG,WAAW,KAAK,YAAYA,EAAG,cAAc,CAAC,GAEjEA,EAAG,gBAAgB,IAAI;AAAA,IACzB;AAGA,UAAM6O,IAAY,YAAY,IAAA,IAAQF;AACtC,SAAK,gBAAgBE,GACrB,KAAK;AAEL,UAAMC,IAAM,YAAY,IAAA;AACxB,IAAIA,IAAM,KAAK,iBAAiB,QAC9B,KAAK,MAAM,KAAK,YAChB,KAAK,aAAa,GAClB,KAAK,gBAAgBA,IAGvB,KAAK,UAAU,QAAQ;AAAA,EACzB;AAAA,EAEA,kBAAwB;AACtB,QAAI,KAAK,qBAAqB,KAAM;AAEpC,UAAMC,IAAO,MAAY;AACvB,WAAK,WAAW,OAAA,GAEZ,KAAK,gBACP,KAAK,OAAA,GACL,KAAK,cAAc,KAGrB,KAAK,mBAAmB,sBAAsBA,CAAI;AAAA,IACpD;AAEA,IAAAA,EAAA;AAAA,EACF;AAAA,EAEA,iBAAuB;AACrB,IAAI,KAAK,qBAAqB,SAC5B,qBAAqB,KAAK,gBAAgB,GAC1C,KAAK,mBAAmB;AAAA,EAE5B;AAAA,EAEA,WAA0B;AACxB,WAAO;AAAA,MACL,KAAK,KAAK;AAAA,MACV,eAAe,KAAK,aAAa;AAAA;AAAA,MACjC,WAAW,KAAK;AAAA,MAChB,WAAW;AAAA,IAAA;AAAA,EAEf;AAAA,EAEA,YAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,gBAAgB;AACd,WAAK,KAAK,OACH,KAAK,KAAK,UAAA,IADM,CAAA;AAAA,EAEzB;AAAA,EAEA,0BAAwC;AACtC,WAAO,KAAK,OAAO,wBAAA;AAAA,EACrB;AAAA,EAEA,gBAAgB7K,GAAgF;AAC9F,QAAI,CAAC,KAAK,KAAM,QAAO,EAAE,GAAG,GAAG,GAAG,GAAG,SAAS,GAAA;AAC9C,UAAMyC,IAAO,KAAK,OAAO,sBAAA,GACnByG,IAAW,KAAK,OAAO,wBAAA;AAC7B,WAAO,KAAK,KAAK,gBAAgBlJ,GAAUkJ,GAAUzG,EAAK,OAAOA,EAAK,MAAM;AAAA,EAC9E;AAAA,EAEA,YACEqI,IAAkC,OAClCC,IAAU,MACVC,IAAc,IACN;AACR,UAAMC,IAAU,CAAC,GAAG,KAAK,eAAe;AACxC,IAAID,KAAeF,MAAW,UAC5B,KAAK,kBAAkB,CAAC,GAAG,GAAG,GAAG,CAAC,IAEpC,KAAK,OAAA,GACL,KAAK,kBAAkBG;AACvB,UAAMC,IAAW,SAASJ,CAAM;AAChC,WAAO,KAAK,OAAO,UAAUI,GAAUH,CAAO;AAAA,EAChD;AAAA,EAEA,GAAGzI,GAAezI,GAAyC;AACzD,IAAK,KAAK,eAAe,IAAIyI,CAAK,KAChC,KAAK,eAAe,IAAIA,GAAO,oBAAI,KAAK,GAE1C,KAAK,eAAe,IAAIA,CAAK,EAAG,IAAIzI,CAAQ;AAAA,EAC9C;AAAA,EAEA,IAAIyI,GAAezI,GAAyC;AfvnB9D,QAAA0I;AewnBI,KAAAA,IAAA,KAAK,eAAe,IAAID,CAAK,MAA7B,QAAAC,EAAgC,OAAO1I;AAAA,EACzC;AAAA,EAEQ,UAAUmC,GAAoB;AACpC,UAAMmP,IAAY,KAAK,eAAe,IAAInP,CAAI;AAC9C,QAAI,CAACmP,EAAW;AAEhB,UAAM7I,IAAyB;AAAA,MAC7B,MAAAtG;AAAA,MACA,WAAW,YAAY,IAAA;AAAA,MACvB,OAAO,KAAK,SAAA;AAAA,MACZ,QAAQ;AAAA,QACN,QAAQ,CAAC,GAAG,KAAK,OAAO,MAAM;AAAA,QAC9B,QAAQ,KAAK,OAAO;AAAA,QACpB,OAAO,KAAK,OAAO;AAAA,QACnB,KAAK,KAAK,OAAO;AAAA,QACjB,KAAK,KAAK,OAAO;AAAA,MAAA;AAAA,IACnB;AAGF,IAAAmP,EAAU,QAAQ,CAAAtR,MAAYA,EAASyI,CAAK,CAAC;AAAA,EAC/C;AAAA,EAEA,UAAgB;AACd,SAAK,eAAA,GAEL,OAAO,oBAAoB,UAAU,KAAK,YAAY,GAElD,KAAK,YACP,KAAK,QAAQ,QAAA,GACT,KAAK,wBAAsB,KAAK,OAAO,oBAAoB,aAAa,KAAK,oBAAoB,GACjG,KAAK,yBAAuB,KAAK,OAAO,oBAAoB,cAAc,KAAK,qBAAqB;AAG1G,UAAM,EAAE,IAAAxG,MAAO;AACf,IAAI,KAAK,OAAKA,EAAG,kBAAkB,KAAK,GAAG,GACvC,KAAK,kBAAgBA,EAAG,aAAa,KAAK,cAAc,GACxD,KAAK,gBAAcA,EAAG,aAAa,KAAK,YAAY,GACpD,KAAK,eAAaA,EAAG,aAAa,KAAK,WAAW,GAClD,KAAK,eAAaA,EAAG,aAAa,KAAK,WAAW,GAEtD,KAAK,WAAW,QAAA,GAChBgC,EAAoBhC,GAAI,KAAK,QAAQ,GAEjC,KAAK,QACP,KAAK,KAAK,QAAA,GAGZ,KAAK,eAAe,MAAA;AAAA,EACtB;AACF;ACloBO,MAAM2U,GAAqB;AAAA,EAsChC,YAAYhZ,GAAsC;AArC1C,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,cAAsB;AAGtB;AAAA,IAAAA,EAAA,aAAqC;AACrC,IAAAA,EAAA,wBAAqC;AACrC,IAAAA,EAAA,qBAAkC;AAClC,IAAAA,EAAA,oBAAiC;AACjC,IAAAA,EAAA,oBAAa;AAEb,IAAAA,EAAA,yBAAoD,CAAC,MAAM,MAAM,KAAK,CAAC;AACvE,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA,mBAAiC;AACjC,IAAAA,EAAA,gBAA0B;AAE1B,IAAAA,EAAA,0BAAkC;AAClC,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,4CAAgE,IAAA;AAGhE;AAAA,IAAAA,EAAA,iBAA4B;AAC5B,IAAAA,EAAA,sBAAuB;AACvB,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGA;AAAA,IAAAA,EAAA;AAwMA,IAAAA,EAAA,sBAAe,MAAM;AAAE,WAAK,OAAA,GAAU,KAAK,cAAc;AAAA,IAAM;AArMrE,SAAK,SAASD,EAAQ,QACtB,KAAK,MAAM,OAAO,oBAAoB,GACtC,KAAK,kBAAkBA,EAAQ,aAAa,GAC5C,KAAK,WAAWA,EAAQ,YAAY,IACpC,KAAK,UAAUA,EAAQ,WAAW,GAE9BA,EAAQ,oBAAiB,KAAK,kBAAkBA,EAAQ,kBAG5D,KAAK,aAAakR,EAAYlR,EAAQ,SAAS,CAAA,GAAI,KAAK,eAAe;AAEvE,UAAMqE,IAAK,KAAK,OAAO,WAAW,UAAU,EAAE,OAAO,IAAM,WAAW,IAAM;AAC5E,QAAI,CAACA,EAAI,OAAM,IAAI,MAAM,sBAAsB;AAC/C,SAAK,KAAKA,GAEVA,EAAG,OAAOA,EAAG,UAAU,GACvBA,EAAG,OAAOA,EAAG,KAAK,GAClBA,EAAG,UAAUA,EAAG,WAAWA,EAAG,mBAAmB,GAEjD,KAAK,WAAWgB,EAAsBhB,CAAE,GACxC,KAAK,SAAS,IAAItE,EAAYC,EAAQ,MAAM,GAC5C,KAAK,aAAa,IAAI+B,EAAgB,KAAK,QAAQ,KAAK,QAAQ/B,EAAQ,QAAQ,GAChF,KAAK,WAAW,SAAS,MAAM;AAAE,WAAK,cAAc,IAAM,KAAK,UAAU,cAAc;AAAA,IAAG,CAAC,GAEvFA,EAAQ,aAAa,OACvB,KAAK,OAAO,IAAIwG,EAAOnC,GAAIrE,EAAQ,IAAI,IAGrCA,EAAQ,kBAAkB,OAC5B,KAAK,UAAU,IAAIwJ,EAAU,KAAK,OAAO,iBAAiB,SAAS,IAAI,GACvE,KAAK,uBAAuB,KAAK,gBAAgB,KAAK,IAAI,GAC1D,KAAK,wBAAwB,KAAK,iBAAiB,KAAK,IAAI,GAC5D,KAAK,OAAO,iBAAiB,aAAa,KAAK,oBAAoB,GACnE,KAAK,OAAO,iBAAiB,cAAc,KAAK,qBAAqB,IAGvE,KAAK,YAAA,GACL,KAAK,OAAA,GACL,OAAO,iBAAiB,UAAU,KAAK,YAAY,GACnD,KAAK,gBAAA;AAAA,EACP;AAAA,EAEQ,cAAoB;AAC1B,UAAM,EAAE,IAAAnF,MAAO,MACTY,IAAU,KAAK,SAAS;AAC9B,SAAK,MAAMZ,EAAG,kBAAA,GACdA,EAAG,gBAAgB,KAAK,GAAG,GAE3B,KAAK,iBAAiBA,EAAG,aAAA,GACzBA,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc;AAClD,UAAMgE,IAASpD,EAAQ,WAAW;AAClC,IAAIoD,MAAW,OACbhE,EAAG,wBAAwBgE,CAAM,GACjChE,EAAG,oBAAoBgE,GAAQ,GAAGhE,EAAG,OAAO,IAAO,GAAG,CAAC,IAGzD,KAAK,cAAcA,EAAG,aAAA,GACtBA,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW;AAC/C,UAAMiE,IAAWrD,EAAQ,WAAW;AACpC,IAAIqD,MAAa,OACfjE,EAAG,wBAAwBiE,CAAQ,GACnCjE,EAAG,oBAAoBiE,GAAU,GAAGjE,EAAG,OAAO,IAAO,GAAG,CAAC,IAG3D,KAAK,aAAaA,EAAG,aAAA,GACrBA,EAAG,WAAWA,EAAG,cAAc,KAAK,UAAU;AAC9C,UAAM4U,IAAUhU,EAAQ,WAAW;AACnC,IAAIgU,MAAY,OACd5U,EAAG,wBAAwB4U,CAAO,GAClC5U,EAAG,oBAAoB4U,GAAS,GAAG5U,EAAG,OAAO,IAAO,GAAG,CAAC,IAG1DA,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAEA,QAAQqF,GAA4B;AAClC,SAAK,YAAYA,EAAK,WACtB,KAAK,aAAaA,EAAK,UAAU,SAAS;AAC1C,UAAM,EAAE,IAAArF,MAAO;AAEf,IAAAA,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,WAAWA,EAAG,cAAcqF,EAAK,WAAWrF,EAAG,YAAY;AAG9D,UAAMgO,IAAe,KAAK,WAAW,cAAc,CAAC,GAC9CtL,IAAS2C,EAAK,UAAU,KAAK,oBAAoB,KAAK,YAAY2I,CAAY;AACpF,IAAAhO,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,WAAWA,EAAG,cAAc0C,GAAQ1C,EAAG,YAAY;AAEtD,UAAM6U,IAAQxP,EAAK,SAAS,IAAI,aAAa,KAAK,UAAU,EAAE,KAAK,CAAG;AACtE,IAAArF,EAAG,WAAWA,EAAG,cAAc,KAAK,UAAU,GAC9CA,EAAG,WAAWA,EAAG,cAAc6U,GAAO7U,EAAG,YAAY,GAErD,KAAK,aAAA,GACL,KAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,eAAqB;AAC3B,QAAI,CAAC,KAAK,UAAW;AACrB,QAAI7C,IAAO,OAAUG,IAAO,QAAWF,IAAO,OAAUG,IAAO,QAAWF,IAAO,OAAUG,IAAO;AAClG,aAASuF,IAAI,GAAGA,IAAI,KAAK,UAAU,QAAQA,KAAK,GAAG;AACjD,YAAMpJ,IAAI,KAAK,UAAUoJ,CAAC,GAAGnJ,IAAI,KAAK,UAAUmJ,IAAE,CAAC,GAAGlJ,IAAI,KAAK,UAAUkJ,IAAE,CAAC;AAC5E,MAAIpJ,IAAIwD,MAAMA,IAAOxD,IAAOA,IAAI2D,MAAMA,IAAO3D,IACzCC,IAAIwD,MAAMA,IAAOxD,IAAOA,IAAI2D,MAAMA,IAAO3D,IACzCC,IAAIwD,MAAMA,IAAOxD,IAAOA,IAAI2D,MAAMA,IAAO3D;AAAA,IAC/C;AACA,SAAK,SAAS,EAAE,MAAAsD,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,EAAA,GAC1C,KAAK,QAAM,KAAK,KAAK,aAAa,KAAK,MAAM;AAAA,EACnD;AAAA,EAEQ,oBAAoBsG,GAAekK,GAAsD;AAC/F,UAAMtL,IAAS,IAAI,aAAaoB,IAAQ,CAAC;AACzC,aAASf,IAAI,GAAGA,IAAIe,GAAOf;AACzB,MAAAL,EAAOK,IAAI,CAAC,IAAIiL,EAAa,CAAC,GAC9BtL,EAAOK,IAAI,IAAI,CAAC,IAAIiL,EAAa,CAAC,GAClCtL,EAAOK,IAAI,IAAI,CAAC,IAAIiL,EAAa,CAAC;AAEpC,WAAOtL;AAAA,EACT;AAAA,EAEA,SAAe;AACb,UAAM,EAAE,IAAA1C,GAAI,QAAArC,EAAA,IAAW;AACvB,IAAAqC,EAAG,SAAS,GAAG,GAAGA,EAAG,OAAO,OAAOA,EAAG,OAAO,MAAM,GACnDA,EAAG,WAAW,KAAK,gBAAgB,CAAC,GAAG,KAAK,gBAAgB,CAAC,GAAG,KAAK,gBAAgB,CAAC,GAAG,KAAK,gBAAgB,CAAC,CAAC,GAChHA,EAAG,MAAMA,EAAG,mBAAmBA,EAAG,gBAAgB;AAElD,UAAMoN,IAAWzP,EAAO,wBAAA;AAGxB,QAFI,KAAK,QAAM,KAAK,KAAK,OAAOyP,CAAQ,GAEpC,KAAK,aAAa,KAAK,KAAK,KAAK;AACnC,YAAMxM,IAAU,KAAK,SAAS;AAC9B,MAAAZ,EAAG,WAAWY,EAAQ,OAAO,GAC7BZ,EAAG,iBAAiBY,EAAQ,SAAS,kBAAkB,IAAOwM,CAAQ,GACtEpN,EAAG,UAAUY,EAAQ,SAAS,WAAW,KAAK,OAAO,GACrDZ,EAAG,UAAUY,EAAQ,SAAS,cAAc,KAAK,kBAAkB,KAAK,GAAG,GAC3EZ,EAAG,UAAUY,EAAQ,SAAS,YAAY,KAAK,WAAW,IAAI,CAAC,GAE/DZ,EAAG,gBAAgB,KAAK,GAAG,GAC3BA,EAAG,WAAWA,EAAG,QAAQ,GAAG,KAAK,UAAU,GAC3CA,EAAG,gBAAgB,IAAI;AAAA,IACzB;AACA,SAAK,UAAU,QAAQ;AAAA,EACzB;AAAA,EAEQ,kBAAwB;AAC9B,UAAM+O,IAAO,MAAM;AACjB,YAAMxQ,IAAS,KAAK,WAAW,OAAA;AAC/B,OAAI,KAAK,eAAeA,OACtB,KAAK,OAAA,GACL,KAAK,cAAc,KAErB,KAAK,mBAAmB,sBAAsBwQ,CAAI;AAAA,IACpD;AACA,SAAK,mBAAmB,sBAAsBA,CAAI;AAAA,EACpD;AAAA,EAEA,YAAkB;AAChB,QAAI,CAAC,KAAK,OAAQ;AAClB,UAAM,EAAE,MAAA5R,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,MAAS,KAAK;AACpD,SAAK,OAAO,YAAYL,GAAMC,GAAMC,GAAMC,GAAMC,GAAMC,CAAI,GAC1D,KAAK,OAAO,UAAU,KACtB,KAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,gBAAgB,GAAqB;AAC3C,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,UAAW;AACtC,UAAMmJ,IAAO,KAAK,OAAO,sBAAA,GACnBhN,IAAI,EAAE,UAAUgN,EAAK,MAAM/M,IAAI,EAAE,UAAU+M,EAAK,KAIhD,EAAE,OAAAuG,GAAO,QAAAC,MAAW,KAAK,cAAA,GACzBC,IAAW,KAAK,OAAO,wBAAA,GACvBvE,IAAMZ,EAAoBtO,GAAGC,GAAGsT,GAAOC,GAAQC,CAAQ,GACvDxG,IAAMuC,EAAWN,GAAK,KAAK,WAAW,IAAI,aAAa,KAAK,UAAU,EAAE,KAAK,GAAG,CAAC;AAEvF,QAAIjC;AACF,UAAIA,EAAI,UAAU,KAAK,cAAc;AACnC,aAAK,eAAeA,EAAI;AACxB,cAAMwL,IAAKxL,EAAI,QAAQ;AACvB,aAAK,QAAQ,KAAK;AAAA,UAChB,OAAOA,EAAI;AAAA,UACX,UAAU,CAAC,KAAK,UAAUwL,CAAE,GAAG,KAAK,UAAUA,IAAG,CAAC,GAAG,KAAK,UAAUA,IAAG,CAAC,CAAC;AAAA,QAAA,GACxEzY,GAAGC,CAAC;AAAA,MACT;AACE,aAAK,QAAQ,eAAeD,GAAGC,CAAC;AAAA,QAEpC,CAAW,KAAK,iBAAiB,OAC/B,KAAK,QAAQ,KAAA,GACb,KAAK,eAAe;AAAA,EAExB;AAAA,EAEQ,mBAAyB;AAC/B,IAAI,KAAK,YAAW,KAAK,QAAQ,KAAA,GAAQ,KAAK,eAAe;AAAA,EAC/D;AAAA,EAGQ,SAAe;AACrB,UAAMsT,IAAQ,KAAK,OAAO,aAAaC,IAAS,KAAK,OAAO;AAC5D,SAAK,OAAO,QAAQD,IAAQ,KAAK,KAAK,KAAK,OAAO,SAASC,IAAS,KAAK,KACzE,KAAK,GAAG,SAAS,GAAG,GAAG,KAAK,OAAO,OAAO,KAAK,OAAO,MAAM,GAC5D,KAAK,OAAO,SAASD,IAAQC;AAAA,EAC/B;AAAA,EACA,gBAAgB;AAAE,UAAMxG,IAAO,KAAK,OAAO,sBAAA;AAAyB,WAAO,EAAE,OAAOA,EAAK,OAAO,QAAQA,EAAK,OAAA;AAAA,EAAU;AAAA,EAEvH,gBAAgB;AhB7RlB,QAAAF;AgB8RI,aAAOA,IAAA,KAAK,SAAL,gBAAAA,EAAW,gBAAe,CAAA;AAAA,EACnC;AAAA,EAEA,0BAA0B;AACxB,WAAO,KAAK,OAAO,wBAAA;AAAA,EACrB;AAAA,EAEA,gBAAgBvC,GAAoC;AAClD,QAAI,CAAC,KAAK,KAAM,QAAO,EAAE,GAAG,GAAG,GAAG,GAAG,SAAS,GAAA;AAC9C,UAAM,EAAE,OAAAgJ,GAAO,QAAAC,MAAW,KAAK,cAAA;AAC/B,WAAO,KAAK,KAAK,gBAAgBjJ,GAAU,KAAK,OAAO,wBAAA,GAA2BgJ,GAAOC,CAAM;AAAA,EACjG;AAAA,EACA,GAAG3G,GAAezI,GAAyC;AACzD,IAAK,KAAK,eAAe,IAAIyI,CAAK,KAAG,KAAK,eAAe,IAAIA,GAAO,oBAAI,IAAA,CAAK,GAC7E,KAAK,eAAe,IAAIA,CAAK,EAAG,IAAIzI,CAAQ;AAAA,EAC9C;AAAA,EACQ,UAAUmC,GAAoB;AACpC,UAAMmP,IAAY,KAAK,eAAe,IAAInP,CAAI;AAC9C,IAAKmP,KACLA,EAAU,QAAQ,OAAMyF,EAAG;AAAA,MACzB,MAAA5U;AAAA,MAAmB,WAAW,YAAY,IAAA;AAAA,MAC1C,OAAO,EAAE,KAAK,IAAI,WAAW,IAAI,eAAe,KAAK,YAAY,WAAW,EAAA;AAAA,MAC5E,QAAQ,EAAE,QAAQ,CAAC,GAAG,KAAK,OAAO,MAAM,GAAU,QAAQ,KAAK,OAAO,QAAQ,OAAO,KAAK,OAAO,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,OAAO,IAAA;AAAA,IAAI,CACpJ,CAAC;AAAA,EACJ;AAAA,EAEA,UAAgB;AACd,WAAO,oBAAoB,UAAU,KAAK,YAAY,GAClD,KAAK,oBAAkB,qBAAqB,KAAK,gBAAgB,GACjE,KAAK,WAAS,KAAK,QAAQ,QAAA;AAC/B,UAAM,EAAE,IAAAF,MAAO;AACf,IAAI,KAAK,OAAKA,EAAG,kBAAkB,KAAK,GAAG,GAC3C,CAAC,KAAK,gBAAgB,KAAK,aAAa,KAAK,UAAU,EAAE,QAAQ,CAAA1J,MAAKA,KAAK0J,EAAG,aAAa1J,CAAC,CAAC,GAC7F0L,EAAoBhC,GAAI,KAAK,QAAQ;AAAA,EACvC;AACF;ACzRO,MAAM+U,GAAiB;AAAA,EAsC5B,YAAYpZ,GAAkC;AArCtC,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,cAAsB;AAGtB;AAAA,IAAAA,EAAA,aAAqC;AACrC,IAAAA,EAAA,wBAAqC;AACrC,IAAAA,EAAA,sBAAmC;AACnC,IAAAA,EAAA,qBAAkC;AAClC,IAAAA,EAAA,qBAAkC;AAClC,IAAAA,EAAA,oBAAa;AAEb,IAAAA,EAAA,yBAAoD,CAAC,MAAM,MAAM,KAAK,CAAC;AACvE,IAAAA,EAAA;AAEA,IAAAA,EAAA,gBAA6B,CAAA;AAC7B,IAAAA,EAAA,gBAA0B;AAE1B,IAAAA,EAAA,0BAAkC;AAClC,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,4CAAgE,IAAA;AAGhE;AAAA,IAAAA,EAAA,4BAAoC;AACpC,IAAAA,EAAA;AAGA;AAAA,IAAAA,EAAA,iBAA4B;AAC5B,IAAAA,EAAA,sBAAyD;AACzD,IAAAA,EAAA;AACA,IAAAA,EAAA;AA8QA,IAAAA,EAAA,sBAAe,MAAM;AAAE,WAAK,OAAA,GAAU,KAAK,cAAc;AAAA,IAAM;AA3QrE,SAAK,SAASD,EAAQ,QACtB,KAAK,MAAM,OAAO,oBAAoB,GACtC,KAAK,UAAUA,EAAQ,WAAW,KAE9BA,EAAQ,oBAAiB,KAAK,kBAAkBA,EAAQ,kBAG5D,KAAK,aAAakR,EAAYlR,EAAQ,SAAS,CAAA,GAAI,KAAK,eAAe;AAEvE,UAAMqE,IAAK,KAAK,OAAO,WAAW,UAAU,EAAE,OAAO,IAAM,WAAW,IAAM;AAC5E,QAAI,CAACA,EAAI,OAAM,IAAI,MAAM,sBAAsB;AAC/C,SAAK,KAAKA,GAEVA,EAAG,OAAOA,EAAG,UAAU,GACvBA,EAAG,OAAOA,EAAG,KAAK,GAClBA,EAAG,UAAUA,EAAG,WAAWA,EAAG,mBAAmB,GAEjD,KAAK,WAAWgB,EAAsBhB,CAAE,GACxC,KAAK,SAAS,IAAItE,EAAYC,EAAQ,MAAM,GAC5C,KAAK,aAAa,IAAI+B,EAAgB,KAAK,QAAQ,KAAK,QAAQ/B,EAAQ,QAAQ,GAChF,KAAK,WAAW,SAAS,MAAM;AAAE,WAAK,cAAc,IAAM,KAAK,UAAU,cAAc;AAAA,IAAG,CAAC,GAEvFA,EAAQ,aAAa,OACvB,KAAK,OAAO,IAAIwG,EAAOnC,GAAIrE,EAAQ,IAAI,IAGrCA,EAAQ,kBAAkB,OAC5B,KAAK,UAAU,IAAIwJ,EAAU,KAAK,OAAO,iBAAiB,SAAS,IAAI,GACvE,KAAK,uBAAuB,KAAK,gBAAgB,KAAK,IAAI,GAC1D,KAAK,wBAAwB,KAAK,iBAAiB,KAAK,IAAI,GAC5D,KAAK,OAAO,iBAAiB,aAAa,KAAK,oBAAoB,GACnE,KAAK,OAAO,iBAAiB,cAAc,KAAK,qBAAqB,IAGvE,KAAK,OAAA,GACL,OAAO,iBAAiB,UAAU,KAAK,YAAY,GACnD,KAAK,gBAAA;AAAA,EACP;AAAA,EAEA,QAAQ6P,GAAkC;AACxC,SAAK,SAASA,GACd,KAAK,eAAA,GACL,KAAK,aAAA,GACL,KAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,eAAqB;AAC3B,QAAI,KAAK,OAAO,WAAW,EAAG;AAE9B,QAAI7X,IAAO,OAAUG,IAAO,QACxBF,IAAO,OAAUG,IAAO,QACxBF,IAAO,OAAUG,IAAO;AAE5B,eAAWvD,KAAK,KAAK,QAAQ;AAC3B,YAAMgb,KAAShb,EAAE,SAAS,OAAO;AACjC,MAAIA,EAAE,IAAIgb,IAAQ5X,MAAMA,IAAOpD,EAAE,IAAIgb,IACjChb,EAAE,IAAIgb,IAAQzX,MAAMA,IAAOvD,EAAE,IAAIgb;AAErC,eAASlS,IAAI,GAAGA,IAAI9I,EAAE,QAAQ,QAAQ8I,KAAK;AACzC,cAAMpJ,IAAIM,EAAE,QAAQ8I,CAAC,GAAGnJ,IAAIK,EAAE,QAAQ8I,CAAC;AACvC,QAAIpJ,IAAIwD,MAAMA,IAAOxD,IAAOA,IAAI2D,MAAMA,IAAO3D,IACzCC,IAAIwD,MAAMA,IAAOxD,IAAOA,IAAI2D,MAAMA,IAAO3D;AAAA,MAC/C;AAAA,IACF;AAEA,SAAK,SAAS,EAAE,MAAAuD,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,EAAA,GAC1C,KAAK,QAAM,KAAK,KAAK,aAAa,KAAK,MAAM;AAAA,EACnD;AAAA,EAEQ,iBAAuB;AAC7B,QAAI,KAAK,OAAO,WAAW,EAAG;AAC9B,UAAM,EAAE,IAAAwC,MAAO,MAETyC,IAAsB,CAAA,GACtB+L,IAAoB,CAAA,GACpB9L,IAAmB,CAAA,GACnB+L,IAAoB,CAAA;AAC1B,QAAId,IAAe;AAEnB,aAASuH,IAAY,GAAGA,IAAY,KAAK,OAAO,QAAQA,KAAa;AACnE,YAAMjb,IAAI,KAAK,OAAOib,CAAS,GAIzBtK,IADYsK,MAAc,KAAK,qBAEjC,KAAK,WAAW,iBACfjb,EAAE,SAAS,KAAK,WAAW,cAAcib,IAAY,KAAK,WAAW,cAAc,MAAM,GAExFD,KAAShb,EAAE,SAAS,OAAO,GAC3Bkb,IAAIlb,EAAE,QAAQ;AAEpB,eAAS8I,IAAI,GAAGA,IAAIoS,GAAGpS,KAAK;AAC1B,cAAMpJ,IAAIM,EAAE,QAAQ8I,CAAC,GAAGnJ,IAAIK,EAAE,QAAQ8I,CAAC,GAAGlJ,IAAII,EAAE;AAGhD,YAAI+C,IAAK,GAAGC,IAAK;AACjB,QAAI8F,IAAIoS,IAAI,KACVnY,IAAK/C,EAAE,QAAQ8I,IAAE,CAAC,IAAIpJ,GAAGsD,IAAKhD,EAAE,QAAQ8I,IAAE,CAAC,IAAInJ,KACtCmJ,IAAI,MACb/F,IAAKrD,IAAIM,EAAE,QAAQ8I,IAAE,CAAC,GAAG9F,IAAKrD,IAAIK,EAAE,QAAQ8I,IAAE,CAAC;AAGjD,cAAMqS,IAAM,KAAK,KAAKpY,IAAGA,IAAKC,IAAGA,CAAE,GAC7BgR,IAAKmH,IAAM,IAAInY,IAAGmY,IAAM,GACxBlH,IAAKkH,IAAM,IAAI,CAACpY,IAAGoY,IAAM;AAW/B,YATA3S,EAAU,KAAK9I,GAAGC,GAAGC,IAAIob,CAAK,GAC9BxS,EAAU,KAAK9I,GAAGC,GAAGC,IAAIob,CAAK,GAE9BzG,EAAQ,KAAKP,GAAIC,GAAI,CAAC,GACtBM,EAAQ,KAAKP,GAAIC,GAAI,CAAC,GAEtBxL,EAAO,KAAK,GAAGkI,CAAG,GAClBlI,EAAO,KAAK,GAAGkI,CAAG,GAEd7H,IAAIoS,IAAI,GAAG;AACb,gBAAMrL,IAAK6D,IAAe5K,IAAI,GACxBgH,IAAKD,IAAK,GACVE,IAAKF,IAAK,GACVuL,IAAKvL,IAAK;AAChB,UAAA2E,EAAQ,KAAK3E,GAAIC,GAAIC,GAAID,GAAIsL,GAAIrL,CAAE;AAAA,QACrC;AAAA,MACF;AACA,MAAA2D,KAAgBwH,IAAI;AAAA,IACtB;AAEA,UAAMvU,IAAU,KAAK,SAAS;AAC9B,IAAK,KAAK,QAAK,KAAK,MAAMZ,EAAG,kBAAA,IAC7BA,EAAG,gBAAgB,KAAK,GAAG,GAEtB,KAAK,mBAAgB,KAAK,iBAAiBA,EAAG,aAAA,IACnDA,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,WAAWA,EAAG,cAAc,IAAI,aAAayC,CAAS,GAAGzC,EAAG,WAAW;AAC1E,UAAMgE,IAASpD,EAAQ,WAAW;AAClC,IAAIoD,MAAW,OACbhE,EAAG,wBAAwBgE,CAAM,GACjChE,EAAG,oBAAoBgE,GAAQ,GAAGhE,EAAG,OAAO,IAAO,GAAG,CAAC,IAGpD,KAAK,iBAAc,KAAK,eAAeA,EAAG,aAAA,IAC/CA,EAAG,WAAWA,EAAG,cAAc,KAAK,YAAY,GAChDA,EAAG,WAAWA,EAAG,cAAc,IAAI,aAAawO,CAAO,GAAGxO,EAAG,WAAW;AACxE,UAAM4O,IAAYhO,EAAQ,WAAW;AACrC,IAAIgO,MAAc,OAChB5O,EAAG,wBAAwB4O,CAAS,GACpC5O,EAAG,oBAAoB4O,GAAW,GAAG5O,EAAG,OAAO,IAAO,GAAG,CAAC,IAGvD,KAAK,gBAAa,KAAK,cAAcA,EAAG,aAAA,IAC7CA,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,WAAWA,EAAG,cAAc,IAAI,aAAa0C,CAAM,GAAG1C,EAAG,WAAW;AACvE,UAAMiE,IAAWrD,EAAQ,WAAW;AACpC,IAAIqD,MAAa,OACfjE,EAAG,wBAAwBiE,CAAQ,GACnCjE,EAAG,oBAAoBiE,GAAU,GAAGjE,EAAG,OAAO,IAAO,GAAG,CAAC,IAGtD,KAAK,gBAAa,KAAK,cAAcA,EAAG,aAAA,IAC7CA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GACvDA,EAAG,WAAWA,EAAG,sBAAsB,IAAI,YAAYyO,CAAO,GAAGzO,EAAG,WAAW,GAC/E,KAAK,aAAayO,EAAQ,QAE1BzO,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAEA,SAAe;AACb,UAAM,EAAE,IAAAA,GAAI,QAAArC,EAAA,IAAW;AACvB,IAAAqC,EAAG,SAAS,GAAG,GAAGA,EAAG,OAAO,OAAOA,EAAG,OAAO,MAAM,GACnDA,EAAG,WAAW,KAAK,gBAAgB,CAAC,GAAG,KAAK,gBAAgB,CAAC,GAAG,KAAK,gBAAgB,CAAC,GAAG,KAAK,gBAAgB,CAAC,CAAC,GAChHA,EAAG,MAAMA,EAAG,mBAAmBA,EAAG,gBAAgB;AAElD,UAAMoN,IAAWzP,EAAO,wBAAA;AAGxB,QAFI,KAAK,QAAM,KAAK,KAAK,OAAOyP,CAAQ,GAEpC,KAAK,aAAa,KAAK,KAAK,KAAK;AACnC,YAAMxM,IAAU,KAAK,SAAS;AAC9B,MAAAZ,EAAG,WAAWY,EAAQ,OAAO,GAC7BZ,EAAG,iBAAiBY,EAAQ,SAAS,kBAAkB,IAAOwM,CAAQ,GACtEpN,EAAG,UAAUY,EAAQ,SAAS,WAAW,KAAK,OAAO,GACrDZ,EAAG,WAAWY,EAAQ,SAAS,YAAY,IAAI,aAAa,CAAC,KAAK,GAAK,GAAG,CAAC,CAAC,GAC5EZ,EAAG,UAAUY,EAAQ,SAAS,WAAc,GAAG,GAE/CZ,EAAG,gBAAgB,KAAK,GAAG,GAC3BA,EAAG,aAAaA,EAAG,WAAW,KAAK,YAAYA,EAAG,cAAc,CAAC,GACjEA,EAAG,gBAAgB,IAAI;AAAA,IACzB;AACA,SAAK,UAAU,QAAQ;AAAA,EACzB;AAAA,EAEQ,kBAAwB;AAC9B,UAAM+O,IAAO,MAAM;AACjB,YAAMxQ,IAAS,KAAK,WAAW,OAAA;AAC/B,OAAI,KAAK,eAAeA,OACtB,KAAK,OAAA,GACL,KAAK,cAAc,KAErB,KAAK,mBAAmB,sBAAsBwQ,CAAI;AAAA,IACpD;AACA,SAAK,mBAAmB,sBAAsBA,CAAI;AAAA,EACpD;AAAA,EAEA,YAAkB;AAChB,QAAI,CAAC,KAAK,OAAQ;AAClB,UAAM,EAAE,MAAA5R,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,MAAS,KAAK;AACpD,SAAK,OAAO,YAAYL,GAAMC,GAAMC,GAAMC,GAAMC,GAAMC,CAAI,GAC1D,KAAK,OAAO,UAAU,KACtB,KAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,gBAAgB,GAAqB;AAC3C,QAAI,KAAK,OAAO,WAAW,EAAG;AAC9B,UAAMmJ,IAAO,KAAK,OAAO,sBAAA,GACnBhN,IAAI,EAAE,UAAUgN,EAAK,MAAM/M,IAAI,EAAE,UAAU+M,EAAK,KAGhD,EAAE,OAAAuG,GAAO,QAAAC,MAAW,KAAK,cAAA,GACzBC,IAAW,KAAK,OAAO,wBAAA,GACvBvE,IAAMZ,EAAoBtO,GAAGC,GAAGsT,GAAOC,GAAQC,CAAQ,GAEvDvH,IAAQ,KAAK,OAAO,IAAI,CAAA5L,OAAM;AAAA,MAClC,GAAGA,EAAE;AAAA,MAAS,GAAGA,EAAE;AAAA,MACnB,GAAG,IAAI,aAAaA,EAAE,QAAQ,MAAM,EAAE,KAAKA,EAAE,CAAC;AAAA,IAAA,EAC9C,GAEI2M,IAAMqF,EAASpD,GAAKhD,GAAO,GAAG,GAG9BmH,IAAkBpG,IAAMA,EAAI,cAAc;AAQhD,QAPIoG,MAAoB,KAAK,uBAC3B,KAAK,qBAAqBA,GAC1B,KAAK,eAAA,GACL,KAAK,cAAc,KAIjB,KAAK;AACP,UAAIpG;AACF,YAAI,CAAC,KAAK,gBAAgB,KAAK,aAAa,WAAWA,EAAI,eAAe,KAAK,aAAa,UAAUA,EAAI,YAAY;AACpH,eAAK,eAAe,EAAE,QAAQA,EAAI,aAAa,OAAOA,EAAI,WAAA;AAC1D,gBAAM3M,IAAI,KAAK,OAAO2M,EAAI,WAAW;AACrC,eAAK,QAAQ,KAAK;AAAA,YAChB,OAAOA,EAAI;AAAA,YACX,UAAU,CAAC3M,EAAE,QAAQ2M,EAAI,UAAU,GAAG3M,EAAE,QAAQ2M,EAAI,UAAU,GAAG3M,EAAE,CAAC;AAAA,YACpE,OAAOA,EAAE,SAAS,CAAC,KAAK,KAAK,CAAG;AAAA,YAChC,YAAY,EAAE,QAAQ2M,EAAI,aAAa,GAAG3M,EAAE,EAAE,QAAQ,CAAC,EAAA;AAAA,UAAE,GACxDN,GAAGC,CAAC;AAAA,QACT;AACE,eAAK,QAAQ,eAAeD,GAAGC,CAAC;AAAA,UAEpC,CAAW,KAAK,iBACd,KAAK,QAAQ,KAAA,GACb,KAAK,eAAe;AAAA,EAG1B;AAAA,EAEQ,mBAAyB;AAE/B,IAAI,KAAK,uBAAuB,SAC9B,KAAK,qBAAqB,MAC1B,KAAK,eAAA,GACL,KAAK,cAAc,KAGjB,KAAK,YAAW,KAAK,QAAQ,KAAA,GAAQ,KAAK,eAAe;AAAA,EAC/D;AAAA,EAGQ,SAAe;AACrB,UAAMsT,IAAQ,KAAK,OAAO,aAAaC,IAAS,KAAK,OAAO;AAC5D,SAAK,OAAO,QAAQD,IAAQ,KAAK,KAAK,KAAK,OAAO,SAASC,IAAS,KAAK,KACzE,KAAK,GAAG,SAAS,GAAG,GAAG,KAAK,OAAO,OAAO,KAAK,OAAO,MAAM,GAC5D,KAAK,OAAO,SAASD,IAAQC;AAAA,EAC/B;AAAA,EACA,gBAAgB;AAAE,UAAMxG,IAAO,KAAK,OAAO,sBAAA;AAAyB,WAAO,EAAE,OAAOA,EAAK,OAAO,QAAQA,EAAK,OAAA;AAAA,EAAU;AAAA,EAEvH,gBAAgB;AjBnWlB,QAAAF;AiBoWI,aAAOA,IAAA,KAAK,SAAL,gBAAAA,EAAW,gBAAe,CAAA;AAAA,EACnC;AAAA,EAEA,0BAA0B;AACxB,WAAO,KAAK,OAAO,wBAAA;AAAA,EACrB;AAAA,EAEA,gBAAgBvC,GAAoC;AAClD,QAAI,CAAC,KAAK,KAAM,QAAO,EAAE,GAAG,GAAG,GAAG,GAAG,SAAS,GAAA;AAC9C,UAAM,EAAE,OAAAgJ,GAAO,QAAAC,MAAW,KAAK,cAAA;AAC/B,WAAO,KAAK,KAAK,gBAAgBjJ,GAAU,KAAK,OAAO,wBAAA,GAA2BgJ,GAAOC,CAAM;AAAA,EACjG;AAAA,EACA,GAAG3G,GAAezI,GAAyC;AACzD,IAAK,KAAK,eAAe,IAAIyI,CAAK,KAAG,KAAK,eAAe,IAAIA,GAAO,oBAAI,IAAA,CAAK,GAC7E,KAAK,eAAe,IAAIA,CAAK,EAAG,IAAIzI,CAAQ;AAAA,EAC9C;AAAA,EACQ,UAAUmC,GAAoB;AACpC,UAAMmP,IAAY,KAAK,eAAe,IAAInP,CAAI;AAC9C,IAAKmP,KACLA,EAAU,QAAQ,OAAMyF,EAAG;AAAA,MACzB,MAAA5U;AAAA,MAAmB,WAAW,YAAY,IAAA;AAAA,MAC1C,OAAO,EAAE,KAAK,IAAI,WAAW,IAAI,eAAe,KAAK,OAAO,QAAQ,WAAW,EAAA;AAAA,MAC/E,QAAQ,EAAE,QAAQ,CAAC,GAAG,KAAK,OAAO,MAAM,GAAU,QAAQ,KAAK,OAAO,QAAQ,OAAO,KAAK,OAAO,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,OAAO,IAAA;AAAA,IAAI,CACpJ,CAAC;AAAA,EACJ;AAAA,EAEA,UAAgB;AACd,WAAO,oBAAoB,UAAU,KAAK,YAAY,GAClD,KAAK,oBAAkB,qBAAqB,KAAK,gBAAgB,GACjE,KAAK,WAAS,KAAK,QAAQ,QAAA;AAC/B,UAAM,EAAE,IAAAF,MAAO;AACf,IAAI,KAAK,OAAKA,EAAG,kBAAkB,KAAK,GAAG,GAC3C,CAAC,KAAK,gBAAgB,KAAK,cAAc,KAAK,aAAa,KAAK,WAAW,EAAE,QAAQ,CAAA1J,MAAKA,KAAK0J,EAAG,aAAa1J,CAAC,CAAC,GACjH0L,EAAoBhC,GAAI,KAAK,QAAQ;AAAA,EACvC;AACF;AC1VO,MAAMsV,GAAqB;AAAA,EA4ChC,YAAY3Z,GAAsC;AA3C1C,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,cAAsB;AAGtB;AAAA,IAAAA,EAAA,aAAqC;AACrC,IAAAA,EAAA,wBAAqC;AACrC,IAAAA,EAAA,qBAAkC;AAClC,IAAAA,EAAA,oBAAa;AAGb;AAAA,IAAAA,EAAA,2BAAwC;AACxC,IAAAA,EAAA,sBAAmC;AACnC,IAAAA,EAAA,qBAAkC;AAClC,IAAAA,EAAA,kBAAW;AAEX,IAAAA,EAAA,yBAAoD,CAAC,MAAM,MAAM,KAAK,CAAC;AACvE,IAAAA,EAAA,kBAAmB;AACnB,IAAAA,EAAA,kBAAmB;AACnB,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA,cAA8B;AAC9B,IAAAA,EAAA,gBAA0B;AAE1B,IAAAA,EAAA,0BAAkC;AAClC,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,4CAAgE,IAAA;AAGhE;AAAA,IAAAA,EAAA,iBAA4B;AAC5B,IAAAA,EAAA,sBAAuB;AACvB,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGA;AAAA,IAAAA,EAAA;AAkQA,IAAAA,EAAA,sBAAe,MAAM;AAAE,WAAK,OAAA,GAAU,KAAK,cAAc;AAAA,IAAM;AA/PrE,SAAK,SAASD,EAAQ,QACtB,KAAK,MAAM,OAAO,oBAAoB,GACtC,KAAK,WAAWA,EAAQ,YAAY,KACpC,KAAK,UAAUA,EAAQ,WAAW,GAE9BA,EAAQ,oBAAiB,KAAK,kBAAkBA,EAAQ,kBAG5D,KAAK,aAAakR,EAAYlR,EAAQ,SAAS,CAAA,GAAI,KAAK,eAAe;AAEvE,UAAMqE,IAAK,KAAK,OAAO,WAAW,UAAU,EAAE,OAAO,IAAM,WAAW,IAAM;AAC5E,QAAI,CAACA,EAAI,OAAM,IAAI,MAAM,sBAAsB;AAC/C,SAAK,KAAKA,GAEVA,EAAG,OAAOA,EAAG,UAAU,GACvBA,EAAG,OAAOA,EAAG,KAAK,GAClBA,EAAG,UAAUA,EAAG,WAAWA,EAAG,mBAAmB,GAEjD,KAAK,WAAWgB,EAAsBhB,CAAE,GACxC,KAAK,SAAS,IAAItE,EAAYC,EAAQ,MAAM,GAC5C,KAAK,aAAa,IAAI+B,EAAgB,KAAK,QAAQ,KAAK,QAAQ/B,EAAQ,QAAQ,GAChF,KAAK,WAAW,SAAS,MAAM;AAAE,WAAK,cAAc,IAAM,KAAK,UAAU,cAAc;AAAA,IAAG,CAAC,GAEvFA,EAAQ,aAAa,OACvB,KAAK,OAAO,IAAIwG,EAAOnC,GAAIrE,EAAQ,IAAI,IAGrCA,EAAQ,kBAAkB,OAC5B,KAAK,UAAU,IAAIwJ,EAAU,KAAK,OAAO,iBAAiB,SAAS,IAAI,GACvE,KAAK,uBAAuB,KAAK,gBAAgB,KAAK,IAAI,GAC1D,KAAK,wBAAwB,KAAK,iBAAiB,KAAK,IAAI,GAC5D,KAAK,OAAO,iBAAiB,aAAa,KAAK,oBAAoB,GACnE,KAAK,OAAO,iBAAiB,cAAc,KAAK,qBAAqB,IAGvE,KAAK,YAAA,GACL,KAAK,OAAA,GACL,OAAO,iBAAiB,UAAU,KAAK,YAAY,GACnD,KAAK,gBAAA;AAAA,EACP;AAAA,EAEQ,cAAoB;AAC1B,UAAM,EAAE,IAAAnF,MAAO,MACTuV,IAAOzE,GAAA,GACPlQ,IAAU,KAAK,SAAS;AAC9B,SAAK,MAAMZ,EAAG,kBAAA,GACdA,EAAG,gBAAgB,KAAK,GAAG,GAE3B,KAAK,iBAAiBA,EAAG,aAAA,GACzBA,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,WAAWA,EAAG,cAAcuV,EAAK,WAAWvV,EAAG,WAAW;AAC7D,UAAMgE,IAASpD,EAAQ,WAAW;AAClC,IAAIoD,MAAW,OACbhE,EAAG,wBAAwBgE,CAAM,GACjChE,EAAG,oBAAoBgE,GAAQ,GAAGhE,EAAG,OAAO,IAAO,GAAG,CAAC,IAGzD,KAAK,cAAcA,EAAG,aAAA,GACtBA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GACvDA,EAAG,WAAWA,EAAG,sBAAsBuV,EAAK,SAASvV,EAAG,WAAW,GACnE,KAAK,aAAauV,EAAK,QAAQ,QAG/B,KAAK,oBAAoBvV,EAAG,aAAA,GAC5BA,EAAG,WAAWA,EAAG,cAAc,KAAK,iBAAiB;AACrD,UAAMwV,IAAa5U,EAAQ,WAAW;AACtC,IAAI4U,MAAe,OACjBxV,EAAG,wBAAwBwV,CAAU,GACrCxV,EAAG,oBAAoBwV,GAAY,GAAGxV,EAAG,OAAO,IAAO,GAAG,CAAC,GAC3DA,EAAG,oBAAoBwV,GAAY,CAAC,IAGtC,KAAK,eAAexV,EAAG,aAAA,GACvBA,EAAG,WAAWA,EAAG,cAAc,KAAK,YAAY;AAChD,UAAMyV,IAAY7U,EAAQ,WAAW;AACrC,IAAI6U,MAAc,OAChBzV,EAAG,wBAAwByV,CAAS,GACpCzV,EAAG,oBAAoByV,GAAW,GAAGzV,EAAG,OAAO,IAAO,GAAG,CAAC,GAC1DA,EAAG,oBAAoByV,GAAW,CAAC,IAGrC,KAAK,cAAczV,EAAG,aAAA,GACtBA,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW;AAC/C,UAAMiE,IAAWrD,EAAQ,WAAW;AACpC,IAAIqD,MAAa,OACfjE,EAAG,wBAAwBiE,CAAQ,GACnCjE,EAAG,oBAAoBiE,GAAU,GAAGjE,EAAG,OAAO,IAAO,GAAG,CAAC,GACzDA,EAAG,oBAAoBiE,GAAU,CAAC,IAGpCjE,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAEA,QAAQqF,GAA4B;AAClC,SAAK,OAAOA;AACZ,UAAM,EAAE,MAAAqF,GAAM,MAAAD,GAAM,SAAAiL,IAAU,CAAC,GAAG,CAAC,GAAG,QAAAjN,IAAS,CAAC,GAAG,GAAG,CAAC,MAAMpD;AAC7D,SAAK,WAAWqF,IAAOD,GACvB,KAAK,WAAWiL,EAAQ,CAAC,IAAI,KAAK,UAClC,KAAK,WAAWA,EAAQ,CAAC,IAAI,KAAK;AAElC,UAAMjT,IAAY,IAAI,aAAa,KAAK,WAAW,CAAC;AACpD,aAASsD,IAAI,GAAGA,IAAI2E,GAAM3E;AACxB,eAAS7L,IAAI,GAAGA,IAAIuQ,GAAMvQ,KAAK;AAC7B,cAAM6I,KAAKgD,IAAI0E,IAAOvQ,KAAK;AAC3B,QAAAuI,EAAUM,CAAC,IAAI0F,EAAO,CAAC,IAAIvO,IAAIwb,EAAQ,CAAC,GACxCjT,EAAUM,IAAI,CAAC,IAAI0F,EAAO,CAAC,GAC3BhG,EAAUM,IAAI,CAAC,IAAI0F,EAAO,CAAC,IAAI1C,IAAI2P,EAAQ,CAAC;AAAA,MAC9C;AAGF,UAAM,EAAE,IAAA1V,MAAO;AACf,IAAAA,EAAG,WAAWA,EAAG,cAAc,KAAK,iBAAiB,GACrDA,EAAG,WAAWA,EAAG,cAAcyC,GAAWzC,EAAG,WAAW,GAExDA,EAAG,WAAWA,EAAG,cAAc,KAAK,YAAY,GAChDA,EAAG,WAAWA,EAAG,cAAcqF,EAAK,SAASrF,EAAG,WAAW;AAG3D,UAAM0C,IAAS2C,EAAK,UAAU,KAAK,oBAAoB,KAAK,QAAQ;AACpE,IAAArF,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,WAAWA,EAAG,cAAc0C,GAAQ1C,EAAG,WAAW,GAErD,KAAK,aAAA,GACL,KAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,eAAqB;AAC3B,QAAI,CAAC,KAAK,KAAM;AAChB,UAAM,EAAE,MAAA0K,GAAM,MAAAD,GAAM,SAAAkL,GAAS,SAAAD,IAAU,CAAC,GAAG,CAAC,GAAG,QAAAjN,IAAS,CAAC,GAAG,GAAG,CAAC,EAAA,IAAM,KAAK;AAE3E,QAAImN,IAAO,QAAWC,IAAO;AAC7B,aAAS9S,IAAI,GAAGA,IAAI4S,EAAQ,QAAQ5S;AAChC,MAAI4S,EAAQ5S,CAAC,IAAI6S,MAAMA,IAAOD,EAAQ5S,CAAC,IACnC4S,EAAQ5S,CAAC,IAAI8S,MAAMA,IAAOF,EAAQ5S,CAAC;AAG3C,SAAK,SAAS;AAAA,MACZ,MAAM0F,EAAO,CAAC,IAAIiN,EAAQ,CAAC,IAAE;AAAA,MAC7B,MAAMjN,EAAO,CAAC,KAAKgC,IAAO,KAAKiL,EAAQ,CAAC,IAAIA,EAAQ,CAAC,IAAE;AAAA,MACvD,MAAMjN,EAAO,CAAC;AAAA,MACd,MAAMA,EAAO,CAAC,IAAImN;AAAA,MAClB,MAAMnN,EAAO,CAAC,IAAIiN,EAAQ,CAAC,IAAE;AAAA,MAC7B,MAAMjN,EAAO,CAAC,KAAKiC,IAAO,KAAKgL,EAAQ,CAAC,IAAIA,EAAQ,CAAC,IAAE;AAAA,IAAA,GAErD,KAAK,QAAM,KAAK,KAAK,aAAa,KAAK,MAAM;AAAA,EACnD;AAAA,EAEQ,oBAAoB5R,GAA6B;AACvD,UAAMpB,IAAS,IAAI,aAAaoB,IAAQ,CAAC,GACnCgS,IAAU,KAAK,WAAW;AAChC,aAAS/S,IAAI,GAAGA,IAAIe,GAAOf,KAAK;AAC9B,YAAM7I,IAAI4b,EAAQ/S,IAAI+S,EAAQ,MAAM;AACpC,MAAApT,EAAOK,IAAI,CAAC,IAAI7I,EAAE,CAAC,GACnBwI,EAAOK,IAAI,IAAI,CAAC,IAAI7I,EAAE,CAAC,GACvBwI,EAAOK,IAAI,IAAI,CAAC,IAAI7I,EAAE,CAAC;AAAA,IACzB;AACA,WAAOwI;AAAA,EACT;AAAA,EAEA,SAAe;AACb,UAAM,EAAE,IAAA1C,GAAI,QAAArC,EAAA,IAAW;AACvB,IAAAqC,EAAG,SAAS,GAAG,GAAGA,EAAG,OAAO,OAAOA,EAAG,OAAO,MAAM,GACnDA,EAAG,WAAW,KAAK,gBAAgB,CAAC,GAAG,KAAK,gBAAgB,CAAC,GAAG,KAAK,gBAAgB,CAAC,GAAG,KAAK,gBAAgB,CAAC,CAAC,GAChHA,EAAG,MAAMA,EAAG,mBAAmBA,EAAG,gBAAgB;AAElD,UAAMoN,IAAWzP,EAAO,wBAAA;AAGxB,QAFI,KAAK,QAAM,KAAK,KAAK,OAAOyP,CAAQ,GAEpC,KAAK,WAAW,KAAK,KAAK,KAAK;AACjC,YAAMxM,IAAU,KAAK,SAAS;AAC9B,MAAAZ,EAAG,WAAWY,EAAQ,OAAO,GAC7BZ,EAAG,iBAAiBY,EAAQ,SAAS,kBAAkB,IAAOwM,CAAQ,GACtEpN,EAAG,UAAUY,EAAQ,SAAS,WAAW,KAAK,OAAO,GACrDZ,EAAG,UAAUY,EAAQ,SAAS,YAAY,KAAK,QAAQ,GACvDZ,EAAG,UAAUY,EAAQ,SAAS,YAAY,KAAK,QAAQ,GACvDZ,EAAG,WAAWY,EAAQ,SAAS,YAAY,IAAI,aAAa,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,GAE1EZ,EAAG,gBAAgB,KAAK,GAAG,GAC3BA,EAAG,sBAAsBA,EAAG,WAAW,KAAK,YAAYA,EAAG,gBAAgB,GAAG,KAAK,QAAQ,GAC3FA,EAAG,gBAAgB,IAAI;AAAA,IACzB;AACA,SAAK,UAAU,QAAQ;AAAA,EACzB;AAAA,EAEQ,kBAAwB;AAC9B,UAAM+O,IAAO,MAAM;AACjB,YAAMxQ,IAAS,KAAK,WAAW,OAAA;AAC/B,OAAI,KAAK,eAAeA,OACtB,KAAK,OAAA,GACL,KAAK,cAAc,KAErB,KAAK,mBAAmB,sBAAsBwQ,CAAI;AAAA,IACpD;AACA,SAAK,mBAAmB,sBAAsBA,CAAI;AAAA,EACpD;AAAA,EAEA,YAAkB;AAChB,QAAI,CAAC,KAAK,OAAQ;AAClB,UAAM,EAAE,MAAA5R,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,MAAS,KAAK;AACpD,SAAK,OAAO,YAAYL,GAAMC,GAAMC,GAAMC,GAAMC,GAAMC,CAAI,GAC1D,KAAK,OAAO,UAAU,KACtB,KAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,gBAAgB,GAAqB;AAC3C,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,KAAM;AACjC,UAAMmJ,IAAO,KAAK,OAAO,sBAAA,GACnBhN,IAAI,EAAE,UAAUgN,EAAK,MAAM/M,IAAI,EAAE,UAAU+M,EAAK,KAEhD,EAAE,OAAAuG,GAAO,QAAAC,MAAW,KAAK,cAAA,GACzBC,IAAW,KAAK,OAAO,wBAAA,GACvBvE,IAAMZ,EAAoBtO,GAAGC,GAAGsT,GAAOC,GAAQC,CAAQ,GAGvD,EAAE,MAAA1C,GAAM,MAAAD,GAAM,SAAAkL,GAAS,SAAAD,IAAU,CAAC,GAAE,CAAC,GAAG,QAAAjN,IAAS,CAAC,GAAE,GAAE,CAAC,EAAA,IAAM,KAAK,MAClEsN,IAAU,IAAI,aAAa,KAAK,WAAW,CAAC,GAC5CC,IAAQ,IAAI,aAAa,KAAK,QAAQ;AAE5C,aAASjQ,IAAI,GAAGA,IAAI2E,GAAM3E;AACxB,eAAS7L,IAAI,GAAGA,IAAIuQ,GAAMvQ,KAAK;AAC7B,cAAM+V,IAAMlK,IAAI0E,IAAOvQ;AACvB,QAAA6b,EAAQ9F,IAAI,CAAC,IAAIxH,EAAO,CAAC,IAAIvO,IAAIwb,EAAQ,CAAC,GAC1CK,EAAQ9F,IAAI,IAAE,CAAC,IAAIxH,EAAO,CAAC,IAAIkN,EAAQ1F,CAAG,IAAI,GAC9C8F,EAAQ9F,IAAI,IAAE,CAAC,IAAIxH,EAAO,CAAC,IAAI1C,IAAI2P,EAAQ,CAAC,GAC5CM,EAAM/F,CAAG,IAAI,KAAK,IAAI,KAAK,UAAU,KAAK,UAAU0F,EAAQ1F,CAAG,CAAC,IAAI;AAAA,MACtE;AAGF,UAAMrJ,IAAMuC,EAAWN,GAAKkN,GAASC,CAAK;AAE1C,QAAIpP;AACF,UAAIA,EAAI,UAAU,KAAK,cAAc;AACnC,aAAK,eAAeA,EAAI;AACxB,cAAMqP,IAAM,KAAK,KAAK,QAAQrP,EAAI,KAAK,GACjCb,IAAI,KAAK,MAAMa,EAAI,QAAQ6D,CAAI,GAC/BvQ,IAAI0M,EAAI,QAAQ6D;AAEtB,aAAK,QAAQ,KAAK;AAAA,UAChB,OAAO7D,EAAI;AAAA,UACX,UAAU,CAACmP,EAAQnP,EAAI,QAAM,CAAC,GAAG6B,EAAO,CAAC,IAAIkN,EAAQ/O,EAAI,KAAK,GAAGmP,EAAQnP,EAAI,QAAM,IAAE,CAAC,CAAC;AAAA,UACvF,YAAY,EAAE,QAAQqP,EAAI,QAAQ,CAAC,GAAG,KAAKlQ,GAAG,KAAK7L,EAAA;AAAA,QAAE,GACpDP,GAAGC,CAAC;AAAA,MACT;AACE,aAAK,QAAQ,eAAeD,GAAGC,CAAC;AAAA,QAEpC,CAAW,KAAK,iBAAiB,OAC/B,KAAK,QAAQ,KAAA,GACb,KAAK,eAAe;AAAA,EAExB;AAAA,EAEQ,mBAAyB;AAC/B,IAAI,KAAK,YAAW,KAAK,QAAQ,KAAA,GAAQ,KAAK,eAAe;AAAA,EAC/D;AAAA,EAGQ,SAAe;AACrB,UAAMsT,IAAQ,KAAK,OAAO,aAAaC,IAAS,KAAK,OAAO;AAC5D,SAAK,OAAO,QAAQD,IAAQ,KAAK,KAAK,KAAK,OAAO,SAASC,IAAS,KAAK,KACzE,KAAK,GAAG,SAAS,GAAG,GAAG,KAAK,OAAO,OAAO,KAAK,OAAO,MAAM,GAC5D,KAAK,OAAO,SAASD,IAAQC;AAAA,EAC/B;AAAA,EACA,gBAAgB;AAAE,UAAMxG,IAAO,KAAK,OAAO,sBAAA;AAAyB,WAAO,EAAE,OAAOA,EAAK,OAAO,QAAQA,EAAK,OAAA;AAAA,EAAU;AAAA,EAEvH,gBAAgB;AlBlWlB,QAAAF;AkBmWI,aAAOA,IAAA,KAAK,SAAL,gBAAAA,EAAW,gBAAe,CAAA;AAAA,EACnC;AAAA,EAEA,0BAA0B;AACxB,WAAO,KAAK,OAAO,wBAAA;AAAA,EACrB;AAAA,EAEA,gBAAgBvC,GAAoC;AAClD,QAAI,CAAC,KAAK,KAAM,QAAO,EAAE,GAAG,GAAG,GAAG,GAAG,SAAS,GAAA;AAC9C,UAAM,EAAE,OAAAgJ,GAAO,QAAAC,MAAW,KAAK,cAAA;AAC/B,WAAO,KAAK,KAAK,gBAAgBjJ,GAAU,KAAK,OAAO,wBAAA,GAA2BgJ,GAAOC,CAAM;AAAA,EACjG;AAAA,EAEA,GAAG3G,GAAezI,GAAyC;AACzD,IAAK,KAAK,eAAe,IAAIyI,CAAK,KAAG,KAAK,eAAe,IAAIA,GAAO,oBAAI,IAAA,CAAK,GAC7E,KAAK,eAAe,IAAIA,CAAK,EAAG,IAAIzI,CAAQ;AAAA,EAC9C;AAAA,EAEQ,UAAUmC,GAAoB;AACpC,UAAMmP,IAAY,KAAK,eAAe,IAAInP,CAAI;AAC9C,IAAKmP,KACLA,EAAU,QAAQ,OAAMyF,EAAG;AAAA,MACzB,MAAA5U;AAAA,MAAmB,WAAW,YAAY,IAAA;AAAA,MAC1C,OAAO,EAAE,KAAK,IAAI,WAAW,IAAI,eAAe,KAAK,UAAU,WAAW,EAAA;AAAA,MAC1E,QAAQ,EAAE,QAAQ,CAAC,GAAG,KAAK,OAAO,MAAM,GAAU,QAAQ,KAAK,OAAO,QAAQ,OAAO,KAAK,OAAO,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,OAAO,IAAA;AAAA,IAAI,CACpJ,CAAC;AAAA,EACJ;AAAA,EAEA,UAAgB;AACd,WAAO,oBAAoB,UAAU,KAAK,YAAY,GAClD,KAAK,oBAAkB,qBAAqB,KAAK,gBAAgB,GACjE,KAAK,WAAS,KAAK,QAAQ,QAAA;AAC/B,UAAM,EAAE,IAAAF,MAAO;AACf,IAAI,KAAK,OAAKA,EAAG,kBAAkB,KAAK,GAAG,GAC3C,CAAC,KAAK,gBAAgB,KAAK,aAAa,KAAK,mBAAmB,KAAK,cAAc,KAAK,WAAW,EAAE,QAAQ,CAAA1J,MAAKA,KAAK0J,EAAG,aAAa1J,CAAC,CAAC,GACzI0L,EAAoBhC,GAAI,KAAK,QAAQ;AAAA,EACvC;AACF;ACrYO,MAAMkW,GAAc;AAAA,EAiBzB,YAAYlW,GAA4BmW,IAA+B,IAAI;AAhBnE,IAAAva,EAAA;AACA,IAAAA,EAAA,aAAqC;AAErC,IAAAA,EAAA,wBAAqC;AACrC,IAAAA,EAAA,sBAAmC;AACnC,IAAAA,EAAA,qBAAkC;AAClC,IAAAA,EAAA,qBAAkC;AAClC,IAAAA,EAAA,8BAA2C;AAE3C,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,6BAAsB;AAEtB,IAAAA,EAAA,cAAO;AACP,IAAAA,EAAA,cAAO;AAGb,SAAK,KAAKoE,GACV,KAAK,YAAA;AAAA,EACP;AAAA,EAEQ,cAAoB;AAC1B,UAAM,EAAE,IAAAA,MAAO;AAEf,SAAK,MAAMA,EAAG,kBAAA,GACdA,EAAG,gBAAgB,KAAK,GAAG,GAE3B,KAAK,iBAAiBA,EAAG,aAAA,GACzB,KAAK,eAAeA,EAAG,aAAA,GACvB,KAAK,cAAcA,EAAG,aAAA,GACtB,KAAK,cAAcA,EAAG,aAAA,GACtB,KAAK,uBAAuBA,EAAG,aAAA,GAE/BA,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAWqF,GAA+B;AACxC,UAAM,EAAE,IAAArF,MAAO;AAEf,SAAK,OAAOqF,EAAK,QAAQ,QACzB,KAAK,OAAOA,EAAK,QAAQ,QACzB,KAAK,cAAc,KAAK,OAAO,KAAK;AAGpC,UAAM5C,IAAY,IAAI,aAAa,KAAK,cAAc,CAAC,GACjD+L,IAAU,IAAI,aAAa,KAAK,cAAc,CAAC;AAErD,aAAS7D,IAAM,GAAGA,IAAM,KAAK,MAAMA;AACjC,eAASC,IAAM,GAAGA,IAAM,KAAK,MAAMA,KAAO;AACxC,cAAMqF,IAAMtF,IAAM,KAAK,OAAOC,GACxBwH,IAAKnC,IAAM;AAEjB,QAAAxN,EAAU2P,CAAE,IAAI/M,EAAK,QAAQuF,CAAG,GAChCnI,EAAU2P,IAAK,CAAC,IAAI/M,EAAK,QAAQ4K,CAAG,GACpCxN,EAAU2P,IAAK,CAAC,IAAI/M,EAAK,QAAQsF,CAAG;AAAA,MACtC;AAIF,SAAK,iBAAiBlI,GAAW+L,CAAO;AAGxC,UAAM9L,IAAS2C,EAAK,UAAU,KAAK,qBAAqBA,EAAK,OAAO,GAG9DoJ,IAAU,KAAK,wBAAA;AACrB,SAAK,aAAaA,EAAQ;AAG1B,UAAM2H,IAAmB,KAAK,yBAAA;AAC9B,SAAK,sBAAsBA,EAAiB,QAG5CpW,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,WAAWA,EAAG,cAAcyC,GAAWzC,EAAG,YAAY,GAEzDA,EAAG,WAAWA,EAAG,cAAc,KAAK,YAAY,GAChDA,EAAG,WAAWA,EAAG,cAAcwO,GAASxO,EAAG,YAAY,GAEvDA,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,WAAWA,EAAG,cAAc0C,GAAQ1C,EAAG,YAAY,GAEtDA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GACvDA,EAAG,WAAWA,EAAG,sBAAsByO,GAASzO,EAAG,WAAW,GAE9DA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,oBAAoB,GAChEA,EAAG,WAAWA,EAAG,sBAAsBoW,GAAkBpW,EAAG,WAAW;AAAA,EACzE;AAAA,EAEQ,iBAAiByC,GAAyB+L,GAA6B;AAC7E,UAAM,EAAE,MAAA/D,GAAM,MAAAC,EAAA,IAAS;AAEvB,aAASC,IAAM,GAAGA,IAAMD,GAAMC;AAC5B,eAASC,IAAM,GAAGA,IAAMH,GAAMG,KAAO;AACnC,cAAMqF,IAAMtF,IAAMF,IAAOG,GACnBwH,IAAKnC,IAAM,GAGX9F,IAAI1H,EAAU2P,IAAK,CAAC,GACpBiE,IAAKzL,IAAM,IAAInI,GAAWwN,IAAM,KAAK,IAAI,CAAC,IAAI9F,GAC9CmM,IAAK1L,IAAMH,IAAO,IAAIhI,GAAWwN,IAAM,KAAK,IAAI,CAAC,IAAI9F,GACrDoM,IAAK5L,IAAM,IAAIlI,GAAWwN,IAAMxF,KAAQ,IAAI,CAAC,IAAIN,GACjDqM,IAAK7L,IAAMD,IAAO,IAAIjI,GAAWwN,IAAMxF,KAAQ,IAAI,CAAC,IAAIN,GAGxDnN,KAAMsZ,IAAKD,KAAM,GACjBnZ,KAAMsZ,IAAKD,KAAM,GAEjBtI,IAAK,CAACjR,GACNkR,IAAK,GACLC,IAAK,CAACjR,GAENhE,IAAM,KAAK,KAAK+U,IAAKA,IAAKC,IAAKA,IAAKC,IAAKA,CAAE;AACjD,QAAAK,EAAQ4D,CAAE,IAAInE,IAAK/U,GACnBsV,EAAQ4D,IAAK,CAAC,IAAIlE,IAAKhV,GACvBsV,EAAQ4D,IAAK,CAAC,IAAIjE,IAAKjV;AAAA,MACzB;AAAA,EAEJ;AAAA,EAEQ,qBAAqBsR,GAAqC;AAChE,UAAM9H,IAAS,IAAI,aAAa8H,EAAQ,SAAS,CAAC;AAGlD,QAAIpN,IAAO,OAAUG,IAAO;AAC5B,aAASwF,IAAI,GAAGA,IAAIyH,EAAQ,QAAQzH;AAClC,MAAIyH,EAAQzH,CAAC,IAAI3F,MAAMA,IAAOoN,EAAQzH,CAAC,IACnCyH,EAAQzH,CAAC,IAAIxF,MAAMA,IAAOiN,EAAQzH,CAAC;AAGzC,UAAM0T,IAAQlZ,IAAOH,KAAQ;AAG7B,aAAS2F,IAAI,GAAGA,IAAIyH,EAAQ,QAAQzH,KAAK;AACvC,YAAMS,KAAKgH,EAAQzH,CAAC,IAAI3F,KAAQqZ,GAC1BrE,IAAKrP,IAAI;AAGf,MAAAL,EAAO0P,CAAE,IAAI,QAAQ5O,IAAI,OACzBd,EAAO0P,IAAK,CAAC,IAAI,OAAQ5O,IAAI,OAC7Bd,EAAO0P,IAAK,CAAC,IAAI,QAAQ5O,IAAI;AAAA,IAC/B;AAEA,WAAOd;AAAA,EACT;AAAA,EAEQ,0BAAuC;AAC7C,UAAM,EAAE,MAAA+H,GAAM,MAAAC,EAAA,IAAS,MACjB+D,IAAoB,CAAA;AAE1B,aAAS9D,IAAM,GAAGA,IAAMD,IAAO,GAAGC;AAChC,eAASC,IAAM,GAAGA,IAAMH,IAAO,GAAGG,KAAO;AACvC,cAAMwD,IAAUzD,IAAMF,IAAOG,GACvB0D,IAAWF,IAAU,GACrBC,IAAaD,IAAU3D,GACvB8D,IAAcF,IAAa;AAGjC,QAAAI,EAAQ,KAAKL,GAASC,GAAYC,CAAQ,GAC1CG,EAAQ,KAAKH,GAAUD,GAAYE,CAAW;AAAA,MAChD;AAGF,WAAO,IAAI,YAAYE,CAAO;AAAA,EAChC;AAAA,EAEQ,2BAAwC;AAC9C,UAAM,EAAE,MAAAhE,GAAM,MAAAC,EAAA,IAAS,MACjB+D,IAAoB,CAAA;AAG1B,aAAS9D,IAAM,GAAGA,IAAMD,GAAMC;AAC5B,eAASC,IAAM,GAAGA,IAAMH,IAAO,GAAGG,KAAO;AACvC,cAAMqF,IAAMtF,IAAMF,IAAOG;AACzB,QAAA6D,EAAQ,KAAKwB,GAAKA,IAAM,CAAC;AAAA,MAC3B;AAIF,aAASrF,IAAM,GAAGA,IAAMH,GAAMG;AAC5B,eAASD,IAAM,GAAGA,IAAMD,IAAO,GAAGC,KAAO;AACvC,cAAMsF,IAAMtF,IAAMF,IAAOG;AACzB,QAAA6D,EAAQ,KAAKwB,GAAKA,IAAMxF,CAAI;AAAA,MAC9B;AAGF,WAAO,IAAI,YAAYgE,CAAO;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO7N,GAA0B8V,IAAY,IAAa;AACxD,UAAM,EAAE,IAAA1W,MAAO;AAEf,QAAI,KAAK,gBAAgB,EAAG;AAE5B,IAAAA,EAAG,gBAAgB,KAAK,GAAG;AAG3B,UAAMgE,IAASpD,EAAQ,WAAW;AAClC,IAAIoD,KAAU,MACZhE,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,wBAAwBgE,CAAM,GACjChE,EAAG,oBAAoBgE,GAAQ,GAAGhE,EAAG,OAAO,IAAO,GAAG,CAAC;AAIzD,UAAM4O,IAAYhO,EAAQ,WAAW;AACrC,IAAIgO,KAAa,MACf5O,EAAG,WAAWA,EAAG,cAAc,KAAK,YAAY,GAChDA,EAAG,wBAAwB4O,CAAS,GACpC5O,EAAG,oBAAoB4O,GAAW,GAAG5O,EAAG,OAAO,IAAO,GAAG,CAAC;AAI5D,UAAMiE,IAAWrD,EAAQ,WAAW;AACpC,IAAIqD,KAAY,MACdjE,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,wBAAwBiE,CAAQ,GACnCjE,EAAG,oBAAoBiE,GAAU,GAAGjE,EAAG,OAAO,IAAO,GAAG,CAAC,IAGvD0W,KACF1W,EAAG,WAAWA,EAAG,sBAAsB,KAAK,oBAAoB,GAChEA,EAAG,aAAaA,EAAG,OAAO,KAAK,qBAAqBA,EAAG,cAAc,CAAC,MAEtEA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GACvDA,EAAG,aAAaA,EAAG,WAAW,KAAK,YAAYA,EAAG,cAAc,CAAC,IAGnEA,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAEA,UAAgB;AACd,UAAM,EAAE,IAAAA,MAAO;AAEf,IAAI,KAAK,OAAKA,EAAG,kBAAkB,KAAK,GAAG,GACvC,KAAK,kBAAgBA,EAAG,aAAa,KAAK,cAAc,GACxD,KAAK,gBAAcA,EAAG,aAAa,KAAK,YAAY,GACpD,KAAK,eAAaA,EAAG,aAAa,KAAK,WAAW,GAClD,KAAK,eAAaA,EAAG,aAAa,KAAK,WAAW,GAClD,KAAK,wBAAsBA,EAAG,aAAa,KAAK,oBAAoB;AAAA,EAC1E;AACF;AC3NO,MAAM2W,GAAsB;AAAA,EAwCjC,YAAYhb,GAAuC;AAvC3C,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,cAAsB;AAEtB,IAAAA,EAAA,yBAAoD,CAAC,MAAM,MAAM,KAAK,CAAC;AACvE,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA,gBAA0B;AAC1B,IAAAA,EAAA,qBAAc;AAEd,IAAAA,EAAA,0BAAkC;AAClC,IAAAA,EAAA,qBAAc;AAEd,IAAAA,EAAA,4CAAgE,IAAA;AAGhE;AAAA,IAAAA,EAAA,iBAA4B;AAC5B,IAAAA,EAAA,6BAA+B;AAC/B,IAAAA,EAAA,kBAAqC;AACrC,IAAAA,EAAA,8BAAyD;AACzD,IAAAA,EAAA,+BAA6C;AAG7C;AAAA,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,aAAM;AACN,IAAAA,EAAA,uBAAgB;AAkHhB,IAAAA,EAAA,sBAAe,MAAY;AACjC,WAAK,OAAA,GACL,KAAK,cAAc;AAAA,IACrB;AAlHE,SAAK,SAASD,EAAQ,QACtB,KAAK,MAAM,OAAO,oBAAoB,GACtC,KAAK,WAAWA,EAAQ,YAAY,IACpC,KAAK,YAAYA,EAAQ,aAAa,IACtC,KAAK,UAAUA,EAAQ,WAAW,GAClC,KAAK,iBAAiBA,EAAQ,kBAAkB,IAChD,KAAK,UAAUA,EAAQ,WAAW,MAClC,KAAK,iBAAiBA,EAAQ,kBAAkB,CAAC,GAAG,GAAG,CAAC,GAEpDA,EAAQ,oBACV,KAAK,kBAAkBA,EAAQ;AAIjC,UAAMqE,IAAK,KAAK,OAAO,WAAW,UAAU;AAAA,MAC1C,OAAO;AAAA,MACP,WAAW;AAAA,MACX,uBAAuB;AAAA,IAAA,CACxB;AAED,QAAI,CAACA;AACH,YAAM,IAAI,MAAM,sBAAsB;AAExC,SAAK,KAAKA,GAGVA,EAAG,OAAOA,EAAG,UAAU,GACvBA,EAAG,UAAUA,EAAG,MAAM,GACtBA,EAAG,OAAOA,EAAG,KAAK,GAClBA,EAAG,UAAUA,EAAG,WAAWA,EAAG,mBAAmB,GAGjD,KAAK,WAAWgB,EAAsBhB,CAAE,GAGxC,KAAK,OAAO,IAAIkW,GAAclW,CAAE,GAGhC,KAAK,SAAS,IAAItE,EAAYC,EAAQ,MAAM,GAG5C,KAAK,aAAa,IAAI+B,EAAgB,KAAK,QAAQ,KAAK,QAAQ/B,EAAQ,QAAQ,GAChF,KAAK,WAAW,SAAS,MAAM;AAC7B,WAAK,cAAc,IACnB,KAAK,UAAU,cAAc;AAAA,IAC/B,CAAC,GAGG,KAAK,aACP,KAAK,OAAO,IAAIwG,EAAOnC,GAAIrE,EAAQ,IAAI,IAIzC,KAAK,sBAAsBA,EAAQ,iBAAiB,IAChD,KAAK,wBACP,KAAK,UAAU,IAAIwJ,EAAU,KAAK,OAAO,iBAAiB,SAAS,MAAM;AAAA,MACvE,GAAGxJ,EAAQ;AAAA,MACX,WAAW;AAAA,MACX,WAAW;AAAA,IAAA,CACZ,GAED,KAAK,uBAAuB,KAAK,gBAAgB,KAAK,IAAI,GAC1D,KAAK,wBAAwB,KAAK,iBAAiB,KAAK,IAAI,GAC5D,KAAK,OAAO,iBAAiB,aAAa,KAAK,oBAAoB,GACnE,KAAK,OAAO,iBAAiB,cAAc,KAAK,qBAAqB,IAIvE,KAAK,OAAA,GACL,OAAO,iBAAiB,UAAU,KAAK,YAAY,GAGnD,KAAK,gBAAA;AAAA,EACP;AAAA,EAEQ,gBAAgB,GAAqB;AAC3C,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,SAAU;AAErC,UAAMgL,IAAO,KAAK,OAAO,sBAAA,GACnBhN,IAAI,EAAE,UAAUgN,EAAK,MACrB/M,IAAI,EAAE,UAAU+M,EAAK,KAGrByG,IAAW,KAAK,OAAO,wBAAA,GACvBvE,IAAMZ,EAAoBtO,GAAGC,GAAG+M,EAAK,OAAOA,EAAK,QAAQyG,CAAQ,GAGjExG,IAAMyD;AAAA,MACVxB;AAAA,MACA,KAAK,SAAS;AAAA,MACd,KAAK,SAAS;AAAA,MACd,KAAK,SAAS;AAAA,IAAA;AAGhB,IAAIjC,IAEF,KAAK,QAAQ,KAAK;AAAA,MAChB,OAAOA,EAAI,MAAM,KAAK,SAAS,QAAQ,SAASA,EAAI;AAAA,MACpD,UAAUA,EAAI;AAAA,IAAA,GACbjN,GAAGC,CAAC,IAEP,KAAK,QAAQ,KAAA;AAAA,EAEjB;AAAA,EAEQ,mBAAyB;AAC/B,IAAI,KAAK,WACP,KAAK,QAAQ,KAAA;AAAA,EAEjB;AAAA,EAOA,SAAe;AACb,UAAM,EAAE,QAAAyT,GAAQ,IAAArN,GAAI,KAAAsN,GAAK,QAAA3P,MAAW,MAE9BuP,IAAQG,EAAO,aACfF,IAASE,EAAO;AAEtB,IAAAA,EAAO,QAAQH,IAAQI,GACvBD,EAAO,SAASF,IAASG,GAEzBtN,EAAG,SAAS,GAAG,GAAGqN,EAAO,OAAOA,EAAO,MAAM,GAC7C1P,EAAO,SAASuP,IAAQC;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ9H,GAA+B;AACrC,SAAK,KAAK,WAAWA,CAAI,GACzB,KAAK,WAAWA,GAChB,KAAK,cAAcA,EAAK,QAAQ,SAASA,EAAK,QAAQ,QAGtD,KAAK,SAAS,KAAK,gBAAgBA,CAAI,GAGnC,KAAK,QAAQ,KAAK,UACpB,KAAK,KAAK,aAAa,KAAK,MAAM,GAGpC,KAAK,cAAc,IACnB,KAAK,UAAU,YAAY;AAAA,EAC7B;AAAA,EAEQ,gBAAgBA,GAAmC;AACzD,UAAMuR,IAAO,KAAK,IAAI,GAAGvR,EAAK,OAAO,GAC/BwR,IAAO,KAAK,IAAI,GAAGxR,EAAK,OAAO,GAC/ByR,IAAO,KAAK,IAAI,GAAGzR,EAAK,OAAO,GAC/B0R,IAAO,KAAK,IAAI,GAAG1R,EAAK,OAAO;AAErC,QAAI2R,IAAO,OAAUC,IAAO;AAC5B,aAASlU,IAAI,GAAGA,IAAIsC,EAAK,QAAQ,QAAQtC;AACvC,MAAIsC,EAAK,QAAQtC,CAAC,IAAIiU,MAAMA,IAAO3R,EAAK,QAAQtC,CAAC,IAC7CsC,EAAK,QAAQtC,CAAC,IAAIkU,MAAMA,IAAO5R,EAAK,QAAQtC,CAAC;AAGnD,WAAO,EAAE,MAAM6T,GAAM,MAAMC,GAAM,MAAMG,GAAM,MAAMC,GAAM,MAAMH,GAAM,MAAMC,EAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,YAAkB;AAChB,QAAI,CAAC,KAAK,OAAQ;AAElB,UAAM,EAAE,MAAA5Z,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,MAAS,KAAK,QAG9CR,IAAKM,IAAOH,GACZF,IAAKM,IAAOH,GACZF,IAAKM,IAAOH,GACZqR,IAAU;AAEhB,SAAK,OAAO;AAAA,MACVvR,IAAOH,IAAK0R;AAAA,MAAStR,IAAOH,IAAKyR;AAAA,MAASrR,IAAOH,IAAKwR;AAAA,MACtDpR,IAAON,IAAK0R;AAAA,MAASnR,IAAON,IAAKyR;AAAA,MAASlR,IAAON,IAAKwR;AAAA,IAAA,GAIxD,KAAK,OAAO,UAAU,MAEtB,KAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAe;AACb,UAAM,EAAE,IAAA1O,GAAI,UAAA6R,GAAU,MAAAC,GAAM,QAAAnU,GAAQ,iBAAAiP,MAAoB,MAElD+B,IAAY,YAAY,IAAA;AAG9B,IAAA3O,EAAG;AAAA,MACD4M,EAAgB,CAAC;AAAA,MACjBA,EAAgB,CAAC;AAAA,MACjBA,EAAgB,CAAC;AAAA,MACjBA,EAAgB,CAAC;AAAA,IAAA,GAEnB5M,EAAG,MAAMA,EAAG,mBAAmBA,EAAG,gBAAgB;AAGlD,UAAMoN,IAAWzP,EAAO,wBAAA;AAGxB,IAAI,KAAK,QACP,KAAK,KAAK,OAAOyP,CAAQ;AAI3B,UAAMxM,IAAUiR,EAAS;AAOzB,QANA7R,EAAG,WAAWY,EAAQ,OAAO,GAG7BZ,EAAG,iBAAiBY,EAAQ,SAAS,kBAAqB,IAAOwM,CAAQ,GACzEpN,EAAG,UAAUY,EAAQ,SAAS,WAAc,KAAK,OAAO,GAEpD,KAAK,gBAAgB;AACvB,YAAM,CAACoR,GAAIC,GAAIC,CAAE,IAAI,KAAK;AAC1B,MAAAlS,EAAG,UAAUY,EAAQ,SAAS,YAAeoR,GAAIC,GAAIC,CAAE,GACvDlS,EAAG,UAAUY,EAAQ,SAAS,WAAc,KAAK,OAAO;AAAA,IAC1D;AAEA,IAAAkR,EAAK,OAAOlR,GAAS,KAAK,SAAS;AAGnC,UAAMiO,IAAY,YAAY,IAAA,IAAQF;AACtC,SAAK,gBAAgBE,GACrB,KAAK;AAEL,UAAMC,IAAM,YAAY,IAAA;AACxB,IAAIA,IAAM,KAAK,iBAAiB,QAC9B,KAAK,MAAM,KAAK,YAChB,KAAK,aAAa,GAClB,KAAK,gBAAgBA,IAGvB,KAAK,UAAU,QAAQ;AAAA,EACzB;AAAA,EAEA,kBAAwB;AACtB,QAAI,KAAK,qBAAqB,KAAM;AAEpC,UAAMC,IAAO,MAAY;AACvB,WAAK,WAAW,OAAA,GAEZ,KAAK,gBACP,KAAK,OAAA,GACL,KAAK,cAAc,KAGrB,KAAK,mBAAmB,sBAAsBA,CAAI;AAAA,IACpD;AAEA,IAAAA,EAAA;AAAA,EACF;AAAA,EAEA,iBAAuB;AACrB,IAAI,KAAK,qBAAqB,SAC5B,qBAAqB,KAAK,gBAAgB,GAC1C,KAAK,mBAAmB;AAAA,EAE5B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAamI,GAAwB;AACnC,SAAK,YAAYA,GACjB,KAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmBjU,GAA+C;AAChE,SAAK,kBAAkBA,GACvB,KAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,WAA0B;AACxB,WAAO;AAAA,MACL,KAAK,KAAK;AAAA,MACV,eAAe,KAAK;AAAA,MACpB,WAAW,KAAK;AAAA,MAChB,WAAW;AAAA,IAAA;AAAA,EAEf;AAAA;AAAA;AAAA;AAAA,EAKA,YAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,gBAA4H;AAC1H,WAAK,KAAK,OACH,KAAK,KAAK,UAAA,IADM,CAAA;AAAA,EAEzB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgBiB,GAAgF;AAC9F,QAAI,CAAC,KAAK,KAAM,QAAO,EAAE,GAAG,GAAG,GAAG,GAAG,SAAS,GAAA;AAE9C,UAAMkJ,IAAW,KAAK,OAAO,wBAAA,GACvBzG,IAAO,KAAK,OAAO,sBAAA;AAEzB,WAAO,KAAK,KAAK,gBAAgBzC,GAAUkJ,GAAUzG,EAAK,OAAOA,EAAK,MAAM;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA,EAKA,0BAAwC;AACtC,WAAO,KAAK,OAAO,wBAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAmD;AACjD,UAAMA,IAAO,KAAK,OAAO,sBAAA;AACzB,WAAO,EAAE,OAAOA,EAAK,OAAO,QAAQA,EAAK,OAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,GAAGH,GAAezI,GAAyC;AACzD,IAAK,KAAK,eAAe,IAAIyI,CAAK,KAChC,KAAK,eAAe,IAAIA,GAAO,oBAAI,KAAK,GAE1C,KAAK,eAAe,IAAIA,CAAK,EAAG,IAAIzI,CAAQ;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,IAAIyI,GAAezI,GAAyC;ApBza9D,QAAA0I;AoB0aI,KAAAA,IAAA,KAAK,eAAe,IAAID,CAAK,MAA7B,QAAAC,EAAgC,OAAO1I;AAAA,EACzC;AAAA,EAEQ,UAAUmC,GAAoB;AACpC,UAAMmP,IAAY,KAAK,eAAe,IAAInP,CAAI;AAC9C,QAAI,CAACmP,EAAW;AAEhB,UAAM7I,IAAyB;AAAA,MAC7B,MAAAtG;AAAA,MACA,WAAW,YAAY,IAAA;AAAA,MACvB,OAAO,KAAK,SAAA;AAAA,MACZ,QAAQ;AAAA,QACN,QAAQ,CAAC,GAAG,KAAK,OAAO,MAAM;AAAA,QAC9B,QAAQ,KAAK,OAAO;AAAA,QACpB,OAAO,KAAK,OAAO;AAAA,QACnB,KAAK,KAAK,OAAO;AAAA,QACjB,KAAK,KAAK,OAAO;AAAA,MAAA;AAAA,IACnB;AAGF,IAAAmP,EAAU,QAAQ,CAAAtR,MAAY;AAC5B,MAAAA,EAASyI,CAAK;AAAA,IAChB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,SAAK,eAAA,GAEL,OAAO,oBAAoB,UAAU,KAAK,YAAY,GAGlD,KAAK,YACP,KAAK,QAAQ,QAAA,GACT,KAAK,wBACP,KAAK,OAAO,oBAAoB,aAAa,KAAK,oBAAoB,GAEpE,KAAK,yBACP,KAAK,OAAO,oBAAoB,cAAc,KAAK,qBAAqB,IAI5E,KAAK,WAAW,QAAA,GAChB,KAAK,KAAK,QAAA,GACVxE,EAAoB,KAAK,IAAI,KAAK,QAAQ,GAEtC,KAAK,QACP,KAAK,KAAK,QAAA,GAGZ,KAAK,eAAe,MAAA;AAAA,EACtB;AACF;ACxbO,MAAMmV,GAAsB;AAAA,EA2CjC,YAAYxb,GAAuC;AA1C3C,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,cAAsB;AAGtB;AAAA,IAAAA,EAAA,aAAqC;AACrC,IAAAA,EAAA,wBAAqC;AACrC,IAAAA,EAAA,sBAAmC;AACnC,IAAAA,EAAA,qBAAkC;AAClC,IAAAA,EAAA,oBAAa;AAGb;AAAA,IAAAA,EAAA,2BAAwC;AACxC,IAAAA,EAAA,2BAAwC;AACxC,IAAAA,EAAA,6BAA0C;AAC1C,IAAAA,EAAA,qBAAc;AAEd,IAAAA,EAAA,yBAAoD,CAAC,MAAM,MAAM,KAAK,CAAC;AACvE,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA,oBAAqC;AACrC,IAAAA,EAAA,gBAA0B;AAE1B,IAAAA,EAAA,0BAAkC;AAClC,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,4CAAgE,IAAA;AAGhE;AAAA,IAAAA,EAAA,iBAA4B;AAC5B,IAAAA,EAAA,sBAAuB;AACvB,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGA;AAAA,IAAAA,EAAA;AAoPA,IAAAA,EAAA,sBAAe,MAAM;AAAE,WAAK,OAAA,GAAU,KAAK,cAAc;AAAA,IAAM;AAjPrE,SAAK,SAASD,EAAQ,QACtB,KAAK,MAAM,OAAO,oBAAoB,GACtC,KAAK,kBAAkBA,EAAQ,mBAAmB,GAClD,KAAK,UAAUA,EAAQ,WAAW,GAE9BA,EAAQ,oBAAiB,KAAK,kBAAkBA,EAAQ,kBAG5D,KAAK,aAAakR,EAAYlR,EAAQ,SAAS,CAAA,GAAI,KAAK,eAAe;AAEvE,UAAMqE,IAAK,KAAK,OAAO,WAAW,UAAU,EAAE,OAAO,IAAM,WAAW,IAAM;AAC5E,QAAI,CAACA,EAAI,OAAM,IAAI,MAAM,sBAAsB;AAC/C,SAAK,KAAKA,GAEVA,EAAG,OAAOA,EAAG,UAAU,GACvBA,EAAG,OAAOA,EAAG,KAAK,GAClBA,EAAG,UAAUA,EAAG,WAAWA,EAAG,mBAAmB,GAEjD,KAAK,WAAWgB,EAAsBhB,CAAE,GACxC,KAAK,SAAS,IAAItE,EAAYC,EAAQ,MAAM,GAC5C,KAAK,aAAa,IAAI+B,EAAgB,KAAK,QAAQ,KAAK,QAAQ/B,EAAQ,QAAQ,GAChF,KAAK,WAAW,SAAS,MAAM;AAAE,WAAK,cAAc,IAAM,KAAK,UAAU,cAAc;AAAA,IAAG,CAAC,GAEvFA,EAAQ,aAAa,OACvB,KAAK,OAAO,IAAIwG,EAAOnC,GAAIrE,EAAQ,IAAI,IAGrCA,EAAQ,kBAAkB,OAC5B,KAAK,UAAU,IAAIwJ,EAAU,KAAK,OAAO,iBAAiB,SAAS,IAAI,GACvE,KAAK,uBAAuB,KAAK,gBAAgB,KAAK,IAAI,GAC1D,KAAK,wBAAwB,KAAK,iBAAiB,KAAK,IAAI,GAC5D,KAAK,OAAO,iBAAiB,aAAa,KAAK,oBAAoB,GACnE,KAAK,OAAO,iBAAiB,cAAc,KAAK,qBAAqB,IAGvE,KAAK,kBAAA,GACL,KAAK,OAAA,GACL,OAAO,iBAAiB,UAAU,KAAK,YAAY,GACnD,KAAK,gBAAA;AAAA,EACP;AAAA,EAEQ,oBAA0B;AAChC,UAAM,EAAE,IAAAnF,MAAO,MAGTyC,IAAY,IAAI,aAAa;AAAA;AAAA,MAEjC;AAAA,MAAO;AAAA,MAAO;AAAA,MACb;AAAA,MAAM;AAAA,MAAO;AAAA,MACb;AAAA,MAAO;AAAA,MAAM;AAAA,MACd;AAAA,MAAQ;AAAA,MAAM;AAAA;AAAA,MAEb;AAAA,MAAO;AAAA,MAAM;AAAA,IAAA,CACf,GACK+L,IAAU,IAAI,aAAa;AAAA,MAC9B;AAAA,MAAM;AAAA,MAAK;AAAA;AAAA,MACX;AAAA,MAAM;AAAA,MAAK;AAAA,MACX;AAAA,MAAM;AAAA,MAAK;AAAA,MACX;AAAA,MAAM;AAAA,MAAK;AAAA,MACX;AAAA,MAAM;AAAA,MAAM;AAAA;AAAA,IAAA,CACd,GACKC,IAAU,IAAI,YAAY;AAAA,MAC9B;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MACf;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,IAAA,CAClC,GAEK7N,IAAU,KAAK,SAAS;AAC9B,SAAK,MAAMZ,EAAG,kBAAA,GACdA,EAAG,gBAAgB,KAAK,GAAG,GAE3B,KAAK,iBAAiBA,EAAG,aAAA,GACzBA,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,WAAWA,EAAG,cAAcyC,GAAWzC,EAAG,WAAW;AACxD,UAAMgE,IAASpD,EAAQ,WAAW;AAClC,IAAIoD,MAAW,OACbhE,EAAG,wBAAwBgE,CAAM,GACjChE,EAAG,oBAAoBgE,GAAQ,GAAGhE,EAAG,OAAO,IAAO,GAAG,CAAC,IAGzD,KAAK,eAAeA,EAAG,aAAA,GACvBA,EAAG,WAAWA,EAAG,cAAc,KAAK,YAAY,GAChDA,EAAG,WAAWA,EAAG,cAAcwO,GAASxO,EAAG,WAAW;AACtD,UAAM4O,IAAYhO,EAAQ,WAAW;AACrC,IAAIgO,MAAc,OAChB5O,EAAG,wBAAwB4O,CAAS,GACpC5O,EAAG,oBAAoB4O,GAAW,GAAG5O,EAAG,OAAO,IAAO,GAAG,CAAC,IAG5D,KAAK,cAAcA,EAAG,aAAA,GACtBA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GACvDA,EAAG,WAAWA,EAAG,sBAAsByO,GAASzO,EAAG,WAAW,GAC9D,KAAK,aAAayO,EAAQ,QAG1B,KAAK,oBAAoBzO,EAAG,aAAA,GAC5BA,EAAG,WAAWA,EAAG,cAAc,KAAK,iBAAiB;AACrD,UAAMwV,IAAa5U,EAAQ,WAAW;AACtC,IAAI4U,MAAe,OACjBxV,EAAG,wBAAwBwV,CAAU,GACrCxV,EAAG,oBAAoBwV,GAAY,GAAGxV,EAAG,OAAO,IAAO,GAAG,CAAC,GAC3DA,EAAG,oBAAoBwV,GAAY,CAAC,IAGtC,KAAK,oBAAoBxV,EAAG,aAAA,GAC5BA,EAAG,WAAWA,EAAG,cAAc,KAAK,iBAAiB;AACrD,UAAMoX,IAASxW,EAAQ,WAAW;AAClC,IAAIwW,MAAW,OACbpX,EAAG,wBAAwBoX,CAAM,GACjCpX,EAAG,oBAAoBoX,GAAQ,GAAGpX,EAAG,OAAO,IAAO,GAAG,CAAC,GACvDA,EAAG,oBAAoBoX,GAAQ,CAAC,IAGlC,KAAK,sBAAsBpX,EAAG,aAAA,GAC9BA,EAAG,WAAWA,EAAG,cAAc,KAAK,mBAAmB;AACvD,UAAMiE,IAAWrD,EAAQ,WAAW;AACpC,IAAIqD,MAAa,OACfjE,EAAG,wBAAwBiE,CAAQ,GACnCjE,EAAG,oBAAoBiE,GAAU,GAAGjE,EAAG,OAAO,IAAO,GAAG,CAAC,GACzDA,EAAG,oBAAoBiE,GAAU,CAAC,IAGpCjE,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAEA,QAAQqF,GAA6B;AACnC,SAAK,aAAaA,GAClB,KAAK,cAAcA,EAAK,UAAU,SAAS;AAC3C,UAAM,EAAE,IAAArF,MAAO;AAEf,IAAAA,EAAG,WAAWA,EAAG,cAAc,KAAK,iBAAiB,GACrDA,EAAG,WAAWA,EAAG,cAAcqF,EAAK,WAAWrF,EAAG,WAAW,GAE7DA,EAAG,WAAWA,EAAG,cAAc,KAAK,iBAAiB,GACrDA,EAAG,WAAWA,EAAG,cAAcqF,EAAK,YAAYrF,EAAG,WAAW;AAG9D,UAAMgO,IAAe3I,EAAK,SAAS,KAAK,WAAW,cAAc,CAAC,GAC5D3C,IAAS2C,EAAK,UAAU,IAAI,aAAa,KAAK,cAAc,CAAC,EAAE,KAAK,CAAC,EAAE,IAAI,CAACgS,GAAGtU,MAAMiL,EAAajL,IAAI,CAAC,CAAC;AAC9G,IAAA/C,EAAG,WAAWA,EAAG,cAAc,KAAK,mBAAmB,GACvDA,EAAG,WAAWA,EAAG,cAAc0C,GAAQ1C,EAAG,WAAW,GAErD,KAAK,aAAA,GACL,KAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,eAAqB;AAC3B,QAAI,CAAC,KAAK,WAAY;AACtB,UAAM2I,IAAI,KAAK,WAAW;AAC1B,QAAIxL,IAAO,OAAUG,IAAO,QAAWF,IAAO,OAAUG,IAAO,QAAWF,IAAO,OAAUG,IAAO;AAClG,aAASuF,IAAI,GAAGA,IAAI4F,EAAE,QAAQ5F,KAAK;AACjC,MAAI4F,EAAE5F,CAAC,IAAI5F,MAAMA,IAAOwL,EAAE5F,CAAC,IAAO4F,EAAE5F,CAAC,IAAIzF,MAAMA,IAAOqL,EAAE5F,CAAC,IACrD4F,EAAE5F,IAAE,CAAC,IAAI3F,MAAMA,IAAOuL,EAAE5F,IAAE,CAAC,IAAO4F,EAAE5F,IAAE,CAAC,IAAIxF,MAAMA,IAAOoL,EAAE5F,IAAE,CAAC,IAC7D4F,EAAE5F,IAAE,CAAC,IAAI1F,MAAMA,IAAOsL,EAAE5F,IAAE,CAAC,IAAO4F,EAAE5F,IAAE,CAAC,IAAIvF,MAAMA,IAAOmL,EAAE5F,IAAE,CAAC;AAEnE,SAAK,SAAS,EAAE,MAAA5F,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,EAAA,GAC1C,KAAK,QAAM,KAAK,KAAK,aAAa,KAAK,MAAM;AAAA,EACnD;AAAA,EAEA,SAAe;AACb,UAAM,EAAE,IAAAwC,GAAI,QAAArC,EAAA,IAAW;AACvB,IAAAqC,EAAG,SAAS,GAAG,GAAGA,EAAG,OAAO,OAAOA,EAAG,OAAO,MAAM,GACnDA,EAAG,WAAW,KAAK,gBAAgB,CAAC,GAAG,KAAK,gBAAgB,CAAC,GAAG,KAAK,gBAAgB,CAAC,GAAG,KAAK,gBAAgB,CAAC,CAAC,GAChHA,EAAG,MAAMA,EAAG,mBAAmBA,EAAG,gBAAgB;AAElD,UAAMoN,IAAWzP,EAAO,wBAAA;AAGxB,QAFI,KAAK,QAAM,KAAK,KAAK,OAAOyP,CAAQ,GAEpC,KAAK,cAAc,KAAK,KAAK,KAAK;AACpC,YAAMxM,IAAU,KAAK,SAAS;AAC9B,MAAAZ,EAAG,WAAWY,EAAQ,OAAO,GAC7BZ,EAAG,iBAAiBY,EAAQ,SAAS,kBAAkB,IAAOwM,CAAQ,GACtEpN,EAAG,UAAUY,EAAQ,SAAS,WAAW,KAAK,OAAO,GACrDZ,EAAG,UAAUY,EAAQ,SAAS,mBAAmB,KAAK,eAAe,GACrEZ,EAAG,WAAWY,EAAQ,SAAS,YAAY,IAAI,aAAa,CAAC,KAAK,GAAK,GAAG,CAAC,CAAC,GAE5EZ,EAAG,gBAAgB,KAAK,GAAG,GAC3BA,EAAG,sBAAsBA,EAAG,WAAW,KAAK,YAAYA,EAAG,gBAAgB,GAAG,KAAK,WAAW,GAC9FA,EAAG,gBAAgB,IAAI;AAAA,IACzB;AACA,SAAK,UAAU,QAAQ;AAAA,EACzB;AAAA,EAEQ,kBAAwB;AAC9B,UAAM+O,IAAO,MAAM;AACjB,YAAMxQ,IAAS,KAAK,WAAW,OAAA;AAC/B,OAAI,KAAK,eAAeA,OACtB,KAAK,OAAA,GACL,KAAK,cAAc,KAErB,KAAK,mBAAmB,sBAAsBwQ,CAAI;AAAA,IACpD;AACA,SAAK,mBAAmB,sBAAsBA,CAAI;AAAA,EACpD;AAAA,EAEA,YAAkB;AAChB,QAAI,CAAC,KAAK,OAAQ;AAClB,UAAM,EAAE,MAAA5R,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,MAAS,KAAK;AACpD,SAAK,OAAO,YAAYL,GAAMC,GAAMC,GAAMC,GAAMC,GAAMC,CAAI,GAC1D,KAAK,OAAO,UAAU,KACtB,KAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,gBAAgB,GAAqB;AAC3C,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,WAAY;AACvC,UAAMmJ,IAAO,KAAK,OAAO,sBAAA,GACnBhN,IAAI,EAAE,UAAUgN,EAAK,MACrB/M,IAAI,EAAE,UAAU+M,EAAK,KAGrB,EAAE,OAAAuG,GAAO,QAAAC,MAAW,KAAK,cAAA,GACzBC,IAAW,KAAK,OAAO,wBAAA,GACvBvE,IAAMZ,EAAoBtO,GAAGC,GAAGsT,GAAOC,GAAQC,CAAQ,GACvDxG,IAAMuC,EAAWN,GAAK,KAAK,WAAW,WAAW,IAAI,aAAa,KAAK,WAAW,EAAE,KAAK,GAAG,CAAC;AAEnG,QAAIjC;AACF,UAAIA,EAAI,UAAU,KAAK,cAAc;AACnC,aAAK,eAAeA,EAAI;AACxB,cAAMwL,IAAKxL,EAAI,QAAQ,GACjB5J,IAAK,KAAK,WAAW,WAAWoV,CAAE,GAClCnV,IAAK,KAAK,WAAW,WAAWmV,IAAG,CAAC,GACpClV,IAAK,KAAK,WAAW,WAAWkV,IAAG,CAAC,GACpCgD,IAAM,KAAK,KAAKpY,IAAGA,IAAKC,IAAGA,IAAKC,IAAGA,CAAE;AAE3C,aAAK,QAAQ,KAAK;AAAA,UAChB,OAAO0J,EAAI;AAAA,UACX,UAAU,CAAC,KAAK,WAAW,UAAUwL,CAAE,GAAG,KAAK,WAAW,UAAUA,IAAG,CAAC,GAAG,KAAK,WAAW,UAAUA,IAAG,CAAC,CAAC;AAAA,UAC1G,YAAY,EAAE,WAAWgD,EAAI,QAAQ,CAAC,GAAG,KAAK,IAAIpY,EAAG,QAAQ,CAAC,CAAC,KAAKC,EAAG,QAAQ,CAAC,CAAC,KAAKC,EAAG,QAAQ,CAAC,CAAC,IAAA;AAAA,QAAI,GACtGvD,GAAGC,CAAC;AAAA,MACT;AACE,aAAK,QAAQ,eAAeD,GAAGC,CAAC;AAAA,QAEpC,CAAW,KAAK,iBAAiB,OAC/B,KAAK,QAAQ,KAAA,GACb,KAAK,eAAe;AAAA,EAExB;AAAA,EAEQ,mBAAyB;AAC/B,IAAI,KAAK,YAAW,KAAK,QAAQ,KAAA,GAAQ,KAAK,eAAe;AAAA,EAC/D;AAAA,EAGQ,SAAe;AACrB,UAAMsT,IAAQ,KAAK,OAAO,aAAaC,IAAS,KAAK,OAAO;AAC5D,SAAK,OAAO,QAAQD,IAAQ,KAAK,KAAK,KAAK,OAAO,SAASC,IAAS,KAAK,KACzE,KAAK,GAAG,SAAS,GAAG,GAAG,KAAK,OAAO,OAAO,KAAK,OAAO,MAAM,GAC5D,KAAK,OAAO,SAASD,IAAQC;AAAA,EAC/B;AAAA,EACA,gBAAgB;AAAE,UAAMxG,IAAO,KAAK,OAAO,sBAAA;AAAyB,WAAO,EAAE,OAAOA,EAAK,OAAO,QAAQA,EAAK,OAAA;AAAA,EAAU;AAAA,EAEvH,gBAAgB;ArB9UlB,QAAAF;AqB+UI,aAAOA,IAAA,KAAK,SAAL,gBAAAA,EAAW,gBAAe,CAAA;AAAA,EACnC;AAAA,EAEA,0BAA0B;AACxB,WAAO,KAAK,OAAO,wBAAA;AAAA,EACrB;AAAA,EAEA,gBAAgBvC,GAAoC;AAClD,QAAI,CAAC,KAAK,KAAM,QAAO,EAAE,GAAG,GAAG,GAAG,GAAG,SAAS,GAAA;AAC9C,UAAM,EAAE,OAAAgJ,GAAO,QAAAC,MAAW,KAAK,cAAA;AAC/B,WAAO,KAAK,KAAK,gBAAgBjJ,GAAU,KAAK,OAAO,wBAAA,GAA2BgJ,GAAOC,CAAM;AAAA,EACjG;AAAA,EACA,GAAG3G,GAAezI,GAAyC;AACzD,IAAK,KAAK,eAAe,IAAIyI,CAAK,KAAG,KAAK,eAAe,IAAIA,GAAO,oBAAI,IAAA,CAAK,GAC7E,KAAK,eAAe,IAAIA,CAAK,EAAG,IAAIzI,CAAQ;AAAA,EAC9C;AAAA,EACQ,UAAUmC,GAAoB;AACpC,UAAMmP,IAAY,KAAK,eAAe,IAAInP,CAAI;AAC9C,IAAKmP,KACLA,EAAU,QAAQ,OAAMyF,EAAG;AAAA,MACzB,MAAA5U;AAAA,MAAmB,WAAW,YAAY,IAAA;AAAA,MAC1C,OAAO,EAAE,KAAK,IAAI,WAAW,IAAI,eAAe,KAAK,aAAa,WAAW,EAAA;AAAA,MAC7E,QAAQ,EAAE,QAAQ,CAAC,GAAG,KAAK,OAAO,MAAM,GAAU,QAAQ,KAAK,OAAO,QAAQ,OAAO,KAAK,OAAO,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,OAAO,IAAA;AAAA,IAAI,CACpJ,CAAC;AAAA,EACJ;AAAA,EAEA,UAAgB;AACd,WAAO,oBAAoB,UAAU,KAAK,YAAY,GAClD,KAAK,oBAAkB,qBAAqB,KAAK,gBAAgB,GACjE,KAAK,WAAS,KAAK,QAAQ,QAAA;AAC/B,UAAM,EAAE,IAAAF,MAAO;AACf,IAAI,KAAK,OAAKA,EAAG,kBAAkB,KAAK,GAAG,GAC3C,CAAC,KAAK,gBAAgB,KAAK,aAAa,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,EAAE,QAAQ,CAAA1J,MAAKA,KAAK0J,EAAG,aAAa1J,CAAC,CAAC,GACtJ0L,EAAoBhC,GAAI,KAAK,QAAQ;AAAA,EACvC;AACF;ACrUO,MAAMsX,GAAgB;AAAA,EAwC3B,YAAY3b,GAAiC;AAvCrC,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,cAAsB;AAGtB;AAAA,IAAAA,EAAA,aAAqC;AACrC,IAAAA,EAAA,wBAAqC;AACrC,IAAAA,EAAA,qBAAkC;AAClC,IAAAA,EAAA,oBAAa;AAGb;AAAA,IAAAA,EAAA,2BAAwC;AACxC,IAAAA,EAAA,6BAA0C;AAC1C,IAAAA,EAAA,oBAAa;AAEb,IAAAA,EAAA,yBAAoD,CAAC,MAAM,MAAM,KAAK,CAAC;AACvE,IAAAA,EAAA,mBAAoB;AACpB,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA,cAAyB;AACzB,IAAAA,EAAA,gBAA0B;AAE1B,IAAAA,EAAA,0BAAkC;AAClC,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,4CAAgE,IAAA;AAGhE;AAAA,IAAAA,EAAA,iBAA4B;AAC5B,IAAAA,EAAA,sBAAuB;AACvB,IAAAA,EAAA;AACA,IAAAA,EAAA;AAyOA,IAAAA,EAAA,sBAAe,MAAM;AAAE,WAAK,OAAA,GAAU,KAAK,cAAc;AAAA,IAAM;AAtOrE,SAAK,SAASD,EAAQ,QACtB,KAAK,MAAM,OAAO,oBAAoB,GACtC,KAAK,aAAaA,EAAQ,cAAc,MACxC,KAAK,YAAYA,EAAQ,aAAa,KACtC,KAAK,UAAUA,EAAQ,WAAW,KAE9BA,EAAQ,oBAAiB,KAAK,kBAAkBA,EAAQ;AAE5D,UAAMqE,IAAK,KAAK,OAAO,WAAW,UAAU,EAAE,OAAO,IAAM,WAAW,IAAM;AAC5E,QAAI,CAACA,EAAI,OAAM,IAAI,MAAM,sBAAsB;AAC/C,SAAK,KAAKA,GAEVA,EAAG,OAAOA,EAAG,UAAU,GACvBA,EAAG,OAAOA,EAAG,KAAK,GAClBA,EAAG,UAAUA,EAAG,WAAWA,EAAG,mBAAmB,GAEjD,KAAK,WAAWgB,EAAsBhB,CAAE,GACxC,KAAK,SAAS,IAAItE,EAAYC,EAAQ,MAAM,GAC5C,KAAK,aAAa,IAAI+B,EAAgB,KAAK,QAAQ,KAAK,QAAQ/B,EAAQ,QAAQ,GAChF,KAAK,WAAW,SAAS,MAAM;AAAE,WAAK,cAAc,IAAM,KAAK,UAAU,cAAc;AAAA,IAAG,CAAC,GAEvFA,EAAQ,aAAa,OACvB,KAAK,OAAO,IAAIwG,EAAOnC,GAAIrE,EAAQ,IAAI,IAGrCA,EAAQ,kBAAkB,OAC5B,KAAK,UAAU,IAAIwJ,EAAU,KAAK,OAAO,iBAAiB,SAAS,IAAI,GACvE,KAAK,uBAAuB,KAAK,gBAAgB,KAAK,IAAI,GAC1D,KAAK,wBAAwB,KAAK,iBAAiB,KAAK,IAAI,GAC5D,KAAK,OAAO,iBAAiB,aAAa,KAAK,oBAAoB,GACnE,KAAK,OAAO,iBAAiB,cAAc,KAAK,qBAAqB,IAGvE,KAAK,iBAAA,GACL,KAAK,OAAA,GACL,OAAO,iBAAiB,UAAU,KAAK,YAAY,GACnD,KAAK,gBAAA;AAAA,EACP;AAAA,EAEQ,mBAAyB;AAC/B,UAAM,EAAE,IAAAnF,MAAO,MACTuV,IAAOzE,GAAA,GACPlQ,IAAU,KAAK,SAAS;AAE9B,SAAK,MAAMZ,EAAG,kBAAA,GACdA,EAAG,gBAAgB,KAAK,GAAG,GAE3B,KAAK,iBAAiBA,EAAG,aAAA,GACzBA,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,WAAWA,EAAG,cAAcuV,EAAK,WAAWvV,EAAG,WAAW;AAC7D,UAAMgE,IAASpD,EAAQ,WAAW;AAClC,IAAIoD,MAAW,OACbhE,EAAG,wBAAwBgE,CAAM,GACjChE,EAAG,oBAAoBgE,GAAQ,GAAGhE,EAAG,OAAO,IAAO,GAAG,CAAC,IAGzD,KAAK,cAAcA,EAAG,aAAA,GACtBA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GACvDA,EAAG,WAAWA,EAAG,sBAAsBuV,EAAK,SAASvV,EAAG,WAAW,GACnE,KAAK,aAAauV,EAAK,QAAQ,QAG/B,KAAK,oBAAoBvV,EAAG,aAAA,GAC5BA,EAAG,WAAWA,EAAG,cAAc,KAAK,iBAAiB;AACrD,UAAMwV,IAAa5U,EAAQ,WAAW;AACtC,IAAI4U,MAAe,OACjBxV,EAAG,wBAAwBwV,CAAU,GACrCxV,EAAG,oBAAoBwV,GAAY,GAAGxV,EAAG,OAAO,IAAO,GAAG,CAAC,GAC3DA,EAAG,oBAAoBwV,GAAY,CAAC,IAGtC,KAAK,sBAAsBxV,EAAG,aAAA,GAC9BA,EAAG,WAAWA,EAAG,cAAc,KAAK,mBAAmB;AACvD,UAAMuX,IAAW3W,EAAQ,WAAW;AACpC,IAAI2W,MAAa,OACfvX,EAAG,wBAAwBuX,CAAQ,GACnCvX,EAAG,oBAAoBuX,GAAU,GAAGvX,EAAG,OAAO,IAAO,GAAG,CAAC,GACzDA,EAAG,oBAAoBuX,GAAU,CAAC,IAGpCvX,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAEA,QAAQqF,GAAuB;AAC7B,SAAK,OAAOA;AACZ,UAAM,EAAE,YAAAmS,GAAY,SAAA9B,IAAU,CAAC,GAAG,GAAG,CAAC,GAAG,QAAAjN,IAAS,CAAC,GAAG,GAAG,CAAC,MAAMpD,GAC1D,CAAC4I,GAAIC,GAAIC,CAAE,IAAIqJ;AACrB,SAAK,aAAavJ,IAAKC,IAAKC,GAC5B,KAAK,YAAY,KAAK,IAAI,GAAGuH,CAAO,IAAI,KAAK;AAE7C,UAAMjT,IAAY,IAAI,aAAa,KAAK,aAAa,CAAC;AACtD,aAAS5I,IAAI,GAAGA,IAAIsU,GAAItU;AACtB,eAASD,IAAI,GAAGA,IAAIsU,GAAItU;AACtB,iBAASD,IAAI,GAAGA,IAAIsU,GAAItU,KAAK;AAC3B,gBAAMoJ,KAAKlJ,IAAIoU,IAAKC,IAAKtU,IAAIqU,IAAKtU,KAAK;AACvC,UAAA8I,EAAUM,CAAC,IAAI0F,EAAO,CAAC,IAAI9O,IAAI+b,EAAQ,CAAC,GACxCjT,EAAUM,IAAI,CAAC,IAAI0F,EAAO,CAAC,IAAI7O,IAAI8b,EAAQ,CAAC,GAC5CjT,EAAUM,IAAI,CAAC,IAAI0F,EAAO,CAAC,IAAI5O,IAAI6b,EAAQ,CAAC;AAAA,QAC9C;AAIJ,UAAM,EAAE,IAAA1V,MAAO;AACf,IAAAA,EAAG,WAAWA,EAAG,cAAc,KAAK,iBAAiB,GACrDA,EAAG,WAAWA,EAAG,cAAcyC,GAAWzC,EAAG,WAAW,GAExDA,EAAG,WAAWA,EAAG,cAAc,KAAK,mBAAmB,GACvDA,EAAG,WAAWA,EAAG,cAAcqF,EAAK,QAAQrF,EAAG,WAAW,GAE1D,KAAK,aAAA,GACL,KAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,eAAqB;AAC3B,QAAI,CAAC,KAAK,KAAM;AAChB,UAAM,EAAE,YAAAwX,GAAY,SAAA9B,IAAU,CAAC,GAAG,GAAG,CAAC,GAAG,QAAAjN,IAAS,CAAC,GAAG,GAAG,CAAC,EAAA,IAAM,KAAK,MAC/D,CAACwF,GAAIC,GAAIC,CAAE,IAAIqJ;AAErB,SAAK,SAAS;AAAA,MACZ,MAAM/O,EAAO,CAAC;AAAA,MACd,MAAMA,EAAO,CAAC,KAAKwF,IAAK,KAAKyH,EAAQ,CAAC;AAAA,MACtC,MAAMjN,EAAO,CAAC;AAAA,MACd,MAAMA,EAAO,CAAC,KAAKyF,IAAK,KAAKwH,EAAQ,CAAC;AAAA,MACtC,MAAMjN,EAAO,CAAC;AAAA,MACd,MAAMA,EAAO,CAAC,KAAK0F,IAAK,KAAKuH,EAAQ,CAAC;AAAA,IAAA,GAEpC,KAAK,QAAM,KAAK,KAAK,aAAa,KAAK,MAAM;AAAA,EACnD;AAAA,EAEA,SAAe;AACb,UAAM,EAAE,IAAA1V,GAAI,QAAArC,EAAA,IAAW;AACvB,IAAAqC,EAAG,SAAS,GAAG,GAAGA,EAAG,OAAO,OAAOA,EAAG,OAAO,MAAM,GACnDA,EAAG,WAAW,KAAK,gBAAgB,CAAC,GAAG,KAAK,gBAAgB,CAAC,GAAG,KAAK,gBAAgB,CAAC,GAAG,KAAK,gBAAgB,CAAC,CAAC,GAChHA,EAAG,MAAMA,EAAG,mBAAmBA,EAAG,gBAAgB;AAElD,UAAMoN,IAAWzP,EAAO,wBAAA;AAGxB,QAFI,KAAK,QAAM,KAAK,KAAK,OAAOyP,CAAQ,GAEpC,KAAK,aAAa,KAAK,KAAK,KAAK;AACnC,YAAMxM,IAAU,KAAK,SAAS;AAC9B,MAAAZ,EAAG,WAAWY,EAAQ,OAAO,GAC7BZ,EAAG,iBAAiBY,EAAQ,SAAS,kBAAkB,IAAOwM,CAAQ,GACtEpN,EAAG,UAAUY,EAAQ,SAAS,WAAW,KAAK,OAAO,GACrDZ,EAAG,UAAUY,EAAQ,SAAS,aAAa,KAAK,SAAS,GACzDZ,EAAG,UAAUY,EAAQ,SAAS,aAAa,KAAK,SAAS,GACzDZ,EAAG,WAAWY,EAAQ,SAAS,YAAY,IAAI,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAEtEZ,EAAG,gBAAgB,KAAK,GAAG,GAC3BA,EAAG,sBAAsBA,EAAG,WAAW,KAAK,YAAYA,EAAG,gBAAgB,GAAG,KAAK,UAAU,GAC7FA,EAAG,gBAAgB,IAAI;AAAA,IACzB;AACA,SAAK,UAAU,QAAQ;AAAA,EACzB;AAAA,EAEQ,kBAAwB;AAC9B,UAAM+O,IAAO,MAAM;AACjB,YAAMxQ,IAAS,KAAK,WAAW,OAAA;AAC/B,OAAI,KAAK,eAAeA,OACtB,KAAK,OAAA,GACL,KAAK,cAAc,KAErB,KAAK,mBAAmB,sBAAsBwQ,CAAI;AAAA,IACpD;AACA,SAAK,mBAAmB,sBAAsBA,CAAI;AAAA,EACpD;AAAA,EAEA,YAAkB;AAChB,QAAI,CAAC,KAAK,OAAQ;AAClB,UAAM,EAAE,MAAA5R,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,MAAS,KAAK;AACpD,SAAK,OAAO,YAAYL,GAAMC,GAAMC,GAAMC,GAAMC,GAAMC,CAAI,GAC1D,KAAK,OAAO,UAAU,KACtB,KAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,gBAAgB,GAAqB;AAC3C,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,KAAM;AACjC,UAAMmJ,IAAO,KAAK,OAAO,sBAAA,GACnBhN,IAAI,EAAE,UAAUgN,EAAK,MAAM/M,IAAI,EAAE,UAAU+M,EAAK,KAGhD,EAAE,OAAAuG,GAAO,QAAAC,MAAW,KAAK,cAAA,GACzBC,IAAW,KAAK,OAAO,wBAAA,GACvBvE,IAAMZ,EAAoBtO,GAAGC,GAAGsT,GAAOC,GAAQC,CAAQ,GAGvDa,IAAK,KAAK,KAAK,WAAW,CAAC,GAAGC,IAAK,KAAK,KAAK,WAAW,CAAC,GAAGC,IAAK,KAAK,KAAK,WAAW,CAAC,GACvF1L,IAAY,IAAI,aAAa,KAAK,aAAa,CAAC,GAChD,EAAE,SAAAiT,IAAU,CAAC,GAAE,GAAE,CAAC,GAAG,QAAAjN,IAAS,CAAC,GAAE,GAAE,CAAC,EAAA,IAAM,KAAK;AAErD,aAASgP,IAAI,GAAGA,IAAItJ,GAAIsJ;AACtB,eAASC,IAAI,GAAGA,IAAIxJ,GAAIwJ;AACtB,iBAAS3U,IAAI,GAAGA,IAAIkL,GAAIlL,KAAK;AAC3B,gBAAMkN,IAAOwH,IAAIxJ,IAAKC,IAAKwJ,IAAIzJ,IAAKlL;AACpC,UAAI,KAAK,KAAK,OAAOkN,CAAG,IAAI,KAAK,cACjCxN,EAAUwN,IAAI,CAAC,IAAIxH,EAAO,CAAC,IAAI1F,IAAI2S,EAAQ,CAAC,GAC5CjT,EAAUwN,IAAI,IAAE,CAAC,IAAIxH,EAAO,CAAC,IAAIiP,IAAIhC,EAAQ,CAAC,GAC9CjT,EAAUwN,IAAI,IAAE,CAAC,IAAIxH,EAAO,CAAC,IAAIgP,IAAI/B,EAAQ,CAAC;AAAA,QAChD;AAIJ,UAAM9O,IAAMuC,EAAWN,GAAKpG,GAAW,IAAI,aAAa,KAAK,UAAU,EAAE,KAAK,KAAK,YAAY,GAAG,CAAC;AAEnG,QAAImE;AACF,UAAIA,EAAI,UAAU,KAAK,cAAc;AACnC,aAAK,eAAeA,EAAI;AACxB,cAAMqP,IAAM,KAAK,KAAK,OAAOrP,EAAI,KAAK,GAChCqH,IAAK,KAAK,KAAK,WAAW,CAAC,GAAGC,IAAK,KAAK,KAAK,WAAW,CAAC,GACzDyJ,IAAK,KAAK,MAAM/Q,EAAI,SAASqH,IAAKC,EAAG,GACrC0J,IAAK,KAAK,MAAOhR,EAAI,SAASqH,IAAKC,KAAOD,CAAE,GAC5C4J,IAAKjR,EAAI,QAAQqH;AAEvB,aAAK,QAAQ,KAAK;AAAA,UAChB,OAAOrH,EAAI;AAAA,UACX,UAAU,CAACnE,EAAUmE,EAAI,QAAM,CAAC,GAAGnE,EAAUmE,EAAI,QAAM,IAAE,CAAC,GAAGnE,EAAUmE,EAAI,QAAM,IAAE,CAAC,CAAC;AAAA,UACrF,YAAY,EAAE,OAAOqP,EAAI,QAAQ,CAAC,GAAG,QAAQ,IAAI4B,CAAE,KAAKD,CAAE,KAAKD,CAAE,IAAA;AAAA,QAAI,GACpEhe,GAAGC,CAAC;AAAA,MACT;AACE,aAAK,QAAQ,eAAeD,GAAGC,CAAC;AAAA,QAEpC,CAAW,KAAK,iBAAiB,OAC/B,KAAK,QAAQ,KAAA,GACb,KAAK,eAAe;AAAA,EAExB;AAAA,EAEQ,mBAAyB;AAC/B,IAAI,KAAK,YAAW,KAAK,QAAQ,KAAA,GAAQ,KAAK,eAAe;AAAA,EAC/D;AAAA,EAGQ,SAAe;AACrB,UAAMsT,IAAQ,KAAK,OAAO,aAAaC,IAAS,KAAK,OAAO;AAC5D,SAAK,OAAO,QAAQD,IAAQ,KAAK,KAAK,KAAK,OAAO,SAASC,IAAS,KAAK,KACzE,KAAK,GAAG,SAAS,GAAG,GAAG,KAAK,OAAO,OAAO,KAAK,OAAO,MAAM,GAC5D,KAAK,OAAO,SAASD,IAAQC;AAAA,EAC/B;AAAA,EACA,gBAAgB;AAAE,UAAMxG,IAAO,KAAK,OAAO,sBAAA;AAAyB,WAAO,EAAE,OAAOA,EAAK,OAAO,QAAQA,EAAK,OAAA;AAAA,EAAU;AAAA,EAEvH,gBAAgB;AtBrUlB,QAAAF;AsBsUI,aAAOA,IAAA,KAAK,SAAL,gBAAAA,EAAW,gBAAe,CAAA;AAAA,EACnC;AAAA,EAEA,0BAA0B;AACxB,WAAO,KAAK,OAAO,wBAAA;AAAA,EACrB;AAAA,EAEA,gBAAgBvC,GAAoC;AAClD,QAAI,CAAC,KAAK,KAAM,QAAO,EAAE,GAAG,GAAG,GAAG,GAAG,SAAS,GAAA;AAC9C,UAAM,EAAE,OAAAgJ,GAAO,QAAAC,MAAW,KAAK,cAAA;AAC/B,WAAO,KAAK,KAAK,gBAAgBjJ,GAAU,KAAK,OAAO,wBAAA,GAA2BgJ,GAAOC,CAAM;AAAA,EACjG;AAAA,EAEA,GAAG3G,GAAezI,GAAyC;AACzD,IAAK,KAAK,eAAe,IAAIyI,CAAK,KAAG,KAAK,eAAe,IAAIA,GAAO,oBAAI,IAAA,CAAK,GAC7E,KAAK,eAAe,IAAIA,CAAK,EAAG,IAAIzI,CAAQ;AAAA,EAC9C;AAAA,EAEQ,UAAUmC,GAAoB;AACpC,UAAMmP,IAAY,KAAK,eAAe,IAAInP,CAAI;AAC9C,IAAKmP,KACLA,EAAU,QAAQ,OAAMyF,EAAG;AAAA,MACzB,MAAA5U;AAAA,MAAmB,WAAW,YAAY,IAAA;AAAA,MAC1C,OAAO,EAAE,KAAK,IAAI,WAAW,IAAI,eAAe,KAAK,YAAY,WAAW,EAAA;AAAA,MAC5E,QAAQ,EAAE,QAAQ,CAAC,GAAG,KAAK,OAAO,MAAM,GAAU,QAAQ,KAAK,OAAO,QAAQ,OAAO,KAAK,OAAO,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,OAAO,IAAA;AAAA,IAAI,CACpJ,CAAC;AAAA,EACJ;AAAA,EAEA,UAAgB;AACd,WAAO,oBAAoB,UAAU,KAAK,YAAY,GAClD,KAAK,oBAAkB,qBAAqB,KAAK,gBAAgB,GACjE,KAAK,WAAS,KAAK,QAAQ,QAAA;AAC/B,UAAM,EAAE,IAAAF,MAAO;AACf,IAAI,KAAK,OAAKA,EAAG,kBAAkB,KAAK,GAAG,GAC3C,CAAC,KAAK,gBAAgB,KAAK,aAAa,KAAK,mBAAmB,KAAK,mBAAmB,EAAE,QAAQ,CAAA1J,MAAKA,KAAK0J,EAAG,aAAa1J,CAAC,CAAC,GAC9H0L,EAAoBhC,GAAI,KAAK,QAAQ;AAAA,EACvC;AACF;AChUO,MAAM8X,GAAoB;AAAA,EAyC/B,YAAYnc,GAAqC;AAxCzC,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,cAAsB;AAGtB;AAAA,IAAAA,EAAA,aAAqC;AACrC,IAAAA,EAAA,wBAAqC;AACrC,IAAAA,EAAA,sBAAmC;AACnC,IAAAA,EAAA,qBAAkC;AAClC,IAAAA,EAAA,qBAAkC;AAClC,IAAAA,EAAA,oBAAa;AAEb,IAAAA,EAAA,yBAAoD,CAAC,MAAM,MAAM,KAAK,CAAC;AACvE,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA,gBAAgC,CAAA;AAChC,IAAAA,EAAA,gBAA0B;AAE1B,IAAAA,EAAA,0BAAkC;AAClC,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,4CAAgE,IAAA;AAGhE;AAAA,IAAAA,EAAA,4BAAoC;AACpC,IAAAA,EAAA;AAGA;AAAA,IAAAA,EAAA,iBAA4B;AAC5B,IAAAA,EAAA,sBAAwD;AACxD,IAAAA,EAAA;AACA,IAAAA,EAAA;AA+TA,IAAAA,EAAA,sBAAe,MAAY;AACjC,WAAK,OAAA,GACL,KAAK,cAAc;AAAA,IACrB;AA/TE,SAAK,SAASD,EAAQ,QACtB,KAAK,MAAM,OAAO,oBAAoB,GACtC,KAAK,aAAaA,EAAQ,cAAc,QACxC,KAAK,QAAQA,EAAQ,SAAS,GAC9B,KAAK,UAAUA,EAAQ,WAAW,KAClC,KAAK,UAAUA,EAAQ,SAEnBA,EAAQ,oBAAiB,KAAK,kBAAkBA,EAAQ,kBAG5D,KAAK,aAAakR,EAAYlR,EAAQ,SAAS,CAAA,GAAI,KAAK,eAAe;AAEvE,UAAMqE,IAAK,KAAK,OAAO,WAAW,UAAU,EAAE,OAAO,IAAM,WAAW,IAAM;AAC5E,QAAI,CAACA,EAAI,OAAM,IAAI,MAAM,sBAAsB;AAC/C,SAAK,KAAKA,GAEVA,EAAG,OAAOA,EAAG,UAAU,GACvBA,EAAG,OAAOA,EAAG,KAAK,GAClBA,EAAG,UAAUA,EAAG,WAAWA,EAAG,mBAAmB,GAEjD,KAAK,WAAWgB,EAAsBhB,CAAE,GACxC,KAAK,SAAS,IAAItE,EAAYC,EAAQ,MAAM,GAC5C,KAAK,aAAa,IAAI+B,EAAgB,KAAK,QAAQ,KAAK,QAAQ/B,EAAQ,QAAQ,GAChF,KAAK,WAAW,SAAS,MAAM;AAAE,WAAK,cAAc,IAAM,KAAK,UAAU,cAAc;AAAA,IAAG,CAAC,GAEvFA,EAAQ,aAAa,OACvB,KAAK,OAAO,IAAIwG,EAAOnC,GAAIrE,EAAQ,IAAI,IAGrCA,EAAQ,kBAAkB,OAC5B,KAAK,UAAU,IAAIwJ,EAAU,KAAK,OAAO,iBAAiB,SAAS,IAAI,GACvE,KAAK,uBAAuB,KAAK,gBAAgB,KAAK,IAAI,GAC1D,KAAK,wBAAwB,KAAK,iBAAiB,KAAK,IAAI,GAC5D,KAAK,OAAO,iBAAiB,aAAa,KAAK,oBAAoB,GACnE,KAAK,OAAO,iBAAiB,cAAc,KAAK,qBAAqB,IAGvE,KAAK,OAAA,GACL,OAAO,iBAAiB,UAAU,KAAK,YAAY,GACnD,KAAK,gBAAA;AAAA,EACP;AAAA,EAEA,QAAQ4S,GAAqC;AAC3C,SAAK,SAASA,GACd,KAAK,eAAA,GACL,KAAK,aAAA,GACL,KAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,eAAqB;AAC3B,QAAI,KAAK,OAAO,WAAW,KAAK,KAAK,QAAQ,WAAW,EAAG;AAE3D,QAAI5a,IAAO,OAAUG,IAAO,QACxBF,IAAO,KAAK,OAAOG,IAAO,QAC1BF,IAAO,OAAUG,IAAO;AAE5B,aAASuF,IAAI,GAAGA,IAAI,KAAK,QAAQ,QAAQA,KAAK;AAC5C,YAAMpJ,IAAI,KAAK,QAAQoJ,CAAC;AACxB,MAAIpJ,IAAIwD,MAAMA,IAAOxD,IACjBA,IAAI2D,MAAMA,IAAO3D;AAAA,IACvB;AAEA,eAAWqe,KAAS,KAAK,QAAQ;AAC/B,MAAIA,EAAM,IAAI3a,MAAMA,IAAO2a,EAAM,IAC7BA,EAAM,IAAIxa,MAAMA,IAAOwa,EAAM;AACjC,eAASjV,IAAI,GAAGA,IAAIiV,EAAM,QAAQ,QAAQjV,KAAK;AAC7C,cAAMnJ,IAAIoe,EAAM,QAAQjV,CAAC;AACzB,QAAInJ,IAAIwD,MAAMA,IAAOxD,IACjBA,IAAI2D,MAAMA,IAAO3D;AAAA,MACvB;AAAA,IACF;AAEA,SAAK,SAAS,EAAE,MAAAuD,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,EAAA,GAC1C,KAAK,QAAM,KAAK,KAAK,aAAa,KAAK,MAAM;AAAA,EACnD;AAAA,EAEQ,iBAAuB;AAC7B,QAAI,KAAK,OAAO,WAAW,EAAG;AAC9B,UAAM,EAAE,IAAAwC,MAAO,MAETyC,IAAsB,CAAA,GACtB+L,IAAoB,CAAA,GACpB9L,IAAmB,CAAA,GACnB+L,IAAoB,CAAA;AAC1B,QAAId,IAAe;AAGnB,UAAMC,IAAe,KAAK,WAAW,eAC/BC,IAAiB,KAAK,WAAW;AAEvC,aAASoK,IAAW,GAAGA,IAAW,KAAK,OAAO,QAAQA,KAAY;AAChE,YAAMD,IAAQ,KAAK,OAAOC,CAAQ,GAI5BC,IADYD,MAAa,KAAK,qBAEhCpK,IACCmK,EAAM,SAASpK,EAAaqK,IAAWrK,EAAa,MAAM;AAE/D,eAAS7K,IAAI,GAAGA,IAAI,KAAK,QAAQ,QAAQA,KAAK;AAC5C,cAAMpJ,IAAI,KAAK,QAAQoJ,CAAC,GAClBnJ,IAAIoe,EAAM,QAAQjV,CAAC,GACnBlJ,IAAIme,EAAM;AAEhB,YAAI,KAAK,eAAe,QAAQ;AAE9B,cAAI/J,IAAK,GAAGC,IAAK,GAAGC,IAAK;AACzB,cAAIpL,IAAI,KAAK,QAAQ,SAAS,GAAG;AAC/B,kBAAM/F,IAAK,KAAK,QAAQ+F,IAAI,CAAC,IAAIpJ;AAEjC,YADY,KAAK,KAAKqD,IAAKA,CAAE,IACnB,SACRiR,IAAK,GACLC,IAAK,GACLC,IAAK;AAAA,UAET;AAYA,cATA1L,EAAU,KAAK9I,GAAGC,GAAGC,CAAC,GACtB2U,EAAQ,KAAKP,GAAIC,GAAIC,CAAE,GACvBzL,EAAO,KAAK,GAAGwV,CAAU,GAGzBzV,EAAU,KAAK9I,GAAG,KAAK,OAAOE,CAAC,GAC/B2U,EAAQ,KAAKP,GAAIC,GAAIC,CAAE,GACvBzL,EAAO,KAAK,GAAGwV,CAAU,GAErBnV,IAAI,KAAK,QAAQ,SAAS,GAAG;AAC/B,kBAAM+G,IAAK6D,IAAe5K,IAAI,GACxBgH,IAAKD,IAAK,GACVE,IAAKF,IAAK,GACVuL,IAAKvL,IAAK;AAChB,YAAA2E,EAAQ,KAAK3E,GAAIC,GAAIC,GAAID,GAAIsL,GAAIrL,CAAE;AAAA,UACrC;AAAA,QACF;AAEE,UAAAvH,EAAU,KAAK9I,GAAGC,GAAGC,CAAC,GACtB2U,EAAQ,KAAK,GAAG,GAAG,CAAC,GACpB9L,EAAO,KAAK,GAAGwV,CAAU,GACrBnV,IAAI,KAAK,QAAQ,SAAS,KAC5B0L,EAAQ,KAAKd,IAAe5K,GAAG4K,IAAe5K,IAAI,CAAC;AAAA,MAGzD;AACA,MAAA4K,KAAiB,KAAK,eAAe,SAAS,KAAK,QAAQ,SAAS,IAAI,KAAK,QAAQ;AAAA,IACvF;AAEA,UAAM/M,IAAU,KAAK,SAAS;AAC9B,IAAK,KAAK,QAAK,KAAK,MAAMZ,EAAG,kBAAA,IAC7BA,EAAG,gBAAgB,KAAK,GAAG,GAEtB,KAAK,mBAAgB,KAAK,iBAAiBA,EAAG,aAAA,IACnDA,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,WAAWA,EAAG,cAAc,IAAI,aAAayC,CAAS,GAAGzC,EAAG,WAAW;AAC1E,UAAMgE,IAASpD,EAAQ,WAAW;AAClC,IAAIoD,MAAW,OACbhE,EAAG,wBAAwBgE,CAAM,GACjChE,EAAG,oBAAoBgE,GAAQ,GAAGhE,EAAG,OAAO,IAAO,GAAG,CAAC,IAGpD,KAAK,iBAAc,KAAK,eAAeA,EAAG,aAAA,IAC/CA,EAAG,WAAWA,EAAG,cAAc,KAAK,YAAY,GAChDA,EAAG,WAAWA,EAAG,cAAc,IAAI,aAAawO,CAAO,GAAGxO,EAAG,WAAW;AACxE,UAAM4O,IAAYhO,EAAQ,WAAW;AACrC,IAAIgO,MAAc,OAChB5O,EAAG,wBAAwB4O,CAAS,GACpC5O,EAAG,oBAAoB4O,GAAW,GAAG5O,EAAG,OAAO,IAAO,GAAG,CAAC,IAGvD,KAAK,gBAAa,KAAK,cAAcA,EAAG,aAAA,IAC7CA,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,WAAWA,EAAG,cAAc,IAAI,aAAa0C,CAAM,GAAG1C,EAAG,WAAW;AACvE,UAAMiE,IAAWrD,EAAQ,WAAW;AACpC,IAAIqD,MAAa,OACfjE,EAAG,wBAAwBiE,CAAQ,GACnCjE,EAAG,oBAAoBiE,GAAU,GAAGjE,EAAG,OAAO,IAAO,GAAG,CAAC,IAGtD,KAAK,gBAAa,KAAK,cAAcA,EAAG,aAAA,IAC7CA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GACvDA,EAAG,WAAWA,EAAG,sBAAsB,IAAI,YAAYyO,CAAO,GAAGzO,EAAG,WAAW,GAC/E,KAAK,aAAayO,EAAQ,QAE1BzO,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAEA,SAAe;AACb,UAAM,EAAE,IAAAA,GAAI,QAAArC,EAAA,IAAW;AACvB,IAAAqC,EAAG,SAAS,GAAG,GAAGA,EAAG,OAAO,OAAOA,EAAG,OAAO,MAAM,GACnDA,EAAG,WAAW,KAAK,gBAAgB,CAAC,GAAG,KAAK,gBAAgB,CAAC,GAAG,KAAK,gBAAgB,CAAC,GAAG,KAAK,gBAAgB,CAAC,CAAC,GAChHA,EAAG,MAAMA,EAAG,mBAAmBA,EAAG,gBAAgB;AAElD,UAAMoN,IAAWzP,EAAO,wBAAA;AAMxB,QAJI,KAAK,QACP,KAAK,KAAK,OAAOyP,CAAQ,GAGvB,KAAK,aAAa,KAAK,KAAK,KAAK;AACnC,YAAMxM,IAAU,KAAK,SAAS;AAC9B,MAAAZ,EAAG,WAAWY,EAAQ,OAAO,GAC7BZ,EAAG,iBAAiBY,EAAQ,SAAS,kBAAkB,IAAOwM,CAAQ,GACtEpN,EAAG,UAAUY,EAAQ,SAAS,WAAW,KAAK,OAAO,GAErDZ,EAAG,UAAUY,EAAQ,SAAS,aAAa,IAAK,GAChDZ,EAAG,UAAUY,EAAQ,SAAS,WAAW,GAAI,GAC7CZ,EAAG,WAAWY,EAAQ,SAAS,YAAY,IAAI,aAAa,CAAC,KAAK,GAAK,GAAG,CAAC,CAAC,GAC5EZ,EAAG,UAAUY,EAAQ,SAAS,WAAW,GAAG,GAE5CZ,EAAG,gBAAgB,KAAK,GAAG,GACvB,KAAK,eAAe,SACtBA,EAAG,aAAaA,EAAG,WAAW,KAAK,YAAYA,EAAG,cAAc,CAAC,IAEjEA,EAAG,aAAaA,EAAG,OAAO,KAAK,YAAYA,EAAG,cAAc,CAAC,GAE/DA,EAAG,gBAAgB,IAAI;AAAA,IACzB;AAEA,SAAK,UAAU,QAAQ;AAAA,EACzB;AAAA,EAEQ,kBAAwB;AAC9B,UAAM+O,IAAO,MAAM;AACjB,YAAMxQ,IAAS,KAAK,WAAW,OAAA;AAC/B,OAAI,KAAK,eAAeA,OACtB,KAAK,OAAA,GACL,KAAK,cAAc,KAErB,KAAK,mBAAmB,sBAAsBwQ,CAAI;AAAA,IACpD;AACA,SAAK,mBAAmB,sBAAsBA,CAAI;AAAA,EACpD;AAAA,EAEA,YAAkB;AAChB,QAAI,CAAC,KAAK,OAAQ;AAClB,UAAM,EAAE,MAAA5R,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,GAAM,MAAAF,GAAM,MAAAG,MAAS,KAAK,QAC9CR,IAAKM,IAAOH,GAAMF,IAAKM,IAAOH,GAAMF,IAAKM,IAAOH,GAChDqR,IAAU;AAChB,SAAK,OAAO;AAAA,MACVvR,IAAOH,IAAK0R;AAAA,MAAStR,IAAOH,IAAKyR;AAAA,MAASrR,IAAOH,IAAKwR;AAAA,MACtDpR,IAAON,IAAK0R;AAAA,MAASnR,IAAON,IAAKyR;AAAA,MAASlR,IAAON,IAAKwR;AAAA,IAAA,GAExD,KAAK,OAAO,UAAU,KACtB,KAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,gBAAgB,GAAqB;AAC3C,QAAI,KAAK,OAAO,WAAW,EAAG;AAC9B,UAAM/H,IAAO,KAAK,OAAO,sBAAA,GACnBhN,IAAI,EAAE,UAAUgN,EAAK,MACrB/M,IAAI,EAAE,UAAU+M,EAAK,KAErBC,IAAM,KAAK,aAAajN,GAAGC,CAAC,GAG5BoT,IAAkBpG,IAAMA,EAAI,cAAc;AAQhD,QAPIoG,MAAoB,KAAK,uBAC3B,KAAK,qBAAqBA,GAC1B,KAAK,eAAA,GACL,KAAK,cAAc,KAIjB,KAAK;AACP,UAAIpG;AAEF,YADc,CAAC,KAAK,gBAAgB,KAAK,aAAa,UAAUA,EAAI,eAAe,KAAK,aAAa,UAAUA,EAAI,YACxG;AACT,eAAK,eAAe,EAAE,OAAOA,EAAI,aAAa,OAAOA,EAAI,WAAA;AACzD,gBAAMoR,IAAQ,KAAK,OAAOpR,EAAI,WAAW;AACzC,eAAK,QAAQ,KAAK;AAAA,YAChB,OAAOA,EAAI;AAAA,YACX,UAAU,CAAC,KAAK,QAAQA,EAAI,UAAU,GAAGoR,EAAM,QAAQpR,EAAI,UAAU,GAAGoR,EAAM,CAAC;AAAA,YAC/E,OAAOA,EAAM,SAAS,CAAC,KAAK,KAAK,CAAG;AAAA,YACpC,YAAY,EAAE,QAAQpR,EAAI,aAAa,GAAGoR,EAAM,EAAE,QAAQ,CAAC,EAAA;AAAA,UAAE,GAC5Dre,GAAGC,CAAC;AAAA,QACT;AACE,eAAK,QAAQ,eAAeD,GAAGC,CAAC;AAAA;AAGlC,QAAI,KAAK,iBACP,KAAK,QAAQ,KAAA,GACb,KAAK,eAAe;AAAA,EAI5B;AAAA,EAEQ,mBAAyB;AAE/B,IAAI,KAAK,uBAAuB,SAC9B,KAAK,qBAAqB,MAC1B,KAAK,eAAA,GACL,KAAK,cAAc,KAGjB,KAAK,YACP,KAAK,QAAQ,KAAA,GACb,KAAK,eAAe;AAAA,EAExB;AAAA,EAEA,aAAaqL,GAAiBC,GAAiB;AAC7C,QAAI,KAAK,OAAO,WAAW,EAAG,QAAO;AACrC,UAAM,EAAE,OAAAgI,GAAO,QAAAC,MAAW,KAAK,cAAA,GACzBC,IAAW,KAAK,OAAO,wBAAA,GACvBvE,IAAMZ,EAAoBhD,GAASC,GAASgI,GAAOC,GAAQC,CAAQ,GAEnEvH,IAAQ,KAAK,OAAO,IAAI,CAAA5L,OAAM;AAAA,MAClC,GAAG,KAAK;AAAA,MACR,GAAGA,EAAE;AAAA,MACL,GAAG,IAAI,aAAa,KAAK,QAAQ,MAAM,EAAE,KAAKA,EAAE,CAAC;AAAA,IAAA,EACjD;AAEF,WAAOgS,EAASpD,GAAKhD,GAAO,GAAG;AAAA,EACjC;AAAA,EAOQ,SAAe;AACrB,UAAMqH,IAAQ,KAAK,OAAO,aACpBC,IAAS,KAAK,OAAO;AAC3B,SAAK,OAAO,QAAQD,IAAQ,KAAK,KACjC,KAAK,OAAO,SAASC,IAAS,KAAK,KACnC,KAAK,GAAG,SAAS,GAAG,GAAG,KAAK,OAAO,OAAO,KAAK,OAAO,MAAM,GAC5D,KAAK,OAAO,SAASD,IAAQC;AAAA,EAC/B;AAAA,EAEA,gBAAgB;AACd,UAAMxG,IAAO,KAAK,OAAO,sBAAA;AACzB,WAAO,EAAE,OAAOA,EAAK,OAAO,QAAQA,EAAK,OAAA;AAAA,EAC3C;AAAA,EAEA,gBAAgB;AvBpalB,QAAAF;AuBqaI,aAAOA,IAAA,KAAK,SAAL,gBAAAA,EAAW,gBAAe,CAAA;AAAA,EACnC;AAAA,EAEA,0BAA0B;AACxB,WAAO,KAAK,OAAO,wBAAA;AAAA,EACrB;AAAA,EAEA,gBAAgBvC,GAAoC;AAClD,QAAI,CAAC,KAAK,KAAM,QAAO,EAAE,GAAG,GAAG,GAAG,GAAG,SAAS,GAAA;AAC9C,UAAM,EAAE,OAAAgJ,GAAO,QAAAC,MAAW,KAAK,cAAA;AAC/B,WAAO,KAAK,KAAK,gBAAgBjJ,GAAU,KAAK,OAAO,wBAAA,GAA2BgJ,GAAOC,CAAM;AAAA,EACjG;AAAA,EAEA,GAAG3G,GAAezI,GAAyC;AACzD,IAAK,KAAK,eAAe,IAAIyI,CAAK,KAAG,KAAK,eAAe,IAAIA,GAAO,oBAAI,IAAA,CAAK,GAC7E,KAAK,eAAe,IAAIA,CAAK,EAAG,IAAIzI,CAAQ;AAAA,EAC9C;AAAA,EAEQ,UAAUmC,GAAoB;AACpC,UAAMmP,IAAY,KAAK,eAAe,IAAInP,CAAI;AAC9C,QAAI,CAACmP,EAAW;AAChB,UAAM7I,IAAyB;AAAA,MAC7B,MAAAtG;AAAA,MACA,WAAW,YAAY,IAAA;AAAA,MACvB,OAAO,EAAE,KAAK,IAAI,WAAW,IAAI,eAAe,KAAK,OAAO,QAAQ,WAAW,EAAA;AAAA,MAC/E,QAAQ,EAAE,QAAQ,CAAC,GAAG,KAAK,OAAO,MAAM,GAAU,QAAQ,KAAK,OAAO,QAAQ,OAAO,KAAK,OAAO,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,OAAO,IAAA;AAAA,IAAI;AAErJ,IAAAmP,EAAU,QAAQ,CAAAyF,MAAMA,EAAGtO,CAAK,CAAC;AAAA,EACnC;AAAA,EAEA,UAAgB;AACd,WAAO,oBAAoB,UAAU,KAAK,YAAY,GAClD,KAAK,oBAAkB,qBAAqB,KAAK,gBAAgB,GACjE,KAAK,YACP,KAAK,QAAQ,QAAA,GACT,KAAK,wBAAsB,KAAK,OAAO,oBAAoB,aAAa,KAAK,oBAAoB,GACjG,KAAK,yBAAuB,KAAK,OAAO,oBAAoB,cAAc,KAAK,qBAAqB;AAE1G,UAAM,EAAE,IAAAxG,MAAO;AACf,IAAI,KAAK,OAAKA,EAAG,kBAAkB,KAAK,GAAG,GACvC,KAAK,kBAAgBA,EAAG,aAAa,KAAK,cAAc,GACxD,KAAK,gBAAcA,EAAG,aAAa,KAAK,YAAY,GACpD,KAAK,eAAaA,EAAG,aAAa,KAAK,WAAW,GAClD,KAAK,eAAaA,EAAG,aAAa,KAAK,WAAW,GACtDgC,EAAoBhC,GAAI,KAAK,QAAQ;AAAA,EACvC;AACF;ACpdO,MAAMmY,GAAY;AAAA,EAavB,YAAYnY,GAA4B;AAZhC,IAAApE,EAAA;AACA,IAAAA,EAAA,aAAqC;AAErC,IAAAA,EAAA,wBAAqC;AACrC,IAAAA,EAAA,qBAAkC;AAElC,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,mBAAY;AAGlB,SAAK,KAAKoE,GACV,KAAK,YAAA;AAAA,EACP;AAAA,EAEQ,cAAoB;AAC1B,UAAM,EAAE,IAAAA,MAAO;AAEf,SAAK,MAAMA,EAAG,kBAAA,GACdA,EAAG,gBAAgB,KAAK,GAAG,GAE3B,KAAK,iBAAiBA,EAAG,aAAA,GACzB,KAAK,cAAcA,EAAG,aAAA,GAEtBA,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAEA,WAAWqF,GAA6B;AACtC,UAAM,EAAE,IAAArF,MAAO;AAEf,SAAK,aAAaqF,EAAK,UAAU,SAAS,GAC1C,KAAK,aAAaA,EAAK,cAAc,IACrC,KAAK,YAAYA,EAAK,aAAa,IACnC,KAAK,YAAYA,EAAK,aAAa,GACnC,KAAK,YAAYA,EAAK,aAAa;AAGnC,UAAM3C,IAAS2C,EAAK,UAAU,KAAK,sBAAsB,KAAK,UAAU;AAExE,IAAArF,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,WAAWA,EAAG,cAAcqF,EAAK,WAAWrF,EAAG,YAAY,GAE9DA,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,WAAWA,EAAG,cAAc0C,GAAQ1C,EAAG,YAAY;AAAA,EACxD;AAAA,EAEQ,sBAAsB8D,GAA6B;AACzD,UAAMpB,IAAS,IAAI,aAAaoB,IAAQ,CAAC;AACzC,aAAS,IAAI,GAAG,IAAIA,GAAO,KAAK;AAC9B,YAAMN,IAAI,KAAKM,IAAQ,KAAK;AAC5B,MAAApB,EAAO,IAAI,CAAC,IAAI,MAAMc,IAAI,KAC1Bd,EAAO,IAAI,IAAI,CAAC,IAAI,KACpBA,EAAO,IAAI,IAAI,CAAC,IAAI,IAAMc,IAAI;AAAA,IAChC;AACA,WAAOd;AAAA,EACT;AAAA,EAEA,OAAO9B,GAAgC;AACrC,UAAM,EAAE,IAAAZ,MAAO;AAEf,QAAI,KAAK,eAAe,EAAG;AAE3B,IAAAA,EAAG,gBAAgB,KAAK,GAAG;AAE3B,UAAMgE,IAASpD,EAAQ,WAAW;AAClC,IAAIoD,KAAU,MACZhE,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,wBAAwBgE,CAAM,GACjChE,EAAG,oBAAoBgE,GAAQ,GAAGhE,EAAG,OAAO,IAAO,GAAG,CAAC;AAGzD,UAAMiE,IAAWrD,EAAQ,WAAW;AACpC,IAAIqD,KAAY,MACdjE,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,wBAAwBiE,CAAQ,GACnCjE,EAAG,oBAAoBiE,GAAU,GAAGjE,EAAG,OAAO,IAAO,GAAG,CAAC,IAGvD,KAAK,cACPA,EAAG,UAAU,KAAK,SAAS,GAC3BA,EAAG,WAAWA,EAAG,YAAY,GAAG,KAAK,UAAU,IAG7C,KAAK,eACHY,EAAQ,SAAS,eACnBZ,EAAG,UAAUY,EAAQ,SAAS,aAAgB,KAAK,SAAS,GAE9DZ,EAAG,WAAWA,EAAG,QAAQ,GAAG,KAAK,UAAU,IAG7CA,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAEA,UAAgB;AACd,UAAM,EAAE,IAAAA,MAAO;AACf,IAAI,KAAK,OAAKA,EAAG,kBAAkB,KAAK,GAAG,GACvC,KAAK,kBAAgBA,EAAG,aAAa,KAAK,cAAc,GACxD,KAAK,eAAaA,EAAG,aAAa,KAAK,WAAW;AAAA,EACxD;AACF;ACtGO,MAAMoY,GAAS;AAAA,EAYpB,YAAYpY,GAA4B;AAXhC,IAAApE,EAAA;AACA,IAAAA,EAAA,aAAqC;AAErC,IAAAA,EAAA,wBAAqC;AACrC,IAAAA,EAAA,sBAAmC;AACnC,IAAAA,EAAA,qBAAkC;AAClC,IAAAA,EAAA,qBAAkC;AAElC,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,qBAAc;AAGpB,SAAK,KAAKoE,GACV,KAAK,YAAA;AAAA,EACP;AAAA,EAEQ,cAAoB;AAC1B,UAAM,EAAE,IAAAA,MAAO;AAEf,SAAK,MAAMA,EAAG,kBAAA,GACdA,EAAG,gBAAgB,KAAK,GAAG,GAE3B,KAAK,iBAAiBA,EAAG,aAAA,GACzB,KAAK,eAAeA,EAAG,aAAA,GACvB,KAAK,cAAcA,EAAG,aAAA,GACtB,KAAK,cAAcA,EAAG,aAAA,GAEtBA,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAEA,WAAWqF,GAA0B;AACnC,UAAM,EAAE,IAAArF,MAAO;AAEf,SAAK,cAAcqF,EAAK,QAAQ;AAChC,UAAMgT,IAAchT,EAAK,eAAe,KAClCiT,IAAcjT,EAAK,eAAe,KAGlCkT,IAAc,KAAK,cAAc,IACjC9V,IAAY,IAAI,aAAa8V,IAAc,CAAC,GAC5C/J,IAAU,IAAI,aAAa+J,IAAc,CAAC,GAC1C7V,IAAS,IAAI,aAAa6V,IAAc,CAAC,GAGzC9J,IAAoB,CAAA,GAEpB+J,IAAKH,IAAc,GACnBI,IAAKH,IAAc;AAGzB,QAAIlb,IAAO,OAAUG,IAAO;AAC5B,aAASwF,IAAI,GAAGA,IAAI,KAAK,aAAaA;AACpC,MAAIsC,EAAK,QAAQtC,CAAC,IAAI3F,MAAMA,IAAOiI,EAAK,QAAQtC,CAAC,IAC7CsC,EAAK,QAAQtC,CAAC,IAAIxF,MAAMA,IAAO8H,EAAK,QAAQtC,CAAC;AAEnD,UAAM2V,IAASnb,IAAOH,KAAQ;AAE9B,aAAS2F,IAAI,GAAGA,IAAI,KAAK,aAAaA,KAAK;AACzC,YAAMpJ,IAAI0L,EAAK,QAAQtC,CAAC,GAClBlJ,IAAIwL,EAAK,QAAQtC,CAAC,GAClBoH,IAAI9E,EAAK,QAAQtC,CAAC,GAClB4V,IAAU5V,IAAI,IAGd6V,IAAM,KAAK,oBAAoBjf,GAAG,GAAGE,GAAG2e,GAAIrO,GAAGsO,CAAE;AAEvD,eAAS/e,IAAI,GAAGA,IAAI,IAAIA,KAAK;AAC3B,cAAMmf,KAAMF,IAAUjf,KAAK;AAS3B,YARA+I,EAAUoW,CAAE,IAAID,EAAI,UAAUlf,IAAI,CAAC,GACnC+I,EAAUoW,IAAK,CAAC,IAAID,EAAI,UAAUlf,IAAI,IAAI,CAAC,GAC3C+I,EAAUoW,IAAK,CAAC,IAAID,EAAI,UAAUlf,IAAI,IAAI,CAAC,GAC3C8U,EAAQqK,CAAE,IAAID,EAAI,QAAQlf,IAAI,CAAC,GAC/B8U,EAAQqK,IAAK,CAAC,IAAID,EAAI,QAAQlf,IAAI,IAAI,CAAC,GACvC8U,EAAQqK,IAAK,CAAC,IAAID,EAAI,QAAQlf,IAAI,IAAI,CAAC,GAGnC2L,EAAK;AACP,UAAA3C,EAAOmW,CAAE,IAAIxT,EAAK,OAAOtC,IAAI,CAAC,GAC9BL,EAAOmW,IAAK,CAAC,IAAIxT,EAAK,OAAOtC,IAAI,IAAI,CAAC,GACtCL,EAAOmW,IAAK,CAAC,IAAIxT,EAAK,OAAOtC,IAAI,IAAI,CAAC;AAAA,aACjC;AACL,gBAAMS,KAAK2G,IAAI/M,KAAQsb;AACvB,UAAAhW,EAAOmW,CAAE,IAAI,MAAMrV,IAAI,KACvBd,EAAOmW,IAAK,CAAC,IAAI,MAAMrV,IAAI,KAC3Bd,EAAOmW,IAAK,CAAC,IAAI;AAAA,QACnB;AAAA,MACF;AAGA,eAAS7gB,IAAI,GAAGA,IAAI,GAAGA,KAAK;AAC1B,cAAM8gB,IAAWH,IAAU3gB,IAAI;AAC/B,QAAAyW,EAAQ;AAAA,UACNqK;AAAA,UAAUA,IAAW;AAAA,UAAGA,IAAW;AAAA,UACnCA;AAAA,UAAUA,IAAW;AAAA,UAAGA,IAAW;AAAA,QAAA;AAAA,MAEvC;AAAA,IACF;AAEA,SAAK,aAAarK,EAAQ,QAE1BzO,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,WAAWA,EAAG,cAAcyC,GAAWzC,EAAG,YAAY,GAEzDA,EAAG,WAAWA,EAAG,cAAc,KAAK,YAAY,GAChDA,EAAG,WAAWA,EAAG,cAAcwO,GAASxO,EAAG,YAAY,GAEvDA,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,WAAWA,EAAG,cAAc0C,GAAQ1C,EAAG,YAAY,GAEtDA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GACvDA,EAAG,WAAWA,EAAG,sBAAsB,IAAI,YAAYyO,CAAO,GAAGzO,EAAG,WAAW;AAAA,EACjF;AAAA,EAEQ,oBACN+Y,GAAYC,GAAYC,GACxBT,GAAYrO,GAAWsO,GAC6B;AACpD,UAAMhW,IAAY,IAAI,aAAa,EAAM,GACnC+L,IAAU,IAAI,aAAa,KAAK,CAAC,GAEjCrV,IAAK4f,IAAKP,GAAIpf,IAAK2f,IAAKP,GACxBlf,IAAK0f,GAAIzf,IAAKyf,IAAK7O,GACnBpR,IAAKkgB,IAAKR,GAAIzf,IAAKigB,IAAKR;AAG9B,gBAAK;AAAA,MAAQhW;AAAA,MAAW+L;AAAA,MAAS;AAAA,MAC/BrV;AAAA,MAAIG;AAAA,MAAIN;AAAA,MAAKI;AAAA,MAAIE;AAAA,MAAIN;AAAA,MAAKI;AAAA,MAAIG;AAAA,MAAIP;AAAA,MAAKG;AAAA,MAAII;AAAA,MAAIP;AAAA,MAC/C;AAAA,MAAG;AAAA,MAAG;AAAA,IAAA,GAGR,KAAK;AAAA,MAAQyJ;AAAA,MAAW+L;AAAA,MAAS;AAAA,MAC/BpV;AAAA,MAAIE;AAAA,MAAIP;AAAA,MAAKI;AAAA,MAAIG;AAAA,MAAIP;AAAA,MAAKI;AAAA,MAAII;AAAA,MAAIR;AAAA,MAAKK;AAAA,MAAIG;AAAA,MAAIR;AAAA,MAC/C;AAAA,MAAG;AAAA,MAAG;AAAA,IAAA,GAGR,KAAK;AAAA,MAAQ0J;AAAA,MAAW+L;AAAA,MAAS;AAAA,MAC/BrV;AAAA,MAAII;AAAA,MAAIP;AAAA,MAAKI;AAAA,MAAIG;AAAA,MAAIP;AAAA,MAAKI;AAAA,MAAIG;AAAA,MAAIR;AAAA,MAAKI;AAAA,MAAII;AAAA,MAAIR;AAAA,MAC/C;AAAA,MAAG;AAAA,MAAG;AAAA,IAAA,GAGR,KAAK;AAAA,MAAQ0J;AAAA,MAAW+L;AAAA,MAAS;AAAA,MAC/BrV;AAAA,MAAIG;AAAA,MAAIP;AAAA,MAAKK;AAAA,MAAIE;AAAA,MAAIP;AAAA,MAAKK;AAAA,MAAIE;AAAA,MAAIN;AAAA,MAAKG;AAAA,MAAIG;AAAA,MAAIN;AAAA,MAC/C;AAAA,MAAG;AAAA,MAAI;AAAA,IAAA,GAGT,KAAK;AAAA,MAAQyJ;AAAA,MAAW+L;AAAA,MAAS;AAAA,MAC/BpV;AAAA,MAAIE;AAAA,MAAIN;AAAA,MAAKI;AAAA,MAAIE;AAAA,MAAIP;AAAA,MAAKK;AAAA,MAAIG;AAAA,MAAIR;AAAA,MAAKK;AAAA,MAAIG;AAAA,MAAIP;AAAA,MAC/C;AAAA,MAAG;AAAA,MAAG;AAAA,IAAA,GAGR,KAAK;AAAA,MAAQyJ;AAAA,MAAW+L;AAAA,MAAS;AAAA,MAC/BrV;AAAA,MAAIG;AAAA,MAAIP;AAAA,MAAKI;AAAA,MAAIG;AAAA,MAAIN;AAAA,MAAKG;AAAA,MAAII;AAAA,MAAIP;AAAA,MAAKG;AAAA,MAAII;AAAA,MAAIR;AAAA,MAC/C;AAAA,MAAI;AAAA,MAAG;AAAA,IAAA,GAEF,EAAE,WAAA0J,GAAW,SAAA+L,EAAA;AAAA,EACtB;AAAA,EAEQ,QACN/L,GAAyB+L,GAAuBlL,GAChDnK,GAAYG,GAAYP,GACxBK,GAAYG,GAAYP,GACxBK,GAAYG,GAAYP,GACxBigB,GAAYC,GAAYC,GACxBnL,GAAYC,GAAYC,GAClB;AACN,UAAMkL,IAAK/V,IAAS;AACpB,IAAAb,EAAU4W,CAAE,IAAIlgB,GAAIsJ,EAAU4W,IAAK,CAAC,IAAI/f,GAAImJ,EAAU4W,IAAK,CAAC,IAAItgB,GAChE0J,EAAU4W,IAAK,CAAC,IAAIjgB,GAAIqJ,EAAU4W,IAAK,CAAC,IAAI9f,GAAIkJ,EAAU4W,IAAK,CAAC,IAAIrgB,GACpEyJ,EAAU4W,IAAK,CAAC,IAAIhgB,GAAIoJ,EAAU4W,IAAK,CAAC,IAAI7f,GAAIiJ,EAAU4W,IAAK,CAAC,IAAIpgB,GACpEwJ,EAAU4W,IAAK,CAAC,IAAIH,GAAIzW,EAAU4W,IAAK,EAAE,IAAIF,GAAI1W,EAAU4W,IAAK,EAAE,IAAID;AAEtE,aAASrW,IAAI,GAAGA,IAAI,GAAGA;AACrB,MAAAyL,EAAQ6K,IAAKtW,IAAI,CAAC,IAAIkL,GACtBO,EAAQ6K,IAAKtW,IAAI,IAAI,CAAC,IAAImL,GAC1BM,EAAQ6K,IAAKtW,IAAI,IAAI,CAAC,IAAIoL;AAAA,EAE9B;AAAA,EAEA,OAAOvN,GAAgC;AACrC,UAAM,EAAE,IAAAZ,MAAO;AAEf,QAAI,KAAK,eAAe,EAAG;AAE3B,IAAAA,EAAG,gBAAgB,KAAK,GAAG;AAE3B,UAAMgE,IAASpD,EAAQ,WAAW;AAClC,IAAIoD,KAAU,MACZhE,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,wBAAwBgE,CAAM,GACjChE,EAAG,oBAAoBgE,GAAQ,GAAGhE,EAAG,OAAO,IAAO,GAAG,CAAC;AAGzD,UAAM4O,IAAYhO,EAAQ,WAAW;AACrC,IAAIgO,KAAa,MACf5O,EAAG,WAAWA,EAAG,cAAc,KAAK,YAAY,GAChDA,EAAG,wBAAwB4O,CAAS,GACpC5O,EAAG,oBAAoB4O,GAAW,GAAG5O,EAAG,OAAO,IAAO,GAAG,CAAC;AAG5D,UAAMiE,IAAWrD,EAAQ,WAAW;AACpC,IAAIqD,KAAY,MACdjE,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,wBAAwBiE,CAAQ,GACnCjE,EAAG,oBAAoBiE,GAAU,GAAGjE,EAAG,OAAO,IAAO,GAAG,CAAC,IAG3DA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GACvDA,EAAG,aAAaA,EAAG,WAAW,KAAK,YAAYA,EAAG,cAAc,CAAC,GAEjEA,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAEA,UAAgB;AACd,UAAM,EAAE,IAAAA,MAAO;AACf,IAAI,KAAK,OAAKA,EAAG,kBAAkB,KAAK,GAAG,GACvC,KAAK,kBAAgBA,EAAG,aAAa,KAAK,cAAc,GACxD,KAAK,gBAAcA,EAAG,aAAa,KAAK,YAAY,GACpD,KAAK,eAAaA,EAAG,aAAa,KAAK,WAAW,GAClD,KAAK,eAAaA,EAAG,aAAa,KAAK,WAAW;AAAA,EACxD;AACF;ACxNO,MAAMsZ,GAAY;AAAA,EAevB,YAAYtZ,GAA4BmW,IAA6B,IAAI;AAdjE,IAAAva,EAAA;AACA,IAAAA,EAAA,aAAqC;AAErC,IAAAA,EAAA,wBAAqC;AACrC,IAAAA,EAAA,qBAAkC;AAClC,IAAAA,EAAA,qBAAkC;AAElC,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,wBAAiB;AAEjB,IAAAA,EAAA,kBAA+C;AAGrD,SAAK,KAAKoE,GACV,KAAK,YAAA;AAAA,EACP;AAAA,EAEQ,cAAoB;AAC1B,UAAM,EAAE,IAAAA,MAAO;AAEf,SAAK,MAAMA,EAAG,kBAAA,GACdA,EAAG,gBAAgB,KAAK,GAAG,GAE3B,KAAK,iBAAiBA,EAAG,aAAA,GACzB,KAAK,cAAcA,EAAG,aAAA,GACtB,KAAK,cAAcA,EAAG,aAAA,GAEtBA,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAWqF,GAA6B;AAEtC,QADA,KAAK,aAAaA,EAAK,OAAO,QAC1B,KAAK,eAAe,EAAG;AAE3B,SAAK,iBAAiBA,EAAK,QAAQ,QACnC,KAAK,WAAWA,EAAK,YAAY;AAEjC,UAAMkU,IAASlU,EAAK,UAAU,GACxBmU,IAAQnU,EAAK;AAGnB,QAAIjI,IAAO,OAAUG,IAAO;AAC5B,eAAWya,KAAS3S,EAAK;AACvB,eAAStC,IAAI,GAAGA,IAAIiV,EAAM,QAAQjV;AAChC,QAAIiV,EAAMjV,CAAC,IAAI3F,MAAMA,IAAO4a,EAAMjV,CAAC,IAC/BiV,EAAMjV,CAAC,IAAIxF,MAAMA,IAAOya,EAAMjV,CAAC;AAGvC,UAAM2V,IAASnb,IAAOH,KAAQ;AAE9B,IAAI,KAAK,aAAa,cACpB,KAAK,eAAeiI,GAAMkU,GAAQC,GAAOpc,GAAMsb,CAAM,IAErD,KAAK,WAAWrT,GAAMkU,GAAQC,GAAOpc,GAAMsb,CAAM;AAAA,EAErD;AAAA,EAEQ,eACNrT,GACAkU,GACAC,GACApc,GACAsb,GACM;AACN,UAAM,EAAE,IAAA1Y,GAAI,YAAAyZ,GAAY,gBAAAC,EAAA,IAAmB;AAG3C,SAAK,cAAcD,IAAaC;AAEhC,UAAMjX,IAAY,IAAI,aAAa,KAAK,cAAc,CAAC,GACjDC,IAAS,IAAI,aAAa,KAAK,cAAc,CAAC;AAEpD,aAASzI,IAAI,GAAGA,IAAIwf,GAAYxf,KAAK;AACnC,YAAMJ,IAAI0f,IAAStf,IAAIuf,GACjBxB,IAAQ3S,EAAK,OAAOpL,CAAC;AAE3B,eAAS0O,IAAI,GAAGA,IAAI+Q,GAAgB/Q,KAAK;AAEvC,cAAMyJ,KADMnY,IAAIyf,IAAiB/Q,KAChB;AAEjB,QAAAlG,EAAU2P,CAAE,IAAI/M,EAAK,QAAQsD,CAAC,GAC9BlG,EAAU2P,IAAK,CAAC,IAAI4F,EAAMrP,CAAC,GAC3BlG,EAAU2P,IAAK,CAAC,IAAIvY;AAGpB,cAAM2J,KAAKwU,EAAMrP,CAAC,IAAIvL,KAAQsb;AAC9B,aAAK,cAAchW,GAAQ0P,GAAI5O,GAAG6B,EAAK,QAAQ;AAAA,MACjD;AAAA,IACF;AAGA,UAAMoJ,IAAoB,CAAA;AAC1B,aAASxU,IAAI,GAAGA,IAAIwf,GAAYxf;AAC9B,eAAS0O,IAAI,GAAGA,IAAI+Q,IAAiB,GAAG/Q,KAAK;AAC3C,cAAMsH,IAAMhW,IAAIyf,IAAiB/Q;AACjC,QAAA8F,EAAQ,KAAKwB,GAAKA,IAAM,CAAC;AAAA,MAC3B;AAGF,SAAK,aAAaxB,EAAQ,QAE1BzO,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,WAAWA,EAAG,cAAcyC,GAAWzC,EAAG,YAAY,GAEzDA,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,WAAWA,EAAG,cAAc0C,GAAQ1C,EAAG,YAAY,GAEtDA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GACvDA,EAAG,WAAWA,EAAG,sBAAsB,IAAI,YAAYyO,CAAO,GAAGzO,EAAG,WAAW;AAAA,EACjF;AAAA,EAEQ,WACNqF,GACAkU,GACAC,GACApc,GACAsb,GACM;AACN,UAAM,EAAE,IAAA1Y,GAAI,YAAAyZ,GAAY,gBAAAC,EAAA,IAAmB,MAIrCC,IAAWF,IAAa,GACxBG,IAAWF,IAAiB;AAElC,QAAIC,KAAY,KAAKC,KAAY,GAAG;AAClC,WAAK,cAAc,GACnB,KAAK,aAAa;AAClB;AAAA,IACF;AAGA,SAAK,cAAcH,IAAaC;AAEhC,UAAMjX,IAAY,IAAI,aAAa,KAAK,cAAc,CAAC,GACjDC,IAAS,IAAI,aAAa,KAAK,cAAc,CAAC;AAEpD,aAASzI,IAAI,GAAGA,IAAIwf,GAAYxf,KAAK;AACnC,YAAMJ,IAAI0f,IAAStf,IAAIuf,GACjBxB,IAAQ3S,EAAK,OAAOpL,CAAC;AAE3B,eAAS0O,IAAI,GAAGA,IAAI+Q,GAAgB/Q,KAAK;AAEvC,cAAMyJ,KADMnY,IAAIyf,IAAiB/Q,KAChB;AAEjB,QAAAlG,EAAU2P,CAAE,IAAI/M,EAAK,QAAQsD,CAAC,GAC9BlG,EAAU2P,IAAK,CAAC,IAAI4F,EAAMrP,CAAC,GAC3BlG,EAAU2P,IAAK,CAAC,IAAIvY;AAEpB,cAAM2J,KAAKwU,EAAMrP,CAAC,IAAIvL,KAAQsb;AAC9B,aAAK,cAAchW,GAAQ0P,GAAI5O,GAAG6B,EAAK,QAAQ;AAAA,MACjD;AAAA,IACF;AAGA,UAAMoJ,IAAoB,CAAA;AAC1B,aAASxU,IAAI,GAAGA,IAAI0f,GAAU1f;AAC5B,eAAS0O,IAAI,GAAGA,IAAIiR,GAAUjR,KAAK;AACjC,cAAMyF,IAAUnU,IAAIyf,IAAiB/Q,GAC/B2F,IAAWF,IAAU,GACrBC,IAAaD,IAAUsL,GACvBnL,IAAcF,IAAa;AAGjC,QAAAI,EAAQ,KAAKL,GAASC,GAAYC,CAAQ,GAC1CG,EAAQ,KAAKH,GAAUD,GAAYE,CAAW;AAAA,MAChD;AAGF,SAAK,aAAaE,EAAQ,QAE1BzO,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,WAAWA,EAAG,cAAcyC,GAAWzC,EAAG,YAAY,GAEzDA,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,WAAWA,EAAG,cAAc0C,GAAQ1C,EAAG,YAAY,GAEtDA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GACvDA,EAAG,WAAWA,EAAG,sBAAsB,IAAI,YAAYyO,CAAO,GAAGzO,EAAG,WAAW;AAAA,EACjF;AAAA,EAEQ,cAAc0C,GAAsB0P,GAAY5O,GAAWqW,GAAyB;AAI1F,YAFArW,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGA,CAAC,CAAC,GAEtBqW,GAAA;AAAA,MACN,KAAK;AACH,aAAK,YAAYnX,GAAQ0P,GAAI5O,CAAC;AAC9B;AAAA,MACF,KAAK;AACH,aAAK,YAAYd,GAAQ0P,GAAI5O,CAAC;AAC9B;AAAA,MACF,KAAK;AACH,QAAAd,EAAO0P,CAAE,IAAI5O,GACbd,EAAO0P,IAAK,CAAC,IAAI,IAAI5O,GACrBd,EAAO0P,IAAK,CAAC,IAAI;AACjB;AAAA,MACF,KAAK;AACH,QAAA1P,EAAO0P,CAAE,IAAI5O,GACbd,EAAO0P,IAAK,CAAC,IAAI5O,GACjBd,EAAO0P,IAAK,CAAC,IAAI5O;AACjB;AAAA,MACF,KAAK;AAAA,MACL;AACE,aAAK,gBAAgBd,GAAQ0P,GAAI5O,CAAC;AAClC;AAAA,IAAA;AAAA,EAEN;AAAA,EAEQ,gBAAgBd,GAAsB0P,GAAY5O,GAAiB;AAEzE,IAAAd,EAAO0P,CAAE,IAAI,QAAQ5O,IAAI,QAAQA,IAAIA,IAAI,KACzCd,EAAO0P,IAAK,CAAC,IAAI,OAAQ5O,IAAI,OAC7Bd,EAAO0P,IAAK,CAAC,IAAI,QAAQ5O,IAAI,MAAMA,IAAIA,IAAI;AAAA,EAC7C;AAAA,EAEQ,YAAYd,GAAsB0P,GAAY5O,GAAiB;AACrE,IAAIA,IAAI,QACNd,EAAO0P,CAAE,IAAI,GACb1P,EAAO0P,IAAK,CAAC,IAAI,IAAI5O,GACrBd,EAAO0P,IAAK,CAAC,IAAI,KACR5O,IAAI,OACbd,EAAO0P,CAAE,IAAI,GACb1P,EAAO0P,IAAK,CAAC,IAAI,GACjB1P,EAAO0P,IAAK,CAAC,IAAI,IAAI,KAAK5O,IAAI,SACrBA,IAAI,QACbd,EAAO0P,CAAE,IAAI,KAAK5O,IAAI,MACtBd,EAAO0P,IAAK,CAAC,IAAI,GACjB1P,EAAO0P,IAAK,CAAC,IAAI,MAEjB1P,EAAO0P,CAAE,IAAI,GACb1P,EAAO0P,IAAK,CAAC,IAAI,IAAI,KAAK5O,IAAI,OAC9Bd,EAAO0P,IAAK,CAAC,IAAI;AAAA,EAErB;AAAA,EAEQ,YAAY1P,GAAsB0P,GAAY5O,GAAiB;AACrE,IAAAd,EAAO0P,CAAE,IAAI,KAAK,IAAI,GAAG5O,IAAI,CAAC,GAC9Bd,EAAO0P,IAAK,CAAC,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI5O,IAAI,QAAQ,CAAC,CAAC,GACxDd,EAAO0P,IAAK,CAAC,IAAI,KAAK,IAAI,IAAI5O,IAAI,QAAQ,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAUgH,GAAuBnF,GAA6B;AAE5D,IAAAA,EAAK,OAAO,IAAA,GACZA,EAAK,OAAO,QAAQmF,CAAO,GAG3B,KAAK,WAAWnF,CAAI;AAAA,EACtB;AAAA,EAEA,OAAOzE,GAAgC;AACrC,UAAM,EAAE,IAAAZ,MAAO;AAEf,QAAI,KAAK,eAAe,EAAG;AAE3B,IAAAA,EAAG,gBAAgB,KAAK,GAAG;AAE3B,UAAMgE,IAASpD,EAAQ,WAAW;AAClC,IAAIoD,KAAU,MACZhE,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,wBAAwBgE,CAAM,GACjChE,EAAG,oBAAoBgE,GAAQ,GAAGhE,EAAG,OAAO,IAAO,GAAG,CAAC;AAGzD,UAAMiE,IAAWrD,EAAQ,WAAW;AACpC,IAAIqD,KAAY,MACdjE,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,wBAAwBiE,CAAQ,GACnCjE,EAAG,oBAAoBiE,GAAU,GAAGjE,EAAG,OAAO,IAAO,GAAG,CAAC,IAG3DA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GAEnD,KAAK,aAAa,cACpBA,EAAG,aAAaA,EAAG,OAAO,KAAK,YAAYA,EAAG,cAAc,CAAC,IAE7DA,EAAG,aAAaA,EAAG,WAAW,KAAK,YAAYA,EAAG,cAAc,CAAC,GAGnEA,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAEA,UAAgB;AACd,UAAM,EAAE,IAAAA,MAAO;AACf,IAAI,KAAK,OAAKA,EAAG,kBAAkB,KAAK,GAAG,GACvC,KAAK,kBAAgBA,EAAG,aAAa,KAAK,cAAc,GACxD,KAAK,eAAaA,EAAG,aAAa,KAAK,WAAW,GAClD,KAAK,eAAaA,EAAG,aAAa,KAAK,WAAW;AAAA,EACxD;AACF;ACjTO,MAAM8Z,GAAU;AAAA,EAiBrB,YAAY9Z,GAA4B;AAhBhC,IAAApE,EAAA;AACA,IAAAA,EAAA,aAAqC;AAGrC;AAAA,IAAAA,EAAA,2BAAwC;AACxC,IAAAA,EAAA,6BAA0C;AAG1C;AAAA,IAAAA,EAAA,2BAAwC;AACxC,IAAAA,EAAA,6BAA0C;AAC1C,IAAAA,EAAA,4BAAyC;AAEzC,IAAAA,EAAA;AACA,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,gBAAkD;AAGxD,SAAK,KAAKoE,GACV,KAAK,WAAWsP,GAAgB,CAAC,GACjC,KAAK,YAAA;AAAA,EACP;AAAA,EAEQ,cAAoB;AAC1B,UAAM,EAAE,IAAAtP,GAAI,UAAAgR,EAAA,IAAa;AAEzB,SAAK,MAAMhR,EAAG,kBAAA,GACdA,EAAG,gBAAgB,KAAK,GAAG,GAG3B,KAAK,oBAAoBA,EAAG,aAAA,GAC5BA,EAAG,WAAWA,EAAG,cAAc,KAAK,iBAAiB,GACrDA,EAAG,WAAWA,EAAG,cAAcgR,EAAS,WAAWhR,EAAG,WAAW,GAGjE,KAAK,sBAAsBA,EAAG,aAAA,GAC9BA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,mBAAmB,GAC/DA,EAAG,WAAWA,EAAG,sBAAsBgR,EAAS,SAAShR,EAAG,WAAW,GAGvE,KAAK,oBAAoBA,EAAG,aAAA,GAC5B,KAAK,sBAAsBA,EAAG,aAAA,GAC9B,KAAK,qBAAqBA,EAAG,aAAA,GAE7BA,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAEA,WAAWqF,GAA2B;AACpC,UAAM,EAAE,IAAArF,MAAO;AAEf,SAAK,gBAAgBqF,EAAK,UAAU,SAAS,GAC7C,KAAK,SAASA,EAAK,UAAU,WAGzB,KAAK,WAAW,UAAU,KAAK,WAAW,eAC5C,KAAK,WAAWwL,GAAA,GAChB7Q,EAAG,WAAWA,EAAG,cAAc,KAAK,iBAAiB,GACrDA,EAAG,WAAWA,EAAG,cAAc,KAAK,SAAS,WAAWA,EAAG,WAAW,GACtEA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,mBAAmB,GAC/DA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,SAAS,SAASA,EAAG,WAAW;AAI9E,UAAM0C,IAAS2C,EAAK,UAAU,KAAK,sBAAsB,KAAK,aAAa,GAGrEwP,IAAQxP,EAAK,SAAS,IAAI,aAAa,KAAK,aAAa,EAAE,KAAK,GAAG;AAEzE,IAAArF,EAAG,WAAWA,EAAG,cAAc,KAAK,iBAAiB,GACrDA,EAAG,WAAWA,EAAG,cAAcqF,EAAK,WAAWrF,EAAG,YAAY,GAE9DA,EAAG,WAAWA,EAAG,cAAc,KAAK,mBAAmB,GACvDA,EAAG,WAAWA,EAAG,cAAc0C,GAAQ1C,EAAG,YAAY,GAEtDA,EAAG,WAAWA,EAAG,cAAc,KAAK,kBAAkB,GACtDA,EAAG,WAAWA,EAAG,cAAc6U,GAAO7U,EAAG,YAAY;AAAA,EACvD;AAAA,EAEQ,sBAAsB8D,GAA6B;AACzD,UAAMpB,IAAS,IAAI,aAAaoB,IAAQ,CAAC;AACzC,aAAS,IAAI,GAAG,IAAIA,GAAO;AACzB,MAAApB,EAAO,IAAI,CAAC,IAAI,MAAM,KAAK,WAAW,KACtCA,EAAO,IAAI,IAAI,CAAC,IAAI,MAAM,KAAK,WAAW,KAC1CA,EAAO,IAAI,IAAI,CAAC,IAAI,MAAM,KAAK,WAAW;AAE5C,WAAOA;AAAA,EACT;AAAA,EAEA,OAAO9B,GAAgC;AACrC,UAAM,EAAE,IAAAZ,GAAI,UAAAgR,GAAU,eAAAE,EAAA,IAAkB;AAExC,QAAIA,MAAkB,EAAG;AAEzB,IAAAlR,EAAG,gBAAgB,KAAK,GAAG;AAG3B,UAAMgE,IAASpD,EAAQ,WAAW;AAClC,IAAIoD,KAAU,MACZhE,EAAG,WAAWA,EAAG,cAAc,KAAK,iBAAiB,GACrDA,EAAG,wBAAwBgE,CAAM,GACjChE,EAAG,oBAAoBgE,GAAQ,GAAGhE,EAAG,OAAO,IAAO,GAAG,CAAC,GACvDA,EAAG,oBAAoBgE,GAAQ,CAAC;AAIlC,UAAMmN,IAAiBvQ,EAAQ,WAAW;AAC1C,IAAIuQ,KAAkB,MACpBnR,EAAG,WAAWA,EAAG,cAAc,KAAK,iBAAiB,GACrDA,EAAG,wBAAwBmR,CAAc,GACzCnR,EAAG,oBAAoBmR,GAAgB,GAAGnR,EAAG,OAAO,IAAO,GAAG,CAAC,GAC/DA,EAAG,oBAAoBmR,GAAgB,CAAC;AAI1C,UAAMlN,IAAWrD,EAAQ,WAAW;AACpC,IAAIqD,KAAY,MACdjE,EAAG,WAAWA,EAAG,cAAc,KAAK,mBAAmB,GACvDA,EAAG,wBAAwBiE,CAAQ,GACnCjE,EAAG,oBAAoBiE,GAAU,GAAGjE,EAAG,OAAO,IAAO,GAAG,CAAC,GACzDA,EAAG,oBAAoBiE,GAAU,CAAC;AAIpC,UAAMmN,IAAWxQ,EAAQ,WAAW;AACpC,IAAIwQ,KAAY,MACdpR,EAAG,WAAWA,EAAG,cAAc,KAAK,kBAAkB,GACtDA,EAAG,wBAAwBoR,CAAQ,GACnCpR,EAAG,oBAAoBoR,GAAU,GAAGpR,EAAG,OAAO,IAAO,GAAG,CAAC,GACzDA,EAAG,oBAAoBoR,GAAU,CAAC,IAGpCpR,EAAG,WAAWA,EAAG,sBAAsB,KAAK,mBAAmB,GAC/DA,EAAG;AAAA,MACDA,EAAG;AAAA,MACHgR,EAAS;AAAA,MACThR,EAAG;AAAA,MACH;AAAA,MACAkR;AAAA,IAAA,GAGFlR,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAEA,UAAgB;AACd,UAAM,EAAE,IAAAA,MAAO;AACf,IAAI,KAAK,OAAKA,EAAG,kBAAkB,KAAK,GAAG,GACvC,KAAK,qBAAmBA,EAAG,aAAa,KAAK,iBAAiB,GAC9D,KAAK,uBAAqBA,EAAG,aAAa,KAAK,mBAAmB,GAClE,KAAK,qBAAmBA,EAAG,aAAa,KAAK,iBAAiB,GAC9D,KAAK,uBAAqBA,EAAG,aAAa,KAAK,mBAAmB,GAClE,KAAK,sBAAoBA,EAAG,aAAa,KAAK,kBAAkB;AAAA,EACtE;AACF;ACzJO,MAAM+Z,GAAS;AAAA,EAWpB,YAAY/Z,GAA4B;AAVhC,IAAApE,EAAA;AACA,IAAAA,EAAA,aAAqC;AAErC,IAAAA,EAAA,wBAAqC;AACrC,IAAAA,EAAA,sBAAmC;AACnC,IAAAA,EAAA,qBAAkC;AAClC,IAAAA,EAAA,qBAAkC;AAElC,IAAAA,EAAA,oBAAa;AAGnB,SAAK,KAAKoE,GACV,KAAK,YAAA;AAAA,EACP;AAAA,EAEQ,cAAoB;AAC1B,UAAM,EAAE,IAAAA,MAAO;AAEf,SAAK,MAAMA,EAAG,kBAAA,GACdA,EAAG,gBAAgB,KAAK,GAAG,GAE3B,KAAK,iBAAiBA,EAAG,aAAA,GACzB,KAAK,eAAeA,EAAG,aAAA,GACvB,KAAK,cAAcA,EAAG,aAAA,GACtB,KAAK,cAAcA,EAAG,aAAA,GAEtBA,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAEA,WAAWqF,GAA0B;AACnC,UAAM,EAAE,IAAArF,MAAO,MAET+N,IAAa1I,EAAK,UAAU,SAAS;AAC3C,QAAI0I,IAAa,EAAG;AAEpB,UAAMiM,IAAe3U,EAAK,gBAAgB,KACpC4U,IAAS5U,EAAK,UAAU,IAAI,aAAa0I,CAAU,EAAE,KAAKiM,CAAY,GAGtEzB,IAAcxK,IAAa,GAC3BtL,IAAY,IAAI,aAAa8V,IAAc,CAAC,GAC5C/J,IAAU,IAAI,aAAa+J,IAAc,CAAC,GAC1C7V,IAAS,IAAI,aAAa6V,IAAc,CAAC;AAG/C,aAASxV,IAAI,GAAGA,IAAIgL,GAAYhL,KAAK;AACnC,YAAMqP,IAAKrP,IAAI,GACT,IAAIsC,EAAK,UAAU+M,CAAE,GACrBxY,IAAIyL,EAAK,UAAU+M,IAAK,CAAC,GACzBvY,IAAIwL,EAAK,UAAU+M,IAAK,CAAC;AAG/B,UAAI+B,IAAK,GAAGC,IAAK,GAAGC,IAAK;AAEzB,MAAItR,MAAM,KACRoR,IAAK9O,EAAK,UAAU,CAAC,IAAI,GACzB+O,IAAK/O,EAAK,UAAU,CAAC,IAAIzL,GACzBya,IAAKhP,EAAK,UAAU,CAAC,IAAIxL,KAChBkJ,MAAMgL,IAAa,KAC5BoG,IAAK,IAAI9O,EAAK,UAAU+M,IAAK,CAAC,GAC9BgC,IAAKxa,IAAIyL,EAAK,UAAU+M,IAAK,CAAC,GAC9BiC,IAAKxa,IAAIwL,EAAK,UAAU+M,IAAK,CAAC,MAE9B+B,IAAK9O,EAAK,UAAU+M,IAAK,CAAC,IAAI/M,EAAK,UAAU+M,IAAK,CAAC,GACnDgC,IAAK/O,EAAK,UAAU+M,IAAK,CAAC,IAAI/M,EAAK,UAAU+M,IAAK,CAAC,GACnDiC,IAAKhP,EAAK,UAAU+M,IAAK,CAAC,IAAI/M,EAAK,UAAU+M,IAAK,CAAC;AAIrD,YAAMkC,IAAO,KAAK,KAAKH,IAAKA,IAAKC,IAAKA,IAAKC,IAAKA,CAAE,KAAK;AACvD,MAAAF,KAAMG,GAAMF,KAAME,GAAMD,KAAMC;AAG9B,YAAM1b,IAAM,GAAGC,IAAM,GAAGC,IAAM;AAC9B,UAAIkb,IAAKnb,IAAMwb,IAAKvb,IAAMsb,GACtBH,IAAKnb,IAAMqb,IAAKvb,IAAMyb,GACtBH,IAAKtb,IAAMwb,IAAKvb,IAAMsb;AAE1B,YAAM+F,IAAO,KAAK,KAAKlG,IAAKA,IAAKC,IAAKA,IAAKC,IAAKA,CAAE,KAAK;AACvD,MAAAF,KAAMkG,GAAMjG,KAAMiG,GAAMhG,KAAMgG;AAE9B,YAAM1B,IAAKyB,EAAOlX,CAAC,IAAI,GAIjBoX,IADKpX,IAAI,IACE;AACjB,MAAAN,EAAU0X,CAAG,IAAI,IAAInG,IAAKwE,GAC1B/V,EAAU0X,IAAM,CAAC,IAAIvgB,IAAIqa,IAAKuE,GAC9B/V,EAAU0X,IAAM,CAAC,IAAItgB,IAAIqa,IAAKsE;AAI9B,YAAM4B,KADKrX,IAAI,IAAI,KACF;AAUjB,UATAN,EAAU2X,CAAG,IAAI,IAAIpG,IAAKwE,GAC1B/V,EAAU2X,IAAM,CAAC,IAAIxgB,IAAIqa,IAAKuE,GAC9B/V,EAAU2X,IAAM,CAAC,IAAIvgB,IAAIqa,IAAKsE,GAG9BhK,EAAQ2L,CAAG,IAAIvhB,GAAK4V,EAAQ2L,IAAM,CAAC,IAAIthB,GAAK2V,EAAQ2L,IAAM,CAAC,IAAIrhB,GAC/D0V,EAAQ4L,CAAG,IAAIxhB,GAAK4V,EAAQ4L,IAAM,CAAC,IAAIvhB,GAAK2V,EAAQ4L,IAAM,CAAC,IAAIthB,GAG3DuM,EAAK;AACP,QAAA3C,EAAOyX,CAAG,IAAI9U,EAAK,OAAO+M,CAAE,GAC5B1P,EAAOyX,IAAM,CAAC,IAAI9U,EAAK,OAAO+M,IAAK,CAAC,GACpC1P,EAAOyX,IAAM,CAAC,IAAI9U,EAAK,OAAO+M,IAAK,CAAC,GACpC1P,EAAO0X,CAAG,IAAI/U,EAAK,OAAO+M,CAAE,GAC5B1P,EAAO0X,IAAM,CAAC,IAAI/U,EAAK,OAAO+M,IAAK,CAAC,GACpC1P,EAAO0X,IAAM,CAAC,IAAI/U,EAAK,OAAO+M,IAAK,CAAC;AAAA,WAC/B;AACL,cAAM5O,IAAIT,KAAKgL,IAAa;AAC5B,QAAArL,EAAOyX,CAAG,IAAI,MAAM3W,IAAI,KACxBd,EAAOyX,IAAM,CAAC,IAAI,KAClBzX,EAAOyX,IAAM,CAAC,IAAI,MAAM3W,IAAI,KAC5Bd,EAAO0X,CAAG,IAAI1X,EAAOyX,CAAG,GACxBzX,EAAO0X,IAAM,CAAC,IAAI1X,EAAOyX,IAAM,CAAC,GAChCzX,EAAO0X,IAAM,CAAC,IAAI1X,EAAOyX,IAAM,CAAC;AAAA,MAClC;AAAA,IACF;AAGA,UAAM1L,IAAoB,CAAA;AAC1B,aAAS1L,IAAI,GAAGA,IAAIgL,IAAa,GAAGhL,KAAK;AACvC,YAAMmQ,IAAKnQ,IAAI,GACToQ,IAAKpQ,IAAI,IAAI,GACbqQ,KAAMrQ,IAAI,KAAK,GACfsQ,KAAMtQ,IAAI,KAAK,IAAI;AAEzB,MAAA0L,EAAQ,KAAKyE,GAAIC,GAAIC,CAAE,GACvB3E,EAAQ,KAAK2E,GAAID,GAAIE,CAAE;AAAA,IACzB;AAEA,SAAK,aAAa5E,EAAQ,QAE1BzO,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,WAAWA,EAAG,cAAcyC,GAAWzC,EAAG,YAAY,GAEzDA,EAAG,WAAWA,EAAG,cAAc,KAAK,YAAY,GAChDA,EAAG,WAAWA,EAAG,cAAcwO,GAASxO,EAAG,YAAY,GAEvDA,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,WAAWA,EAAG,cAAc0C,GAAQ1C,EAAG,YAAY,GAEtDA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GACvDA,EAAG,WAAWA,EAAG,sBAAsB,IAAI,YAAYyO,CAAO,GAAGzO,EAAG,WAAW;AAAA,EACjF;AAAA,EAEA,OAAOY,GAAgC;AACrC,UAAM,EAAE,IAAAZ,MAAO;AAEf,QAAI,KAAK,eAAe,EAAG;AAE3B,IAAAA,EAAG,gBAAgB,KAAK,GAAG;AAE3B,UAAMgE,IAASpD,EAAQ,WAAW;AAClC,IAAIoD,KAAU,MACZhE,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,wBAAwBgE,CAAM,GACjChE,EAAG,oBAAoBgE,GAAQ,GAAGhE,EAAG,OAAO,IAAO,GAAG,CAAC;AAGzD,UAAM4O,IAAYhO,EAAQ,WAAW;AACrC,IAAIgO,KAAa,MACf5O,EAAG,WAAWA,EAAG,cAAc,KAAK,YAAY,GAChDA,EAAG,wBAAwB4O,CAAS,GACpC5O,EAAG,oBAAoB4O,GAAW,GAAG5O,EAAG,OAAO,IAAO,GAAG,CAAC;AAG5D,UAAMiE,IAAWrD,EAAQ,WAAW;AACpC,IAAIqD,KAAY,MACdjE,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,wBAAwBiE,CAAQ,GACnCjE,EAAG,oBAAoBiE,GAAU,GAAGjE,EAAG,OAAO,IAAO,GAAG,CAAC,IAG3DA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GACvDA,EAAG,aAAaA,EAAG,WAAW,KAAK,YAAYA,EAAG,cAAc,CAAC,GAEjEA,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAEA,UAAgB;AACd,UAAM,EAAE,IAAAA,MAAO;AACf,IAAI,KAAK,OAAKA,EAAG,kBAAkB,KAAK,GAAG,GACvC,KAAK,kBAAgBA,EAAG,aAAa,KAAK,cAAc,GACxD,KAAK,gBAAcA,EAAG,aAAa,KAAK,YAAY,GACpD,KAAK,eAAaA,EAAG,aAAa,KAAK,WAAW,GAClD,KAAK,eAAaA,EAAG,aAAa,KAAK,WAAW;AAAA,EACxD;AACF;AC9LO,MAAMqa,GAAO;AAAA,EAWlB,YAAYra,GAA4B;AAVhC,IAAApE,EAAA;AACA,IAAAA,EAAA,aAAqC;AAErC,IAAAA,EAAA,wBAAqC;AACrC,IAAAA,EAAA,qBAAkC;AAClC,IAAAA,EAAA,qBAAkC;AAElC,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,qBAAc;AAGpB,SAAK,KAAKoE,GACV,KAAK,YAAA;AAAA,EACP;AAAA,EAEQ,cAAoB;AAC1B,UAAM,EAAE,IAAAA,MAAO;AAEf,SAAK,MAAMA,EAAG,kBAAA,GACdA,EAAG,gBAAgB,KAAK,GAAG,GAE3B,KAAK,iBAAiBA,EAAG,aAAA,GACzB,KAAK,cAAcA,EAAG,aAAA,GACtB,KAAK,cAAcA,EAAG,aAAA,GAEtBA,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAEA,WAAWqF,GAAwB;AACjC,UAAM,EAAE,IAAArF,MAAO,MAET+N,IAAa1I,EAAK,UAAU,SAAS;AAC3C,QAAI0I,IAAa,EAAG;AAEpB,UAAMzB,IAAQjH,EAAK,SAAS;AAC5B,SAAK,cAAcA,EAAK,eAAe;AAGvC,UAAMkT,IAAcxK,IAAa,GAC3BtL,IAAY,IAAI,aAAa8V,IAAc,CAAC,GAC5C7V,IAAS,IAAI,aAAa6V,IAAc,CAAC;AAE/C,aAASxV,IAAI,GAAGA,IAAIgL,GAAYhL,KAAK;AACnC,YAAMqP,IAAKrP,IAAI,GACTpJ,IAAI0L,EAAK,UAAU+M,CAAE,GACrBxY,IAAIyL,EAAK,UAAU+M,IAAK,CAAC,GACzBvY,IAAIwL,EAAK,UAAU+M,IAAK,CAAC,GAIzBkI,IADKvX,IAAI,IACE;AACjB,MAAAN,EAAU6X,CAAG,IAAI3gB,GACjB8I,EAAU6X,IAAM,CAAC,IAAI1gB,GACrB6I,EAAU6X,IAAM,CAAC,IAAIzgB;AAIrB,YAAM0gB,KADKxX,IAAI,IAAI,KACF;AAMjB,UALAN,EAAU8X,CAAG,IAAI5gB,GACjB8I,EAAU8X,IAAM,CAAC,IAAIjO,GACrB7J,EAAU8X,IAAM,CAAC,IAAI1gB,GAGjBwL,EAAK;AACP,QAAA3C,EAAO4X,CAAG,IAAIjV,EAAK,OAAO+M,CAAE,GAC5B1P,EAAO4X,IAAM,CAAC,IAAIjV,EAAK,OAAO+M,IAAK,CAAC,GACpC1P,EAAO4X,IAAM,CAAC,IAAIjV,EAAK,OAAO+M,IAAK,CAAC,GACpC1P,EAAO6X,CAAG,IAAIlV,EAAK,OAAO+M,CAAE,IAAI,KAChC1P,EAAO6X,IAAM,CAAC,IAAIlV,EAAK,OAAO+M,IAAK,CAAC,IAAI,KACxC1P,EAAO6X,IAAM,CAAC,IAAIlV,EAAK,OAAO+M,IAAK,CAAC,IAAI;AAAA,WACnC;AACL,cAAM5O,IAAIT,KAAKgL,IAAa;AAC5B,QAAArL,EAAO4X,CAAG,IAAI,MAAM9W,IAAI,KACxBd,EAAO4X,IAAM,CAAC,IAAI,KAClB5X,EAAO4X,IAAM,CAAC,IAAI,KAClB5X,EAAO6X,CAAG,IAAI7X,EAAO4X,CAAG,IAAI,KAC5B5X,EAAO6X,IAAM,CAAC,IAAI7X,EAAO4X,IAAM,CAAC,IAAI,KACpC5X,EAAO6X,IAAM,CAAC,IAAI7X,EAAO4X,IAAM,CAAC,IAAI;AAAA,MACtC;AAAA,IACF;AAGA,UAAM7L,IAAoB,CAAA;AAC1B,aAAS1L,IAAI,GAAGA,IAAIgL,IAAa,GAAGhL,KAAK;AACvC,YAAMqQ,IAAKrQ,IAAI,GACTmQ,IAAKnQ,IAAI,IAAI,GACbsQ,KAAMtQ,IAAI,KAAK,GACfoQ,KAAMpQ,IAAI,KAAK,IAAI;AAEzB,MAAA0L,EAAQ,KAAK2E,GAAIF,GAAIG,CAAE,GACvB5E,EAAQ,KAAK4E,GAAIH,GAAIC,CAAE;AAAA,IACzB;AAEA,SAAK,aAAa1E,EAAQ,QAE1BzO,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,WAAWA,EAAG,cAAcyC,GAAWzC,EAAG,YAAY,GAEzDA,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,WAAWA,EAAG,cAAc0C,GAAQ1C,EAAG,YAAY,GAEtDA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GACvDA,EAAG,WAAWA,EAAG,sBAAsB,IAAI,YAAYyO,CAAO,GAAGzO,EAAG,WAAW;AAAA,EACjF;AAAA,EAEA,OAAOY,GAAgC;AACrC,UAAM,EAAE,IAAAZ,MAAO;AAEf,QAAI,KAAK,eAAe,EAAG;AAE3B,IAAAA,EAAG,gBAAgB,KAAK,GAAG;AAE3B,UAAMgE,IAASpD,EAAQ,WAAW;AAClC,IAAIoD,KAAU,MACZhE,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,wBAAwBgE,CAAM,GACjChE,EAAG,oBAAoBgE,GAAQ,GAAGhE,EAAG,OAAO,IAAO,GAAG,CAAC;AAGzD,UAAMiE,IAAWrD,EAAQ,WAAW;AACpC,IAAIqD,KAAY,MACdjE,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,wBAAwBiE,CAAQ,GACnCjE,EAAG,oBAAoBiE,GAAU,GAAGjE,EAAG,OAAO,IAAO,GAAG,CAAC,IAGvDY,EAAQ,SAAS,aACnBZ,EAAG,UAAUY,EAAQ,SAAS,WAAc,KAAK,WAAW,GAG9DZ,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GACvDA,EAAG,aAAaA,EAAG,WAAW,KAAK,YAAYA,EAAG,cAAc,CAAC,GAEjEA,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAEA,UAAgB;AACd,UAAM,EAAE,IAAAA,MAAO;AACf,IAAI,KAAK,OAAKA,EAAG,kBAAkB,KAAK,GAAG,GACvC,KAAK,kBAAgBA,EAAG,aAAa,KAAK,cAAc,GACxD,KAAK,eAAaA,EAAG,aAAa,KAAK,WAAW,GAClD,KAAK,eAAaA,EAAG,aAAa,KAAK,WAAW;AAAA,EACxD;AACF;AChJO,MAAMwa,GAAU;AAAA,EAUrB,YAAYxa,GAA4B;AAThC,IAAApE,EAAA;AACA,IAAAA,EAAA,aAAqC;AAErC,IAAAA,EAAA,wBAAqC;AACrC,IAAAA,EAAA,qBAAkC;AAClC,IAAAA,EAAA,qBAAkC;AAElC,IAAAA,EAAA,oBAAa;AAGnB,SAAK,KAAKoE,GACV,KAAK,YAAA;AAAA,EACP;AAAA,EAEQ,cAAoB;AAC1B,UAAM,EAAE,IAAAA,MAAO;AAEf,SAAK,MAAMA,EAAG,kBAAA,GACdA,EAAG,gBAAgB,KAAK,GAAG,GAE3B,KAAK,iBAAiBA,EAAG,aAAA,GACzB,KAAK,cAAcA,EAAG,aAAA,GACtB,KAAK,cAAcA,EAAG,aAAA,GAEtBA,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAEA,WAAWqF,GAA2B;AACpC,UAAM,EAAE,IAAArF,MAAO,MAETyK,IAAOpF,EAAK,QAAQ,QACpBqF,IAAOrF,EAAK,QAAQ,QACpBkT,IAAc9N,IAAOC;AAG3B,QAAI+P,IAASpV,EAAK,YAAY,OAC1BqV,IAASrV,EAAK,YAAY;AAE9B,QAAIoV,MAAW,SAAYC,MAAW;AACpC,eAAS3X,IAAI,GAAGA,IAAIsC,EAAK,OAAO,QAAQtC;AACtC,QAAIsC,EAAK,OAAOtC,CAAC,IAAI0X,MAAQA,IAASpV,EAAK,OAAOtC,CAAC,IAC/CsC,EAAK,OAAOtC,CAAC,IAAI2X,MAAQA,IAASrV,EAAK,OAAOtC,CAAC;AAGvD,UAAM0T,IAAQiE,IAASD,KAAU,GAE3BhY,IAAY,IAAI,aAAa8V,IAAc,CAAC,GAC5C7V,IAAS,IAAI,aAAa6V,IAAc,CAAC;AAE/C,aAAS5N,IAAM,GAAGA,IAAMD,GAAMC;AAC5B,eAASC,IAAM,GAAGA,IAAMH,GAAMG,KAAO;AACnC,cAAMqF,IAAMtF,IAAMF,IAAOG,GACnBwH,IAAKnC,IAAM;AAEjB,QAAAxN,EAAU2P,CAAE,IAAI/M,EAAK,QAAQuF,CAAG,GAChCnI,EAAU2P,IAAK,CAAC,IAAI,GACpB3P,EAAU2P,IAAK,CAAC,IAAI/M,EAAK,QAAQsF,CAAG;AAEpC,cAAMnH,KAAK6B,EAAK,OAAO4K,CAAG,IAAIwK,KAAUhE;AACxC,aAAK,cAAc/T,GAAQ0P,GAAI5O,GAAG6B,EAAK,QAAQ;AAAA,MACjD;AAIF,UAAMoJ,IAAoB,CAAA;AAC1B,aAAS9D,IAAM,GAAGA,IAAMD,IAAO,GAAGC;AAChC,eAASC,IAAM,GAAGA,IAAMH,IAAO,GAAGG,KAAO;AACvC,cAAMwI,IAAKzI,IAAMF,IAAOG,GAClByI,IAAKD,IAAK,GACVF,IAAKE,IAAK3I,GACV0I,IAAKD,IAAK;AAEhB,QAAAzE,EAAQ,KAAK2E,GAAIF,GAAIG,CAAE,GACvB5E,EAAQ,KAAK4E,GAAIH,GAAIC,CAAE;AAAA,MACzB;AAGF,SAAK,aAAa1E,EAAQ,QAE1BzO,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,WAAWA,EAAG,cAAcyC,GAAWzC,EAAG,YAAY,GAEzDA,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,WAAWA,EAAG,cAAc0C,GAAQ1C,EAAG,YAAY,GAEtDA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GACvDA,EAAG,WAAWA,EAAG,sBAAsB,IAAI,YAAYyO,CAAO,GAAGzO,EAAG,WAAW;AAAA,EACjF;AAAA,EAEQ,cAAc0C,GAAsB0P,GAAY5O,GAAWqW,GAAyB;AAG1F,YAFArW,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGA,CAAC,CAAC,GAEtBqW,GAAA;AAAA,MACN,KAAK;AACH,QAAIrW,IAAI,QACNd,EAAO0P,CAAE,IAAI,GAAG1P,EAAO0P,IAAK,CAAC,IAAI,IAAI5O,GAAGd,EAAO0P,IAAK,CAAC,IAAI,KAChD5O,IAAI,OACbd,EAAO0P,CAAE,IAAI,GAAG1P,EAAO0P,IAAK,CAAC,IAAI,GAAG1P,EAAO0P,IAAK,CAAC,IAAI,IAAI,KAAK5O,IAAI,SACzDA,IAAI,QACbd,EAAO0P,CAAE,IAAI,KAAK5O,IAAI,MAAMd,EAAO0P,IAAK,CAAC,IAAI,GAAG1P,EAAO0P,IAAK,CAAC,IAAI,MAEjE1P,EAAO0P,CAAE,IAAI,GAAG1P,EAAO0P,IAAK,CAAC,IAAI,IAAI,KAAK5O,IAAI,OAAOd,EAAO0P,IAAK,CAAC,IAAI;AAExE;AAAA,MACF,KAAK;AACH,QAAA1P,EAAO0P,CAAE,IAAI,KAAK,IAAI,GAAG5O,IAAI,CAAC,GAC9Bd,EAAO0P,IAAK,CAAC,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI5O,IAAI,QAAQ,CAAC,CAAC,GACxDd,EAAO0P,IAAK,CAAC,IAAI,KAAK,IAAI,IAAI5O,IAAI,QAAQ,CAAC;AAC3C;AAAA,MACF,KAAK;AACH,QAAAd,EAAO0P,CAAE,IAAI5O,GAAGd,EAAO0P,IAAK,CAAC,IAAI5O,GAAGd,EAAO0P,IAAK,CAAC,IAAI5O;AACrD;AAAA,MACF,KAAK;AAAA,MACL;AACE,QAAAd,EAAO0P,CAAE,IAAI,QAAQ5O,IAAI,QAAQA,IAAIA,IAAI,KACzCd,EAAO0P,IAAK,CAAC,IAAI,OAAQ5O,IAAI,OAC7Bd,EAAO0P,IAAK,CAAC,IAAI,QAAQ5O,IAAI,MAAMA,IAAIA,IAAI;AAC3C;AAAA,IAAA;AAAA,EAEN;AAAA,EAEA,OAAO5C,GAAgC;AACrC,UAAM,EAAE,IAAAZ,MAAO;AAEf,QAAI,KAAK,eAAe,EAAG;AAE3B,IAAAA,EAAG,gBAAgB,KAAK,GAAG;AAE3B,UAAMgE,IAASpD,EAAQ,WAAW;AAClC,IAAIoD,KAAU,MACZhE,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,wBAAwBgE,CAAM,GACjChE,EAAG,oBAAoBgE,GAAQ,GAAGhE,EAAG,OAAO,IAAO,GAAG,CAAC;AAGzD,UAAMiE,IAAWrD,EAAQ,WAAW;AACpC,IAAIqD,KAAY,MACdjE,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,wBAAwBiE,CAAQ,GACnCjE,EAAG,oBAAoBiE,GAAU,GAAGjE,EAAG,OAAO,IAAO,GAAG,CAAC,IAG3DA,EAAG,WAAWA,EAAG,sBAAsB,KAAK,WAAW,GACvDA,EAAG,aAAaA,EAAG,WAAW,KAAK,YAAYA,EAAG,cAAc,CAAC,GAEjEA,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAEA,UAAgB;AACd,UAAM,EAAE,IAAAA,MAAO;AACf,IAAI,KAAK,OAAKA,EAAG,kBAAkB,KAAK,GAAG,GACvC,KAAK,kBAAgBA,EAAG,aAAa,KAAK,cAAc,GACxD,KAAK,eAAaA,EAAG,aAAa,KAAK,WAAW,GAClD,KAAK,eAAaA,EAAG,aAAa,KAAK,WAAW;AAAA,EACxD;AACF;AC5JO,MAAM2a,GAAU;AAAA,EAUrB,YAAY3a,GAA4B;AAThC,IAAApE,EAAA;AACA,IAAAA,EAAA,aAAqC;AAErC,IAAAA,EAAA,wBAAqC;AACrC,IAAAA,EAAA,qBAAkC;AAElC,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,qBAAc;AAGpB,SAAK,KAAKoE,GACV,KAAK,YAAA;AAAA,EACP;AAAA,EAEQ,cAAoB;AAC1B,UAAM,EAAE,IAAAA,MAAO;AAEf,SAAK,MAAMA,EAAG,kBAAA,GACdA,EAAG,gBAAgB,KAAK,GAAG,GAE3B,KAAK,iBAAiBA,EAAG,aAAA,GACzB,KAAK,cAAcA,EAAG,aAAA,GAEtBA,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAEA,WAAWqF,GAA2B;AACpC,UAAM,EAAE,IAAArF,MAAO,MAET+N,IAAa1I,EAAK,UAAU,SAAS,GACrCiH,IAAQjH,EAAK,SAAS;AAC5B,SAAK,cAAcA,EAAK,eAAe,IAGvC,KAAK,cAAc0I,IAAa;AAEhC,UAAMtL,IAAY,IAAI,aAAa,KAAK,cAAc,CAAC,GACjDC,IAAS,IAAI,aAAa,KAAK,cAAc,CAAC;AAEpD,aAASK,IAAI,GAAGA,IAAIgL,GAAYhL,KAAK;AACnC,YAAMqP,IAAKrP,IAAI,GACTpJ,IAAI0L,EAAK,UAAU+M,CAAE,GACrBxY,IAAIyL,EAAK,UAAU+M,IAAK,CAAC,GACzBvY,IAAIwL,EAAK,UAAU+M,IAAK,CAAC,GAIzBmI,IADKxX,IAAI,IACE;AACjB,MAAAN,EAAU8X,CAAG,IAAI5gB,GACjB8I,EAAU8X,IAAM,CAAC,IAAIjO,GACrB7J,EAAU8X,IAAM,CAAC,IAAI1gB;AAIrB,YAAMygB,KADKvX,IAAI,IAAI,KACF;AAMjB,UALAN,EAAU6X,CAAG,IAAI3gB,GACjB8I,EAAU6X,IAAM,CAAC,IAAI1gB,GACrB6I,EAAU6X,IAAM,CAAC,IAAIzgB,GAGjBwL,EAAK;AACP,QAAA3C,EAAO6X,CAAG,IAAIlV,EAAK,OAAO+M,CAAE,IAAI,KAChC1P,EAAO6X,IAAM,CAAC,IAAIlV,EAAK,OAAO+M,IAAK,CAAC,IAAI,KACxC1P,EAAO6X,IAAM,CAAC,IAAIlV,EAAK,OAAO+M,IAAK,CAAC,IAAI,KACxC1P,EAAO4X,CAAG,IAAIjV,EAAK,OAAO+M,CAAE,GAC5B1P,EAAO4X,IAAM,CAAC,IAAIjV,EAAK,OAAO+M,IAAK,CAAC,GACpC1P,EAAO4X,IAAM,CAAC,IAAIjV,EAAK,OAAO+M,IAAK,CAAC;AAAA,WAC/B;AACL,cAAM5O,IAAIT,KAAKgL,IAAa,KAAK;AACjC,QAAArL,EAAO6X,CAAG,IAAI,KAAK7X,EAAO6X,IAAM,CAAC,IAAI,KAAK7X,EAAO6X,IAAM,CAAC,IAAI,KAC5D7X,EAAO4X,CAAG,IAAI,MAAM9W,IAAI,KACxBd,EAAO4X,IAAM,CAAC,IAAI,MAAM9W,IAAI,KAC5Bd,EAAO4X,IAAM,CAAC,IAAI;AAAA,MACpB;AAAA,IACF;AAEA,IAAAta,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,WAAWA,EAAG,cAAcyC,GAAWzC,EAAG,YAAY,GAEzDA,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,WAAWA,EAAG,cAAc0C,GAAQ1C,EAAG,YAAY;AAAA,EACxD;AAAA,EAEA,OAAOY,GAAgC;AACrC,UAAM,EAAE,IAAAZ,MAAO;AAEf,QAAI,KAAK,gBAAgB,EAAG;AAE5B,IAAAA,EAAG,gBAAgB,KAAK,GAAG;AAE3B,UAAMgE,IAASpD,EAAQ,WAAW;AAClC,IAAIoD,KAAU,MACZhE,EAAG,WAAWA,EAAG,cAAc,KAAK,cAAc,GAClDA,EAAG,wBAAwBgE,CAAM,GACjChE,EAAG,oBAAoBgE,GAAQ,GAAGhE,EAAG,OAAO,IAAO,GAAG,CAAC;AAGzD,UAAMiE,IAAWrD,EAAQ,WAAW;AAWpC,QAVIqD,KAAY,MACdjE,EAAG,WAAWA,EAAG,cAAc,KAAK,WAAW,GAC/CA,EAAG,wBAAwBiE,CAAQ,GACnCjE,EAAG,oBAAoBiE,GAAU,GAAGjE,EAAG,OAAO,IAAO,GAAG,CAAC,IAI3DA,EAAG,WAAWA,EAAG,OAAO,GAAG,KAAK,WAAW,GAGvC,KAAK,aAAa;AACpB,MAAIY,EAAQ,SAAS,eACnBZ,EAAG,UAAUY,EAAQ,SAAS,aAAgB,CAAC;AAGjD,eAASmC,IAAI,GAAGA,IAAI,KAAK,aAAaA,KAAK;AACzC,QAAA/C,EAAG,WAAWA,EAAG,QAAQ+C,GAAG,CAAC;AAAA,IAEjC;AAEA,IAAA/C,EAAG,gBAAgB,IAAI;AAAA,EACzB;AAAA,EAEA,UAAgB;AACd,UAAM,EAAE,IAAAA,MAAO;AACf,IAAI,KAAK,OAAKA,EAAG,kBAAkB,KAAK,GAAG,GACvC,KAAK,kBAAgBA,EAAG,aAAa,KAAK,cAAc,GACxD,KAAK,eAAaA,EAAG,aAAa,KAAK,WAAW;AAAA,EACxD;AACF;AC7EA,MAAM4a,KAA6B;AAAA,EAC/B,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,UAAU,CAAC,iBAAiB,IAAI;AAAA,EAChC,MAAM,CAAC,MAAM,SAAS,WAAW,MAAM;AAC3C;AAOO,SAASC,GAASC,IAAyB,IAAiC;AAC/E,SAAO;AAAA,IACH,UAAUF;AAAA,IAEV,OAAOG,GAAoB;AAEvB,MAAAA,EAAI,QAAQ,IAAI,UAAUD,CAAM;AAAA,IACpC;AAAA,IAEA,eAAeE,GAAqBC,GAA4B;AAAA,IAChE;AAAA,IAEA,UAAUD,GAAqB;AAAA,IAC/B;AAAA,EAAA;AAER;"}