numbl 0.1.6 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/binding.gyp +53 -2
  2. package/dist-cli/cli.js +38743 -24679
  3. package/dist-lib/lib.js +43424 -30466
  4. package/dist-lib/numbl-core/executeCode.d.ts +22 -0
  5. package/dist-lib/numbl-core/helpers/bessel.d.ts +9 -0
  6. package/dist-lib/numbl-core/helpers/reduction-helpers.d.ts +7 -2
  7. package/dist-lib/numbl-core/interpreter/builtins/datetime.d.ts +39 -0
  8. package/dist-lib/numbl-core/interpreter/builtins/index.d.ts +1 -0
  9. package/dist-lib/numbl-core/interpreter/builtins/time-system.d.ts +1 -0
  10. package/dist-lib/numbl-core/interpreter/builtins/types.d.ts +100 -5
  11. package/dist-lib/numbl-core/interpreter/interpreter.d.ts +41 -3
  12. package/dist-lib/numbl-core/interpreter/interpreterSpecialBuiltins.d.ts +2 -0
  13. package/dist-lib/numbl-core/interpreter/types.d.ts +16 -7
  14. package/dist-lib/numbl-core/jit/c/abi.d.ts +90 -0
  15. package/dist-lib/numbl-core/jit/c/assemble.d.ts +56 -0
  16. package/dist-lib/numbl-core/jit/c/classify.d.ts +70 -0
  17. package/dist-lib/numbl-core/jit/c/compile.d.ts +37 -0
  18. package/dist-lib/numbl-core/jit/c/context.d.ts +152 -0
  19. package/dist-lib/numbl-core/jit/c/emit/assign.d.ts +20 -0
  20. package/dist-lib/numbl-core/jit/c/emit/complexScalar.d.ts +18 -0
  21. package/dist-lib/numbl-core/jit/c/emit/fused.d.ts +42 -0
  22. package/dist-lib/numbl-core/jit/c/emit/helpers.d.ts +40 -0
  23. package/dist-lib/numbl-core/jit/c/emit/index.d.ts +14 -0
  24. package/dist-lib/numbl-core/jit/c/emit/scalar.d.ts +23 -0
  25. package/dist-lib/numbl-core/jit/c/emit/stmt.d.ts +25 -0
  26. package/dist-lib/numbl-core/jit/c/emit/tensor.d.ts +127 -0
  27. package/dist-lib/numbl-core/jit/c/emit/userCall.d.ts +58 -0
  28. package/dist-lib/numbl-core/jit/c/epilogue.d.ts +26 -0
  29. package/dist-lib/numbl-core/jit/c/feasibility.d.ts +44 -0
  30. package/dist-lib/numbl-core/jit/c/hybrid.d.ts +42 -0
  31. package/dist-lib/numbl-core/jit/c/install.d.ts +15 -0
  32. package/dist-lib/numbl-core/jit/c/parityError.d.ts +26 -0
  33. package/dist-lib/numbl-core/jit/c/prelude.d.ts +37 -0
  34. package/dist-lib/numbl-core/jit/c/registry.d.ts +51 -0
  35. package/dist-lib/numbl-core/jit/c/visit.d.ts +63 -0
  36. package/dist-lib/numbl-core/jit/e1/install.d.ts +13 -0
  37. package/dist-lib/numbl-core/jit/e1/kernelEmit.d.ts +54 -0
  38. package/dist-lib/numbl-core/jit/e1/openmpFlag.d.ts +13 -0
  39. package/dist-lib/numbl-core/jit/e1/scalarFnKernel.d.ts +44 -0
  40. package/dist-lib/numbl-core/jit/fusedChainHelpers.d.ts +65 -0
  41. package/dist-lib/numbl-core/jit/fusedScalarEmit.d.ts +61 -0
  42. package/dist-lib/numbl-core/jit/fusion.d.ts +71 -0
  43. package/dist-lib/numbl-core/jit/fusionOps.d.ts +25 -0
  44. package/dist-lib/numbl-core/{interpreter/jit → jit}/index.d.ts +2 -2
  45. package/dist-lib/numbl-core/jit/jitBailSafety.d.ts +41 -0
  46. package/dist-lib/numbl-core/{interpreter/jit → jit}/jitLoop.d.ts +2 -2
  47. package/dist-lib/numbl-core/{interpreter/jit → jit}/jitLoopAnalysis.d.ts +13 -1
  48. package/dist-lib/numbl-core/jit/jitLower.d.ts +122 -0
  49. package/dist-lib/numbl-core/jit/jitLowerExpr.d.ts +27 -0
  50. package/dist-lib/numbl-core/jit/jitLowerStmt.d.ts +9 -0
  51. package/dist-lib/numbl-core/jit/jitLowerTypes.d.ts +29 -0
  52. package/dist-lib/numbl-core/jit/jitTopLevel.d.ts +22 -0
  53. package/dist-lib/numbl-core/jit/jitTypes.d.ts +394 -0
  54. package/dist-lib/numbl-core/jit/js/jitCodegen.d.ts +7 -0
  55. package/dist-lib/numbl-core/jit/js/jitCodegenHoist.d.ts +70 -0
  56. package/dist-lib/numbl-core/jit/js/jitHelpers.d.ts +34 -0
  57. package/dist-lib/numbl-core/jit/js/jitHelpersComplex.d.ts +21 -0
  58. package/dist-lib/numbl-core/jit/js/jitHelpersIndex.d.ts +33 -0
  59. package/dist-lib/numbl-core/jit/js/jitHelpersTensor.d.ts +34 -0
  60. package/dist-lib/numbl-core/jit/js/jsFusedCodegen.d.ts +17 -0
  61. package/dist-lib/numbl-core/jit/scalarEmit.d.ts +58 -0
  62. package/dist-lib/numbl-core/lexer/types.d.ts +2 -1
  63. package/dist-lib/numbl-core/native/lapack-bridge.d.ts +46 -1
  64. package/dist-lib/numbl-core/ops/bessel.d.ts +18 -0
  65. package/dist-lib/numbl-core/ops/comparison.d.ts +11 -0
  66. package/dist-lib/numbl-core/ops/complexBinaryElemwise.d.ts +10 -0
  67. package/dist-lib/numbl-core/ops/complexUnaryElemwise.d.ts +8 -0
  68. package/dist-lib/numbl-core/ops/dispatch.d.ts +26 -0
  69. package/dist-lib/numbl-core/ops/index.d.ts +8 -0
  70. package/dist-lib/numbl-core/ops/opCodes.d.ts +70 -0
  71. package/dist-lib/numbl-core/ops/realBinaryElemwise.d.ts +8 -0
  72. package/dist-lib/numbl-core/ops/realUnaryElemwise.d.ts +5 -0
  73. package/dist-lib/numbl-core/ops/reduce.d.ts +6 -0
  74. package/dist-lib/numbl-core/parser/types.d.ts +6 -0
  75. package/dist-lib/numbl-core/runtime/alloc.d.ts +23 -0
  76. package/dist-lib/numbl-core/runtime/constructors.d.ts +2 -1
  77. package/dist-lib/numbl-core/runtime/error.d.ts +3 -0
  78. package/dist-lib/numbl-core/runtime/index.d.ts +1 -1
  79. package/dist-lib/numbl-core/runtime/runtime.d.ts +15 -2
  80. package/dist-lib/numbl-core/runtime/runtimePlot.d.ts +11 -0
  81. package/dist-lib/numbl-core/runtime/types.d.ts +16 -1
  82. package/dist-lib/numbl-core/runtime/utils.d.ts +3 -1
  83. package/dist-lib/numbl-core/version.d.ts +1 -1
  84. package/dist-plot-viewer/assets/{index-vtrJ8bml.js → index-GiUNnMQg.js} +1 -1
  85. package/dist-plot-viewer/index.html +1 -1
  86. package/native/elemwise.cpp +134 -0
  87. package/native/jit_runtime/jit_runtime.c +261 -0
  88. package/native/jit_runtime/jit_runtime.h +204 -0
  89. package/native/numbl_addon.cpp +55 -1
  90. package/native/numbl_addon_common.h +1 -0
  91. package/native/ops/bessel.c +572 -0
  92. package/native/ops/comparison.c +150 -0
  93. package/native/ops/complex_binary_elemwise.c +192 -0
  94. package/native/ops/complex_unary_elemwise.c +152 -0
  95. package/native/ops/numbl_ops.c +66 -0
  96. package/native/ops/numbl_ops.h +262 -0
  97. package/native/ops/real_binary_elemwise.c +85 -0
  98. package/native/ops/real_unary_elemwise.c +104 -0
  99. package/native/ops/reduce.c +162 -0
  100. package/native/ops_napi.cpp +320 -0
  101. package/package.json +11 -10
  102. package/dist-lib/numbl-core/interpreter/jit/jitCodegen.d.ts +0 -5
  103. package/dist-lib/numbl-core/interpreter/jit/jitHelpers.d.ts +0 -14
  104. package/dist-lib/numbl-core/interpreter/jit/jitLower.d.ts +0 -20
  105. package/dist-lib/numbl-core/interpreter/jit/jitTypes.d.ts +0 -168
@@ -1,7 +1,7 @@
1
1
  export declare const USE_FLOAT32: boolean;
2
2
  export declare const FloatXArray: Float32ArrayConstructor | Float64ArrayConstructor;
3
3
  export type FloatXArrayType = Float32Array | Float64Array;
4
- export type RuntimeValue = number | boolean | string | RuntimeTensor | RuntimeChar | RuntimeCell | RuntimeStruct | RuntimeFunction | RuntimeClassInstance | RuntimeComplexNumber | RuntimeDummyHandle | RuntimeStructArray | RuntimeSparseMatrix | RuntimeDictionary;
4
+ export type RuntimeValue = number | boolean | string | RuntimeTensor | RuntimeChar | RuntimeCell | RuntimeStruct | RuntimeFunction | RuntimeClassInstance | RuntimeComplexNumber | RuntimeDummyHandle | RuntimeGraphicsHandle | RuntimeStructArray | RuntimeClassInstanceArray | RuntimeSparseMatrix | RuntimeDictionary;
5
5
  export type RuntimeNumber = number;
6
6
  export type RuntimeLogical = boolean;
7
7
  export type RuntimeString = string;
@@ -16,7 +16,9 @@ export declare const isRuntimeFunction: (value: RuntimeValue) => value is Runtim
16
16
  export declare const isRuntimeClassInstance: (value: RuntimeValue) => value is RuntimeClassInstance;
17
17
  export declare const isRuntimeComplexNumber: (value: RuntimeValue) => value is RuntimeComplexNumber;
18
18
  export declare const isRuntimeDummyHandle: (value: RuntimeValue) => value is RuntimeDummyHandle;
19
+ export declare const isRuntimeGraphicsHandle: (value: RuntimeValue) => value is RuntimeGraphicsHandle;
19
20
  export declare const isRuntimeStructArray: (value: RuntimeValue) => value is RuntimeStructArray;
21
+ export declare const isRuntimeClassInstanceArray: (value: RuntimeValue) => value is RuntimeClassInstanceArray;
20
22
  export declare const isRuntimeSparseMatrix: (value: RuntimeValue) => value is RuntimeSparseMatrix;
21
23
  export declare const isRuntimeDictionary: (value: RuntimeValue) => value is RuntimeDictionary;
22
24
  export declare const kstr: (value: RuntimeValue) => string;
@@ -72,6 +74,13 @@ export type RuntimeClassInstance = {
72
74
  * stores the underlying built-in data. */
73
75
  _builtinData?: RuntimeValue;
74
76
  };
77
+ /** A 1-D array of class instances that all share the same class.
78
+ * Created by default horzcat/vertcat when the class doesn't overload them. */
79
+ export type RuntimeClassInstanceArray = {
80
+ kind: "class_instance_array";
81
+ className: string;
82
+ elements: RuntimeClassInstance[];
83
+ };
75
84
  export type RuntimeComplexNumber = {
76
85
  kind: "complex_number";
77
86
  re: number;
@@ -80,6 +89,12 @@ export type RuntimeComplexNumber = {
80
89
  export type RuntimeDummyHandle = {
81
90
  kind: "dummy_handle";
82
91
  };
92
+ /** Handle to a graphics object (e.g. surface returned by pcolor) with a mutable trace reference. */
93
+ export type RuntimeGraphicsHandle = {
94
+ kind: "graphics_handle";
95
+ _trace: Record<string, unknown>;
96
+ _traceType: string;
97
+ };
83
98
  /** A 1-D array of structs that all share the same field names. **/
84
99
  export type RuntimeStructArray = {
85
100
  kind: "struct_array";
@@ -2,7 +2,9 @@
2
2
  * Tensor shape/indexing utilities and copy-on-write helpers.
3
3
  */
4
4
  import { type RuntimeValue, type RuntimeTensor } from "./types.js";
5
- /** Get 2D size (rows, cols) from shape, padding with 1s as needed */
5
+ /** Get 2D size (rows, cols) from shape, padding with 1s as needed.
6
+ * For N-D tensors (N>2), trailing dimensions are collapsed into cols,
7
+ * matching MATLAB's behavior when fewer subscripts than dimensions. */
6
8
  export declare function tensorSize2D(t: RuntimeTensor): [number, number];
7
9
  /** Compute total number of elements from shape */
8
10
  export declare function numel(shape: number[]): number;
@@ -1,2 +1,2 @@
1
1
  /** Numbl version, used for JIT disk cache invalidation. */
2
- export declare const NUMBL_VERSION = "0.1.6";
2
+ export declare const NUMBL_VERSION = "0.2.0";
@@ -4423,4 +4423,4 @@ void main() {
4423
4423
  #include <premultiplied_alpha_fragment>
4424
4424
 
4425
4425
  }
4426
- `};class Qp extends qi{constructor(t){super({type:"LineMaterial",uniforms:Zp.clone(ai.line.uniforms),vertexShader:ai.line.vertexShader,fragmentShader:ai.line.fragmentShader,clipping:!0}),this.isLineMaterial=!0,this.setValues(t)}get color(){return this.uniforms.diffuse.value}set color(t){this.uniforms.diffuse.value=t}get worldUnits(){return"WORLD_UNITS"in this.defines}set worldUnits(t){t===!0!==this.worldUnits&&(this.needsUpdate=!0),t===!0?this.defines.WORLD_UNITS="":delete this.defines.WORLD_UNITS}get linewidth(){return this.uniforms.linewidth.value}set linewidth(t){this.uniforms.linewidth&&(this.uniforms.linewidth.value=t)}get dashed(){return"USE_DASH"in this.defines}set dashed(t){t===!0!==this.dashed&&(this.needsUpdate=!0),t===!0?this.defines.USE_DASH="":delete this.defines.USE_DASH}get dashScale(){return this.uniforms.dashScale.value}set dashScale(t){this.uniforms.dashScale.value=t}get dashSize(){return this.uniforms.dashSize.value}set dashSize(t){this.uniforms.dashSize.value=t}get dashOffset(){return this.uniforms.dashOffset.value}set dashOffset(t){this.uniforms.dashOffset.value=t}get gapSize(){return this.uniforms.gapSize.value}set gapSize(t){this.uniforms.gapSize.value=t}get opacity(){return this.uniforms.opacity.value}set opacity(t){this.uniforms&&(this.uniforms.opacity.value=t)}get resolution(){return this.uniforms.resolution.value}set resolution(t){this.uniforms.resolution.value.copy(t)}get alphaToCoverage(){return"USE_ALPHA_TO_COVERAGE"in this.defines}set alphaToCoverage(t){this.defines&&(t===!0!==this.alphaToCoverage&&(this.needsUpdate=!0),t===!0?this.defines.USE_ALPHA_TO_COVERAGE="":delete this.defines.USE_ALPHA_TO_COVERAGE)}}const Od=new je,Yv=new J,jv=new J,Cn=new je,wn=new je,ta=new je,Pd=new J,zd=new tn,Un=new Zb,Zv=new J,mu=new Ts,gu=new po,ea=new je;let na,er;function Kv(r,t,i){return ea.set(0,0,-t,1).applyMatrix4(r.projectionMatrix),ea.multiplyScalar(1/ea.w),ea.x=er/i.width,ea.y=er/i.height,ea.applyMatrix4(r.projectionMatrixInverse),ea.multiplyScalar(1/ea.w),Math.abs(Math.max(ea.x,ea.y))}function sR(r,t){const i=r.matrixWorld,s=r.geometry,l=s.attributes.instanceStart,c=s.attributes.instanceEnd,f=Math.min(s.instanceCount,l.count);for(let d=0,m=f;d<m;d++){Un.start.fromBufferAttribute(l,d),Un.end.fromBufferAttribute(c,d),Un.applyMatrix4(i);const p=new J,v=new J;na.distanceSqToSegment(Un.start,Un.end,v,p),v.distanceTo(p)<er*.5&&t.push({point:v,pointOnLine:p,distance:na.origin.distanceTo(v),object:r,face:null,faceIndex:d,uv:null,uv1:null})}}function rR(r,t,i){const s=t.projectionMatrix,c=r.material.resolution,f=r.matrixWorld,d=r.geometry,m=d.attributes.instanceStart,p=d.attributes.instanceEnd,v=Math.min(d.instanceCount,m.count),_=-t.near;na.at(1,ta),ta.w=1,ta.applyMatrix4(t.matrixWorldInverse),ta.applyMatrix4(s),ta.multiplyScalar(1/ta.w),ta.x*=c.x/2,ta.y*=c.y/2,ta.z=0,Pd.copy(ta),zd.multiplyMatrices(t.matrixWorldInverse,f);for(let g=0,M=v;g<M;g++){if(Cn.fromBufferAttribute(m,g),wn.fromBufferAttribute(p,g),Cn.w=1,wn.w=1,Cn.applyMatrix4(zd),wn.applyMatrix4(zd),Cn.z>_&&wn.z>_)continue;if(Cn.z>_){const U=Cn.z-wn.z,D=(Cn.z-_)/U;Cn.lerp(wn,D)}else if(wn.z>_){const U=wn.z-Cn.z,D=(wn.z-_)/U;wn.lerp(Cn,D)}Cn.applyMatrix4(s),wn.applyMatrix4(s),Cn.multiplyScalar(1/Cn.w),wn.multiplyScalar(1/wn.w),Cn.x*=c.x/2,Cn.y*=c.y/2,wn.x*=c.x/2,wn.y*=c.y/2,Un.start.copy(Cn),Un.start.z=0,Un.end.copy(wn),Un.end.z=0;const A=Un.closestPointToPointParameter(Pd,!0);Un.at(A,Zv);const S=bx.lerp(Cn.z,wn.z,A),x=S>=-1&&S<=1,R=Pd.distanceTo(Zv)<er*.5;if(x&&R){Un.start.fromBufferAttribute(m,g),Un.end.fromBufferAttribute(p,g),Un.start.applyMatrix4(f),Un.end.applyMatrix4(f);const U=new J,D=new J;na.distanceSqToSegment(Un.start,Un.end,D,U),i.push({point:D,pointOnLine:U,distance:na.origin.distanceTo(D),object:r,face:null,faceIndex:g,uv:null,uv1:null})}}}class oR extends jn{constructor(t=new Gx,i=new Qp({color:Math.random()*16777215})){super(t,i),this.isLineSegments2=!0,this.type="LineSegments2"}computeLineDistances(){const t=this.geometry,i=t.attributes.instanceStart,s=t.attributes.instanceEnd,l=new Float32Array(2*i.count);for(let f=0,d=0,m=i.count;f<m;f++,d+=2)Yv.fromBufferAttribute(i,f),jv.fromBufferAttribute(s,f),l[d]=d===0?0:l[d-1],l[d+1]=l[d]+Yv.distanceTo(jv);const c=new Rp(l,2,1);return t.setAttribute("instanceDistanceStart",new Ss(c,1,0)),t.setAttribute("instanceDistanceEnd",new Ss(c,1,1)),this}raycast(t,i){const s=this.material.worldUnits,l=t.camera;l===null&&!s&&console.error('LineSegments2: "Raycaster.camera" needs to be set in order to raycast against LineSegments2 while worldUnits is set to false.');const c=t.params.Line2!==void 0&&t.params.Line2.threshold||0;na=t.ray;const f=this.matrixWorld,d=this.geometry,m=this.material;er=m.linewidth+c,d.boundingSphere===null&&d.computeBoundingSphere(),gu.copy(d.boundingSphere).applyMatrix4(f);let p;if(s)p=er*.5;else{const _=Math.max(l.near,gu.distanceToPoint(na.origin));p=Kv(l,_,m.resolution)}if(gu.radius+=p,na.intersectsSphere(gu)===!1)return;d.boundingBox===null&&d.computeBoundingBox(),mu.copy(d.boundingBox).applyMatrix4(f);let v;if(s)v=er*.5;else{const _=Math.max(l.near,mu.distanceToPoint(na.origin));v=Kv(l,_,m.resolution)}mu.expandByScalar(v),na.intersectsBox(mu)!==!1&&(s?sR(this,i):rR(this,l,i))}onBeforeRender(t){const i=this.material.uniforms;i&&i.resolution&&(t.getViewport(Od),this.material.uniforms.resolution.value.set(Od.z,Od.w))}}class Vx extends Gx{constructor(){super(),this.isLineGeometry=!0,this.type="LineGeometry"}setPositions(t){const i=t.length-3,s=new Float32Array(2*i);for(let l=0;l<i;l+=3)s[2*l]=t[l],s[2*l+1]=t[l+1],s[2*l+2]=t[l+2],s[2*l+3]=t[l+3],s[2*l+4]=t[l+4],s[2*l+5]=t[l+5];return super.setPositions(s),this}setColors(t){const i=t.length-3,s=new Float32Array(2*i);for(let l=0;l<i;l+=3)s[2*l]=t[l],s[2*l+1]=t[l+1],s[2*l+2]=t[l+2],s[2*l+3]=t[l+3],s[2*l+4]=t[l+4],s[2*l+5]=t[l+5];return super.setColors(s),this}setFromPoints(t){const i=t.length-1,s=new Float32Array(6*i);for(let l=0;l<i;l++)s[6*l]=t[l].x,s[6*l+1]=t[l].y,s[6*l+2]=t[l].z||0,s[6*l+3]=t[l+1].x,s[6*l+4]=t[l+1].y,s[6*l+5]=t[l+1].z||0;return super.setPositions(s),this}fromLine(t){const i=t.geometry;return this.setPositions(i.attributes.position.array),this}}class lR extends oR{constructor(t=new Vx,i=new Qp({color:Math.random()*16777215})){super(t,i),this.isLine2=!0,this.type="Line2"}}const Gi=[[.2422,.1504,.6603],[.281,.3228,.9579],[.1786,.5289,.9682],[.0689,.6948,.8394],[.128,.789,.5927],[.3391,.849,.3798],[.633,.8518,.2091],[.8902,.8044,.1137],[.9905,.6816,.0235],[.9763,.517,.034]];function Cu(r){const t=Number.isFinite(r)?r:0,s=Math.max(0,Math.min(1,t))*(Gi.length-1),l=Math.floor(s),c=Math.min(l+1,Gi.length-1),f=s-l;return[Gi[l][0]+f*(Gi[c][0]-Gi[l][0]),Gi[l][1]+f*(Gi[c][1]-Gi[l][1]),Gi[l][2]+f*(Gi[c][2]-Gi[l][2])]}const Qv=[[0,.447,.741],[.85,.325,.098],[.929,.694,.125],[.494,.184,.556],[.466,.674,.188],[.301,.745,.933],[.635,.078,.184]];function cR({surfTraces:r,plot3Traces:t=[],bar3Traces:i=[],bar3hTraces:s=[],shading:l,colorbar:c,colorbarLocation:f,colormap:d}){const m=Fn.useRef(null),p=Fn.useRef(null);Fn.useEffect(()=>{const M=m.current;if(!M)return;const b=new X2({antialias:!0});b.setPixelRatio(window.devicePixelRatio),b.setClearColor(16777215),M.appendChild(b.domElement);const A=new Sb,S=new Bu(-1,1,1,-1,.01,100);S.position.set(1.2,.8,1.2),S.lookAt(0,0,0);const x=new q2(S,b.domElement);x.enablePan=!1,x.enableZoom=!0,A.add(new kb(16777215,.6));const R=new Vb(16777215,.6);R.position.set(2,3,2),A.add(R);const U=requestAnimationFrame(function G(){x.update(),b.render(A,S),p.current.animId=requestAnimationFrame(G)});p.current={renderer:b,scene:A,camera:S,controls:x,animId:U};const D=new ResizeObserver(()=>{const G=M.getBoundingClientRect();if(G.width===0||G.height===0)return;b.setSize(G.width,G.height);const B=G.width/G.height,F=1.2;S.left=-F*B,S.right=F*B,S.top=F,S.bottom=-F,S.updateProjectionMatrix()});return D.observe(M),()=>{D.disconnect(),cancelAnimationFrame(p.current?.animId??U),x.dispose(),b.dispose(),M.removeChild(b.domElement),p.current=null}},[]),Fn.useEffect(()=>{const M=p.current;if(!M)return;const{scene:b}=M,A=[];b.traverse(vt=>{(vt instanceof jn||vt instanceof iu||vt instanceof zu)&&A.push(vt)});for(const vt of A)b.remove(vt),vt.geometry&&vt.geometry.dispose();if(r.length===0&&t.length===0&&i.length===0&&s.length===0)return;let S=1/0,x=-1/0,R=1/0,U=-1/0,D=1/0,G=-1/0;const B=(vt,j,ft)=>{for(const yt of vt)isFinite(yt)&&(yt<j.v&&(j.v=yt),yt>ft.v&&(ft.v=yt))},F={v:S},T={v:x},O={v:R},z={v:U},V={v:D},K={v:G};for(const vt of r)B(vt.x,F,T),B(vt.y,O,z),B(vt.z,V,K);for(const vt of t)B(vt.x,F,T),B(vt.y,O,z),B(vt.z,V,K);for(const vt of i)B(vt.x,F,T),B(vt.y,O,z),B(vt.z,V,K),0<V.v&&(V.v=0);for(const vt of s)B(vt.y,O,z),B(vt.z,V,K),B(vt.x,F,T),0<F.v&&(F.v=0);if(S=F.v,x=T.v,R=O.v,U=z.v,D=V.v,G=K.v,!isFinite(S))return;x===S&&(S-=1,x+=1),U===R&&(R-=1,U+=1),G===D&&(D-=1,G+=1);const tt=x-S||1,ct=U-R||1,q=G-D||1,I=Math.max(tt,ct,q),H=(S+x)/2,st=(R+U)/2,ht=(D+G)/2,Ct=r.length===0&&t.length===0&&(i.length>0||s.length>0),P=Ct?Math.max(tt,ct):I,k=(vt,j)=>(vt-j)/P,et=(vt,j)=>(vt-j)/(Ct?Math.max(P,q):I),pt=(vt,j)=>(vt-j)/I;for(const vt of r){const{rows:j,cols:ft,x:yt,y:Pt,z:Ht}=vt,Ft=G-D||1,ce=vt.faceAlpha??1,It=new Float32Array(j*ft*3),Nt=new Float32Array(j*ft*3);for(let bt=0;bt<ft;bt++)for(let xt=0;xt<j;xt++){const N=bt*j+xt,E=xt*ft+bt,X=pt(yt[N],H),it=pt(Pt[N],st),dt=pt(Ht[N],ht);It[E*3]=X,It[E*3+1]=dt,It[E*3+2]=it;const nt=vt.c?(vt.c[N]-D)/Ft:(Ht[N]-D)/Ft,[kt,Lt,ee]=Cu(nt);Nt[E*3]=kt,Nt[E*3+1]=Lt,Nt[E*3+2]=ee}const le=[];for(let bt=0;bt<j-1;bt++)for(let xt=0;xt<ft-1;xt++){const N=bt*ft+xt,E=bt*ft+(xt+1),X=(bt+1)*ft+xt,it=(bt+1)*ft+(xt+1);le.push(N,X,E),le.push(E,X,it)}const ie=new bn;ie.setAttribute("position",new xi(It,3)),ie.setAttribute("color",new xi(Nt,3)),ie.setIndex(le),ie.computeVertexNormals();const mt=l??"faceted",C=mt==="faceted"||mt==="flat";if(vt.faceColor!=="none"){let bt;if(Array.isArray(vt.faceColor)){const[xt,N,E]=vt.faceColor;bt=new ou({color:new Ee(xt,N,E),flatShading:C,opacity:ce,transparent:ce<1,side:ki})}else bt=new ou({vertexColors:!0,flatShading:C,opacity:ce,transparent:ce<1,side:ki});b.add(new jn(ie,bt))}if(vt.edgeColor!=="none"&&mt==="faceted"){const bt=[],xt=[];for(let X=0;X<j;X++)for(let it=0;it<ft;it++){const dt=X*ft+it;if(it<ft-1){const nt=X*ft+(it+1);bt.push(It[dt*3],It[dt*3+1],It[dt*3+2],It[nt*3],It[nt*3+1],It[nt*3+2]),xt.push(Nt[dt*3],Nt[dt*3+1],Nt[dt*3+2],Nt[nt*3],Nt[nt*3+1],Nt[nt*3+2])}if(X<j-1){const nt=(X+1)*ft+it;bt.push(It[dt*3],It[dt*3+1],It[dt*3+2],It[nt*3],It[nt*3+1],It[nt*3+2]),xt.push(Nt[dt*3],Nt[dt*3+1],Nt[dt*3+2],Nt[nt*3],Nt[nt*3+1],Nt[nt*3+2])}}const N=new bn;N.setAttribute("position",new vn(bt,3));let E;if(Array.isArray(vt.edgeColor)){const[X,it,dt]=vt.edgeColor;E=new tr({color:new Ee(X,it,dt)})}else E=new tr({color:0,opacity:.3,transparent:!0});b.add(new iu(N,E))}}for(let vt=0;vt<t.length;vt++){const j=t[vt],{x:ft,y:yt,z:Pt}=j,Ht=Qv[vt%Qv.length],Ft=j.color??Ht,ce=new Ee(Ft[0],Ft[1],Ft[2]);if(j.lineStyle!=="none"){const Nt=[];let le=[];for(let C=0;C<ft.length;C++)if(isFinite(ft[C])&&isFinite(yt[C])&&isFinite(Pt[C])){const Mt=pt(ft[C],H),Tt=pt(yt[C],st),bt=pt(Pt[C],ht);le.push(new J(Mt,bt,Tt))}else le.length>0&&(Nt.push(le),le=[]);le.length>0&&Nt.push(le);const ie=j.lineWidth??2,mt=j.lineStyle==="--"||j.lineStyle===":"||j.lineStyle==="-.";for(const C of Nt){if(C.length<2)continue;const Mt=[];for(const Tt of C)Mt.push(Tt.x,Tt.y,Tt.z);if(mt){const Tt=new Bb({color:ce,linewidth:ie,dashSize:j.lineStyle===":"?.01:.03,gapSize:j.lineStyle===":"?.02:.015}),bt=new bn().setFromPoints(C),xt=new zu(bt,Tt);xt.computeLineDistances(),b.add(xt)}else{const Tt=new Vx;Tt.setPositions(Mt);const bt=new Qp({color:ce.getHex(),linewidth:ie,worldUnits:!1,resolution:new ge(M.renderer.domElement.width||800,M.renderer.domElement.height||600)});b.add(new lR(Tt,bt))}}}if(j.marker&&j.marker!=="none"){const Nt=(j.markerSize??6)/600,le=j.markerEdgeColor?new Ee(j.markerEdgeColor[0],j.markerEdgeColor[1],j.markerEdgeColor[2]):ce,ie=j.markerIndices?j.markerIndices.map(Mt=>Mt-1):Array.from({length:ft.length},(Mt,Tt)=>Tt),mt=new jp(Nt,8,8),C=new qp({color:le});for(const Mt of ie){if(Mt<0||Mt>=ft.length||!isFinite(ft[Mt])||!isFinite(yt[Mt])||!isFinite(Pt[Mt]))continue;const Tt=pt(ft[Mt],H),bt=pt(yt[Mt],st),xt=pt(Pt[Mt],ht),N=new jn(mt,C);N.position.set(Tt,xt,bt),b.add(N)}}}for(const vt of i){const j=vt.width/2*.9,ft=G-D||1;for(let yt=0;yt<vt.x.length;yt++){const Pt=vt.x[yt],Ht=vt.y[yt],Ft=vt.z[yt];if(!isFinite(Ft))continue;const ce=Math.abs(et(Ft,ht)-et(0,ht)),It=(et(Ft,ht)+et(0,ht))/2,Nt=new ir(j*2/P,ce,j*2/P),le=(Ft-D)/ft,[ie,mt,C]=vt.color??Cu(le),Mt=new ou({color:new Ee(ie,mt,C)}),Tt=new jn(Nt,Mt);Tt.position.set(k(Pt,H),It,k(Ht,st)),b.add(Tt);const bt=new hv(Nt),xt=new tr({color:0,opacity:.3,transparent:!0}),N=new iu(bt,xt);N.position.copy(Tt.position),b.add(N)}}for(const vt of s){const j=vt.width/2*.9,ft=x-S||1;for(let yt=0;yt<vt.x.length;yt++){const Pt=vt.y[yt],Ht=vt.x[yt],Ft=vt.z[yt];if(!isFinite(Ft))continue;const ce=Math.abs(k(Ft,H)-k(0,H)),It=(k(Ft,H)+k(0,H))/2,Nt=new ir(ce,j*2/P,j*2/P),le=(Ft-S)/ft,[ie,mt,C]=vt.color??Cu(le),Mt=new ou({color:new Ee(ie,mt,C)}),Tt=new jn(Nt,Mt);Tt.position.set(It,k(Ht,ht),k(Pt,st)),b.add(Tt);const bt=new hv(Nt),xt=new tr({color:0,opacity:.3,transparent:!0}),N=new iu(bt,xt);N.position.copy(Tt.position),b.add(N)}}fR(b,S,x,R,U,D,G,I,H,st,ht)},[r,t,i,s,l]);let v=1/0,_=-1/0;for(const M of r){const b=M.c??M.z;for(const A of b)isFinite(A)&&(A<v&&(v=A),A>_&&(_=A))}if(!isFinite(v))for(const M of i)for(const b of M.z)isFinite(b)&&(b<v&&(v=b),b>_&&(_=b));const g=isFinite(v)&&isFinite(_);return v===_&&(v-=.5,_+=.5),Qt.jsxs("div",{style:{position:"relative",width:"100%",height:"100%"},children:[Qt.jsx("div",{ref:m,style:{position:"absolute",inset:0}}),c&&g&&Qt.jsx(uR,{location:(f??"eastoutside").toLowerCase(),dMin:v,dMax:_,colormap:d})]})}function uR({location:r,dMin:t,dMax:i,colormap:s}){const c=[];for(let g=0;g<32;g++){const M=g/31,[b,A,S]=Cu(M),x=`rgb(${Math.round(b*255)},${Math.round(A*255)},${Math.round(S*255)})`;c.push(`${x} ${(M*100).toFixed(2)}%`)}const d=r==="northoutside"||r==="southoutside"||r==="north"||r==="south"?`linear-gradient(to right, ${c.join(",")})`:`linear-gradient(to top, ${c.join(",")})`,m=g=>Number.isInteger(g)?String(g):g.toPrecision(3),p=16,v={position:"absolute",pointerEvents:"none",fontFamily:"sans-serif",fontSize:10,color:"#333"},_={background:d,border:"1px solid #999",boxSizing:"border-box"};switch(r){case"eastoutside":return Qt.jsxs("div",{style:{...v,top:12,bottom:12,right:8,width:50,display:"flex",alignItems:"stretch"},children:[Qt.jsx("div",{style:{..._,width:p,height:"100%"}}),Qt.jsxs("div",{style:{marginLeft:4,display:"flex",flexDirection:"column",justifyContent:"space-between"},children:[Qt.jsx("span",{children:m(i)}),Qt.jsx("span",{children:m(t)})]})]});case"westoutside":return Qt.jsxs("div",{style:{...v,top:12,bottom:12,left:8,width:50,display:"flex",alignItems:"stretch",flexDirection:"row-reverse"},children:[Qt.jsx("div",{style:{..._,width:p,height:"100%"}}),Qt.jsxs("div",{style:{marginRight:4,display:"flex",flexDirection:"column",justifyContent:"space-between",textAlign:"right"},children:[Qt.jsx("span",{children:m(i)}),Qt.jsx("span",{children:m(t)})]})]});case"northoutside":return Qt.jsxs("div",{style:{...v,left:12,right:12,top:8,height:32,display:"flex",flexDirection:"column"},children:[Qt.jsxs("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:2},children:[Qt.jsx("span",{children:m(t)}),Qt.jsx("span",{children:m(i)})]}),Qt.jsx("div",{style:{..._,height:p,width:"100%"}})]});case"southoutside":return Qt.jsxs("div",{style:{...v,left:12,right:12,bottom:8,height:32,display:"flex",flexDirection:"column-reverse"},children:[Qt.jsxs("div",{style:{display:"flex",justifyContent:"space-between",marginTop:2},children:[Qt.jsx("span",{children:m(t)}),Qt.jsx("span",{children:m(i)})]}),Qt.jsx("div",{style:{..._,height:p,width:"100%"}})]});case"east":return Qt.jsxs("div",{style:{...v,top:24,bottom:24,right:24,width:50,display:"flex",flexDirection:"row-reverse",alignItems:"stretch"},children:[Qt.jsx("div",{style:{..._,width:p,height:"100%"}}),Qt.jsxs("div",{style:{marginRight:4,display:"flex",flexDirection:"column",justifyContent:"space-between",textAlign:"right"},children:[Qt.jsx("span",{children:m(i)}),Qt.jsx("span",{children:m(t)})]})]});case"west":return Qt.jsxs("div",{style:{...v,top:24,bottom:24,left:24,width:50,display:"flex",alignItems:"stretch"},children:[Qt.jsx("div",{style:{..._,width:p,height:"100%"}}),Qt.jsxs("div",{style:{marginLeft:4,display:"flex",flexDirection:"column",justifyContent:"space-between"},children:[Qt.jsx("span",{children:m(i)}),Qt.jsx("span",{children:m(t)})]})]});case"north":return Qt.jsxs("div",{style:{...v,left:24,right:24,top:24,height:32,display:"flex",flexDirection:"column-reverse"},children:[Qt.jsxs("div",{style:{display:"flex",justifyContent:"space-between",marginTop:2},children:[Qt.jsx("span",{children:m(t)}),Qt.jsx("span",{children:m(i)})]}),Qt.jsx("div",{style:{..._,height:p,width:"100%"}})]});case"south":return Qt.jsxs("div",{style:{...v,left:24,right:24,bottom:24,height:32,display:"flex",flexDirection:"column"},children:[Qt.jsxs("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:2},children:[Qt.jsx("span",{children:m(t)}),Qt.jsx("span",{children:m(i)})]}),Qt.jsx("div",{style:{..._,height:p,width:"100%"}})]});default:return null}}function fR(r,t,i,s,l,c,f,d,m,p,v){const _=(b,A)=>(b-A)/d,g=[{from:[t,s,c],to:[i,s,c]},{from:[t,s,c],to:[t,l,c]},{from:[t,s,c],to:[t,s,f]}],M=new tr({color:3355443});for(const b of g){const A=[b.from,b.to].map(([x,R,U])=>{const D=_(x,m),G=_(R,p),B=_(U,v);return new J(D,B,G)}),S=new bn().setFromPoints(A);r.add(new zu(S,M))}}const Jv=["#0072BD","#D95319","#EDB120","#7E2F8E","#77AC30","#4DBEEE","#A2142F"];function Dp(r){return`rgb(${Math.round(r[0]*255)}, ${Math.round(r[1]*255)}, ${Math.round(r[2]*255)})`}function Up(r,t){return r.color?Dp(r.color):Jv[t%Jv.length]}function kx(r){switch(r){case"--":return[8,4];case":":return[2,4];case"-.":return[8,4,2,4];default:return[]}}function hR(r,t){const i=r/t,s=Math.pow(10,Math.floor(Math.log10(i))),l=i/s;let c;return l<=1.5?c=1:l<=3.5?c=2:l<=7.5?c=5:c=10,c*s}function _u(r,t,i){const s=hR(t-r,i),l=[],c=Math.ceil(r/s)*s;for(let f=c;f<=t+s*.001;f+=s)l.push(f);return l}function $v(r){return Math.abs(r)<1e-10?"0":Math.abs(r)>=1e4||Math.abs(r)<.01&&r!==0?r.toExponential(1):parseFloat(r.toPrecision(6)).toString()}function dR(r,t,i,s,l){if(!t.marker||t.marker==="none")return;const c=(t.markerSize??6)/2,f=t.markerEdgeColor?Dp(t.markerEdgeColor):l,d=t.markerFaceColor?Dp(t.markerFaceColor):void 0,m=t.markerIndices?t.markerIndices.map(p=>p-1):Array.from({length:t.x.length},(p,v)=>v);r.lineWidth=1.5;for(const p of m){if(p<0||p>=t.x.length)continue;const v=t.x[p],_=t.y[p];if(!isFinite(v)||!isFinite(_))continue;const g=i(v),M=s(_);pR(r,t.marker,g,M,c,f,d)}}function pR(r,t,i,s,l,c,f){switch(r.strokeStyle=c,r.fillStyle=f??"transparent",t){case"o":{r.beginPath(),r.arc(i,s,l,0,Math.PI*2),f&&r.fill(),r.stroke();break}case"+":{r.beginPath(),r.moveTo(i-l,s),r.lineTo(i+l,s),r.moveTo(i,s-l),r.lineTo(i,s+l),r.stroke();break}case"*":{r.beginPath();for(let d=0;d<6;d++){const m=d*Math.PI/3;r.moveTo(i,s),r.lineTo(i+l*Math.cos(m),s+l*Math.sin(m))}r.stroke();break}case".":{r.beginPath(),r.arc(i,s,Math.max(l/3,1.5),0,Math.PI*2),r.fillStyle=c,r.fill();break}case"x":{const d=l*.707;r.beginPath(),r.moveTo(i-d,s-d),r.lineTo(i+d,s+d),r.moveTo(i+d,s-d),r.lineTo(i-d,s+d),r.stroke();break}case"_":{r.beginPath(),r.moveTo(i-l,s),r.lineTo(i+l,s),r.stroke();break}case"|":{r.beginPath(),r.moveTo(i,s-l),r.lineTo(i,s+l),r.stroke();break}case"s":{r.beginPath(),r.rect(i-l,s-l,l*2,l*2),f&&r.fill(),r.stroke();break}case"d":{r.beginPath(),r.moveTo(i,s-l),r.lineTo(i+l,s),r.lineTo(i,s+l),r.lineTo(i-l,s),r.closePath(),f&&r.fill(),r.stroke();break}case"^":{vu(r,i,s,l,0,f);break}case"v":{vu(r,i,s,l,Math.PI,f);break}case"<":{vu(r,i,s,l,-Math.PI/2,f);break}case">":{vu(r,i,s,l,Math.PI/2,f);break}case"p":{tx(r,i,s,l,5,f);break}case"h":{tx(r,i,s,l,6,f);break}}}function vu(r,t,i,s,l,c){r.beginPath();for(let f=0;f<3;f++){const d=l-Math.PI/2+f*2*Math.PI/3,m=t+s*Math.cos(d),p=i+s*Math.sin(d);f===0?r.moveTo(m,p):r.lineTo(m,p)}r.closePath(),c&&r.fill(),r.stroke()}function tx(r,t,i,s,l,c){const f=s*.4;r.beginPath();for(let d=0;d<l*2;d++){const m=-Math.PI/2+d*Math.PI/l,p=d%2===0?s:f,v=t+p*Math.cos(m),_=i+p*Math.sin(m);d===0?r.moveTo(v,_):r.lineTo(v,_)}r.closePath(),c&&r.fill(),r.stroke()}function mR(r,t,i,s,l){r.font="11px sans-serif";let v=0;for(const A of i){const S=r.measureText(A).width;S>v&&(v=S)}const _=34+v+8,g=8+i.length*17+8,M=s-_-8,b=l+8;r.fillStyle="rgba(255,255,255,0.9)",r.fillRect(M,b,_,g),r.strokeStyle="#999",r.lineWidth=.5,r.strokeRect(M,b,_,g);for(let A=0;A<i.length;A++){const S=A<t.length?Up(t[A],A):"#333",x=A<t.length?t[A].lineWidth??2:2,R=A<t.length?t[A].lineStyle:void 0,U=b+8+A*17+17/2;r.strokeStyle=S,r.lineWidth=x,r.setLineDash(kx(R)),r.beginPath(),r.moveTo(M+8,U),r.lineTo(M+8+20,U),r.stroke(),r.setLineDash([]),r.fillStyle="#333",r.font="11px sans-serif",r.textAlign="left",r.textBaseline="middle",r.fillText(i[A],M+8+20+6,U)}}function xu(r,t){const i=Math.max(r,Number.MIN_VALUE),s=Math.max(t,Number.MIN_VALUE),l=Math.floor(Math.log10(i)),c=Math.ceil(Math.log10(s)),f=[];for(let d=l;d<=c;d++){const m=Math.pow(10,d);m>=i&&m<=s&&f.push(m)}if(f.length<3){for(let d=l;d<=c;d++)for(const m of[2,5]){const p=m*Math.pow(10,d);p>=i&&p<=s&&!f.includes(p)&&f.push(p)}f.sort((d,m)=>d-m)}return f}function ex(r){return r>=1&&r<1e6&&Number.isInteger(r)?r.toString():r.toExponential(0)}function gR(r,t,i,s,l,c,f,d,m,p,v,_,g,M,b,A,S,x,R,U,D,G,B,F,T,O){wu=O;const z=r.getContext("2d"),V=t.length>0||d!==void 0||D&&D.length>0||m&&m.length>0||g&&g.length>0||M&&M.length>0||b&&b.length>0||A&&A.length>0||S!==void 0||x!==void 0||R&&R.length>0;if(!z||!V)return;const K=window.devicePixelRatio||1,tt=r.width,ct=r.height;z.setTransform(K,0,0,K,0,0);const q=tt/K,I=ct/K;if(z.fillStyle="#fff",z.fillRect(0,0,q,I),S){bR(z,q,I,S,i);return}if(x){ER(z,q,I,x,i,p);return}const H={top:i?40:20,right:20,bottom:s?56:40,left:l?76:60},st=(F??"eastoutside").toLowerCase();B&&(st==="eastoutside"?H.right+=70:st==="westoutside"?H.left+=70:st==="northoutside"?H.top+=50:st==="southoutside"&&(H.bottom+=50));const ht=q-H.left-H.right,Ct=I-H.top-H.bottom;if(ht<=0||Ct<=0)return;let P=1/0,k=-1/0,et=1/0,pt=-1/0;for(const mt of t){for(const C of mt.x)isFinite(C)&&(C<P&&(P=C),C>k&&(k=C));for(const C of mt.y)isFinite(C)&&(C<et&&(et=C),C>pt&&(pt=C))}if(d&&(d.x[0]<P&&(P=d.x[0]),d.x[1]>k&&(k=d.x[1]),d.y[0]<et&&(et=d.y[0]),d.y[1]>pt&&(pt=d.y[1])),D)for(const mt of D){for(const C of mt.x)isFinite(C)&&(C<P&&(P=C),C>k&&(k=C));for(const C of mt.y)isFinite(C)&&(C<et&&(et=C),C>pt&&(pt=C))}if(m)for(const mt of m){for(const C of mt.x)isFinite(C)&&(C<P&&(P=C),C>k&&(k=C));for(const C of mt.y)isFinite(C)&&(C<et&&(et=C),C>pt&&(pt=C))}if(g)for(const mt of g){const C=mt.width/2;for(let Mt=0;Mt<mt.x.length;Mt++){const Tt=mt.x[Mt];isFinite(Tt)&&(Tt-C<P&&(P=Tt-C),Tt+C>k&&(k=Tt+C));const bt=mt.y[Mt];isFinite(bt)&&(bt<et&&(et=bt),bt>pt&&(pt=bt))}0<et&&(et=0),0>pt&&(pt=0)}if(M)for(const mt of M){const C=mt.width/2;for(let Mt=0;Mt<mt.x.length;Mt++){const Tt=mt.x[Mt];isFinite(Tt)&&(Tt-C<et&&(et=Tt-C),Tt+C>pt&&(pt=Tt+C));const bt=mt.y[Mt];isFinite(bt)&&(bt<P&&(P=bt),bt>k&&(k=bt))}0<P&&(P=0),0>k&&(k=0)}if(b)for(const mt of b)for(let C=0;C<mt.x.length;C++){const Mt=mt.x[C],Tt=mt.y[C];if(isFinite(Mt)){const bt=mt.xNeg?Mt-mt.xNeg[C]:Mt,xt=mt.xPos?Mt+mt.xPos[C]:Mt;bt<P&&(P=bt),xt>k&&(k=xt)}if(isFinite(Tt)){const bt=Tt-mt.yNeg[C],xt=Tt+mt.yPos[C];bt<et&&(et=bt),xt>pt&&(pt=xt)}}if(A)for(const mt of A){const C=mt.width/2;mt.x-C<P&&(P=mt.x-C),mt.x+C>k&&(k=mt.x+C),mt.whiskerLow<et&&(et=mt.whiskerLow),mt.whiskerHigh>pt&&(pt=mt.whiskerHigh);for(const Mt of mt.outliers)Mt<et&&(et=Mt),Mt>pt&&(pt=Mt)}if(R&&R.length>0){const mt=U??0;mt<et&&(et=mt),mt>pt&&(pt=mt);const C=R[0].x.length;for(let Mt=0;Mt<C;Mt++){let Tt=mt;for(const bt of R)if(Mt<bt.x.length){const xt=bt.x[Mt];isFinite(xt)&&(xt<P&&(P=xt),xt>k&&(k=xt)),Tt+=bt.y[Mt]-mt,isFinite(Tt)&&(Tt<et&&(et=Tt),Tt>pt&&(pt=Tt))}}}if(!isFinite(P))return;k===P&&(P-=1,k+=1),pt===et&&(et-=1,pt+=1);const vt=v?.includes("tight")??!1,j=v?.includes("equal")??!1,ft=_==="semilogx"||_==="loglog",yt=_==="semilogy"||_==="loglog";if(ft&&P<=0&&(P=k>0?k*1e-6:1),yt&&et<=0&&(et=pt>0?pt*1e-6:1),!vt){if(ft){const mt=(Math.log10(k)-Math.log10(P))*.05;P=Math.pow(10,Math.log10(P)-mt),k=Math.pow(10,Math.log10(k)+mt)}else{const mt=(k-P)*.05;P-=mt,k+=mt}if(yt){const mt=(Math.log10(pt)-Math.log10(et))*.05;et=Math.pow(10,Math.log10(et)-mt),pt=Math.pow(10,Math.log10(pt)+mt)}else{const mt=(pt-et)*.05;et-=mt,pt+=mt}}let Pt=ht,Ht=Ct,Ft=H.left,ce=H.top;if(j){const mt=k-P,C=pt-et,Mt=mt/ht,Tt=C/Ct;if(vt)Mt>Tt?(Ht=C/Mt,ce=H.top+(Ct-Ht)/2):(Pt=mt/Tt,Ft=H.left+(ht-Pt)/2);else if(Mt>Tt){const bt=Mt*Ct,xt=(et+pt)/2;et=xt-bt/2,pt=xt+bt/2}else{const bt=Tt*ht,xt=(P+k)/2;P=xt-bt/2,k=xt+bt/2}}const It=ft?mt=>{const C=Math.log10(Math.max(mt,Number.MIN_VALUE)),Mt=Math.log10(Math.max(P,Number.MIN_VALUE)),Tt=Math.log10(Math.max(k,Number.MIN_VALUE));return Ft+(C-Mt)/(Tt-Mt)*Pt}:mt=>Ft+(mt-P)/(k-P)*Pt,Nt=yt?mt=>{const C=Math.log10(Math.max(mt,Number.MIN_VALUE)),Mt=Math.log10(Math.max(et,Number.MIN_VALUE)),Tt=Math.log10(Math.max(pt,Number.MIN_VALUE));return ce+Ht-(C-Mt)/(Tt-Mt)*Ht}:mt=>ce+Ht-(mt-et)/(pt-et)*Ht;if(f!==!1){z.strokeStyle="#ddd",z.lineWidth=.5;const mt=ft?xu(P,k):_u(P,k,Math.max(3,Math.floor(Pt/80))),C=yt?xu(et,pt):_u(et,pt,Math.max(3,Math.floor(Ht/50)));for(const Mt of mt){const Tt=It(Mt);z.beginPath(),z.moveTo(Tt,ce),z.lineTo(Tt,ce+Ht),z.stroke()}for(const Mt of C){const Tt=Nt(Mt);z.beginPath(),z.moveTo(Ft,Tt),z.lineTo(Ft+Pt,Tt),z.stroke()}}z.strokeStyle="#333",z.lineWidth=1,z.strokeRect(Ft,ce,Pt,Ht);const le=ft?xu(P,k):_u(P,k,Math.max(3,Math.floor(Pt/80))),ie=yt?xu(et,pt):_u(et,pt,Math.max(3,Math.floor(Ht/50)));z.fillStyle="#333",z.font="11px monospace",z.textAlign="center",z.textBaseline="top";for(const mt of le)z.fillText(ft?ex(mt):$v(mt),It(mt),ce+Ht+5);z.textAlign="right",z.textBaseline="middle";for(const mt of ie)z.fillText(yt?ex(mt):$v(mt),Ft-5,Nt(mt));if(z.fillStyle="#222",i&&(z.font="bold 13px sans-serif",z.textAlign="center",z.textBaseline="middle",z.fillText(i,Ft+Pt/2,ce/2)),s&&(z.font="12px sans-serif",z.textAlign="center",z.textBaseline="bottom",z.fillText(s,Ft+Pt/2,I-4)),l&&(z.font="12px sans-serif",z.textAlign="center",z.textBaseline="middle",z.save(),z.translate(14,ce+Ht/2),z.rotate(-Math.PI/2),z.fillText(l,0,0),z.restore()),z.save(),z.beginPath(),z.rect(Ft,ce,Pt,Ht),z.clip(),d&&SR(z,d,It,Nt,p),D)for(const mt of D)TR(z,mt,It,Nt,p,G,T);if(m)for(const mt of m)yR(z,mt,It,Nt,p);if(g){const mt=[[0,.447,.741],[.85,.325,.098],[.929,.694,.125],[.494,.184,.556],[.466,.674,.188]];for(let C=0;C<g.length;C++){const Mt=g[C],[Tt,bt,xt]=Mt.color??mt[C%mt.length];z.fillStyle=`rgb(${Math.round(Tt*255)},${Math.round(bt*255)},${Math.round(xt*255)})`,z.strokeStyle=`rgb(${Math.round(Tt*180)},${Math.round(bt*180)},${Math.round(xt*180)})`,z.lineWidth=1;const N=Nt(0);for(let E=0;E<Mt.x.length;E++){const X=It(Mt.x[E]),it=Nt(Mt.y[E]),dt=(It(Mt.x[E]+Mt.width)-It(Mt.x[E]))/2;z.fillRect(X-dt,Math.min(it,N),dt*2,Math.abs(it-N)),z.strokeRect(X-dt,Math.min(it,N),dt*2,Math.abs(it-N))}}}if(M){const mt=[[0,.447,.741],[.85,.325,.098],[.929,.694,.125],[.494,.184,.556],[.466,.674,.188]];for(let C=0;C<M.length;C++){const Mt=M[C],[Tt,bt,xt]=Mt.color??mt[C%mt.length];z.fillStyle=`rgb(${Math.round(Tt*255)},${Math.round(bt*255)},${Math.round(xt*255)})`,z.strokeStyle=`rgb(${Math.round(Tt*180)},${Math.round(bt*180)},${Math.round(xt*180)})`,z.lineWidth=1;const N=It(0);for(let E=0;E<Mt.x.length;E++){const X=Nt(Mt.x[E]),it=It(Mt.y[E]),dt=(Nt(Mt.x[E]-Mt.width)-Nt(Mt.x[E]))/2;z.fillRect(Math.min(N,it),X-dt,Math.abs(it-N),dt*2),z.strokeRect(Math.min(N,it),X-dt,Math.abs(it-N),dt*2)}}}if(A){const mt=[[0,.447,.741],[.85,.325,.098],[.929,.694,.125],[.494,.184,.556],[.466,.674,.188]];for(let C=0;C<A.length;C++){const Mt=A[C],[Tt,bt,xt]=Mt.color??mt[C%mt.length],N=`rgba(${Math.round(Tt*255)},${Math.round(bt*255)},${Math.round(xt*255)},0.3)`,E=`rgb(${Math.round(Tt*255)},${Math.round(bt*255)},${Math.round(xt*255)})`,X=It(Mt.x),it=Math.abs(It(Mt.x+Mt.width)-It(Mt.x))/2,dt=Nt(Mt.q1),nt=Nt(Mt.q3),kt=Nt(Mt.median),Lt=Nt(Mt.whiskerLow),ee=Nt(Mt.whiskerHigh);z.fillStyle=N,z.fillRect(X-it,Math.min(dt,nt),it*2,Math.abs(nt-dt)),z.strokeStyle=E,z.lineWidth=1.5,z.strokeRect(X-it,Math.min(dt,nt),it*2,Math.abs(nt-dt)),z.lineWidth=2,z.beginPath(),z.moveTo(X-it,kt),z.lineTo(X+it,kt),z.stroke(),z.lineWidth=1,z.setLineDash([4,2]),z.beginPath(),z.moveTo(X,nt),z.lineTo(X,ee),z.moveTo(X,dt),z.lineTo(X,Lt),z.stroke(),z.setLineDash([]);const se=it*.5;z.beginPath(),z.moveTo(X-se,ee),z.lineTo(X+se,ee),z.moveTo(X-se,Lt),z.lineTo(X+se,Lt),z.stroke(),z.fillStyle=E;for(const Dt of Mt.outliers){const wt=Nt(Dt);z.beginPath(),z.arc(X,wt,3,0,Math.PI*2),z.fill()}}}if(R&&R.length>0){const mt=U??0,C=[[0,.447,.741],[.85,.325,.098],[.929,.694,.125],[.494,.184,.556],[.466,.674,.188],[.301,.745,.933],[.635,.078,.184]],Mt=R[0].x.length,Tt=[],bt=[];let xt=new Array(Mt).fill(mt);for(let N=0;N<R.length;N++){const E=R[N];Tt.push([...xt]);const X=[];for(let it=0;it<Mt;it++)X.push(xt[it]+(it<E.y.length?E.y[it]-mt:0));bt.push(X),xt=X}for(let N=R.length-1;N>=0;N--){const E=R[N],[X,it,dt]=E.color??C[N%C.length];z.fillStyle=`rgba(${Math.round(X*255)},${Math.round(it*255)},${Math.round(dt*255)},0.6)`,z.beginPath();for(let nt=0;nt<Mt;nt++){const kt=It(E.x[nt]),Lt=Nt(bt[N][nt]);nt===0?z.moveTo(kt,Lt):z.lineTo(kt,Lt)}for(let nt=Mt-1;nt>=0;nt--)z.lineTo(It(E.x[nt]),Nt(Tt[N][nt]));z.closePath(),z.fill(),z.strokeStyle=`rgb(${Math.round(X*255)},${Math.round(it*255)},${Math.round(dt*255)})`,z.lineWidth=1,z.beginPath();for(let nt=0;nt<Mt;nt++){const kt=It(E.x[nt]),Lt=Nt(bt[N][nt]);nt===0?z.moveTo(kt,Lt):z.lineTo(kt,Lt)}z.stroke()}}if(b)for(let mt=0;mt<b.length;mt++){const C=b[mt],Mt=C.color?`rgb(${Math.round(C.color[0]*255)},${Math.round(C.color[1]*255)},${Math.round(C.color[2]*255)})`:Up({},mt);z.strokeStyle=Mt,z.fillStyle=Mt,z.lineWidth=(C.lineWidth??1)*K;const Tt=3*K;z.beginPath();for(let bt=0;bt<C.x.length;bt++){const xt=It(C.x[bt]),N=Nt(C.y[bt]);bt===0?z.moveTo(xt,N):z.lineTo(xt,N)}z.stroke();for(let bt=0;bt<C.x.length;bt++){const xt=It(C.x[bt]),N=Nt(C.y[bt]),E=Nt(C.y[bt]-C.yNeg[bt]),X=Nt(C.y[bt]+C.yPos[bt]);if(z.beginPath(),z.moveTo(xt,E),z.lineTo(xt,X),z.stroke(),z.beginPath(),z.moveTo(xt-Tt,E),z.lineTo(xt+Tt,E),z.stroke(),z.beginPath(),z.moveTo(xt-Tt,X),z.lineTo(xt+Tt,X),z.stroke(),C.xNeg&&C.xPos){const it=It(C.x[bt]-C.xNeg[bt]),dt=It(C.x[bt]+C.xPos[bt]);z.beginPath(),z.moveTo(it,N),z.lineTo(dt,N),z.stroke(),z.beginPath(),z.moveTo(it,N-Tt),z.lineTo(it,N+Tt),z.stroke(),z.beginPath(),z.moveTo(dt,N-Tt),z.lineTo(dt,N+Tt),z.stroke()}z.beginPath(),z.arc(xt,N,2*K,0,2*Math.PI),z.fill()}}for(let mt=0;mt<t.length;mt++){const C=t[mt],Mt=Up(C,mt);if(C.lineStyle!=="none"){z.strokeStyle=Mt,z.lineWidth=C.lineWidth??2,z.lineJoin="round",z.setLineDash(kx(C.lineStyle)),z.beginPath();let Tt=!1;for(let bt=0;bt<C.x.length;bt++){const xt=C.x[bt],N=C.y[bt];if(!isFinite(xt)||!isFinite(N)){Tt=!1;continue}const E=It(xt),X=Nt(N);Tt?z.lineTo(E,X):(z.moveTo(E,X),Tt=!0)}z.stroke(),z.setLineDash([])}C.marker&&dR(z,C,It,Nt,Mt)}if(z.restore(),c&&c.length>0&&mR(z,t,c,Ft+Pt,ce),B){const mt=T??AR(D,d,m);mt&&RR(z,st,Ft,ce,Pt,Ht,mt[0],mt[1],p)}}let wu;function Es(r,t){const i=Math.max(0,Math.min(1,r));if(wu&&wu.length>0){const s=wu,l=s.length;if(l===1)return s[0];const c=i*(l-1),f=Math.floor(c),d=Math.min(f+1,l-1),m=c-f;return[s[f][0]+m*(s[d][0]-s[f][0]),s[f][1]+m*(s[d][1]-s[f][1]),s[f][2]+m*(s[d][2]-s[f][2])]}return t==="jet"?vR(i):t==="redblue"?xR(i):_R(i)}function _R(r){if(r<.5){const i=r*2;return[.2*(1-i),.1+.6*i,.9-.3*i]}const t=(r-.5)*2;return[.2+.8*t,.7+.3*t,.6-.5*t]}function vR(r){let t,i,s;return r<.125?(t=0,i=0,s=.5+r*4):r<.375?(t=0,i=(r-.125)*4,s=1):r<.625?(t=(r-.375)*4,i=1,s=1-(r-.375)*4):r<.875?(t=1,i=1-(r-.625)*4,s=0):(t=1-(r-.875)*4,i=0,s=0),[Math.max(0,Math.min(1,t)),Math.max(0,Math.min(1,i)),Math.max(0,Math.min(1,s))]}function xR(r){if(r<.5){const i=r*2;return[i,i,1]}const t=(r-.5)*2;return[1,1-t,1-t]}function SR(r,t,i,s,l){const{rows:c,cols:f,z:d,x:m,y:p}=t;if(c===0||f===0)return;let v=1/0,_=-1/0;for(const A of d)isFinite(A)&&(A<v&&(v=A),A>_&&(_=A));if(!isFinite(v))return;const g=_-v||1,M=(m[1]-m[0])/f,b=(p[1]-p[0])/c;for(let A=0;A<f;A++)for(let S=0;S<c;S++){const R=(d[A*c+S]-v)/g,[U,D,G]=Es(R,l),B=i(m[0]+A*M),F=s(p[0]+(S+1)*b),T=i(m[0]+(A+1)*M),O=s(p[0]+S*b);r.fillStyle=`rgb(${Math.round(U*255)},${Math.round(D*255)},${Math.round(G*255)})`,r.fillRect(B,F,T-B,O-F)}}function yR(r,t,i,s,l){const{rows:c,cols:f,z:d,x:m,y:p,nLevels:v,filled:_}=t;if(c<2||f<2)return;let g=1/0,M=-1/0;for(const U of d)isFinite(U)&&(U<g&&(g=U),U>M&&(M=U));if(!isFinite(g))return;const b=M-g||1,A=[];for(let U=0;U<=v;U++)A.push(g+U/v*b);const S=(U,D)=>d[D*c+U],x=(U,D)=>m[D*c+U],R=(U,D)=>p[D*c+U];if(_)for(let U=0;U<f-1;U++)for(let D=0;D<c-1;D++){const B=((S(D,U)+S(D+1,U)+S(D,U+1)+S(D+1,U+1))/4-g)/b,[F,T,O]=Es(B,l),z=i(x(D,U)),V=s(R(D,U)),K=i(x(D+1,U+1)),tt=s(R(D+1,U+1));r.fillStyle=`rgb(${Math.round(F*255)},${Math.round(T*255)},${Math.round(O*255)})`,r.fillRect(Math.min(z,K),Math.min(V,tt),Math.abs(K-z)||1,Math.abs(tt-V)||1)}else for(let U=1;U<A.length-1;U++){const D=A[U],G=(D-g)/b,[B,F,T]=Es(G,l);r.strokeStyle=`rgb(${Math.round(B*255)},${Math.round(F*255)},${Math.round(T*255)})`,r.lineWidth=1;for(let O=0;O<f-1;O++)for(let z=0;z<c-1;z++){const V=S(z,O),K=S(z+1,O),tt=S(z,O+1),ct=S(z+1,O+1),q=x(z,O),I=R(z,O),H=x(z+1,O),st=R(z+1,O),ht=x(z,O+1),Ct=R(z,O+1),P=x(z+1,O+1),k=R(z+1,O+1),et=MR(V,K,tt,ct,q,I,H,st,ht,Ct,P,k,D);for(const pt of et)r.beginPath(),r.moveTo(i(pt[0]),s(pt[1])),r.lineTo(i(pt[2]),s(pt[3])),r.stroke()}}}function MR(r,t,i,s,l,c,f,d,m,p,v,_,g){const M=r>=g?1:0,b=t>=g?1:0,A=i>=g?1:0,S=s>=g?1:0,x=M|b<<1|A<<2|S<<3;if(x===0||x===15)return[];const R=(K,tt,ct,q)=>{const I=(g-ct)/(q-ct||1);return K+I*(tt-K)},U=R(l,f,r,t),D=R(c,d,r,t),G=R(f,v,t,s),B=R(d,_,t,s),F=R(m,v,i,s),T=R(p,_,i,s),O=R(l,m,r,i),z=R(c,p,r,i),V=[];switch(x){case 1:case 14:V.push([U,D,O,z]);break;case 2:case 13:V.push([U,D,G,B]);break;case 3:case 12:V.push([O,z,G,B]);break;case 4:case 11:V.push([O,z,F,T]);break;case 5:case 10:V.push([U,D,F,T]);break;case 6:case 9:V.push([U,D,O,z]),V.push([F,T,G,B]);break;case 7:case 8:V.push([F,T,G,B]);break}return V}const nx=[[0,.447,.741],[.85,.325,.098],[.929,.694,.125],[.494,.184,.556],[.466,.674,.188],[.301,.745,.933],[.635,.078,.184]];function bR(r,t,i,s,l){const c=s.values.reduce((M,b)=>M+b,0);if(c<=0)return;const f=l?36:0,d=60,m=t/2,p=f+(i-f)/2,v=Math.min(t/2-d,(i-f)/2-d);if(v<=0)return;const _=v*s.innerRadius;l&&(r.font="bold 14px sans-serif",r.fillStyle="#000",r.textAlign="center",r.textBaseline="top",r.fillText(l,m,10));let g=-Math.PI/2;for(let M=0;M<s.values.length;M++){const b=s.values[M]/c*2*Math.PI,A=g+b,[S,x,R]=s.colors?.[M]??nx[M%nx.length];r.beginPath(),_>0?(r.arc(m,p,v,g,A),r.arc(m,p,_,A,g,!0)):(r.moveTo(m,p),r.arc(m,p,v,g,A),r.closePath()),r.fillStyle=`rgb(${Math.round(S*255)},${Math.round(x*255)},${Math.round(R*255)})`,r.fill(),r.strokeStyle="#fff",r.lineWidth=2,r.stroke();const U=g+b/2,D=(s.values[M]/c*100).toFixed(1)+"%",G=v+16,B=m+G*Math.cos(U),F=p+G*Math.sin(U);r.font="12px sans-serif",r.fillStyle="#333",r.textAlign=U>Math.PI/2||U<-Math.PI/2?"right":"left",r.textBaseline="middle";const T=s.names?.[M]?`${s.names[M]} (${D})`:D;r.fillText(T,B,F),g=A}}function ER(r,t,i,s,l,c){const{data:f,rows:d,cols:m}=s;if(d===0||m===0)return;let p=1/0,v=-1/0;for(const q of f)isFinite(q)&&(q<p&&(p=q),q>v&&(v=q));if(!isFinite(p))return;const _=v-p||1;r.font="12px sans-serif";const g=s.yLabels??Array.from({length:d},(q,I)=>String(I+1)),M=s.xLabels??Array.from({length:m},(q,I)=>String(I+1));let b=0;for(const q of g){const I=r.measureText(q).width;I>b&&(b=I)}const A=l?30:10,S=24,x=b+12,R=50,U=x,D=A,G=t-U-R,B=i-D-S;if(G<=0||B<=0)return;const F=G/m,T=B/d;l&&(r.font="bold 14px sans-serif",r.fillStyle="#000",r.textAlign="center",r.textBaseline="top",r.fillText(l,t/2,8));const O=Math.max(8,Math.min(14,Math.min(F,T)*.35));r.font=`${O}px sans-serif`,r.textAlign="center",r.textBaseline="middle";for(let q=0;q<m;q++)for(let I=0;I<d;I++){const H=f[q*d+I],st=U+q*F,ht=D+I*T,Ct=isFinite(H)?(H-p)/_:0,[P,k,et]=Es(Ct,c);if(r.fillStyle=`rgb(${Math.round(P*255)},${Math.round(k*255)},${Math.round(et*255)})`,r.fillRect(st,ht,F,T),r.strokeStyle="#fff",r.lineWidth=1,r.strokeRect(st,ht,F,T),isFinite(H)&&F>16&&T>12){const pt=P*.299+k*.587+et*.114;r.fillStyle=pt>.5?"#000":"#fff";const vt=Number.isInteger(H)?String(H):H.toFixed(2);r.fillText(vt,st+F/2,ht+T/2)}}r.font="11px sans-serif",r.fillStyle="#333",r.textAlign="center",r.textBaseline="top";for(let q=0;q<m;q++)r.fillText(M[q]??"",U+q*F+F/2,D+B+4);r.textAlign="right",r.textBaseline="middle";for(let q=0;q<d;q++)r.fillText(g[q]??"",U-6,D+q*T+T/2);const z=U+G+10,V=16,K=D,tt=B,ct=Math.max(1,Math.round(tt));for(let q=0;q<ct;q++){const I=1-q/ct,[H,st,ht]=Es(I,c);r.fillStyle=`rgb(${Math.round(H*255)},${Math.round(st*255)},${Math.round(ht*255)})`,r.fillRect(z,K+q/ct*tt,V,tt/ct+1)}r.strokeStyle="#999",r.lineWidth=1,r.strokeRect(z,K,V,tt),r.font="10px sans-serif",r.fillStyle="#333",r.textAlign="left",r.textBaseline="top",r.fillText(sa(v),z+V+4,K),r.textBaseline="bottom",r.fillText(sa(p),z+V+4,K+tt)}function sa(r){return Number.isInteger(r)?String(r):r.toPrecision(3)}function TR(r,t,i,s,l,c,f){const d=c??"faceted";if(d==="interp"){ix(r,t,i,s,l,!1,f);return}ix(r,t,i,s,l,d==="faceted",f)}function ix(r,t,i,s,l,c,f){const{rows:d,cols:m,x:p,y:v,c:_}=t;if(d<2||m<2)return;let g,M;if(f)[g,M]=f;else{g=1/0,M=-1/0;for(const S of _)isFinite(S)&&(S<g&&(g=S),S>M&&(M=S))}if(!isFinite(g))return;const b=M-g||1,A=t.faceAlpha??1;r.save(),A<1&&(r.globalAlpha=A);for(let S=0;S<m-1;S++)for(let x=0;x<d-1;x++){const R=S*d+x,U=S*d+(x+1),D=(S+1)*d+x,G=(S+1)*d+(x+1),B=_[R];if(!isFinite(B))continue;const F=(B-g)/b,[T,O,z]=Es(F,l),V=`rgb(${Math.round(T*255)},${Math.round(O*255)},${Math.round(z*255)})`,K=i(p[R]),tt=s(v[R]),ct=i(p[U]),q=s(v[U]),I=i(p[G]),H=s(v[G]),st=i(p[D]),ht=s(v[D]);if(r.beginPath(),r.moveTo(K,tt),r.lineTo(ct,q),r.lineTo(I,H),r.lineTo(st,ht),r.closePath(),r.fillStyle=V,r.fill(),c&&t.edgeColor!=="none"){if(Array.isArray(t.edgeColor)){const[Ct,P,k]=t.edgeColor;r.strokeStyle=`rgb(${Math.round(Ct*255)},${Math.round(P*255)},${Math.round(k*255)})`}else r.strokeStyle="rgba(0,0,0,0.3)";r.lineWidth=.5,r.stroke()}}r.restore()}function AR(r,t,i){let s=1/0,l=-1/0;const c=f=>{for(const d of f)isFinite(d)&&(d<s&&(s=d),d>l&&(l=d))};if(r)for(const f of r)c(f.c);if(t&&c(t.z),i)for(const f of i)c(f.z);return!isFinite(s)||!isFinite(l)?null:(s===l&&(s-=.5,l+=.5),[s,l])}function RR(r,t,i,s,l,c,f,d,m){switch(t){case"eastoutside":{const g=i+l+10;Su(r,g,s,16,c,f,d,m,"right");break}case"westoutside":{const g=i-10-16;Su(r,g,s,16,c,f,d,m,"left");break}case"northoutside":{const g=s-10-16;yu(r,i,g,l,16,f,d,m,"top");break}case"southoutside":{const g=s+c+10;yu(r,i,g,l,16,f,d,m,"bottom");break}case"east":{const g=i+l-8-16;Su(r,g,s+8,16,c-16,f,d,m,"left");break}case"west":{const g=i+8;Su(r,g,s+8,16,c-16,f,d,m,"right");break}case"north":{const g=s+8;yu(r,i+8,g,l-16,16,f,d,m,"bottom");break}case"south":{const g=s+c-8-16;yu(r,i+8,g,l-16,16,f,d,m,"top");break}}}function Su(r,t,i,s,l,c,f,d,m){const p=Math.max(1,Math.round(l));for(let v=0;v<p;v++){const _=1-v/p,[g,M,b]=Es(_,d);r.fillStyle=`rgb(${Math.round(g*255)},${Math.round(M*255)},${Math.round(b*255)})`,r.fillRect(t,i+v/p*l,s,l/p+1)}r.strokeStyle="#999",r.lineWidth=1,r.strokeRect(t,i,s,l),r.font="10px sans-serif",r.fillStyle="#333",m==="right"?(r.textAlign="left",r.textBaseline="top",r.fillText(sa(f),t+s+4,i),r.textBaseline="bottom",r.fillText(sa(c),t+s+4,i+l)):(r.textAlign="right",r.textBaseline="top",r.fillText(sa(f),t-4,i),r.textBaseline="bottom",r.fillText(sa(c),t-4,i+l))}function yu(r,t,i,s,l,c,f,d,m){const p=Math.max(1,Math.round(s));for(let v=0;v<p;v++){const _=v/p,[g,M,b]=Es(_,d);r.fillStyle=`rgb(${Math.round(g*255)},${Math.round(M*255)},${Math.round(b*255)})`,r.fillRect(t+v/p*s,i,s/p+1,l)}r.strokeStyle="#999",r.lineWidth=1,r.strokeRect(t,i,s,l),r.font="10px sans-serif",r.fillStyle="#333",m==="bottom"?(r.textBaseline="top",r.textAlign="left",r.fillText(sa(c),t,i+l+4),r.textAlign="right",r.fillText(sa(f),t+s,i+l+4)):(r.textBaseline="bottom",r.textAlign="left",r.fillText(sa(c),t,i-4),r.textAlign="right",r.fillText(sa(f),t+s,i-4))}class ax extends Fn.Component{state={error:null};static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,i){console.error("Axes render error:",t,i)}render(){return this.state.error?Qt.jsxs("div",{style:{width:"100%",height:"100%",display:"flex",alignItems:"center",justifyContent:"center",padding:8,color:"#a00",fontFamily:"sans-serif",fontSize:12,textAlign:"center",boxSizing:"border-box"},children:["Plot render error: ",this.state.error.message]}):this.props.children}}function CR({figure:r}){const{subplotGrid:t,sgtitle:i,axes:s}=r,l=Object.keys(s).map(Number).sort((d,m)=>d-m);if(l.length===0)return null;if(!t){const d=s[l[0]];return d?Qt.jsx(ax,{children:Qt.jsx(sx,{axes:d})}):null}const{rows:c,cols:f}=t;return Qt.jsxs("div",{style:{width:"100%",height:"100%",display:"flex",flexDirection:"column"},children:[i&&Qt.jsx("div",{style:{textAlign:"center",fontWeight:"bold",fontSize:16,fontFamily:"sans-serif",padding:"8px 0 4px 0",flexShrink:0},children:i}),Qt.jsx("div",{style:{flex:1,display:"grid",gridTemplateRows:`repeat(${c}, 1fr)`,gridTemplateColumns:`repeat(${f}, 1fr)`,gap:4,padding:4,minHeight:0},children:Array.from({length:c*f},(d,m)=>{const p=m+1,v=s[p],_=Math.floor(m/f),g=m%f;return Qt.jsx("div",{style:{gridRow:_+1,gridColumn:g+1,minWidth:0,minHeight:0,overflow:"hidden"},children:v?Qt.jsx(ax,{children:Qt.jsx(sx,{axes:v})}):null},p)})})]})}function sx({axes:r}){return r.surfTraces&&r.surfTraces.length>0||r.plot3Traces&&r.plot3Traces.length>0||r.bar3Traces&&r.bar3Traces.length>0||r.bar3hTraces&&r.bar3hTraces.length>0?Qt.jsx(cR,{surfTraces:r.surfTraces??[],plot3Traces:r.plot3Traces??[],bar3Traces:r.bar3Traces??[],bar3hTraces:r.bar3hTraces??[],shading:r.shading,colorbar:r.colorbar,colorbarLocation:r.colorbarLocation,colormap:r.colormap}):Qt.jsx(wR,{traces:r.traces,title:r.title,xlabel:r.xlabel,ylabel:r.ylabel,legend:r.legend,gridOn:r.gridOn,imagescTrace:r.imagescTrace,pcolorTraces:r.pcolorTraces,contourTraces:r.contourTraces,colormap:r.colormap,colormapData:r.colormapData,axisMode:r.axisMode,axisScale:r.axisScale,barTraces:r.barTraces,barhTraces:r.barhTraces,errorBarTraces:r.errorBarTraces,boxTraces:r.boxTraces,pieTrace:r.pieTrace,heatmapTrace:r.heatmapTrace,areaTraces:r.areaTraces,areaBaseValue:r.areaBaseValue,shading:r.shading,colorbar:r.colorbar,colorbarLocation:r.colorbarLocation,caxis:r.caxis})}function wR({traces:r,title:t,xlabel:i,ylabel:s,legend:l,gridOn:c,imagescTrace:f,pcolorTraces:d,contourTraces:m,colormap:p,colormapData:v,axisMode:_,axisScale:g,barTraces:M,barhTraces:b,errorBarTraces:A,boxTraces:S,pieTrace:x,heatmapTrace:R,areaTraces:U,areaBaseValue:D,shading:G,colorbar:B,colorbarLocation:F,caxis:T}){const O=Fn.useRef(null),z=Fn.useRef(null),V=Fn.useCallback(()=>{const K=O.current;K&&gR(K,r,t,i,s,l,c,f,m,p,_,g,M,b,A,S,x,R,U,D,d,G,B,F,T,v)},[r,t,i,s,l,c,f,m,p,v,_,g,M,b,A,S,x,R,U,D,d,G,B,F,T]);return Fn.useEffect(()=>{const K=O.current,tt=z.current;if(!K||!tt)return;const ct=new ResizeObserver(()=>{const q=tt.getBoundingClientRect(),I=window.devicePixelRatio||1;K.width=q.width*I,K.height=q.height*I,K.style.width=`${q.width}px`,K.style.height=`${q.height}px`,V()});return ct.observe(tt),()=>ct.disconnect()},[V]),Qt.jsx("div",{ref:z,style:{width:"100%",height:"100%"},children:Qt.jsx("canvas",{ref:O,style:{display:"block"}})})}const Xx={holdOn:!1,traces:[],plot3Traces:[],surfTraces:[],pcolorTraces:[],contourTraces:[],barTraces:[],barhTraces:[],bar3Traces:[],bar3hTraces:[],errorBarTraces:[],boxTraces:[],areaTraces:[],areaBaseValue:0};function Yn(r){return r.axes[r.currentAxesIndex]||{...Xx}}function Wx(r,t){return{...r,axes:{...r.axes,[r.currentAxesIndex]:t}}}const qx={currentHandle:1,figs:{}},Yx={currentAxesIndex:1,axes:{}};function Dn(r){return r.figs[r.currentHandle]||{...Yx}}function ii(r,t){const i=Dn(r),s=Yn(i);return{...r,figs:{...r.figs,[r.currentHandle]:Wx(i,{...s,...t})}}}function In(r,t){const i=Dn(r),s=Yn(i),l=s.holdOn;return{...r,figs:{...r.figs,[r.currentHandle]:Wx(i,{...s,traces:t.traces??(l?s.traces:[]),plot3Traces:t.plot3Traces??(l?s.plot3Traces:[]),surfTraces:t.surfTraces??(l?s.surfTraces:[]),pcolorTraces:t.pcolorTraces??(l?s.pcolorTraces:[]),contourTraces:t.contourTraces??(l?s.contourTraces:[]),barTraces:t.barTraces??(l?s.barTraces:[]),barhTraces:t.barhTraces??(l?s.barhTraces:[]),bar3Traces:t.bar3Traces??(l?s.bar3Traces:[]),bar3hTraces:t.bar3hTraces??(l?s.bar3hTraces:[]),errorBarTraces:t.errorBarTraces??(l?s.errorBarTraces:[]),boxTraces:t.boxTraces??(l?s.boxTraces:[]),pieTrace:t.pieTrace??(l?s.pieTrace:void 0),heatmapTrace:t.heatmapTrace??(l?s.heatmapTrace:void 0),areaTraces:t.areaTraces??(l?s.areaTraces:[]),areaBaseValue:t.areaBaseValue??s.areaBaseValue,...t.imagescTrace!==void 0?{imagescTrace:t.imagescTrace}:{}})}}}const DR=(r,t)=>{switch(t.type){case"set_figure_handle":return{...r,currentHandle:t.handle};case"set_hold":return ii(r,{holdOn:t.value});case"plot":{const i=Yn(Dn(r));return In(r,{traces:i.holdOn?[...i.traces,...t.traces]:[...t.traces]})}case"plot3":{const i=Yn(Dn(r));return In(r,{plot3Traces:i.holdOn?[...i.plot3Traces,...t.traces]:[...t.traces]})}case"surf":{const i=Yn(Dn(r));return In(r,{surfTraces:i.holdOn?[...i.surfTraces,t.trace]:[t.trace]})}case"imagesc":return In(r,{imagescTrace:t.trace});case"pcolor":{const i=Yn(Dn(r));return In(r,{pcolorTraces:i.holdOn?[...i.pcolorTraces,t.trace]:[t.trace]})}case"contour":{const i=Yn(Dn(r));return In(r,{contourTraces:i.holdOn?[...i.contourTraces,t.trace]:[t.trace]})}case"mesh":{const i=Yn(Dn(r));return In(r,{surfTraces:i.holdOn?[...i.surfTraces,t.trace]:[t.trace]})}case"bar":{const i=Yn(Dn(r));return In(r,{barTraces:i.holdOn?[...i.barTraces,...t.traces]:[...t.traces]})}case"barh":{const i=Yn(Dn(r));return In(r,{barhTraces:i.holdOn?[...i.barhTraces,...t.traces]:[...t.traces]})}case"bar3":{const i=Yn(Dn(r));return In(r,{bar3Traces:i.holdOn?[...i.bar3Traces,t.trace]:[t.trace]})}case"bar3h":{const i=Yn(Dn(r));return In(r,{bar3hTraces:i.holdOn?[...i.bar3hTraces,t.trace]:[t.trace]})}case"errorbar":{const i=Yn(Dn(r));return In(r,{errorBarTraces:i.holdOn?[...i.errorBarTraces,...t.traces]:[...t.traces]})}case"boxchart":{const i=Yn(Dn(r));return In(r,{boxTraces:i.holdOn?[...i.boxTraces,...t.traces]:[...t.traces]})}case"piechart":return In(r,{pieTrace:t.trace});case"heatmap":return In(r,{heatmapTrace:t.trace});case"area":{const i=Yn(Dn(r));return In(r,{areaTraces:i.holdOn?[...i.areaTraces,...t.traces]:[...t.traces],areaBaseValue:t.baseValue})}case"close":{const i=Object.fromEntries(Object.entries(r.figs).filter(([l])=>Number(l)!==r.currentHandle)),s=Object.keys(i).map(Number).sort((l,c)=>l-c);return{...r,currentHandle:s.length>0?s[s.length-1]:1,figs:i}}case"close_all":case"clear":return qx;case"set_title":return ii(r,{title:t.text});case"set_xlabel":return ii(r,{xlabel:t.text});case"set_ylabel":return ii(r,{ylabel:t.text});case"set_zlabel":return ii(r,{zlabel:t.text});case"set_shading":return ii(r,{shading:t.shading});case"set_legend":return ii(r,{legend:t.labels});case"set_sgtitle":{const i=Dn(r);return{...r,figs:{...r.figs,[r.currentHandle]:{...i,sgtitle:t.text}}}}case"set_grid":return ii(r,{gridOn:t.value});case"set_colorbar":return ii(r,{colorbar:t.value!=="off",colorbarLocation:t.location??"eastoutside"});case"set_colormap":return ii(r,{colormap:t.name,colormapData:t.data});case"set_view":return ii(r,{view:{az:t.az,el:t.el}});case"set_axis":return ii(r,{axisMode:t.value});case"set_axis_scale":return ii(r,{axisScale:t.value});case"set_caxis":return ii(r,{caxis:t.limits});case"clf":return r.figs[r.currentHandle]?{...r,figs:{...r.figs,[r.currentHandle]:{...Yx}}}:r;case"set_subplot":{const s={...Dn(r),subplotGrid:{rows:t.rows,cols:t.cols},currentAxesIndex:t.index};return s.axes[t.index]||(s.axes={...s.axes,[t.index]:{...Xx}}),{...r,figs:{...r.figs,[r.currentHandle]:s}}}default:return r}};function _i(r){for(let t=0;t<r.length;t++)r[t]===null&&(r[t]=NaN)}function UR(r){if(r.type==="plot")for(const t of r.traces)_i(t.x),_i(t.y);else if(r.type==="plot3")for(const t of r.traces)_i(t.x),_i(t.y),_i(t.z);else r.type==="surf"||r.type==="mesh"?(_i(r.trace.x),_i(r.trace.y),_i(r.trace.z),r.trace.c&&_i(r.trace.c)):r.type==="imagesc"?_i(r.trace.z):r.type==="contour"&&(_i(r.trace.x),_i(r.trace.y),_i(r.trace.z))}function LR(){const[r,t]=Fn.useReducer(DR,qx),[i,s]=Fn.useState(!1),[l,c]=Fn.useState(1),f=Fn.useRef(l),d=Fn.useCallback(_=>{t(_),_.type==="set_figure_handle"?(f.current=_.handle,c(_.handle)):_.type==="close_all"&&(f.current=1,c(1))},[]),m=(()=>{if(r.figs[l])return l;const _=Object.keys(r.figs).map(Number);return _.length===0?l:_.sort((M,b)=>M-b)[_.length-1]})();Fn.useEffect(()=>{const _=new EventSource("/events");return _.onmessage=g=>{const M=JSON.parse(g.data);for(const b of M)UR(b),d(b)},_.addEventListener("done",()=>{s(!0)}),()=>_.close()},[d]);const p=Object.keys(r.figs).map(Number).sort((_,g)=>_-g),v=r.figs[m];return Qt.jsxs("div",{style:{display:"flex",flexDirection:"column",height:"100vh"},children:[p.length>1&&Qt.jsx("div",{style:NR,children:p.map(_=>Qt.jsxs("button",{onClick:()=>c(_),style:_===m?OR:jx,children:["Figure ",_]},_))}),Qt.jsx("div",{style:{flex:1,position:"relative"},children:v?Qt.jsx("div",{style:{position:"absolute",inset:0},children:Qt.jsx(CR,{figure:v})}):Qt.jsx("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",height:"100%",color:"#999",fontFamily:"sans-serif"},children:"Waiting for plot data..."})}),Qt.jsx("div",{style:PR,children:i?"Script complete. Press Ctrl+C in terminal to exit.":"Running..."})]})}const NR={display:"flex",gap:2,padding:"4px 8px",background:"#f0f0f0",borderBottom:"1px solid #ccc"},jx={padding:"4px 12px",border:"1px solid #ccc",borderBottom:"none",background:"#e0e0e0",cursor:"pointer",fontFamily:"sans-serif",fontSize:13,borderRadius:"4px 4px 0 0"},OR={...jx,background:"#fff",fontWeight:"bold"},PR={padding:"4px 12px",background:"#f5f5f5",borderTop:"1px solid #ddd",fontSize:12,fontFamily:"sans-serif",color:"#666"};lM.createRoot(document.getElementById("root")).render(Qt.jsx(Fn.StrictMode,{children:Qt.jsx(LR,{})}));
4426
+ `};class Qp extends qi{constructor(t){super({type:"LineMaterial",uniforms:Zp.clone(ai.line.uniforms),vertexShader:ai.line.vertexShader,fragmentShader:ai.line.fragmentShader,clipping:!0}),this.isLineMaterial=!0,this.setValues(t)}get color(){return this.uniforms.diffuse.value}set color(t){this.uniforms.diffuse.value=t}get worldUnits(){return"WORLD_UNITS"in this.defines}set worldUnits(t){t===!0!==this.worldUnits&&(this.needsUpdate=!0),t===!0?this.defines.WORLD_UNITS="":delete this.defines.WORLD_UNITS}get linewidth(){return this.uniforms.linewidth.value}set linewidth(t){this.uniforms.linewidth&&(this.uniforms.linewidth.value=t)}get dashed(){return"USE_DASH"in this.defines}set dashed(t){t===!0!==this.dashed&&(this.needsUpdate=!0),t===!0?this.defines.USE_DASH="":delete this.defines.USE_DASH}get dashScale(){return this.uniforms.dashScale.value}set dashScale(t){this.uniforms.dashScale.value=t}get dashSize(){return this.uniforms.dashSize.value}set dashSize(t){this.uniforms.dashSize.value=t}get dashOffset(){return this.uniforms.dashOffset.value}set dashOffset(t){this.uniforms.dashOffset.value=t}get gapSize(){return this.uniforms.gapSize.value}set gapSize(t){this.uniforms.gapSize.value=t}get opacity(){return this.uniforms.opacity.value}set opacity(t){this.uniforms&&(this.uniforms.opacity.value=t)}get resolution(){return this.uniforms.resolution.value}set resolution(t){this.uniforms.resolution.value.copy(t)}get alphaToCoverage(){return"USE_ALPHA_TO_COVERAGE"in this.defines}set alphaToCoverage(t){this.defines&&(t===!0!==this.alphaToCoverage&&(this.needsUpdate=!0),t===!0?this.defines.USE_ALPHA_TO_COVERAGE="":delete this.defines.USE_ALPHA_TO_COVERAGE)}}const Od=new je,Yv=new J,jv=new J,Cn=new je,wn=new je,ta=new je,Pd=new J,zd=new tn,Un=new Zb,Zv=new J,mu=new Ts,gu=new po,ea=new je;let na,er;function Kv(r,t,i){return ea.set(0,0,-t,1).applyMatrix4(r.projectionMatrix),ea.multiplyScalar(1/ea.w),ea.x=er/i.width,ea.y=er/i.height,ea.applyMatrix4(r.projectionMatrixInverse),ea.multiplyScalar(1/ea.w),Math.abs(Math.max(ea.x,ea.y))}function sR(r,t){const i=r.matrixWorld,s=r.geometry,l=s.attributes.instanceStart,c=s.attributes.instanceEnd,f=Math.min(s.instanceCount,l.count);for(let d=0,m=f;d<m;d++){Un.start.fromBufferAttribute(l,d),Un.end.fromBufferAttribute(c,d),Un.applyMatrix4(i);const p=new J,v=new J;na.distanceSqToSegment(Un.start,Un.end,v,p),v.distanceTo(p)<er*.5&&t.push({point:v,pointOnLine:p,distance:na.origin.distanceTo(v),object:r,face:null,faceIndex:d,uv:null,uv1:null})}}function rR(r,t,i){const s=t.projectionMatrix,c=r.material.resolution,f=r.matrixWorld,d=r.geometry,m=d.attributes.instanceStart,p=d.attributes.instanceEnd,v=Math.min(d.instanceCount,m.count),_=-t.near;na.at(1,ta),ta.w=1,ta.applyMatrix4(t.matrixWorldInverse),ta.applyMatrix4(s),ta.multiplyScalar(1/ta.w),ta.x*=c.x/2,ta.y*=c.y/2,ta.z=0,Pd.copy(ta),zd.multiplyMatrices(t.matrixWorldInverse,f);for(let g=0,M=v;g<M;g++){if(Cn.fromBufferAttribute(m,g),wn.fromBufferAttribute(p,g),Cn.w=1,wn.w=1,Cn.applyMatrix4(zd),wn.applyMatrix4(zd),Cn.z>_&&wn.z>_)continue;if(Cn.z>_){const U=Cn.z-wn.z,D=(Cn.z-_)/U;Cn.lerp(wn,D)}else if(wn.z>_){const U=wn.z-Cn.z,D=(wn.z-_)/U;wn.lerp(Cn,D)}Cn.applyMatrix4(s),wn.applyMatrix4(s),Cn.multiplyScalar(1/Cn.w),wn.multiplyScalar(1/wn.w),Cn.x*=c.x/2,Cn.y*=c.y/2,wn.x*=c.x/2,wn.y*=c.y/2,Un.start.copy(Cn),Un.start.z=0,Un.end.copy(wn),Un.end.z=0;const A=Un.closestPointToPointParameter(Pd,!0);Un.at(A,Zv);const S=bx.lerp(Cn.z,wn.z,A),x=S>=-1&&S<=1,R=Pd.distanceTo(Zv)<er*.5;if(x&&R){Un.start.fromBufferAttribute(m,g),Un.end.fromBufferAttribute(p,g),Un.start.applyMatrix4(f),Un.end.applyMatrix4(f);const U=new J,D=new J;na.distanceSqToSegment(Un.start,Un.end,D,U),i.push({point:D,pointOnLine:U,distance:na.origin.distanceTo(D),object:r,face:null,faceIndex:g,uv:null,uv1:null})}}}class oR extends jn{constructor(t=new Gx,i=new Qp({color:Math.random()*16777215})){super(t,i),this.isLineSegments2=!0,this.type="LineSegments2"}computeLineDistances(){const t=this.geometry,i=t.attributes.instanceStart,s=t.attributes.instanceEnd,l=new Float32Array(2*i.count);for(let f=0,d=0,m=i.count;f<m;f++,d+=2)Yv.fromBufferAttribute(i,f),jv.fromBufferAttribute(s,f),l[d]=d===0?0:l[d-1],l[d+1]=l[d]+Yv.distanceTo(jv);const c=new Rp(l,2,1);return t.setAttribute("instanceDistanceStart",new Ss(c,1,0)),t.setAttribute("instanceDistanceEnd",new Ss(c,1,1)),this}raycast(t,i){const s=this.material.worldUnits,l=t.camera;l===null&&!s&&console.error('LineSegments2: "Raycaster.camera" needs to be set in order to raycast against LineSegments2 while worldUnits is set to false.');const c=t.params.Line2!==void 0&&t.params.Line2.threshold||0;na=t.ray;const f=this.matrixWorld,d=this.geometry,m=this.material;er=m.linewidth+c,d.boundingSphere===null&&d.computeBoundingSphere(),gu.copy(d.boundingSphere).applyMatrix4(f);let p;if(s)p=er*.5;else{const _=Math.max(l.near,gu.distanceToPoint(na.origin));p=Kv(l,_,m.resolution)}if(gu.radius+=p,na.intersectsSphere(gu)===!1)return;d.boundingBox===null&&d.computeBoundingBox(),mu.copy(d.boundingBox).applyMatrix4(f);let v;if(s)v=er*.5;else{const _=Math.max(l.near,mu.distanceToPoint(na.origin));v=Kv(l,_,m.resolution)}mu.expandByScalar(v),na.intersectsBox(mu)!==!1&&(s?sR(this,i):rR(this,l,i))}onBeforeRender(t){const i=this.material.uniforms;i&&i.resolution&&(t.getViewport(Od),this.material.uniforms.resolution.value.set(Od.z,Od.w))}}class Vx extends Gx{constructor(){super(),this.isLineGeometry=!0,this.type="LineGeometry"}setPositions(t){const i=t.length-3,s=new Float32Array(2*i);for(let l=0;l<i;l+=3)s[2*l]=t[l],s[2*l+1]=t[l+1],s[2*l+2]=t[l+2],s[2*l+3]=t[l+3],s[2*l+4]=t[l+4],s[2*l+5]=t[l+5];return super.setPositions(s),this}setColors(t){const i=t.length-3,s=new Float32Array(2*i);for(let l=0;l<i;l+=3)s[2*l]=t[l],s[2*l+1]=t[l+1],s[2*l+2]=t[l+2],s[2*l+3]=t[l+3],s[2*l+4]=t[l+4],s[2*l+5]=t[l+5];return super.setColors(s),this}setFromPoints(t){const i=t.length-1,s=new Float32Array(6*i);for(let l=0;l<i;l++)s[6*l]=t[l].x,s[6*l+1]=t[l].y,s[6*l+2]=t[l].z||0,s[6*l+3]=t[l+1].x,s[6*l+4]=t[l+1].y,s[6*l+5]=t[l+1].z||0;return super.setPositions(s),this}fromLine(t){const i=t.geometry;return this.setPositions(i.attributes.position.array),this}}class lR extends oR{constructor(t=new Vx,i=new Qp({color:Math.random()*16777215})){super(t,i),this.isLine2=!0,this.type="Line2"}}const Gi=[[.2422,.1504,.6603],[.281,.3228,.9579],[.1786,.5289,.9682],[.0689,.6948,.8394],[.128,.789,.5927],[.3391,.849,.3798],[.633,.8518,.2091],[.8902,.8044,.1137],[.9905,.6816,.0235],[.9763,.517,.034]];function Cu(r){const t=Number.isFinite(r)?r:0,s=Math.max(0,Math.min(1,t))*(Gi.length-1),l=Math.floor(s),c=Math.min(l+1,Gi.length-1),f=s-l;return[Gi[l][0]+f*(Gi[c][0]-Gi[l][0]),Gi[l][1]+f*(Gi[c][1]-Gi[l][1]),Gi[l][2]+f*(Gi[c][2]-Gi[l][2])]}const Qv=[[0,.447,.741],[.85,.325,.098],[.929,.694,.125],[.494,.184,.556],[.466,.674,.188],[.301,.745,.933],[.635,.078,.184]];function cR({surfTraces:r,plot3Traces:t=[],bar3Traces:i=[],bar3hTraces:s=[],shading:l,colorbar:c,colorbarLocation:f,colormap:d}){const m=Fn.useRef(null),p=Fn.useRef(null);Fn.useEffect(()=>{const M=m.current;if(!M)return;const b=new X2({antialias:!0});b.setPixelRatio(window.devicePixelRatio),b.setClearColor(16777215),M.appendChild(b.domElement);const A=new Sb,S=new Bu(-1,1,1,-1,.01,100);S.position.set(1.2,.8,1.2),S.lookAt(0,0,0);const x=new q2(S,b.domElement);x.enablePan=!1,x.enableZoom=!0,A.add(new kb(16777215,.6));const R=new Vb(16777215,.6);R.position.set(2,3,2),A.add(R);const U=requestAnimationFrame(function G(){x.update(),b.render(A,S),p.current.animId=requestAnimationFrame(G)});p.current={renderer:b,scene:A,camera:S,controls:x,animId:U};const D=new ResizeObserver(()=>{const G=M.getBoundingClientRect();if(G.width===0||G.height===0)return;b.setSize(G.width,G.height);const B=G.width/G.height,F=1.2;S.left=-F*B,S.right=F*B,S.top=F,S.bottom=-F,S.updateProjectionMatrix()});return D.observe(M),()=>{D.disconnect(),cancelAnimationFrame(p.current?.animId??U),x.dispose(),b.dispose(),M.removeChild(b.domElement),p.current=null}},[]),Fn.useEffect(()=>{const M=p.current;if(!M)return;const{scene:b}=M,A=[];b.traverse(vt=>{(vt instanceof jn||vt instanceof iu||vt instanceof zu)&&A.push(vt)});for(const vt of A)b.remove(vt),vt.geometry&&vt.geometry.dispose();if(r.length===0&&t.length===0&&i.length===0&&s.length===0)return;let S=1/0,x=-1/0,R=1/0,U=-1/0,D=1/0,G=-1/0;const B=(vt,j,ft)=>{for(const yt of vt)isFinite(yt)&&(yt<j.v&&(j.v=yt),yt>ft.v&&(ft.v=yt))},F={v:S},T={v:x},O={v:R},z={v:U},V={v:D},K={v:G};for(const vt of r)B(vt.x,F,T),B(vt.y,O,z),B(vt.z,V,K);for(const vt of t)B(vt.x,F,T),B(vt.y,O,z),B(vt.z,V,K);for(const vt of i)B(vt.x,F,T),B(vt.y,O,z),B(vt.z,V,K),0<V.v&&(V.v=0);for(const vt of s)B(vt.y,O,z),B(vt.z,V,K),B(vt.x,F,T),0<F.v&&(F.v=0);if(S=F.v,x=T.v,R=O.v,U=z.v,D=V.v,G=K.v,!isFinite(S))return;x===S&&(S-=1,x+=1),U===R&&(R-=1,U+=1),G===D&&(D-=1,G+=1);const tt=x-S||1,ct=U-R||1,q=G-D||1,I=Math.max(tt,ct,q),H=(S+x)/2,st=(R+U)/2,ht=(D+G)/2,Ct=r.length===0&&t.length===0&&(i.length>0||s.length>0),P=Ct?Math.max(tt,ct):I,k=(vt,j)=>(vt-j)/P,et=(vt,j)=>(vt-j)/(Ct?Math.max(P,q):I),pt=(vt,j)=>(vt-j)/I;for(const vt of r){const{rows:j,cols:ft,x:yt,y:Pt,z:Ht}=vt,Ft=G-D||1,ce=vt.faceAlpha??1,It=new Float32Array(j*ft*3),Nt=new Float32Array(j*ft*3);for(let bt=0;bt<ft;bt++)for(let xt=0;xt<j;xt++){const N=bt*j+xt,E=xt*ft+bt,X=pt(yt[N],H),it=pt(Pt[N],st),dt=pt(Ht[N],ht);It[E*3]=X,It[E*3+1]=dt,It[E*3+2]=it;const nt=vt.c?(vt.c[N]-D)/Ft:(Ht[N]-D)/Ft,[kt,Lt,ee]=Cu(nt);Nt[E*3]=kt,Nt[E*3+1]=Lt,Nt[E*3+2]=ee}const le=[];for(let bt=0;bt<j-1;bt++)for(let xt=0;xt<ft-1;xt++){const N=bt*ft+xt,E=bt*ft+(xt+1),X=(bt+1)*ft+xt,it=(bt+1)*ft+(xt+1);le.push(N,X,E),le.push(E,X,it)}const ie=new bn;ie.setAttribute("position",new xi(It,3)),ie.setAttribute("color",new xi(Nt,3)),ie.setIndex(le),ie.computeVertexNormals();const mt=l??"faceted",C=mt==="faceted"||mt==="flat";if(vt.faceColor!=="none"){let bt;if(Array.isArray(vt.faceColor)){const[xt,N,E]=vt.faceColor;bt=new ou({color:new Ee(xt,N,E),flatShading:C,opacity:ce,transparent:ce<1,side:ki})}else bt=new ou({vertexColors:!0,flatShading:C,opacity:ce,transparent:ce<1,side:ki});b.add(new jn(ie,bt))}if(vt.edgeColor!=="none"&&mt==="faceted"){const bt=[],xt=[];for(let X=0;X<j;X++)for(let it=0;it<ft;it++){const dt=X*ft+it;if(it<ft-1){const nt=X*ft+(it+1);bt.push(It[dt*3],It[dt*3+1],It[dt*3+2],It[nt*3],It[nt*3+1],It[nt*3+2]),xt.push(Nt[dt*3],Nt[dt*3+1],Nt[dt*3+2],Nt[nt*3],Nt[nt*3+1],Nt[nt*3+2])}if(X<j-1){const nt=(X+1)*ft+it;bt.push(It[dt*3],It[dt*3+1],It[dt*3+2],It[nt*3],It[nt*3+1],It[nt*3+2]),xt.push(Nt[dt*3],Nt[dt*3+1],Nt[dt*3+2],Nt[nt*3],Nt[nt*3+1],Nt[nt*3+2])}}const N=new bn;N.setAttribute("position",new vn(bt,3));let E;if(Array.isArray(vt.edgeColor)){const[X,it,dt]=vt.edgeColor;E=new tr({color:new Ee(X,it,dt)})}else E=new tr({color:0,opacity:.3,transparent:!0});b.add(new iu(N,E))}}for(let vt=0;vt<t.length;vt++){const j=t[vt],{x:ft,y:yt,z:Pt}=j,Ht=Qv[vt%Qv.length],Ft=j.color??Ht,ce=new Ee(Ft[0],Ft[1],Ft[2]);if(j.lineStyle!=="none"){const Nt=[];let le=[];for(let C=0;C<ft.length;C++)if(isFinite(ft[C])&&isFinite(yt[C])&&isFinite(Pt[C])){const Mt=pt(ft[C],H),Tt=pt(yt[C],st),bt=pt(Pt[C],ht);le.push(new J(Mt,bt,Tt))}else le.length>0&&(Nt.push(le),le=[]);le.length>0&&Nt.push(le);const ie=j.lineWidth??2,mt=j.lineStyle==="--"||j.lineStyle===":"||j.lineStyle==="-.";for(const C of Nt){if(C.length<2)continue;const Mt=[];for(const Tt of C)Mt.push(Tt.x,Tt.y,Tt.z);if(mt){const Tt=new Bb({color:ce,linewidth:ie,dashSize:j.lineStyle===":"?.01:.03,gapSize:j.lineStyle===":"?.02:.015}),bt=new bn().setFromPoints(C),xt=new zu(bt,Tt);xt.computeLineDistances(),b.add(xt)}else{const Tt=new Vx;Tt.setPositions(Mt);const bt=new Qp({color:ce.getHex(),linewidth:ie,worldUnits:!1,resolution:new ge(M.renderer.domElement.width||800,M.renderer.domElement.height||600)});b.add(new lR(Tt,bt))}}}if(j.marker&&j.marker!=="none"){const Nt=(j.markerSize??6)/600,le=j.markerEdgeColor?new Ee(j.markerEdgeColor[0],j.markerEdgeColor[1],j.markerEdgeColor[2]):ce,ie=j.markerIndices?j.markerIndices.map(Mt=>Mt-1):Array.from({length:ft.length},(Mt,Tt)=>Tt),mt=new jp(Nt,8,8),C=new qp({color:le});for(const Mt of ie){if(Mt<0||Mt>=ft.length||!isFinite(ft[Mt])||!isFinite(yt[Mt])||!isFinite(Pt[Mt]))continue;const Tt=pt(ft[Mt],H),bt=pt(yt[Mt],st),xt=pt(Pt[Mt],ht),N=new jn(mt,C);N.position.set(Tt,xt,bt),b.add(N)}}}for(const vt of i){const j=vt.width/2*.9,ft=G-D||1;for(let yt=0;yt<vt.x.length;yt++){const Pt=vt.x[yt],Ht=vt.y[yt],Ft=vt.z[yt];if(!isFinite(Ft))continue;const ce=Math.abs(et(Ft,ht)-et(0,ht)),It=(et(Ft,ht)+et(0,ht))/2,Nt=new ir(j*2/P,ce,j*2/P),le=(Ft-D)/ft,[ie,mt,C]=vt.color??Cu(le),Mt=new ou({color:new Ee(ie,mt,C)}),Tt=new jn(Nt,Mt);Tt.position.set(k(Pt,H),It,k(Ht,st)),b.add(Tt);const bt=new hv(Nt),xt=new tr({color:0,opacity:.3,transparent:!0}),N=new iu(bt,xt);N.position.copy(Tt.position),b.add(N)}}for(const vt of s){const j=vt.width/2*.9,ft=x-S||1;for(let yt=0;yt<vt.x.length;yt++){const Pt=vt.y[yt],Ht=vt.x[yt],Ft=vt.z[yt];if(!isFinite(Ft))continue;const ce=Math.abs(k(Ft,H)-k(0,H)),It=(k(Ft,H)+k(0,H))/2,Nt=new ir(ce,j*2/P,j*2/P),le=(Ft-S)/ft,[ie,mt,C]=vt.color??Cu(le),Mt=new ou({color:new Ee(ie,mt,C)}),Tt=new jn(Nt,Mt);Tt.position.set(It,k(Ht,ht),k(Pt,st)),b.add(Tt);const bt=new hv(Nt),xt=new tr({color:0,opacity:.3,transparent:!0}),N=new iu(bt,xt);N.position.copy(Tt.position),b.add(N)}}fR(b,S,x,R,U,D,G,I,H,st,ht)},[r,t,i,s,l]);let v=1/0,_=-1/0;for(const M of r){const b=M.c??M.z;for(const A of b)isFinite(A)&&(A<v&&(v=A),A>_&&(_=A))}if(!isFinite(v))for(const M of i)for(const b of M.z)isFinite(b)&&(b<v&&(v=b),b>_&&(_=b));const g=isFinite(v)&&isFinite(_);return v===_&&(v-=.5,_+=.5),Qt.jsxs("div",{style:{position:"relative",width:"100%",height:"100%"},children:[Qt.jsx("div",{ref:m,style:{position:"absolute",inset:0}}),c&&g&&Qt.jsx(uR,{location:(f??"eastoutside").toLowerCase(),dMin:v,dMax:_,colormap:d})]})}function uR({location:r,dMin:t,dMax:i,colormap:s}){const c=[];for(let g=0;g<32;g++){const M=g/31,[b,A,S]=Cu(M),x=`rgb(${Math.round(b*255)},${Math.round(A*255)},${Math.round(S*255)})`;c.push(`${x} ${(M*100).toFixed(2)}%`)}const d=r==="northoutside"||r==="southoutside"||r==="north"||r==="south"?`linear-gradient(to right, ${c.join(",")})`:`linear-gradient(to top, ${c.join(",")})`,m=g=>Number.isInteger(g)?String(g):g.toPrecision(3),p=16,v={position:"absolute",pointerEvents:"none",fontFamily:"sans-serif",fontSize:10,color:"#333"},_={background:d,border:"1px solid #999",boxSizing:"border-box"};switch(r){case"eastoutside":return Qt.jsxs("div",{style:{...v,top:12,bottom:12,right:8,width:50,display:"flex",alignItems:"stretch"},children:[Qt.jsx("div",{style:{..._,width:p,height:"100%"}}),Qt.jsxs("div",{style:{marginLeft:4,display:"flex",flexDirection:"column",justifyContent:"space-between"},children:[Qt.jsx("span",{children:m(i)}),Qt.jsx("span",{children:m(t)})]})]});case"westoutside":return Qt.jsxs("div",{style:{...v,top:12,bottom:12,left:8,width:50,display:"flex",alignItems:"stretch",flexDirection:"row-reverse"},children:[Qt.jsx("div",{style:{..._,width:p,height:"100%"}}),Qt.jsxs("div",{style:{marginRight:4,display:"flex",flexDirection:"column",justifyContent:"space-between",textAlign:"right"},children:[Qt.jsx("span",{children:m(i)}),Qt.jsx("span",{children:m(t)})]})]});case"northoutside":return Qt.jsxs("div",{style:{...v,left:12,right:12,top:8,height:32,display:"flex",flexDirection:"column"},children:[Qt.jsxs("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:2},children:[Qt.jsx("span",{children:m(t)}),Qt.jsx("span",{children:m(i)})]}),Qt.jsx("div",{style:{..._,height:p,width:"100%"}})]});case"southoutside":return Qt.jsxs("div",{style:{...v,left:12,right:12,bottom:8,height:32,display:"flex",flexDirection:"column-reverse"},children:[Qt.jsxs("div",{style:{display:"flex",justifyContent:"space-between",marginTop:2},children:[Qt.jsx("span",{children:m(t)}),Qt.jsx("span",{children:m(i)})]}),Qt.jsx("div",{style:{..._,height:p,width:"100%"}})]});case"east":return Qt.jsxs("div",{style:{...v,top:24,bottom:24,right:24,width:50,display:"flex",flexDirection:"row-reverse",alignItems:"stretch"},children:[Qt.jsx("div",{style:{..._,width:p,height:"100%"}}),Qt.jsxs("div",{style:{marginRight:4,display:"flex",flexDirection:"column",justifyContent:"space-between",textAlign:"right"},children:[Qt.jsx("span",{children:m(i)}),Qt.jsx("span",{children:m(t)})]})]});case"west":return Qt.jsxs("div",{style:{...v,top:24,bottom:24,left:24,width:50,display:"flex",alignItems:"stretch"},children:[Qt.jsx("div",{style:{..._,width:p,height:"100%"}}),Qt.jsxs("div",{style:{marginLeft:4,display:"flex",flexDirection:"column",justifyContent:"space-between"},children:[Qt.jsx("span",{children:m(i)}),Qt.jsx("span",{children:m(t)})]})]});case"north":return Qt.jsxs("div",{style:{...v,left:24,right:24,top:24,height:32,display:"flex",flexDirection:"column-reverse"},children:[Qt.jsxs("div",{style:{display:"flex",justifyContent:"space-between",marginTop:2},children:[Qt.jsx("span",{children:m(t)}),Qt.jsx("span",{children:m(i)})]}),Qt.jsx("div",{style:{..._,height:p,width:"100%"}})]});case"south":return Qt.jsxs("div",{style:{...v,left:24,right:24,bottom:24,height:32,display:"flex",flexDirection:"column"},children:[Qt.jsxs("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:2},children:[Qt.jsx("span",{children:m(t)}),Qt.jsx("span",{children:m(i)})]}),Qt.jsx("div",{style:{..._,height:p,width:"100%"}})]});default:return null}}function fR(r,t,i,s,l,c,f,d,m,p,v){const _=(b,A)=>(b-A)/d,g=[{from:[t,s,c],to:[i,s,c]},{from:[t,s,c],to:[t,l,c]},{from:[t,s,c],to:[t,s,f]}],M=new tr({color:3355443});for(const b of g){const A=[b.from,b.to].map(([x,R,U])=>{const D=_(x,m),G=_(R,p),B=_(U,v);return new J(D,B,G)}),S=new bn().setFromPoints(A);r.add(new zu(S,M))}}const Jv=["#0072BD","#D95319","#EDB120","#7E2F8E","#77AC30","#4DBEEE","#A2142F"];function Dp(r){return`rgb(${Math.round(r[0]*255)}, ${Math.round(r[1]*255)}, ${Math.round(r[2]*255)})`}function Up(r,t){return r.color?Dp(r.color):Jv[t%Jv.length]}function kx(r){switch(r){case"--":return[8,4];case":":return[2,4];case"-.":return[8,4,2,4];default:return[]}}function hR(r,t){const i=r/t,s=Math.pow(10,Math.floor(Math.log10(i))),l=i/s;let c;return l<=1.5?c=1:l<=3.5?c=2:l<=7.5?c=5:c=10,c*s}function _u(r,t,i){const s=hR(t-r,i),l=[],c=Math.ceil(r/s)*s;for(let f=c;f<=t+s*.001;f+=s)l.push(f);return l}function $v(r){return Math.abs(r)<1e-10?"0":Math.abs(r)>=1e4||Math.abs(r)<.01&&r!==0?r.toExponential(1):parseFloat(r.toPrecision(6)).toString()}function dR(r,t,i,s,l){if(!t.marker||t.marker==="none")return;const c=(t.markerSize??6)/2,f=t.markerEdgeColor?Dp(t.markerEdgeColor):l,d=t.markerFaceColor?Dp(t.markerFaceColor):void 0,m=t.markerIndices?t.markerIndices.map(p=>p-1):Array.from({length:t.x.length},(p,v)=>v);r.lineWidth=1.5;for(const p of m){if(p<0||p>=t.x.length)continue;const v=t.x[p],_=t.y[p];if(!isFinite(v)||!isFinite(_))continue;const g=i(v),M=s(_);pR(r,t.marker,g,M,c,f,d)}}function pR(r,t,i,s,l,c,f){switch(r.strokeStyle=c,r.fillStyle=f??"transparent",t){case"o":{r.beginPath(),r.arc(i,s,l,0,Math.PI*2),f&&r.fill(),r.stroke();break}case"+":{r.beginPath(),r.moveTo(i-l,s),r.lineTo(i+l,s),r.moveTo(i,s-l),r.lineTo(i,s+l),r.stroke();break}case"*":{r.beginPath();for(let d=0;d<6;d++){const m=d*Math.PI/3;r.moveTo(i,s),r.lineTo(i+l*Math.cos(m),s+l*Math.sin(m))}r.stroke();break}case".":{r.beginPath(),r.arc(i,s,Math.max(l/3,1.5),0,Math.PI*2),r.fillStyle=c,r.fill();break}case"x":{const d=l*.707;r.beginPath(),r.moveTo(i-d,s-d),r.lineTo(i+d,s+d),r.moveTo(i+d,s-d),r.lineTo(i-d,s+d),r.stroke();break}case"_":{r.beginPath(),r.moveTo(i-l,s),r.lineTo(i+l,s),r.stroke();break}case"|":{r.beginPath(),r.moveTo(i,s-l),r.lineTo(i,s+l),r.stroke();break}case"s":{r.beginPath(),r.rect(i-l,s-l,l*2,l*2),f&&r.fill(),r.stroke();break}case"d":{r.beginPath(),r.moveTo(i,s-l),r.lineTo(i+l,s),r.lineTo(i,s+l),r.lineTo(i-l,s),r.closePath(),f&&r.fill(),r.stroke();break}case"^":{vu(r,i,s,l,0,f);break}case"v":{vu(r,i,s,l,Math.PI,f);break}case"<":{vu(r,i,s,l,-Math.PI/2,f);break}case">":{vu(r,i,s,l,Math.PI/2,f);break}case"p":{tx(r,i,s,l,5,f);break}case"h":{tx(r,i,s,l,6,f);break}}}function vu(r,t,i,s,l,c){r.beginPath();for(let f=0;f<3;f++){const d=l-Math.PI/2+f*2*Math.PI/3,m=t+s*Math.cos(d),p=i+s*Math.sin(d);f===0?r.moveTo(m,p):r.lineTo(m,p)}r.closePath(),c&&r.fill(),r.stroke()}function tx(r,t,i,s,l,c){const f=s*.4;r.beginPath();for(let d=0;d<l*2;d++){const m=-Math.PI/2+d*Math.PI/l,p=d%2===0?s:f,v=t+p*Math.cos(m),_=i+p*Math.sin(m);d===0?r.moveTo(v,_):r.lineTo(v,_)}r.closePath(),c&&r.fill(),r.stroke()}function mR(r,t,i,s,l){r.font="11px sans-serif";let v=0;for(const A of i){const S=r.measureText(A).width;S>v&&(v=S)}const _=34+v+8,g=8+i.length*17+8,M=s-_-8,b=l+8;r.fillStyle="rgba(255,255,255,0.9)",r.fillRect(M,b,_,g),r.strokeStyle="#999",r.lineWidth=.5,r.strokeRect(M,b,_,g);for(let A=0;A<i.length;A++){const S=A<t.length?Up(t[A],A):"#333",x=A<t.length?t[A].lineWidth??2:2,R=A<t.length?t[A].lineStyle:void 0,U=b+8+A*17+17/2;r.strokeStyle=S,r.lineWidth=x,r.setLineDash(kx(R)),r.beginPath(),r.moveTo(M+8,U),r.lineTo(M+8+20,U),r.stroke(),r.setLineDash([]),r.fillStyle="#333",r.font="11px sans-serif",r.textAlign="left",r.textBaseline="middle",r.fillText(i[A],M+8+20+6,U)}}function xu(r,t){const i=Math.max(r,Number.MIN_VALUE),s=Math.max(t,Number.MIN_VALUE),l=Math.floor(Math.log10(i)),c=Math.ceil(Math.log10(s)),f=[];for(let d=l;d<=c;d++){const m=Math.pow(10,d);m>=i&&m<=s&&f.push(m)}if(f.length<3){for(let d=l;d<=c;d++)for(const m of[2,5]){const p=m*Math.pow(10,d);p>=i&&p<=s&&!f.includes(p)&&f.push(p)}f.sort((d,m)=>d-m)}return f}function ex(r){return r>=1&&r<1e6&&Number.isInteger(r)?r.toString():r.toExponential(0)}function gR(r,t,i,s,l,c,f,d,m,p,v,_,g,M,b,A,S,x,R,U,D,G,B,F,T,O){wu=O;const z=r.getContext("2d"),V=t.length>0||d!==void 0||D&&D.length>0||m&&m.length>0||g&&g.length>0||M&&M.length>0||b&&b.length>0||A&&A.length>0||S!==void 0||x!==void 0||R&&R.length>0;if(!z||!V)return;const K=window.devicePixelRatio||1,tt=r.width,ct=r.height;z.setTransform(K,0,0,K,0,0);const q=tt/K,I=ct/K;if(z.fillStyle="#fff",z.fillRect(0,0,q,I),S){bR(z,q,I,S,i);return}if(x){ER(z,q,I,x,i,p);return}const H={top:i?40:20,right:20,bottom:s?56:40,left:l?76:60},st=(F??"eastoutside").toLowerCase();B&&(st==="eastoutside"?H.right+=70:st==="westoutside"?H.left+=70:st==="northoutside"?H.top+=50:st==="southoutside"&&(H.bottom+=50));const ht=q-H.left-H.right,Ct=I-H.top-H.bottom;if(ht<=0||Ct<=0)return;let P=1/0,k=-1/0,et=1/0,pt=-1/0;for(const mt of t){for(const C of mt.x)isFinite(C)&&(C<P&&(P=C),C>k&&(k=C));for(const C of mt.y)isFinite(C)&&(C<et&&(et=C),C>pt&&(pt=C))}if(d&&(d.x[0]<P&&(P=d.x[0]),d.x[1]>k&&(k=d.x[1]),d.y[0]<et&&(et=d.y[0]),d.y[1]>pt&&(pt=d.y[1])),D)for(const mt of D){for(const C of mt.x)isFinite(C)&&(C<P&&(P=C),C>k&&(k=C));for(const C of mt.y)isFinite(C)&&(C<et&&(et=C),C>pt&&(pt=C))}if(m)for(const mt of m){for(const C of mt.x)isFinite(C)&&(C<P&&(P=C),C>k&&(k=C));for(const C of mt.y)isFinite(C)&&(C<et&&(et=C),C>pt&&(pt=C))}if(g)for(const mt of g){const C=mt.width/2;for(let Mt=0;Mt<mt.x.length;Mt++){const Tt=mt.x[Mt];isFinite(Tt)&&(Tt-C<P&&(P=Tt-C),Tt+C>k&&(k=Tt+C));const bt=mt.y[Mt];isFinite(bt)&&(bt<et&&(et=bt),bt>pt&&(pt=bt))}0<et&&(et=0),0>pt&&(pt=0)}if(M)for(const mt of M){const C=mt.width/2;for(let Mt=0;Mt<mt.x.length;Mt++){const Tt=mt.x[Mt];isFinite(Tt)&&(Tt-C<et&&(et=Tt-C),Tt+C>pt&&(pt=Tt+C));const bt=mt.y[Mt];isFinite(bt)&&(bt<P&&(P=bt),bt>k&&(k=bt))}0<P&&(P=0),0>k&&(k=0)}if(b)for(const mt of b)for(let C=0;C<mt.x.length;C++){const Mt=mt.x[C],Tt=mt.y[C];if(isFinite(Mt)){const bt=mt.xNeg?Mt-mt.xNeg[C]:Mt,xt=mt.xPos?Mt+mt.xPos[C]:Mt;bt<P&&(P=bt),xt>k&&(k=xt)}if(isFinite(Tt)){const bt=Tt-mt.yNeg[C],xt=Tt+mt.yPos[C];bt<et&&(et=bt),xt>pt&&(pt=xt)}}if(A)for(const mt of A){const C=mt.width/2;mt.x-C<P&&(P=mt.x-C),mt.x+C>k&&(k=mt.x+C),mt.whiskerLow<et&&(et=mt.whiskerLow),mt.whiskerHigh>pt&&(pt=mt.whiskerHigh);for(const Mt of mt.outliers)Mt<et&&(et=Mt),Mt>pt&&(pt=Mt)}if(R&&R.length>0){const mt=U??0;mt<et&&(et=mt),mt>pt&&(pt=mt);const C=R[0].x.length;for(let Mt=0;Mt<C;Mt++){let Tt=mt;for(const bt of R)if(Mt<bt.x.length){const xt=bt.x[Mt];isFinite(xt)&&(xt<P&&(P=xt),xt>k&&(k=xt)),Tt+=bt.y[Mt]-mt,isFinite(Tt)&&(Tt<et&&(et=Tt),Tt>pt&&(pt=Tt))}}}if(!isFinite(P))return;k===P&&(P-=1,k+=1),pt===et&&(et-=1,pt+=1);const vt=v?.includes("tight")??!1,j=v?.includes("equal")??!1,ft=_==="semilogx"||_==="loglog",yt=_==="semilogy"||_==="loglog";if(ft&&P<=0&&(P=k>0?k*1e-6:1),yt&&et<=0&&(et=pt>0?pt*1e-6:1),!vt){if(ft){const mt=(Math.log10(k)-Math.log10(P))*.05;P=Math.pow(10,Math.log10(P)-mt),k=Math.pow(10,Math.log10(k)+mt)}else{const mt=(k-P)*.05;P-=mt,k+=mt}if(yt){const mt=(Math.log10(pt)-Math.log10(et))*.05;et=Math.pow(10,Math.log10(et)-mt),pt=Math.pow(10,Math.log10(pt)+mt)}else{const mt=(pt-et)*.05;et-=mt,pt+=mt}}let Pt=ht,Ht=Ct,Ft=H.left,ce=H.top;if(j){const mt=k-P,C=pt-et,Mt=mt/ht,Tt=C/Ct;if(vt)Mt>Tt?(Ht=C/Mt,ce=H.top+(Ct-Ht)/2):(Pt=mt/Tt,Ft=H.left+(ht-Pt)/2);else if(Mt>Tt){const bt=Mt*Ct,xt=(et+pt)/2;et=xt-bt/2,pt=xt+bt/2}else{const bt=Tt*ht,xt=(P+k)/2;P=xt-bt/2,k=xt+bt/2}}const It=ft?mt=>{const C=Math.log10(Math.max(mt,Number.MIN_VALUE)),Mt=Math.log10(Math.max(P,Number.MIN_VALUE)),Tt=Math.log10(Math.max(k,Number.MIN_VALUE));return Ft+(C-Mt)/(Tt-Mt)*Pt}:mt=>Ft+(mt-P)/(k-P)*Pt,Nt=yt?mt=>{const C=Math.log10(Math.max(mt,Number.MIN_VALUE)),Mt=Math.log10(Math.max(et,Number.MIN_VALUE)),Tt=Math.log10(Math.max(pt,Number.MIN_VALUE));return ce+Ht-(C-Mt)/(Tt-Mt)*Ht}:mt=>ce+Ht-(mt-et)/(pt-et)*Ht;if(f!==!1){z.strokeStyle="#ddd",z.lineWidth=.5;const mt=ft?xu(P,k):_u(P,k,Math.max(3,Math.floor(Pt/80))),C=yt?xu(et,pt):_u(et,pt,Math.max(3,Math.floor(Ht/50)));for(const Mt of mt){const Tt=It(Mt);z.beginPath(),z.moveTo(Tt,ce),z.lineTo(Tt,ce+Ht),z.stroke()}for(const Mt of C){const Tt=Nt(Mt);z.beginPath(),z.moveTo(Ft,Tt),z.lineTo(Ft+Pt,Tt),z.stroke()}}z.strokeStyle="#333",z.lineWidth=1,z.strokeRect(Ft,ce,Pt,Ht);const le=ft?xu(P,k):_u(P,k,Math.max(3,Math.floor(Pt/80))),ie=yt?xu(et,pt):_u(et,pt,Math.max(3,Math.floor(Ht/50)));z.fillStyle="#333",z.font="11px monospace",z.textAlign="center",z.textBaseline="top";for(const mt of le)z.fillText(ft?ex(mt):$v(mt),It(mt),ce+Ht+5);z.textAlign="right",z.textBaseline="middle";for(const mt of ie)z.fillText(yt?ex(mt):$v(mt),Ft-5,Nt(mt));if(z.fillStyle="#222",i&&(z.font="bold 13px sans-serif",z.textAlign="center",z.textBaseline="middle",z.fillText(i,Ft+Pt/2,ce/2)),s&&(z.font="12px sans-serif",z.textAlign="center",z.textBaseline="bottom",z.fillText(s,Ft+Pt/2,I-4)),l&&(z.font="12px sans-serif",z.textAlign="center",z.textBaseline="middle",z.save(),z.translate(14,ce+Ht/2),z.rotate(-Math.PI/2),z.fillText(l,0,0),z.restore()),z.save(),z.beginPath(),z.rect(Ft,ce,Pt,Ht),z.clip(),d&&SR(z,d,It,Nt,p),D)for(const mt of D)TR(z,mt,It,Nt,p,G,T);if(m)for(const mt of m)yR(z,mt,It,Nt,p);if(g){const mt=[[0,.447,.741],[.85,.325,.098],[.929,.694,.125],[.494,.184,.556],[.466,.674,.188]];for(let C=0;C<g.length;C++){const Mt=g[C],[Tt,bt,xt]=Mt.color??mt[C%mt.length];z.fillStyle=`rgb(${Math.round(Tt*255)},${Math.round(bt*255)},${Math.round(xt*255)})`,z.strokeStyle=`rgb(${Math.round(Tt*180)},${Math.round(bt*180)},${Math.round(xt*180)})`,z.lineWidth=1;const N=Nt(0);for(let E=0;E<Mt.x.length;E++){const X=It(Mt.x[E]),it=Nt(Mt.y[E]),dt=(It(Mt.x[E]+Mt.width)-It(Mt.x[E]))/2;z.fillRect(X-dt,Math.min(it,N),dt*2,Math.abs(it-N)),z.strokeRect(X-dt,Math.min(it,N),dt*2,Math.abs(it-N))}}}if(M){const mt=[[0,.447,.741],[.85,.325,.098],[.929,.694,.125],[.494,.184,.556],[.466,.674,.188]];for(let C=0;C<M.length;C++){const Mt=M[C],[Tt,bt,xt]=Mt.color??mt[C%mt.length];z.fillStyle=`rgb(${Math.round(Tt*255)},${Math.round(bt*255)},${Math.round(xt*255)})`,z.strokeStyle=`rgb(${Math.round(Tt*180)},${Math.round(bt*180)},${Math.round(xt*180)})`,z.lineWidth=1;const N=It(0);for(let E=0;E<Mt.x.length;E++){const X=Nt(Mt.x[E]),it=It(Mt.y[E]),dt=(Nt(Mt.x[E]-Mt.width)-Nt(Mt.x[E]))/2;z.fillRect(Math.min(N,it),X-dt,Math.abs(it-N),dt*2),z.strokeRect(Math.min(N,it),X-dt,Math.abs(it-N),dt*2)}}}if(A){const mt=[[0,.447,.741],[.85,.325,.098],[.929,.694,.125],[.494,.184,.556],[.466,.674,.188]];for(let C=0;C<A.length;C++){const Mt=A[C],[Tt,bt,xt]=Mt.color??mt[C%mt.length],N=`rgba(${Math.round(Tt*255)},${Math.round(bt*255)},${Math.round(xt*255)},0.3)`,E=`rgb(${Math.round(Tt*255)},${Math.round(bt*255)},${Math.round(xt*255)})`,X=It(Mt.x),it=Math.abs(It(Mt.x+Mt.width)-It(Mt.x))/2,dt=Nt(Mt.q1),nt=Nt(Mt.q3),kt=Nt(Mt.median),Lt=Nt(Mt.whiskerLow),ee=Nt(Mt.whiskerHigh);z.fillStyle=N,z.fillRect(X-it,Math.min(dt,nt),it*2,Math.abs(nt-dt)),z.strokeStyle=E,z.lineWidth=1.5,z.strokeRect(X-it,Math.min(dt,nt),it*2,Math.abs(nt-dt)),z.lineWidth=2,z.beginPath(),z.moveTo(X-it,kt),z.lineTo(X+it,kt),z.stroke(),z.lineWidth=1,z.setLineDash([4,2]),z.beginPath(),z.moveTo(X,nt),z.lineTo(X,ee),z.moveTo(X,dt),z.lineTo(X,Lt),z.stroke(),z.setLineDash([]);const se=it*.5;z.beginPath(),z.moveTo(X-se,ee),z.lineTo(X+se,ee),z.moveTo(X-se,Lt),z.lineTo(X+se,Lt),z.stroke(),z.fillStyle=E;for(const Dt of Mt.outliers){const wt=Nt(Dt);z.beginPath(),z.arc(X,wt,3,0,Math.PI*2),z.fill()}}}if(R&&R.length>0){const mt=U??0,C=[[0,.447,.741],[.85,.325,.098],[.929,.694,.125],[.494,.184,.556],[.466,.674,.188],[.301,.745,.933],[.635,.078,.184]],Mt=R[0].x.length,Tt=[],bt=[];let xt=new Array(Mt).fill(mt);for(let N=0;N<R.length;N++){const E=R[N];Tt.push([...xt]);const X=[];for(let it=0;it<Mt;it++)X.push(xt[it]+(it<E.y.length?E.y[it]-mt:0));bt.push(X),xt=X}for(let N=R.length-1;N>=0;N--){const E=R[N],[X,it,dt]=E.color??C[N%C.length];z.fillStyle=`rgba(${Math.round(X*255)},${Math.round(it*255)},${Math.round(dt*255)},0.6)`,z.beginPath();for(let nt=0;nt<Mt;nt++){const kt=It(E.x[nt]),Lt=Nt(bt[N][nt]);nt===0?z.moveTo(kt,Lt):z.lineTo(kt,Lt)}for(let nt=Mt-1;nt>=0;nt--)z.lineTo(It(E.x[nt]),Nt(Tt[N][nt]));z.closePath(),z.fill(),z.strokeStyle=`rgb(${Math.round(X*255)},${Math.round(it*255)},${Math.round(dt*255)})`,z.lineWidth=1,z.beginPath();for(let nt=0;nt<Mt;nt++){const kt=It(E.x[nt]),Lt=Nt(bt[N][nt]);nt===0?z.moveTo(kt,Lt):z.lineTo(kt,Lt)}z.stroke()}}if(b)for(let mt=0;mt<b.length;mt++){const C=b[mt],Mt=C.color?`rgb(${Math.round(C.color[0]*255)},${Math.round(C.color[1]*255)},${Math.round(C.color[2]*255)})`:Up({},mt);z.strokeStyle=Mt,z.fillStyle=Mt,z.lineWidth=(C.lineWidth??1)*K;const Tt=3*K;z.beginPath();for(let bt=0;bt<C.x.length;bt++){const xt=It(C.x[bt]),N=Nt(C.y[bt]);bt===0?z.moveTo(xt,N):z.lineTo(xt,N)}z.stroke();for(let bt=0;bt<C.x.length;bt++){const xt=It(C.x[bt]),N=Nt(C.y[bt]),E=Nt(C.y[bt]-C.yNeg[bt]),X=Nt(C.y[bt]+C.yPos[bt]);if(z.beginPath(),z.moveTo(xt,E),z.lineTo(xt,X),z.stroke(),z.beginPath(),z.moveTo(xt-Tt,E),z.lineTo(xt+Tt,E),z.stroke(),z.beginPath(),z.moveTo(xt-Tt,X),z.lineTo(xt+Tt,X),z.stroke(),C.xNeg&&C.xPos){const it=It(C.x[bt]-C.xNeg[bt]),dt=It(C.x[bt]+C.xPos[bt]);z.beginPath(),z.moveTo(it,N),z.lineTo(dt,N),z.stroke(),z.beginPath(),z.moveTo(it,N-Tt),z.lineTo(it,N+Tt),z.stroke(),z.beginPath(),z.moveTo(dt,N-Tt),z.lineTo(dt,N+Tt),z.stroke()}z.beginPath(),z.arc(xt,N,2*K,0,2*Math.PI),z.fill()}}for(let mt=0;mt<t.length;mt++){const C=t[mt],Mt=Up(C,mt);if(C.lineStyle!=="none"){z.strokeStyle=Mt,z.lineWidth=C.lineWidth??2,z.lineJoin="round",z.setLineDash(kx(C.lineStyle)),z.beginPath();let Tt=!1;for(let bt=0;bt<C.x.length;bt++){const xt=C.x[bt],N=C.y[bt];if(!isFinite(xt)||!isFinite(N)){Tt=!1;continue}const E=It(xt),X=Nt(N);Tt?z.lineTo(E,X):(z.moveTo(E,X),Tt=!0)}z.stroke(),z.setLineDash([])}C.marker&&dR(z,C,It,Nt,Mt)}if(z.restore(),c&&c.length>0&&mR(z,t,c,Ft+Pt,ce),B){const mt=T??AR(D,d,m);mt&&RR(z,st,Ft,ce,Pt,Ht,mt[0],mt[1],p)}}let wu;function Es(r,t){const i=Math.max(0,Math.min(1,r));if(wu&&wu.length>0){const s=wu,l=s.length;if(l===1)return s[0];const c=i*(l-1),f=Math.floor(c),d=Math.min(f+1,l-1),m=c-f;return[s[f][0]+m*(s[d][0]-s[f][0]),s[f][1]+m*(s[d][1]-s[f][1]),s[f][2]+m*(s[d][2]-s[f][2])]}return t==="jet"?vR(i):t==="redblue"?xR(i):_R(i)}function _R(r){if(r<.5){const i=r*2;return[.2*(1-i),.1+.6*i,.9-.3*i]}const t=(r-.5)*2;return[.2+.8*t,.7+.3*t,.6-.5*t]}function vR(r){let t,i,s;return r<.125?(t=0,i=0,s=.5+r*4):r<.375?(t=0,i=(r-.125)*4,s=1):r<.625?(t=(r-.375)*4,i=1,s=1-(r-.375)*4):r<.875?(t=1,i=1-(r-.625)*4,s=0):(t=1-(r-.875)*4,i=0,s=0),[Math.max(0,Math.min(1,t)),Math.max(0,Math.min(1,i)),Math.max(0,Math.min(1,s))]}function xR(r){if(r<.5){const i=r*2;return[i,i,1]}const t=(r-.5)*2;return[1,1-t,1-t]}function SR(r,t,i,s,l){const{rows:c,cols:f,z:d,x:m,y:p}=t;if(c===0||f===0)return;let v=1/0,_=-1/0;for(const A of d)isFinite(A)&&(A<v&&(v=A),A>_&&(_=A));if(!isFinite(v))return;const g=_-v||1,M=(m[1]-m[0])/f,b=(p[1]-p[0])/c;for(let A=0;A<f;A++)for(let S=0;S<c;S++){const R=(d[A*c+S]-v)/g,[U,D,G]=Es(R,l),B=i(m[0]+A*M),F=s(p[0]+(S+1)*b),T=i(m[0]+(A+1)*M),O=s(p[0]+S*b);r.fillStyle=`rgb(${Math.round(U*255)},${Math.round(D*255)},${Math.round(G*255)})`,r.fillRect(B,F,T-B,O-F)}}function yR(r,t,i,s,l){const{rows:c,cols:f,z:d,x:m,y:p,nLevels:v,filled:_}=t;if(c<2||f<2)return;let g=1/0,M=-1/0;for(const U of d)isFinite(U)&&(U<g&&(g=U),U>M&&(M=U));if(!isFinite(g))return;const b=M-g||1,A=[];for(let U=0;U<=v;U++)A.push(g+U/v*b);const S=(U,D)=>d[D*c+U],x=(U,D)=>m[D*c+U],R=(U,D)=>p[D*c+U];if(_)for(let U=0;U<f-1;U++)for(let D=0;D<c-1;D++){const B=((S(D,U)+S(D+1,U)+S(D,U+1)+S(D+1,U+1))/4-g)/b,[F,T,O]=Es(B,l),z=i(x(D,U)),V=s(R(D,U)),K=i(x(D+1,U+1)),tt=s(R(D+1,U+1));r.fillStyle=`rgb(${Math.round(F*255)},${Math.round(T*255)},${Math.round(O*255)})`,r.fillRect(Math.min(z,K),Math.min(V,tt),Math.abs(K-z)||1,Math.abs(tt-V)||1)}else for(let U=1;U<A.length-1;U++){const D=A[U],G=(D-g)/b,[B,F,T]=Es(G,l);r.strokeStyle=`rgb(${Math.round(B*255)},${Math.round(F*255)},${Math.round(T*255)})`,r.lineWidth=1;for(let O=0;O<f-1;O++)for(let z=0;z<c-1;z++){const V=S(z,O),K=S(z+1,O),tt=S(z,O+1),ct=S(z+1,O+1),q=x(z,O),I=R(z,O),H=x(z+1,O),st=R(z+1,O),ht=x(z,O+1),Ct=R(z,O+1),P=x(z+1,O+1),k=R(z+1,O+1),et=MR(V,K,tt,ct,q,I,H,st,ht,Ct,P,k,D);for(const pt of et)r.beginPath(),r.moveTo(i(pt[0]),s(pt[1])),r.lineTo(i(pt[2]),s(pt[3])),r.stroke()}}}function MR(r,t,i,s,l,c,f,d,m,p,v,_,g){const M=r>=g?1:0,b=t>=g?1:0,A=i>=g?1:0,S=s>=g?1:0,x=M|b<<1|A<<2|S<<3;if(x===0||x===15)return[];const R=(K,tt,ct,q)=>{const I=(g-ct)/(q-ct||1);return K+I*(tt-K)},U=R(l,f,r,t),D=R(c,d,r,t),G=R(f,v,t,s),B=R(d,_,t,s),F=R(m,v,i,s),T=R(p,_,i,s),O=R(l,m,r,i),z=R(c,p,r,i),V=[];switch(x){case 1:case 14:V.push([U,D,O,z]);break;case 2:case 13:V.push([U,D,G,B]);break;case 3:case 12:V.push([O,z,G,B]);break;case 4:case 11:V.push([O,z,F,T]);break;case 5:case 10:V.push([U,D,F,T]);break;case 6:case 9:V.push([U,D,O,z]),V.push([F,T,G,B]);break;case 7:case 8:V.push([F,T,G,B]);break}return V}const nx=[[0,.447,.741],[.85,.325,.098],[.929,.694,.125],[.494,.184,.556],[.466,.674,.188],[.301,.745,.933],[.635,.078,.184]];function bR(r,t,i,s,l){const c=s.values.reduce((M,b)=>M+b,0);if(c<=0)return;const f=l?36:0,d=60,m=t/2,p=f+(i-f)/2,v=Math.min(t/2-d,(i-f)/2-d);if(v<=0)return;const _=v*s.innerRadius;l&&(r.font="bold 14px sans-serif",r.fillStyle="#000",r.textAlign="center",r.textBaseline="top",r.fillText(l,m,10));let g=-Math.PI/2;for(let M=0;M<s.values.length;M++){const b=s.values[M]/c*2*Math.PI,A=g+b,[S,x,R]=s.colors?.[M]??nx[M%nx.length];r.beginPath(),_>0?(r.arc(m,p,v,g,A),r.arc(m,p,_,A,g,!0)):(r.moveTo(m,p),r.arc(m,p,v,g,A),r.closePath()),r.fillStyle=`rgb(${Math.round(S*255)},${Math.round(x*255)},${Math.round(R*255)})`,r.fill(),r.strokeStyle="#fff",r.lineWidth=2,r.stroke();const U=g+b/2,D=(s.values[M]/c*100).toFixed(1)+"%",G=v+16,B=m+G*Math.cos(U),F=p+G*Math.sin(U);r.font="12px sans-serif",r.fillStyle="#333",r.textAlign=U>Math.PI/2||U<-Math.PI/2?"right":"left",r.textBaseline="middle";const T=s.names?.[M]?`${s.names[M]} (${D})`:D;r.fillText(T,B,F),g=A}}function ER(r,t,i,s,l,c){const{data:f,rows:d,cols:m}=s;if(d===0||m===0)return;let p=1/0,v=-1/0;for(const q of f)isFinite(q)&&(q<p&&(p=q),q>v&&(v=q));if(!isFinite(p))return;const _=v-p||1;r.font="12px sans-serif";const g=s.yLabels??Array.from({length:d},(q,I)=>String(I+1)),M=s.xLabels??Array.from({length:m},(q,I)=>String(I+1));let b=0;for(const q of g){const I=r.measureText(q).width;I>b&&(b=I)}const A=l?30:10,S=24,x=b+12,R=50,U=x,D=A,G=t-U-R,B=i-D-S;if(G<=0||B<=0)return;const F=G/m,T=B/d;l&&(r.font="bold 14px sans-serif",r.fillStyle="#000",r.textAlign="center",r.textBaseline="top",r.fillText(l,t/2,8));const O=Math.max(8,Math.min(14,Math.min(F,T)*.35));r.font=`${O}px sans-serif`,r.textAlign="center",r.textBaseline="middle";for(let q=0;q<m;q++)for(let I=0;I<d;I++){const H=f[q*d+I],st=U+q*F,ht=D+I*T,Ct=isFinite(H)?(H-p)/_:0,[P,k,et]=Es(Ct,c);if(r.fillStyle=`rgb(${Math.round(P*255)},${Math.round(k*255)},${Math.round(et*255)})`,r.fillRect(st,ht,F,T),r.strokeStyle="#fff",r.lineWidth=1,r.strokeRect(st,ht,F,T),isFinite(H)&&F>16&&T>12){const pt=P*.299+k*.587+et*.114;r.fillStyle=pt>.5?"#000":"#fff";const vt=Number.isInteger(H)?String(H):H.toFixed(2);r.fillText(vt,st+F/2,ht+T/2)}}r.font="11px sans-serif",r.fillStyle="#333",r.textAlign="center",r.textBaseline="top";for(let q=0;q<m;q++)r.fillText(M[q]??"",U+q*F+F/2,D+B+4);r.textAlign="right",r.textBaseline="middle";for(let q=0;q<d;q++)r.fillText(g[q]??"",U-6,D+q*T+T/2);const z=U+G+10,V=16,K=D,tt=B,ct=Math.max(1,Math.round(tt));for(let q=0;q<ct;q++){const I=1-q/ct,[H,st,ht]=Es(I,c);r.fillStyle=`rgb(${Math.round(H*255)},${Math.round(st*255)},${Math.round(ht*255)})`,r.fillRect(z,K+q/ct*tt,V,tt/ct+1)}r.strokeStyle="#999",r.lineWidth=1,r.strokeRect(z,K,V,tt),r.font="10px sans-serif",r.fillStyle="#333",r.textAlign="left",r.textBaseline="top",r.fillText(sa(v),z+V+4,K),r.textBaseline="bottom",r.fillText(sa(p),z+V+4,K+tt)}function sa(r){return Number.isInteger(r)?String(r):r.toPrecision(3)}function TR(r,t,i,s,l,c,f){const d=c??"faceted";if(d==="interp"){ix(r,t,i,s,l,!1,f);return}ix(r,t,i,s,l,d==="faceted",f)}function ix(r,t,i,s,l,c,f){const{rows:d,cols:m,x:p,y:v,c:_}=t;if(d<2||m<2)return;let g,M;if(f)[g,M]=f;else{g=1/0,M=-1/0;for(const S of _)isFinite(S)&&(S<g&&(g=S),S>M&&(M=S))}if(!isFinite(g))return;const b=M-g||1,A=t.faceAlpha??1;r.save(),A<1&&(r.globalAlpha=A);for(let S=0;S<m-1;S++)for(let x=0;x<d-1;x++){const R=S*d+x,U=S*d+(x+1),D=(S+1)*d+x,G=(S+1)*d+(x+1),B=_[R];if(!isFinite(B))continue;const F=(B-g)/b,[T,O,z]=Es(F,l),V=`rgb(${Math.round(T*255)},${Math.round(O*255)},${Math.round(z*255)})`,K=i(p[R]),tt=s(v[R]),ct=i(p[U]),q=s(v[U]),I=i(p[G]),H=s(v[G]),st=i(p[D]),ht=s(v[D]);if(r.beginPath(),r.moveTo(K,tt),r.lineTo(ct,q),r.lineTo(I,H),r.lineTo(st,ht),r.closePath(),r.fillStyle=V,r.fill(),c&&t.edgeColor!=="none"){if(Array.isArray(t.edgeColor)){const[Ct,P,k]=t.edgeColor;r.strokeStyle=`rgb(${Math.round(Ct*255)},${Math.round(P*255)},${Math.round(k*255)})`}else r.strokeStyle="rgba(0,0,0,0.3)";r.lineWidth=.5,r.stroke()}else t.edgeColor==="none"&&(r.strokeStyle=V,r.lineWidth=1,r.stroke())}r.restore()}function AR(r,t,i){let s=1/0,l=-1/0;const c=f=>{for(const d of f)isFinite(d)&&(d<s&&(s=d),d>l&&(l=d))};if(r)for(const f of r)c(f.c);if(t&&c(t.z),i)for(const f of i)c(f.z);return!isFinite(s)||!isFinite(l)?null:(s===l&&(s-=.5,l+=.5),[s,l])}function RR(r,t,i,s,l,c,f,d,m){switch(t){case"eastoutside":{const g=i+l+10;Su(r,g,s,16,c,f,d,m,"right");break}case"westoutside":{const g=i-10-16;Su(r,g,s,16,c,f,d,m,"left");break}case"northoutside":{const g=s-10-16;yu(r,i,g,l,16,f,d,m,"top");break}case"southoutside":{const g=s+c+10;yu(r,i,g,l,16,f,d,m,"bottom");break}case"east":{const g=i+l-8-16;Su(r,g,s+8,16,c-16,f,d,m,"left");break}case"west":{const g=i+8;Su(r,g,s+8,16,c-16,f,d,m,"right");break}case"north":{const g=s+8;yu(r,i+8,g,l-16,16,f,d,m,"bottom");break}case"south":{const g=s+c-8-16;yu(r,i+8,g,l-16,16,f,d,m,"top");break}}}function Su(r,t,i,s,l,c,f,d,m){const p=Math.max(1,Math.round(l));for(let v=0;v<p;v++){const _=1-v/p,[g,M,b]=Es(_,d);r.fillStyle=`rgb(${Math.round(g*255)},${Math.round(M*255)},${Math.round(b*255)})`,r.fillRect(t,i+v/p*l,s,l/p+1)}r.strokeStyle="#999",r.lineWidth=1,r.strokeRect(t,i,s,l),r.font="10px sans-serif",r.fillStyle="#333",m==="right"?(r.textAlign="left",r.textBaseline="top",r.fillText(sa(f),t+s+4,i),r.textBaseline="bottom",r.fillText(sa(c),t+s+4,i+l)):(r.textAlign="right",r.textBaseline="top",r.fillText(sa(f),t-4,i),r.textBaseline="bottom",r.fillText(sa(c),t-4,i+l))}function yu(r,t,i,s,l,c,f,d,m){const p=Math.max(1,Math.round(s));for(let v=0;v<p;v++){const _=v/p,[g,M,b]=Es(_,d);r.fillStyle=`rgb(${Math.round(g*255)},${Math.round(M*255)},${Math.round(b*255)})`,r.fillRect(t+v/p*s,i,s/p+1,l)}r.strokeStyle="#999",r.lineWidth=1,r.strokeRect(t,i,s,l),r.font="10px sans-serif",r.fillStyle="#333",m==="bottom"?(r.textBaseline="top",r.textAlign="left",r.fillText(sa(c),t,i+l+4),r.textAlign="right",r.fillText(sa(f),t+s,i+l+4)):(r.textBaseline="bottom",r.textAlign="left",r.fillText(sa(c),t,i-4),r.textAlign="right",r.fillText(sa(f),t+s,i-4))}class ax extends Fn.Component{state={error:null};static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,i){console.error("Axes render error:",t,i)}render(){return this.state.error?Qt.jsxs("div",{style:{width:"100%",height:"100%",display:"flex",alignItems:"center",justifyContent:"center",padding:8,color:"#a00",fontFamily:"sans-serif",fontSize:12,textAlign:"center",boxSizing:"border-box"},children:["Plot render error: ",this.state.error.message]}):this.props.children}}function CR({figure:r}){const{subplotGrid:t,sgtitle:i,axes:s}=r,l=Object.keys(s).map(Number).sort((d,m)=>d-m);if(l.length===0)return null;if(!t){const d=s[l[0]];return d?Qt.jsx(ax,{children:Qt.jsx(sx,{axes:d})}):null}const{rows:c,cols:f}=t;return Qt.jsxs("div",{style:{width:"100%",height:"100%",display:"flex",flexDirection:"column"},children:[i&&Qt.jsx("div",{style:{textAlign:"center",fontWeight:"bold",fontSize:16,fontFamily:"sans-serif",padding:"8px 0 4px 0",flexShrink:0},children:i}),Qt.jsx("div",{style:{flex:1,display:"grid",gridTemplateRows:`repeat(${c}, 1fr)`,gridTemplateColumns:`repeat(${f}, 1fr)`,gap:4,padding:4,minHeight:0},children:Array.from({length:c*f},(d,m)=>{const p=m+1,v=s[p],_=Math.floor(m/f),g=m%f;return Qt.jsx("div",{style:{gridRow:_+1,gridColumn:g+1,minWidth:0,minHeight:0,overflow:"hidden"},children:v?Qt.jsx(ax,{children:Qt.jsx(sx,{axes:v})}):null},p)})})]})}function sx({axes:r}){return r.surfTraces&&r.surfTraces.length>0||r.plot3Traces&&r.plot3Traces.length>0||r.bar3Traces&&r.bar3Traces.length>0||r.bar3hTraces&&r.bar3hTraces.length>0?Qt.jsx(cR,{surfTraces:r.surfTraces??[],plot3Traces:r.plot3Traces??[],bar3Traces:r.bar3Traces??[],bar3hTraces:r.bar3hTraces??[],shading:r.shading,colorbar:r.colorbar,colorbarLocation:r.colorbarLocation,colormap:r.colormap}):Qt.jsx(wR,{traces:r.traces,title:r.title,xlabel:r.xlabel,ylabel:r.ylabel,legend:r.legend,gridOn:r.gridOn,imagescTrace:r.imagescTrace,pcolorTraces:r.pcolorTraces,contourTraces:r.contourTraces,colormap:r.colormap,colormapData:r.colormapData,axisMode:r.axisMode,axisScale:r.axisScale,barTraces:r.barTraces,barhTraces:r.barhTraces,errorBarTraces:r.errorBarTraces,boxTraces:r.boxTraces,pieTrace:r.pieTrace,heatmapTrace:r.heatmapTrace,areaTraces:r.areaTraces,areaBaseValue:r.areaBaseValue,shading:r.shading,colorbar:r.colorbar,colorbarLocation:r.colorbarLocation,caxis:r.caxis})}function wR({traces:r,title:t,xlabel:i,ylabel:s,legend:l,gridOn:c,imagescTrace:f,pcolorTraces:d,contourTraces:m,colormap:p,colormapData:v,axisMode:_,axisScale:g,barTraces:M,barhTraces:b,errorBarTraces:A,boxTraces:S,pieTrace:x,heatmapTrace:R,areaTraces:U,areaBaseValue:D,shading:G,colorbar:B,colorbarLocation:F,caxis:T}){const O=Fn.useRef(null),z=Fn.useRef(null),V=Fn.useCallback(()=>{const K=O.current;K&&gR(K,r,t,i,s,l,c,f,m,p,_,g,M,b,A,S,x,R,U,D,d,G,B,F,T,v)},[r,t,i,s,l,c,f,m,p,v,_,g,M,b,A,S,x,R,U,D,d,G,B,F,T]);return Fn.useEffect(()=>{const K=O.current,tt=z.current;if(!K||!tt)return;const ct=new ResizeObserver(()=>{const q=tt.getBoundingClientRect(),I=window.devicePixelRatio||1;K.width=q.width*I,K.height=q.height*I,K.style.width=`${q.width}px`,K.style.height=`${q.height}px`,V()});return ct.observe(tt),()=>ct.disconnect()},[V]),Qt.jsx("div",{ref:z,style:{width:"100%",height:"100%"},children:Qt.jsx("canvas",{ref:O,style:{display:"block"}})})}const Xx={holdOn:!1,traces:[],plot3Traces:[],surfTraces:[],pcolorTraces:[],contourTraces:[],barTraces:[],barhTraces:[],bar3Traces:[],bar3hTraces:[],errorBarTraces:[],boxTraces:[],areaTraces:[],areaBaseValue:0};function Yn(r){return r.axes[r.currentAxesIndex]||{...Xx}}function Wx(r,t){return{...r,axes:{...r.axes,[r.currentAxesIndex]:t}}}const qx={currentHandle:1,figs:{}},Yx={currentAxesIndex:1,axes:{}};function Dn(r){return r.figs[r.currentHandle]||{...Yx}}function ii(r,t){const i=Dn(r),s=Yn(i);return{...r,figs:{...r.figs,[r.currentHandle]:Wx(i,{...s,...t})}}}function In(r,t){const i=Dn(r),s=Yn(i),l=s.holdOn;return{...r,figs:{...r.figs,[r.currentHandle]:Wx(i,{...s,traces:t.traces??(l?s.traces:[]),plot3Traces:t.plot3Traces??(l?s.plot3Traces:[]),surfTraces:t.surfTraces??(l?s.surfTraces:[]),pcolorTraces:t.pcolorTraces??(l?s.pcolorTraces:[]),contourTraces:t.contourTraces??(l?s.contourTraces:[]),barTraces:t.barTraces??(l?s.barTraces:[]),barhTraces:t.barhTraces??(l?s.barhTraces:[]),bar3Traces:t.bar3Traces??(l?s.bar3Traces:[]),bar3hTraces:t.bar3hTraces??(l?s.bar3hTraces:[]),errorBarTraces:t.errorBarTraces??(l?s.errorBarTraces:[]),boxTraces:t.boxTraces??(l?s.boxTraces:[]),pieTrace:t.pieTrace??(l?s.pieTrace:void 0),heatmapTrace:t.heatmapTrace??(l?s.heatmapTrace:void 0),areaTraces:t.areaTraces??(l?s.areaTraces:[]),areaBaseValue:t.areaBaseValue??s.areaBaseValue,...t.imagescTrace!==void 0?{imagescTrace:t.imagescTrace}:{}})}}}const DR=(r,t)=>{switch(t.type){case"set_figure_handle":return{...r,currentHandle:t.handle};case"set_hold":return ii(r,{holdOn:t.value});case"plot":{const i=Yn(Dn(r));return In(r,{traces:i.holdOn?[...i.traces,...t.traces]:[...t.traces]})}case"plot3":{const i=Yn(Dn(r));return In(r,{plot3Traces:i.holdOn?[...i.plot3Traces,...t.traces]:[...t.traces]})}case"surf":{const i=Yn(Dn(r));return In(r,{surfTraces:i.holdOn?[...i.surfTraces,t.trace]:[t.trace]})}case"imagesc":return In(r,{imagescTrace:t.trace});case"pcolor":{const i=Yn(Dn(r));return In(r,{pcolorTraces:i.holdOn?[...i.pcolorTraces,t.trace]:[t.trace]})}case"contour":{const i=Yn(Dn(r));return In(r,{contourTraces:i.holdOn?[...i.contourTraces,t.trace]:[t.trace]})}case"mesh":{const i=Yn(Dn(r));return In(r,{surfTraces:i.holdOn?[...i.surfTraces,t.trace]:[t.trace]})}case"bar":{const i=Yn(Dn(r));return In(r,{barTraces:i.holdOn?[...i.barTraces,...t.traces]:[...t.traces]})}case"barh":{const i=Yn(Dn(r));return In(r,{barhTraces:i.holdOn?[...i.barhTraces,...t.traces]:[...t.traces]})}case"bar3":{const i=Yn(Dn(r));return In(r,{bar3Traces:i.holdOn?[...i.bar3Traces,t.trace]:[t.trace]})}case"bar3h":{const i=Yn(Dn(r));return In(r,{bar3hTraces:i.holdOn?[...i.bar3hTraces,t.trace]:[t.trace]})}case"errorbar":{const i=Yn(Dn(r));return In(r,{errorBarTraces:i.holdOn?[...i.errorBarTraces,...t.traces]:[...t.traces]})}case"boxchart":{const i=Yn(Dn(r));return In(r,{boxTraces:i.holdOn?[...i.boxTraces,...t.traces]:[...t.traces]})}case"piechart":return In(r,{pieTrace:t.trace});case"heatmap":return In(r,{heatmapTrace:t.trace});case"area":{const i=Yn(Dn(r));return In(r,{areaTraces:i.holdOn?[...i.areaTraces,...t.traces]:[...t.traces],areaBaseValue:t.baseValue})}case"close":{const i=Object.fromEntries(Object.entries(r.figs).filter(([l])=>Number(l)!==r.currentHandle)),s=Object.keys(i).map(Number).sort((l,c)=>l-c);return{...r,currentHandle:s.length>0?s[s.length-1]:1,figs:i}}case"close_all":case"clear":return qx;case"set_title":return ii(r,{title:t.text});case"set_xlabel":return ii(r,{xlabel:t.text});case"set_ylabel":return ii(r,{ylabel:t.text});case"set_zlabel":return ii(r,{zlabel:t.text});case"set_shading":return ii(r,{shading:t.shading});case"set_legend":return ii(r,{legend:t.labels});case"set_sgtitle":{const i=Dn(r);return{...r,figs:{...r.figs,[r.currentHandle]:{...i,sgtitle:t.text}}}}case"set_grid":return ii(r,{gridOn:t.value});case"set_colorbar":return ii(r,{colorbar:t.value!=="off",colorbarLocation:t.location??"eastoutside"});case"set_colormap":return ii(r,{colormap:t.name,colormapData:t.data});case"set_view":return ii(r,{view:{az:t.az,el:t.el}});case"set_axis":return ii(r,{axisMode:t.value});case"set_axis_scale":return ii(r,{axisScale:t.value});case"set_caxis":return ii(r,{caxis:t.limits});case"clf":return r.figs[r.currentHandle]?{...r,figs:{...r.figs,[r.currentHandle]:{...Yx}}}:r;case"set_subplot":{const s={...Dn(r),subplotGrid:{rows:t.rows,cols:t.cols},currentAxesIndex:t.index};return s.axes[t.index]||(s.axes={...s.axes,[t.index]:{...Xx}}),{...r,figs:{...r.figs,[r.currentHandle]:s}}}default:return r}};function _i(r){for(let t=0;t<r.length;t++)r[t]===null&&(r[t]=NaN)}function UR(r){if(r.type==="plot")for(const t of r.traces)_i(t.x),_i(t.y);else if(r.type==="plot3")for(const t of r.traces)_i(t.x),_i(t.y),_i(t.z);else r.type==="surf"||r.type==="mesh"?(_i(r.trace.x),_i(r.trace.y),_i(r.trace.z),r.trace.c&&_i(r.trace.c)):r.type==="imagesc"?_i(r.trace.z):r.type==="contour"&&(_i(r.trace.x),_i(r.trace.y),_i(r.trace.z))}function LR(){const[r,t]=Fn.useReducer(DR,qx),[i,s]=Fn.useState(!1),[l,c]=Fn.useState(1),f=Fn.useRef(l),d=Fn.useCallback(_=>{t(_),_.type==="set_figure_handle"?(f.current=_.handle,c(_.handle)):_.type==="close_all"&&(f.current=1,c(1))},[]),m=(()=>{if(r.figs[l])return l;const _=Object.keys(r.figs).map(Number);return _.length===0?l:_.sort((M,b)=>M-b)[_.length-1]})();Fn.useEffect(()=>{const _=new EventSource("/events");return _.onmessage=g=>{const M=JSON.parse(g.data);for(const b of M)UR(b),d(b)},_.addEventListener("done",()=>{s(!0)}),()=>_.close()},[d]);const p=Object.keys(r.figs).map(Number).sort((_,g)=>_-g),v=r.figs[m];return Qt.jsxs("div",{style:{display:"flex",flexDirection:"column",height:"100vh"},children:[p.length>1&&Qt.jsx("div",{style:NR,children:p.map(_=>Qt.jsxs("button",{onClick:()=>c(_),style:_===m?OR:jx,children:["Figure ",_]},_))}),Qt.jsx("div",{style:{flex:1,position:"relative"},children:v?Qt.jsx("div",{style:{position:"absolute",inset:0},children:Qt.jsx(CR,{figure:v})}):Qt.jsx("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",height:"100%",color:"#999",fontFamily:"sans-serif"},children:"Waiting for plot data..."})}),Qt.jsx("div",{style:PR,children:i?"Script complete. Press Ctrl+C in terminal to exit.":"Running..."})]})}const NR={display:"flex",gap:2,padding:"4px 8px",background:"#f0f0f0",borderBottom:"1px solid #ccc"},jx={padding:"4px 12px",border:"1px solid #ccc",borderBottom:"none",background:"#e0e0e0",cursor:"pointer",fontFamily:"sans-serif",fontSize:13,borderRadius:"4px 4px 0 0"},OR={...jx,background:"#fff",fontWeight:"bold"},PR={padding:"4px 12px",background:"#f5f5f5",borderTop:"1px solid #ddd",fontSize:12,fontFamily:"sans-serif",color:"#666"};lM.createRoot(document.getElementById("root")).render(Qt.jsx(Fn.StrictMode,{children:Qt.jsx(LR,{})}));
@@ -4,7 +4,7 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>numbl - Figures</title>
7
- <script type="module" crossorigin src="/assets/index-vtrJ8bml.js"></script>
7
+ <script type="module" crossorigin src="/assets/index-GiUNnMQg.js"></script>
8
8
  </head>
9
9
  <body style="margin: 0; overflow: hidden">
10
10
  <div id="root"></div>
@@ -16,6 +16,15 @@
16
16
  * op: number): { re: Float64Array, im: Float64Array }
17
17
  * op: 0=add, 1=sub, 2=mul, 3=div
18
18
  * Pass null for aIm or bIm to treat as zero (mixed real/complex).
19
+ *
20
+ * elemwiseComplexScalar(scalarRe: number, scalarIm: number,
21
+ * arrRe: Float64Array, arrIm: Float64Array|null,
22
+ * op: number, scalarOnLeft: boolean)
23
+ * : { re: Float64Array, im: Float64Array }
24
+ * op: 0=add, 1=sub, 2=mul, 3=div
25
+ * Complex scalar with a possibly-complex tensor. When scalar is purely
26
+ * real (scalarIm == 0) and the tensor is real (arrIm == null), prefer
27
+ * elemwiseScalar for better throughput.
19
28
  */
20
29
 
21
30
  #include "numbl_addon_common.h"
@@ -224,3 +233,128 @@ Napi::Value ElemwiseScalar(const Napi::CallbackInfo& info) {
224
233
 
225
234
  return result;
226
235
  }
236
+
237
+ // ── elemwiseComplexScalar() — complex-scalar-tensor element-wise binary op ──
238
+
239
+ Napi::Value ElemwiseComplexScalar(const Napi::CallbackInfo& info) {
240
+ Napi::Env env = info.Env();
241
+
242
+ // (scalarRe, scalarIm, arrRe, arrIm_or_null, op, scalarOnLeft)
243
+ if (info.Length() < 6
244
+ || !info[0].IsNumber()
245
+ || !info[1].IsNumber()
246
+ || !info[2].IsTypedArray()
247
+ || !info[4].IsNumber()
248
+ || !info[5].IsBoolean()) {
249
+ Napi::TypeError::New(env,
250
+ "elemwiseComplexScalar: expected (number sRe, number sIm, "
251
+ "Float64Array arrRe, Float64Array|null arrIm, number op, "
252
+ "boolean scalarOnLeft)")
253
+ .ThrowAsJavaScriptException();
254
+ return env.Null();
255
+ }
256
+
257
+ double sRe = info[0].As<Napi::Number>().DoubleValue();
258
+ double sIm = info[1].As<Napi::Number>().DoubleValue();
259
+ auto arrRe = info[2].As<Napi::Float64Array>();
260
+ int op = info[4].As<Napi::Number>().Int32Value();
261
+ bool scalarOnLeft = info[5].As<Napi::Boolean>().Value();
262
+
263
+ size_t n = arrRe.ElementLength();
264
+ const double* aRe = arrRe.Data();
265
+ const bool hasAIm = info[3].IsTypedArray();
266
+ const double* aIm = hasAIm ? info[3].As<Napi::Float64Array>().Data() : nullptr;
267
+
268
+ auto outRe = Napi::Float64Array::New(env, n);
269
+ auto outIm = Napi::Float64Array::New(env, n);
270
+ double* oRe = outRe.Data();
271
+ double* oIm = outIm.Data();
272
+
273
+ switch (op) {
274
+ case 0: // add: result is (sRe + aRe) + (sIm + aIm) i
275
+ for (size_t i = 0; i < n; i++) {
276
+ oRe[i] = sRe + aRe[i];
277
+ oIm[i] = sIm + (aIm ? aIm[i] : 0.0);
278
+ }
279
+ break;
280
+ case 1: // sub
281
+ if (scalarOnLeft) {
282
+ for (size_t i = 0; i < n; i++) {
283
+ oRe[i] = sRe - aRe[i];
284
+ oIm[i] = sIm - (aIm ? aIm[i] : 0.0);
285
+ }
286
+ } else {
287
+ for (size_t i = 0; i < n; i++) {
288
+ oRe[i] = aRe[i] - sRe;
289
+ oIm[i] = (aIm ? aIm[i] : 0.0) - sIm;
290
+ }
291
+ }
292
+ break;
293
+ case 2: // mul: (sRe + sIm i)(aRe + aIm i)
294
+ for (size_t i = 0; i < n; i++) {
295
+ double ar = aRe[i];
296
+ double ai = aIm ? aIm[i] : 0.0;
297
+ oRe[i] = sRe * ar - sIm * ai;
298
+ oIm[i] = sRe * ai + sIm * ar;
299
+ }
300
+ break;
301
+ case 3: // div
302
+ if (scalarOnLeft) {
303
+ // (sRe + sIm i) / (ar + ai i)
304
+ for (size_t i = 0; i < n; i++) {
305
+ double ar = aRe[i];
306
+ double ai = aIm ? aIm[i] : 0.0;
307
+ double denom = ar * ar + ai * ai;
308
+ if (denom == 0.0) {
309
+ // Match JS: produce Inf/NaN components.
310
+ oRe[i] = (sRe == 0.0 && sIm == 0.0) ? 0.0 / 0.0
311
+ : (sRe > 0 ? 1.0 : sRe < 0 ? -1.0 : 0.0) / 0.0;
312
+ oIm[i] = (sRe == 0.0 && sIm == 0.0) ? 0.0
313
+ : (sIm > 0 ? 1.0 : sIm < 0 ? -1.0 : 0.0) / 0.0;
314
+ } else {
315
+ oRe[i] = (sRe * ar + sIm * ai) / denom;
316
+ oIm[i] = (sIm * ar - sRe * ai) / denom;
317
+ }
318
+ }
319
+ } else {
320
+ // (ar + ai i) / (sRe + sIm i)
321
+ double denom = sRe * sRe + sIm * sIm;
322
+ if (denom == 0.0) {
323
+ for (size_t i = 0; i < n; i++) {
324
+ double ar = aRe[i];
325
+ double ai = aIm ? aIm[i] : 0.0;
326
+ oRe[i] = (ar == 0.0 && ai == 0.0) ? 0.0 / 0.0
327
+ : (ar > 0 ? 1.0 : ar < 0 ? -1.0 : 0.0) / 0.0;
328
+ oIm[i] = (ar == 0.0 && ai == 0.0) ? 0.0
329
+ : (ai > 0 ? 1.0 : ai < 0 ? -1.0 : 0.0) / 0.0;
330
+ }
331
+ } else {
332
+ double invDenom = 1.0 / denom;
333
+ for (size_t i = 0; i < n; i++) {
334
+ double ar = aRe[i];
335
+ double ai = aIm ? aIm[i] : 0.0;
336
+ oRe[i] = (ar * sRe + ai * sIm) * invDenom;
337
+ oIm[i] = (ai * sRe - ar * sIm) * invDenom;
338
+ }
339
+ }
340
+ }
341
+ break;
342
+ default:
343
+ Napi::RangeError::New(env, "elemwiseComplexScalar: op must be 0-3")
344
+ .ThrowAsJavaScriptException();
345
+ return env.Null();
346
+ }
347
+
348
+ // Check if result is purely real
349
+ bool isReal = true;
350
+ for (size_t i = 0; i < n; i++) {
351
+ if (oIm[i] != 0.0) { isReal = false; break; }
352
+ }
353
+
354
+ auto result = Napi::Object::New(env);
355
+ result.Set("re", outRe);
356
+ if (!isReal) {
357
+ result.Set("im", outIm);
358
+ }
359
+ return result;
360
+ }