pts 0.12.7 → 0.12.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -584,12 +584,13 @@ declare class CanvasSpace extends MultiTouchSpace {
584
584
  protected _canvas: HTMLCanvasElement;
585
585
  protected _container: Element;
586
586
  protected _pixelScale: number;
587
- protected _autoResize: boolean;
588
587
  protected _bgcolor: string;
589
588
  protected _ctx: PtsCanvasRenderingContext2D;
590
589
  protected _offscreen: boolean;
591
590
  protected _offCanvas: HTMLCanvasElement;
592
591
  protected _offCtx: PtsCanvasRenderingContext2D;
592
+ protected _resizeObserver: ResizeObserver;
593
+ protected _autoResize: boolean;
593
594
  protected _initialResize: boolean;
594
595
  constructor(elem: string | Element, callback?: Function);
595
596
  protected _createElement(elem: string, id: any): HTMLElement;
package/dist/index.d.ts CHANGED
@@ -584,12 +584,13 @@ declare class CanvasSpace extends MultiTouchSpace {
584
584
  protected _canvas: HTMLCanvasElement;
585
585
  protected _container: Element;
586
586
  protected _pixelScale: number;
587
- protected _autoResize: boolean;
588
587
  protected _bgcolor: string;
589
588
  protected _ctx: PtsCanvasRenderingContext2D;
590
589
  protected _offscreen: boolean;
591
590
  protected _offCanvas: HTMLCanvasElement;
592
591
  protected _offCtx: PtsCanvasRenderingContext2D;
592
+ protected _resizeObserver: ResizeObserver;
593
+ protected _autoResize: boolean;
593
594
  protected _initialResize: boolean;
594
595
  constructor(elem: string | Element, callback?: Function);
595
596
  protected _createElement(elem: string, id: any): HTMLElement;
package/dist/index.js CHANGED
@@ -5863,9 +5863,9 @@ var CanvasSpace2 = class extends MultiTouchSpace {
5863
5863
  constructor(elem, callback) {
5864
5864
  super();
5865
5865
  this._pixelScale = 1;
5866
- this._autoResize = true;
5867
5866
  this._bgcolor = "#e1e9f0";
5868
5867
  this._offscreen = false;
5868
+ this._autoResize = true;
5869
5869
  this._initialResize = false;
5870
5870
  let _selector = null;
5871
5871
  let _existed = false;
@@ -5976,13 +5976,15 @@ var CanvasSpace2 = class extends MultiTouchSpace {
5976
5976
  * @param auto a boolean value indicating if auto size is set
5977
5977
  */
5978
5978
  set autoResize(auto) {
5979
- if (!window)
5980
- return;
5981
5979
  this._autoResize = auto;
5982
5980
  if (auto) {
5983
- window.addEventListener("resize", this._resizeHandler.bind(this));
5981
+ this._resizeObserver = new ResizeObserver((entries) => {
5982
+ this._resizeHandler(null);
5983
+ });
5984
+ this._resizeObserver.observe(this._container);
5984
5985
  } else {
5985
- window.removeEventListener("resize", this._resizeHandler.bind(this));
5986
+ if (this._resizeObserver)
5987
+ this._resizeObserver.disconnect();
5986
5988
  }
5987
5989
  }
5988
5990
  get autoResize() {
@@ -6027,12 +6029,10 @@ var CanvasSpace2 = class extends MultiTouchSpace {
6027
6029
  * @param evt
6028
6030
  */
6029
6031
  _resizeHandler(evt) {
6030
- if (!window)
6031
- return;
6032
6032
  const b = this._autoResize || this._initialResize ? this._container.getBoundingClientRect() : this._canvas.getBoundingClientRect();
6033
6033
  if (b) {
6034
6034
  const box = Bound.fromBoundingRect(b);
6035
- box.center = box.center.add(window.pageXOffset, window.pageYOffset);
6035
+ box.center = box.center.add((window == null ? void 0 : window.scrollX) || 0, (window == null ? void 0 : window.scrollY) || 0);
6036
6036
  this.resize(box, evt);
6037
6037
  }
6038
6038
  }
@@ -6159,9 +6159,7 @@ var CanvasSpace2 = class extends MultiTouchSpace {
6159
6159
  * Dispose of browser resources held by this space and remove all players. Call this before unmounting the canvas.
6160
6160
  */
6161
6161
  dispose() {
6162
- if (!window)
6163
- return;
6164
- window.removeEventListener("resize", this._resizeHandler.bind(this));
6162
+ this._resizeObserver.disconnect();
6165
6163
  this.stop();
6166
6164
  this.removeAll();
6167
6165
  return this;
package/dist/index.mjs CHANGED
@@ -5795,9 +5795,9 @@ var CanvasSpace2 = class extends MultiTouchSpace {
5795
5795
  constructor(elem, callback) {
5796
5796
  super();
5797
5797
  this._pixelScale = 1;
5798
- this._autoResize = true;
5799
5798
  this._bgcolor = "#e1e9f0";
5800
5799
  this._offscreen = false;
5800
+ this._autoResize = true;
5801
5801
  this._initialResize = false;
5802
5802
  let _selector = null;
5803
5803
  let _existed = false;
@@ -5908,13 +5908,15 @@ var CanvasSpace2 = class extends MultiTouchSpace {
5908
5908
  * @param auto a boolean value indicating if auto size is set
5909
5909
  */
5910
5910
  set autoResize(auto) {
5911
- if (!window)
5912
- return;
5913
5911
  this._autoResize = auto;
5914
5912
  if (auto) {
5915
- window.addEventListener("resize", this._resizeHandler.bind(this));
5913
+ this._resizeObserver = new ResizeObserver((entries) => {
5914
+ this._resizeHandler(null);
5915
+ });
5916
+ this._resizeObserver.observe(this._container);
5916
5917
  } else {
5917
- window.removeEventListener("resize", this._resizeHandler.bind(this));
5918
+ if (this._resizeObserver)
5919
+ this._resizeObserver.disconnect();
5918
5920
  }
5919
5921
  }
5920
5922
  get autoResize() {
@@ -5959,12 +5961,10 @@ var CanvasSpace2 = class extends MultiTouchSpace {
5959
5961
  * @param evt
5960
5962
  */
5961
5963
  _resizeHandler(evt) {
5962
- if (!window)
5963
- return;
5964
5964
  const b = this._autoResize || this._initialResize ? this._container.getBoundingClientRect() : this._canvas.getBoundingClientRect();
5965
5965
  if (b) {
5966
5966
  const box = Bound.fromBoundingRect(b);
5967
- box.center = box.center.add(window.pageXOffset, window.pageYOffset);
5967
+ box.center = box.center.add((window == null ? void 0 : window.scrollX) || 0, (window == null ? void 0 : window.scrollY) || 0);
5968
5968
  this.resize(box, evt);
5969
5969
  }
5970
5970
  }
@@ -6091,9 +6091,7 @@ var CanvasSpace2 = class extends MultiTouchSpace {
6091
6091
  * Dispose of browser resources held by this space and remove all players. Call this before unmounting the canvas.
6092
6092
  */
6093
6093
  dispose() {
6094
- if (!window)
6095
- return;
6096
- window.removeEventListener("resize", this._resizeHandler.bind(this));
6094
+ this._resizeObserver.disconnect();
6097
6095
  this.stop();
6098
6096
  this.removeAll();
6099
6097
  return this;
package/dist/pts.js CHANGED
@@ -5895,9 +5895,9 @@ See https://github.com/williamngan/pts for details. */
5895
5895
  constructor(elem, callback) {
5896
5896
  super();
5897
5897
  this._pixelScale = 1;
5898
- this._autoResize = true;
5899
5898
  this._bgcolor = "#e1e9f0";
5900
5899
  this._offscreen = false;
5900
+ this._autoResize = true;
5901
5901
  this._initialResize = false;
5902
5902
  let _selector = null;
5903
5903
  let _existed = false;
@@ -6008,13 +6008,15 @@ See https://github.com/williamngan/pts for details. */
6008
6008
  * @param auto a boolean value indicating if auto size is set
6009
6009
  */
6010
6010
  set autoResize(auto) {
6011
- if (!window)
6012
- return;
6013
6011
  this._autoResize = auto;
6014
6012
  if (auto) {
6015
- window.addEventListener("resize", this._resizeHandler.bind(this));
6013
+ this._resizeObserver = new ResizeObserver((entries) => {
6014
+ this._resizeHandler(null);
6015
+ });
6016
+ this._resizeObserver.observe(this._container);
6016
6017
  } else {
6017
- window.removeEventListener("resize", this._resizeHandler.bind(this));
6018
+ if (this._resizeObserver)
6019
+ this._resizeObserver.disconnect();
6018
6020
  }
6019
6021
  }
6020
6022
  get autoResize() {
@@ -6059,12 +6061,10 @@ See https://github.com/williamngan/pts for details. */
6059
6061
  * @param evt
6060
6062
  */
6061
6063
  _resizeHandler(evt) {
6062
- if (!window)
6063
- return;
6064
6064
  const b = this._autoResize || this._initialResize ? this._container.getBoundingClientRect() : this._canvas.getBoundingClientRect();
6065
6065
  if (b) {
6066
6066
  const box = Bound.fromBoundingRect(b);
6067
- box.center = box.center.add(window.pageXOffset, window.pageYOffset);
6067
+ box.center = box.center.add((window == null ? void 0 : window.scrollX) || 0, (window == null ? void 0 : window.scrollY) || 0);
6068
6068
  this.resize(box, evt);
6069
6069
  }
6070
6070
  }
@@ -6191,9 +6191,7 @@ See https://github.com/williamngan/pts for details. */
6191
6191
  * Dispose of browser resources held by this space and remove all players. Call this before unmounting the canvas.
6192
6192
  */
6193
6193
  dispose() {
6194
- if (!window)
6195
- return;
6196
- window.removeEventListener("resize", this._resizeHandler.bind(this));
6194
+ this._resizeObserver.disconnect();
6197
6195
  this.stop();
6198
6196
  this.removeAll();
6199
6197
  return this;
package/dist/pts.min.js CHANGED
@@ -1,8 +1,8 @@
1
1
  /* Copyright © 2017-2024 William Ngan and contributors.
2
2
  Licensed under Apache 2.0 License.
3
3
  See https://github.com/williamngan/pts for details. */
4
- (()=>{var qt=Object.defineProperty;var Ft=Object.getOwnPropertySymbols;var jt=Object.prototype.hasOwnProperty,Vt=Object.prototype.propertyIsEnumerable;var Ht=(l,r,t)=>r in l?qt(l,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):l[r]=t,$=(l,r)=>{for(var t in r||(r={}))jt.call(r,t)&&Ht(l,t,r[t]);if(Ft)for(var t of Ft(r))Vt.call(r,t)&&Ht(l,t,r[t]);return l};var T=(l,r)=>{for(var t in r)qt(l,t,{get:r[t],enumerable:!0})};var et=(l,r,t)=>new Promise((e,i)=>{var n=a=>{try{o(t.next(a))}catch(u){i(u)}},s=a=>{try{o(t.throw(a))}catch(u){i(u)}},o=a=>a.done?e(a.value):Promise.resolve(a.value).then(n,s);o((t=t.apply(l,r)).next())});var Dt={};T(Dt,{CanvasForm:()=>Q,CanvasSpace:()=>tt});var Lt={};T(Lt,{MultiTouchSpace:()=>Y,Space:()=>at});var xt={};T(xt,{Bound:()=>G,Group:()=>d,Pt:()=>h});var wt={};T(wt,{Const:()=>w,Util:()=>m});var Pt={};T(Pt,{Geom:()=>y,Num:()=>L,Range:()=>yt,Shaping:()=>st});var _t={};T(_t,{Circle:()=>B,Curve:()=>K,Line:()=>E,Polygon:()=>S,Rectangle:()=>M,Triangle:()=>j});var gt={};T(gt,{Mat:()=>C,Vec:()=>k});var k=class l{static add(r,t){if(typeof t=="number")for(let e=0,i=r.length;e<i;e++)r[e]+=t;else for(let e=0,i=r.length;e<i;e++)r[e]+=t[e]||0;return r}static subtract(r,t){if(typeof t=="number")for(let e=0,i=r.length;e<i;e++)r[e]-=t;else for(let e=0,i=r.length;e<i;e++)r[e]-=t[e]||0;return r}static multiply(r,t){if(typeof t=="number")for(let e=0,i=r.length;e<i;e++)r[e]*=t;else{if(r.length!=t.length)throw new Error(`Cannot do element-wise multiply since the array lengths don't match: ${r.toString()} multiply-with ${t.toString()}`);for(let e=0,i=r.length;e<i;e++)r[e]*=t[e]}return r}static divide(r,t){if(typeof t=="number"){if(t===0)throw new Error("Cannot divide by zero");for(let e=0,i=r.length;e<i;e++)r[e]/=t}else{if(r.length!=t.length)throw new Error(`Cannot do element-wise divide since the array lengths don't match. ${r.toString()} divide-by ${t.toString()}`);for(let e=0,i=r.length;e<i;e++)r[e]/=t[e]}return r}static dot(r,t){if(r.length!=t.length)throw new Error("Array lengths don't match");let e=0;for(let i=0,n=r.length;i<n;i++)e+=r[i]*t[i];return e}static cross2D(r,t){return r[0]*t[1]-r[1]*t[0]}static cross(r,t){return new h(r[1]*t[2]-r[2]*t[1],r[2]*t[0]-r[0]*t[2],r[0]*t[1]-r[1]*t[0])}static magnitude(r){return Math.sqrt(l.dot(r,r))}static unit(r,t=void 0){let e=t===void 0?l.magnitude(r):t;return e===0?h.make(r.length):l.divide(r,e)}static abs(r){return l.map(r,Math.abs)}static floor(r){return l.map(r,Math.floor)}static ceil(r){return l.map(r,Math.ceil)}static round(r){return l.map(r,Math.round)}static max(r){let t=Number.MIN_VALUE,e=0;for(let i=0,n=r.length;i<n;i++)t=Math.max(t,r[i]),t===r[i]&&(e=i);return{value:t,index:e}}static min(r){let t=Number.MAX_VALUE,e=0;for(let i=0,n=r.length;i<n;i++)t=Math.min(t,r[i]),t===r[i]&&(e=i);return{value:t,index:e}}static sum(r){let t=0;for(let e=0,i=r.length;e<i;e++)t+=r[e];return t}static map(r,t){for(let e=0,i=r.length;e<i;e++)r[e]=t(r[e],e,r);return r}},C=class l{constructor(){this.reset()}get value(){return this._33}get domMatrix(){return new DOMMatrix(l.toDOMMatrix(this._33))}reset(){this._33=l.scale2DMatrix(1,1)}scale2D(r,t=[0,0]){let e=l.scaleAt2DMatrix(r[0]||1,r[1]||1,t);return this._33=l.multiply(this._33,e),this}rotate2D(r,t=[0,0]){let e=l.rotateAt2DMatrix(Math.cos(r),Math.sin(r),t);return this._33=l.multiply(this._33,e),this}translate2D(r){let t=l.translate2DMatrix(r[0]||0,r[1]||0);return this._33=l.multiply(this._33,t),this}shear2D(r,t=[0,0]){let e=l.shearAt2DMatrix(Math.tan(r[0]||0),Math.tan(r[1]||1),t);return this._33=l.multiply(this._33,e),this}static add(r,t){if(typeof t!="number"){if(r[0].length!=t[0].length)throw new Error("Cannot add matrix if rows' and columns' size don't match.");if(r.length!=t.length)throw new Error("Cannot add matrix if rows' and columns' size don't match.")}let e=new d,i=typeof t=="number";for(let n=0,s=r.length;n<s;n++)e.push(r[n].$add(i?t:t[n]));return e}static multiply(r,t,e=!1,i=!1){let n=new d;if(typeof t!="number")if(i){if(r.length!=t.length)throw new Error("Cannot multiply matrix element-wise because the matrices' sizes don't match.");for(let s=0,o=r.length;s<o;s++)n.push(r[s].$multiply(t[s]))}else{if(!e&&r[0].length!=t.length)throw new Error("Cannot multiply matrix if rows in matrix-a don't match columns in matrix-b.");if(e&&r[0].length!=t[0].length)throw new Error("Cannot multiply matrix if transposed and the columns in both matrices don't match.");e||(t=l.transpose(t));for(let s=0,o=r.length;s<o;s++){let a=h.make(t.length,0);for(let u=0,c=t.length;u<c;u++)a[u]=k.dot(r[s],t[u]);n.push(a)}}else for(let s=0,o=r.length;s<o;s++)n.push(r[s].$multiply(t));return n}static zipSlice(r,t,e=!1){let i=[];for(let n=0,s=r.length;n<s;n++){if(r[n].length-1<t&&e===!1)throw`Index ${t} is out of bounds`;i.push(r[n][t]||e)}return new h(i)}static zip(r,t=!1,e=!1){let i=new d,n=e?r.reduce((s,o)=>Math.max(s,o.length),0):r[0].length;for(let s=0;s<n;s++)i.push(l.zipSlice(r,s,t));return i}static transpose(r,t=!1,e=!1){return l.zip(r,t,e)}static toDOMMatrix(r){return[r[0][0],r[0][1],r[1][0],r[1][1],r[2][0],r[2][1]]}static transform2D(r,t){let e=r[0]*t[0][0]+r[1]*t[1][0]+t[2][0],i=r[0]*t[0][1]+r[1]*t[1][1]+t[2][1];return new h(e,i)}static scale2DMatrix(r,t){return new d(new h(r,0,0),new h(0,t,0),new h(0,0,1))}static rotate2DMatrix(r,t){return new d(new h(r,t,0),new h(-t,r,0),new h(0,0,1))}static shear2DMatrix(r,t){return new d(new h(1,r,0),new h(t,1,0),new h(0,0,1))}static translate2DMatrix(r,t){return new d(new h(1,0,0),new h(0,1,0),new h(r,t,1))}static scaleAt2DMatrix(r,t,e){let i=l.scale2DMatrix(r,t);return i[2][0]=-e[0]*r+e[0],i[2][1]=-e[1]*t+e[1],i}static rotateAt2DMatrix(r,t,e){let i=l.rotate2DMatrix(r,t);return i[2][0]=e[0]*(1-r)+e[1]*t,i[2][1]=e[1]*(1-r)-e[0]*t,i}static shearAt2DMatrix(r,t,e){let i=l.shear2DMatrix(r,t);return i[2][0]=-e[1]*t,i[2][1]=-e[0]*r,i}static reflectAt2DMatrix(r,t){let e=E.intercept(r,t);if(e==null)return[new h([-1,0,0]),new h([0,1,0]),new h([r[0]+t[0],0,1])];{let i=e.yi,n=Math.atan(e.slope)*2,s=Math.cos(n),o=Math.sin(n);return[new h([s,o,0]),new h([o,-s,0]),new h([-i*o,i+i*s,1])]}}};var N=(l,r="expected")=>m.warn("Group's length is less than "+r,l),Wt=(l,r="")=>m.warn(`Index ${r} is out of bound in Group`,l),E=class l{static fromAngle(r,t,e){let i=new d(new h(r),new h(r));return i[1].toAngle(t,e,!0),i}static slope(r,t){return t[0]-r[0]===0?void 0:(t[1]-r[1])/(t[0]-r[0])}static intercept(r,t){if(t[0]-r[0]!==0){let e=(t[1]-r[1])/(t[0]-r[0]),i=r[1]-e*r[0];return{slope:e,yi:i,xi:e===0?void 0:-i/e}}}static sideOfPt2D(r,t){let e=m.iterToArray(r);return(e[1][0]-e[0][0])*(t[1]-e[0][1])-(t[0]-e[0][0])*(e[1][1]-e[0][1])}static collinear(r,t,e,i=.01){let n=new h(0,0,0).to(r).$subtract(t),s=new h(0,0,0).to(r).$subtract(e);return n.$cross(s).divide(1e3).equals(new h(0,0,0),i)}static magnitude(r){let t=m.iterToArray(r);return t.length>=2?t[1].$subtract(t[0]).magnitude():0}static magnitudeSq(r){let t=m.iterToArray(r);return t.length>=2?t[1].$subtract(t[0]).magnitudeSq():0}static perpendicularFromPt(r,t,e=!1){let i=m.iterToArray(r);if(i[0].equals(i[1]))return;let n=i[0].$subtract(i[1]),s=i[1].$subtract(t),o=s.$subtract(n.$project(s));return e?o:o.$add(t)}static distanceFromPt(r,t){let e=m.iterToArray(r),i=l.perpendicularFromPt(e,t,!0);return i?i.magnitude():e[0].$subtract(t).magnitude()}static intersectRay2D(r,t){let e=m.iterToArray(r),i=m.iterToArray(t),n=l.intercept(e[0],e[1]),s=l.intercept(i[0],i[1]),o=e[0],a=i[0];if(n==null){if(s==null)return;let u=-s.slope*(a[0]-o[0])+a[1];return new h(o[0],u)}else if(s==null){let u=-n.slope*(o[0]-a[0])+o[1];return new h(a[0],u)}else if(s.slope!=n.slope){let u=(n.slope*o[0]-s.slope*a[0]+a[1]-o[1])/(n.slope-s.slope),c=n.slope*(u-o[0])+o[1];return new h(u,c)}else return n.yi==s.yi?new h(o[0],o[1]):void 0}static intersectLine2D(r,t){let e=m.iterToArray(r),i=m.iterToArray(t),n=l.intersectRay2D(e,i);return n&&y.withinBound(n,e[0],e[1])&&y.withinBound(n,i[0],i[1])?n:void 0}static intersectLineWithRay2D(r,t){let e=m.iterToArray(r),i=m.iterToArray(t),n=l.intersectRay2D(e,i);return n&&y.withinBound(n,e[0],e[1])?n:void 0}static intersectPolygon2D(r,t,e=!1){let i=m.iterToArray(r),n=m.iterToArray(t),s=e?l.intersectLineWithRay2D:l.intersectLine2D,o=new d;for(let a=0,u=n.length;a<u;a++){let c=a===u-1?0:a+1,f=s([n[a],n[c]],i);f&&o.push(f)}return o.length>0?o:void 0}static intersectLines2D(r,t,e=!1){let i=new d,n=e?l.intersectLineWithRay2D:l.intersectLine2D;for(let s of r)for(let o of t){let a=n(s,o);a&&i.push(a)}return i}static intersectGridWithRay2D(r,t){let e=m.iterToArray(r),i=l.intercept(new h(e[0]).subtract(t),new h(e[1]).subtract(t)),n=new d;return i&&i.xi&&n.push(new h(t[0]+i.xi,t[1])),i&&i.yi&&n.push(new h(t[0],t[1]+i.yi)),n}static intersectGridWithLine2D(r,t){let e=m.iterToArray(r),i=l.intersectGridWithRay2D(e,t),n=new d;for(let s=0,o=i.length;s<o;s++)y.withinBound(i[s],e[0],e[1])&&n.push(i[s]);return n}static intersectRect2D(r,t){let e=m.iterToArray(r),i=m.iterToArray(t),n=y.boundingBox(d.fromPtArray(e));return M.hasIntersectRect2D(n,i)?l.intersectLines2D([e],M.sides(i)):new d}static subpoints(r,t){let e=m.iterToArray(r),i=new d;for(let n=1;n<=t;n++)i.push(y.interpolate(e[0],e[1],n/(t+1)));return i}static crop(r,t,e=0,i=!0){let n=m.iterToArray(r),o=n[e===0?1:0].$subtract(n[e]);if(o[0]===0||t[0]===0)return n[e];if(i){let a=o.unit().multiply(t[1]);return n[e].$add(a)}else{let a=M.fromCenter(n[e],t),u=M.sides(a),c=0;return Math.abs(o[1]/o[0])>Math.abs(t[1]/t[0])?c=o[1]<0?0:2:c=o[0]<0?3:1,l.intersectRay2D(u[c],n)}}static marker(r,t,e="arrow",i=!0){let n=m.iterToArray(r),s=i?0:1,o=i?1:0,a=n[s].$subtract(n[o]);if(a.magnitudeSq()===0)return new d;a.unit();let u=y.perpendicular(a).multiply(t[0]).add(n[o]);return e=="arrow"?(u.add(a.$multiply(t[1])),new d(n[o],u[0],u[1])):new d(u[0],u[1])}static toRect(r){let t=m.iterToArray(r);return new d(t[0].$min(t[1]),t[0].$max(t[1]))}},M=class l{static from(r,t,e){return l.fromTopLeft(r,t,e)}static fromTopLeft(r,t,e){let i=typeof t=="number"?[t,e||t]:t;return new d(new h(r),new h(r).add(i))}static fromCenter(r,t,e){let i=typeof t=="number"?[t/2,(e||t)/2]:new h(t).divide(2);return new d(new h(r).subtract(i),new h(r).add(i))}static toCircle(r,t=!0){return B.fromRect(r,t)}static toSquare(r,t=!1){let e=m.iterToArray(r),i=l.size(e),n=t?i.maxValue().value:i.minValue().value;return l.fromCenter(l.center(e),n,n)}static size(r){let t=m.iterToArray(r);return t[0].$max(t[1]).subtract(t[0].$min(t[1]))}static center(r){let t=m.iterToArray(r),e=t[0].$min(t[1]),i=t[0].$max(t[1]);return e.add(i.$subtract(e).divide(2))}static corners(r){let t=m.iterToArray(r),e=t[0].$min(t[1]),i=t[0].$max(t[1]);return new d(e,new h(i.x,e.y),i,new h(e.x,i.y))}static sides(r){let[t,e,i,n]=l.corners(r);return[new d(t,e),new d(e,i),new d(i,n),new d(n,t)]}static boundingBox(r){let t=m.iterToArray(r),e=m.flatten(t,!1),i=h.make(2,Number.MAX_VALUE),n=h.make(2,Number.MIN_VALUE);for(let s=0,o=e.length;s<o;s++){let a=0;for(let u of e[s])if(i[a]=Math.min(i[a],u[a]),n[a]=Math.max(n[a],u[a]),++a>=2)break}return new d(i,n)}static polygon(r){return l.corners(r)}static quadrants(r,t){let e=m.iterToArray(r),i=l.corners(e),n=t!=null?new h(t):l.center(e);return i.map(s=>new d(s,n).boundingBox())}static halves(r,t=.5,e=!1){let i=m.iterToArray(r),n=i[0].$min(i[1]),s=i[0].$max(i[1]),o=e?L.lerp(n[1],s[1],t):L.lerp(n[0],s[0],t);return e?[new d(n,new h(s[0],o)),new d(new h(n[0],o),s)]:[new d(n,new h(o,s[1])),new d(new h(o,n[1]),s)]}static withinBound(r,t){let e=m.iterToArray(r);return y.withinBound(t,e[0],e[1])}static hasIntersectRect2D(r,t,e=!1){let i=m.iterToArray(r),n=m.iterToArray(t);return e&&(i=y.boundingBox(i),n=y.boundingBox(n)),!(i[0][0]>n[1][0]||n[0][0]>i[1][0]||i[0][1]>n[1][1]||n[0][1]>i[1][1])}static intersectRect2D(r,t){let e=m.iterToArray(r),i=m.iterToArray(t);return l.hasIntersectRect2D(e,i)?E.intersectLines2D(l.sides(e),l.sides(i)):new d}},B=class l{static fromRect(r,t=!1){let e=m.iterToArray(r),i=0,n=i=M.size(e).minValue().value/2;if(t){let s=M.size(e).maxValue().value/2;i=Math.sqrt(n*n+s*s)}else i=n;return new d(M.center(e),new h(i,i))}static fromTriangle(r,t=!1){return t?j.circumcircle(r):j.incircle(r)}static fromCenter(r,t){return new d(new h(r),new h(t,t))}static withinBound(r,t,e=0){let i=m.iterToArray(r),n=i[0].$subtract(t);return n.dot(n)+e<i[1].x*i[1].x}static intersectRay2D(r,t){let e=m.iterToArray(r),i=m.iterToArray(t),n=i[0].$subtract(i[1]),s=e[0].$subtract(i[0]),o=n.dot(n),a=s.dot(n),u=s.dot(s)-e[1].x*e[1].x,c=a/o,f=u/o,p=c*c-f;if(p<0)return new d;{let b=Math.sqrt(p),P=-c+b,_=i[0].$subtract(n.$multiply(P));if(p===0)return new d(_);let D=-c-b,A=i[0].$subtract(n.$multiply(D));return new d(_,A)}}static intersectLine2D(r,t){let e=m.iterToArray(r),i=m.iterToArray(t),n=l.intersectRay2D(e,i),s=new d;if(n.length>0)for(let o=0,a=n.length;o<a;o++)M.withinBound(i,n[o])&&s.push(n[o]);return s}static intersectCircle2D(r,t){let e=m.iterToArray(r),i=m.iterToArray(t),n=i[0].$subtract(e[0]),s=n.magnitudeSq(),o=Math.sqrt(s),a=e[1].x,u=i[1].x,c=a*a,f=u*u;if(o>a+u)return new d;if(o<Math.abs(a-u))return new d(e[0].clone());{let p=(c-f+s)/(2*o),b=Math.sqrt(c-p*p),P=n.$multiply(p/o).add(e[0]);return new d(new h(P.x+b*n.y/o,P.y-b*n.x/o),new h(P.x-b*n.y/o,P.y+b*n.x/o))}}static intersectRect2D(r,t){let e=m.iterToArray(r),i=m.iterToArray(t),n=M.sides(i),s=[];for(let o=0,a=n.length;o<a;o++){let u=l.intersectLine2D(e,n[o]);u.length>0&&s.push(u)}return m.flatten(s)}static toRect(r,t=!1){let e=m.iterToArray(r),i=e[1][0];if(t){let n=Math.sqrt(i*i)/2;return new d(e[0].$subtract(n),e[0].$add(n))}else return new d(e[0].$subtract(i),e[0].$add(i))}static toTriangle(r,t=!0){let e=m.iterToArray(r);if(t){let i=-Math.PI/2,n=Math.PI*2/3,s=new d;for(let o=0;o<3;o++)s.push(e[0].clone().toAngle(i,e[1][0],!0)),i+=n;return s}else return j.fromCenter(e[0],e[1][0])}},j=class l{static fromRect(r){let t=m.iterToArray(r),e=t[0].$add(t[1]).divide(2);e.y=t[0][1];let i=t[1].clone();return i.x=t[0][0],new d(e,t[1].clone(),i)}static fromCircle(r){return B.toTriangle(r,!0)}static fromCenter(r,t){return l.fromCircle(B.fromCenter(r,t))}static medial(r){let t=m.iterToArray(r);return t.length<3?N(new d,3):S.midpoints(t,!0)}static oppositeSide(r,t){let e=m.iterToArray(r);return e.length<3?N(new d,3):t===0?d.fromPtArray([e[1],e[2]]):t===1?d.fromPtArray([e[0],e[2]]):d.fromPtArray([e[0],e[1]])}static altitude(r,t){let e=m.iterToArray(r),i=l.oppositeSide(e,t);return i.length>1?new d(e[t],E.perpendicularFromPt(i,e[t])):new d}static orthocenter(r){let t=m.iterToArray(r);if(t.length<3)return N(void 0,3);let e=l.altitude(t,0),i=l.altitude(t,1);return E.intersectRay2D(e,i)}static incenter(r){let t=m.iterToArray(r);if(t.length<3)return N(void 0,3);let e=S.bisector(t,0).add(t[0]),i=S.bisector(t,1).add(t[1]);return E.intersectRay2D(new d(t[0],e),new d(t[1],i))}static incircle(r,t){let e=m.iterToArray(r),i=t||l.incenter(e),n=S.area(e),s=S.perimeter(e,!0),o=2*n/s.total;return B.fromCenter(i,o)}static circumcenter(r){let t=m.iterToArray(r),e=l.medial(t),i=[e[0],y.perpendicular(t[0].$subtract(e[0])).p1.$add(e[0])],n=[e[1],y.perpendicular(t[1].$subtract(e[1])).p1.$add(e[1])];return E.intersectRay2D(i,n)}static circumcircle(r,t){let e=m.iterToArray(r),i=t||l.circumcenter(e),n=e[0].$subtract(i).magnitude();return B.fromCenter(i,n)}},S=class l{static centroid(r){return y.centroid(r)}static rectangle(r,t,e){return M.corners(M.fromCenter(r,t,e))}static fromCenter(r,t,e){let i=new d;for(let n=0;n<e;n++){let s=Math.PI*2*n/e;i.push(new h(Math.cos(s)*t,Math.sin(s)*t).add(r))}return i}static lineAt(r,t){let e=m.iterToArray(r);if(t<0||t>=e.length)throw new Error("index out of the Polygon's range");return new d(e[t],t===e.length-1?e[0]:e[t+1])}static lines(r,t=!0){let e=m.iterToArray(r);if(e.length<2)return N(new d,2);let i=m.split(e,2,1);return t&&i.push(new d(e[e.length-1],e[0])),i.map(n=>n)}static midpoints(r,t=!1,e=.5){return l.lines(r,t).map(s=>y.interpolate(s[0],s[1],e))}static adjacentSides(r,t,e=!1){let i=m.iterToArray(r);if(i.length<2)return N(new d,2);if(t<0||t>=i.length)return Wt(new d,t);let n=[],s=t-1;e&&s<0&&(s=i.length-1),s>=0&&n.push(new d(i[t],i[s]));let o=t+1;return e&&o>i.length-1&&(o=0),o<=i.length-1&&n.push(new d(i[t],i[o])),n}static bisector(r,t){let e=l.adjacentSides(r,t,!0);if(e.length>=2){let i=e[0][1].$subtract(e[0][0]).unit(),n=e[1][1].$subtract(e[1][0]).unit();return i.add(n).divide(2)}else return}static perimeter(r,t=!1){let e=l.lines(r,t),i=0,n=h.make(e.length,0);for(let s=0,o=e.length;s<o;s++){let a=E.magnitude(e[s]);i+=a,n[s]=a}return{total:i,segments:n}}static area(r){let t=m.iterToArray(r);if(t.length<3)return N(new d,3);let e=(n,s)=>n[0]*s[1]-n[1]*s[0],i=0;for(let n=0,s=t.length;n<s;n++)n<t.length-1?i+=e(t[n],t[n+1]):i+=e(t[n],t[0]);return Math.abs(i/2)}static convexHull(r,t=!1){let e=m.iterToArray(r);if(e.length<3)return N(new d,3);t||(e=e.slice(),e.sort((u,c)=>u[0]-c[0]));let i=(u,c,f)=>(c[0]-u[0])*(f[1]-u[1])-(f[0]-u[0])*(c[1]-u[1])>0,n=[],s=e.length-2,o=s+3;n[s]=e[2],n[o]=e[2],i(e[0],e[1],e[2])?(n[s+1]=e[0],n[s+2]=e[1]):(n[s+1]=e[1],n[s+2]=e[0]);for(let u=3,c=e.length;u<c;u++){let f=e[u];if(!(i(n[s],n[s+1],f)&&i(n[o-1],n[o],f))){for(;!i(n[s],n[s+1],f);)s+=1;for(s-=1,n[s]=f;!i(n[o-1],n[o],f);)o-=1;o+=1,n[o]=f}}let a=new d;for(let u=0;u<o-s;u++)a.push(n[s+u]);return a}static network(r,t=0){let e=m.iterToArray(r),i=[];for(let n=0,s=e.length;n<s;n++)n!=t&&i.push(new d(e[t],e[n]));return i}static nearestPt(r,t){let e=Number.MAX_VALUE,i=-1,n=0;for(let s of r){let o=s.$subtract(t).magnitudeSq();o<e&&(e=o,i=n),n++}return i}static projectAxis(r,t){let e=m.iterToArray(r),i=t.dot(e[0]),n=new h(i,i);for(let s=1,o=e.length;s<o;s++)i=t.dot(e[s]),n=new h(Math.min(i,n[0]),Math.max(i,n[1]));return n}static _axisOverlap(r,t,e){let i=l.projectAxis(r,e),n=l.projectAxis(t,e);return i[0]<n[0]?n[0]-i[1]:i[0]-n[1]}static hasIntersectPoint(r,t){let e=m.iterToArray(r),i=!1;for(let n=0,s=e.length;n<s;n++){let o=l.lineAt(e,n);o[0][1]>t[1]!=o[1][1]>t[1]&&t[0]<(o[1][0]-o[0][0])*(t[1]-o[0][1])/(o[1][1]-o[0][1])+o[0][0]&&(i=!i)}return i}static hasIntersectCircle(r,t){let e=m.iterToArray(r),i=m.iterToArray(t),n={which:-1,dist:0,normal:null,edge:null,vertex:null},s=i[0],o=i[1][0],a=Number.MAX_SAFE_INTEGER;for(let c=0,f=e.length;c<f;c++){let p=l.lineAt(e,c),b=new h(p[0].y-p[1].y,p[1].x-p[0].x).unit(),P=new d(s.$add(b.$multiply(o)),s.$subtract(b.$multiply(o))),_=l._axisOverlap(e,P,b);if(_>0)return null;Math.abs(_)<a&&(M.withinBound(p,E.perpendicularFromPt(p,s))||B.intersectLine2D(t,p).length>0)&&(n.edge=p,n.normal=b,a=Math.abs(_),n.which=c)}return n.edge?(s.$subtract(l.centroid(e)).dot(n.normal)<0&&n.normal.multiply(-1),n.dist=a,n.vertex=s,n):null}static hasIntersectPolygon(r,t){let e=m.iterToArray(r),i=m.iterToArray(t),n={which:-1,dist:0,normal:new h,edge:new d,vertex:new h},s=Number.MAX_SAFE_INTEGER;for(let b=0,P=e.length+i.length;b<P;b++){let _=b<e.length?l.lineAt(e,b):l.lineAt(i,b-e.length),D=new h(_[0].y-_[1].y,_[1].x-_[0].x).unit(),A=l._axisOverlap(e,i,D);if(A>0)return null;Math.abs(A)<s&&(n.edge=_,n.normal=D,s=Math.abs(A),n.which=b<e.length?0:1)}n.dist=s;let o=n.which===0?i:e,a=n.which===0?e:i,u=l.centroid(o),c=l.centroid(a);u.$subtract(c).dot(n.normal)<0&&n.normal.multiply(-1);let p=Number.MAX_SAFE_INTEGER;for(let b=0,P=o.length;b<P;b++){let _=n.normal.dot(o[b].$subtract(c));_<p&&(p=_,n.vertex=o[b])}return n}static intersectPolygon2D(r,t){let e=m.iterToArray(r),i=m.iterToArray(t),n=l.lines(e),s=[];for(let o=0,a=n.length;o<a;o++){let u=E.intersectPolygon2D(n[o],i,!1);u&&s.push(u)}return m.flatten(s,!0)}static toRects(r){let t=[];for(let i of r)t.push(y.boundingBox(i));let e=m.flatten(t,!1);return t.unshift(y.boundingBox(e)),t}},K=class l{static getSteps(r){let t=new d;for(let e=0;e<=r;e++){let i=e/r;t.push(new h(i*i*i,i*i,i,1))}return t}static controlPoints(r,t=0,e=!1){let i=m.iterToArray(r);if(t>i.length-1)return new d;let n=o=>o<i.length-1?o:i.length-1,s=i[t];return t=e?t:t+1,new d(s,i[n(t++)],i[n(t++)],i[n(t++)])}static _calcPt(r,t){let e=r.reduce((n,s,o)=>n+s.x*t[o],0),i=r.reduce((n,s,o)=>n+s.y*t[o],0);if(r[0].length>2){let n=r.reduce((s,o,a)=>s+o.z*t[a],0);return new h(e,i,n)}return new h(e,i)}static catmullRom(r,t=10){let e=m.iterToArray(r);if(e.length<2)return new d;let i=new d,n=l.getSteps(t),s=l.controlPoints(e,0,!0);for(let a=0;a<=t;a++)i.push(l.catmullRomStep(n[a],s));let o=0;for(;o<e.length-2;){let a=l.controlPoints(e,o);if(a.length>0){for(let u=0;u<=t;u++)i.push(l.catmullRomStep(n[u],a));o++}}return i}static catmullRomStep(r,t){let e=new d(new h(-.5,1,-.5,0),new h(1.5,-2.5,0,1),new h(-1.5,2,.5,0),new h(.5,-.5,0,0));return l._calcPt(t,C.multiply([r],e,!0)[0])}static cardinal(r,t=10,e=.5){let i=m.iterToArray(r);if(i.length<2)return new d;let n=new d,s=l.getSteps(t),o=l.controlPoints(i,0,!0);for(let u=0;u<=t;u++)n.push(l.cardinalStep(s[u],o,e));let a=0;for(;a<i.length-2;){let u=l.controlPoints(i,a);if(u.length>0){for(let c=0;c<=t;c++)n.push(l.cardinalStep(s[c],u,e));a++}}return n}static cardinalStep(r,t,e=.5){let i=new d(new h(-1,2,-1,0),new h(-1,1,0,0),new h(1,-2,1,0),new h(1,-1,0,0)),n=C.multiply([r],i,!0)[0].multiply(e),s=2*r[0]-3*r[1]+1,o=-2*r[0]+3*r[1],a=l._calcPt(t,n);return a.x+=s*t[1].x+o*t[2].x,a.y+=s*t[1].y+o*t[2].y,a.length>2&&(a.z+=s*t[1].z+o*t[2].z),a}static bezier(r,t=10){let e=m.iterToArray(r);if(e.length<4)return new d;let i=new d,n=l.getSteps(t),s=0;for(;s<e.length-3;){let o=l.controlPoints(e,s);if(o.length>0){for(let a=0;a<=t;a++)i.push(l.bezierStep(n[a],o));s+=3}}return i}static bezierStep(r,t){let e=new d(new h(-1,3,-3,1),new h(3,-6,3,0),new h(-3,3,0,0),new h(1,0,0,0));return l._calcPt(t,C.multiply([r],e,!0)[0])}static bspline(r,t=10,e=1){let i=m.iterToArray(r);if(i.length<2)return new d;let n=new d,s=l.getSteps(t),o=0;for(;o<i.length-3;){let a=l.controlPoints(i,o);if(a.length>0){if(e!==1)for(let u=0;u<=t;u++)n.push(l.bsplineTensionStep(s[u],a,e));else for(let u=0;u<=t;u++)n.push(l.bsplineStep(s[u],a));o++}}return n}static bsplineStep(r,t){let e=new d(new h(-.16666666666666666,.5,-.5,.16666666666666666),new h(.5,-1,0,.6666666666666666),new h(-.5,.5,.5,.16666666666666666),new h(.16666666666666666,0,0,0));return l._calcPt(t,C.multiply([r],e,!0)[0])}static bsplineTensionStep(r,t,e=1){let i=new d(new h(-.16666666666666666,.5,-.5,.16666666666666666),new h(-1.5,2,0,-.3333333333333333),new h(1.5,-2.5,.5,.16666666666666666),new h(.16666666666666666,0,0,0)),n=C.multiply([r],i,!0)[0].multiply(e),s=2*r[0]-3*r[1]+1,o=-2*r[0]+3*r[1],a=l._calcPt(t,n);return a.x+=s*t[1].x+o*t[2].x,a.y+=s*t[1].y+o*t[2].y,a.length>2&&(a.z+=s*t[1].z+o*t[2].z),a}};function Xt(){let l=4022871197;return function(t){if(t){t=t.toString();for(let e=0;e<t.length;e++){l+=t.charCodeAt(e);let i=.02519603282416938*l;l=i>>>0,i-=l,i*=l,l=i>>>0,i-=l,l+=i*4294967296}return(l>>>0)*23283064365386963e-26}else l=4022871197}}function Ut(l){let r=48,t=1,e=r,i=new Array(r),n,s,o=0,a=Xt();for(n=0;n<r;n++)i[n]=a(Math.random().toString());function u(){for(a(),n=0;n<r;n++)i[n]=a(" ");t=1,e=r}function c(p){return p=p.replace(/(^\s*)|(\s*$)/gi,""),p=p.replace(/[\x00-\x1F]/gi,""),p=p.replace(/\n /,`
5
- `),p}function f(p){for(p=c(p),a(p),n=0;n<p.length;n++)for(o=p.charCodeAt(n),s=0;s<r;s++)i[s]-=a(o.toString()),i[s]<0&&(i[s]+=1)}return u(),f(l),{random(){++e>=r&&(e=0);let p=1768863*i[e]+t*23283064365386963e-26;return i[e]=p-(t=p|0)}}}var L=class l{static equals(r,t,e=1e-5){return Math.abs(r-t)<e}static lerp(r,t,e){return(1-e)*r+e*t}static clamp(r,t,e){return Math.max(t,Math.min(e,r))}static boundValue(r,t,e){let i=Math.abs(e-t),n=r%i;return n>e?n-=i:n<t&&(n+=i),n}static within(r,t,e){return r>=Math.min(t,e)&&r<=Math.max(t,e)}static randomRange(r,t=0){let e=r>t?r-t:t-r;return r+l.random()*e}static randomPt(r,t){let e=new h(r.length),i=t?k.subtract(t.slice(),r):r,n=t?r:new h(r.length).fill(0);for(let s=0,o=e.length;s<o;s++)e[s]=l.random()*i[s]+n[s];return e}static normalizeValue(r,t,e){let i=Math.min(t,e),n=Math.max(t,e);return(r-i)/(n-i)}static sum(r){let t=m.iterToArray(r),e=new h(t[0]);for(let i=1,n=t.length;i<n;i++)k.add(e,t[i]);return e}static average(r){let t=m.iterToArray(r);return l.sum(t).divide(t.length)}static cycle(r,t=st.sineInOut){return t(r>.5?2-r*2:r*2)}static mapToRange(r,t,e,i,n){if(t==e)throw new Error("[currMin, currMax] must define a range that is not zero");let s=Math.min(i,n),o=Math.max(i,n);return l.normalizeValue(r,t,e)*(o-s)+s}static seed(r){this.generator=Ut(r)}static random(){return this.generator?this.generator.random():Math.random()}},y=class l{static boundAngle(r){return L.boundValue(r,0,360)}static boundRadian(r){return L.boundValue(r,0,w.two_pi)}static toRadian(r){return r*w.deg_to_rad}static toDegree(r){return r*w.rad_to_deg}static boundingBox(r){let t,e;for(let i of r)t==null?(t=i.clone(),e=i.clone()):(t=t.$min(i),e=e.$max(i));return new d(t,e)}static centroid(r){return L.average(r)}static anchor(r,t=0,e="to"){let i=e=="to"?"subtract":"add",n=0;for(let s of r)typeof t=="number"?t!==n&&s[i](r[t]):s[i](t),n++}static interpolate(r,t,e=.5){let i=Math.min(r.length,t.length),n=h.make(i);for(let s=0;s<i;s++)n[s]=r[s]*(1-e)+t[s]*e;return n}static perpendicular(r,t=w.xy){let e=t[1],i=t[0],n=new h(r),s=new h(n);s[i]=-n[e],s[e]=n[i];let o=new h(n);return o[i]=n[e],o[e]=-n[i],new d(s,o)}static isPerpendicular(r,t){return new h(r).dot(t)===0}static withinBound(r,t,e){for(let i=0,n=Math.min(r.length,t.length,e.length);i<n;i++)if(!L.within(r[i],t[i],e[i]))return!1;return!0}static sortEdges(r){let t=m.iterToArray(r),e=l.boundingBox(t),i=e[1].add(e[0]).divide(2),n=(s,o)=>{if(s.length<2||o.length<2)throw new Error("Pt dimension cannot be less than 2");let a=s.$subtract(i),u=o.$subtract(i);if(a[0]>=0&&u[0]<0)return 1;if(a[0]<0&&u[0]>=0)return-1;if(a[0]==0&&u[0]==0)return a[1]>=0||u[1]>=0?a[1]>u[1]?1:-1:u[1]>a[1]?1:-1;let c=a.$cross2D(u);return c<0?1:c>0?-1:a[0]*a[0]+a[1]*a[1]>u[0]*u[0]+u[1]*u[1]?1:-1};return t.sort(n)}static scale(r,t,e){let i=m.iterToArray(r[0]!==void 0&&typeof r[0]=="number"?[r]:r),n=typeof t=="number"?h.make(i[0].length,t):t;e||(e=h.make(i[0].length,0));for(let s=0,o=i.length;s<o;s++){let a=i[s];for(let u=0,c=a.length;u<c;u++)a[u]=e&&e[u]?e[u]+(a[u]-e[u])*n[u]:a[u]*n[u]}return l}static rotate2D(r,t,e,i){let n=m.iterToArray(r[0]!==void 0&&typeof r[0]=="number"?[r]:r),s=e?C.rotateAt2DMatrix:C.rotate2DMatrix;e||(e=h.make(n[0].length,0));let o=Math.cos(t),a=Math.sin(t);for(let u=0,c=n.length;u<c;u++){let f=i?n[u].$take(i):n[u];if(f.to(C.transform2D(f,s(o,a,e))),i)for(let p=0;p<i.length;p++)n[u][i[p]]=f[p]}return l}static shear2D(r,t,e,i){let n=m.iterToArray(r[0]!==void 0&&typeof r[0]=="number"?[r]:r),s=typeof t=="number"?[t,t]:t;e||(e=h.make(n[0].length,0));let o=e?C.shearAt2DMatrix:C.shear2DMatrix,a=Math.tan(s[0]),u=Math.tan(s[1]);for(let c=0,f=n.length;c<f;c++){let p=i?n[c].$take(i):n[c];if(p.to(C.transform2D(p,o(a,u,e))),i)for(let b=0;b<i.length;b++)n[c][i[b]]=p[b]}return l}static reflect2D(r,t,e){let i=m.iterToArray(r[0]!==void 0&&typeof r[0]=="number"?[r]:r),n=m.iterToArray(t),s=C.reflectAt2DMatrix(n[0],n[1]);for(let o=0,a=i.length;o<a;o++){let u=e?i[o].$take(e):i[o];if(u.to(C.transform2D(u,s)),e)for(let c=0;c<e.length;c++)i[o][e[c]]=u[c]}return l}static cosTable(){let r=new Float64Array(360);for(let e=0;e<360;e++)r[e]=Math.cos(e*Math.PI/180);return{table:r,cos:e=>r[Math.floor(l.boundAngle(l.toDegree(e)))]}}static sinTable(){let r=new Float64Array(360);for(let e=0;e<360;e++)r[e]=Math.sin(e*Math.PI/180);return{table:r,sin:e=>r[Math.floor(l.boundAngle(l.toDegree(e)))]}}},st=class l{static linear(r,t=1){return t*r}static quadraticIn(r,t=1){return t*r*r}static quadraticOut(r,t=1){return-t*r*(r-2)}static quadraticInOut(r,t=1){let e=r*2;return r<.5?t/2*r*r*4:-t/2*((e-1)*(e-3)-1)}static cubicIn(r,t=1){return t*r*r*r}static cubicOut(r,t=1){let e=r-1;return t*(e*e*e+1)}static cubicInOut(r,t=1){let e=r*2;return r<.5?t/2*e*e*e:t/2*((e-2)*(e-2)*(e-2)+2)}static exponentialIn(r,t=1,e=.25){return t*Math.pow(r,1/e)}static exponentialOut(r,t=1,e=.25){return t*Math.pow(r,e)}static sineIn(r,t=1){return-t*Math.cos(r*w.half_pi)+t}static sineOut(r,t=1){return t*Math.sin(r*w.half_pi)}static sineInOut(r,t=1){return-t/2*(Math.cos(Math.PI*r)-1)}static cosineApprox(r,t=1){let e=r*r,i=e*e,n=i*e;return t*(4*n/9-17*i/9+22*e/9)}static circularIn(r,t=1){return-t*(Math.sqrt(1-r*r)-1)}static circularOut(r,t=1){let e=r-1;return t*Math.sqrt(1-e*e)}static circularInOut(r,t=1){let e=r*2;return r<.5?-t/2*(Math.sqrt(1-e*e)-1):t/2*(Math.sqrt(1-(e-2)*(e-2))+1)}static elasticIn(r,t=1,e=.7){let i=r-1,n=e/w.two_pi*1.5707963267948966;return t*(-Math.pow(2,10*i)*Math.sin((i-n)*w.two_pi/e))}static elasticOut(r,t=1,e=.7){let i=e/w.two_pi*1.5707963267948966;return t*(Math.pow(2,-10*r)*Math.sin((r-i)*w.two_pi/e))+t}static elasticInOut(r,t=1,e=.6){let i=r*2,n=e/w.two_pi*1.5707963267948966;return r<.5?(i-=1,t*(-.5*(Math.pow(2,10*i)*Math.sin((i-n)*w.two_pi/e)))):(i-=1,t*(.5*(Math.pow(2,-10*i)*Math.sin((i-n)*w.two_pi/e)))+t)}static bounceIn(r,t=1){return t-l.bounceOut(1-r,t)}static bounceOut(r,t=1){return r<1/2.75?t*(7.5625*r*r):r<2/2.75?(r-=1.5/2.75,t*(7.5625*r*r+.75)):r<2.5/2.75?(r-=2.25/2.75,t*(7.5625*r*r+.9375)):(r-=2.625/2.75,t*(7.5625*r*r+.984375))}static bounceInOut(r,t=1){return r<.5?l.bounceIn(r*2,t)/2:l.bounceOut(r*2-1,t)/2+t/2}static sigmoid(r,t=1,e=10){let i=e*(r-.5);return t/(1+Math.exp(-i))}static logSigmoid(r,t=1,e=.7){e=Math.max(w.epsilon,Math.min(1-w.epsilon,e)),e=1/(1-e);let i=1/(1+Math.exp((r-.5)*e*-2)),n=1/(1+Math.exp(e)),s=1/(1+Math.exp(-e));return t*(i-n)/(s-n)}static seat(r,t=1,e=.5){return r<.5?t*Math.pow(2*r,1-e)/2:t*(1-Math.pow(2*(1-r),1-e)/2)}static quadraticBezier(r,t=1,e=[.05,.95]){let i=typeof e!="number"?e[0]:e,n=typeof e!="number"?e[1]:.5,s=1-2*i;s===0&&(s=w.epsilon);let o=(Math.sqrt(i*i+s*r)-i)/s;return t*((1-2*n)*(o*o)+2*n*o)}static cubicBezier(r,t=1,e=[.1,.7],i=[.9,.2]){let n=new d(new h(0,0),new h(e),new h(i),new h(1,1));return t*K.bezierStep(new h(r*r*r,r*r,r,1),K.controlPoints(n)).y}static quadraticTarget(r,t=1,e=[.2,.35]){let i=Math.min(1-w.epsilon,Math.max(w.epsilon,e[0])),n=Math.min(1,Math.max(0,e[1])),s=(1-n)/(1-i)-n/i,o=(s*(i*i)-n)/i,a=s*(r*r)-o*r;return t*Math.min(1,Math.max(0,a))}static cliff(r,t=1,e=.5){return r>e?t:0}static step(r,t,e,i,...n){let s=1/t,o=Math.floor(e/s)*s;return r(o,i,...n)}},yt=class{constructor(r){this._dims=0;this._source=d.fromPtArray(r),this.calc()}get max(){return this._max.clone()}get min(){return this._min.clone()}get magnitude(){return this._mag.clone()}calc(){if(!this._source)return;let r=this._source[0].length;this._dims=r;let t=new h(r),e=new h(r),i=new h(r);for(let n=0;n<r;n++){t[n]=w.min,e[n]=w.max,i[n]=0;let s=this._source.zipSlice(n);for(let o=0,a=s.length;o<a;o++)t[n]=Math.max(t[n],s[o]),e[n]=Math.min(e[n],s[o]),i[n]=t[n]-e[n]}return this._max=t,this._min=e,this._mag=i,this}mapTo(r,t,e){let i=new d;for(let n=0,s=this._source.length;n<s;n++){let o=this._source[n],a=new h(this._dims);for(let u=0;u<this._dims;u++)a[u]=e&&e[u]?o[u]:L.mapToRange(o[u],this._min[u],this._max[u],r,t);i.push(a)}return i}append(r,t=!0){let e=m.iterToArray(r);if(e[0].length!==this._dims)throw new Error(`Dimensions don't match. ${this._dims} dimensions in Range and ${e[0].length} provided in parameter. `);return this._source=this._source.concat(e),t&&this.calc(),this}ticks(r){let t=new d;for(let e=0;e<=r;e++){let i=new h(this._dims);for(let n=0,s=this._max.length;n<s;n++)i[n]=L.lerp(this._min[n],this._max[n],e/r);t.push(i)}return t}};var w={xy:"xy",yz:"yz",xz:"xz",xyz:"xyz",horizontal:0,vertical:1,identical:0,right:4,bottom_right:5,bottom:6,bottom_left:7,left:8,top_left:1,top:2,top_right:3,epsilon:1e-4,max:Number.MAX_VALUE,min:Number.MIN_VALUE,pi:Math.PI,two_pi:6.283185307179586,half_pi:1.5707963267948966,quarter_pi:.7853981633974483,one_degree:.017453292519943295,rad_to_deg:57.29577951308232,deg_to_rad:.017453292519943295,gravity:9.81,newton:.10197,gaussian:.3989422804014327},H=class H{static warnLevel(r){return r&&(H._warnLevel=r),H._warnLevel}static getArgs(r){if(r.length<1)return[];let t=[],e=Array.isArray(r[0])||ArrayBuffer.isView(r[0]);if(typeof r[0]=="number")t=Array.prototype.slice.call(r);else if(typeof r[0]=="object"&&!e){let i=["x","y","z","w"],n=r[0];for(let s=0;s<i.length&&!(n.length&&s>=n.length||!(i[s]in n));s++)t.push(n[i[s]])}else e&&(t=[].slice.call(r[0]));return t}static warn(r="error",t=void 0){if(H.warnLevel()=="error")throw new Error(r);return H.warnLevel()=="warn"&&console.warn(r),t}static randomInt(r,t=0){return H.warn("Util.randomInt is deprecated. Please use `Num.randomRange`"),Math.floor(L.random()*r)+t}static split(r,t,e,i=!1,n=!0){let s=[],o=[],a=e||t,u=0;if(r.length<=0||a<=0)return[];for(;u<r.length;){o=[];for(let c=0;c<t;c++)if(i)o.push(r[(u+c)%r.length]);else{if(u+c>=r.length)break;o.push(r[u+c])}u+=a,(!n||n&&o.length===t)&&s.push(o)}return s}static flatten(r,t=!0){let e=t?new d:[];return e.concat.apply(e,r)}static combine(r,t,e){let i=[];for(let n=0,s=r.length;n<s;n++)for(let o=0,a=t.length;o<a;o++)i.push(e(r[n],t[o]));return i}static zip(r){let t=[];for(let e=0,i=r[0].length;e<i;e++){let n=[];for(let s=0;s<r.length;s++)n.push(r[s][e]);t.push(n)}return t}static stepper(r,t=0,e=1,i){let n=t;return function(){return n+=e,n>=r&&(n=t+(n-r)),i&&i(n),n}}static forRange(r,t,e=0,i=1){let n=[];for(let s=e,o=t;s<o;s+=i)n[s]=r(s);return n}static load(r,t){let e=new XMLHttpRequest;e.open("GET",r,!0),e.onload=function(){e.status>=200&&e.status<400?t(e.responseText,!0):t(`Server error (${e.status}) when loading "${r}"`,!1)},e.onerror=function(){t("Unknown network error",!1)},e.send()}static download(r,t="pts_canvas_image",e="png",i=1){let n=e==="jpg"?"jpeg":e;r.element.toBlob(function(s){let o=document.createElement("a"),a=URL.createObjectURL(s);o.href=a,o.download=`${t}.${e}`,document.body.appendChild(o),o.click(),document.body.removeChild(o),URL.revokeObjectURL(a)},`image/${n}`,i)}static performance(r=10){let t=Date.now(),e=[];return function(){let i=Date.now();return e.push(i-t),e.length>=r&&e.shift(),t=i,Math.floor(e.reduce((n,s)=>n+s,0)/e.length)}}static arrayCheck(r,t=2){return Array.isArray(r)&&r.length<t?(H.warn(`Requires ${t} or more Pts in this Group.`),!1):!0}static iterToArray(r){return Array.isArray(r)?r:[...r]}static isMobile(){return/iPhone|iPad|Android/i.test(navigator.userAgent)}static uniqueId(r=!1){return r&&crypto?crypto.randomUUID():Date.now().toString(36)+Math.random().toString(36).substring(2)}};H._warnLevel="mute";var m=H;var h=class l extends Float32Array{constructor(...r){let t;r.length===1&&typeof r[0]=="number"?t=r[0]:t=r.length>0?m.getArgs(r):[0,0],super(t)}static make(r,t=0,e=!1){let i=new Float32Array(r);if(t&&i.fill(t),e)for(let n=0,s=i.length;n<s;n++)i[n]=i[n]*L.random();return new l(i)}get id(){return this._id}set id(r){this._id=r}get x(){return this[0]}set x(r){this[0]=r}get y(){return this[1]}set y(r){this[1]=r}get z(){return this[2]}set z(r){this[2]=r}get w(){return this[3]}set w(r){this[3]=r}clone(){return new l(this)}equals(r,t=1e-6){for(let e=0,i=this.length;e<i;e++)if(Math.abs(this[e]-r[e])>t)return!1;return!0}to(...r){let t=m.getArgs(r);for(let e=0,i=Math.min(this.length,t.length);e<i;e++)this[e]=t[e];return this}$to(...r){return this.clone().to(...r)}toAngle(r,t,e=!1){let i=t!=null?t:this.magnitude(),n=[Math.cos(r)*i,Math.sin(r)*i];return e?this.add(n):this.to(n)}op(r){let t=this;return(...e)=>r(t,...e)}ops(r){let t=[];for(let e=0,i=r.length;e<i;e++)t.push(this.op(r[e]));return t}$take(r){let t=[];for(let e=0,i=r.length;e<i;e++)t.push(this[r[e]]||0);return new l(t)}$concat(...r){return new l(this.toArray().concat(m.getArgs(r)))}add(...r){return r.length===1&&typeof r[0]=="number"?k.add(this,r[0]):k.add(this,m.getArgs(r)),this}$add(...r){return this.clone().add(...r)}subtract(...r){return r.length===1&&typeof r[0]=="number"?k.subtract(this,r[0]):k.subtract(this,m.getArgs(r)),this}$subtract(...r){return this.clone().subtract(...r)}multiply(...r){return r.length===1&&typeof r[0]=="number"?k.multiply(this,r[0]):k.multiply(this,m.getArgs(r)),this}$multiply(...r){return this.clone().multiply(...r)}divide(...r){return r.length===1&&typeof r[0]=="number"?k.divide(this,r[0]):k.divide(this,m.getArgs(r)),this}$divide(...r){return this.clone().divide(...r)}magnitudeSq(){return k.dot(this,this)}magnitude(){return k.magnitude(this)}unit(r=void 0){return k.unit(this,r),this}$unit(r=void 0){return this.clone().unit(r)}dot(...r){return k.dot(this,m.getArgs(r))}$cross2D(...r){return k.cross2D(this,m.getArgs(r))}$cross(...r){return k.cross(this,m.getArgs(r))}$project(...r){return this.$multiply(this.dot(...r)/this.magnitudeSq())}projectScalar(...r){return this.dot(...r)/this.magnitude()}abs(){return k.abs(this),this}$abs(){return this.clone().abs()}floor(){return k.floor(this),this}$floor(){return this.clone().floor()}ceil(){return k.ceil(this),this}$ceil(){return this.clone().ceil()}round(){return k.round(this),this}$round(){return this.clone().round()}minValue(){return k.min(this)}maxValue(){return k.max(this)}$min(...r){let t=m.getArgs(r),e=this.clone();for(let i=0,n=Math.min(this.length,t.length);i<n;i++)e[i]=Math.min(this[i],t[i]);return e}$max(...r){let t=m.getArgs(r),e=this.clone();for(let i=0,n=Math.min(this.length,t.length);i<n;i++)e[i]=Math.max(this[i],t[i]);return e}angle(r=w.xy){return Math.atan2(this[r[1]],this[r[0]])}angleBetween(r,t=w.xy){return y.boundRadian(this.angle(t))-y.boundRadian(r.angle(t))}scale(r,t){return y.scale(this,r,t||l.make(this.length,0)),this}rotate2D(r,t,e){return y.rotate2D(this,r,t||l.make(this.length,0),e),this}shear2D(r,t,e){return y.shear2D(this,r,t||l.make(this.length,0),e),this}reflect2D(r,t){return y.reflect2D(this,r,t),this}toString(){return`Pt(${this.join(", ")})`}toArray(){return[].slice.call(this)}toGroup(){return new d(l.make(this.length),this.clone())}toBound(){return new G(l.make(this.length),this.clone())}},d=class l extends Array{constructor(...r){super(...r)}get id(){return this._id}set id(r){this._id=r}get p1(){return this[0]}get p2(){return this[1]}get p3(){return this[2]}get p4(){return this[3]}get q1(){return this[this.length-1]}get q2(){return this[this.length-2]}get q3(){return this[this.length-3]}get q4(){return this[this.length-4]}clone(){let r=new l;for(let t=0,e=this.length;t<e;t++)r.push(this[t].clone());return r}static fromArray(r){let t=new l;for(let e of r){let i=e instanceof h?e:new h(e);t.push(i)}return t}static fromPtArray(r){return l.from(r)}split(r,t,e=!1){return m.split(this,r,t,e)}insert(r,t=0){return l.prototype.splice.apply(this,[t,0,...r]),this}remove(r=0,t=1){let e=r<0?[r*-1-1,t]:[r,t];return l.prototype.splice.apply(this,e)}segments(r=2,t=1,e=!1){return this.split(r,t,e)}lines(){return this.segments(2,1)}centroid(){return y.centroid(this)}boundingBox(){return y.boundingBox(this)}anchorTo(r=0){y.anchor(this,r,"to")}anchorFrom(r=0){y.anchor(this,r,"from")}op(r){let t=this;return(...e)=>r(t,...e)}ops(r){let t=[];for(let e=0,i=r.length;e<i;e++)t.push(this.op(r[e]));return t}interpolate(r){r=L.clamp(r,0,1);let t=this.length-1,e=1/(this.length-1),i=Math.floor(r/e);return y.interpolate(this[i],this[Math.min(this.length-1,i+1)],(r-i*e)*t)}moveBy(...r){return this.add(...r)}moveTo(...r){let t=new h(m.getArgs(r)).subtract(this[0]);return this.moveBy(t),this}scale(r,t){for(let e=0,i=this.length;e<i;e++)y.scale(this[e],r,t||this[0]);return this}rotate2D(r,t,e){for(let i=0,n=this.length;i<n;i++)y.rotate2D(this[i],r,t||this[0],e);return this}shear2D(r,t,e){for(let i=0,n=this.length;i<n;i++)y.shear2D(this[i],r,t||this[0],e);return this}reflect2D(r,t){for(let e=0,i=this.length;e<i;e++)y.reflect2D(this[e],r,t);return this}sortByDimension(r,t=!1){return this.sort((e,i)=>t?i[r]-e[r]:e[r]-i[r])}forEachPt(r,...t){if(!this[0][r])return m.warn(`${r} is not a function of Pt`),this;for(let e=0,i=this.length;e<i;e++)this[e]=this[e][r](...t);return this}add(...r){return this.forEachPt("add",...r)}subtract(...r){return this.forEachPt("subtract",...r)}multiply(...r){return this.forEachPt("multiply",...r)}divide(...r){return this.forEachPt("divide",...r)}$matrixAdd(r){return C.add(this,r)}$matrixMultiply(r,t=!1,e=!1){return C.multiply(this,r,t,e)}zipSlice(r,t=!1){return C.zipSlice(this,r,t)}$zip(r=void 0,t=!1){return C.zip(this,r,t)}toBound(){return G.fromGroup(this)}toString(){return"Group[ "+this.reduce((r,t)=>r+t.toString()+" ","")+" ]"}},G=class l extends d{constructor(...t){super(...t);this._center=new h;this._size=new h;this._topLeft=new h;this._bottomRight=new h;this._inited=!1;this.init()}static fromBoundingRect(t){let e=new l(new h(t.left||0,t.top||0),new h(t.right||0,t.bottom||0));return t.width&&t.height&&(e.size=new h(t.width,t.height)),e}static fromGroup(t){let e=m.iterToArray(t);if(e.length<2)throw new Error("Cannot create a Bound from a group that has less than 2 Pt");return new l(e[0],e[e.length-1])}init(){if(this.p1&&(this._size=this.p1.clone(),this._inited=!0),this.p1&&this.p2){let t=this.p1,e=this.p2;this.topLeft=t.$min(e),this._bottomRight=t.$max(e),this._updateSize(),this._inited=!0}}clone(){return new l(this._topLeft.clone(),this._bottomRight.clone())}_updateSize(){this._size=this._bottomRight.$subtract(this._topLeft).abs(),this._updateCenter()}_updateCenter(){this._center=this._size.$multiply(.5).add(this._topLeft)}_updatePosFromTop(){this._bottomRight=this._topLeft.$add(this._size),this._updateCenter()}_updatePosFromBottom(){this._topLeft=this._bottomRight.$subtract(this._size),this._updateCenter()}_updatePosFromCenter(){let t=this._size.$multiply(.5);this._topLeft=this._center.$subtract(t),this._bottomRight=this._center.$add(t)}get size(){return new h(this._size)}set size(t){this._size=new h(t),this._updatePosFromTop()}get center(){return new h(this._center)}set center(t){this._center=new h(t),this._updatePosFromCenter()}get topLeft(){return new h(this._topLeft)}set topLeft(t){this._topLeft=new h(t),this[0]=this._topLeft,this._updateSize()}get bottomRight(){return new h(this._bottomRight)}set bottomRight(t){this._bottomRight=new h(t),this[1]=this._bottomRight,this._updateSize()}get width(){return this._size.length>0?this._size.x:0}set width(t){this._size.x=t,this._updatePosFromTop()}get height(){return this._size.length>1?this._size.y:0}set height(t){this._size.y=t,this._updatePosFromTop()}get depth(){return this._size.length>2?this._size.z:0}set depth(t){this._size.z=t,this._updatePosFromTop()}get x(){return this.topLeft.x}get y(){return this.topLeft.y}get z(){return this.topLeft.z}get inited(){return this._inited}update(){return this._topLeft=this[0],this._bottomRight=this[1],this._updateSize(),this}};var vt={};T(vt,{UI:()=>W,UIButton:()=>ot,UIDragger:()=>kt,UIPointerActions:()=>v,UIShape:()=>X});var X={rectangle:"rectangle",circle:"circle",polygon:"polygon",polyline:"polyline",line:"line"},v={up:"up",down:"down",move:"move",drag:"drag",uidrag:"uidrag",drop:"drop",uidrop:"uidrop",over:"over",out:"out",enter:"enter",leave:"leave",click:"click",keydown:"keydown",keyup:"keyup",pointerdown:"pointerdown",pointerup:"pointerup",contextmenu:"contextmenu",all:"all"},V=class V{constructor(r,t,e={},i){this._holds=new Map;this._group=d.fromArray(r),this._shape=t,this._id=i===void 0?`ui_${V._counter++}`:i,this._states=e,this._actions={}}static fromRectangle(r,t,e){return new this(r,X.rectangle,t,e)}static fromCircle(r,t,e){return new this(r,X.circle,t,e)}static fromPolygon(r,t,e){return new this(r,X.polygon,t,e)}static fromUI(r,t,e){return new this(r.group,r.shape,t||r._states,e)}get id(){return this._id}set id(r){this._id=r}get group(){return this._group}set group(r){this._group=r}get shape(){return this._shape}set shape(r){this._shape=r}state(r,t){return r?t!==void 0?(this._states[r]=t,this):this._states[r]:null}on(r,t){return this._actions[r]||(this._actions[r]=[]),V._addHandler(this._actions[r],t)}off(r,t){return this._actions[r]?t===void 0?(delete this._actions[r],!0):V._removeHandler(this._actions[r],t):!1}listen(r,t,e){if(this._actions[r]!==void 0){if(this._within(t)||Array.from(this._holds.values()).indexOf(r)>=0)return V._trigger(this._actions[r],this,t,r,e),!0;if(this._actions.all)return V._trigger(this._actions.all,this,t,r,e),!0}return!1}hold(r){let t=Math.max(0,...Array.from(this._holds.keys()))+1;return this._holds.set(t,r),t}unhold(r){r!==void 0?this._holds.delete(r):this._holds.clear()}static track(r,t,e,i){for(let n=0,s=r.length;n<s;n++)r[n].listen(t,e,i)}render(r){r(this._group,this._states)}toString(){return`UI ${this.group.toString}`}_within(r){let t=null;if(this._shape===X.rectangle)t=M.withinBound;else if(this._shape===X.circle)t=B.withinBound;else if(this._shape===X.polygon)t=S.hasIntersectPoint;else return!1;return t(this._group,r)}static _trigger(r,t,e,i,n){if(r)for(let s=0,o=r.length;s<o;s++)r[s]&&r[s](t,e,i,n)}static _addHandler(r,t){return t?(r.push(t),r.length-1):-1}static _removeHandler(r,t){if(t>=0&&t<r.length){let e=r.length;return r.splice(t,1),e>r.length}else return!1}};V._counter=0;var W=V,ot=class extends W{constructor(t,e,i={},n){super(t,e,i,n);this._hoverID=-1;i.hover===void 0&&(this._states.hover=!1),i.clicks===void 0&&(this._states.clicks=0);let s=v;this.on(s.up,(o,a,u,c)=>{this.state("clicks",this._states.clicks+1)}),this.on(s.move,(o,a,u,c)=>{if(this._within(a)&&!this._states.hover){this.state("hover",!0),W._trigger(this._actions[s.enter],this,a,s.enter,c);let p=this.hold(s.move);this._hoverID=this.on(s.move,(b,P)=>{!this._within(P)&&!this.state("dragging")&&(this.state("hover",!1),W._trigger(this._actions[s.leave],this,a,s.leave,c),this.off(s.move,this._hoverID),this.unhold(p))})}})}onClick(t){return this.on(v.up,t)}offClick(t){return this.off(v.up,t)}onContextMenu(t){return this.on(v.contextmenu,t)}offContextMenu(t){return this.off(v.contextmenu,t)}onHover(t,e){let i=[void 0,void 0];return t&&(i[0]=this.on(v.enter,t)),e&&(i[1]=this.on(v.leave,e)),i}offHover(t,e){let i=[!1,!1];return(t===void 0||t>=0)&&(i[0]=this.off(v.enter,t)),(e===void 0||e>=0)&&(i[1]=this.off(v.leave,e)),i}},kt=class extends ot{constructor(t,e,i={},n){super(t,e,i,n);this._draggingID=-1;this._moveHoldID=-1;this._dropHoldID=-1;this._upHoldID=-1;i.dragging===void 0&&(this._states.dragging=!1),i.moved===void 0&&(this._states.moved=!1),i.offset===void 0&&(this._states.offset=new h);let s=v;this.on(s.down,(a,u,c,f)=>{this._moveHoldID===-1&&(this.state("dragging",!0),this.state("offset",new h(u).subtract(a.group[0])),this._moveHoldID=this.hold(s.move)),this._dropHoldID===-1&&(this._dropHoldID=this.hold(s.drop)),this._upHoldID===-1&&(this._upHoldID=this.hold(s.up)),this._draggingID===-1&&(this._draggingID=this.on(s.move,(p,b)=>{this.state("dragging")&&(W._trigger(this._actions[s.uidrag],p,b,s.uidrag,f),this.state("moved",!0))}))});let o=(a,u,c,f)=>{this.state("dragging",!1),this.off(s.move,this._draggingID),this._draggingID=-1,this.unhold(this._moveHoldID),this._moveHoldID=-1,this.unhold(this._dropHoldID),this._dropHoldID=-1,this.unhold(this._upHoldID),this._upHoldID=-1,this.state("moved")&&(W._trigger(this._actions[s.uidrop],a,u,s.uidrop,f),this.state("moved",!1))};this.on(s.drop,o),this.on(s.up,o),this.on(s.out,o)}onDrag(t){return this.on(v.uidrag,t)}offDrag(t){return this.off(v.uidrag,t)}onDrop(t){return this.on(v.uidrop,t)}offDrop(t){return this.off(v.uidrop,t)}};var at=class{constructor(){this.id="space";this.bound=new G;this._time={prev:0,diff:0,end:-1,min:0};this.players={};this.playerCount=0;this._animID=-1;this._pause=!1;this._refresh=void 0;this._pointer=new h;this._isReady=!1;this._playing=!1}refresh(r){return this._refresh=r,this}minFrameTime(r=0){this._time.min=r}add(r){let t=typeof r=="function"?{animate:r}:r,e=this.playerCount++,i=t.animateID||this.id+e;return this.players[i]=t,t.animateID=i,t.resize&&this.bound.inited&&t.resize(this.bound),this._refresh===void 0&&(this._refresh=!0),this}remove(r){return delete this.players[r.animateID],this}removeAll(){return this.players={},this}play(r=0){if(!(r===0&&this._animID!==-1)){if(this._animID=requestAnimationFrame(this.play.bind(this)),this._pause)return this;if(this._time.diff=r-this._time.prev,this._time.diff<this._time.min)return this;this._time.prev=r;try{this.playItems(r)}catch(t){throw cancelAnimationFrame(this._animID),this._animID=-1,this._playing=!1,t}return this}}replay(){this._time.end=-1,this.play()}playItems(r){if(this._playing=!0,this._refresh&&this.clear(),this._isReady)for(let t in this.players)this.players[t].animate&&this.players[t].animate(r,this._time.diff,this);this._time.end>=0&&r>this._time.end&&(cancelAnimationFrame(this._animID),this._animID=-1,this._playing=!1)}pause(r=!1){return this._pause=r?!this._pause:!0,this}resume(){return this._pause=!1,this}stop(r=0){return this._time.end=r,this}playOnce(r=0){return this.play(),this.stop(r),this}render(r){return this._renderFunc&&this._renderFunc(r,this),this}set customRendering(r){this._renderFunc=r}get customRendering(){return this._renderFunc}get isPlaying(){return this._playing}get outerBound(){return this.bound.clone()}get innerBound(){return new G(h.make(this.size.length,0),this.size.clone())}get size(){return this.bound.size.clone()}get center(){return this.size.divide(2)}get width(){return this.bound.width}get height(){return this.bound.height}},Y=class extends at{constructor(){super(...arguments);this._pressed=!1;this._dragged=!1;this._hasMouse=!1;this._hasTouch=!1;this._hasKeyboard=!1}get pointer(){let t=this._pointer.clone();return t.id=this._pointer.id,t}bindCanvas(t,e,i={},n){(n||this._canvas).addEventListener(t,e,i)}unbindCanvas(t,e,i={},n){(n||this._canvas).removeEventListener(t,e,i)}bindDoc(t,e,i={}){document&&document.addEventListener(t,e,i)}unbindDoc(t,e,i={}){document&&document.removeEventListener(t,e,i)}bindMouse(t=!0,e){return t?(this._mouseDown=this._mouseDown.bind(this),this._mouseUp=this._mouseUp.bind(this),this._mouseOver=this._mouseOver.bind(this),this._mouseOut=this._mouseOut.bind(this),this._mouseMove=this._mouseMove.bind(this),this._mouseClick=this._mouseClick.bind(this),this._contextMenu=this._contextMenu.bind(this),this.bindCanvas("pointerdown",this._mouseDown,{},e),this.bindCanvas("pointerup",this._mouseUp,{},e),this.bindCanvas("pointerover",this._mouseOver,{},e),this.bindCanvas("pointerout",this._mouseOut,{},e),this.bindCanvas("pointermove",this._mouseMove,{},e),this.bindCanvas("click",this._mouseClick,{},e),this.bindCanvas("contextmenu",this._contextMenu,{},e),this._hasMouse=!0):(this.unbindCanvas("pointerdown",this._mouseDown,{},e),this.unbindCanvas("pointerup",this._mouseUp,{},e),this.unbindCanvas("pointerover",this._mouseOver,{},e),this.unbindCanvas("pointerout",this._mouseOut,{},e),this.unbindCanvas("pointermove",this._mouseMove,{},e),this.unbindCanvas("click",this._mouseClick,{},e),this.unbindCanvas("contextmenu",this._contextMenu,{},e),this._hasMouse=!1),this}bindTouch(t=!0,e=!1,i){return t?(this.bindCanvas("touchstart",this._touchStart.bind(this),{passive:e},i),this.bindCanvas("touchend",this._mouseUp.bind(this),{},i),this.bindCanvas("touchmove",this._touchMove.bind(this),{passive:e},i),this.bindCanvas("touchcancel",this._mouseOut.bind(this),{},i),this._hasTouch=!0):(this.unbindCanvas("touchstart",this._touchStart.bind(this),{passive:e},i),this.unbindCanvas("touchend",this._mouseUp.bind(this),{},i),this.unbindCanvas("touchmove",this._touchMove.bind(this),{passive:e},i),this.unbindCanvas("touchcancel",this._mouseOut.bind(this),{},i),this._hasTouch=!1),this}bindKeyboard(t=!0){return t?(this._keyDownBind=this._keyDown.bind(this),this._keyUpBind=this._keyUp.bind(this),this.bindDoc("keydown",this._keyDownBind,{}),this.bindDoc("keyup",this._keyUpBind,{}),this._hasKeyboard=!0):(this.unbindDoc("keydown",this._keyDownBind,{}),this.unbindDoc("keyup",this._keyUpBind,{}),this._hasKeyboard=!1),this}touchesToPoints(t,e="touches"){if(!t||!t[e])return[];let i=[];for(let n=0;n<t[e].length;n++){let s=t[e].item(n);i.push(new h(s.pageX-this.bound.topLeft.x,s.pageY-this.bound.topLeft.y))}return i}_mouseAction(t,e){if(!this.isPlaying)return;let i=0,n=0;if(e instanceof MouseEvent){for(let s in this.players)if(this.players.hasOwnProperty(s)){let o=this.players[s];i=e.pageX-this.outerBound.x,n=e.pageY-this.outerBound.y,o.action&&o.action(t,i,n,e)}}else for(let s in this.players)if(this.players.hasOwnProperty(s)){let o=this.players[s],a=e.changedTouches&&e.changedTouches.length>0,u=e.changedTouches.item(0);i=a?u.pageX-this.outerBound.x:0,n=a?u.pageY-this.outerBound.y:0,o.action&&o.action(t,i,n,e)}t&&(this._pointer.to(i,n),this._pointer.id=t)}_mouseDown(t){return this._mouseAction(v.down,t),this._mouseAction(v.pointerdown,t),this._pressed=!0,t.target instanceof Element&&t.target.setPointerCapture(t.pointerId),!1}_mouseUp(t){return this._mouseAction(v.pointerup,t),this._dragged?this._mouseAction(v.drop,t):this._mouseAction(v.up,t),this._pressed=!1,this._dragged=!1,t.target instanceof Element&&t.target.releasePointerCapture(t.pointerId),!1}_mouseMove(t){return this._pressed?(this._dragged=!0,this._mouseAction(v.drag,t)):this._mouseAction(v.move,t),!1}_mouseOver(t){return this._mouseAction(v.over,t),!1}_mouseOut(t){return this._mouseAction(v.out,t),this._dragged&&this._mouseAction(v.drop,t),this._dragged=!1,!1}_mouseClick(t){return this._mouseAction(v.click,t),this._pressed=!1,this._dragged=!1,!1}_contextMenu(t){return this._mouseAction(v.contextmenu,t),!1}_touchMove(t){return this._mouseAction(v.move,t),this._pressed&&(this._dragged=!0,this._mouseAction(v.drag,t)),t.preventDefault(),!1}_touchStart(t){return this._mouseAction(v.down,t),this._pressed=!0,!1;return t.preventDefault(),!1}_keyDown(t){return this._keyboardAction(v.keydown,t),!1}_keyUp(t){return this._keyboardAction(v.keyup,t),!1}_keyboardAction(t,e){if(this.isPlaying){for(let i in this.players)if(this.players.hasOwnProperty(i)){let n=this.players[i];n.action&&n.action(t,e.shiftKey?1:0,e.altKey?1:0,e)}}}};var It={};T(It,{Font:()=>O,Form:()=>lt,VisualForm:()=>q});var lt=class{constructor(){this._ready=!1}get ready(){return this._ready}},q=class extends lt{constructor(){super(...arguments);this._filled=!0;this._stroked=!0;this._font=new O(14,"sans-serif")}get filled(){return this._filled}set filled(t){this._filled=t}get stroked(){return this._stroked}set stroked(t){this._stroked=t}get currentFont(){return this._font}_multiple(t,e,...i){if(!t)return this;for(let n=0,s=t.length;n<s;n++)this[e](t[n],...i);return this}alpha(t){return this}fill(t){return this}fillOnly(t){return this.stroke(!1),this.fill(t)}stroke(t,e,i,n){return this}strokeOnly(t,e,i,n){return this.fill(!1),this.stroke(t,e,i,n)}points(t,e,i){if(t){for(let n=0,s=t.length;n<s;n++)this.point(t[n],e,i);return this}}circles(t){return this._multiple(t,"circle")}squares(t){return this._multiple(t,"square")}lines(t){return this._multiple(t,"line")}polygons(t){return this._multiple(t,"polygon")}rects(t){return this._multiple(t,"rect")}},O=class{constructor(r=12,t="sans-serif",e="",i="",n=1.5){this.size=r,this.face=t,this.style=i,this.weight=e,this.lineHeight=n}get value(){return`${this.style} ${this.weight} ${this.size}px/${this.lineHeight} ${this.face}`}toString(){return this.value}};var Ct={};T(Ct,{Typography:()=>Z});var Z=class{static textWidthEstimator(r,t=["M","n","."],e=[.06,.8,.14]){let i=t.map(r),n=new h(e).dot(i);return s=>s.length*n}static truncate(r,t,e,i=""){let n=Math.floor(t.length*Math.min(1,e/r(t)));return n<t.length?(n=Math.max(0,n-i.length),[t.substr(0,n)+i,n]):[t,t.length]}static fontSizeToBox(r,t=1,e=!0){let i=G.fromGroup(r),n=e?i.height:i.width,s=t*n;return function(o){let a=G.fromGroup(o),u=(e?a.height:a.width)/n;return s*u}}static fontSizeToThreshold(r,t=0){return function(e,i){let n=e*i/r;return t<0?Math.min(n,e):t>0?Math.max(n,e):n}}};var Mt={};T(Mt,{Img:()=>J});var J=class l{constructor(r=!1,t,e){this._scale=1;this._loaded=!1;this._editable=r,this._space=t,this._scale=this._space?this._space.pixelScale:1,this._img=new Image,e&&(this._img.crossOrigin="Anonymous")}static load(r,t=!1,e,i){let n=new l(t,e);return n.load(r).then(s=>{i&&i(s)}),n}static loadAsync(r,t=!1,e){return et(this,null,function*(){return yield new l(t,e).load(r)})}static loadPattern(r,t,e="repeat",i=!1){return et(this,null,function*(){return(yield l.loadAsync(r,i,t)).pattern(e)})}static blank(r,t,e){let i=new l(!0,t),n=e||(t?t.pixelScale:1);return i.initCanvas(r[0],r[1],n),i}load(r){return new Promise((t,e)=>{this._editable&&!document&&e("Cannot create html canvas element. document not found."),this._img.src=r,this._img.onload=()=>{this._editable&&(this._cv||(this._cv=document.createElement("canvas")),this._drawToScale(this._scale,this._img),this._data=this._ctx.getImageData(0,0,this._cv.width,this._cv.height)),this._loaded=!0,t(this)},this._img.onerror=i=>{e(i)}})}_drawToScale(r,t){let e=t.width,i=t.height;this.initCanvas(e,i,r),t&&this._ctx.drawImage(t,0,0,e,i,0,0,this._cv.width,this._cv.height)}initCanvas(r,t,e=1){if(!this._editable){console.error("Cannot initiate canvas because this Img is not set to be editable");return}this._cv||(this._cv=document.createElement("canvas"));let i=typeof e=="number"?[e,e]:e;this._cv.width=r*i[0],this._cv.height=t*i[1],this._ctx=this._cv.getContext("2d"),this._loaded=!0}bitmap(r){let t=r?r[0]:this._cv.width,e=r?r[1]:this._cv.height;return createImageBitmap(this._cv,0,0,t,e)}pattern(r="repeat",t=!1){if(!this._space)throw"Cannot find CanvasSpace ctx to create image pattern";return this._space.ctx.createPattern(t?this._cv:this._img,r)}sync(){this._scale!==1?this.bitmap().then(r=>{this._drawToScale(1/this._scale,r),this.load(this.toBase64())}):this._img.src=this.toBase64()}pixel(r,t=!0){let e=typeof t=="number"?t:t?this._scale:1;return l.getPixel(this._data,[r[0]*e,r[1]*e])}static getPixel(r,t){let e=new h(0,0,0,0);if(t[0]>=r.width||t[1]>=r.height)return e;let i=Math.floor(t[1])*(r.width*4)+Math.floor(t[0])*4,n=r.data;return i>=n.length-4?e:new h(n[i],n[i+1],n[i+2],n[i+3])}resize(r,t=!1){let e=t?r:[r[0]/this._img.naturalWidth,r[1]/this._img.naturalHeight];return this._drawToScale(e,this._img),this._data=this._ctx.getImageData(0,0,this._cv.width,this._cv.height),this}crop(r){let t=r.topLeft.scale(this._scale),e=r.size.scale(this._scale);return this._ctx.getImageData(t.x,t.y,e.x,e.y)}filter(r){return this._ctx.filter=r,this._ctx.drawImage(this._cv,0,0),this._ctx.filter="none",this}cleanup(){this._cv&&this._cv.remove(),this._img&&this._img.remove(),this._data=null}static fromBlob(r,t=!1,e){let i=URL.createObjectURL(r);return new l(t,e).load(i)}static imageDataToBlob(r){return new Promise(function(t,e){document||e("Cannot create html canvas element. document not found.");let i=document.createElement("canvas");i.width=r.width,i.height=r.height,i.getContext("2d").putImageData(r,0,0),i.toBlob(n=>{t(n),i.remove()})})}toBase64(){return this._cv.toDataURL()}toBlob(){return new Promise(r=>{this._cv.toBlob(t=>r(t))})}getForm(){return this._editable||console.error("Cannot get a CanvasForm because this Img is not editable"),this._ctx?new Q(this._ctx):void 0}get current(){return this._editable?this._cv:this._img}get image(){return this._img}get canvas(){return this._cv}get data(){return this._data}get ctx(){return this._ctx}get loaded(){return this._loaded}get pixelScale(){return this._scale}get imageSize(){return!this._img.width||!this._img.height?this.canvasSize.$divide(this._scale):new h(this._img.width,this._img.height)}get canvasSize(){return new h(this._cv.width,this._cv.height)}get scaledMatrix(){let r=1/this._scale;return new C().scale2D([r,r])}};var tt=class extends Y{constructor(t,e){super();this._pixelScale=1;this._autoResize=!0;this._bgcolor="#e1e9f0";this._offscreen=!1;this._initialResize=!1;let i=null,n=!1;if(this.id=m.uniqueId(),t instanceof Element)i=t,this.id=i.id||this.id;else{let s=t;s=t[0]==="#"||t[0]==="."?t:"#"+t,i=document.querySelector(s),this.id=s.substr(1)}if(i?i.nodeName.toLowerCase()!="canvas"?(this._container=i,this._canvas=this._createElement("canvas",this.id+"_canvas"),this._initialResize=!0):(this._canvas=i,this._container=i.parentElement,this._autoResize=!1,n=!0):(this._container=this._createElement("div",this.id+"_container"),this._canvas=this._createElement("canvas",this.id),document.body.appendChild(this._container)),this._ctx=this._canvas.getContext("2d"),n)setTimeout(this._ready.bind(this,e),100);else{let s=new MutationObserver(o=>{o.forEach(a=>{if(a.type==="childList"&&a.addedNodes.length){for(let u of a.addedNodes)if(u===this._canvas){this._ready(e),s.disconnect();return}}})});s.observe(this._container,{childList:!0}),this._container.appendChild(this._canvas)}}_createElement(t="div",e){let i=document.createElement(t);return i.setAttribute("id",e),i}_ready(t){if(!this._container)throw new Error(`Cannot initiate #${this.id} element`);this._isReady=!0,this._resizeHandler(null),this.clear(this._bgcolor),this._canvas.dispatchEvent(new Event("ready"));for(let e in this.players)this.players.hasOwnProperty(e)&&this.players[e].start&&this.players[e].start(this.bound.clone(),this);this._pointer=this.center,this._initialResize=!1,t&&t(this.bound,this._canvas)}setup(t){if(this._bgcolor=t.bgcolor?t.bgcolor:"transparent",this.autoResize=t.resize!=null?t.resize:!1,t.retina!==!1){let e=window&&window.devicePixelRatio||1,i=this._ctx.webkitBackingStorePixelRatio||this._ctx.mozBackingStorePixelRatio||this._ctx.msBackingStorePixelRatio||this._ctx.oBackingStorePixelRatio||this._ctx.backingStorePixelRatio||1;this._pixelScale=Math.max(1,e/i)}return t.offscreen?(this._offscreen=!0,this._offCanvas=this._createElement("canvas",this.id+"_offscreen"),this._offCtx=this._offCanvas.getContext("2d")):this._offscreen=!1,t.pixelDensity&&(this._pixelScale=t.pixelDensity),this}set autoResize(t){window&&(this._autoResize=t,t?window.addEventListener("resize",this._resizeHandler.bind(this)):window.removeEventListener("resize",this._resizeHandler.bind(this)))}get autoResize(){return this._autoResize}resize(t,e){this.bound=t,this._canvas.width=Math.ceil(this.bound.size.x)*this._pixelScale,this._canvas.height=Math.ceil(this.bound.size.y)*this._pixelScale,this._canvas.style.width=Math.ceil(this.bound.size.x)+"px",this._canvas.style.height=Math.ceil(this.bound.size.y)+"px",this._offscreen&&(this._offCanvas.width=Math.ceil(this.bound.size.x)*this._pixelScale,this._offCanvas.height=Math.ceil(this.bound.size.y)*this._pixelScale),this._pixelScale!=1&&(this._ctx.scale(this._pixelScale,this._pixelScale),this._offscreen&&this._offCtx.scale(this._pixelScale,this._pixelScale));for(let i in this.players)if(this.players.hasOwnProperty(i)){let n=this.players[i];n.resize&&n.resize(this.bound,e)}return this.render(this._ctx),e&&!this.isPlaying&&this.playOnce(0),this}_resizeHandler(t){if(!window)return;let e=this._autoResize||this._initialResize?this._container.getBoundingClientRect():this._canvas.getBoundingClientRect();if(e){let i=G.fromBoundingRect(e);i.center=i.center.add(window.pageXOffset,window.pageYOffset),this.resize(i,t)}}set background(t){this._bgcolor=t}get background(){return this._bgcolor}get pixelScale(){return this._pixelScale}get hasOffscreen(){return this._offscreen}get offscreenCtx(){return this._offCtx}get offscreenCanvas(){return this._offCanvas}getForm(){return new Q(this)}get element(){return this._canvas}get parent(){return this._container}get ready(){return this._isReady}get ctx(){return this._ctx}clear(t){t&&(this._bgcolor=t);let e=this._ctx.fillStyle,i=Math.ceil(this.pixelScale);return!this._bgcolor||this._bgcolor==="transparent"?this._ctx.clearRect(-i,-i,this._canvas.width+i,this._canvas.height+i):((this._bgcolor.indexOf("rgba")===0||this._bgcolor.length===9&&this._bgcolor.indexOf("#")===0)&&this._ctx.clearRect(-i,-i,this._canvas.width+i,this._canvas.height+i),this._ctx.fillStyle=this._bgcolor,this._ctx.fillRect(-i,-i,this._canvas.width+i,this._canvas.height+i)),this._ctx.fillStyle=e,this}clearOffscreen(t){if(this._offscreen){let e=Math.ceil(this.pixelScale);t?(this._offCtx.fillStyle=t,this._offCtx.fillRect(-e,-e,this._canvas.width+e,this._canvas.height+e)):this._offCtx.clearRect(-e,-e,this._offCanvas.width+e,this._offCanvas.height+e)}return this}playItems(t){this._isReady&&(this._ctx.save(),this._offscreen&&this._offCtx.save(),super.playItems(t),this._ctx.restore(),this._offscreen&&this._offCtx.restore(),this.render(this._ctx))}dispose(){if(window)return window.removeEventListener("resize",this._resizeHandler.bind(this)),this.stop(),this.removeAll(),this}recorder(t,e="webm",i=15e6){let n=this._canvas.captureStream(),s=new MediaRecorder(n,{mimeType:`video/${e}`,bitsPerSecond:i});return s.ondataavailable=function(o){let a=URL.createObjectURL(new Blob([o.data],{type:`video/${e}`}));if(typeof t=="function")t(a);else if(t){let u=document.createElement("a");u.href=a,u.download=`canvas_video.${e}`,u.click(),u.remove()}},s}},Q=class l extends q{constructor(t){super();this._style={fillStyle:"#f03",strokeStyle:"#fff",lineWidth:1,lineJoin:"bevel",lineCap:"butt",globalAlpha:1};if(!t)return this;let e=i=>{this._ctx=i,this._ctx.fillStyle=this._style.fillStyle,this._ctx.strokeStyle=this._style.strokeStyle,this._ctx.lineJoin="bevel",this._ctx.font=this._font.value,this._ready=!0};t instanceof tt?(this._space=t,this._space.ready&&this._space.ctx?e(this._space.ctx):this._space.add({start:()=>{e(this._space.ctx)}})):e(t)}get space(){return this._space}get ctx(){return this._ctx}useOffscreen(t=!0,e=!1){return e&&this._space.clearOffscreen(typeof e=="string"?e:null),this._ctx=this._space.hasOffscreen&&t?this._space.offscreenCtx:this._space.ctx,this}renderOffscreen(t=[0,0]){this._space.hasOffscreen&&this._space.ctx.drawImage(this._space.offscreenCanvas,t[0],t[1],this._space.width,this._space.height)}alpha(t){return this._ctx.globalAlpha=t,this._style.globalAlpha=t,this}fill(t){return typeof t=="boolean"?this.filled=t:(this.filled=!0,this._style.fillStyle=t,this._ctx.fillStyle=t),this}fillOnly(t){return this.stroke(!1),this.fill(t)}stroke(t,e,i,n){return typeof t=="boolean"?this.stroked=t:(this.stroked=!0,this._style.strokeStyle=t,this._ctx.strokeStyle=t,e&&(this._ctx.lineWidth=e,this._style.lineWidth=e),i&&(this._ctx.lineJoin=i,this._style.lineJoin=i),n&&(this._ctx.lineCap=n,this._style.lineCap=n)),this}strokeOnly(t,e,i,n){return this.fill(!1),this.stroke(t,e,i,n)}applyFillStroke(t=!0,e=!0,i=1){return t&&(typeof t=="string"&&this.fill(t),this._ctx.fill()),e&&(typeof e=="string"&&this.stroke(e,i),this._ctx.stroke()),this}gradient(t){let e=[];t.length<2&&t.push([.99,"#000"],[1,"#000"]);for(let i=0,n=t.length;i<n;i++){let s=typeof t[i]=="string"?i*(1/(t.length-1)):t[i][0],o=typeof t[i]=="string"?t[i]:t[i][1];e.push([s,o])}return(i,n)=>{let s=n?this._ctx.createRadialGradient(i[0][0],i[0][1],Math.abs(i[1][0]),n[0][0],n[0][1],Math.abs(n[1][0])):this._ctx.createLinearGradient(i[0][0],i[0][1],i[1][0],i[1][1]);for(let o=0,a=e.length;o<a;o++)s.addColorStop(e[o][0],e[o][1]);return s}}composite(t="source-over"){return this._ctx.globalCompositeOperation=t,this}clip(){return this._ctx.clip(),this}dash(t=!0,e=0){return t?(t===!0&&(t=[5,5]),this._ctx.setLineDash([t[0],t[1]]),this._ctx.lineDashOffset=e):(this._ctx.setLineDash([]),this._ctx.lineDashOffset=0),this}font(t,e,i,n,s){return typeof t=="number"?(this._font.size=t,s&&(this._font.face=s),e&&(this._font.weight=e),i&&(this._font.style=i),n&&(this._font.lineHeight=n)):this._font=t,this._ctx.font=this._font.value,this._estimateTextWidth&&this.fontWidthEstimate(!0),this}fontWidthEstimate(t=!0){return this._estimateTextWidth=t?Z.textWidthEstimator(e=>this._ctx.measureText(e).width):void 0,this}getTextWidth(t){return this._estimateTextWidth?this._estimateTextWidth(t):this._ctx.measureText(t+" .").width}_textTruncate(t,e,i=""){return Z.truncate(this.getTextWidth.bind(this),t,e,i)}_textAlign(t,e,i,n){let s=m.iterToArray(t);if(!m.arrayCheck(s))return;n||(n=M.center(s));let o=s[0][0];this._ctx.textAlign=="end"||this._ctx.textAlign=="right"?o=s[1][0]:(this._ctx.textAlign=="center"||this._ctx.textAlign=="middle")&&(o=n[0]);let a=n[1];return e=="top"||e=="start"?a=s[0][1]:(e=="end"||e=="bottom")&&(a=s[1][1]),i?new h(o+i[0],a+i[1]):new h(o,a)}reset(){for(let t in this._style)this._style.hasOwnProperty(t)&&(this._ctx[t]=this._style[t]);return this._font=new O,this._ctx.font=this._font.value,this}_paint(){this._filled&&this._ctx.fill(),this._stroked&&this._ctx.stroke()}static point(t,e,i=5,n="square"){if(e){if(!l[n])throw new Error(`${n} is not a static function of CanvasForm`);l[n](t,e,i)}}point(t,e=5,i="square"){return l.point(this._ctx,t,e,i),this._paint(),this}static circle(t,e,i=10){e&&(t.beginPath(),t.arc(e[0],e[1],i,0,w.two_pi,!1),t.closePath())}circle(t){let e=m.iterToArray(t);return l.circle(this._ctx,e[0],e[1][0]),this._paint(),this}static ellipse(t,e,i,n=0,s=0,o=w.two_pi,a=!1){!e||!i||(t.beginPath(),t.ellipse(e[0],e[1],i[0],i[1],n,s,o,a))}ellipse(t,e,i=0,n=0,s=w.two_pi,o=!1){return l.ellipse(this._ctx,t,e,i,n,s,o),this._paint(),this}static arc(t,e,i,n,s,o){e&&(t.beginPath(),t.arc(e[0],e[1],i,n,s,o))}arc(t,e,i,n,s){return l.arc(this._ctx,t,e,i,n,s),this._paint(),this}static square(t,e,i){if(!e)return;let n=e[0]-i,s=e[1]-i,o=e[0]+i,a=e[1]+i;t.beginPath(),t.moveTo(n,s),t.lineTo(n,a),t.lineTo(o,a),t.lineTo(o,s),t.closePath()}square(t,e){return l.square(this._ctx,t,e),this._paint(),this}static line(t,e){if(!m.arrayCheck(e))return;let i=0;t.beginPath();for(let n of e)n&&(i++>0?t.lineTo(n[0],n[1]):t.moveTo(n[0],n[1]))}line(t){return l.line(this._ctx,t),this._paint(),this}static polygon(t,e){m.arrayCheck(e)&&(l.line(t,e),t.closePath())}polygon(t){return l.polygon(this._ctx,t),this._paint(),this}static rect(t,e){let i=m.iterToArray(e);m.arrayCheck(i)&&(t.beginPath(),t.moveTo(i[0][0],i[0][1]),t.lineTo(i[0][0],i[1][1]),t.lineTo(i[1][0],i[1][1]),t.lineTo(i[1][0],i[0][1]),t.closePath())}rect(t){return l.rect(this._ctx,t),this._paint(),this}static image(t,e,i,n){let s=m.iterToArray(e),o;if(typeof s[0]=="number")o=s;else if(n){let a=m.iterToArray(n);o=[a[0][0],a[0][1],a[1][0]-a[0][0],a[1][1]-a[0][1],s[0][0],s[0][1],s[1][0]-s[0][0],s[1][1]-s[0][1]]}else o=[s[0][0],s[0][1],s[1][0]-s[0][0],s[1][1]-s[0][1]];i instanceof J?i.loaded&&t.drawImage(i.image,...o):t.drawImage(i,...o)}image(t,e,i){return e instanceof J?e.loaded&&l.image(this._ctx,t,e.image,i):l.image(this._ctx,t,e,i),this}static imageData(t,e,i){let n=m.iterToArray(e);typeof n[0]=="number"?t.putImageData(i,n[0],n[1]):t.putImageData(i,n[0][0],n[0][1],n[0][0],n[0][1],n[1][0],n[1][1])}imageData(t,e){return l.imageData(this._ctx,t,e),this}static text(t,e,i,n){e&&t.fillText(i,e[0],e[1],n)}text(t,e,i){return l.text(this._ctx,t,e,i),this}textBox(t,e,i="middle",n="",s=!0){s&&(this._ctx.textBaseline=i);let o=M.size(t),a=this._textTruncate(e,o[0],n);return this.text(this._textAlign(t,i),a[0]),this}paragraphBox(t,e,i=1.2,n="top",s=!0){let o=m.iterToArray(t),a=M.size(o);this._ctx.textBaseline="top";let u=this._font.size*i,c=(_,D=[],A=0)=>{if(!_||s&&A*u>a[1]-u*2)return D;if(A>1e4)throw new Error("max recursion reached (10000)");let U=this._textTruncate(_,a[0],""),bt=U[0].indexOf(`
6
- `);if(bt>=0)return D.push(U[0].substr(0,bt)),c(_.substr(bt+1),D,A+1);let nt=U[0].lastIndexOf(" ")+1;(nt<=0||U[1]===_.length)&&(nt=void 0);let Nt=U[0].substr(0,nt);return D.push(Nt),U[1]<=0||U[1]===_.length?D:c(_.substr(nt||U[1]),D,A+1)},f=c(e),p=f.length*u,b=o;if(n=="middle"||n=="center"){let _=(a[1]-p)/2;s&&(_=Math.max(0,_)),b=new d(o[0].$add(0,_),o[1].$subtract(0,_))}else n=="bottom"?b=new d(o[0].$add(0,a[1]-p),o[1]):b=new d(o[0],o[0].$add(a[0],p));let P=M.center(b);for(let _=0,D=f.length;_<D;_++)this.text(this._textAlign(b,"top",[0,_*u],P),f[_]);return this}alignText(t="left",e="alphabetic"){return e=="center"&&(e="middle"),e=="baseline"&&(e="alphabetic"),this._ctx.textAlign=t,this._ctx.textBaseline=e,this}log(t){let e=this._ctx.measureText(t).width+20;return this.stroke(!1).fill("rgba(0,0,0,.4)").rect([[0,0],[e,20]]),this.fill("#fff").text([10,14],t),this}};var $t={};T($t,{Create:()=>At,Delaunay:()=>mt,Noise:()=>ct});var At=class{static distributeRandom(r,t,e=2){let i=new d;for(let n=0;n<t;n++){let s=[r.x+L.random()*r.width];e>1&&s.push(r.y+L.random()*r.height),e>2&&s.push(r.z+L.random()*r.depth),i.push(new h(s))}return i}static distributeLinear(r,t){let e=m.iterToArray(r),i=E.subpoints(e,t-2);return i.unshift(e[0]),i.push(e[e.length-1]),i}static gridPts(r,t,e,i=[.5,.5]){if(t===0||e===0)throw new Error("grid columns and rows cannot be 0");let n=r.size.$subtract(1).$divide(t,e),s=n.$multiply(i),o=new d;for(let a=0;a<e;a++)for(let u=0;u<t;u++)o.push(r.topLeft.$add(n.$multiply(u,a)).add(s));return o}static gridCells(r,t,e){if(t===0||e===0)throw new Error("grid columns and rows cannot be 0");let i=r.size.$subtract(1).divide(t,e),n=[];for(let s=0;s<e;s++)for(let o=0;o<t;o++)n.push(new d(r.topLeft.$add(i.$multiply(o,s)),r.topLeft.$add(i.$multiply(o,s).add(i))));return n}static radialPts(r,t,e,i=-w.half_pi){let n=new d,s=w.two_pi/e;for(let o=0;o<e;o++)n.push(new h(r).toAngle(s*o+i,t,!0));return n}static noisePts(r,t=.01,e=.01,i=0,n=0){let s=L.random(),o=new d,a=0;for(let u of r){let c=new ct(u),f=i&&i>0?Math.floor(a/i):a,p=n&&n>0?a%n:a;c.initNoise(t*p,e*f),c.seed(s),o.push(c),a++}return o}static delaunay(r){return mt.from(r)}},ut=[[1,1,0],[-1,1,0],[1,-1,0],[-1,-1,0],[1,0,1],[-1,0,1],[1,0,-1],[-1,0,-1],[0,1,1],[0,-1,1],[0,1,-1],[0,-1,-1]],ht=[151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,88,237,149,56,87,174,20,125,136,171,168,68,175,74,165,71,134,139,48,27,166,77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,102,143,54,65,25,63,161,1,216,80,73,209,76,132,187,208,89,18,169,200,196,135,130,116,188,159,86,164,100,109,198,173,186,3,64,52,217,226,250,124,123,5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,223,183,170,213,119,248,152,2,44,154,163,70,221,153,101,155,167,43,172,9,129,22,39,253,9,98,108,110,79,113,224,232,178,185,112,104,218,246,97,228,251,34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,249,14,239,107,49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4,150,254,138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180],ct=class extends h{constructor(...t){super(...t);this.perm=[];this._n=new h(.01,.01);this.perm=ht.concat(ht)}initNoise(...t){return this._n=new h(...t),this}step(t=0,e=0){return this._n.add(t,e),this}seed(t){t>0&&t<1&&(t*=65536),t=Math.floor(t),t<256&&(t|=t<<8);for(let e=0;e<255;e++){let i=e&1?ht[e]^t&255:ht[e]^t>>8&255;this.perm[e]=this.perm[e+256]=i}return this}noise2D(){let t=Math.max(0,Math.floor(this._n[0]))%255,e=Math.max(0,Math.floor(this._n[1]))%255,i=this._n[0]%255-t,n=this._n[1]%255-e,s=k.dot(ut[(t+this.perm[e])%12],[i,n,0]),o=k.dot(ut[(t+this.perm[e+1])%12],[i,n-1,0]),a=k.dot(ut[(t+1+this.perm[e])%12],[i-1,n,0]),u=k.dot(ut[(t+1+this.perm[e+1])%12],[i-1,n-1,0]),c=p=>p*p*p*(p*(p*6-15)+10),f=c(i);return L.lerp(L.lerp(s,a,f),L.lerp(o,u,f),c(n))}},mt=class l extends d{constructor(){super(...arguments);this._mesh=[]}delaunay(t=!0){if(this.length<3)return[];this._mesh=[];let e=this.length,i=[];for(let c=0;c<e;c++)i[c]=c;i.sort((c,f)=>this[f][0]-this[c][0]);let n=this.slice(),s=this._superTriangle();n=n.concat(s);let o=[this._circum(e,e+1,e+2,s)],a=[],u=[];for(let c=0,f=i.length;c<f;c++){let p=i[c],b=[],P=o.length;for(this._mesh[p]||(this._mesh[p]={});P--;){let _=o[P],D=_.circle[1][0],A=n[p].$subtract(_.circle[0]);if(A[0]>0&&A[0]*A[0]>D*D){a.push(_),u.push(_.triangle),o.splice(P,1);continue}A[0]*A[0]+A[1]*A[1]-D*D>w.epsilon||(b.push(_.i,_.j,_.j,_.k,_.k,_.i),o.splice(P,1))}for(l._dedupe(b),P=b.length;P>1;)o.push(this._circum(b[--P],b[--P],p,!1,n))}for(let c=0,f=o.length;c<f;c++){let p=o[c];p.i<e&&p.j<e&&p.k<e&&(a.push(p),u.push(p.triangle),this._cache(p))}return t?u:a}voronoi(){let t=[],e=this._mesh;for(let i=0,n=e.length;i<n;i++)t.push(this.neighborPts(i,!0));return t}mesh(){return this._mesh}neighborPts(t,e=!1){let i=new d,n=this._mesh;for(let s in n[t])n[t].hasOwnProperty(s)&&i.push(n[t][s].circle[0]);return e?y.sortEdges(i):i}neighbors(t){let e=[],i=this._mesh;for(let n in i[t])i[t].hasOwnProperty(n)&&e.push(i[t][n]);return e}_cache(t){this._mesh[t.i][`${Math.min(t.j,t.k)}-${Math.max(t.j,t.k)}`]=t,this._mesh[t.j][`${Math.min(t.i,t.k)}-${Math.max(t.i,t.k)}`]=t,this._mesh[t.k][`${Math.min(t.i,t.j)}-${Math.max(t.i,t.j)}`]=t}_superTriangle(){let t=this[0],e=this[0];for(let o=1,a=this.length;o<a;o++)t=t.$min(this[o]),e=e.$max(this[o]);let i=e.$subtract(t),n=t.$add(e).divide(2),s=Math.max(i[0],i[1]);return new d(n.$subtract(20*s,s),n.$add(0,20*s),n.$add(20*s,-s))}_triangle(t,e,i,n=this){return new d(n[t],n[e],n[i])}_circum(t,e,i,n,s=this){let o=n||this._triangle(t,e,i,s);return{i:t,j:e,k:i,triangle:o,circle:j.circumcircle(o)}}static _dedupe(t){let e=t.length;for(;e>1;){let i=t[--e],n=t[--e],s=e;for(;s>1;){let o=t[--s],a=t[--s];if(n==a&&i==o||n==o&&i==a){t.splice(e,2),t.splice(s,2);break}}}return t}};var Gt={};T(Gt,{Color:()=>Tt});var g=class g extends h{constructor(...t){super(...t);this._mode="rgb";this._isNorm=!1}static from(...t){let e=[1,1,1,1],i=m.getArgs(t);for(let n=0,s=e.length;n<s;n++)n<i.length&&(e[n]=i[n]);return new g(e)}static fromHex(t){if(t[0]=="#"&&(t=t.substr(1)),t.length<=3){let n=s=>t[s]||"F";t=`${n(0)}${n(0)}${n(1)}${n(1)}${n(2)}${n(2)}`}let e=1;t.length===8&&(e=t.substr(6)&&255/255,t=t.substring(0,6));let i=parseInt(t,16);return new g(i>>16,i>>8&255,i&255,e)}static rgb(...t){return g.from(...t).toMode("rgb")}static hsl(...t){return g.from(...t).toMode("hsl")}static hsb(...t){return g.from(...t).toMode("hsb")}static lab(...t){return g.from(...t).toMode("lab")}static lch(...t){return g.from(...t).toMode("lch")}static luv(...t){return g.from(...t).toMode("luv")}static xyz(...t){return g.from(...t).toMode("xyz")}static maxValues(t){return g.ranges[t].zipSlice(1).$take([0,1,2])}get hex(){return this.toString("hex")}get rgb(){return this.toString("rgb")}get rgba(){return this.toString("rgba")}clone(){let t=new g(this);return t.toMode(this._mode),t}toMode(t,e=!1){if(e){let i=this._mode.toUpperCase()+"to"+t.toUpperCase();if(g[i])this.to(g[i](this,this._isNorm,this._isNorm));else throw new Error("Cannot convert color with "+i)}return this._mode=t,this}get mode(){return this._mode}get r(){return this[0]}set r(t){this[0]=t}get g(){return this[1]}set g(t){this[1]=t}get b(){return this[2]}set b(t){this[2]=t}get h(){return this._mode=="lch"?this[2]:this[0]}set h(t){let e=this._mode=="lch"?2:0;this[e]=t}get s(){return this[1]}set s(t){this[1]=t}get l(){return this._mode=="hsl"?this[2]:this[0]}set l(t){let e=this._mode=="hsl"?2:0;this[e]=t}get a(){return this[1]}set a(t){this[1]=t}get c(){return this[1]}set c(t){this[1]=t}get u(){return this[1]}set u(t){this[1]=t}get v(){return this[2]}set v(t){this[2]=t}set alpha(t){this.length>3&&(this[3]=t)}get alpha(){return this.length>3?this[3]:1}get normalized(){return this._isNorm}set normalized(t){this._isNorm=t}normalize(t=!0){if(this._isNorm==t)return this;let e=g.ranges[this._mode];for(let i=0;i<3;i++)this[i]=t?L.mapToRange(this[i],e[i][0],e[i][1],0,1):L.mapToRange(this[i],0,1,e[i][0],e[i][1]);return this._isNorm=t,this}$normalize(t=!0){return this.clone().normalize(t)}toString(t="mode"){if(t=="hex"){let e=i=>{let n=Math.floor(i).toString(16);return n.length<2?"0"+n:n};return`#${e(this[0])}${e(this[1])}${e(this[2])}`}else return t=="rgba"?`rgba(${Math.floor(this[0])},${Math.floor(this[1])},${Math.floor(this[2])},${this.alpha})`:t=="rgb"?`rgb(${Math.floor(this[0])},${Math.floor(this[1])},${Math.floor(this[2])})`:`${this._mode}(${this[0]},${this[1]},${this[2]},${this.alpha})`}static RGBtoHSL(t,e=!1,i=!1){let[n,s,o]=e?t:t.$normalize(),a=Math.max(n,s,o),u=Math.min(n,s,o),c=(a+u)/2,f=c,p=c;if(a==u)c=0,f=0;else{let b=a-u;f=p>.5?b/(2-a-u):b/(a+u),c=0,a===n?c=(s-o)/b+(s<o?6:0):a===s?c=(o-n)/b+2:a===o&&(c=(n-s)/b+4)}return g.hsl(i?c/60:c*60,f,p,t.alpha)}static HSLtoRGB(t,e=!1,i=!1){let[n,s,o]=t;if(e||(n=n/360),s==0)return g.rgb(o*255,o*255,o*255,t.alpha);let a=o<=.5?o*(1+s):o+s-o*s,u=2*o-a,c=p=>(p=p<0?p+1:p>1?p-1:p,p*6<1?u+(a-u)*p*6:p*2<1?a:p*3<2?u+(a-u)*(2/3-p)*6:u),f=i?1:255;return g.rgb(f*c(n+1/3),f*c(n),f*c(n-1/3),t.alpha)}static RGBtoHSB(t,e=!1,i=!1){let[n,s,o]=e?t:t.$normalize(),a=Math.max(n,s,o),u=Math.min(n,s,o),c=a-u,f=0,p=a===0?0:c/a,b=a;return a!=u&&(a===n?f=(s-o)/c+(s<o?6:0):a===s?f=(o-n)/c+2:a===o&&(f=(n-s)/c+4)),g.hsb(i?f/60:f*60,p,b,t.alpha)}static HSBtoRGB(t,e=!1,i=!1){let[n,s,o]=t;e||(n=n/360);let a=Math.floor(n*6),u=n*6-a,c=o*(1-s),f=o*(1-u*s),p=o*(1-(1-u)*s),P=[[o,p,c],[f,o,c],[c,o,p],[c,f,o],[p,c,o],[o,c,f]][a%6],_=i?1:255;return g.rgb(_*P[0],_*P[1],_*P[2],t.alpha)}static RGBtoLAB(t,e=!1,i=!1){let n=e?t.$normalize(!1):t;return g.XYZtoLAB(g.RGBtoXYZ(n),!1,i)}static LABtoRGB(t,e=!1,i=!1){let n=e?t.$normalize(!1):t;return g.XYZtoRGB(g.LABtoXYZ(n),!1,i)}static RGBtoLCH(t,e=!1,i=!1){let n=e?t.$normalize(!1):t;return g.LABtoLCH(g.RGBtoLAB(n),!1,i)}static LCHtoRGB(t,e=!1,i=!1){let n=e?t.$normalize(!1):t;return g.LABtoRGB(g.LCHtoLAB(n),!1,i)}static RGBtoLUV(t,e=!1,i=!1){let n=e?t.$normalize(!1):t;return g.XYZtoLUV(g.RGBtoXYZ(n),!1,i)}static LUVtoRGB(t,e=!1,i=!1){let n=e?t.$normalize(!1):t;return g.XYZtoRGB(g.LUVtoXYZ(n),!1,i)}static RGBtoXYZ(t,e=!1,i=!1){let n=e?t.clone():t.$normalize();for(let o=0;o<3;o++)n[o]=n[o]>.04045?Math.pow((n[o]+.055)/1.055,2.4):n[o]/12.92,i||(n[o]=n[o]*100);let s=g.xyz(n[0]*.4124564+n[1]*.3575761+n[2]*.1804375,n[0]*.2126729+n[1]*.7151522+n[2]*.072175,n[0]*.0193339+n[1]*.119192+n[2]*.9503041,t.alpha);return i?s.normalize():s}static XYZtoRGB(t,e=!1,i=!1){let[n,s,o]=e?t:t.$normalize(),a=[n*3.2406254773200533+s*-1.5372079722103187+o*-.4986285986982479,n*-.9689307147293197+s*1.8757560608852415+o*.041517523842953964,n*.055710120445510616+s*-.2040210505984867+o*1.0569959422543882];for(let c=0;c<3;c++)a[c]=a[c]>.0031308?1.055*Math.pow(a[c],1/2.4)-.055:12.92*a[c],a[c]=Math.max(0,Math.min(1,a[c])),i||(a[c]=Math.round(a[c]*255));let u=g.rgb(a[0],a[1],a[2],t.alpha);return i?u.normalize():u}static XYZtoLAB(t,e=!1,i=!1){let n=e?t.$normalize(!1):t.clone(),s=.00885645167,o=903.296296296;n.divide(g.D65);let a=f=>f>s?Math.pow(f,1/3):(o*f+16)/116,u=a(n[1]),c=g.lab(116*u-16,500*(a(n[0])-u),200*(u-a(n[2])),t.alpha);return i?c.normalize():c}static LABtoXYZ(t,e=!1,i=!1){let n=e?t.$normalize(!1):t,s=(n[0]+16)/116,o=n[1]/500+s,a=s-n[2]/200,u=.00885645167,c=903.296296296,f=g.D65,p=Math.pow(o,3),b=Math.pow(a,3),P=g.xyz(f[0]*(p>u?p:(116*o-16)/c),f[1]*(n[0]>c*u?Math.pow((n[0]+16)/116,3):n[0]/c),f[2]*(b>u?b:(116*a-16)/c),t.alpha);return i?P.normalize():P}static XYZtoLUV(t,e=!1,i=!1){let[n,s,o]=e?t.$normalize(!1):t,a=4*n/(n+15*s+3*o),u=9*s/(n+15*s+3*o);s=s/100,s=s>.008856?Math.pow(s,1/3):7.787*s+16/116;let c=4*g.D65[0]/(g.D65[0]+15*g.D65[1]+3*g.D65[2]),f=9*g.D65[1]/(g.D65[0]+15*g.D65[1]+3*g.D65[2]),p=116*s-16;return g.luv(p,13*p*(a-c),13*p*(u-f),t.alpha)}static LUVtoXYZ(t,e=!1,i=!1){let[n,s,o]=e?t.$normalize(!1):t,a=(n+16)/116,u=a*a*a;a=u>.008856?u:(a-16/116)/7.787;let c=4*g.D65[0]/(g.D65[0]+15*g.D65[1]+3*g.D65[2]),f=9*g.D65[1]/(g.D65[0]+15*g.D65[1]+3*g.D65[2]);s=s/(13*n)+c,o=o/(13*n)+f,a=a*100;let p=-1*(9*a*s)/((s-4)*o-s*o),b=(9*a-15*o*a-o*p)/(3*o);return g.xyz(p,a,b,t.alpha)}static LABtoLCH(t,e=!1,i=!1){let n=e?t.$normalize(!1):t,s=y.toDegree(y.boundRadian(Math.atan2(n[2],n[1])));return g.lch(n[0],Math.sqrt(n[1]*n[1]+n[2]*n[2]),s,t.alpha)}static LCHtoLAB(t,e=!1,i=!1){let n=e?t.$normalize(!1):t,s=y.toRadian(n[2]);return g.lab(n[0],Math.cos(s)*n[1],Math.sin(s)*n[1],t.alpha)}};g.D65=new h(95.047,100,108.883,1),g.ranges={rgb:new d(new h(0,255),new h(0,255),new h(0,255)),hsl:new d(new h(0,360),new h(0,1),new h(0,1)),hsb:new d(new h(0,360),new h(0,1),new h(0,1)),lab:new d(new h(0,100),new h(-128,127),new h(-128,127)),lch:new d(new h(0,100),new h(0,100),new h(0,360)),luv:new d(new h(0,100),new h(-134,220),new h(-140,122)),xyz:new d(new h(0,100),new h(0,100),new h(0,100))};var Tt=g;var Et={};T(Et,{DOMSpace:()=>z,HTMLForm:()=>rt,HTMLSpace:()=>R});var z=class l extends Y{constructor(t,e){super();this.id="domspace";this._autoResize=!0;this._bgcolor="#e1e9f0";this._css={};let i=null,n=!1;this.id="pts",t instanceof Element?(i=t,this.id="pts_existing_space"):(i=document.querySelector(t),n=!0,this.id=t.substr(1)),i?(this._canvas=i,this._container=i.parentElement):(this._container=l.createElement("div","pts_container"),this._canvas=l.createElement("div","pts_element"),this._container.appendChild(this._canvas),document.body.appendChild(this._container),n=!1),setTimeout(this._ready.bind(this,e),50)}static createElement(t="div",e,i){let n=document.createElement(t);return e&&n.setAttribute("id",e),i&&i.appendChild&&i.appendChild(n),n}_ready(t){if(!this._container)throw new Error(`Cannot initiate #${this.id} element`);this._isReady=!0,this._resizeHandler(null),this.clear(this._bgcolor),this._canvas.dispatchEvent(new Event("ready"));for(let e in this.players)this.players.hasOwnProperty(e)&&this.players[e].start&&this.players[e].start(this.bound.clone(),this);this._pointer=this.center,this.refresh(!1),t&&t(this.bound,this._canvas)}setup(t){return t.bgcolor&&(this._bgcolor=t.bgcolor),this.autoResize=t.resize!=null?t.resize:!1,this}getForm(){return null}set autoResize(t){this._autoResize=t,t?window.addEventListener("resize",this._resizeHandler.bind(this)):(delete this._css.width,delete this._css.height,window.removeEventListener("resize",this._resizeHandler.bind(this)))}get autoResize(){return this._autoResize}resize(t,e){this.bound=t,this.styles({width:`${t.width}px`,height:`${t.height}px`},!0);for(let i in this.players)if(this.players.hasOwnProperty(i)){let n=this.players[i];n.resize&&n.resize(this.bound,e)}return this}_resizeHandler(t){let e=G.fromBoundingRect(this._container.getBoundingClientRect());this._autoResize?this.styles({width:"100%",height:"100%"},!0):this.styles({width:`${e.width}px`,height:`${e.height}px`},!0),this.resize(e,t)}get element(){return this._canvas}get parent(){return this._container}get ready(){return this._isReady}clear(t){return t&&(this.background=t),this._canvas.innerHTML="",this}set background(t){this._bgcolor=t,this._container.style.backgroundColor=this._bgcolor}get background(){return this._bgcolor}style(t,e,i=!1){return this._css[t]=e,i&&(this._canvas.style[t]=e),this}styles(t,e=!1){for(let i in t)t.hasOwnProperty(i)&&this.style(i,t[i],e);return this}static setAttr(t,e){for(let i in e)e.hasOwnProperty(i)&&t.setAttribute(i,e[i]);return t}static getInlineStyles(t){let e="";for(let i in t)t.hasOwnProperty(i)&&t[i]&&(e+=`${i}: ${t[i]}; `);return e}dispose(){return window.removeEventListener("resize",this._resizeHandler.bind(this)),this.stop(),this.removeAll(),this}},R=class extends z{getForm(){return new rt(this)}static htmlElement(r,t,e,i=!0){if(!r||!r.appendChild)throw new Error("parent is not a valid DOM element");let n=document.querySelector(`#${e}`);return n||(n=document.createElement(t),n.setAttribute("id",e),i&&n.setAttribute("class",e.substring(0,e.indexOf("-"))),r.appendChild(n)),n}remove(r){return this._container.querySelectorAll("."+rt.scopeID(r)).forEach(e=>{e.parentNode.removeChild(e)}),super.remove(r)}removeAll(){return this._container.innerHTML="",super.removeAll()}},I=class I extends q{constructor(t){super();this._style={filled:!0,stroked:!0,background:"#f03","border-color":"#fff",color:"#000","border-width":"1px","border-radius":"0","border-style":"solid",opacity:1,position:"absolute",top:0,left:0,width:0,height:0};this._ctx={group:null,groupID:"pts",groupCount:0,currentID:"pts0",currentClass:"",style:{}};this._ready=!1;this._space=t,this._space.add({start:()=>{this._ctx.group=this._space.element,this._ctx.groupID="pts_dom_"+I.groupID++,this._ctx.style=Object.assign({},this._style),this._ready=!0}})}get space(){return this._space}styleTo(t,e,i=""){if(this._ctx.style[t]===void 0)throw new Error(`${t} style property doesn't exist`);this._ctx.style[t]=`${e}${i}`}alpha(t){return this.styleTo("opacity",t),this}fill(t){return typeof t=="boolean"?(this.styleTo("filled",t),t||this.styleTo("background","transparent")):(this.styleTo("filled",!0),this.styleTo("background",t)),this}stroke(t,e,i,n){return typeof t=="boolean"?(this.styleTo("stroked",t),t||this.styleTo("border-width",0)):(this.styleTo("stroked",!0),this.styleTo("border-color",t),this.styleTo("border-width",(e||1)+"px")),this}fillText(t){return this.styleTo("color",t),this}cls(t){return typeof t=="boolean"?this._ctx.currentClass="":this._ctx.currentClass=t,this}font(t,e,i,n,s){return typeof t=="number"?(this._font.size=t,s&&(this._font.face=s),e&&(this._font.weight=e),i&&(this._font.style=i),n&&(this._font.lineHeight=n)):this._font=t,this._ctx.style.font=this._font.value,this}reset(){return this._ctx.style=Object.assign({},this._style),this._font=new O(10,"sans-serif"),this._ctx.style.font=this._font.value,this}updateScope(t,e){return this._ctx.group=e,this._ctx.groupID=t,this._ctx.groupCount=0,this.nextID(),this._ctx}scope(t){if(!t||t.animateID==null)throw new Error("item not defined or not yet added to Space");return this.updateScope(I.scopeID(t),this.space.element)}nextID(){return this._ctx.groupCount++,this._ctx.currentID=`${this._ctx.groupID}-${this._ctx.groupCount}`,this._ctx.currentID}static getID(t){return t.currentID||`p-${I.domID++}`}static scopeID(t){return`item-${t.animateID}`}static style(t,e){let i=[];e.filled||i.push("background: none"),e.stroked||i.push("border: none");for(let n in e)if(e.hasOwnProperty(n)&&n!="filled"&&n!="stroked"){let s=e[n];if(s){if(!e.filled&&n.indexOf("background")===0)continue;if(!e.stroked&&n.indexOf("border-width")===0)continue;i.push(`${n}: ${s}`)}}return R.setAttr(t,{style:i.join(";")})}static rectStyle(t,e,i){return t.style.left=e[0]+"px",t.style.top=e[1]+"px",t.style.width=i[0]+"px",t.style.height=i[1]+"px",t}static textStyle(t,e){return t.style.left=e[0]+"px",t.style.top=e[1]+"px",t}static point(t,e,i=5,n="square"){return n==="circle"?I.circle(t,e,i):I.square(t,e,i)}point(t,e=5,i="square"){return this.nextID(),i=="circle"&&this.styleTo("border-radius","100%"),I.point(this._ctx,t,e,i),this}static circle(t,e,i=10){let n=R.htmlElement(t.group,"div",I.getID(t));return R.setAttr(n,{class:`pts-form pts-circle ${t.currentClass}`}),I.rectStyle(t,new h(e).$subtract(i),new h(i*2,i*2)),I.style(n,t.style),n}circle(t){return this.nextID(),this.styleTo("border-radius","100%"),I.circle(this._ctx,t[0],t[1][0]),this}static square(t,e,i){let n=R.htmlElement(t.group,"div",I.getID(t));return R.setAttr(n,{class:`pts-form pts-square ${t.currentClass}`}),I.rectStyle(t,new h(e).$subtract(i),new h(i*2,i*2)),I.style(n,t.style),n}square(t,e){return this.nextID(),I.square(this._ctx,t,e),this}static rect(t,e){let i=m.iterToArray(e);if(!m.arrayCheck(i))return;let n=R.htmlElement(t.group,"div",I.getID(t));return R.setAttr(n,{class:`pts-form pts-rect ${t.currentClass}`}),I.rectStyle(t,i[0],i[1]),I.style(n,t.style),n}rect(t){return this.nextID(),this.styleTo("border-radius","0"),I.rect(this._ctx,t),this}static text(t,e,i){let n=R.htmlElement(t.group,"div",I.getID(t));return R.setAttr(n,{class:`pts-form pts-text ${t.currentClass}`}),n.textContent=i,I.textStyle(t,e),I.style(n,t.style),n}text(t,e){return this.nextID(),I.text(this._ctx,t,e),this}log(t){return this.fill("#000").stroke("#fff",.5).text([10,14],t),this}arc(t,e,i,n,s){return m.warn("arc is not implemented in HTMLForm"),this}line(t){return m.warn("line is not implemented in HTMLForm"),this}polygon(t){return m.warn("polygon is not implemented in HTMLForm"),this}};I.groupID=0,I.domID=0;var rt=I;var St={};T(St,{SVGForm:()=>it,SVGSpace:()=>F});var F=class l extends z{constructor(t,e){super(t,e);this._bgcolor="#999";if(this._canvas.nodeName.toLowerCase()!="svg"){let i=l.svgElement(this._canvas,"svg",`${this.id}_svg`);this._container=this._canvas,this._canvas=i}}getForm(){return new it(this)}get element(){return this._canvas}resize(t,e){return super.resize(t,e),l.setAttr(this.element,{viewBox:`0 0 ${this.bound.width} ${this.bound.height}`,width:`${this.bound.width}`,height:`${this.bound.height}`,xmlns:"http://www.w3.org/2000/svg",version:"1.1"}),this}static svgElement(t,e,i){if(!t||!t.appendChild)throw new Error("parent is not a valid DOM element");let n=document.querySelector(`#${i}`);return n||(n=document.createElementNS("http://www.w3.org/2000/svg",e),n.setAttribute("id",i),t.appendChild(n)),n}remove(t){return this._container.querySelectorAll("."+it.scopeID(t)).forEach(i=>{i.parentNode.removeChild(i)}),super.remove(t)}removeAll(){return this._container.innerHTML="",super.removeAll()}},x=class x extends q{constructor(t){super();this._style={filled:!0,stroked:!0,fill:"#f03",stroke:"#fff","stroke-width":1,"stroke-linejoin":"bevel","stroke-linecap":"sqaure",opacity:1};this._ctx={group:null,groupID:"pts",groupCount:0,currentID:"pts0",currentClass:"",style:{}};this._ready=!1;this._space=t,this._space.add({start:()=>{this._ctx.group=this._space.element,this._ctx.groupID="pts_svg_"+x.groupID++,this._ctx.style=Object.assign({},this._style),this._ready=!0}})}get space(){return this._space}styleTo(t,e){if(this._ctx.style[t]===void 0)throw new Error(`${t} style property doesn't exist`);this._ctx.style[t]=e}alpha(t){return this.styleTo("opacity",t),this}fill(t){return typeof t=="boolean"?this.styleTo("filled",t):(this.styleTo("filled",!0),this.styleTo("fill",t)),this}stroke(t,e,i,n){return typeof t=="boolean"?this.styleTo("stroked",t):(this.styleTo("stroked",!0),this.styleTo("stroke",t),e&&this.styleTo("stroke-width",e),i&&this.styleTo("stroke-linejoin",i),n&&this.styleTo("stroke-linecap",n)),this}cls(t){return typeof t=="boolean"?this._ctx.currentClass="":this._ctx.currentClass=t,this}font(t,e,i,n,s){return typeof t=="number"?(this._font.size=t,s&&(this._font.face=s),e&&(this._font.weight=e),i&&(this._font.style=i),n&&(this._font.lineHeight=n)):this._font=t,this._ctx.style.font=this._font.value,this}reset(){return this._ctx.style=Object.assign({},this._style),this._font=new O(10,"sans-serif"),this._ctx.style.font=this._font.value,this}updateScope(t,e){return this._ctx.group=e,this._ctx.groupID=t,this._ctx.groupCount=0,this.nextID(),this._ctx}scope(t){if(!t||t.animateID==null)throw new Error("item not defined or not yet added to Space");return this.updateScope(x.scopeID(t),this.space.element)}nextID(){return this._ctx.groupCount++,this._ctx.currentID=`${this._ctx.groupID}-${this._ctx.groupCount}`,this._ctx.currentID}static getID(t){return t.currentID||`p-${x.domID++}`}static scopeID(t){return`item-${t.animateID}`}static style(t,e){let i=[];e.filled||i.push("fill: none"),e.stroked||i.push("stroke: none");for(let n in e)if(e.hasOwnProperty(n)&&n!="filled"&&n!="stroked"){let s=e[n];if(s){if(!e.filled&&n.indexOf("fill")===0)continue;if(!e.stroked&&n.indexOf("stroke")===0)continue;i.push(`${n}: ${s}`)}}return z.setAttr(t,{style:i.join(";")})}static point(t,e,i=5,n="square"){return n==="circle"?x.circle(t,e,i):x.square(t,e,i)}point(t,e=5,i="square"){return this.nextID(),x.point(this._ctx,t,e,i),this}static circle(t,e,i=10){let n=F.svgElement(t.group,"circle",x.getID(t));return z.setAttr(n,{cx:e[0],cy:e[1],r:i,class:`pts-svgform pts-circle ${t.currentClass}`}),x.style(n,t.style),n}circle(t){this.nextID();let e=m.iterToArray(t);return x.circle(this._ctx,e[0],e[1][0]),this}static arc(t,e,i,n,s,o){let a=F.svgElement(t.group,"path",x.getID(t)),u=new h(e).toAngle(n,i,!0),c=new h(e).toAngle(s,i,!0),p=y.boundAngle(s)-y.boundAngle(n)>w.pi;o&&(p=!p);let b=o?"0":"1",P=`M ${u[0]} ${u[1]} A ${i} ${i} 0 ${p?"1":"0"} ${b} ${c[0]} ${c[1]}`;return z.setAttr(a,{d:P,class:`pts-svgform pts-arc ${t.currentClass}`}),x.style(a,t.style),a}arc(t,e,i,n,s){return this.nextID(),x.arc(this._ctx,t,e,i,n,s),this}static square(t,e,i){let n=F.svgElement(t.group,"rect",x.getID(t));return z.setAttr(n,{x:e[0]-i,y:e[1]-i,width:i*2,height:i*2,class:`pts-svgform pts-square ${t.currentClass}`}),x.style(n,t.style),n}square(t,e){return this.nextID(),x.square(this._ctx,t,e),this}static line(t,e){let i=x.pointsString(e);if(i.count<2)return;if(i.count>2)return x._poly(t,i.string,!1);let n=F.svgElement(t.group,"line",x.getID(t)),s=m.iterToArray(e);return z.setAttr(n,{x1:s[0][0],y1:s[0][1],x2:s[1][0],y2:s[1][1],class:`pts-svgform pts-line ${t.currentClass}`}),x.style(n,t.style),n}line(t){return this.nextID(),x.line(this._ctx,t),this}static _poly(t,e,i=!0){let n=F.svgElement(t.group,i?"polygon":"polyline",x.getID(t));return z.setAttr(n,{points:e,class:`pts-svgform pts-polygon ${t.currentClass}`}),x.style(n,t.style),n}static pointsString(t){let e="",i=0;for(let n of t)e+=`${n[0]},${n[1]} `,i++;return{string:e,count:i}}static polygon(t,e){let i=x.pointsString(e);return x._poly(t,i.string,!0)}polygon(t){return this.nextID(),x.polygon(this._ctx,t),this}static rect(t,e){if(!m.arrayCheck(e))return;let i=F.svgElement(t.group,"rect",x.getID(t)),n=d.fromArray(e).boundingBox(),s=M.size(n);return z.setAttr(i,{x:n[0][0],y:n[0][1],width:s[0],height:s[1],class:`pts-svgform pts-rect ${t.currentClass}`}),x.style(i,t.style),i}rect(t){return this.nextID(),x.rect(this._ctx,t),this}static text(t,e,i){let n=F.svgElement(t.group,"text",x.getID(t));return z.setAttr(n,{"pointer-events":"none",x:e[0],y:e[1],dx:0,dy:0,class:`pts-svgform pts-text ${t.currentClass}`}),n.textContent=i,x.style(n,t.style),n}text(t,e){return this.nextID(),x.text(this._ctx,t,e),this}log(t){return this.fill("#000").stroke("#fff",.5).text([10,14],t),this}};x.groupID=0,x.domID=0;var it=x;var zt={};T(zt,{Body:()=>ft,Particle:()=>pt,World:()=>dt});var dt=class l{constructor(r,t=1,e=0){this._lastTime=null;this._gravity=new h;this._friction=1;this._damping=.75;this._iterations=1;this._particles=[];this._bodies=[];this._pnames=[];this._bnames=[];return this._bound=G.fromGroup(r),this._friction=t,this._gravity=typeof e=="number"?new h(0,e):new h(e),this}get bound(){return this._bound}set bound(r){this._bound=r}get gravity(){return this._gravity}set gravity(r){this._gravity=r}get friction(){return this._friction}set friction(r){this._friction=r}get damping(){return this._damping}set damping(r){this._damping=r}get iterations(){return this._iterations}set iterations(r){this._iterations=r}get bodyCount(){return this._bodies.length}get particleCount(){return this._particles.length}body(r){return typeof r=="string"&&r.length>0?this._bodies[this._bnames.indexOf(r)]:typeof r=="number"&&r>=0?this._bodies[r]:void 0}particle(r){return typeof r=="string"&&r.length>0?this._particles[this._pnames.indexOf(r)]:typeof r=="number"&&r>=0?this._particles[r]:void 0}bodyIndex(r){return this._bnames.indexOf(r)}particleIndex(r){return this._pnames.indexOf(r)}update(r){let t=r/1e3;this._updateParticles(t),this._updateBodies(t)}drawParticles(r){this._drawParticles=r}drawBodies(r){this._drawBodies=r}add(r,t=""){return r instanceof ft?(this._bodies.push(r),this._bnames.push(t)):(this._particles.push(r),this._pnames.push(t)),this}_index(r,t){let e=0;if(typeof t=="string"){if(e=r(t),e<0)throw new Error(`Cannot find index of ${t}. You can use particleIndex() or bodyIndex() function to check existence by name.`)}else e=t;return e}removeBody(r,t=1){let e=this._index(this.bodyIndex.bind(this),r),i=e<0?[e*-1-1,t]:[e,t];return this._bodies.splice(i[0],i[1]),this._bnames.splice(i[0],i[1]),this}removeParticle(r,t=1){let e=this._index(this.particleIndex.bind(this),r),i=e<0?[e*-1-1,t]:[e,t];return this._particles.splice(i[0],i[1]),this._pnames.splice(i[0],i[1]),this}static edgeConstraint(r,t,e,i=1,n=!1){let s=1/(r.mass||1),o=1/(t.mass||1),a=s+o,u=t.$subtract(r),c=e*e,f=n?e/u.magnitude()-1:c/(u.dot(u)+c)-.5,p=u.$multiply(f*i);return r.subtract(p.$multiply(s/a)),t.add(p.$multiply(o/a)),r}static boundConstraint(r,t,e=.75){let i=y.boundingBox(t),n=r.$min(i[1].subtract(r.radius)).$max(i[0].add(r.radius));if(n[0]===i[0][0]||n[0]===i[1][0]){let s=r.changed.$multiply(e);r.previous=n.$subtract(new h(-s[0],s[1]))}else if(n[1]===i[0][1]||n[1]===i[1][1]){let s=r.changed.$multiply(e);r.previous=n.$subtract(new h(s[0],-s[1]))}r.to(n)}integrate(r,t,e){return r.addForce(this._gravity),r.verlet(t,this._friction,e),r}_updateParticles(r){for(let t=0,e=this._particles.length;t<e;t++){let i=this._particles[t];this.integrate(i,r,this._lastTime),l.boundConstraint(i,this._bound,this._damping);for(let n=t+1;n<e;n++)if(t!==n){let s=this._particles[n];i.collide(s,this._damping)}this._drawParticles&&this._drawParticles(i,t)}this._lastTime=r}_updateBodies(r){for(let t=0,e=this._bodies.length;t<e;t++){let i=this._bodies[t];if(i){for(let n=0,s=i.length;n<s;n++){let o=i[n];l.boundConstraint(o,this._bound,this._damping),this.integrate(o,r,this._lastTime)}for(let n=t+1;n<e;n++)i.processBody(this._bodies[n]);for(let n=0,s=this._particles.length;n<s;n++)i.processParticle(this._particles[n]);for(let n=0;n<this._iterations;n++)i.processEdges();this._drawBodies&&this._drawBodies(i,t)}}}},pt=class extends h{constructor(...t){super(...t);this._mass=1;this._radius=0;this._force=new h;this._prev=new h;this._lock=!1;this._prev=this.clone()}get mass(){return this._mass}set mass(t){this._mass=t}get radius(){return this._radius}set radius(t){this._radius=t}get previous(){return this._prev}set previous(t){this._prev=t}get force(){return this._force}set force(t){this._force=t}get body(){return this._body}set body(t){this._body=t}get lock(){return this._lock}set lock(t){this._lock=t,this._lockPt=new h(this)}get changed(){return this.$subtract(this._prev)}set position(t){this.previous.to(this),this._lock&&(this._lockPt=t),this.to(t)}size(t){return this._mass=t,this._radius=t,this}addForce(...t){return this._force.add(...t),this._force}verlet(t,e,i){if(this._lock)this.to(this._lockPt);else{let n=i||t,s=this._force.multiply(t*(t+n)/2),o=this.changed.multiply(e*t/n).add(s);this._prev=this.clone(),this.add(o),this._force=new h}return this}hit(...t){return this._prev.subtract(new h(...t).$divide(Math.sqrt(this._mass))),this}collide(t,e=1){let i=this,n=i.$subtract(t),s=n.magnitudeSq(),o=i.radius+t.radius;if(s<o*o){let a=i.changed,u=t.changed,c=Math.sqrt(s),f=n.$multiply((c-o)/c/2),p=i.$subtract(f),b=t.$add(f);i.to(p),t.to(b);let P=e*n.dot(a)/s,_=e*n.dot(u)/s,D=i.mass/(i.mass+t.mass),A=t.mass/(i.mass+t.mass);a.add(new h(_*n[0]-P*n[0],_*n[1]-P*n[1]).$multiply(A)),u.add(new h(P*n[0]-_*n[0],P*n[1]-_*n[1]).$multiply(D)),i.previous=i.$subtract(a),t.previous=t.$subtract(u)}}toString(){return`Particle: ${this[0]} ${this[1]} | previous ${this._prev[0]} ${this._prev[1]} | mass ${this._mass}`}},ft=class l extends d{constructor(){super();this._cs=[];this._stiff=1;this._locks={};this._mass=1}static fromGroup(t,e=1,i=!0,n=!0){let s=new l().init(t);return i&&s.linkAll(e),n&&s.autoMass(),s}init(t,e=1){let i=new h;for(let n of t){let s=new pt(n);s.body=this,i.add(n),this.push(s)}return this._stiff=e,this}get mass(){return this._mass}set mass(t){this._mass=t;for(let e=0,i=this.length;e<i;e++)this[e].mass=this._mass}autoMass(){return this.mass=Math.sqrt(S.area(this))/10,this}link(t,e,i){if(t<0||t>=this.length)throw new Error("index1 is not in the Group's indices");if(e<0||e>=this.length)throw new Error("index1 is not in the Group's indices");let n=this[t].$subtract(this[e]).magnitude();return this._cs.push([t,e,n,i||this._stiff]),this}linkAll(t){let e=this.length/2;for(let i=0,n=this.length;i<n;i++){let s=i>=n-1?0:i+1;if(this.link(i,s,t),n>4){let o=Math.floor(e/2)+1,a=i>=n-o?i%n:i+o;this.link(i,a,t)}i<=e-1&&this.link(i,Math.min(this.length-1,i+Math.floor(e)))}}linksToLines(){let t=[];for(let e=0,i=this._cs.length;e<i;e++){let n=this._cs[e];t.push(new d(this[n[0]],this[n[1]]))}return t}processEdges(){for(let t=0,e=this._cs.length;t<e;t++){let[i,n,s,o]=this._cs[t];dt.edgeConstraint(this[i],this[n],s,o)}}processBody(t){let e=this,i=t,n=S.hasIntersectPolygon(e,i);if(n){let s=n.normal.$multiply(n.dist),o,a=n.edge;Math.abs(a[0][0]-a[1][0])>Math.abs(a[0][1]-a[1][1])?o=(n.vertex[0]-s[0]-a[0][0])/(a[1][0]-a[0][0]):o=(n.vertex[1]-s[1]-a[0][1])/(a[1][1]-a[0][1]);let u=1/(o*o+(1-o)*(1-o)),c=n.vertex.body.mass||1,f=n.edge[0].body.mass||1,p=c/(c+f),b=f/(c+f);a[0].subtract(s.$multiply(p*(1-o)*u/2)),a[1].subtract(s.$multiply(p*o*u/2)),n.vertex.add(s.$multiply(b))}}processParticle(t){let e=this,i=t,n=S.hasIntersectCircle(e,B.fromCenter(t,t.radius));if(n){let s=n.normal.$multiply(n.dist),o,a=n.edge;Math.abs(a[0][0]-a[1][0])>Math.abs(a[0][1]-a[1][1])?o=(n.vertex[0]-s[0]-a[0][0])/(a[1][0]-a[0][0]):o=(n.vertex[1]-s[1]-a[0][1])/(a[1][1]-a[0][1]);let u=1/(o*o+(1-o)*(1-o)),c=n.vertex.mass||i.mass||1,f=n.edge[0].body.mass||1,p=c/(c+f),b=f/(c+f);a[0].subtract(s.$multiply(p*(1-o)*u/2)),a[1].subtract(s.$multiply(p*o*u/2));let P=t.changed.add(s.$multiply(b));t.previous=t.$subtract(P)}}};var Ot={};T(Ot,{Sound:()=>Rt,Tempo:()=>Bt});var Bt=class l{constructor(r){this._listeners={};this._listenerInc=0;this.bpm=r}static fromBeat(r){return new l(6e4/r)}get bpm(){return this._bpm}set bpm(r){this._bpm=r,this._ms=6e4/this._bpm}get ms(){return this._ms}set ms(r){this._bpm=Math.floor(6e4/r),this._ms=6e4/this._bpm}_createID(r){let t="";return typeof r=="function"?t="_b"+this._listenerInc++:t=r.name||"_b"+this._listenerInc++,t}every(r){let t=this,e=Array.isArray(r)?r[0]:r;return{start:function(i,n=0,s){let o=s||t._createID(i);return t._listeners[o]={name:o,beats:r,period:e,index:0,offset:n,duration:-1,continuous:!1,fn:i},this},progress:function(i,n=0,s){let o=s||t._createID(i);return t._listeners[o]={name:o,beats:r,period:e,index:0,offset:n,duration:-1,continuous:!0,fn:i},this}}}track(r){for(let t in this._listeners)if(this._listeners.hasOwnProperty(t)){let e=this._listeners[t],i=e.offset?r+e.offset:r,n=e.period*this._ms,s=!1;i>e.duration+n&&(e.duration=i-i%this._ms,Array.isArray(e.beats)&&(e.index=(e.index+1)%e.beats.length,e.period=e.beats[e.index]),s=!0);let o=Math.max(0,Math.ceil(Math.floor(e.duration/this._ms)/e.period)),a=e.continuous?[o,L.clamp((i-e.duration)/n,0,1),i,s]:[o];(e.continuous||s)&&e.fn.apply(e,a)&&delete this._listeners[e.name]}}stop(r){this._listeners[r]&&delete this._listeners[r]}animate(r,t){this.track(r)}resize(r,t){}action(r,t,e,i){}},Rt=class l{constructor(r){this._playing=!1;this._type=r,this._createAudioContext()}_createAudioContext(){let r=window.AudioContext;if(!r)throw new Error("Your browser doesn't support Web Audio. (No AudioContext)");this._ctx=r?new r:void 0}static from(r,t,e="gen",i){let n=new l(e);return n._node=r,n._ctx=t,i&&(n._stream=i),n}static load(r,t="anonymous"){return new Promise((e,i)=>{let n=new l("file");n._source=typeof r=="string"?new Audio(r):r,n._source.autoplay=!1,n._source.crossOrigin=t,n._source.addEventListener("ended",function(){n._playing=!1}),n._source.addEventListener("error",function(){i("Error loading sound")}),n._source.addEventListener("canplaythrough",function(){n._node||(n._node=n._ctx.createMediaElementSource(n._source)),e(n)})})}static loadAsBuffer(r){return new Promise((t,e)=>{let i=new XMLHttpRequest;i.open("GET",r,!0),i.responseType="arraybuffer";let n=new l("file");i.onload=function(){n._ctx.decodeAudioData(i.response,function(s){n.createBuffer(s),t(n)},s=>e("Error decoding audio"))},i.send()})}createBuffer(r){return this._node=this._ctx.createBufferSource(),r!==void 0&&(this._buffer=r),this._node.buffer=this._buffer,this._node.onended=()=>{this._playing=!1},this}static generate(r,t){return new l("gen")._gen(r,t)}_gen(r,t){this._node=this._ctx.createOscillator();let e=this._node;return e.type=r,r==="custom"?e.setPeriodicWave(t):e.frequency.value=t,this}static input(r){return et(this,null,function*(){try{let t=new l("input");if(!t)return;let e=r||{audio:!0,video:!1};return t._stream=yield navigator.mediaDevices.getUserMedia(e),t._node=t._ctx.createMediaStreamSource(t._stream),t}catch(t){return console.error("Cannot get audio from input device."),Promise.resolve(null)}})}get ctx(){return this._ctx}get node(){return this._node}get outputNode(){return this._outputNode}get stream(){return this._stream}get source(){return this._source}get buffer(){return this._buffer}set buffer(r){this._buffer=r}get type(){return this._type}get playing(){return this._playing}get progress(){let r=0,t=0;return this._buffer?(r=this._buffer.duration,t=this._timestamp?this._ctx.currentTime-this._timestamp:0):(r=this._source.duration,t=this._source.currentTime),t/r}get playable(){return this._type==="input"?this._node!==void 0:!!this._buffer||this._source.readyState===4}get binSize(){return this.analyzer.size}get sampleRate(){return this._ctx.sampleRate}get frequency(){return this._type==="gen"?this._node.frequency.value:0}set frequency(r){this._type==="gen"&&(this._node.frequency.value=r)}connect(r){return this._node.connect(r),this}setOutputNode(r){return this._outputNode=r,this}removeOutputNode(){return this._outputNode=null,this}analyze(r=256,t=-100,e=-30,i=.8){let n=this._ctx.createAnalyser();return n.fftSize=r*2,n.minDecibels=t,n.maxDecibels=e,n.smoothingTimeConstant=i,this.analyzer={node:n,size:n.frequencyBinCount,data:new Uint8Array(n.frequencyBinCount)},this._node.connect(this.analyzer.node),this}_domain(r){return this.analyzer?(r?this.analyzer.node.getByteTimeDomainData(this.analyzer.data):this.analyzer.node.getByteFrequencyData(this.analyzer.data),this.analyzer.data):new Uint8Array(0)}_domainTo(r,t,e=[0,0],i=[0,0]){let n=r?this.timeDomain():this.freqDomain(),s=new d;for(let o=i[0],a=n.length-i[1];o<a;o++)s.push(new h(e[0]+t[0]*o/a,e[1]+t[1]*n[o]/255));return s}timeDomain(){return this._domain(!0)}timeDomainTo(r,t=[0,0],e=[0,0]){return this._domainTo(!0,r,t,e)}freqDomain(){return this._domain(!1)}freqDomainTo(r,t=[0,0],e=[0,0]){return this._domainTo(!1,r,t,e)}reset(){return this.stop(),this._node.disconnect(),this}start(r=0){return this._ctx?this._ctx.state==="suspended"&&this._ctx.resume():this._createAudioContext(),this._type==="file"?this._buffer?(this._node.start(r),this._timestamp=this._ctx.currentTime+r):(this._source.play(),r>0&&(this._source.currentTime=r)):this._type==="gen"&&(this._gen(this._node.type,this._node.frequency.value),this._node.start(),this.analyzer&&this._node.connect(this.analyzer.node)),(this._outputNode||this._node).connect(this._ctx.destination),this._playing=!0,this}stop(){return this._playing&&(this._outputNode||this._node).disconnect(this._ctx.destination),this._type==="file"?this._buffer?this.progress<1&&this._node.stop():this._source.pause():this._type==="gen"?this._node.stop():this._type==="input"&&this._stream.getAudioTracks().forEach(r=>r.stop()),this._playing=!1,this}toggle(){return this._playing?this.stop():this.start(),this}};globalThis.Pts=$($($($($($($($($($($($($($($($($({},Dt),$t),It),gt),Pt),_t),xt),Lt),Gt),wt),Et),St),Ct),zt),vt),Ot),Mt);globalThis.Pts.namespace=l=>{let r=globalThis.Pts;for(let t in r)t!="namespace"&&(l[t]=r[t])};globalThis.Pts.quickStart=(l,r="#9ab")=>{if(!window)return;let t=globalThis;return globalThis.Pts.namespace(t),t.space=new tt(l).setup({bgcolor:r,resize:!0,retina:!0}),t.form=t.space.getForm(),function(e=null,i=null,n=null,s=null){t.space.add({start:i,animate:e,resize:s,action:n}),t.space.bindMouse().bindTouch().play()}};})();
4
+ (()=>{var Ht=Object.defineProperty;var Ft=Object.getOwnPropertySymbols;var jt=Object.prototype.hasOwnProperty,Vt=Object.prototype.propertyIsEnumerable;var qt=(l,r,t)=>r in l?Ht(l,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):l[r]=t,$=(l,r)=>{for(var t in r||(r={}))jt.call(r,t)&&qt(l,t,r[t]);if(Ft)for(var t of Ft(r))Vt.call(r,t)&&qt(l,t,r[t]);return l};var T=(l,r)=>{for(var t in r)Ht(l,t,{get:r[t],enumerable:!0})};var et=(l,r,t)=>new Promise((e,i)=>{var n=a=>{try{o(t.next(a))}catch(u){i(u)}},s=a=>{try{o(t.throw(a))}catch(u){i(u)}},o=a=>a.done?e(a.value):Promise.resolve(a.value).then(n,s);o((t=t.apply(l,r)).next())});var Dt={};T(Dt,{CanvasForm:()=>Q,CanvasSpace:()=>tt});var Lt={};T(Lt,{MultiTouchSpace:()=>Y,Space:()=>at});var xt={};T(xt,{Bound:()=>G,Group:()=>d,Pt:()=>h});var wt={};T(wt,{Const:()=>w,Util:()=>m});var Pt={};T(Pt,{Geom:()=>y,Num:()=>L,Range:()=>yt,Shaping:()=>st});var _t={};T(_t,{Circle:()=>B,Curve:()=>K,Line:()=>E,Polygon:()=>S,Rectangle:()=>M,Triangle:()=>j});var gt={};T(gt,{Mat:()=>C,Vec:()=>k});var k=class l{static add(r,t){if(typeof t=="number")for(let e=0,i=r.length;e<i;e++)r[e]+=t;else for(let e=0,i=r.length;e<i;e++)r[e]+=t[e]||0;return r}static subtract(r,t){if(typeof t=="number")for(let e=0,i=r.length;e<i;e++)r[e]-=t;else for(let e=0,i=r.length;e<i;e++)r[e]-=t[e]||0;return r}static multiply(r,t){if(typeof t=="number")for(let e=0,i=r.length;e<i;e++)r[e]*=t;else{if(r.length!=t.length)throw new Error(`Cannot do element-wise multiply since the array lengths don't match: ${r.toString()} multiply-with ${t.toString()}`);for(let e=0,i=r.length;e<i;e++)r[e]*=t[e]}return r}static divide(r,t){if(typeof t=="number"){if(t===0)throw new Error("Cannot divide by zero");for(let e=0,i=r.length;e<i;e++)r[e]/=t}else{if(r.length!=t.length)throw new Error(`Cannot do element-wise divide since the array lengths don't match. ${r.toString()} divide-by ${t.toString()}`);for(let e=0,i=r.length;e<i;e++)r[e]/=t[e]}return r}static dot(r,t){if(r.length!=t.length)throw new Error("Array lengths don't match");let e=0;for(let i=0,n=r.length;i<n;i++)e+=r[i]*t[i];return e}static cross2D(r,t){return r[0]*t[1]-r[1]*t[0]}static cross(r,t){return new h(r[1]*t[2]-r[2]*t[1],r[2]*t[0]-r[0]*t[2],r[0]*t[1]-r[1]*t[0])}static magnitude(r){return Math.sqrt(l.dot(r,r))}static unit(r,t=void 0){let e=t===void 0?l.magnitude(r):t;return e===0?h.make(r.length):l.divide(r,e)}static abs(r){return l.map(r,Math.abs)}static floor(r){return l.map(r,Math.floor)}static ceil(r){return l.map(r,Math.ceil)}static round(r){return l.map(r,Math.round)}static max(r){let t=Number.MIN_VALUE,e=0;for(let i=0,n=r.length;i<n;i++)t=Math.max(t,r[i]),t===r[i]&&(e=i);return{value:t,index:e}}static min(r){let t=Number.MAX_VALUE,e=0;for(let i=0,n=r.length;i<n;i++)t=Math.min(t,r[i]),t===r[i]&&(e=i);return{value:t,index:e}}static sum(r){let t=0;for(let e=0,i=r.length;e<i;e++)t+=r[e];return t}static map(r,t){for(let e=0,i=r.length;e<i;e++)r[e]=t(r[e],e,r);return r}},C=class l{constructor(){this.reset()}get value(){return this._33}get domMatrix(){return new DOMMatrix(l.toDOMMatrix(this._33))}reset(){this._33=l.scale2DMatrix(1,1)}scale2D(r,t=[0,0]){let e=l.scaleAt2DMatrix(r[0]||1,r[1]||1,t);return this._33=l.multiply(this._33,e),this}rotate2D(r,t=[0,0]){let e=l.rotateAt2DMatrix(Math.cos(r),Math.sin(r),t);return this._33=l.multiply(this._33,e),this}translate2D(r){let t=l.translate2DMatrix(r[0]||0,r[1]||0);return this._33=l.multiply(this._33,t),this}shear2D(r,t=[0,0]){let e=l.shearAt2DMatrix(Math.tan(r[0]||0),Math.tan(r[1]||1),t);return this._33=l.multiply(this._33,e),this}static add(r,t){if(typeof t!="number"){if(r[0].length!=t[0].length)throw new Error("Cannot add matrix if rows' and columns' size don't match.");if(r.length!=t.length)throw new Error("Cannot add matrix if rows' and columns' size don't match.")}let e=new d,i=typeof t=="number";for(let n=0,s=r.length;n<s;n++)e.push(r[n].$add(i?t:t[n]));return e}static multiply(r,t,e=!1,i=!1){let n=new d;if(typeof t!="number")if(i){if(r.length!=t.length)throw new Error("Cannot multiply matrix element-wise because the matrices' sizes don't match.");for(let s=0,o=r.length;s<o;s++)n.push(r[s].$multiply(t[s]))}else{if(!e&&r[0].length!=t.length)throw new Error("Cannot multiply matrix if rows in matrix-a don't match columns in matrix-b.");if(e&&r[0].length!=t[0].length)throw new Error("Cannot multiply matrix if transposed and the columns in both matrices don't match.");e||(t=l.transpose(t));for(let s=0,o=r.length;s<o;s++){let a=h.make(t.length,0);for(let u=0,c=t.length;u<c;u++)a[u]=k.dot(r[s],t[u]);n.push(a)}}else for(let s=0,o=r.length;s<o;s++)n.push(r[s].$multiply(t));return n}static zipSlice(r,t,e=!1){let i=[];for(let n=0,s=r.length;n<s;n++){if(r[n].length-1<t&&e===!1)throw`Index ${t} is out of bounds`;i.push(r[n][t]||e)}return new h(i)}static zip(r,t=!1,e=!1){let i=new d,n=e?r.reduce((s,o)=>Math.max(s,o.length),0):r[0].length;for(let s=0;s<n;s++)i.push(l.zipSlice(r,s,t));return i}static transpose(r,t=!1,e=!1){return l.zip(r,t,e)}static toDOMMatrix(r){return[r[0][0],r[0][1],r[1][0],r[1][1],r[2][0],r[2][1]]}static transform2D(r,t){let e=r[0]*t[0][0]+r[1]*t[1][0]+t[2][0],i=r[0]*t[0][1]+r[1]*t[1][1]+t[2][1];return new h(e,i)}static scale2DMatrix(r,t){return new d(new h(r,0,0),new h(0,t,0),new h(0,0,1))}static rotate2DMatrix(r,t){return new d(new h(r,t,0),new h(-t,r,0),new h(0,0,1))}static shear2DMatrix(r,t){return new d(new h(1,r,0),new h(t,1,0),new h(0,0,1))}static translate2DMatrix(r,t){return new d(new h(1,0,0),new h(0,1,0),new h(r,t,1))}static scaleAt2DMatrix(r,t,e){let i=l.scale2DMatrix(r,t);return i[2][0]=-e[0]*r+e[0],i[2][1]=-e[1]*t+e[1],i}static rotateAt2DMatrix(r,t,e){let i=l.rotate2DMatrix(r,t);return i[2][0]=e[0]*(1-r)+e[1]*t,i[2][1]=e[1]*(1-r)-e[0]*t,i}static shearAt2DMatrix(r,t,e){let i=l.shear2DMatrix(r,t);return i[2][0]=-e[1]*t,i[2][1]=-e[0]*r,i}static reflectAt2DMatrix(r,t){let e=E.intercept(r,t);if(e==null)return[new h([-1,0,0]),new h([0,1,0]),new h([r[0]+t[0],0,1])];{let i=e.yi,n=Math.atan(e.slope)*2,s=Math.cos(n),o=Math.sin(n);return[new h([s,o,0]),new h([o,-s,0]),new h([-i*o,i+i*s,1])]}}};var N=(l,r="expected")=>m.warn("Group's length is less than "+r,l),Wt=(l,r="")=>m.warn(`Index ${r} is out of bound in Group`,l),E=class l{static fromAngle(r,t,e){let i=new d(new h(r),new h(r));return i[1].toAngle(t,e,!0),i}static slope(r,t){return t[0]-r[0]===0?void 0:(t[1]-r[1])/(t[0]-r[0])}static intercept(r,t){if(t[0]-r[0]!==0){let e=(t[1]-r[1])/(t[0]-r[0]),i=r[1]-e*r[0];return{slope:e,yi:i,xi:e===0?void 0:-i/e}}}static sideOfPt2D(r,t){let e=m.iterToArray(r);return(e[1][0]-e[0][0])*(t[1]-e[0][1])-(t[0]-e[0][0])*(e[1][1]-e[0][1])}static collinear(r,t,e,i=.01){let n=new h(0,0,0).to(r).$subtract(t),s=new h(0,0,0).to(r).$subtract(e);return n.$cross(s).divide(1e3).equals(new h(0,0,0),i)}static magnitude(r){let t=m.iterToArray(r);return t.length>=2?t[1].$subtract(t[0]).magnitude():0}static magnitudeSq(r){let t=m.iterToArray(r);return t.length>=2?t[1].$subtract(t[0]).magnitudeSq():0}static perpendicularFromPt(r,t,e=!1){let i=m.iterToArray(r);if(i[0].equals(i[1]))return;let n=i[0].$subtract(i[1]),s=i[1].$subtract(t),o=s.$subtract(n.$project(s));return e?o:o.$add(t)}static distanceFromPt(r,t){let e=m.iterToArray(r),i=l.perpendicularFromPt(e,t,!0);return i?i.magnitude():e[0].$subtract(t).magnitude()}static intersectRay2D(r,t){let e=m.iterToArray(r),i=m.iterToArray(t),n=l.intercept(e[0],e[1]),s=l.intercept(i[0],i[1]),o=e[0],a=i[0];if(n==null){if(s==null)return;let u=-s.slope*(a[0]-o[0])+a[1];return new h(o[0],u)}else if(s==null){let u=-n.slope*(o[0]-a[0])+o[1];return new h(a[0],u)}else if(s.slope!=n.slope){let u=(n.slope*o[0]-s.slope*a[0]+a[1]-o[1])/(n.slope-s.slope),c=n.slope*(u-o[0])+o[1];return new h(u,c)}else return n.yi==s.yi?new h(o[0],o[1]):void 0}static intersectLine2D(r,t){let e=m.iterToArray(r),i=m.iterToArray(t),n=l.intersectRay2D(e,i);return n&&y.withinBound(n,e[0],e[1])&&y.withinBound(n,i[0],i[1])?n:void 0}static intersectLineWithRay2D(r,t){let e=m.iterToArray(r),i=m.iterToArray(t),n=l.intersectRay2D(e,i);return n&&y.withinBound(n,e[0],e[1])?n:void 0}static intersectPolygon2D(r,t,e=!1){let i=m.iterToArray(r),n=m.iterToArray(t),s=e?l.intersectLineWithRay2D:l.intersectLine2D,o=new d;for(let a=0,u=n.length;a<u;a++){let c=a===u-1?0:a+1,f=s([n[a],n[c]],i);f&&o.push(f)}return o.length>0?o:void 0}static intersectLines2D(r,t,e=!1){let i=new d,n=e?l.intersectLineWithRay2D:l.intersectLine2D;for(let s of r)for(let o of t){let a=n(s,o);a&&i.push(a)}return i}static intersectGridWithRay2D(r,t){let e=m.iterToArray(r),i=l.intercept(new h(e[0]).subtract(t),new h(e[1]).subtract(t)),n=new d;return i&&i.xi&&n.push(new h(t[0]+i.xi,t[1])),i&&i.yi&&n.push(new h(t[0],t[1]+i.yi)),n}static intersectGridWithLine2D(r,t){let e=m.iterToArray(r),i=l.intersectGridWithRay2D(e,t),n=new d;for(let s=0,o=i.length;s<o;s++)y.withinBound(i[s],e[0],e[1])&&n.push(i[s]);return n}static intersectRect2D(r,t){let e=m.iterToArray(r),i=m.iterToArray(t),n=y.boundingBox(d.fromPtArray(e));return M.hasIntersectRect2D(n,i)?l.intersectLines2D([e],M.sides(i)):new d}static subpoints(r,t){let e=m.iterToArray(r),i=new d;for(let n=1;n<=t;n++)i.push(y.interpolate(e[0],e[1],n/(t+1)));return i}static crop(r,t,e=0,i=!0){let n=m.iterToArray(r),o=n[e===0?1:0].$subtract(n[e]);if(o[0]===0||t[0]===0)return n[e];if(i){let a=o.unit().multiply(t[1]);return n[e].$add(a)}else{let a=M.fromCenter(n[e],t),u=M.sides(a),c=0;return Math.abs(o[1]/o[0])>Math.abs(t[1]/t[0])?c=o[1]<0?0:2:c=o[0]<0?3:1,l.intersectRay2D(u[c],n)}}static marker(r,t,e="arrow",i=!0){let n=m.iterToArray(r),s=i?0:1,o=i?1:0,a=n[s].$subtract(n[o]);if(a.magnitudeSq()===0)return new d;a.unit();let u=y.perpendicular(a).multiply(t[0]).add(n[o]);return e=="arrow"?(u.add(a.$multiply(t[1])),new d(n[o],u[0],u[1])):new d(u[0],u[1])}static toRect(r){let t=m.iterToArray(r);return new d(t[0].$min(t[1]),t[0].$max(t[1]))}},M=class l{static from(r,t,e){return l.fromTopLeft(r,t,e)}static fromTopLeft(r,t,e){let i=typeof t=="number"?[t,e||t]:t;return new d(new h(r),new h(r).add(i))}static fromCenter(r,t,e){let i=typeof t=="number"?[t/2,(e||t)/2]:new h(t).divide(2);return new d(new h(r).subtract(i),new h(r).add(i))}static toCircle(r,t=!0){return B.fromRect(r,t)}static toSquare(r,t=!1){let e=m.iterToArray(r),i=l.size(e),n=t?i.maxValue().value:i.minValue().value;return l.fromCenter(l.center(e),n,n)}static size(r){let t=m.iterToArray(r);return t[0].$max(t[1]).subtract(t[0].$min(t[1]))}static center(r){let t=m.iterToArray(r),e=t[0].$min(t[1]),i=t[0].$max(t[1]);return e.add(i.$subtract(e).divide(2))}static corners(r){let t=m.iterToArray(r),e=t[0].$min(t[1]),i=t[0].$max(t[1]);return new d(e,new h(i.x,e.y),i,new h(e.x,i.y))}static sides(r){let[t,e,i,n]=l.corners(r);return[new d(t,e),new d(e,i),new d(i,n),new d(n,t)]}static boundingBox(r){let t=m.iterToArray(r),e=m.flatten(t,!1),i=h.make(2,Number.MAX_VALUE),n=h.make(2,Number.MIN_VALUE);for(let s=0,o=e.length;s<o;s++){let a=0;for(let u of e[s])if(i[a]=Math.min(i[a],u[a]),n[a]=Math.max(n[a],u[a]),++a>=2)break}return new d(i,n)}static polygon(r){return l.corners(r)}static quadrants(r,t){let e=m.iterToArray(r),i=l.corners(e),n=t!=null?new h(t):l.center(e);return i.map(s=>new d(s,n).boundingBox())}static halves(r,t=.5,e=!1){let i=m.iterToArray(r),n=i[0].$min(i[1]),s=i[0].$max(i[1]),o=e?L.lerp(n[1],s[1],t):L.lerp(n[0],s[0],t);return e?[new d(n,new h(s[0],o)),new d(new h(n[0],o),s)]:[new d(n,new h(o,s[1])),new d(new h(o,n[1]),s)]}static withinBound(r,t){let e=m.iterToArray(r);return y.withinBound(t,e[0],e[1])}static hasIntersectRect2D(r,t,e=!1){let i=m.iterToArray(r),n=m.iterToArray(t);return e&&(i=y.boundingBox(i),n=y.boundingBox(n)),!(i[0][0]>n[1][0]||n[0][0]>i[1][0]||i[0][1]>n[1][1]||n[0][1]>i[1][1])}static intersectRect2D(r,t){let e=m.iterToArray(r),i=m.iterToArray(t);return l.hasIntersectRect2D(e,i)?E.intersectLines2D(l.sides(e),l.sides(i)):new d}},B=class l{static fromRect(r,t=!1){let e=m.iterToArray(r),i=0,n=i=M.size(e).minValue().value/2;if(t){let s=M.size(e).maxValue().value/2;i=Math.sqrt(n*n+s*s)}else i=n;return new d(M.center(e),new h(i,i))}static fromTriangle(r,t=!1){return t?j.circumcircle(r):j.incircle(r)}static fromCenter(r,t){return new d(new h(r),new h(t,t))}static withinBound(r,t,e=0){let i=m.iterToArray(r),n=i[0].$subtract(t);return n.dot(n)+e<i[1].x*i[1].x}static intersectRay2D(r,t){let e=m.iterToArray(r),i=m.iterToArray(t),n=i[0].$subtract(i[1]),s=e[0].$subtract(i[0]),o=n.dot(n),a=s.dot(n),u=s.dot(s)-e[1].x*e[1].x,c=a/o,f=u/o,p=c*c-f;if(p<0)return new d;{let b=Math.sqrt(p),P=-c+b,_=i[0].$subtract(n.$multiply(P));if(p===0)return new d(_);let D=-c-b,A=i[0].$subtract(n.$multiply(D));return new d(_,A)}}static intersectLine2D(r,t){let e=m.iterToArray(r),i=m.iterToArray(t),n=l.intersectRay2D(e,i),s=new d;if(n.length>0)for(let o=0,a=n.length;o<a;o++)M.withinBound(i,n[o])&&s.push(n[o]);return s}static intersectCircle2D(r,t){let e=m.iterToArray(r),i=m.iterToArray(t),n=i[0].$subtract(e[0]),s=n.magnitudeSq(),o=Math.sqrt(s),a=e[1].x,u=i[1].x,c=a*a,f=u*u;if(o>a+u)return new d;if(o<Math.abs(a-u))return new d(e[0].clone());{let p=(c-f+s)/(2*o),b=Math.sqrt(c-p*p),P=n.$multiply(p/o).add(e[0]);return new d(new h(P.x+b*n.y/o,P.y-b*n.x/o),new h(P.x-b*n.y/o,P.y+b*n.x/o))}}static intersectRect2D(r,t){let e=m.iterToArray(r),i=m.iterToArray(t),n=M.sides(i),s=[];for(let o=0,a=n.length;o<a;o++){let u=l.intersectLine2D(e,n[o]);u.length>0&&s.push(u)}return m.flatten(s)}static toRect(r,t=!1){let e=m.iterToArray(r),i=e[1][0];if(t){let n=Math.sqrt(i*i)/2;return new d(e[0].$subtract(n),e[0].$add(n))}else return new d(e[0].$subtract(i),e[0].$add(i))}static toTriangle(r,t=!0){let e=m.iterToArray(r);if(t){let i=-Math.PI/2,n=Math.PI*2/3,s=new d;for(let o=0;o<3;o++)s.push(e[0].clone().toAngle(i,e[1][0],!0)),i+=n;return s}else return j.fromCenter(e[0],e[1][0])}},j=class l{static fromRect(r){let t=m.iterToArray(r),e=t[0].$add(t[1]).divide(2);e.y=t[0][1];let i=t[1].clone();return i.x=t[0][0],new d(e,t[1].clone(),i)}static fromCircle(r){return B.toTriangle(r,!0)}static fromCenter(r,t){return l.fromCircle(B.fromCenter(r,t))}static medial(r){let t=m.iterToArray(r);return t.length<3?N(new d,3):S.midpoints(t,!0)}static oppositeSide(r,t){let e=m.iterToArray(r);return e.length<3?N(new d,3):t===0?d.fromPtArray([e[1],e[2]]):t===1?d.fromPtArray([e[0],e[2]]):d.fromPtArray([e[0],e[1]])}static altitude(r,t){let e=m.iterToArray(r),i=l.oppositeSide(e,t);return i.length>1?new d(e[t],E.perpendicularFromPt(i,e[t])):new d}static orthocenter(r){let t=m.iterToArray(r);if(t.length<3)return N(void 0,3);let e=l.altitude(t,0),i=l.altitude(t,1);return E.intersectRay2D(e,i)}static incenter(r){let t=m.iterToArray(r);if(t.length<3)return N(void 0,3);let e=S.bisector(t,0).add(t[0]),i=S.bisector(t,1).add(t[1]);return E.intersectRay2D(new d(t[0],e),new d(t[1],i))}static incircle(r,t){let e=m.iterToArray(r),i=t||l.incenter(e),n=S.area(e),s=S.perimeter(e,!0),o=2*n/s.total;return B.fromCenter(i,o)}static circumcenter(r){let t=m.iterToArray(r),e=l.medial(t),i=[e[0],y.perpendicular(t[0].$subtract(e[0])).p1.$add(e[0])],n=[e[1],y.perpendicular(t[1].$subtract(e[1])).p1.$add(e[1])];return E.intersectRay2D(i,n)}static circumcircle(r,t){let e=m.iterToArray(r),i=t||l.circumcenter(e),n=e[0].$subtract(i).magnitude();return B.fromCenter(i,n)}},S=class l{static centroid(r){return y.centroid(r)}static rectangle(r,t,e){return M.corners(M.fromCenter(r,t,e))}static fromCenter(r,t,e){let i=new d;for(let n=0;n<e;n++){let s=Math.PI*2*n/e;i.push(new h(Math.cos(s)*t,Math.sin(s)*t).add(r))}return i}static lineAt(r,t){let e=m.iterToArray(r);if(t<0||t>=e.length)throw new Error("index out of the Polygon's range");return new d(e[t],t===e.length-1?e[0]:e[t+1])}static lines(r,t=!0){let e=m.iterToArray(r);if(e.length<2)return N(new d,2);let i=m.split(e,2,1);return t&&i.push(new d(e[e.length-1],e[0])),i.map(n=>n)}static midpoints(r,t=!1,e=.5){return l.lines(r,t).map(s=>y.interpolate(s[0],s[1],e))}static adjacentSides(r,t,e=!1){let i=m.iterToArray(r);if(i.length<2)return N(new d,2);if(t<0||t>=i.length)return Wt(new d,t);let n=[],s=t-1;e&&s<0&&(s=i.length-1),s>=0&&n.push(new d(i[t],i[s]));let o=t+1;return e&&o>i.length-1&&(o=0),o<=i.length-1&&n.push(new d(i[t],i[o])),n}static bisector(r,t){let e=l.adjacentSides(r,t,!0);if(e.length>=2){let i=e[0][1].$subtract(e[0][0]).unit(),n=e[1][1].$subtract(e[1][0]).unit();return i.add(n).divide(2)}else return}static perimeter(r,t=!1){let e=l.lines(r,t),i=0,n=h.make(e.length,0);for(let s=0,o=e.length;s<o;s++){let a=E.magnitude(e[s]);i+=a,n[s]=a}return{total:i,segments:n}}static area(r){let t=m.iterToArray(r);if(t.length<3)return N(new d,3);let e=(n,s)=>n[0]*s[1]-n[1]*s[0],i=0;for(let n=0,s=t.length;n<s;n++)n<t.length-1?i+=e(t[n],t[n+1]):i+=e(t[n],t[0]);return Math.abs(i/2)}static convexHull(r,t=!1){let e=m.iterToArray(r);if(e.length<3)return N(new d,3);t||(e=e.slice(),e.sort((u,c)=>u[0]-c[0]));let i=(u,c,f)=>(c[0]-u[0])*(f[1]-u[1])-(f[0]-u[0])*(c[1]-u[1])>0,n=[],s=e.length-2,o=s+3;n[s]=e[2],n[o]=e[2],i(e[0],e[1],e[2])?(n[s+1]=e[0],n[s+2]=e[1]):(n[s+1]=e[1],n[s+2]=e[0]);for(let u=3,c=e.length;u<c;u++){let f=e[u];if(!(i(n[s],n[s+1],f)&&i(n[o-1],n[o],f))){for(;!i(n[s],n[s+1],f);)s+=1;for(s-=1,n[s]=f;!i(n[o-1],n[o],f);)o-=1;o+=1,n[o]=f}}let a=new d;for(let u=0;u<o-s;u++)a.push(n[s+u]);return a}static network(r,t=0){let e=m.iterToArray(r),i=[];for(let n=0,s=e.length;n<s;n++)n!=t&&i.push(new d(e[t],e[n]));return i}static nearestPt(r,t){let e=Number.MAX_VALUE,i=-1,n=0;for(let s of r){let o=s.$subtract(t).magnitudeSq();o<e&&(e=o,i=n),n++}return i}static projectAxis(r,t){let e=m.iterToArray(r),i=t.dot(e[0]),n=new h(i,i);for(let s=1,o=e.length;s<o;s++)i=t.dot(e[s]),n=new h(Math.min(i,n[0]),Math.max(i,n[1]));return n}static _axisOverlap(r,t,e){let i=l.projectAxis(r,e),n=l.projectAxis(t,e);return i[0]<n[0]?n[0]-i[1]:i[0]-n[1]}static hasIntersectPoint(r,t){let e=m.iterToArray(r),i=!1;for(let n=0,s=e.length;n<s;n++){let o=l.lineAt(e,n);o[0][1]>t[1]!=o[1][1]>t[1]&&t[0]<(o[1][0]-o[0][0])*(t[1]-o[0][1])/(o[1][1]-o[0][1])+o[0][0]&&(i=!i)}return i}static hasIntersectCircle(r,t){let e=m.iterToArray(r),i=m.iterToArray(t),n={which:-1,dist:0,normal:null,edge:null,vertex:null},s=i[0],o=i[1][0],a=Number.MAX_SAFE_INTEGER;for(let c=0,f=e.length;c<f;c++){let p=l.lineAt(e,c),b=new h(p[0].y-p[1].y,p[1].x-p[0].x).unit(),P=new d(s.$add(b.$multiply(o)),s.$subtract(b.$multiply(o))),_=l._axisOverlap(e,P,b);if(_>0)return null;Math.abs(_)<a&&(M.withinBound(p,E.perpendicularFromPt(p,s))||B.intersectLine2D(t,p).length>0)&&(n.edge=p,n.normal=b,a=Math.abs(_),n.which=c)}return n.edge?(s.$subtract(l.centroid(e)).dot(n.normal)<0&&n.normal.multiply(-1),n.dist=a,n.vertex=s,n):null}static hasIntersectPolygon(r,t){let e=m.iterToArray(r),i=m.iterToArray(t),n={which:-1,dist:0,normal:new h,edge:new d,vertex:new h},s=Number.MAX_SAFE_INTEGER;for(let b=0,P=e.length+i.length;b<P;b++){let _=b<e.length?l.lineAt(e,b):l.lineAt(i,b-e.length),D=new h(_[0].y-_[1].y,_[1].x-_[0].x).unit(),A=l._axisOverlap(e,i,D);if(A>0)return null;Math.abs(A)<s&&(n.edge=_,n.normal=D,s=Math.abs(A),n.which=b<e.length?0:1)}n.dist=s;let o=n.which===0?i:e,a=n.which===0?e:i,u=l.centroid(o),c=l.centroid(a);u.$subtract(c).dot(n.normal)<0&&n.normal.multiply(-1);let p=Number.MAX_SAFE_INTEGER;for(let b=0,P=o.length;b<P;b++){let _=n.normal.dot(o[b].$subtract(c));_<p&&(p=_,n.vertex=o[b])}return n}static intersectPolygon2D(r,t){let e=m.iterToArray(r),i=m.iterToArray(t),n=l.lines(e),s=[];for(let o=0,a=n.length;o<a;o++){let u=E.intersectPolygon2D(n[o],i,!1);u&&s.push(u)}return m.flatten(s,!0)}static toRects(r){let t=[];for(let i of r)t.push(y.boundingBox(i));let e=m.flatten(t,!1);return t.unshift(y.boundingBox(e)),t}},K=class l{static getSteps(r){let t=new d;for(let e=0;e<=r;e++){let i=e/r;t.push(new h(i*i*i,i*i,i,1))}return t}static controlPoints(r,t=0,e=!1){let i=m.iterToArray(r);if(t>i.length-1)return new d;let n=o=>o<i.length-1?o:i.length-1,s=i[t];return t=e?t:t+1,new d(s,i[n(t++)],i[n(t++)],i[n(t++)])}static _calcPt(r,t){let e=r.reduce((n,s,o)=>n+s.x*t[o],0),i=r.reduce((n,s,o)=>n+s.y*t[o],0);if(r[0].length>2){let n=r.reduce((s,o,a)=>s+o.z*t[a],0);return new h(e,i,n)}return new h(e,i)}static catmullRom(r,t=10){let e=m.iterToArray(r);if(e.length<2)return new d;let i=new d,n=l.getSteps(t),s=l.controlPoints(e,0,!0);for(let a=0;a<=t;a++)i.push(l.catmullRomStep(n[a],s));let o=0;for(;o<e.length-2;){let a=l.controlPoints(e,o);if(a.length>0){for(let u=0;u<=t;u++)i.push(l.catmullRomStep(n[u],a));o++}}return i}static catmullRomStep(r,t){let e=new d(new h(-.5,1,-.5,0),new h(1.5,-2.5,0,1),new h(-1.5,2,.5,0),new h(.5,-.5,0,0));return l._calcPt(t,C.multiply([r],e,!0)[0])}static cardinal(r,t=10,e=.5){let i=m.iterToArray(r);if(i.length<2)return new d;let n=new d,s=l.getSteps(t),o=l.controlPoints(i,0,!0);for(let u=0;u<=t;u++)n.push(l.cardinalStep(s[u],o,e));let a=0;for(;a<i.length-2;){let u=l.controlPoints(i,a);if(u.length>0){for(let c=0;c<=t;c++)n.push(l.cardinalStep(s[c],u,e));a++}}return n}static cardinalStep(r,t,e=.5){let i=new d(new h(-1,2,-1,0),new h(-1,1,0,0),new h(1,-2,1,0),new h(1,-1,0,0)),n=C.multiply([r],i,!0)[0].multiply(e),s=2*r[0]-3*r[1]+1,o=-2*r[0]+3*r[1],a=l._calcPt(t,n);return a.x+=s*t[1].x+o*t[2].x,a.y+=s*t[1].y+o*t[2].y,a.length>2&&(a.z+=s*t[1].z+o*t[2].z),a}static bezier(r,t=10){let e=m.iterToArray(r);if(e.length<4)return new d;let i=new d,n=l.getSteps(t),s=0;for(;s<e.length-3;){let o=l.controlPoints(e,s);if(o.length>0){for(let a=0;a<=t;a++)i.push(l.bezierStep(n[a],o));s+=3}}return i}static bezierStep(r,t){let e=new d(new h(-1,3,-3,1),new h(3,-6,3,0),new h(-3,3,0,0),new h(1,0,0,0));return l._calcPt(t,C.multiply([r],e,!0)[0])}static bspline(r,t=10,e=1){let i=m.iterToArray(r);if(i.length<2)return new d;let n=new d,s=l.getSteps(t),o=0;for(;o<i.length-3;){let a=l.controlPoints(i,o);if(a.length>0){if(e!==1)for(let u=0;u<=t;u++)n.push(l.bsplineTensionStep(s[u],a,e));else for(let u=0;u<=t;u++)n.push(l.bsplineStep(s[u],a));o++}}return n}static bsplineStep(r,t){let e=new d(new h(-.16666666666666666,.5,-.5,.16666666666666666),new h(.5,-1,0,.6666666666666666),new h(-.5,.5,.5,.16666666666666666),new h(.16666666666666666,0,0,0));return l._calcPt(t,C.multiply([r],e,!0)[0])}static bsplineTensionStep(r,t,e=1){let i=new d(new h(-.16666666666666666,.5,-.5,.16666666666666666),new h(-1.5,2,0,-.3333333333333333),new h(1.5,-2.5,.5,.16666666666666666),new h(.16666666666666666,0,0,0)),n=C.multiply([r],i,!0)[0].multiply(e),s=2*r[0]-3*r[1]+1,o=-2*r[0]+3*r[1],a=l._calcPt(t,n);return a.x+=s*t[1].x+o*t[2].x,a.y+=s*t[1].y+o*t[2].y,a.length>2&&(a.z+=s*t[1].z+o*t[2].z),a}};function Xt(){let l=4022871197;return function(t){if(t){t=t.toString();for(let e=0;e<t.length;e++){l+=t.charCodeAt(e);let i=.02519603282416938*l;l=i>>>0,i-=l,i*=l,l=i>>>0,i-=l,l+=i*4294967296}return(l>>>0)*23283064365386963e-26}else l=4022871197}}function Ut(l){let r=48,t=1,e=r,i=new Array(r),n,s,o=0,a=Xt();for(n=0;n<r;n++)i[n]=a(Math.random().toString());function u(){for(a(),n=0;n<r;n++)i[n]=a(" ");t=1,e=r}function c(p){return p=p.replace(/(^\s*)|(\s*$)/gi,""),p=p.replace(/[\x00-\x1F]/gi,""),p=p.replace(/\n /,`
5
+ `),p}function f(p){for(p=c(p),a(p),n=0;n<p.length;n++)for(o=p.charCodeAt(n),s=0;s<r;s++)i[s]-=a(o.toString()),i[s]<0&&(i[s]+=1)}return u(),f(l),{random(){++e>=r&&(e=0);let p=1768863*i[e]+t*23283064365386963e-26;return i[e]=p-(t=p|0)}}}var L=class l{static equals(r,t,e=1e-5){return Math.abs(r-t)<e}static lerp(r,t,e){return(1-e)*r+e*t}static clamp(r,t,e){return Math.max(t,Math.min(e,r))}static boundValue(r,t,e){let i=Math.abs(e-t),n=r%i;return n>e?n-=i:n<t&&(n+=i),n}static within(r,t,e){return r>=Math.min(t,e)&&r<=Math.max(t,e)}static randomRange(r,t=0){let e=r>t?r-t:t-r;return r+l.random()*e}static randomPt(r,t){let e=new h(r.length),i=t?k.subtract(t.slice(),r):r,n=t?r:new h(r.length).fill(0);for(let s=0,o=e.length;s<o;s++)e[s]=l.random()*i[s]+n[s];return e}static normalizeValue(r,t,e){let i=Math.min(t,e),n=Math.max(t,e);return(r-i)/(n-i)}static sum(r){let t=m.iterToArray(r),e=new h(t[0]);for(let i=1,n=t.length;i<n;i++)k.add(e,t[i]);return e}static average(r){let t=m.iterToArray(r);return l.sum(t).divide(t.length)}static cycle(r,t=st.sineInOut){return t(r>.5?2-r*2:r*2)}static mapToRange(r,t,e,i,n){if(t==e)throw new Error("[currMin, currMax] must define a range that is not zero");let s=Math.min(i,n),o=Math.max(i,n);return l.normalizeValue(r,t,e)*(o-s)+s}static seed(r){this.generator=Ut(r)}static random(){return this.generator?this.generator.random():Math.random()}},y=class l{static boundAngle(r){return L.boundValue(r,0,360)}static boundRadian(r){return L.boundValue(r,0,w.two_pi)}static toRadian(r){return r*w.deg_to_rad}static toDegree(r){return r*w.rad_to_deg}static boundingBox(r){let t,e;for(let i of r)t==null?(t=i.clone(),e=i.clone()):(t=t.$min(i),e=e.$max(i));return new d(t,e)}static centroid(r){return L.average(r)}static anchor(r,t=0,e="to"){let i=e=="to"?"subtract":"add",n=0;for(let s of r)typeof t=="number"?t!==n&&s[i](r[t]):s[i](t),n++}static interpolate(r,t,e=.5){let i=Math.min(r.length,t.length),n=h.make(i);for(let s=0;s<i;s++)n[s]=r[s]*(1-e)+t[s]*e;return n}static perpendicular(r,t=w.xy){let e=t[1],i=t[0],n=new h(r),s=new h(n);s[i]=-n[e],s[e]=n[i];let o=new h(n);return o[i]=n[e],o[e]=-n[i],new d(s,o)}static isPerpendicular(r,t){return new h(r).dot(t)===0}static withinBound(r,t,e){for(let i=0,n=Math.min(r.length,t.length,e.length);i<n;i++)if(!L.within(r[i],t[i],e[i]))return!1;return!0}static sortEdges(r){let t=m.iterToArray(r),e=l.boundingBox(t),i=e[1].add(e[0]).divide(2),n=(s,o)=>{if(s.length<2||o.length<2)throw new Error("Pt dimension cannot be less than 2");let a=s.$subtract(i),u=o.$subtract(i);if(a[0]>=0&&u[0]<0)return 1;if(a[0]<0&&u[0]>=0)return-1;if(a[0]==0&&u[0]==0)return a[1]>=0||u[1]>=0?a[1]>u[1]?1:-1:u[1]>a[1]?1:-1;let c=a.$cross2D(u);return c<0?1:c>0?-1:a[0]*a[0]+a[1]*a[1]>u[0]*u[0]+u[1]*u[1]?1:-1};return t.sort(n)}static scale(r,t,e){let i=m.iterToArray(r[0]!==void 0&&typeof r[0]=="number"?[r]:r),n=typeof t=="number"?h.make(i[0].length,t):t;e||(e=h.make(i[0].length,0));for(let s=0,o=i.length;s<o;s++){let a=i[s];for(let u=0,c=a.length;u<c;u++)a[u]=e&&e[u]?e[u]+(a[u]-e[u])*n[u]:a[u]*n[u]}return l}static rotate2D(r,t,e,i){let n=m.iterToArray(r[0]!==void 0&&typeof r[0]=="number"?[r]:r),s=e?C.rotateAt2DMatrix:C.rotate2DMatrix;e||(e=h.make(n[0].length,0));let o=Math.cos(t),a=Math.sin(t);for(let u=0,c=n.length;u<c;u++){let f=i?n[u].$take(i):n[u];if(f.to(C.transform2D(f,s(o,a,e))),i)for(let p=0;p<i.length;p++)n[u][i[p]]=f[p]}return l}static shear2D(r,t,e,i){let n=m.iterToArray(r[0]!==void 0&&typeof r[0]=="number"?[r]:r),s=typeof t=="number"?[t,t]:t;e||(e=h.make(n[0].length,0));let o=e?C.shearAt2DMatrix:C.shear2DMatrix,a=Math.tan(s[0]),u=Math.tan(s[1]);for(let c=0,f=n.length;c<f;c++){let p=i?n[c].$take(i):n[c];if(p.to(C.transform2D(p,o(a,u,e))),i)for(let b=0;b<i.length;b++)n[c][i[b]]=p[b]}return l}static reflect2D(r,t,e){let i=m.iterToArray(r[0]!==void 0&&typeof r[0]=="number"?[r]:r),n=m.iterToArray(t),s=C.reflectAt2DMatrix(n[0],n[1]);for(let o=0,a=i.length;o<a;o++){let u=e?i[o].$take(e):i[o];if(u.to(C.transform2D(u,s)),e)for(let c=0;c<e.length;c++)i[o][e[c]]=u[c]}return l}static cosTable(){let r=new Float64Array(360);for(let e=0;e<360;e++)r[e]=Math.cos(e*Math.PI/180);return{table:r,cos:e=>r[Math.floor(l.boundAngle(l.toDegree(e)))]}}static sinTable(){let r=new Float64Array(360);for(let e=0;e<360;e++)r[e]=Math.sin(e*Math.PI/180);return{table:r,sin:e=>r[Math.floor(l.boundAngle(l.toDegree(e)))]}}},st=class l{static linear(r,t=1){return t*r}static quadraticIn(r,t=1){return t*r*r}static quadraticOut(r,t=1){return-t*r*(r-2)}static quadraticInOut(r,t=1){let e=r*2;return r<.5?t/2*r*r*4:-t/2*((e-1)*(e-3)-1)}static cubicIn(r,t=1){return t*r*r*r}static cubicOut(r,t=1){let e=r-1;return t*(e*e*e+1)}static cubicInOut(r,t=1){let e=r*2;return r<.5?t/2*e*e*e:t/2*((e-2)*(e-2)*(e-2)+2)}static exponentialIn(r,t=1,e=.25){return t*Math.pow(r,1/e)}static exponentialOut(r,t=1,e=.25){return t*Math.pow(r,e)}static sineIn(r,t=1){return-t*Math.cos(r*w.half_pi)+t}static sineOut(r,t=1){return t*Math.sin(r*w.half_pi)}static sineInOut(r,t=1){return-t/2*(Math.cos(Math.PI*r)-1)}static cosineApprox(r,t=1){let e=r*r,i=e*e,n=i*e;return t*(4*n/9-17*i/9+22*e/9)}static circularIn(r,t=1){return-t*(Math.sqrt(1-r*r)-1)}static circularOut(r,t=1){let e=r-1;return t*Math.sqrt(1-e*e)}static circularInOut(r,t=1){let e=r*2;return r<.5?-t/2*(Math.sqrt(1-e*e)-1):t/2*(Math.sqrt(1-(e-2)*(e-2))+1)}static elasticIn(r,t=1,e=.7){let i=r-1,n=e/w.two_pi*1.5707963267948966;return t*(-Math.pow(2,10*i)*Math.sin((i-n)*w.two_pi/e))}static elasticOut(r,t=1,e=.7){let i=e/w.two_pi*1.5707963267948966;return t*(Math.pow(2,-10*r)*Math.sin((r-i)*w.two_pi/e))+t}static elasticInOut(r,t=1,e=.6){let i=r*2,n=e/w.two_pi*1.5707963267948966;return r<.5?(i-=1,t*(-.5*(Math.pow(2,10*i)*Math.sin((i-n)*w.two_pi/e)))):(i-=1,t*(.5*(Math.pow(2,-10*i)*Math.sin((i-n)*w.two_pi/e)))+t)}static bounceIn(r,t=1){return t-l.bounceOut(1-r,t)}static bounceOut(r,t=1){return r<1/2.75?t*(7.5625*r*r):r<2/2.75?(r-=1.5/2.75,t*(7.5625*r*r+.75)):r<2.5/2.75?(r-=2.25/2.75,t*(7.5625*r*r+.9375)):(r-=2.625/2.75,t*(7.5625*r*r+.984375))}static bounceInOut(r,t=1){return r<.5?l.bounceIn(r*2,t)/2:l.bounceOut(r*2-1,t)/2+t/2}static sigmoid(r,t=1,e=10){let i=e*(r-.5);return t/(1+Math.exp(-i))}static logSigmoid(r,t=1,e=.7){e=Math.max(w.epsilon,Math.min(1-w.epsilon,e)),e=1/(1-e);let i=1/(1+Math.exp((r-.5)*e*-2)),n=1/(1+Math.exp(e)),s=1/(1+Math.exp(-e));return t*(i-n)/(s-n)}static seat(r,t=1,e=.5){return r<.5?t*Math.pow(2*r,1-e)/2:t*(1-Math.pow(2*(1-r),1-e)/2)}static quadraticBezier(r,t=1,e=[.05,.95]){let i=typeof e!="number"?e[0]:e,n=typeof e!="number"?e[1]:.5,s=1-2*i;s===0&&(s=w.epsilon);let o=(Math.sqrt(i*i+s*r)-i)/s;return t*((1-2*n)*(o*o)+2*n*o)}static cubicBezier(r,t=1,e=[.1,.7],i=[.9,.2]){let n=new d(new h(0,0),new h(e),new h(i),new h(1,1));return t*K.bezierStep(new h(r*r*r,r*r,r,1),K.controlPoints(n)).y}static quadraticTarget(r,t=1,e=[.2,.35]){let i=Math.min(1-w.epsilon,Math.max(w.epsilon,e[0])),n=Math.min(1,Math.max(0,e[1])),s=(1-n)/(1-i)-n/i,o=(s*(i*i)-n)/i,a=s*(r*r)-o*r;return t*Math.min(1,Math.max(0,a))}static cliff(r,t=1,e=.5){return r>e?t:0}static step(r,t,e,i,...n){let s=1/t,o=Math.floor(e/s)*s;return r(o,i,...n)}},yt=class{constructor(r){this._dims=0;this._source=d.fromPtArray(r),this.calc()}get max(){return this._max.clone()}get min(){return this._min.clone()}get magnitude(){return this._mag.clone()}calc(){if(!this._source)return;let r=this._source[0].length;this._dims=r;let t=new h(r),e=new h(r),i=new h(r);for(let n=0;n<r;n++){t[n]=w.min,e[n]=w.max,i[n]=0;let s=this._source.zipSlice(n);for(let o=0,a=s.length;o<a;o++)t[n]=Math.max(t[n],s[o]),e[n]=Math.min(e[n],s[o]),i[n]=t[n]-e[n]}return this._max=t,this._min=e,this._mag=i,this}mapTo(r,t,e){let i=new d;for(let n=0,s=this._source.length;n<s;n++){let o=this._source[n],a=new h(this._dims);for(let u=0;u<this._dims;u++)a[u]=e&&e[u]?o[u]:L.mapToRange(o[u],this._min[u],this._max[u],r,t);i.push(a)}return i}append(r,t=!0){let e=m.iterToArray(r);if(e[0].length!==this._dims)throw new Error(`Dimensions don't match. ${this._dims} dimensions in Range and ${e[0].length} provided in parameter. `);return this._source=this._source.concat(e),t&&this.calc(),this}ticks(r){let t=new d;for(let e=0;e<=r;e++){let i=new h(this._dims);for(let n=0,s=this._max.length;n<s;n++)i[n]=L.lerp(this._min[n],this._max[n],e/r);t.push(i)}return t}};var w={xy:"xy",yz:"yz",xz:"xz",xyz:"xyz",horizontal:0,vertical:1,identical:0,right:4,bottom_right:5,bottom:6,bottom_left:7,left:8,top_left:1,top:2,top_right:3,epsilon:1e-4,max:Number.MAX_VALUE,min:Number.MIN_VALUE,pi:Math.PI,two_pi:6.283185307179586,half_pi:1.5707963267948966,quarter_pi:.7853981633974483,one_degree:.017453292519943295,rad_to_deg:57.29577951308232,deg_to_rad:.017453292519943295,gravity:9.81,newton:.10197,gaussian:.3989422804014327},q=class q{static warnLevel(r){return r&&(q._warnLevel=r),q._warnLevel}static getArgs(r){if(r.length<1)return[];let t=[],e=Array.isArray(r[0])||ArrayBuffer.isView(r[0]);if(typeof r[0]=="number")t=Array.prototype.slice.call(r);else if(typeof r[0]=="object"&&!e){let i=["x","y","z","w"],n=r[0];for(let s=0;s<i.length&&!(n.length&&s>=n.length||!(i[s]in n));s++)t.push(n[i[s]])}else e&&(t=[].slice.call(r[0]));return t}static warn(r="error",t=void 0){if(q.warnLevel()=="error")throw new Error(r);return q.warnLevel()=="warn"&&console.warn(r),t}static randomInt(r,t=0){return q.warn("Util.randomInt is deprecated. Please use `Num.randomRange`"),Math.floor(L.random()*r)+t}static split(r,t,e,i=!1,n=!0){let s=[],o=[],a=e||t,u=0;if(r.length<=0||a<=0)return[];for(;u<r.length;){o=[];for(let c=0;c<t;c++)if(i)o.push(r[(u+c)%r.length]);else{if(u+c>=r.length)break;o.push(r[u+c])}u+=a,(!n||n&&o.length===t)&&s.push(o)}return s}static flatten(r,t=!0){let e=t?new d:[];return e.concat.apply(e,r)}static combine(r,t,e){let i=[];for(let n=0,s=r.length;n<s;n++)for(let o=0,a=t.length;o<a;o++)i.push(e(r[n],t[o]));return i}static zip(r){let t=[];for(let e=0,i=r[0].length;e<i;e++){let n=[];for(let s=0;s<r.length;s++)n.push(r[s][e]);t.push(n)}return t}static stepper(r,t=0,e=1,i){let n=t;return function(){return n+=e,n>=r&&(n=t+(n-r)),i&&i(n),n}}static forRange(r,t,e=0,i=1){let n=[];for(let s=e,o=t;s<o;s+=i)n[s]=r(s);return n}static load(r,t){let e=new XMLHttpRequest;e.open("GET",r,!0),e.onload=function(){e.status>=200&&e.status<400?t(e.responseText,!0):t(`Server error (${e.status}) when loading "${r}"`,!1)},e.onerror=function(){t("Unknown network error",!1)},e.send()}static download(r,t="pts_canvas_image",e="png",i=1){let n=e==="jpg"?"jpeg":e;r.element.toBlob(function(s){let o=document.createElement("a"),a=URL.createObjectURL(s);o.href=a,o.download=`${t}.${e}`,document.body.appendChild(o),o.click(),document.body.removeChild(o),URL.revokeObjectURL(a)},`image/${n}`,i)}static performance(r=10){let t=Date.now(),e=[];return function(){let i=Date.now();return e.push(i-t),e.length>=r&&e.shift(),t=i,Math.floor(e.reduce((n,s)=>n+s,0)/e.length)}}static arrayCheck(r,t=2){return Array.isArray(r)&&r.length<t?(q.warn(`Requires ${t} or more Pts in this Group.`),!1):!0}static iterToArray(r){return Array.isArray(r)?r:[...r]}static isMobile(){return/iPhone|iPad|Android/i.test(navigator.userAgent)}static uniqueId(r=!1){return r&&crypto?crypto.randomUUID():Date.now().toString(36)+Math.random().toString(36).substring(2)}};q._warnLevel="mute";var m=q;var h=class l extends Float32Array{constructor(...r){let t;r.length===1&&typeof r[0]=="number"?t=r[0]:t=r.length>0?m.getArgs(r):[0,0],super(t)}static make(r,t=0,e=!1){let i=new Float32Array(r);if(t&&i.fill(t),e)for(let n=0,s=i.length;n<s;n++)i[n]=i[n]*L.random();return new l(i)}get id(){return this._id}set id(r){this._id=r}get x(){return this[0]}set x(r){this[0]=r}get y(){return this[1]}set y(r){this[1]=r}get z(){return this[2]}set z(r){this[2]=r}get w(){return this[3]}set w(r){this[3]=r}clone(){return new l(this)}equals(r,t=1e-6){for(let e=0,i=this.length;e<i;e++)if(Math.abs(this[e]-r[e])>t)return!1;return!0}to(...r){let t=m.getArgs(r);for(let e=0,i=Math.min(this.length,t.length);e<i;e++)this[e]=t[e];return this}$to(...r){return this.clone().to(...r)}toAngle(r,t,e=!1){let i=t!=null?t:this.magnitude(),n=[Math.cos(r)*i,Math.sin(r)*i];return e?this.add(n):this.to(n)}op(r){let t=this;return(...e)=>r(t,...e)}ops(r){let t=[];for(let e=0,i=r.length;e<i;e++)t.push(this.op(r[e]));return t}$take(r){let t=[];for(let e=0,i=r.length;e<i;e++)t.push(this[r[e]]||0);return new l(t)}$concat(...r){return new l(this.toArray().concat(m.getArgs(r)))}add(...r){return r.length===1&&typeof r[0]=="number"?k.add(this,r[0]):k.add(this,m.getArgs(r)),this}$add(...r){return this.clone().add(...r)}subtract(...r){return r.length===1&&typeof r[0]=="number"?k.subtract(this,r[0]):k.subtract(this,m.getArgs(r)),this}$subtract(...r){return this.clone().subtract(...r)}multiply(...r){return r.length===1&&typeof r[0]=="number"?k.multiply(this,r[0]):k.multiply(this,m.getArgs(r)),this}$multiply(...r){return this.clone().multiply(...r)}divide(...r){return r.length===1&&typeof r[0]=="number"?k.divide(this,r[0]):k.divide(this,m.getArgs(r)),this}$divide(...r){return this.clone().divide(...r)}magnitudeSq(){return k.dot(this,this)}magnitude(){return k.magnitude(this)}unit(r=void 0){return k.unit(this,r),this}$unit(r=void 0){return this.clone().unit(r)}dot(...r){return k.dot(this,m.getArgs(r))}$cross2D(...r){return k.cross2D(this,m.getArgs(r))}$cross(...r){return k.cross(this,m.getArgs(r))}$project(...r){return this.$multiply(this.dot(...r)/this.magnitudeSq())}projectScalar(...r){return this.dot(...r)/this.magnitude()}abs(){return k.abs(this),this}$abs(){return this.clone().abs()}floor(){return k.floor(this),this}$floor(){return this.clone().floor()}ceil(){return k.ceil(this),this}$ceil(){return this.clone().ceil()}round(){return k.round(this),this}$round(){return this.clone().round()}minValue(){return k.min(this)}maxValue(){return k.max(this)}$min(...r){let t=m.getArgs(r),e=this.clone();for(let i=0,n=Math.min(this.length,t.length);i<n;i++)e[i]=Math.min(this[i],t[i]);return e}$max(...r){let t=m.getArgs(r),e=this.clone();for(let i=0,n=Math.min(this.length,t.length);i<n;i++)e[i]=Math.max(this[i],t[i]);return e}angle(r=w.xy){return Math.atan2(this[r[1]],this[r[0]])}angleBetween(r,t=w.xy){return y.boundRadian(this.angle(t))-y.boundRadian(r.angle(t))}scale(r,t){return y.scale(this,r,t||l.make(this.length,0)),this}rotate2D(r,t,e){return y.rotate2D(this,r,t||l.make(this.length,0),e),this}shear2D(r,t,e){return y.shear2D(this,r,t||l.make(this.length,0),e),this}reflect2D(r,t){return y.reflect2D(this,r,t),this}toString(){return`Pt(${this.join(", ")})`}toArray(){return[].slice.call(this)}toGroup(){return new d(l.make(this.length),this.clone())}toBound(){return new G(l.make(this.length),this.clone())}},d=class l extends Array{constructor(...r){super(...r)}get id(){return this._id}set id(r){this._id=r}get p1(){return this[0]}get p2(){return this[1]}get p3(){return this[2]}get p4(){return this[3]}get q1(){return this[this.length-1]}get q2(){return this[this.length-2]}get q3(){return this[this.length-3]}get q4(){return this[this.length-4]}clone(){let r=new l;for(let t=0,e=this.length;t<e;t++)r.push(this[t].clone());return r}static fromArray(r){let t=new l;for(let e of r){let i=e instanceof h?e:new h(e);t.push(i)}return t}static fromPtArray(r){return l.from(r)}split(r,t,e=!1){return m.split(this,r,t,e)}insert(r,t=0){return l.prototype.splice.apply(this,[t,0,...r]),this}remove(r=0,t=1){let e=r<0?[r*-1-1,t]:[r,t];return l.prototype.splice.apply(this,e)}segments(r=2,t=1,e=!1){return this.split(r,t,e)}lines(){return this.segments(2,1)}centroid(){return y.centroid(this)}boundingBox(){return y.boundingBox(this)}anchorTo(r=0){y.anchor(this,r,"to")}anchorFrom(r=0){y.anchor(this,r,"from")}op(r){let t=this;return(...e)=>r(t,...e)}ops(r){let t=[];for(let e=0,i=r.length;e<i;e++)t.push(this.op(r[e]));return t}interpolate(r){r=L.clamp(r,0,1);let t=this.length-1,e=1/(this.length-1),i=Math.floor(r/e);return y.interpolate(this[i],this[Math.min(this.length-1,i+1)],(r-i*e)*t)}moveBy(...r){return this.add(...r)}moveTo(...r){let t=new h(m.getArgs(r)).subtract(this[0]);return this.moveBy(t),this}scale(r,t){for(let e=0,i=this.length;e<i;e++)y.scale(this[e],r,t||this[0]);return this}rotate2D(r,t,e){for(let i=0,n=this.length;i<n;i++)y.rotate2D(this[i],r,t||this[0],e);return this}shear2D(r,t,e){for(let i=0,n=this.length;i<n;i++)y.shear2D(this[i],r,t||this[0],e);return this}reflect2D(r,t){for(let e=0,i=this.length;e<i;e++)y.reflect2D(this[e],r,t);return this}sortByDimension(r,t=!1){return this.sort((e,i)=>t?i[r]-e[r]:e[r]-i[r])}forEachPt(r,...t){if(!this[0][r])return m.warn(`${r} is not a function of Pt`),this;for(let e=0,i=this.length;e<i;e++)this[e]=this[e][r](...t);return this}add(...r){return this.forEachPt("add",...r)}subtract(...r){return this.forEachPt("subtract",...r)}multiply(...r){return this.forEachPt("multiply",...r)}divide(...r){return this.forEachPt("divide",...r)}$matrixAdd(r){return C.add(this,r)}$matrixMultiply(r,t=!1,e=!1){return C.multiply(this,r,t,e)}zipSlice(r,t=!1){return C.zipSlice(this,r,t)}$zip(r=void 0,t=!1){return C.zip(this,r,t)}toBound(){return G.fromGroup(this)}toString(){return"Group[ "+this.reduce((r,t)=>r+t.toString()+" ","")+" ]"}},G=class l extends d{constructor(...t){super(...t);this._center=new h;this._size=new h;this._topLeft=new h;this._bottomRight=new h;this._inited=!1;this.init()}static fromBoundingRect(t){let e=new l(new h(t.left||0,t.top||0),new h(t.right||0,t.bottom||0));return t.width&&t.height&&(e.size=new h(t.width,t.height)),e}static fromGroup(t){let e=m.iterToArray(t);if(e.length<2)throw new Error("Cannot create a Bound from a group that has less than 2 Pt");return new l(e[0],e[e.length-1])}init(){if(this.p1&&(this._size=this.p1.clone(),this._inited=!0),this.p1&&this.p2){let t=this.p1,e=this.p2;this.topLeft=t.$min(e),this._bottomRight=t.$max(e),this._updateSize(),this._inited=!0}}clone(){return new l(this._topLeft.clone(),this._bottomRight.clone())}_updateSize(){this._size=this._bottomRight.$subtract(this._topLeft).abs(),this._updateCenter()}_updateCenter(){this._center=this._size.$multiply(.5).add(this._topLeft)}_updatePosFromTop(){this._bottomRight=this._topLeft.$add(this._size),this._updateCenter()}_updatePosFromBottom(){this._topLeft=this._bottomRight.$subtract(this._size),this._updateCenter()}_updatePosFromCenter(){let t=this._size.$multiply(.5);this._topLeft=this._center.$subtract(t),this._bottomRight=this._center.$add(t)}get size(){return new h(this._size)}set size(t){this._size=new h(t),this._updatePosFromTop()}get center(){return new h(this._center)}set center(t){this._center=new h(t),this._updatePosFromCenter()}get topLeft(){return new h(this._topLeft)}set topLeft(t){this._topLeft=new h(t),this[0]=this._topLeft,this._updateSize()}get bottomRight(){return new h(this._bottomRight)}set bottomRight(t){this._bottomRight=new h(t),this[1]=this._bottomRight,this._updateSize()}get width(){return this._size.length>0?this._size.x:0}set width(t){this._size.x=t,this._updatePosFromTop()}get height(){return this._size.length>1?this._size.y:0}set height(t){this._size.y=t,this._updatePosFromTop()}get depth(){return this._size.length>2?this._size.z:0}set depth(t){this._size.z=t,this._updatePosFromTop()}get x(){return this.topLeft.x}get y(){return this.topLeft.y}get z(){return this.topLeft.z}get inited(){return this._inited}update(){return this._topLeft=this[0],this._bottomRight=this[1],this._updateSize(),this}};var vt={};T(vt,{UI:()=>W,UIButton:()=>ot,UIDragger:()=>kt,UIPointerActions:()=>v,UIShape:()=>X});var X={rectangle:"rectangle",circle:"circle",polygon:"polygon",polyline:"polyline",line:"line"},v={up:"up",down:"down",move:"move",drag:"drag",uidrag:"uidrag",drop:"drop",uidrop:"uidrop",over:"over",out:"out",enter:"enter",leave:"leave",click:"click",keydown:"keydown",keyup:"keyup",pointerdown:"pointerdown",pointerup:"pointerup",contextmenu:"contextmenu",all:"all"},V=class V{constructor(r,t,e={},i){this._holds=new Map;this._group=d.fromArray(r),this._shape=t,this._id=i===void 0?`ui_${V._counter++}`:i,this._states=e,this._actions={}}static fromRectangle(r,t,e){return new this(r,X.rectangle,t,e)}static fromCircle(r,t,e){return new this(r,X.circle,t,e)}static fromPolygon(r,t,e){return new this(r,X.polygon,t,e)}static fromUI(r,t,e){return new this(r.group,r.shape,t||r._states,e)}get id(){return this._id}set id(r){this._id=r}get group(){return this._group}set group(r){this._group=r}get shape(){return this._shape}set shape(r){this._shape=r}state(r,t){return r?t!==void 0?(this._states[r]=t,this):this._states[r]:null}on(r,t){return this._actions[r]||(this._actions[r]=[]),V._addHandler(this._actions[r],t)}off(r,t){return this._actions[r]?t===void 0?(delete this._actions[r],!0):V._removeHandler(this._actions[r],t):!1}listen(r,t,e){if(this._actions[r]!==void 0){if(this._within(t)||Array.from(this._holds.values()).indexOf(r)>=0)return V._trigger(this._actions[r],this,t,r,e),!0;if(this._actions.all)return V._trigger(this._actions.all,this,t,r,e),!0}return!1}hold(r){let t=Math.max(0,...Array.from(this._holds.keys()))+1;return this._holds.set(t,r),t}unhold(r){r!==void 0?this._holds.delete(r):this._holds.clear()}static track(r,t,e,i){for(let n=0,s=r.length;n<s;n++)r[n].listen(t,e,i)}render(r){r(this._group,this._states)}toString(){return`UI ${this.group.toString}`}_within(r){let t=null;if(this._shape===X.rectangle)t=M.withinBound;else if(this._shape===X.circle)t=B.withinBound;else if(this._shape===X.polygon)t=S.hasIntersectPoint;else return!1;return t(this._group,r)}static _trigger(r,t,e,i,n){if(r)for(let s=0,o=r.length;s<o;s++)r[s]&&r[s](t,e,i,n)}static _addHandler(r,t){return t?(r.push(t),r.length-1):-1}static _removeHandler(r,t){if(t>=0&&t<r.length){let e=r.length;return r.splice(t,1),e>r.length}else return!1}};V._counter=0;var W=V,ot=class extends W{constructor(t,e,i={},n){super(t,e,i,n);this._hoverID=-1;i.hover===void 0&&(this._states.hover=!1),i.clicks===void 0&&(this._states.clicks=0);let s=v;this.on(s.up,(o,a,u,c)=>{this.state("clicks",this._states.clicks+1)}),this.on(s.move,(o,a,u,c)=>{if(this._within(a)&&!this._states.hover){this.state("hover",!0),W._trigger(this._actions[s.enter],this,a,s.enter,c);let p=this.hold(s.move);this._hoverID=this.on(s.move,(b,P)=>{!this._within(P)&&!this.state("dragging")&&(this.state("hover",!1),W._trigger(this._actions[s.leave],this,a,s.leave,c),this.off(s.move,this._hoverID),this.unhold(p))})}})}onClick(t){return this.on(v.up,t)}offClick(t){return this.off(v.up,t)}onContextMenu(t){return this.on(v.contextmenu,t)}offContextMenu(t){return this.off(v.contextmenu,t)}onHover(t,e){let i=[void 0,void 0];return t&&(i[0]=this.on(v.enter,t)),e&&(i[1]=this.on(v.leave,e)),i}offHover(t,e){let i=[!1,!1];return(t===void 0||t>=0)&&(i[0]=this.off(v.enter,t)),(e===void 0||e>=0)&&(i[1]=this.off(v.leave,e)),i}},kt=class extends ot{constructor(t,e,i={},n){super(t,e,i,n);this._draggingID=-1;this._moveHoldID=-1;this._dropHoldID=-1;this._upHoldID=-1;i.dragging===void 0&&(this._states.dragging=!1),i.moved===void 0&&(this._states.moved=!1),i.offset===void 0&&(this._states.offset=new h);let s=v;this.on(s.down,(a,u,c,f)=>{this._moveHoldID===-1&&(this.state("dragging",!0),this.state("offset",new h(u).subtract(a.group[0])),this._moveHoldID=this.hold(s.move)),this._dropHoldID===-1&&(this._dropHoldID=this.hold(s.drop)),this._upHoldID===-1&&(this._upHoldID=this.hold(s.up)),this._draggingID===-1&&(this._draggingID=this.on(s.move,(p,b)=>{this.state("dragging")&&(W._trigger(this._actions[s.uidrag],p,b,s.uidrag,f),this.state("moved",!0))}))});let o=(a,u,c,f)=>{this.state("dragging",!1),this.off(s.move,this._draggingID),this._draggingID=-1,this.unhold(this._moveHoldID),this._moveHoldID=-1,this.unhold(this._dropHoldID),this._dropHoldID=-1,this.unhold(this._upHoldID),this._upHoldID=-1,this.state("moved")&&(W._trigger(this._actions[s.uidrop],a,u,s.uidrop,f),this.state("moved",!1))};this.on(s.drop,o),this.on(s.up,o),this.on(s.out,o)}onDrag(t){return this.on(v.uidrag,t)}offDrag(t){return this.off(v.uidrag,t)}onDrop(t){return this.on(v.uidrop,t)}offDrop(t){return this.off(v.uidrop,t)}};var at=class{constructor(){this.id="space";this.bound=new G;this._time={prev:0,diff:0,end:-1,min:0};this.players={};this.playerCount=0;this._animID=-1;this._pause=!1;this._refresh=void 0;this._pointer=new h;this._isReady=!1;this._playing=!1}refresh(r){return this._refresh=r,this}minFrameTime(r=0){this._time.min=r}add(r){let t=typeof r=="function"?{animate:r}:r,e=this.playerCount++,i=t.animateID||this.id+e;return this.players[i]=t,t.animateID=i,t.resize&&this.bound.inited&&t.resize(this.bound),this._refresh===void 0&&(this._refresh=!0),this}remove(r){return delete this.players[r.animateID],this}removeAll(){return this.players={},this}play(r=0){if(!(r===0&&this._animID!==-1)){if(this._animID=requestAnimationFrame(this.play.bind(this)),this._pause)return this;if(this._time.diff=r-this._time.prev,this._time.diff<this._time.min)return this;this._time.prev=r;try{this.playItems(r)}catch(t){throw cancelAnimationFrame(this._animID),this._animID=-1,this._playing=!1,t}return this}}replay(){this._time.end=-1,this.play()}playItems(r){if(this._playing=!0,this._refresh&&this.clear(),this._isReady)for(let t in this.players)this.players[t].animate&&this.players[t].animate(r,this._time.diff,this);this._time.end>=0&&r>this._time.end&&(cancelAnimationFrame(this._animID),this._animID=-1,this._playing=!1)}pause(r=!1){return this._pause=r?!this._pause:!0,this}resume(){return this._pause=!1,this}stop(r=0){return this._time.end=r,this}playOnce(r=0){return this.play(),this.stop(r),this}render(r){return this._renderFunc&&this._renderFunc(r,this),this}set customRendering(r){this._renderFunc=r}get customRendering(){return this._renderFunc}get isPlaying(){return this._playing}get outerBound(){return this.bound.clone()}get innerBound(){return new G(h.make(this.size.length,0),this.size.clone())}get size(){return this.bound.size.clone()}get center(){return this.size.divide(2)}get width(){return this.bound.width}get height(){return this.bound.height}},Y=class extends at{constructor(){super(...arguments);this._pressed=!1;this._dragged=!1;this._hasMouse=!1;this._hasTouch=!1;this._hasKeyboard=!1}get pointer(){let t=this._pointer.clone();return t.id=this._pointer.id,t}bindCanvas(t,e,i={},n){(n||this._canvas).addEventListener(t,e,i)}unbindCanvas(t,e,i={},n){(n||this._canvas).removeEventListener(t,e,i)}bindDoc(t,e,i={}){document&&document.addEventListener(t,e,i)}unbindDoc(t,e,i={}){document&&document.removeEventListener(t,e,i)}bindMouse(t=!0,e){return t?(this._mouseDown=this._mouseDown.bind(this),this._mouseUp=this._mouseUp.bind(this),this._mouseOver=this._mouseOver.bind(this),this._mouseOut=this._mouseOut.bind(this),this._mouseMove=this._mouseMove.bind(this),this._mouseClick=this._mouseClick.bind(this),this._contextMenu=this._contextMenu.bind(this),this.bindCanvas("pointerdown",this._mouseDown,{},e),this.bindCanvas("pointerup",this._mouseUp,{},e),this.bindCanvas("pointerover",this._mouseOver,{},e),this.bindCanvas("pointerout",this._mouseOut,{},e),this.bindCanvas("pointermove",this._mouseMove,{},e),this.bindCanvas("click",this._mouseClick,{},e),this.bindCanvas("contextmenu",this._contextMenu,{},e),this._hasMouse=!0):(this.unbindCanvas("pointerdown",this._mouseDown,{},e),this.unbindCanvas("pointerup",this._mouseUp,{},e),this.unbindCanvas("pointerover",this._mouseOver,{},e),this.unbindCanvas("pointerout",this._mouseOut,{},e),this.unbindCanvas("pointermove",this._mouseMove,{},e),this.unbindCanvas("click",this._mouseClick,{},e),this.unbindCanvas("contextmenu",this._contextMenu,{},e),this._hasMouse=!1),this}bindTouch(t=!0,e=!1,i){return t?(this.bindCanvas("touchstart",this._touchStart.bind(this),{passive:e},i),this.bindCanvas("touchend",this._mouseUp.bind(this),{},i),this.bindCanvas("touchmove",this._touchMove.bind(this),{passive:e},i),this.bindCanvas("touchcancel",this._mouseOut.bind(this),{},i),this._hasTouch=!0):(this.unbindCanvas("touchstart",this._touchStart.bind(this),{passive:e},i),this.unbindCanvas("touchend",this._mouseUp.bind(this),{},i),this.unbindCanvas("touchmove",this._touchMove.bind(this),{passive:e},i),this.unbindCanvas("touchcancel",this._mouseOut.bind(this),{},i),this._hasTouch=!1),this}bindKeyboard(t=!0){return t?(this._keyDownBind=this._keyDown.bind(this),this._keyUpBind=this._keyUp.bind(this),this.bindDoc("keydown",this._keyDownBind,{}),this.bindDoc("keyup",this._keyUpBind,{}),this._hasKeyboard=!0):(this.unbindDoc("keydown",this._keyDownBind,{}),this.unbindDoc("keyup",this._keyUpBind,{}),this._hasKeyboard=!1),this}touchesToPoints(t,e="touches"){if(!t||!t[e])return[];let i=[];for(let n=0;n<t[e].length;n++){let s=t[e].item(n);i.push(new h(s.pageX-this.bound.topLeft.x,s.pageY-this.bound.topLeft.y))}return i}_mouseAction(t,e){if(!this.isPlaying)return;let i=0,n=0;if(e instanceof MouseEvent){for(let s in this.players)if(this.players.hasOwnProperty(s)){let o=this.players[s];i=e.pageX-this.outerBound.x,n=e.pageY-this.outerBound.y,o.action&&o.action(t,i,n,e)}}else for(let s in this.players)if(this.players.hasOwnProperty(s)){let o=this.players[s],a=e.changedTouches&&e.changedTouches.length>0,u=e.changedTouches.item(0);i=a?u.pageX-this.outerBound.x:0,n=a?u.pageY-this.outerBound.y:0,o.action&&o.action(t,i,n,e)}t&&(this._pointer.to(i,n),this._pointer.id=t)}_mouseDown(t){return this._mouseAction(v.down,t),this._mouseAction(v.pointerdown,t),this._pressed=!0,t.target instanceof Element&&t.target.setPointerCapture(t.pointerId),!1}_mouseUp(t){return this._mouseAction(v.pointerup,t),this._dragged?this._mouseAction(v.drop,t):this._mouseAction(v.up,t),this._pressed=!1,this._dragged=!1,t.target instanceof Element&&t.target.releasePointerCapture(t.pointerId),!1}_mouseMove(t){return this._pressed?(this._dragged=!0,this._mouseAction(v.drag,t)):this._mouseAction(v.move,t),!1}_mouseOver(t){return this._mouseAction(v.over,t),!1}_mouseOut(t){return this._mouseAction(v.out,t),this._dragged&&this._mouseAction(v.drop,t),this._dragged=!1,!1}_mouseClick(t){return this._mouseAction(v.click,t),this._pressed=!1,this._dragged=!1,!1}_contextMenu(t){return this._mouseAction(v.contextmenu,t),!1}_touchMove(t){return this._mouseAction(v.move,t),this._pressed&&(this._dragged=!0,this._mouseAction(v.drag,t)),t.preventDefault(),!1}_touchStart(t){return this._mouseAction(v.down,t),this._pressed=!0,!1;return t.preventDefault(),!1}_keyDown(t){return this._keyboardAction(v.keydown,t),!1}_keyUp(t){return this._keyboardAction(v.keyup,t),!1}_keyboardAction(t,e){if(this.isPlaying){for(let i in this.players)if(this.players.hasOwnProperty(i)){let n=this.players[i];n.action&&n.action(t,e.shiftKey?1:0,e.altKey?1:0,e)}}}};var It={};T(It,{Font:()=>O,Form:()=>lt,VisualForm:()=>H});var lt=class{constructor(){this._ready=!1}get ready(){return this._ready}},H=class extends lt{constructor(){super(...arguments);this._filled=!0;this._stroked=!0;this._font=new O(14,"sans-serif")}get filled(){return this._filled}set filled(t){this._filled=t}get stroked(){return this._stroked}set stroked(t){this._stroked=t}get currentFont(){return this._font}_multiple(t,e,...i){if(!t)return this;for(let n=0,s=t.length;n<s;n++)this[e](t[n],...i);return this}alpha(t){return this}fill(t){return this}fillOnly(t){return this.stroke(!1),this.fill(t)}stroke(t,e,i,n){return this}strokeOnly(t,e,i,n){return this.fill(!1),this.stroke(t,e,i,n)}points(t,e,i){if(t){for(let n=0,s=t.length;n<s;n++)this.point(t[n],e,i);return this}}circles(t){return this._multiple(t,"circle")}squares(t){return this._multiple(t,"square")}lines(t){return this._multiple(t,"line")}polygons(t){return this._multiple(t,"polygon")}rects(t){return this._multiple(t,"rect")}},O=class{constructor(r=12,t="sans-serif",e="",i="",n=1.5){this.size=r,this.face=t,this.style=i,this.weight=e,this.lineHeight=n}get value(){return`${this.style} ${this.weight} ${this.size}px/${this.lineHeight} ${this.face}`}toString(){return this.value}};var Ct={};T(Ct,{Typography:()=>Z});var Z=class{static textWidthEstimator(r,t=["M","n","."],e=[.06,.8,.14]){let i=t.map(r),n=new h(e).dot(i);return s=>s.length*n}static truncate(r,t,e,i=""){let n=Math.floor(t.length*Math.min(1,e/r(t)));return n<t.length?(n=Math.max(0,n-i.length),[t.substr(0,n)+i,n]):[t,t.length]}static fontSizeToBox(r,t=1,e=!0){let i=G.fromGroup(r),n=e?i.height:i.width,s=t*n;return function(o){let a=G.fromGroup(o),u=(e?a.height:a.width)/n;return s*u}}static fontSizeToThreshold(r,t=0){return function(e,i){let n=e*i/r;return t<0?Math.min(n,e):t>0?Math.max(n,e):n}}};var Mt={};T(Mt,{Img:()=>J});var J=class l{constructor(r=!1,t,e){this._scale=1;this._loaded=!1;this._editable=r,this._space=t,this._scale=this._space?this._space.pixelScale:1,this._img=new Image,e&&(this._img.crossOrigin="Anonymous")}static load(r,t=!1,e,i){let n=new l(t,e);return n.load(r).then(s=>{i&&i(s)}),n}static loadAsync(r,t=!1,e){return et(this,null,function*(){return yield new l(t,e).load(r)})}static loadPattern(r,t,e="repeat",i=!1){return et(this,null,function*(){return(yield l.loadAsync(r,i,t)).pattern(e)})}static blank(r,t,e){let i=new l(!0,t),n=e||(t?t.pixelScale:1);return i.initCanvas(r[0],r[1],n),i}load(r){return new Promise((t,e)=>{this._editable&&!document&&e("Cannot create html canvas element. document not found."),this._img.src=r,this._img.onload=()=>{this._editable&&(this._cv||(this._cv=document.createElement("canvas")),this._drawToScale(this._scale,this._img),this._data=this._ctx.getImageData(0,0,this._cv.width,this._cv.height)),this._loaded=!0,t(this)},this._img.onerror=i=>{e(i)}})}_drawToScale(r,t){let e=t.width,i=t.height;this.initCanvas(e,i,r),t&&this._ctx.drawImage(t,0,0,e,i,0,0,this._cv.width,this._cv.height)}initCanvas(r,t,e=1){if(!this._editable){console.error("Cannot initiate canvas because this Img is not set to be editable");return}this._cv||(this._cv=document.createElement("canvas"));let i=typeof e=="number"?[e,e]:e;this._cv.width=r*i[0],this._cv.height=t*i[1],this._ctx=this._cv.getContext("2d"),this._loaded=!0}bitmap(r){let t=r?r[0]:this._cv.width,e=r?r[1]:this._cv.height;return createImageBitmap(this._cv,0,0,t,e)}pattern(r="repeat",t=!1){if(!this._space)throw"Cannot find CanvasSpace ctx to create image pattern";return this._space.ctx.createPattern(t?this._cv:this._img,r)}sync(){this._scale!==1?this.bitmap().then(r=>{this._drawToScale(1/this._scale,r),this.load(this.toBase64())}):this._img.src=this.toBase64()}pixel(r,t=!0){let e=typeof t=="number"?t:t?this._scale:1;return l.getPixel(this._data,[r[0]*e,r[1]*e])}static getPixel(r,t){let e=new h(0,0,0,0);if(t[0]>=r.width||t[1]>=r.height)return e;let i=Math.floor(t[1])*(r.width*4)+Math.floor(t[0])*4,n=r.data;return i>=n.length-4?e:new h(n[i],n[i+1],n[i+2],n[i+3])}resize(r,t=!1){let e=t?r:[r[0]/this._img.naturalWidth,r[1]/this._img.naturalHeight];return this._drawToScale(e,this._img),this._data=this._ctx.getImageData(0,0,this._cv.width,this._cv.height),this}crop(r){let t=r.topLeft.scale(this._scale),e=r.size.scale(this._scale);return this._ctx.getImageData(t.x,t.y,e.x,e.y)}filter(r){return this._ctx.filter=r,this._ctx.drawImage(this._cv,0,0),this._ctx.filter="none",this}cleanup(){this._cv&&this._cv.remove(),this._img&&this._img.remove(),this._data=null}static fromBlob(r,t=!1,e){let i=URL.createObjectURL(r);return new l(t,e).load(i)}static imageDataToBlob(r){return new Promise(function(t,e){document||e("Cannot create html canvas element. document not found.");let i=document.createElement("canvas");i.width=r.width,i.height=r.height,i.getContext("2d").putImageData(r,0,0),i.toBlob(n=>{t(n),i.remove()})})}toBase64(){return this._cv.toDataURL()}toBlob(){return new Promise(r=>{this._cv.toBlob(t=>r(t))})}getForm(){return this._editable||console.error("Cannot get a CanvasForm because this Img is not editable"),this._ctx?new Q(this._ctx):void 0}get current(){return this._editable?this._cv:this._img}get image(){return this._img}get canvas(){return this._cv}get data(){return this._data}get ctx(){return this._ctx}get loaded(){return this._loaded}get pixelScale(){return this._scale}get imageSize(){return!this._img.width||!this._img.height?this.canvasSize.$divide(this._scale):new h(this._img.width,this._img.height)}get canvasSize(){return new h(this._cv.width,this._cv.height)}get scaledMatrix(){let r=1/this._scale;return new C().scale2D([r,r])}};var tt=class extends Y{constructor(t,e){super();this._pixelScale=1;this._bgcolor="#e1e9f0";this._offscreen=!1;this._autoResize=!0;this._initialResize=!1;let i=null,n=!1;if(this.id=m.uniqueId(),t instanceof Element)i=t,this.id=i.id||this.id;else{let s=t;s=t[0]==="#"||t[0]==="."?t:"#"+t,i=document.querySelector(s),this.id=s.substr(1)}if(i?i.nodeName.toLowerCase()!="canvas"?(this._container=i,this._canvas=this._createElement("canvas",this.id+"_canvas"),this._initialResize=!0):(this._canvas=i,this._container=i.parentElement,this._autoResize=!1,n=!0):(this._container=this._createElement("div",this.id+"_container"),this._canvas=this._createElement("canvas",this.id),document.body.appendChild(this._container)),this._ctx=this._canvas.getContext("2d"),n)setTimeout(this._ready.bind(this,e),100);else{let s=new MutationObserver(o=>{o.forEach(a=>{if(a.type==="childList"&&a.addedNodes.length){for(let u of a.addedNodes)if(u===this._canvas){this._ready(e),s.disconnect();return}}})});s.observe(this._container,{childList:!0}),this._container.appendChild(this._canvas)}}_createElement(t="div",e){let i=document.createElement(t);return i.setAttribute("id",e),i}_ready(t){if(!this._container)throw new Error(`Cannot initiate #${this.id} element`);this._isReady=!0,this._resizeHandler(null),this.clear(this._bgcolor),this._canvas.dispatchEvent(new Event("ready"));for(let e in this.players)this.players.hasOwnProperty(e)&&this.players[e].start&&this.players[e].start(this.bound.clone(),this);this._pointer=this.center,this._initialResize=!1,t&&t(this.bound,this._canvas)}setup(t){if(this._bgcolor=t.bgcolor?t.bgcolor:"transparent",this.autoResize=t.resize!=null?t.resize:!1,t.retina!==!1){let e=window&&window.devicePixelRatio||1,i=this._ctx.webkitBackingStorePixelRatio||this._ctx.mozBackingStorePixelRatio||this._ctx.msBackingStorePixelRatio||this._ctx.oBackingStorePixelRatio||this._ctx.backingStorePixelRatio||1;this._pixelScale=Math.max(1,e/i)}return t.offscreen?(this._offscreen=!0,this._offCanvas=this._createElement("canvas",this.id+"_offscreen"),this._offCtx=this._offCanvas.getContext("2d")):this._offscreen=!1,t.pixelDensity&&(this._pixelScale=t.pixelDensity),this}set autoResize(t){this._autoResize=t,t?(this._resizeObserver=new ResizeObserver(e=>{this._resizeHandler(null)}),this._resizeObserver.observe(this._container)):this._resizeObserver&&this._resizeObserver.disconnect()}get autoResize(){return this._autoResize}resize(t,e){this.bound=t,this._canvas.width=Math.ceil(this.bound.size.x)*this._pixelScale,this._canvas.height=Math.ceil(this.bound.size.y)*this._pixelScale,this._canvas.style.width=Math.ceil(this.bound.size.x)+"px",this._canvas.style.height=Math.ceil(this.bound.size.y)+"px",this._offscreen&&(this._offCanvas.width=Math.ceil(this.bound.size.x)*this._pixelScale,this._offCanvas.height=Math.ceil(this.bound.size.y)*this._pixelScale),this._pixelScale!=1&&(this._ctx.scale(this._pixelScale,this._pixelScale),this._offscreen&&this._offCtx.scale(this._pixelScale,this._pixelScale));for(let i in this.players)if(this.players.hasOwnProperty(i)){let n=this.players[i];n.resize&&n.resize(this.bound,e)}return this.render(this._ctx),e&&!this.isPlaying&&this.playOnce(0),this}_resizeHandler(t){let e=this._autoResize||this._initialResize?this._container.getBoundingClientRect():this._canvas.getBoundingClientRect();if(e){let i=G.fromBoundingRect(e);i.center=i.center.add((window==null?void 0:window.scrollX)||0,(window==null?void 0:window.scrollY)||0),this.resize(i,t)}}set background(t){this._bgcolor=t}get background(){return this._bgcolor}get pixelScale(){return this._pixelScale}get hasOffscreen(){return this._offscreen}get offscreenCtx(){return this._offCtx}get offscreenCanvas(){return this._offCanvas}getForm(){return new Q(this)}get element(){return this._canvas}get parent(){return this._container}get ready(){return this._isReady}get ctx(){return this._ctx}clear(t){t&&(this._bgcolor=t);let e=this._ctx.fillStyle,i=Math.ceil(this.pixelScale);return!this._bgcolor||this._bgcolor==="transparent"?this._ctx.clearRect(-i,-i,this._canvas.width+i,this._canvas.height+i):((this._bgcolor.indexOf("rgba")===0||this._bgcolor.length===9&&this._bgcolor.indexOf("#")===0)&&this._ctx.clearRect(-i,-i,this._canvas.width+i,this._canvas.height+i),this._ctx.fillStyle=this._bgcolor,this._ctx.fillRect(-i,-i,this._canvas.width+i,this._canvas.height+i)),this._ctx.fillStyle=e,this}clearOffscreen(t){if(this._offscreen){let e=Math.ceil(this.pixelScale);t?(this._offCtx.fillStyle=t,this._offCtx.fillRect(-e,-e,this._canvas.width+e,this._canvas.height+e)):this._offCtx.clearRect(-e,-e,this._offCanvas.width+e,this._offCanvas.height+e)}return this}playItems(t){this._isReady&&(this._ctx.save(),this._offscreen&&this._offCtx.save(),super.playItems(t),this._ctx.restore(),this._offscreen&&this._offCtx.restore(),this.render(this._ctx))}dispose(){return this._resizeObserver.disconnect(),this.stop(),this.removeAll(),this}recorder(t,e="webm",i=15e6){let n=this._canvas.captureStream(),s=new MediaRecorder(n,{mimeType:`video/${e}`,bitsPerSecond:i});return s.ondataavailable=function(o){let a=URL.createObjectURL(new Blob([o.data],{type:`video/${e}`}));if(typeof t=="function")t(a);else if(t){let u=document.createElement("a");u.href=a,u.download=`canvas_video.${e}`,u.click(),u.remove()}},s}},Q=class l extends H{constructor(t){super();this._style={fillStyle:"#f03",strokeStyle:"#fff",lineWidth:1,lineJoin:"bevel",lineCap:"butt",globalAlpha:1};if(!t)return this;let e=i=>{this._ctx=i,this._ctx.fillStyle=this._style.fillStyle,this._ctx.strokeStyle=this._style.strokeStyle,this._ctx.lineJoin="bevel",this._ctx.font=this._font.value,this._ready=!0};t instanceof tt?(this._space=t,this._space.ready&&this._space.ctx?e(this._space.ctx):this._space.add({start:()=>{e(this._space.ctx)}})):e(t)}get space(){return this._space}get ctx(){return this._ctx}useOffscreen(t=!0,e=!1){return e&&this._space.clearOffscreen(typeof e=="string"?e:null),this._ctx=this._space.hasOffscreen&&t?this._space.offscreenCtx:this._space.ctx,this}renderOffscreen(t=[0,0]){this._space.hasOffscreen&&this._space.ctx.drawImage(this._space.offscreenCanvas,t[0],t[1],this._space.width,this._space.height)}alpha(t){return this._ctx.globalAlpha=t,this._style.globalAlpha=t,this}fill(t){return typeof t=="boolean"?this.filled=t:(this.filled=!0,this._style.fillStyle=t,this._ctx.fillStyle=t),this}fillOnly(t){return this.stroke(!1),this.fill(t)}stroke(t,e,i,n){return typeof t=="boolean"?this.stroked=t:(this.stroked=!0,this._style.strokeStyle=t,this._ctx.strokeStyle=t,e&&(this._ctx.lineWidth=e,this._style.lineWidth=e),i&&(this._ctx.lineJoin=i,this._style.lineJoin=i),n&&(this._ctx.lineCap=n,this._style.lineCap=n)),this}strokeOnly(t,e,i,n){return this.fill(!1),this.stroke(t,e,i,n)}applyFillStroke(t=!0,e=!0,i=1){return t&&(typeof t=="string"&&this.fill(t),this._ctx.fill()),e&&(typeof e=="string"&&this.stroke(e,i),this._ctx.stroke()),this}gradient(t){let e=[];t.length<2&&t.push([.99,"#000"],[1,"#000"]);for(let i=0,n=t.length;i<n;i++){let s=typeof t[i]=="string"?i*(1/(t.length-1)):t[i][0],o=typeof t[i]=="string"?t[i]:t[i][1];e.push([s,o])}return(i,n)=>{let s=n?this._ctx.createRadialGradient(i[0][0],i[0][1],Math.abs(i[1][0]),n[0][0],n[0][1],Math.abs(n[1][0])):this._ctx.createLinearGradient(i[0][0],i[0][1],i[1][0],i[1][1]);for(let o=0,a=e.length;o<a;o++)s.addColorStop(e[o][0],e[o][1]);return s}}composite(t="source-over"){return this._ctx.globalCompositeOperation=t,this}clip(){return this._ctx.clip(),this}dash(t=!0,e=0){return t?(t===!0&&(t=[5,5]),this._ctx.setLineDash([t[0],t[1]]),this._ctx.lineDashOffset=e):(this._ctx.setLineDash([]),this._ctx.lineDashOffset=0),this}font(t,e,i,n,s){return typeof t=="number"?(this._font.size=t,s&&(this._font.face=s),e&&(this._font.weight=e),i&&(this._font.style=i),n&&(this._font.lineHeight=n)):this._font=t,this._ctx.font=this._font.value,this._estimateTextWidth&&this.fontWidthEstimate(!0),this}fontWidthEstimate(t=!0){return this._estimateTextWidth=t?Z.textWidthEstimator(e=>this._ctx.measureText(e).width):void 0,this}getTextWidth(t){return this._estimateTextWidth?this._estimateTextWidth(t):this._ctx.measureText(t+" .").width}_textTruncate(t,e,i=""){return Z.truncate(this.getTextWidth.bind(this),t,e,i)}_textAlign(t,e,i,n){let s=m.iterToArray(t);if(!m.arrayCheck(s))return;n||(n=M.center(s));let o=s[0][0];this._ctx.textAlign=="end"||this._ctx.textAlign=="right"?o=s[1][0]:(this._ctx.textAlign=="center"||this._ctx.textAlign=="middle")&&(o=n[0]);let a=n[1];return e=="top"||e=="start"?a=s[0][1]:(e=="end"||e=="bottom")&&(a=s[1][1]),i?new h(o+i[0],a+i[1]):new h(o,a)}reset(){for(let t in this._style)this._style.hasOwnProperty(t)&&(this._ctx[t]=this._style[t]);return this._font=new O,this._ctx.font=this._font.value,this}_paint(){this._filled&&this._ctx.fill(),this._stroked&&this._ctx.stroke()}static point(t,e,i=5,n="square"){if(e){if(!l[n])throw new Error(`${n} is not a static function of CanvasForm`);l[n](t,e,i)}}point(t,e=5,i="square"){return l.point(this._ctx,t,e,i),this._paint(),this}static circle(t,e,i=10){e&&(t.beginPath(),t.arc(e[0],e[1],i,0,w.two_pi,!1),t.closePath())}circle(t){let e=m.iterToArray(t);return l.circle(this._ctx,e[0],e[1][0]),this._paint(),this}static ellipse(t,e,i,n=0,s=0,o=w.two_pi,a=!1){!e||!i||(t.beginPath(),t.ellipse(e[0],e[1],i[0],i[1],n,s,o,a))}ellipse(t,e,i=0,n=0,s=w.two_pi,o=!1){return l.ellipse(this._ctx,t,e,i,n,s,o),this._paint(),this}static arc(t,e,i,n,s,o){e&&(t.beginPath(),t.arc(e[0],e[1],i,n,s,o))}arc(t,e,i,n,s){return l.arc(this._ctx,t,e,i,n,s),this._paint(),this}static square(t,e,i){if(!e)return;let n=e[0]-i,s=e[1]-i,o=e[0]+i,a=e[1]+i;t.beginPath(),t.moveTo(n,s),t.lineTo(n,a),t.lineTo(o,a),t.lineTo(o,s),t.closePath()}square(t,e){return l.square(this._ctx,t,e),this._paint(),this}static line(t,e){if(!m.arrayCheck(e))return;let i=0;t.beginPath();for(let n of e)n&&(i++>0?t.lineTo(n[0],n[1]):t.moveTo(n[0],n[1]))}line(t){return l.line(this._ctx,t),this._paint(),this}static polygon(t,e){m.arrayCheck(e)&&(l.line(t,e),t.closePath())}polygon(t){return l.polygon(this._ctx,t),this._paint(),this}static rect(t,e){let i=m.iterToArray(e);m.arrayCheck(i)&&(t.beginPath(),t.moveTo(i[0][0],i[0][1]),t.lineTo(i[0][0],i[1][1]),t.lineTo(i[1][0],i[1][1]),t.lineTo(i[1][0],i[0][1]),t.closePath())}rect(t){return l.rect(this._ctx,t),this._paint(),this}static image(t,e,i,n){let s=m.iterToArray(e),o;if(typeof s[0]=="number")o=s;else if(n){let a=m.iterToArray(n);o=[a[0][0],a[0][1],a[1][0]-a[0][0],a[1][1]-a[0][1],s[0][0],s[0][1],s[1][0]-s[0][0],s[1][1]-s[0][1]]}else o=[s[0][0],s[0][1],s[1][0]-s[0][0],s[1][1]-s[0][1]];i instanceof J?i.loaded&&t.drawImage(i.image,...o):t.drawImage(i,...o)}image(t,e,i){return e instanceof J?e.loaded&&l.image(this._ctx,t,e.image,i):l.image(this._ctx,t,e,i),this}static imageData(t,e,i){let n=m.iterToArray(e);typeof n[0]=="number"?t.putImageData(i,n[0],n[1]):t.putImageData(i,n[0][0],n[0][1],n[0][0],n[0][1],n[1][0],n[1][1])}imageData(t,e){return l.imageData(this._ctx,t,e),this}static text(t,e,i,n){e&&t.fillText(i,e[0],e[1],n)}text(t,e,i){return l.text(this._ctx,t,e,i),this}textBox(t,e,i="middle",n="",s=!0){s&&(this._ctx.textBaseline=i);let o=M.size(t),a=this._textTruncate(e,o[0],n);return this.text(this._textAlign(t,i),a[0]),this}paragraphBox(t,e,i=1.2,n="top",s=!0){let o=m.iterToArray(t),a=M.size(o);this._ctx.textBaseline="top";let u=this._font.size*i,c=(_,D=[],A=0)=>{if(!_||s&&A*u>a[1]-u*2)return D;if(A>1e4)throw new Error("max recursion reached (10000)");let U=this._textTruncate(_,a[0],""),bt=U[0].indexOf(`
6
+ `);if(bt>=0)return D.push(U[0].substr(0,bt)),c(_.substr(bt+1),D,A+1);let nt=U[0].lastIndexOf(" ")+1;(nt<=0||U[1]===_.length)&&(nt=void 0);let Nt=U[0].substr(0,nt);return D.push(Nt),U[1]<=0||U[1]===_.length?D:c(_.substr(nt||U[1]),D,A+1)},f=c(e),p=f.length*u,b=o;if(n=="middle"||n=="center"){let _=(a[1]-p)/2;s&&(_=Math.max(0,_)),b=new d(o[0].$add(0,_),o[1].$subtract(0,_))}else n=="bottom"?b=new d(o[0].$add(0,a[1]-p),o[1]):b=new d(o[0],o[0].$add(a[0],p));let P=M.center(b);for(let _=0,D=f.length;_<D;_++)this.text(this._textAlign(b,"top",[0,_*u],P),f[_]);return this}alignText(t="left",e="alphabetic"){return e=="center"&&(e="middle"),e=="baseline"&&(e="alphabetic"),this._ctx.textAlign=t,this._ctx.textBaseline=e,this}log(t){let e=this._ctx.measureText(t).width+20;return this.stroke(!1).fill("rgba(0,0,0,.4)").rect([[0,0],[e,20]]),this.fill("#fff").text([10,14],t),this}};var $t={};T($t,{Create:()=>At,Delaunay:()=>mt,Noise:()=>ct});var At=class{static distributeRandom(r,t,e=2){let i=new d;for(let n=0;n<t;n++){let s=[r.x+L.random()*r.width];e>1&&s.push(r.y+L.random()*r.height),e>2&&s.push(r.z+L.random()*r.depth),i.push(new h(s))}return i}static distributeLinear(r,t){let e=m.iterToArray(r),i=E.subpoints(e,t-2);return i.unshift(e[0]),i.push(e[e.length-1]),i}static gridPts(r,t,e,i=[.5,.5]){if(t===0||e===0)throw new Error("grid columns and rows cannot be 0");let n=r.size.$subtract(1).$divide(t,e),s=n.$multiply(i),o=new d;for(let a=0;a<e;a++)for(let u=0;u<t;u++)o.push(r.topLeft.$add(n.$multiply(u,a)).add(s));return o}static gridCells(r,t,e){if(t===0||e===0)throw new Error("grid columns and rows cannot be 0");let i=r.size.$subtract(1).divide(t,e),n=[];for(let s=0;s<e;s++)for(let o=0;o<t;o++)n.push(new d(r.topLeft.$add(i.$multiply(o,s)),r.topLeft.$add(i.$multiply(o,s).add(i))));return n}static radialPts(r,t,e,i=-w.half_pi){let n=new d,s=w.two_pi/e;for(let o=0;o<e;o++)n.push(new h(r).toAngle(s*o+i,t,!0));return n}static noisePts(r,t=.01,e=.01,i=0,n=0){let s=L.random(),o=new d,a=0;for(let u of r){let c=new ct(u),f=i&&i>0?Math.floor(a/i):a,p=n&&n>0?a%n:a;c.initNoise(t*p,e*f),c.seed(s),o.push(c),a++}return o}static delaunay(r){return mt.from(r)}},ut=[[1,1,0],[-1,1,0],[1,-1,0],[-1,-1,0],[1,0,1],[-1,0,1],[1,0,-1],[-1,0,-1],[0,1,1],[0,-1,1],[0,1,-1],[0,-1,-1]],ht=[151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,88,237,149,56,87,174,20,125,136,171,168,68,175,74,165,71,134,139,48,27,166,77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,102,143,54,65,25,63,161,1,216,80,73,209,76,132,187,208,89,18,169,200,196,135,130,116,188,159,86,164,100,109,198,173,186,3,64,52,217,226,250,124,123,5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,223,183,170,213,119,248,152,2,44,154,163,70,221,153,101,155,167,43,172,9,129,22,39,253,9,98,108,110,79,113,224,232,178,185,112,104,218,246,97,228,251,34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,249,14,239,107,49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4,150,254,138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180],ct=class extends h{constructor(...t){super(...t);this.perm=[];this._n=new h(.01,.01);this.perm=ht.concat(ht)}initNoise(...t){return this._n=new h(...t),this}step(t=0,e=0){return this._n.add(t,e),this}seed(t){t>0&&t<1&&(t*=65536),t=Math.floor(t),t<256&&(t|=t<<8);for(let e=0;e<255;e++){let i=e&1?ht[e]^t&255:ht[e]^t>>8&255;this.perm[e]=this.perm[e+256]=i}return this}noise2D(){let t=Math.max(0,Math.floor(this._n[0]))%255,e=Math.max(0,Math.floor(this._n[1]))%255,i=this._n[0]%255-t,n=this._n[1]%255-e,s=k.dot(ut[(t+this.perm[e])%12],[i,n,0]),o=k.dot(ut[(t+this.perm[e+1])%12],[i,n-1,0]),a=k.dot(ut[(t+1+this.perm[e])%12],[i-1,n,0]),u=k.dot(ut[(t+1+this.perm[e+1])%12],[i-1,n-1,0]),c=p=>p*p*p*(p*(p*6-15)+10),f=c(i);return L.lerp(L.lerp(s,a,f),L.lerp(o,u,f),c(n))}},mt=class l extends d{constructor(){super(...arguments);this._mesh=[]}delaunay(t=!0){if(this.length<3)return[];this._mesh=[];let e=this.length,i=[];for(let c=0;c<e;c++)i[c]=c;i.sort((c,f)=>this[f][0]-this[c][0]);let n=this.slice(),s=this._superTriangle();n=n.concat(s);let o=[this._circum(e,e+1,e+2,s)],a=[],u=[];for(let c=0,f=i.length;c<f;c++){let p=i[c],b=[],P=o.length;for(this._mesh[p]||(this._mesh[p]={});P--;){let _=o[P],D=_.circle[1][0],A=n[p].$subtract(_.circle[0]);if(A[0]>0&&A[0]*A[0]>D*D){a.push(_),u.push(_.triangle),o.splice(P,1);continue}A[0]*A[0]+A[1]*A[1]-D*D>w.epsilon||(b.push(_.i,_.j,_.j,_.k,_.k,_.i),o.splice(P,1))}for(l._dedupe(b),P=b.length;P>1;)o.push(this._circum(b[--P],b[--P],p,!1,n))}for(let c=0,f=o.length;c<f;c++){let p=o[c];p.i<e&&p.j<e&&p.k<e&&(a.push(p),u.push(p.triangle),this._cache(p))}return t?u:a}voronoi(){let t=[],e=this._mesh;for(let i=0,n=e.length;i<n;i++)t.push(this.neighborPts(i,!0));return t}mesh(){return this._mesh}neighborPts(t,e=!1){let i=new d,n=this._mesh;for(let s in n[t])n[t].hasOwnProperty(s)&&i.push(n[t][s].circle[0]);return e?y.sortEdges(i):i}neighbors(t){let e=[],i=this._mesh;for(let n in i[t])i[t].hasOwnProperty(n)&&e.push(i[t][n]);return e}_cache(t){this._mesh[t.i][`${Math.min(t.j,t.k)}-${Math.max(t.j,t.k)}`]=t,this._mesh[t.j][`${Math.min(t.i,t.k)}-${Math.max(t.i,t.k)}`]=t,this._mesh[t.k][`${Math.min(t.i,t.j)}-${Math.max(t.i,t.j)}`]=t}_superTriangle(){let t=this[0],e=this[0];for(let o=1,a=this.length;o<a;o++)t=t.$min(this[o]),e=e.$max(this[o]);let i=e.$subtract(t),n=t.$add(e).divide(2),s=Math.max(i[0],i[1]);return new d(n.$subtract(20*s,s),n.$add(0,20*s),n.$add(20*s,-s))}_triangle(t,e,i,n=this){return new d(n[t],n[e],n[i])}_circum(t,e,i,n,s=this){let o=n||this._triangle(t,e,i,s);return{i:t,j:e,k:i,triangle:o,circle:j.circumcircle(o)}}static _dedupe(t){let e=t.length;for(;e>1;){let i=t[--e],n=t[--e],s=e;for(;s>1;){let o=t[--s],a=t[--s];if(n==a&&i==o||n==o&&i==a){t.splice(e,2),t.splice(s,2);break}}}return t}};var Gt={};T(Gt,{Color:()=>Tt});var g=class g extends h{constructor(...t){super(...t);this._mode="rgb";this._isNorm=!1}static from(...t){let e=[1,1,1,1],i=m.getArgs(t);for(let n=0,s=e.length;n<s;n++)n<i.length&&(e[n]=i[n]);return new g(e)}static fromHex(t){if(t[0]=="#"&&(t=t.substr(1)),t.length<=3){let n=s=>t[s]||"F";t=`${n(0)}${n(0)}${n(1)}${n(1)}${n(2)}${n(2)}`}let e=1;t.length===8&&(e=t.substr(6)&&255/255,t=t.substring(0,6));let i=parseInt(t,16);return new g(i>>16,i>>8&255,i&255,e)}static rgb(...t){return g.from(...t).toMode("rgb")}static hsl(...t){return g.from(...t).toMode("hsl")}static hsb(...t){return g.from(...t).toMode("hsb")}static lab(...t){return g.from(...t).toMode("lab")}static lch(...t){return g.from(...t).toMode("lch")}static luv(...t){return g.from(...t).toMode("luv")}static xyz(...t){return g.from(...t).toMode("xyz")}static maxValues(t){return g.ranges[t].zipSlice(1).$take([0,1,2])}get hex(){return this.toString("hex")}get rgb(){return this.toString("rgb")}get rgba(){return this.toString("rgba")}clone(){let t=new g(this);return t.toMode(this._mode),t}toMode(t,e=!1){if(e){let i=this._mode.toUpperCase()+"to"+t.toUpperCase();if(g[i])this.to(g[i](this,this._isNorm,this._isNorm));else throw new Error("Cannot convert color with "+i)}return this._mode=t,this}get mode(){return this._mode}get r(){return this[0]}set r(t){this[0]=t}get g(){return this[1]}set g(t){this[1]=t}get b(){return this[2]}set b(t){this[2]=t}get h(){return this._mode=="lch"?this[2]:this[0]}set h(t){let e=this._mode=="lch"?2:0;this[e]=t}get s(){return this[1]}set s(t){this[1]=t}get l(){return this._mode=="hsl"?this[2]:this[0]}set l(t){let e=this._mode=="hsl"?2:0;this[e]=t}get a(){return this[1]}set a(t){this[1]=t}get c(){return this[1]}set c(t){this[1]=t}get u(){return this[1]}set u(t){this[1]=t}get v(){return this[2]}set v(t){this[2]=t}set alpha(t){this.length>3&&(this[3]=t)}get alpha(){return this.length>3?this[3]:1}get normalized(){return this._isNorm}set normalized(t){this._isNorm=t}normalize(t=!0){if(this._isNorm==t)return this;let e=g.ranges[this._mode];for(let i=0;i<3;i++)this[i]=t?L.mapToRange(this[i],e[i][0],e[i][1],0,1):L.mapToRange(this[i],0,1,e[i][0],e[i][1]);return this._isNorm=t,this}$normalize(t=!0){return this.clone().normalize(t)}toString(t="mode"){if(t=="hex"){let e=i=>{let n=Math.floor(i).toString(16);return n.length<2?"0"+n:n};return`#${e(this[0])}${e(this[1])}${e(this[2])}`}else return t=="rgba"?`rgba(${Math.floor(this[0])},${Math.floor(this[1])},${Math.floor(this[2])},${this.alpha})`:t=="rgb"?`rgb(${Math.floor(this[0])},${Math.floor(this[1])},${Math.floor(this[2])})`:`${this._mode}(${this[0]},${this[1]},${this[2]},${this.alpha})`}static RGBtoHSL(t,e=!1,i=!1){let[n,s,o]=e?t:t.$normalize(),a=Math.max(n,s,o),u=Math.min(n,s,o),c=(a+u)/2,f=c,p=c;if(a==u)c=0,f=0;else{let b=a-u;f=p>.5?b/(2-a-u):b/(a+u),c=0,a===n?c=(s-o)/b+(s<o?6:0):a===s?c=(o-n)/b+2:a===o&&(c=(n-s)/b+4)}return g.hsl(i?c/60:c*60,f,p,t.alpha)}static HSLtoRGB(t,e=!1,i=!1){let[n,s,o]=t;if(e||(n=n/360),s==0)return g.rgb(o*255,o*255,o*255,t.alpha);let a=o<=.5?o*(1+s):o+s-o*s,u=2*o-a,c=p=>(p=p<0?p+1:p>1?p-1:p,p*6<1?u+(a-u)*p*6:p*2<1?a:p*3<2?u+(a-u)*(2/3-p)*6:u),f=i?1:255;return g.rgb(f*c(n+1/3),f*c(n),f*c(n-1/3),t.alpha)}static RGBtoHSB(t,e=!1,i=!1){let[n,s,o]=e?t:t.$normalize(),a=Math.max(n,s,o),u=Math.min(n,s,o),c=a-u,f=0,p=a===0?0:c/a,b=a;return a!=u&&(a===n?f=(s-o)/c+(s<o?6:0):a===s?f=(o-n)/c+2:a===o&&(f=(n-s)/c+4)),g.hsb(i?f/60:f*60,p,b,t.alpha)}static HSBtoRGB(t,e=!1,i=!1){let[n,s,o]=t;e||(n=n/360);let a=Math.floor(n*6),u=n*6-a,c=o*(1-s),f=o*(1-u*s),p=o*(1-(1-u)*s),P=[[o,p,c],[f,o,c],[c,o,p],[c,f,o],[p,c,o],[o,c,f]][a%6],_=i?1:255;return g.rgb(_*P[0],_*P[1],_*P[2],t.alpha)}static RGBtoLAB(t,e=!1,i=!1){let n=e?t.$normalize(!1):t;return g.XYZtoLAB(g.RGBtoXYZ(n),!1,i)}static LABtoRGB(t,e=!1,i=!1){let n=e?t.$normalize(!1):t;return g.XYZtoRGB(g.LABtoXYZ(n),!1,i)}static RGBtoLCH(t,e=!1,i=!1){let n=e?t.$normalize(!1):t;return g.LABtoLCH(g.RGBtoLAB(n),!1,i)}static LCHtoRGB(t,e=!1,i=!1){let n=e?t.$normalize(!1):t;return g.LABtoRGB(g.LCHtoLAB(n),!1,i)}static RGBtoLUV(t,e=!1,i=!1){let n=e?t.$normalize(!1):t;return g.XYZtoLUV(g.RGBtoXYZ(n),!1,i)}static LUVtoRGB(t,e=!1,i=!1){let n=e?t.$normalize(!1):t;return g.XYZtoRGB(g.LUVtoXYZ(n),!1,i)}static RGBtoXYZ(t,e=!1,i=!1){let n=e?t.clone():t.$normalize();for(let o=0;o<3;o++)n[o]=n[o]>.04045?Math.pow((n[o]+.055)/1.055,2.4):n[o]/12.92,i||(n[o]=n[o]*100);let s=g.xyz(n[0]*.4124564+n[1]*.3575761+n[2]*.1804375,n[0]*.2126729+n[1]*.7151522+n[2]*.072175,n[0]*.0193339+n[1]*.119192+n[2]*.9503041,t.alpha);return i?s.normalize():s}static XYZtoRGB(t,e=!1,i=!1){let[n,s,o]=e?t:t.$normalize(),a=[n*3.2406254773200533+s*-1.5372079722103187+o*-.4986285986982479,n*-.9689307147293197+s*1.8757560608852415+o*.041517523842953964,n*.055710120445510616+s*-.2040210505984867+o*1.0569959422543882];for(let c=0;c<3;c++)a[c]=a[c]>.0031308?1.055*Math.pow(a[c],1/2.4)-.055:12.92*a[c],a[c]=Math.max(0,Math.min(1,a[c])),i||(a[c]=Math.round(a[c]*255));let u=g.rgb(a[0],a[1],a[2],t.alpha);return i?u.normalize():u}static XYZtoLAB(t,e=!1,i=!1){let n=e?t.$normalize(!1):t.clone(),s=.00885645167,o=903.296296296;n.divide(g.D65);let a=f=>f>s?Math.pow(f,1/3):(o*f+16)/116,u=a(n[1]),c=g.lab(116*u-16,500*(a(n[0])-u),200*(u-a(n[2])),t.alpha);return i?c.normalize():c}static LABtoXYZ(t,e=!1,i=!1){let n=e?t.$normalize(!1):t,s=(n[0]+16)/116,o=n[1]/500+s,a=s-n[2]/200,u=.00885645167,c=903.296296296,f=g.D65,p=Math.pow(o,3),b=Math.pow(a,3),P=g.xyz(f[0]*(p>u?p:(116*o-16)/c),f[1]*(n[0]>c*u?Math.pow((n[0]+16)/116,3):n[0]/c),f[2]*(b>u?b:(116*a-16)/c),t.alpha);return i?P.normalize():P}static XYZtoLUV(t,e=!1,i=!1){let[n,s,o]=e?t.$normalize(!1):t,a=4*n/(n+15*s+3*o),u=9*s/(n+15*s+3*o);s=s/100,s=s>.008856?Math.pow(s,1/3):7.787*s+16/116;let c=4*g.D65[0]/(g.D65[0]+15*g.D65[1]+3*g.D65[2]),f=9*g.D65[1]/(g.D65[0]+15*g.D65[1]+3*g.D65[2]),p=116*s-16;return g.luv(p,13*p*(a-c),13*p*(u-f),t.alpha)}static LUVtoXYZ(t,e=!1,i=!1){let[n,s,o]=e?t.$normalize(!1):t,a=(n+16)/116,u=a*a*a;a=u>.008856?u:(a-16/116)/7.787;let c=4*g.D65[0]/(g.D65[0]+15*g.D65[1]+3*g.D65[2]),f=9*g.D65[1]/(g.D65[0]+15*g.D65[1]+3*g.D65[2]);s=s/(13*n)+c,o=o/(13*n)+f,a=a*100;let p=-1*(9*a*s)/((s-4)*o-s*o),b=(9*a-15*o*a-o*p)/(3*o);return g.xyz(p,a,b,t.alpha)}static LABtoLCH(t,e=!1,i=!1){let n=e?t.$normalize(!1):t,s=y.toDegree(y.boundRadian(Math.atan2(n[2],n[1])));return g.lch(n[0],Math.sqrt(n[1]*n[1]+n[2]*n[2]),s,t.alpha)}static LCHtoLAB(t,e=!1,i=!1){let n=e?t.$normalize(!1):t,s=y.toRadian(n[2]);return g.lab(n[0],Math.cos(s)*n[1],Math.sin(s)*n[1],t.alpha)}};g.D65=new h(95.047,100,108.883,1),g.ranges={rgb:new d(new h(0,255),new h(0,255),new h(0,255)),hsl:new d(new h(0,360),new h(0,1),new h(0,1)),hsb:new d(new h(0,360),new h(0,1),new h(0,1)),lab:new d(new h(0,100),new h(-128,127),new h(-128,127)),lch:new d(new h(0,100),new h(0,100),new h(0,360)),luv:new d(new h(0,100),new h(-134,220),new h(-140,122)),xyz:new d(new h(0,100),new h(0,100),new h(0,100))};var Tt=g;var Et={};T(Et,{DOMSpace:()=>z,HTMLForm:()=>rt,HTMLSpace:()=>R});var z=class l extends Y{constructor(t,e){super();this.id="domspace";this._autoResize=!0;this._bgcolor="#e1e9f0";this._css={};let i=null,n=!1;this.id="pts",t instanceof Element?(i=t,this.id="pts_existing_space"):(i=document.querySelector(t),n=!0,this.id=t.substr(1)),i?(this._canvas=i,this._container=i.parentElement):(this._container=l.createElement("div","pts_container"),this._canvas=l.createElement("div","pts_element"),this._container.appendChild(this._canvas),document.body.appendChild(this._container),n=!1),setTimeout(this._ready.bind(this,e),50)}static createElement(t="div",e,i){let n=document.createElement(t);return e&&n.setAttribute("id",e),i&&i.appendChild&&i.appendChild(n),n}_ready(t){if(!this._container)throw new Error(`Cannot initiate #${this.id} element`);this._isReady=!0,this._resizeHandler(null),this.clear(this._bgcolor),this._canvas.dispatchEvent(new Event("ready"));for(let e in this.players)this.players.hasOwnProperty(e)&&this.players[e].start&&this.players[e].start(this.bound.clone(),this);this._pointer=this.center,this.refresh(!1),t&&t(this.bound,this._canvas)}setup(t){return t.bgcolor&&(this._bgcolor=t.bgcolor),this.autoResize=t.resize!=null?t.resize:!1,this}getForm(){return null}set autoResize(t){this._autoResize=t,t?window.addEventListener("resize",this._resizeHandler.bind(this)):(delete this._css.width,delete this._css.height,window.removeEventListener("resize",this._resizeHandler.bind(this)))}get autoResize(){return this._autoResize}resize(t,e){this.bound=t,this.styles({width:`${t.width}px`,height:`${t.height}px`},!0);for(let i in this.players)if(this.players.hasOwnProperty(i)){let n=this.players[i];n.resize&&n.resize(this.bound,e)}return this}_resizeHandler(t){let e=G.fromBoundingRect(this._container.getBoundingClientRect());this._autoResize?this.styles({width:"100%",height:"100%"},!0):this.styles({width:`${e.width}px`,height:`${e.height}px`},!0),this.resize(e,t)}get element(){return this._canvas}get parent(){return this._container}get ready(){return this._isReady}clear(t){return t&&(this.background=t),this._canvas.innerHTML="",this}set background(t){this._bgcolor=t,this._container.style.backgroundColor=this._bgcolor}get background(){return this._bgcolor}style(t,e,i=!1){return this._css[t]=e,i&&(this._canvas.style[t]=e),this}styles(t,e=!1){for(let i in t)t.hasOwnProperty(i)&&this.style(i,t[i],e);return this}static setAttr(t,e){for(let i in e)e.hasOwnProperty(i)&&t.setAttribute(i,e[i]);return t}static getInlineStyles(t){let e="";for(let i in t)t.hasOwnProperty(i)&&t[i]&&(e+=`${i}: ${t[i]}; `);return e}dispose(){return window.removeEventListener("resize",this._resizeHandler.bind(this)),this.stop(),this.removeAll(),this}},R=class extends z{getForm(){return new rt(this)}static htmlElement(r,t,e,i=!0){if(!r||!r.appendChild)throw new Error("parent is not a valid DOM element");let n=document.querySelector(`#${e}`);return n||(n=document.createElement(t),n.setAttribute("id",e),i&&n.setAttribute("class",e.substring(0,e.indexOf("-"))),r.appendChild(n)),n}remove(r){return this._container.querySelectorAll("."+rt.scopeID(r)).forEach(e=>{e.parentNode.removeChild(e)}),super.remove(r)}removeAll(){return this._container.innerHTML="",super.removeAll()}},I=class I extends H{constructor(t){super();this._style={filled:!0,stroked:!0,background:"#f03","border-color":"#fff",color:"#000","border-width":"1px","border-radius":"0","border-style":"solid",opacity:1,position:"absolute",top:0,left:0,width:0,height:0};this._ctx={group:null,groupID:"pts",groupCount:0,currentID:"pts0",currentClass:"",style:{}};this._ready=!1;this._space=t,this._space.add({start:()=>{this._ctx.group=this._space.element,this._ctx.groupID="pts_dom_"+I.groupID++,this._ctx.style=Object.assign({},this._style),this._ready=!0}})}get space(){return this._space}styleTo(t,e,i=""){if(this._ctx.style[t]===void 0)throw new Error(`${t} style property doesn't exist`);this._ctx.style[t]=`${e}${i}`}alpha(t){return this.styleTo("opacity",t),this}fill(t){return typeof t=="boolean"?(this.styleTo("filled",t),t||this.styleTo("background","transparent")):(this.styleTo("filled",!0),this.styleTo("background",t)),this}stroke(t,e,i,n){return typeof t=="boolean"?(this.styleTo("stroked",t),t||this.styleTo("border-width",0)):(this.styleTo("stroked",!0),this.styleTo("border-color",t),this.styleTo("border-width",(e||1)+"px")),this}fillText(t){return this.styleTo("color",t),this}cls(t){return typeof t=="boolean"?this._ctx.currentClass="":this._ctx.currentClass=t,this}font(t,e,i,n,s){return typeof t=="number"?(this._font.size=t,s&&(this._font.face=s),e&&(this._font.weight=e),i&&(this._font.style=i),n&&(this._font.lineHeight=n)):this._font=t,this._ctx.style.font=this._font.value,this}reset(){return this._ctx.style=Object.assign({},this._style),this._font=new O(10,"sans-serif"),this._ctx.style.font=this._font.value,this}updateScope(t,e){return this._ctx.group=e,this._ctx.groupID=t,this._ctx.groupCount=0,this.nextID(),this._ctx}scope(t){if(!t||t.animateID==null)throw new Error("item not defined or not yet added to Space");return this.updateScope(I.scopeID(t),this.space.element)}nextID(){return this._ctx.groupCount++,this._ctx.currentID=`${this._ctx.groupID}-${this._ctx.groupCount}`,this._ctx.currentID}static getID(t){return t.currentID||`p-${I.domID++}`}static scopeID(t){return`item-${t.animateID}`}static style(t,e){let i=[];e.filled||i.push("background: none"),e.stroked||i.push("border: none");for(let n in e)if(e.hasOwnProperty(n)&&n!="filled"&&n!="stroked"){let s=e[n];if(s){if(!e.filled&&n.indexOf("background")===0)continue;if(!e.stroked&&n.indexOf("border-width")===0)continue;i.push(`${n}: ${s}`)}}return R.setAttr(t,{style:i.join(";")})}static rectStyle(t,e,i){return t.style.left=e[0]+"px",t.style.top=e[1]+"px",t.style.width=i[0]+"px",t.style.height=i[1]+"px",t}static textStyle(t,e){return t.style.left=e[0]+"px",t.style.top=e[1]+"px",t}static point(t,e,i=5,n="square"){return n==="circle"?I.circle(t,e,i):I.square(t,e,i)}point(t,e=5,i="square"){return this.nextID(),i=="circle"&&this.styleTo("border-radius","100%"),I.point(this._ctx,t,e,i),this}static circle(t,e,i=10){let n=R.htmlElement(t.group,"div",I.getID(t));return R.setAttr(n,{class:`pts-form pts-circle ${t.currentClass}`}),I.rectStyle(t,new h(e).$subtract(i),new h(i*2,i*2)),I.style(n,t.style),n}circle(t){return this.nextID(),this.styleTo("border-radius","100%"),I.circle(this._ctx,t[0],t[1][0]),this}static square(t,e,i){let n=R.htmlElement(t.group,"div",I.getID(t));return R.setAttr(n,{class:`pts-form pts-square ${t.currentClass}`}),I.rectStyle(t,new h(e).$subtract(i),new h(i*2,i*2)),I.style(n,t.style),n}square(t,e){return this.nextID(),I.square(this._ctx,t,e),this}static rect(t,e){let i=m.iterToArray(e);if(!m.arrayCheck(i))return;let n=R.htmlElement(t.group,"div",I.getID(t));return R.setAttr(n,{class:`pts-form pts-rect ${t.currentClass}`}),I.rectStyle(t,i[0],i[1]),I.style(n,t.style),n}rect(t){return this.nextID(),this.styleTo("border-radius","0"),I.rect(this._ctx,t),this}static text(t,e,i){let n=R.htmlElement(t.group,"div",I.getID(t));return R.setAttr(n,{class:`pts-form pts-text ${t.currentClass}`}),n.textContent=i,I.textStyle(t,e),I.style(n,t.style),n}text(t,e){return this.nextID(),I.text(this._ctx,t,e),this}log(t){return this.fill("#000").stroke("#fff",.5).text([10,14],t),this}arc(t,e,i,n,s){return m.warn("arc is not implemented in HTMLForm"),this}line(t){return m.warn("line is not implemented in HTMLForm"),this}polygon(t){return m.warn("polygon is not implemented in HTMLForm"),this}};I.groupID=0,I.domID=0;var rt=I;var St={};T(St,{SVGForm:()=>it,SVGSpace:()=>F});var F=class l extends z{constructor(t,e){super(t,e);this._bgcolor="#999";if(this._canvas.nodeName.toLowerCase()!="svg"){let i=l.svgElement(this._canvas,"svg",`${this.id}_svg`);this._container=this._canvas,this._canvas=i}}getForm(){return new it(this)}get element(){return this._canvas}resize(t,e){return super.resize(t,e),l.setAttr(this.element,{viewBox:`0 0 ${this.bound.width} ${this.bound.height}`,width:`${this.bound.width}`,height:`${this.bound.height}`,xmlns:"http://www.w3.org/2000/svg",version:"1.1"}),this}static svgElement(t,e,i){if(!t||!t.appendChild)throw new Error("parent is not a valid DOM element");let n=document.querySelector(`#${i}`);return n||(n=document.createElementNS("http://www.w3.org/2000/svg",e),n.setAttribute("id",i),t.appendChild(n)),n}remove(t){return this._container.querySelectorAll("."+it.scopeID(t)).forEach(i=>{i.parentNode.removeChild(i)}),super.remove(t)}removeAll(){return this._container.innerHTML="",super.removeAll()}},x=class x extends H{constructor(t){super();this._style={filled:!0,stroked:!0,fill:"#f03",stroke:"#fff","stroke-width":1,"stroke-linejoin":"bevel","stroke-linecap":"sqaure",opacity:1};this._ctx={group:null,groupID:"pts",groupCount:0,currentID:"pts0",currentClass:"",style:{}};this._ready=!1;this._space=t,this._space.add({start:()=>{this._ctx.group=this._space.element,this._ctx.groupID="pts_svg_"+x.groupID++,this._ctx.style=Object.assign({},this._style),this._ready=!0}})}get space(){return this._space}styleTo(t,e){if(this._ctx.style[t]===void 0)throw new Error(`${t} style property doesn't exist`);this._ctx.style[t]=e}alpha(t){return this.styleTo("opacity",t),this}fill(t){return typeof t=="boolean"?this.styleTo("filled",t):(this.styleTo("filled",!0),this.styleTo("fill",t)),this}stroke(t,e,i,n){return typeof t=="boolean"?this.styleTo("stroked",t):(this.styleTo("stroked",!0),this.styleTo("stroke",t),e&&this.styleTo("stroke-width",e),i&&this.styleTo("stroke-linejoin",i),n&&this.styleTo("stroke-linecap",n)),this}cls(t){return typeof t=="boolean"?this._ctx.currentClass="":this._ctx.currentClass=t,this}font(t,e,i,n,s){return typeof t=="number"?(this._font.size=t,s&&(this._font.face=s),e&&(this._font.weight=e),i&&(this._font.style=i),n&&(this._font.lineHeight=n)):this._font=t,this._ctx.style.font=this._font.value,this}reset(){return this._ctx.style=Object.assign({},this._style),this._font=new O(10,"sans-serif"),this._ctx.style.font=this._font.value,this}updateScope(t,e){return this._ctx.group=e,this._ctx.groupID=t,this._ctx.groupCount=0,this.nextID(),this._ctx}scope(t){if(!t||t.animateID==null)throw new Error("item not defined or not yet added to Space");return this.updateScope(x.scopeID(t),this.space.element)}nextID(){return this._ctx.groupCount++,this._ctx.currentID=`${this._ctx.groupID}-${this._ctx.groupCount}`,this._ctx.currentID}static getID(t){return t.currentID||`p-${x.domID++}`}static scopeID(t){return`item-${t.animateID}`}static style(t,e){let i=[];e.filled||i.push("fill: none"),e.stroked||i.push("stroke: none");for(let n in e)if(e.hasOwnProperty(n)&&n!="filled"&&n!="stroked"){let s=e[n];if(s){if(!e.filled&&n.indexOf("fill")===0)continue;if(!e.stroked&&n.indexOf("stroke")===0)continue;i.push(`${n}: ${s}`)}}return z.setAttr(t,{style:i.join(";")})}static point(t,e,i=5,n="square"){return n==="circle"?x.circle(t,e,i):x.square(t,e,i)}point(t,e=5,i="square"){return this.nextID(),x.point(this._ctx,t,e,i),this}static circle(t,e,i=10){let n=F.svgElement(t.group,"circle",x.getID(t));return z.setAttr(n,{cx:e[0],cy:e[1],r:i,class:`pts-svgform pts-circle ${t.currentClass}`}),x.style(n,t.style),n}circle(t){this.nextID();let e=m.iterToArray(t);return x.circle(this._ctx,e[0],e[1][0]),this}static arc(t,e,i,n,s,o){let a=F.svgElement(t.group,"path",x.getID(t)),u=new h(e).toAngle(n,i,!0),c=new h(e).toAngle(s,i,!0),p=y.boundAngle(s)-y.boundAngle(n)>w.pi;o&&(p=!p);let b=o?"0":"1",P=`M ${u[0]} ${u[1]} A ${i} ${i} 0 ${p?"1":"0"} ${b} ${c[0]} ${c[1]}`;return z.setAttr(a,{d:P,class:`pts-svgform pts-arc ${t.currentClass}`}),x.style(a,t.style),a}arc(t,e,i,n,s){return this.nextID(),x.arc(this._ctx,t,e,i,n,s),this}static square(t,e,i){let n=F.svgElement(t.group,"rect",x.getID(t));return z.setAttr(n,{x:e[0]-i,y:e[1]-i,width:i*2,height:i*2,class:`pts-svgform pts-square ${t.currentClass}`}),x.style(n,t.style),n}square(t,e){return this.nextID(),x.square(this._ctx,t,e),this}static line(t,e){let i=x.pointsString(e);if(i.count<2)return;if(i.count>2)return x._poly(t,i.string,!1);let n=F.svgElement(t.group,"line",x.getID(t)),s=m.iterToArray(e);return z.setAttr(n,{x1:s[0][0],y1:s[0][1],x2:s[1][0],y2:s[1][1],class:`pts-svgform pts-line ${t.currentClass}`}),x.style(n,t.style),n}line(t){return this.nextID(),x.line(this._ctx,t),this}static _poly(t,e,i=!0){let n=F.svgElement(t.group,i?"polygon":"polyline",x.getID(t));return z.setAttr(n,{points:e,class:`pts-svgform pts-polygon ${t.currentClass}`}),x.style(n,t.style),n}static pointsString(t){let e="",i=0;for(let n of t)e+=`${n[0]},${n[1]} `,i++;return{string:e,count:i}}static polygon(t,e){let i=x.pointsString(e);return x._poly(t,i.string,!0)}polygon(t){return this.nextID(),x.polygon(this._ctx,t),this}static rect(t,e){if(!m.arrayCheck(e))return;let i=F.svgElement(t.group,"rect",x.getID(t)),n=d.fromArray(e).boundingBox(),s=M.size(n);return z.setAttr(i,{x:n[0][0],y:n[0][1],width:s[0],height:s[1],class:`pts-svgform pts-rect ${t.currentClass}`}),x.style(i,t.style),i}rect(t){return this.nextID(),x.rect(this._ctx,t),this}static text(t,e,i){let n=F.svgElement(t.group,"text",x.getID(t));return z.setAttr(n,{"pointer-events":"none",x:e[0],y:e[1],dx:0,dy:0,class:`pts-svgform pts-text ${t.currentClass}`}),n.textContent=i,x.style(n,t.style),n}text(t,e){return this.nextID(),x.text(this._ctx,t,e),this}log(t){return this.fill("#000").stroke("#fff",.5).text([10,14],t),this}};x.groupID=0,x.domID=0;var it=x;var zt={};T(zt,{Body:()=>ft,Particle:()=>pt,World:()=>dt});var dt=class l{constructor(r,t=1,e=0){this._lastTime=null;this._gravity=new h;this._friction=1;this._damping=.75;this._iterations=1;this._particles=[];this._bodies=[];this._pnames=[];this._bnames=[];return this._bound=G.fromGroup(r),this._friction=t,this._gravity=typeof e=="number"?new h(0,e):new h(e),this}get bound(){return this._bound}set bound(r){this._bound=r}get gravity(){return this._gravity}set gravity(r){this._gravity=r}get friction(){return this._friction}set friction(r){this._friction=r}get damping(){return this._damping}set damping(r){this._damping=r}get iterations(){return this._iterations}set iterations(r){this._iterations=r}get bodyCount(){return this._bodies.length}get particleCount(){return this._particles.length}body(r){return typeof r=="string"&&r.length>0?this._bodies[this._bnames.indexOf(r)]:typeof r=="number"&&r>=0?this._bodies[r]:void 0}particle(r){return typeof r=="string"&&r.length>0?this._particles[this._pnames.indexOf(r)]:typeof r=="number"&&r>=0?this._particles[r]:void 0}bodyIndex(r){return this._bnames.indexOf(r)}particleIndex(r){return this._pnames.indexOf(r)}update(r){let t=r/1e3;this._updateParticles(t),this._updateBodies(t)}drawParticles(r){this._drawParticles=r}drawBodies(r){this._drawBodies=r}add(r,t=""){return r instanceof ft?(this._bodies.push(r),this._bnames.push(t)):(this._particles.push(r),this._pnames.push(t)),this}_index(r,t){let e=0;if(typeof t=="string"){if(e=r(t),e<0)throw new Error(`Cannot find index of ${t}. You can use particleIndex() or bodyIndex() function to check existence by name.`)}else e=t;return e}removeBody(r,t=1){let e=this._index(this.bodyIndex.bind(this),r),i=e<0?[e*-1-1,t]:[e,t];return this._bodies.splice(i[0],i[1]),this._bnames.splice(i[0],i[1]),this}removeParticle(r,t=1){let e=this._index(this.particleIndex.bind(this),r),i=e<0?[e*-1-1,t]:[e,t];return this._particles.splice(i[0],i[1]),this._pnames.splice(i[0],i[1]),this}static edgeConstraint(r,t,e,i=1,n=!1){let s=1/(r.mass||1),o=1/(t.mass||1),a=s+o,u=t.$subtract(r),c=e*e,f=n?e/u.magnitude()-1:c/(u.dot(u)+c)-.5,p=u.$multiply(f*i);return r.subtract(p.$multiply(s/a)),t.add(p.$multiply(o/a)),r}static boundConstraint(r,t,e=.75){let i=y.boundingBox(t),n=r.$min(i[1].subtract(r.radius)).$max(i[0].add(r.radius));if(n[0]===i[0][0]||n[0]===i[1][0]){let s=r.changed.$multiply(e);r.previous=n.$subtract(new h(-s[0],s[1]))}else if(n[1]===i[0][1]||n[1]===i[1][1]){let s=r.changed.$multiply(e);r.previous=n.$subtract(new h(s[0],-s[1]))}r.to(n)}integrate(r,t,e){return r.addForce(this._gravity),r.verlet(t,this._friction,e),r}_updateParticles(r){for(let t=0,e=this._particles.length;t<e;t++){let i=this._particles[t];this.integrate(i,r,this._lastTime),l.boundConstraint(i,this._bound,this._damping);for(let n=t+1;n<e;n++)if(t!==n){let s=this._particles[n];i.collide(s,this._damping)}this._drawParticles&&this._drawParticles(i,t)}this._lastTime=r}_updateBodies(r){for(let t=0,e=this._bodies.length;t<e;t++){let i=this._bodies[t];if(i){for(let n=0,s=i.length;n<s;n++){let o=i[n];l.boundConstraint(o,this._bound,this._damping),this.integrate(o,r,this._lastTime)}for(let n=t+1;n<e;n++)i.processBody(this._bodies[n]);for(let n=0,s=this._particles.length;n<s;n++)i.processParticle(this._particles[n]);for(let n=0;n<this._iterations;n++)i.processEdges();this._drawBodies&&this._drawBodies(i,t)}}}},pt=class extends h{constructor(...t){super(...t);this._mass=1;this._radius=0;this._force=new h;this._prev=new h;this._lock=!1;this._prev=this.clone()}get mass(){return this._mass}set mass(t){this._mass=t}get radius(){return this._radius}set radius(t){this._radius=t}get previous(){return this._prev}set previous(t){this._prev=t}get force(){return this._force}set force(t){this._force=t}get body(){return this._body}set body(t){this._body=t}get lock(){return this._lock}set lock(t){this._lock=t,this._lockPt=new h(this)}get changed(){return this.$subtract(this._prev)}set position(t){this.previous.to(this),this._lock&&(this._lockPt=t),this.to(t)}size(t){return this._mass=t,this._radius=t,this}addForce(...t){return this._force.add(...t),this._force}verlet(t,e,i){if(this._lock)this.to(this._lockPt);else{let n=i||t,s=this._force.multiply(t*(t+n)/2),o=this.changed.multiply(e*t/n).add(s);this._prev=this.clone(),this.add(o),this._force=new h}return this}hit(...t){return this._prev.subtract(new h(...t).$divide(Math.sqrt(this._mass))),this}collide(t,e=1){let i=this,n=i.$subtract(t),s=n.magnitudeSq(),o=i.radius+t.radius;if(s<o*o){let a=i.changed,u=t.changed,c=Math.sqrt(s),f=n.$multiply((c-o)/c/2),p=i.$subtract(f),b=t.$add(f);i.to(p),t.to(b);let P=e*n.dot(a)/s,_=e*n.dot(u)/s,D=i.mass/(i.mass+t.mass),A=t.mass/(i.mass+t.mass);a.add(new h(_*n[0]-P*n[0],_*n[1]-P*n[1]).$multiply(A)),u.add(new h(P*n[0]-_*n[0],P*n[1]-_*n[1]).$multiply(D)),i.previous=i.$subtract(a),t.previous=t.$subtract(u)}}toString(){return`Particle: ${this[0]} ${this[1]} | previous ${this._prev[0]} ${this._prev[1]} | mass ${this._mass}`}},ft=class l extends d{constructor(){super();this._cs=[];this._stiff=1;this._locks={};this._mass=1}static fromGroup(t,e=1,i=!0,n=!0){let s=new l().init(t);return i&&s.linkAll(e),n&&s.autoMass(),s}init(t,e=1){let i=new h;for(let n of t){let s=new pt(n);s.body=this,i.add(n),this.push(s)}return this._stiff=e,this}get mass(){return this._mass}set mass(t){this._mass=t;for(let e=0,i=this.length;e<i;e++)this[e].mass=this._mass}autoMass(){return this.mass=Math.sqrt(S.area(this))/10,this}link(t,e,i){if(t<0||t>=this.length)throw new Error("index1 is not in the Group's indices");if(e<0||e>=this.length)throw new Error("index1 is not in the Group's indices");let n=this[t].$subtract(this[e]).magnitude();return this._cs.push([t,e,n,i||this._stiff]),this}linkAll(t){let e=this.length/2;for(let i=0,n=this.length;i<n;i++){let s=i>=n-1?0:i+1;if(this.link(i,s,t),n>4){let o=Math.floor(e/2)+1,a=i>=n-o?i%n:i+o;this.link(i,a,t)}i<=e-1&&this.link(i,Math.min(this.length-1,i+Math.floor(e)))}}linksToLines(){let t=[];for(let e=0,i=this._cs.length;e<i;e++){let n=this._cs[e];t.push(new d(this[n[0]],this[n[1]]))}return t}processEdges(){for(let t=0,e=this._cs.length;t<e;t++){let[i,n,s,o]=this._cs[t];dt.edgeConstraint(this[i],this[n],s,o)}}processBody(t){let e=this,i=t,n=S.hasIntersectPolygon(e,i);if(n){let s=n.normal.$multiply(n.dist),o,a=n.edge;Math.abs(a[0][0]-a[1][0])>Math.abs(a[0][1]-a[1][1])?o=(n.vertex[0]-s[0]-a[0][0])/(a[1][0]-a[0][0]):o=(n.vertex[1]-s[1]-a[0][1])/(a[1][1]-a[0][1]);let u=1/(o*o+(1-o)*(1-o)),c=n.vertex.body.mass||1,f=n.edge[0].body.mass||1,p=c/(c+f),b=f/(c+f);a[0].subtract(s.$multiply(p*(1-o)*u/2)),a[1].subtract(s.$multiply(p*o*u/2)),n.vertex.add(s.$multiply(b))}}processParticle(t){let e=this,i=t,n=S.hasIntersectCircle(e,B.fromCenter(t,t.radius));if(n){let s=n.normal.$multiply(n.dist),o,a=n.edge;Math.abs(a[0][0]-a[1][0])>Math.abs(a[0][1]-a[1][1])?o=(n.vertex[0]-s[0]-a[0][0])/(a[1][0]-a[0][0]):o=(n.vertex[1]-s[1]-a[0][1])/(a[1][1]-a[0][1]);let u=1/(o*o+(1-o)*(1-o)),c=n.vertex.mass||i.mass||1,f=n.edge[0].body.mass||1,p=c/(c+f),b=f/(c+f);a[0].subtract(s.$multiply(p*(1-o)*u/2)),a[1].subtract(s.$multiply(p*o*u/2));let P=t.changed.add(s.$multiply(b));t.previous=t.$subtract(P)}}};var Ot={};T(Ot,{Sound:()=>Rt,Tempo:()=>Bt});var Bt=class l{constructor(r){this._listeners={};this._listenerInc=0;this.bpm=r}static fromBeat(r){return new l(6e4/r)}get bpm(){return this._bpm}set bpm(r){this._bpm=r,this._ms=6e4/this._bpm}get ms(){return this._ms}set ms(r){this._bpm=Math.floor(6e4/r),this._ms=6e4/this._bpm}_createID(r){let t="";return typeof r=="function"?t="_b"+this._listenerInc++:t=r.name||"_b"+this._listenerInc++,t}every(r){let t=this,e=Array.isArray(r)?r[0]:r;return{start:function(i,n=0,s){let o=s||t._createID(i);return t._listeners[o]={name:o,beats:r,period:e,index:0,offset:n,duration:-1,continuous:!1,fn:i},this},progress:function(i,n=0,s){let o=s||t._createID(i);return t._listeners[o]={name:o,beats:r,period:e,index:0,offset:n,duration:-1,continuous:!0,fn:i},this}}}track(r){for(let t in this._listeners)if(this._listeners.hasOwnProperty(t)){let e=this._listeners[t],i=e.offset?r+e.offset:r,n=e.period*this._ms,s=!1;i>e.duration+n&&(e.duration=i-i%this._ms,Array.isArray(e.beats)&&(e.index=(e.index+1)%e.beats.length,e.period=e.beats[e.index]),s=!0);let o=Math.max(0,Math.ceil(Math.floor(e.duration/this._ms)/e.period)),a=e.continuous?[o,L.clamp((i-e.duration)/n,0,1),i,s]:[o];(e.continuous||s)&&e.fn.apply(e,a)&&delete this._listeners[e.name]}}stop(r){this._listeners[r]&&delete this._listeners[r]}animate(r,t){this.track(r)}resize(r,t){}action(r,t,e,i){}},Rt=class l{constructor(r){this._playing=!1;this._type=r,this._createAudioContext()}_createAudioContext(){let r=window.AudioContext;if(!r)throw new Error("Your browser doesn't support Web Audio. (No AudioContext)");this._ctx=r?new r:void 0}static from(r,t,e="gen",i){let n=new l(e);return n._node=r,n._ctx=t,i&&(n._stream=i),n}static load(r,t="anonymous"){return new Promise((e,i)=>{let n=new l("file");n._source=typeof r=="string"?new Audio(r):r,n._source.autoplay=!1,n._source.crossOrigin=t,n._source.addEventListener("ended",function(){n._playing=!1}),n._source.addEventListener("error",function(){i("Error loading sound")}),n._source.addEventListener("canplaythrough",function(){n._node||(n._node=n._ctx.createMediaElementSource(n._source)),e(n)})})}static loadAsBuffer(r){return new Promise((t,e)=>{let i=new XMLHttpRequest;i.open("GET",r,!0),i.responseType="arraybuffer";let n=new l("file");i.onload=function(){n._ctx.decodeAudioData(i.response,function(s){n.createBuffer(s),t(n)},s=>e("Error decoding audio"))},i.send()})}createBuffer(r){return this._node=this._ctx.createBufferSource(),r!==void 0&&(this._buffer=r),this._node.buffer=this._buffer,this._node.onended=()=>{this._playing=!1},this}static generate(r,t){return new l("gen")._gen(r,t)}_gen(r,t){this._node=this._ctx.createOscillator();let e=this._node;return e.type=r,r==="custom"?e.setPeriodicWave(t):e.frequency.value=t,this}static input(r){return et(this,null,function*(){try{let t=new l("input");if(!t)return;let e=r||{audio:!0,video:!1};return t._stream=yield navigator.mediaDevices.getUserMedia(e),t._node=t._ctx.createMediaStreamSource(t._stream),t}catch(t){return console.error("Cannot get audio from input device."),Promise.resolve(null)}})}get ctx(){return this._ctx}get node(){return this._node}get outputNode(){return this._outputNode}get stream(){return this._stream}get source(){return this._source}get buffer(){return this._buffer}set buffer(r){this._buffer=r}get type(){return this._type}get playing(){return this._playing}get progress(){let r=0,t=0;return this._buffer?(r=this._buffer.duration,t=this._timestamp?this._ctx.currentTime-this._timestamp:0):(r=this._source.duration,t=this._source.currentTime),t/r}get playable(){return this._type==="input"?this._node!==void 0:!!this._buffer||this._source.readyState===4}get binSize(){return this.analyzer.size}get sampleRate(){return this._ctx.sampleRate}get frequency(){return this._type==="gen"?this._node.frequency.value:0}set frequency(r){this._type==="gen"&&(this._node.frequency.value=r)}connect(r){return this._node.connect(r),this}setOutputNode(r){return this._outputNode=r,this}removeOutputNode(){return this._outputNode=null,this}analyze(r=256,t=-100,e=-30,i=.8){let n=this._ctx.createAnalyser();return n.fftSize=r*2,n.minDecibels=t,n.maxDecibels=e,n.smoothingTimeConstant=i,this.analyzer={node:n,size:n.frequencyBinCount,data:new Uint8Array(n.frequencyBinCount)},this._node.connect(this.analyzer.node),this}_domain(r){return this.analyzer?(r?this.analyzer.node.getByteTimeDomainData(this.analyzer.data):this.analyzer.node.getByteFrequencyData(this.analyzer.data),this.analyzer.data):new Uint8Array(0)}_domainTo(r,t,e=[0,0],i=[0,0]){let n=r?this.timeDomain():this.freqDomain(),s=new d;for(let o=i[0],a=n.length-i[1];o<a;o++)s.push(new h(e[0]+t[0]*o/a,e[1]+t[1]*n[o]/255));return s}timeDomain(){return this._domain(!0)}timeDomainTo(r,t=[0,0],e=[0,0]){return this._domainTo(!0,r,t,e)}freqDomain(){return this._domain(!1)}freqDomainTo(r,t=[0,0],e=[0,0]){return this._domainTo(!1,r,t,e)}reset(){return this.stop(),this._node.disconnect(),this}start(r=0){return this._ctx?this._ctx.state==="suspended"&&this._ctx.resume():this._createAudioContext(),this._type==="file"?this._buffer?(this._node.start(r),this._timestamp=this._ctx.currentTime+r):(this._source.play(),r>0&&(this._source.currentTime=r)):this._type==="gen"&&(this._gen(this._node.type,this._node.frequency.value),this._node.start(),this.analyzer&&this._node.connect(this.analyzer.node)),(this._outputNode||this._node).connect(this._ctx.destination),this._playing=!0,this}stop(){return this._playing&&(this._outputNode||this._node).disconnect(this._ctx.destination),this._type==="file"?this._buffer?this.progress<1&&this._node.stop():this._source.pause():this._type==="gen"?this._node.stop():this._type==="input"&&this._stream.getAudioTracks().forEach(r=>r.stop()),this._playing=!1,this}toggle(){return this._playing?this.stop():this.start(),this}};globalThis.Pts=$($($($($($($($($($($($($($($($($({},Dt),$t),It),gt),Pt),_t),xt),Lt),Gt),wt),Et),St),Ct),zt),vt),Ot),Mt);globalThis.Pts.namespace=l=>{let r=globalThis.Pts;for(let t in r)t!="namespace"&&(l[t]=r[t])};globalThis.Pts.quickStart=(l,r="#9ab")=>{if(!window)return;let t=globalThis;return globalThis.Pts.namespace(t),t.space=new tt(l).setup({bgcolor:r,resize:!0,retina:!0}),t.form=t.space.getForm(),function(e=null,i=null,n=null,s=null){t.space.add({start:i,animate:e,resize:s,action:n}),t.space.bindMouse().bindTouch().play()}};})();
7
7
  /*! Pts.js is licensed under Apache License 2.0. Copyright © 2017-current William Ngan and contributors. (https://github.com/williamngan/pts) */
8
8
  //# sourceMappingURL=pts.min.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pts",
3
- "version": "0.12.7",
3
+ "version": "0.12.8",
4
4
  "description": "pts",
5
5
  "main": "./dist/index",
6
6
  "types": "./dist/index.d.ts",