diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b33cb64..775b72a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,11 +9,12 @@ ## Changelog +### **HEAD -> main** 2022/03/07 mandic00@live.com + + ### **2.6.4** 2022/02/27 mandic00@live.com - -### **origin/main** 2022/02/17 mandic00@live.com - +- fix types typo - refresh - add config option wasmplatformfetch diff --git a/dist/human.esm-nobundle.js b/dist/human.esm-nobundle.js index eaee1797..78b107e3 100644 --- a/dist/human.esm-nobundle.js +++ b/dist/human.esm-nobundle.js @@ -4,7 +4,7 @@ author: ' */ -var kt=Object.defineProperty;var rr=Object.getOwnPropertyDescriptor;var sr=Object.getOwnPropertyNames;var ar=Object.prototype.hasOwnProperty;var ir=(e,t,o)=>t in e?kt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o;var Ze=(e,t)=>{for(var o in t)kt(e,o,{get:t[o],enumerable:!0})},Z=(e,t,o,A)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of sr(t))!ar.call(e,n)&&(o||n!=="default")&&kt(e,n,{get:()=>t[n],enumerable:!(A=rr(t,n))||A.enumerable});return e};var w=(e,t,o)=>(ir(e,typeof t!="symbol"?t+"":t,o),o),yo=(e,t,o)=>{if(!t.has(e))throw TypeError("Cannot "+o)};var ke=(e,t,o)=>(yo(e,t,"read from private field"),o?o.call(e):t.get(e)),Ee=(e,t,o)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,o)},ze=(e,t,o,A)=>(yo(e,t,"write to private field"),A?A.call(e,o):t.set(e,o),o);function g(...e){let t=new Date,o=`${t.getHours().toString().padStart(2,"0")}:${t.getMinutes().toString().padStart(2,"0")}:${t.getSeconds().toString().padStart(2,"0")}.${t.getMilliseconds().toString().padStart(3,"0")}`;e&&console.log(o,"Human:",...e)}function xo(e,t){let o=e.endsWith("/")?"":"/",n=t.startsWith(".")||t.startsWith("/")||t.startsWith("http:")||t.startsWith("https:")||t.startsWith("file:")?`${t}`:`${e}${o}${t}`;if(!n.toLocaleLowerCase().includes(".json"))throw new Error(`modelpath error: expecting json file: ${n}`);return n}var P=()=>typeof performance!="undefined"?performance.now():parseInt((Number(process.hrtime.bigint())/1e3/1e3).toString());function Et(e,t,o="config",A=[]){for(let n of Object.keys(t))if(typeof t[n]=="object")Et(e[n],t[n],n,A);else{let s=e&&typeof e[n]!="undefined";s||A.push({reason:"unknown property",where:`${o}.${n} = ${t[n]}`});let a=e&&typeof e[n]==typeof t[n];s&&!a&&A.push({reason:"property type mismatch",where:`${o}.${n} = ${t[n]}`,expected:typeof e[n]})}return t.debug&&o==="config"&&A.length>0&&g("invalid configuration",A),A}function o0(...e){let t=o=>o&&typeof o=="object";return e.reduce((o,A)=>(Object.keys(A||{}).forEach(n=>{let s=o[n],a=A[n];Array.isArray(s)&&Array.isArray(a)?o[n]=s.concat(...a):t(s)&&t(a)?o[n]=o0(s,a):o[n]=a}),o),{})}var Y0={backend:"",modelBasePath:"",cacheModels:!0,wasmPath:"",wasmPlatformFetch:!1,debug:!0,async:!0,warmup:"full",cacheSensitivity:.7,skipAllowed:!1,deallocate:!1,filter:{enabled:!0,equalization:!1,width:0,height:0,flip:!1,return:!0,brightness:0,contrast:0,sharpness:0,blur:0,saturation:0,hue:0,negative:!1,sepia:!1,vintage:!1,kodachrome:!1,technicolor:!1,polaroid:!1,pixelate:0},gesture:{enabled:!0},face:{enabled:!0,detector:{modelPath:"blazeface.json",rotation:!0,maxDetected:1,skipFrames:99,skipTime:2500,minConfidence:.2,iouThreshold:.1,mask:!1,return:!1},mesh:{enabled:!0,modelPath:"facemesh.json"},iris:{enabled:!0,modelPath:"iris.json"},emotion:{enabled:!0,minConfidence:.1,skipFrames:99,skipTime:1500,modelPath:"emotion.json"},description:{enabled:!0,modelPath:"faceres.json",skipFrames:99,skipTime:3e3,minConfidence:.1},antispoof:{enabled:!1,skipFrames:99,skipTime:4e3,modelPath:"antispoof.json"},liveness:{enabled:!1,skipFrames:99,skipTime:4e3,modelPath:"liveness.json"}},body:{enabled:!0,modelPath:"movenet-lightning.json",maxDetected:-1,minConfidence:.3,skipFrames:1,skipTime:200},hand:{enabled:!0,rotation:!0,skipFrames:99,skipTime:1e3,minConfidence:.5,iouThreshold:.2,maxDetected:-1,landmarks:!0,detector:{modelPath:"handtrack.json"},skeleton:{modelPath:"handlandmark-full.json"}},object:{enabled:!1,modelPath:"mb3-centernet.json",minConfidence:.2,iouThreshold:.4,maxDetected:10,skipFrames:99,skipTime:2e3},segmentation:{enabled:!1,modelPath:"selfie.json",blur:8}};var r={};Ze(r,{GraphModel:()=>zt,Tensor:()=>se,version:()=>je});Z(r,es);Z(r,ts);import*as es from"@tensorflow/tfjs/dist/index.js";import*as ts from"@tensorflow/tfjs-backend-webgl/dist/index.js";import{Tensor as se}from"@tensorflow/tfjs/dist/index.js";import{GraphModel as zt}from"@tensorflow/tfjs-converter/dist/index";var lr="3.14.0",yr="3.14.0",xr="3.14.0",cr="3.14.0",dr="3.14.0",fr="3.14.0",mr="3.14.0",pr="3.14.0",je={tfjs:lr,"tfjs-core":yr,"tfjs-data":xr,"tfjs-layers":cr,"tfjs-converter":dr,"tfjs-backend-cpu":fr,"tfjs-backend-webgl":mr,"tfjs-backend-wasm":pr};var co=` +var kt=Object.defineProperty;var sr=Object.getOwnPropertyDescriptor;var ar=Object.getOwnPropertyNames;var ir=Object.prototype.hasOwnProperty;var lr=(e,t,o)=>t in e?kt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o;var Ze=(e,t)=>{for(var o in t)kt(e,o,{get:t[o],enumerable:!0})},yo=(e,t,o,A)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of ar(t))!ir.call(e,n)&&n!==o&&kt(e,n,{get:()=>t[n],enumerable:!(A=sr(t,n))||A.enumerable});return e},Z=(e,t,o)=>(yo(e,t,"default"),o&&yo(o,t,"default"));var w=(e,t,o)=>(lr(e,typeof t!="symbol"?t+"":t,o),o),xo=(e,t,o)=>{if(!t.has(e))throw TypeError("Cannot "+o)};var ke=(e,t,o)=>(xo(e,t,"read from private field"),o?o.call(e):t.get(e)),Ee=(e,t,o)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,o)},ze=(e,t,o,A)=>(xo(e,t,"write to private field"),A?A.call(e,o):t.set(e,o),o);function g(...e){let t=new Date,o=`${t.getHours().toString().padStart(2,"0")}:${t.getMinutes().toString().padStart(2,"0")}:${t.getSeconds().toString().padStart(2,"0")}.${t.getMilliseconds().toString().padStart(3,"0")}`;e&&console.log(o,"Human:",...e)}function co(e,t){let o=e.endsWith("/")?"":"/",n=t.startsWith(".")||t.startsWith("/")||t.startsWith("http:")||t.startsWith("https:")||t.startsWith("file:")?`${t}`:`${e}${o}${t}`;if(!n.toLocaleLowerCase().includes(".json"))throw new Error(`modelpath error: expecting json file: ${n}`);return n}var P=()=>typeof performance!="undefined"?performance.now():parseInt((Number(process.hrtime.bigint())/1e3/1e3).toString());function Et(e,t,o="config",A=[]){for(let n of Object.keys(t))if(typeof t[n]=="object")Et(e[n],t[n],n,A);else{let s=e&&typeof e[n]!="undefined";s||A.push({reason:"unknown property",where:`${o}.${n} = ${t[n]}`});let a=e&&typeof e[n]==typeof t[n];s&&!a&&A.push({reason:"property type mismatch",where:`${o}.${n} = ${t[n]}`,expected:typeof e[n]})}return t.debug&&o==="config"&&A.length>0&&g("invalid configuration",A),A}function o0(...e){let t=o=>o&&typeof o=="object";return e.reduce((o,A)=>(Object.keys(A||{}).forEach(n=>{let s=o[n],a=A[n];Array.isArray(s)&&Array.isArray(a)?o[n]=s.concat(...a):t(s)&&t(a)?o[n]=o0(s,a):o[n]=a}),o),{})}var Y0={backend:"",modelBasePath:"",cacheModels:!0,wasmPath:"",wasmPlatformFetch:!1,debug:!0,async:!0,warmup:"full",cacheSensitivity:.7,skipAllowed:!1,deallocate:!1,filter:{enabled:!0,equalization:!1,width:0,height:0,flip:!1,return:!0,brightness:0,contrast:0,sharpness:0,blur:0,saturation:0,hue:0,negative:!1,sepia:!1,vintage:!1,kodachrome:!1,technicolor:!1,polaroid:!1,pixelate:0},gesture:{enabled:!0},face:{enabled:!0,detector:{modelPath:"blazeface.json",rotation:!0,maxDetected:1,skipFrames:99,skipTime:2500,minConfidence:.2,iouThreshold:.1,mask:!1,return:!1},mesh:{enabled:!0,modelPath:"facemesh.json"},iris:{enabled:!0,modelPath:"iris.json"},emotion:{enabled:!0,minConfidence:.1,skipFrames:99,skipTime:1500,modelPath:"emotion.json"},description:{enabled:!0,modelPath:"faceres.json",skipFrames:99,skipTime:3e3,minConfidence:.1},antispoof:{enabled:!1,skipFrames:99,skipTime:4e3,modelPath:"antispoof.json"},liveness:{enabled:!1,skipFrames:99,skipTime:4e3,modelPath:"liveness.json"}},body:{enabled:!0,modelPath:"movenet-lightning.json",maxDetected:-1,minConfidence:.3,skipFrames:1,skipTime:200},hand:{enabled:!0,rotation:!0,skipFrames:99,skipTime:1e3,minConfidence:.5,iouThreshold:.2,maxDetected:-1,landmarks:!0,detector:{modelPath:"handtrack.json"},skeleton:{modelPath:"handlandmark-full.json"}},object:{enabled:!1,modelPath:"mb3-centernet.json",minConfidence:.2,iouThreshold:.4,maxDetected:10,skipFrames:99,skipTime:2e3},segmentation:{enabled:!1,modelPath:"selfie.json",blur:8}};var r={};Ze(r,{GraphModel:()=>zt,Tensor:()=>se,version:()=>je});Z(r,ts);Z(r,os);import*as ts from"@tensorflow/tfjs/dist/index.js";import*as os from"@tensorflow/tfjs-backend-webgl/dist/index.js";import{Tensor as se}from"@tensorflow/tfjs/dist/index.js";import{GraphModel as zt}from"@tensorflow/tfjs-converter/dist/index";var yr="3.14.0",xr="3.14.0",cr="3.14.0",dr="3.14.0",fr="3.14.0",mr="3.14.0",pr="3.14.0",ur="3.14.0",je={tfjs:yr,"tfjs-core":xr,"tfjs-data":cr,"tfjs-layers":dr,"tfjs-converter":fr,"tfjs-backend-cpu":mr,"tfjs-backend-webgl":pr,"tfjs-backend-wasm":ur};var fo=` precision highp float; attribute vec2 pos; attribute vec2 uv; @@ -14,7 +14,7 @@ var kt=Object.defineProperty;var rr=Object.getOwnPropertyDescriptor;var sr=Objec vUv = uv; gl_Position = vec4(pos.x, pos.y*flipY, 0.0, 1.); } -`;var fo=` +`;var mo=` precision highp float; varying vec2 vUv; uniform sampler2D texture; @@ -26,7 +26,7 @@ var kt=Object.defineProperty;var rr=Object.getOwnPropertyDescriptor;var sr=Objec gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[13] * c.a + m[14]; gl_FragColor.a = m[15] * c.r + m[16] * c.g + m[17] * c.b + m[18] * c.a + m[19]; } -`,mo=` +`,po=` precision highp float; varying vec2 vUv; uniform sampler2D texture; @@ -38,7 +38,7 @@ var kt=Object.defineProperty;var rr=Object.getOwnPropertyDescriptor;var sr=Objec gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[14]; gl_FragColor.a = c.a; } -`,po=` +`,uo=` precision highp float; varying vec2 vUv; uniform vec2 size; @@ -51,7 +51,7 @@ var kt=Object.defineProperty;var rr=Object.getOwnPropertyDescriptor;var sr=Objec vec2 coord = pixelate(vUv, size); gl_FragColor += texture2D(texture, coord); } -`,uo=` +`,ho=` precision highp float; varying vec2 vUv; uniform sampler2D texture; @@ -74,7 +74,7 @@ var kt=Object.defineProperty;var rr=Object.getOwnPropertyDescriptor;var sr=Objec gl_FragColor += texture2D(texture, vUv + vec2( 6.0*px.x, 6.0*px.y))*0.00895781211794; gl_FragColor += texture2D(texture, vUv + vec2( 7.0*px.x, 7.0*px.y))*0.0044299121055113265; } -`,ho=` +`,bo=` precision highp float; varying vec2 vUv; uniform sampler2D texture; @@ -96,7 +96,7 @@ var kt=Object.defineProperty;var rr=Object.getOwnPropertyDescriptor;var sr=Objec c31 * m[6] + c32 * m[7] + c33 * m[8]; gl_FragColor.a = c22.a; } -`;var jt=(e,t,o)=>{let A=new RegExp("\\b"+t+" \\w+ (\\w+)","ig");e.replace(A,(n,s)=>(o[s]=0,n))},bo=class{constructor(t,o,A){w(this,"uniform",{});w(this,"attribute",{});w(this,"gl");w(this,"id");w(this,"compile",(t,o)=>{let A=this.gl.createShader(o);return A?(this.gl.shaderSource(A,t),this.gl.compileShader(A),this.gl.getShaderParameter(A,this.gl.COMPILE_STATUS)?A:(g(`filter: gl compile failed: ${this.gl.getShaderInfoLog(A)}`),null)):(g("filter: could not create shader"),null)});this.gl=t;let n=this.compile(o,this.gl.VERTEX_SHADER),s=this.compile(A,this.gl.FRAGMENT_SHADER);if(this.id=this.gl.createProgram(),!(!n||!s)){if(!this.id){g("filter: could not create webgl program");return}if(this.gl.attachShader(this.id,n),this.gl.attachShader(this.id,s),this.gl.linkProgram(this.id),!this.gl.getProgramParameter(this.id,this.gl.LINK_STATUS)){g(`filter: gl link failed: ${this.gl.getProgramInfoLog(this.id)}`);return}this.gl.useProgram(this.id),jt(o,"attribute",this.attribute);for(let a in this.attribute)this.attribute[a]=this.gl.getAttribLocation(this.id,a);jt(o,"uniform",this.uniform),jt(A,"uniform",this.uniform);for(let a in this.uniform)this.uniform[a]=this.gl.getUniformLocation(this.id,a)}}};function go(){let e=0,t=null,o=!1,A=-1,n=[null,null],s=[],a=null,i=null,x=s0(100,100),d={},l={INTERMEDIATE:1},y=x.getContext("webgl");if(this.gl=y,!y){g("filter: cannot get webgl context");return}function c(M,p){if(!(M===x.width&&p===x.height)){if(x.width=M,x.height=p,!a){let u=new Float32Array([-1,-1,0,1,1,-1,1,1,-1,1,0,0,-1,1,0,0,1,-1,1,1,1,1,1,0]);a=y.createBuffer(),y.bindBuffer(y.ARRAY_BUFFER,a),y.bufferData(y.ARRAY_BUFFER,u,y.STATIC_DRAW),y.pixelStorei(y.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0)}y.viewport(0,0,x.width,x.height),n=[null,null]}}function f(M,p){let u=y.createFramebuffer();y.bindFramebuffer(y.FRAMEBUFFER,u);let E=y.createRenderbuffer();y.bindRenderbuffer(y.RENDERBUFFER,E);let W=y.createTexture();return y.bindTexture(y.TEXTURE_2D,W),y.texImage2D(y.TEXTURE_2D,0,y.RGBA,M,p,0,y.RGBA,y.UNSIGNED_BYTE,null),y.texParameteri(y.TEXTURE_2D,y.TEXTURE_MAG_FILTER,y.LINEAR),y.texParameteri(y.TEXTURE_2D,y.TEXTURE_MIN_FILTER,y.LINEAR),y.texParameteri(y.TEXTURE_2D,y.TEXTURE_WRAP_S,y.CLAMP_TO_EDGE),y.texParameteri(y.TEXTURE_2D,y.TEXTURE_WRAP_T,y.CLAMP_TO_EDGE),y.framebufferTexture2D(y.FRAMEBUFFER,y.COLOR_ATTACHMENT0,y.TEXTURE_2D,W,0),y.bindTexture(y.TEXTURE_2D,null),y.bindFramebuffer(y.FRAMEBUFFER,null),{fbo:u,texture:W}}function h(M){return n[M]=n[M]||f(x.width,x.height),n[M]}function m(M=0){if(!i)return;let p=null,u=null,E=!1;e===0?p=t:p=h(A).texture||null,e++,o&&!(M&l.INTERMEDIATE)?(u=null,E=e%2===0):(A=(A+1)%2,u=h(A).fbo||null),y.bindTexture(y.TEXTURE_2D,p),y.bindFramebuffer(y.FRAMEBUFFER,u),y.uniform1f(i.uniform.flipY,E?-1:1),y.drawArrays(y.TRIANGLES,0,6)}function v(M){if(d[M])return i=d[M],y.useProgram((i?i.id:null)||null),i;if(i=new bo(y,co,M),!i)return g("filter: could not get webgl program"),null;let p=Float32Array.BYTES_PER_ELEMENT,u=4*p;return y.enableVertexAttribArray(i.attribute.pos),y.vertexAttribPointer(i.attribute.pos,2,y.FLOAT,!1,u,0*p),y.enableVertexAttribArray(i.attribute.uv),y.vertexAttribPointer(i.attribute.uv,2,y.FLOAT,!1,u,2*p),d[M]=i,i}let b={colorMatrix:M=>{let p=new Float32Array(M);p[4]/=255,p[9]/=255,p[14]/=255,p[19]/=255;let u=p[18]===1&&p[3]===0&&p[8]===0&&p[13]===0&&p[15]===0&&p[16]===0&&p[17]===0&&p[19]===0?mo:fo,E=v(u);!E||(y.uniform1fv(E.uniform.m,p),m())},brightness:M=>{let p=(M||0)+1;b.colorMatrix([p,0,0,0,0,0,p,0,0,0,0,0,p,0,0,0,0,0,1,0])},saturation:M=>{let p=(M||0)*2/3+1,u=(p-1)*-.5;b.colorMatrix([p,u,u,0,0,u,p,u,0,0,u,u,p,0,0,0,0,0,1,0])},desaturate:()=>{b.saturation(-1)},contrast:M=>{let p=(M||0)+1,u=-128*(p-1);b.colorMatrix([p,0,0,0,u,0,p,0,0,u,0,0,p,0,u,0,0,0,1,0])},negative:()=>{b.contrast(-2)},hue:M=>{M=(M||0)/180*Math.PI;let p=Math.cos(M),u=Math.sin(M),E=.213,W=.715,C=.072;b.colorMatrix([E+p*(1-E)+u*-E,W+p*-W+u*-W,C+p*-C+u*(1-C),0,0,E+p*-E+u*.143,W+p*(1-W)+u*.14,C+p*-C+u*-.283,0,0,E+p*-E+u*-(1-E),W+p*-W+u*W,C+p*(1-C)+u*C,0,0,0,0,0,1,0])},desaturateLuminance:()=>{b.colorMatrix([.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,0,0,0,1,0])},sepia:()=>{b.colorMatrix([.393,.7689999,.18899999,0,0,.349,.6859999,.16799999,0,0,.272,.5339999,.13099999,0,0,0,0,0,1,0])},brownie:()=>{b.colorMatrix([.5997023498159715,.34553243048391263,-.2708298674538042,0,47.43192855600873,-.037703249837783157,.8609577587992641,.15059552388459913,0,-36.96841498319127,.24113635128153335,-.07441037908422492,.44972182064877153,0,-7.562075277591283,0,0,0,1,0])},vintagePinhole:()=>{b.colorMatrix([.6279345635605994,.3202183420819367,-.03965408211312453,0,9.651285835294123,.02578397704808868,.6441188644374771,.03259127616149294,0,7.462829176470591,.0466055556782719,-.0851232987247891,.5241648018700465,0,5.159190588235296,0,0,0,1,0])},kodachrome:()=>{b.colorMatrix([1.1285582396593525,-.3967382283601348,-.03992559172921793,0,63.72958762196502,-.16404339962244616,1.0835251566291304,-.05498805115633132,0,24.732407896706203,-.16786010706155763,-.5603416277695248,1.6014850761964943,0,35.62982807460946,0,0,0,1,0])},technicolor:()=>{b.colorMatrix([1.9125277891456083,-.8545344976951645,-.09155508482755585,0,11.793603434377337,-.3087833385928097,1.7658908555458428,-.10601743074722245,0,-70.35205161461398,-.231103377548616,-.7501899197440212,1.847597816108189,0,30.950940869491138,0,0,0,1,0])},polaroid:()=>{b.colorMatrix([1.438,-.062,-.062,0,0,-.122,1.378,-.122,0,0,-.016,-.016,1.483,0,0,0,0,0,1,0])},shiftToBGR:()=>{b.colorMatrix([0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0])},convolution:M=>{let p=new Float32Array(M),u=1/x.width,E=1/x.height,W=v(ho);!W||(y.uniform1fv(W.uniform.m,p),y.uniform2f(W.uniform.px,u,E),m())},detectEdges:()=>{b.convolution.call(this,[0,1,0,1,-4,1,0,1,0])},sobelX:()=>{b.convolution.call(this,[-1,0,1,-2,0,2,-1,0,1])},sobelY:()=>{b.convolution.call(this,[-1,-2,-1,0,0,0,1,2,1])},sharpen:M=>{let p=M||1;b.convolution.call(this,[0,-1*p,0,-1*p,1+4*p,-1*p,0,-1*p,0])},emboss:M=>{let p=M||1;b.convolution.call(this,[-2*p,-1*p,0,-1*p,1,1*p,0,1*p,2*p])},blur:M=>{let p=M/7/x.width,u=M/7/x.height,E=v(uo);!E||(y.uniform2f(E.uniform.px,0,u),m(l.INTERMEDIATE),y.uniform2f(E.uniform.px,p,0),m())},pixelate:M=>{let p=M/x.width,u=M/x.height,E=v(po);!E||(y.uniform2f(E.uniform.size,p,u),m())}};this.add=function(M){let p=Array.prototype.slice.call(arguments,1),u=b[M];s.push({func:u,args:p})},this.reset=function(){s=[]},this.get=function(){return s},this.apply=function(M){c(M.width,M.height),e=0,t||(t=y.createTexture()),y.bindTexture(y.TEXTURE_2D,t),y.texParameteri(y.TEXTURE_2D,y.TEXTURE_WRAP_S,y.CLAMP_TO_EDGE),y.texParameteri(y.TEXTURE_2D,y.TEXTURE_WRAP_T,y.CLAMP_TO_EDGE),y.texParameteri(y.TEXTURE_2D,y.TEXTURE_MIN_FILTER,y.NEAREST),y.texParameteri(y.TEXTURE_2D,y.TEXTURE_MAG_FILTER,y.NEAREST),y.texImage2D(y.TEXTURE_2D,0,y.RGBA,y.RGBA,y.UNSIGNED_BYTE,M);for(let p=0;pf.data())),a=.99*Math.max(s[0][0],s[1][0],s[2][0]),i=[r.sub(o[0],A[0]),r.sub(o[1],A[1]),r.sub(o[2],A[2])],x=[r.sub(n[0],A[0]),r.sub(n[1],A[1]),r.sub(n[2],A[2])],d=[r.div(a,x[0]),r.div(a,x[1]),r.div(a,x[2])],l=[r.mul(i[0],d[0]),r.mul(i[1],d[1]),r.mul(i[2],d[2])],y=r.stack([l[0],l[1],l[2]],2),c=r.reshape(y,[1,t.shape[0],t.shape[1],3]);return r.dispose([...o,...A,...n,...i,...x,...d,...l,y,t]),c}var De=2048,G=null,_=null,ae=null,D,z0={inputSum:0,cacheDiff:1,sumMethod:0,inputTensor:void 0};function s0(e,t){let o;if(R.browser)if(R.worker){if(typeof OffscreenCanvas=="undefined")throw new Error("canvas error: attempted to run in web worker but OffscreenCanvas is not supported");o=new OffscreenCanvas(e,t)}else{if(typeof document=="undefined")throw new Error("canvas error: attempted to run in browser but DOM is not defined");o=document.createElement("canvas"),o.width=e,o.height=t}else typeof R.Canvas!="undefined"?o=new R.Canvas(e,t):typeof globalThis.Canvas!="undefined"&&(o=new globalThis.Canvas(e,t));return o}function St(e,t){let o=t||s0(e.width,e.height);return o.getContext("2d").drawImage(e,0,0),o}async function ie(e,t,o=!0){if(!e)return t.debug&&g("input error: input is missing"),{tensor:null,canvas:null};if(!(e instanceof se)&&!(typeof Image!="undefined"&&e instanceof Image)&&!(typeof R.Canvas!="undefined"&&e instanceof R.Canvas)&&!(typeof globalThis.Canvas!="undefined"&&e instanceof globalThis.Canvas)&&!(typeof ImageData!="undefined"&&e instanceof ImageData)&&!(typeof ImageBitmap!="undefined"&&e instanceof ImageBitmap)&&!(typeof HTMLImageElement!="undefined"&&e instanceof HTMLImageElement)&&!(typeof HTMLMediaElement!="undefined"&&e instanceof HTMLMediaElement)&&!(typeof HTMLVideoElement!="undefined"&&e instanceof HTMLVideoElement)&&!(typeof HTMLCanvasElement!="undefined"&&e instanceof HTMLCanvasElement)&&!(typeof OffscreenCanvas!="undefined"&&e instanceof OffscreenCanvas))throw new Error("input error: type is not recognized");if(e instanceof se){let A=null;if(e.isDisposedInternal)throw new Error("input error: attempted to use tensor but it is disposed");if(!e.shape)throw new Error("input error: attempted to use tensor without a shape");if(e.shape.length===3){if(e.shape[2]===3)A=r.expandDims(e,0);else if(e.shape[2]===4){let n=r.slice3d(e,[0,0,0],[-1,-1,3]);A=r.expandDims(n,0),r.dispose(n)}}else e.shape.length===4&&(e.shape[3]===3?A=r.clone(e):e.shape[3]===4&&(A=r.slice4d(e,[0,0,0,0],[-1,-1,-1,3])));if(A==null||A.shape.length!==4||A.shape[0]!==1||A.shape[3]!==3)throw new Error(`input error: attempted to use tensor with unrecognized shape: ${e.shape}`);if(A.dtype==="int32"){let n=r.cast(A,"float32");r.dispose(A),A=n}return{tensor:A,canvas:t.filter.return?_:null}}else{if(typeof e.readyState!="undefined"&&e.readyState<=2)return t.debug&&g("input stream is not ready"),{tensor:null,canvas:G};let A=e.naturalWidth||e.videoWidth||e.width||e.shape&&e.shape[1]>0,n=e.naturalHeight||e.videoHeight||e.height||e.shape&&e.shape[2]>0;if(!A||!n)return t.debug&&g("cannot determine input dimensions"),{tensor:null,canvas:G};let s=A,a=n;if(s>De&&(s=De,a=Math.trunc(s*n/A)),a>De&&(a=De,s=Math.trunc(a*A/n)),(t.filter.width||0)>0?s=t.filter.width:(t.filter.height||0)>0&&(s=A*((t.filter.height||0)/n)),(t.filter.height||0)>0?a=t.filter.height:(t.filter.width||0)>0&&(a=n*((t.filter.width||0)/A)),!s||!a)throw new Error("input error: cannot determine dimension");(!G||(G==null?void 0:G.width)!==s||(G==null?void 0:G.height)!==a)&&(G=s0(s,a));let i=G.getContext("2d");if(typeof ImageData!="undefined"&&e instanceof ImageData?i.putImageData(e,0,0):t.filter.flip&&typeof i.translate!="undefined"?(i.translate(A,0),i.scale(-1,1),i.drawImage(e,0,0,A,n,0,0,G==null?void 0:G.width,G==null?void 0:G.height),i.setTransform(1,0,0,1,0,0)):i.drawImage(e,0,0,A,n,0,0,G==null?void 0:G.width,G==null?void 0:G.height),(!_||G.width!==_.width||(G==null?void 0:G.height)!==(_==null?void 0:_.height))&&(_=s0(G.width,G.height)),t.filter.enabled&&R.webgl.supported){if(D||(D=R.browser?new go:null),R.filter=!!D,!D||!D.add)return t.debug&&g("input process error: cannot initialize filters"),{tensor:null,canvas:G};D.reset(),t.filter.brightness!==0&&D.add("brightness",t.filter.brightness),t.filter.contrast!==0&&D.add("contrast",t.filter.contrast),t.filter.sharpness!==0&&D.add("sharpen",t.filter.sharpness),t.filter.blur!==0&&D.add("blur",t.filter.blur),t.filter.saturation!==0&&D.add("saturation",t.filter.saturation),t.filter.hue!==0&&D.add("hue",t.filter.hue),t.filter.negative&&D.add("negative"),t.filter.sepia&&D.add("sepia"),t.filter.vintage&&D.add("brownie"),t.filter.sepia&&D.add("sepia"),t.filter.kodachrome&&D.add("kodachrome"),t.filter.technicolor&&D.add("technicolor"),t.filter.polaroid&&D.add("polaroid"),t.filter.pixelate!==0&&D.add("pixelate",t.filter.pixelate),D.get()>0?_=D.apply(G):_=D.draw(G)}else St(G,_),D&&(D=null),R.filter=!!D;if(!o)return{tensor:null,canvas:_};if(!_)throw new Error("canvas error: cannot create output");let x,d=3;if(typeof ImageData!="undefined"&&e instanceof ImageData||e.data&&e.width&&e.height)if(R.browser&&r.browser)x=r.browser?r.browser.fromPixels(e):null;else{d=e.data.length/e.height/e.width;let c=new Uint8Array(e.data.buffer);x=r.tensor(c,[e.height,e.width,d],"int32")}else if((!ae||_.width!==ae.width||_.height!==ae.height)&&(ae=s0(_.width,_.height)),r.browser&&R.browser)t.backend==="webgl"||t.backend==="humangl"||t.backend==="webgpu"?x=r.browser.fromPixels(_):(ae=St(_),x=r.browser.fromPixels(ae));else{let h=St(_).getContext("2d").getImageData(0,0,s,a);d=h.data.length/s/a;let m=new Uint8Array(h.data.buffer);x=r.tensor(m,[s,a,d])}if(d===4){let c=r.slice3d(x,[0,0,0],[-1,-1,3]);r.dispose(x),x=c}if(!x)throw new Error("input error: cannot create tensor");let l=r.cast(x,"float32"),y=t.filter.equalization?await Xe(l):r.expandDims(l,0);return r.dispose([x,l]),{tensor:y,canvas:t.filter.return?_:null}}}async function Po(e,t){let o=!1;if(e.cacheSensitivity===0||!t.shape||t.shape.length!==4||t.shape[1]>2048||t.shape[2]>2048)return o;if(!z0.inputTensor)z0.inputTensor=r.clone(t);else if(z0.inputTensor.shape[1]!==t.shape[1]||z0.inputTensor.shape[2]!==t.shape[2])r.dispose(z0.inputTensor),z0.inputTensor=r.clone(t);else{let A={};A.diff=r.sub(t,z0.inputTensor),A.squared=r.mul(A.diff,A.diff),A.sum=r.sum(A.squared);let s=(await A.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;r.dispose([z0.inputTensor,A.diff,A.squared,A.sum]),z0.inputTensor=r.clone(t),o=s<=(e.cacheSensitivity||0)}return o}async function Mo(e,t,o){let A={};if(!t||!o||t.shape.length!==4||t.shape.length!==o.shape.length)return e.debug||g("invalid input tensor or tensor shapes do not match:",t.shape,o.shape),0;if(t.shape[0]!==1||o.shape[0]!==1||t.shape[3]!==3||o.shape[3]!==3)return e.debug||g("input tensors must be of shape [1, height, width, 3]:",t.shape,o.shape),0;A.input1=r.clone(t),A.input2=t.shape[1]!==o.shape[1]||t.shape[2]!==o.shape[2]?r.image.resizeBilinear(o,[t.shape[1],t.shape[2]]):r.clone(o),A.diff=r.sub(A.input1,A.input2),A.squared=r.mul(A.diff,A.diff),A.sum=r.sum(A.squared);let s=(await A.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;return r.dispose([A.input1,A.input2,A.diff,A.squared,A.sum]),s}var vo=class{constructor(){w(this,"browser");w(this,"node");w(this,"worker");w(this,"platform","");w(this,"agent","");w(this,"backends",[]);w(this,"initial");w(this,"filter");w(this,"tfjs");w(this,"offscreen");w(this,"perfadd",!1);w(this,"wasm",{supported:void 0,backend:void 0,simd:void 0,multithread:void 0});w(this,"webgl",{supported:void 0,backend:void 0,version:void 0,renderer:void 0});w(this,"webgpu",{supported:void 0,backend:void 0,adapter:void 0});w(this,"cpu",{model:void 0,flags:[]});w(this,"kernels",[]);w(this,"Canvas");w(this,"Image");w(this,"ImageData");if(this.browser=typeof navigator!="undefined",this.node=typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined",this.tfjs={version:je["tfjs-core"]},this.offscreen=typeof OffscreenCanvas!="undefined",this.initial=!0,this.worker=this.browser&&this.offscreen?typeof WorkerGlobalScope!="undefined":void 0,typeof navigator!="undefined"){let t=navigator.userAgent.match(/\(([^()]+)\)/g);if(t&&t[0]){let o=t[0].match(/\(([^()]+)\)/g);this.platform=o&&o[0]?o[0].replace(/\(|\)/g,""):"",this.agent=navigator.userAgent.replace(t[0],""),this.platform[1]&&(this.agent=this.agent.replace(t[1],"")),this.agent=this.agent.replace(/ /g," ")}}else typeof process!="undefined"&&(this.platform=`${process.platform} ${process.arch}`,this.agent=`NodeJS ${process.version}`)}async updateBackend(){this.backends=Object.keys(r.engine().registryFactory),this.wasm.supported=typeof WebAssembly!="undefined",this.wasm.backend=this.backends.includes("wasm"),this.wasm.supported&&this.wasm.backend&&r.getBackend()==="wasm"&&(this.wasm.simd=await r.env().getAsync("WASM_HAS_SIMD_SUPPORT"),this.wasm.multithread=await r.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"));let t=s0(100,100),o=t?t.getContext("webgl2"):void 0;if(this.webgl.supported=typeof o!="undefined",this.webgl.backend=this.backends.includes("webgl"),this.webgl.supported&&this.webgl.backend&&(r.getBackend()==="webgl"||r.getBackend()==="humangl")){let A=r.backend().gpgpu!=="undefined"?await r.backend().getGPGPUContext().gl:null;A&&(this.webgl.version=A.getParameter(A.VERSION),this.webgl.renderer=A.getParameter(A.RENDERER))}this.webgpu.supported=this.browser&&typeof navigator.gpu!="undefined",this.webgpu.backend=this.backends.includes("webgpu");try{this.webgpu.supported&&(this.webgpu.adapter=(await navigator.gpu.requestAdapter()).name)}catch(A){this.webgpu.supported=!1}try{this.kernels=r.getKernelsForBackend(r.getBackend()).map(A=>A.kernelName.toLowerCase())}catch(A){}}async updateCPU(){let t={model:"",flags:[]};this.node&&this.platform.startsWith("linux"),this.cpu?this.cpu=t:Object.defineProperty(this,"cpu",{value:t})}},R=new vo;var j0={cacheModels:!1,verbose:!0,debug:!1,modelBasePath:""};async function gr(e,t){return j0.debug&&g("load model fetch:",e,t),fetch(e,t)}function To(e){j0.cacheModels=e.cacheModels,j0.verbose=e.debug,j0.modelBasePath=e.modelBasePath}async function N(e){let t=xo(j0.modelBasePath,e||""),o=t.split("/"),A="indexeddb://"+o[o.length-1].replace(".json",""),n=await r.io.listModels(),s=j0.cacheModels&&Object.keys(n).includes(A),a=typeof fetch=="undefined"?{}:{fetchFunc:(x,d)=>gr(x,d)},i=new zt(s?A:t,a);try{i.findIOHandler(),j0.debug&&g("model load handler:",i.handler);let x=await i.handler.load();i.loadSync(x),j0.verbose&&g("load model:",i.modelUrl)}catch(x){g("error loading model:",t,x)}if(j0.cacheModels&&!s)try{let x=await i.save(A);g("model saved:",A,x)}catch(x){g("error saving model:",t,x)}return i}var Wt="2.6.4";var u0,Ct=[],vr=["white","black","asian","indian","other"],Tr=[15,23,28,35.5,45.5,55.5,65],Ro=0,wo=0,It=Number.MAX_SAFE_INTEGER;async function ko(e){return R.initial&&(u0=null),u0?e.debug&&g("cached model:",u0.modelUrl):u0=await N(e.face.gear),u0}async function Ot(e,t,o,A){var a,i;if(!u0)return{age:0,gender:"unknown",genderScore:0,race:[]};let n=It<(((a=t.face.gear)==null?void 0:a.skipFrames)||0),s=(((i=t.face.gear)==null?void 0:i.skipTime)||0)>P()-wo;return t.skipAllowed&&s&&n&&Ro===A&&Ct[o]?(It++,Ct[o]):(It=0,new Promise(async x=>{var b,M;if(!(u0!=null&&u0.inputs[0].shape))return;let d={},l=[[0,.1,.9,.9]];d.resize=r.image.cropAndResize(e,l,[0],[u0.inputs[0].shape[2],u0.inputs[0].shape[1]]);let y={age:0,gender:"unknown",genderScore:0,race:[]};(b=t.face.gear)!=null&&b.enabled&&([d.age,d.gender,d.race]=u0.execute(d.resize,["age_output","gender_output","race_output"]));let c=await d.gender.data();y.gender=c[0]>c[1]?"male":"female",y.genderScore=Math.round(100*(c[0]>c[1]?c[0]:c[1]))/100;let f=await d.race.data();for(let p=0;p(((M=t.face.gear)==null?void 0:M.minConfidence)||.2)&&y.race.push({score:Math.round(100*f[p])/100,race:vr[p]});y.race.sort((p,u)=>u.score-p.score);let m=Array.from(await d.age.data()).map((p,u)=>[Tr[u],p]).sort((p,u)=>u[1]-p[1]),v=m[0][0];for(let p=1;pr.dispose(d[p])),Ct[o]=y,Ro=A,wo=P(),x(y)}))}var L={tf255:255,tf1:1,tf2:2,tf05:.5,tf127:127.5,rgb:[.2989,.587,.114]};function zo(){L.tf255=r.scalar(255,"float32"),L.tf1=r.scalar(1,"float32"),L.tf2=r.scalar(2,"float32"),L.tf05=r.scalar(.5,"float32"),L.tf127=r.scalar(127.5,"float32"),L.rgb=r.tensor1d([.2989,.587,.114],"float32")}var l0,qe=[],jo=0,So=0,Nt=Number.MAX_SAFE_INTEGER;async function Wo(e){return R.initial&&(l0=null),l0?e.debug&&g("cached model:",l0.modelUrl):l0=await N(e.face.ssrnet.modelPathAge),l0}async function Lt(e,t,o,A){var a,i,x,d;if(!l0)return{age:0};let n=Nt<(((a=t.face.ssrnet)==null?void 0:a.skipFrames)||0),s=(((i=t.face.ssrnet)==null?void 0:i.skipTime)||0)>P()-So;return t.skipAllowed&&n&&s&&jo===A&&((x=qe[o])==null?void 0:x.age)&&((d=qe[o])==null?void 0:d.age)>0?(Nt++,qe[o]):(Nt=0,new Promise(async l=>{if(!(l0!=null&&l0.inputs)||!l0.inputs[0]||!l0.inputs[0].shape)return;let y={};y.resize=r.image.resizeBilinear(e,[l0.inputs[0].shape[2],l0.inputs[0].shape[1]],!1),y.enhance=r.mul(y.resize,L.tf255);let c={age:0};if(t.face.ssrnet.enabled&&(y.age=l0.execute(y.enhance)),y.age){let f=await y.age.data();c.age=Math.trunc(10*f[0])/10}Object.keys(y).forEach(f=>r.dispose(y[f])),qe[o]=c,jo=A,So=P(),l(c)}))}var h0,Ue=[],Io=0,Oo=0,Bt=Number.MAX_SAFE_INTEGER,Gt=[.2989,.587,.114];async function No(e){return R.initial&&(h0=null),h0?e.debug&&g("cached model:",h0.modelUrl):h0=await N(e.face.ssrnet.modelPathGender),h0}async function Ht(e,t,o,A){var a,i,x,d;if(!h0)return{gender:"unknown",genderScore:0};let n=Bt<(((a=t.face.ssrnet)==null?void 0:a.skipFrames)||0),s=(((i=t.face.ssrnet)==null?void 0:i.skipTime)||0)>P()-Oo;return t.skipAllowed&&n&&s&&Io===A&&((x=Ue[o])==null?void 0:x.gender)&&((d=Ue[o])==null?void 0:d.genderScore)>0?(Bt++,Ue[o]):(Bt=0,new Promise(async l=>{if(!(h0!=null&&h0.inputs[0].shape))return;let y={};y.resize=r.image.resizeBilinear(e,[h0.inputs[0].shape[2],h0.inputs[0].shape[1]],!1),y.enhance=r.tidy(()=>{let[h,m,v]=r.split(y.resize,3,3),b=r.mul(h,Gt[0]),M=r.mul(m,Gt[1]),p=r.mul(v,Gt[2]),u=r.addN([b,M,p]);return r.mul(r.sub(u,L.tf05),2)});let c={gender:"unknown",genderScore:0};t.face.ssrnet.enabled&&(y.gender=h0.execute(y.enhance));let f=await y.gender.data();c.gender=f[0]>f[1]?"female":"male",c.genderScore=f[0]>f[1]?Math.trunc(100*f[0])/100:Math.trunc(100*f[1])/100,Object.keys(y).forEach(h=>r.dispose(y[h])),Ue[o]=c,Io=A,Oo=P(),l(c)}))}var A0,Je=[],Ft=Number.MAX_SAFE_INTEGER,Bo=0,Go=0;async function Ho(e){var t;return R.initial&&(A0=null),A0?e.debug&&g("cached model:",A0.modelUrl):A0=await N((t=e.face.antispoof)==null?void 0:t.modelPath),A0}async function Vt(e,t,o,A){var a,i;if(!A0)return 0;let n=(((a=t.face.antispoof)==null?void 0:a.skipTime)||0)>P()-Go,s=Ft<(((i=t.face.antispoof)==null?void 0:i.skipFrames)||0);return t.skipAllowed&&n&&s&&Bo===A&&Je[o]?(Ft++,Je[o]):(Ft=0,new Promise(async x=>{let d=r.image.resizeBilinear(e,[A0!=null&&A0.inputs[0].shape?A0.inputs[0].shape[2]:0,A0!=null&&A0.inputs[0].shape?A0.inputs[0].shape[1]:0],!1),l=A0==null?void 0:A0.execute(d),y=(await l.data())[0];Je[o]=Math.round(100*y)/100,Bo=A,Go=P(),r.dispose([d,l]),x(Je[o])}))}var b0={silhouette:[10,338,297,332,284,251,389,356,454,323,361,288,397,365,379,378,400,377,152,148,176,149,150,136,172,58,132,93,234,127,162,21,54,103,67,109],lipsUpperOuter:[61,185,40,39,37,0,267,269,270,409,291],lipsLowerOuter:[146,91,181,84,17,314,405,321,375,291],lipsUpperInner:[78,191,80,81,82,13,312,311,310,415,308],lipsLowerInner:[78,95,88,178,87,14,317,402,318,324,308],rightEyeUpper0:[246,161,160,159,158,157,173],rightEyeLower0:[33,7,163,144,145,153,154,155,133],rightEyeUpper1:[247,30,29,27,28,56,190],rightEyeLower1:[130,25,110,24,23,22,26,112,243],rightEyeUpper2:[113,225,224,223,222,221,189],rightEyeLower2:[226,31,228,229,230,231,232,233,244],rightEyeLower3:[143,111,117,118,119,120,121,128,245],rightEyebrowUpper:[156,70,63,105,66,107,55,193],rightEyebrowLower:[35,124,46,53,52,65],rightEyeIris:[473,474,475,476,477],leftEyeUpper0:[466,388,387,386,385,384,398],leftEyeLower0:[263,249,390,373,374,380,381,382,362],leftEyeUpper1:[467,260,259,257,258,286,414],leftEyeLower1:[359,255,339,254,253,252,256,341,463],leftEyeUpper2:[342,445,444,443,442,441,413],leftEyeLower2:[446,261,448,449,450,451,452,453,464],leftEyeLower3:[372,340,346,347,348,349,350,357,465],leftEyebrowUpper:[383,300,293,334,296,336,285,417],leftEyebrowLower:[265,353,276,283,282,295],leftEyeIris:[468,469,470,471,472],midwayBetweenEyes:[168],noseTip:[1],noseBottom:[2],noseRightCorner:[98],noseLeftCorner:[327],rightCheek:[205],leftCheek:[425]},Zt={count:468,mouth:13,symmetryLine:[13,b0.midwayBetweenEyes[0]]},We={leftEye:0,rightEye:1,nose:2,mouth:3,leftEar:4,rightEar:5,symmetryLine:[3,2]},Xt=[{key:"EyeUpper0",indices:[9,10,11,12,13,14,15]},{key:"EyeUpper1",indices:[25,26,27,28,29,30,31]},{key:"EyeUpper2",indices:[41,42,43,44,45,46,47]},{key:"EyeLower0",indices:[0,1,2,3,4,5,6,7,8]},{key:"EyeLower1",indices:[16,17,18,19,20,21,22,23,24]},{key:"EyeLower2",indices:[32,33,34,35,36,37,38,39,40]},{key:"EyeLower3",indices:[54,55,56,57,58,59,60,61,62]}],Ce=[[.499976992607117,.652534008026123],[.500025987625122,.547487020492554],[.499974012374878,.602371990680695],[.482113003730774,.471979022026062],[.500150978565216,.527155995368958],[.499909996986389,.498252987861633],[.499523013830185,.40106201171875],[.289712011814117,.380764007568359],[.499954998493195,.312398016452789],[.499987006187439,.269918978214264],[.500023007392883,.107050001621246],[.500023007392883,.666234016418457],[.5000159740448,.679224014282227],[.500023007392883,.692348003387451],[.499976992607117,.695277988910675],[.499976992607117,.70593398809433],[.499976992607117,.719385027885437],[.499976992607117,.737019002437592],[.499967992305756,.781370997428894],[.499816000461578,.562981009483337],[.473773002624512,.573909997940063],[.104906998574734,.254140973091125],[.365929991006851,.409575998783112],[.338757991790771,.41302502155304],[.311120003461838,.409460008144379],[.274657994508743,.389131009578705],[.393361985683441,.403706014156342],[.345234006643295,.344011008739471],[.370094001293182,.346076011657715],[.319321990013123,.347265005111694],[.297903001308441,.353591024875641],[.24779200553894,.410809993743896],[.396889001131058,.842755019664764],[.280097991228104,.375599980354309],[.106310002505779,.399955987930298],[.2099249958992,.391353011131287],[.355807989835739,.534406006336212],[.471751004457474,.65040397644043],[.474155008792877,.680191993713379],[.439785003662109,.657229006290436],[.414617002010345,.66654098033905],[.450374007225037,.680860996246338],[.428770989179611,.682690978050232],[.374971002340317,.727805018424988],[.486716985702515,.547628998756409],[.485300987958908,.527395009994507],[.257764995098114,.314490020275116],[.401223003864288,.455172002315521],[.429818987846375,.548614978790283],[.421351999044418,.533740997314453],[.276895999908447,.532056987285614],[.483370006084442,.499586999416351],[.33721199631691,.282882988452911],[.296391993761063,.293242990970612],[.169294998049736,.193813979625702],[.447580009698868,.302609980106354],[.392390012741089,.353887975215912],[.354490011930466,.696784019470215],[.067304998636246,.730105042457581],[.442739009857178,.572826027870178],[.457098007202148,.584792017936707],[.381974011659622,.694710969924927],[.392388999462128,.694203019142151],[.277076005935669,.271932005882263],[.422551989555359,.563233017921448],[.385919004678726,.281364023685455],[.383103013038635,.255840003490448],[.331431001424789,.119714021682739],[.229923993349075,.232002973556519],[.364500999450684,.189113974571228],[.229622006416321,.299540996551514],[.173287004232407,.278747975826263],[.472878992557526,.666198015213013],[.446828007698059,.668527007102966],[.422762006521225,.673889994621277],[.445307999849319,.580065965652466],[.388103008270264,.693961024284363],[.403039008378983,.706539988517761],[.403629004955292,.693953037261963],[.460041999816895,.557139039039612],[.431158006191254,.692366003990173],[.452181994915009,.692366003990173],[.475387006998062,.692366003990173],[.465828001499176,.779190003871918],[.472328990697861,.736225962638855],[.473087012767792,.717857003211975],[.473122000694275,.704625964164734],[.473033010959625,.695277988910675],[.427942007780075,.695277988910675],[.426479011774063,.703539967536926],[.423162013292313,.711845993995667],[.4183090031147,.720062971115112],[.390094995498657,.639572978019714],[.013953999616206,.560034036636353],[.499913990497589,.58014702796936],[.413199990987778,.69539999961853],[.409626007080078,.701822996139526],[.468080013990402,.601534962654114],[.422728985548019,.585985004901886],[.463079988956451,.593783974647522],[.37211999297142,.47341400384903],[.334562003612518,.496073007583618],[.411671012639999,.546965003013611],[.242175996303558,.14767599105835],[.290776997804642,.201445996761322],[.327338010072708,.256527006626129],[.399509996175766,.748921036720276],[.441727995872498,.261676013469696],[.429764986038208,.187834024429321],[.412198007106781,.108901023864746],[.288955003023148,.398952007293701],[.218936994671822,.435410976409912],[.41278201341629,.398970007896423],[.257135003805161,.355440020561218],[.427684992551804,.437960982322693],[.448339998722076,.536936044692993],[.178560003638268,.45755398273468],[.247308000922203,.457193970680237],[.286267012357712,.467674970626831],[.332827985286713,.460712015628815],[.368755996227264,.447206974029541],[.398963987827301,.432654976844788],[.476410001516342,.405806005001068],[.189241006970406,.523923993110657],[.228962004184723,.348950982093811],[.490725994110107,.562400996685028],[.404670000076294,.485132992267609],[.019469000399113,.401564002037048],[.426243007183075,.420431017875671],[.396993011236191,.548797011375427],[.266469985246658,.376977026462555],[.439121007919312,.51895797252655],[.032313998788595,.644356966018677],[.419054001569748,.387154996395111],[.462783008813858,.505746960639954],[.238978996872902,.779744982719421],[.198220998048782,.831938028335571],[.107550002634525,.540755033493042],[.183610007166862,.740257024765015],[.134409993886948,.333683013916016],[.385764002799988,.883153975009918],[.490967005491257,.579378008842468],[.382384985685349,.508572995662689],[.174399003386497,.397670984268188],[.318785011768341,.39623498916626],[.343364000320435,.400596976280212],[.396100014448166,.710216999053955],[.187885001301765,.588537991046906],[.430987000465393,.944064974784851],[.318993002176285,.898285031318665],[.266247987747192,.869701027870178],[.500023007392883,.190576016902924],[.499976992607117,.954452991485596],[.366169989109039,.398822009563446],[.393207013607025,.39553701877594],[.410373002290726,.391080021858215],[.194993004202843,.342101991176605],[.388664990663528,.362284004688263],[.365961998701096,.355970978736877],[.343364000320435,.355356991291046],[.318785011768341,.35834002494812],[.301414996385574,.363156020641327],[.058132998645306,.319076001644135],[.301414996385574,.387449026107788],[.499987989664078,.618434011936188],[.415838003158569,.624195992946625],[.445681989192963,.566076993942261],[.465844005346298,.620640993118286],[.49992299079895,.351523995399475],[.288718998432159,.819945991039276],[.335278987884521,.852819979190826],[.440512001514435,.902418971061707],[.128294005990028,.791940987110138],[.408771991729736,.373893976211548],[.455606997013092,.451801002025604],[.499877005815506,.908990025520325],[.375436991453171,.924192011356354],[.11421000212431,.615022003650665],[.448662012815475,.695277988910675],[.4480200111866,.704632043838501],[.447111994028091,.715808033943176],[.444831997156143,.730794012546539],[.430011987686157,.766808986663818],[.406787008047104,.685672998428345],[.400738000869751,.681069016456604],[.392399996519089,.677703022956848],[.367855995893478,.663918972015381],[.247923001646996,.601333022117615],[.452769994735718,.420849978923798],[.43639200925827,.359887003898621],[.416164010763168,.368713974952698],[.413385987281799,.692366003990173],[.228018000721931,.683571994304657],[.468268007040024,.352671027183533],[.411361992359161,.804327011108398],[.499989002943039,.469825029373169],[.479153990745544,.442654013633728],[.499974012374878,.439637005329132],[.432112008333206,.493588984012604],[.499886006116867,.866917014122009],[.49991300702095,.821729004383087],[.456548988819122,.819200992584229],[.344549000263214,.745438992977142],[.37890899181366,.574010014533997],[.374292999505997,.780184984207153],[.319687992334366,.570737957954407],[.357154995203018,.604269981384277],[.295284003019333,.621580958366394],[.447750002145767,.862477004528046],[.410986006259918,.508723020553589],[.31395098567009,.775308012962341],[.354128003120422,.812552988529205],[.324548006057739,.703992962837219],[.189096003770828,.646299958229065],[.279776990413666,.71465802192688],[.1338230073452,.682700991630554],[.336768001317978,.644733011722565],[.429883986711502,.466521978378296],[.455527991056442,.548622965812683],[.437114000320435,.558896005153656],[.467287987470627,.529924988746643],[.414712011814117,.335219979286194],[.37704598903656,.322777986526489],[.344107985496521,.320150971412659],[.312875986099243,.32233202457428],[.283526003360748,.333190023899078],[.241245999932289,.382785975933075],[.102986000478268,.468762993812561],[.267612010240555,.424560010433197],[.297879010438919,.433175981044769],[.333433985710144,.433878004550934],[.366427004337311,.426115989685059],[.396012008190155,.416696012020111],[.420121014118195,.41022801399231],[.007561000064015,.480777025222778],[.432949006557465,.569517970085144],[.458638995885849,.479089021682739],[.473466008901596,.545744001865387],[.476087987422943,.563830018043518],[.468472003936768,.555056989192963],[.433990985155106,.582361996173859],[.483518004417419,.562983989715576],[.482482999563217,.57784903049469],[.42645001411438,.389798998832703],[.438998997211456,.39649498462677],[.450067013502121,.400434017181396],[.289712011814117,.368252992630005],[.276670008897781,.363372981548309],[.517862021923065,.471948027610779],[.710287988185883,.380764007568359],[.526226997375488,.573909997940063],[.895093023777008,.254140973091125],[.634069979190826,.409575998783112],[.661242008209229,.41302502155304],[.688880026340485,.409460008144379],[.725341975688934,.389131009578705],[.606630027294159,.40370500087738],[.654766023159027,.344011008739471],[.629905998706818,.346076011657715],[.680678009986877,.347265005111694],[.702096998691559,.353591024875641],[.75221198797226,.410804986953735],[.602918028831482,.842862963676453],[.719901978969574,.375599980354309],[.893692970275879,.399959981441498],[.790081977844238,.391354024410248],[.643998026847839,.534487962722778],[.528249025344849,.65040397644043],[.525849997997284,.680191040039062],[.560214996337891,.657229006290436],[.585384011268616,.66654098033905],[.549625992774963,.680860996246338],[.57122802734375,.682691991329193],[.624852001667023,.72809898853302],[.513050019741058,.547281980514526],[.51509702205658,.527251958847046],[.742246985435486,.314507007598877],[.598631024360657,.454979002475739],[.570338010787964,.548575043678284],[.578631997108459,.533622980117798],[.723087012767792,.532054007053375],[.516445994377136,.499638974666595],[.662801027297974,.282917976379395],[.70362401008606,.293271005153656],[.830704987049103,.193813979625702],[.552385985851288,.302568018436432],[.607609987258911,.353887975215912],[.645429015159607,.696707010269165],[.932694971561432,.730105042457581],[.557260990142822,.572826027870178],[.542901992797852,.584792017936707],[.6180260181427,.694710969924927],[.607590973377228,.694203019142151],[.722943007946014,.271963000297546],[.577413976192474,.563166975975037],[.614082992076874,.281386971473694],[.616907000541687,.255886018276215],[.668509006500244,.119913995265961],[.770092010498047,.232020974159241],[.635536015033722,.189248979091644],[.77039098739624,.299556016921997],[.826722025871277,.278755009174347],[.527121007442474,.666198015213013],[.553171992301941,.668527007102966],[.577238023281097,.673889994621277],[.554691970348358,.580065965652466],[.611896991729736,.693961024284363],[.59696102142334,.706539988517761],[.596370995044708,.693953037261963],[.539958000183105,.557139039039612],[.568841993808746,.692366003990173],[.547818005084991,.692366003990173],[.52461302280426,.692366003990173],[.534089982509613,.779141008853912],[.527670979499817,.736225962638855],[.526912987232208,.717857003211975],[.526877999305725,.704625964164734],[.526966989040375,.695277988910675],[.572058022022247,.695277988910675],[.573521018028259,.703539967536926],[.57683801651001,.711845993995667],[.581691026687622,.720062971115112],[.609944999217987,.639909982681274],[.986046016216278,.560034036636353],[.5867999792099,.69539999961853],[.590372025966644,.701822996139526],[.531915009021759,.601536989212036],[.577268004417419,.585934996604919],[.536915004253387,.593786001205444],[.627542972564697,.473352015018463],[.665585994720459,.495950996875763],[.588353991508484,.546862006187439],[.757824003696442,.14767599105835],[.709249973297119,.201507985591888],[.672684013843536,.256581008434296],[.600408971309662,.74900496006012],[.55826598405838,.261672019958496],[.570303976535797,.187870979309082],[.588165998458862,.109044015407562],[.711045026779175,.398952007293701],[.781069993972778,.435405015945435],[.587247014045715,.398931980133057],[.742869973182678,.355445981025696],[.572156012058258,.437651991844177],[.55186802148819,.536570012569427],[.821442008018494,.457556009292603],[.752701997756958,.457181990146637],[.71375697851181,.467626988887787],[.66711300611496,.460672974586487],[.631101012229919,.447153985500336],[.6008620262146,.432473003864288],[.523481011390686,.405627012252808],[.810747981071472,.523926019668579],[.771045982837677,.348959028720856],[.509127020835876,.562718033790588],[.595292985439301,.485023975372314],[.980530977249146,.401564002037048],[.573499977588654,.420000016689301],[.602994978427887,.548687994480133],[.733529984951019,.376977026462555],[.560611009597778,.519016981124878],[.967685997486115,.644356966018677],[.580985009670258,.387160003185272],[.537728011608124,.505385041236877],[.760966002941132,.779752969741821],[.801778972148895,.831938028335571],[.892440974712372,.54076099395752],[.816350996494293,.740260004997253],[.865594983100891,.333687007427216],[.614073991775513,.883246004581451],[.508952975273132,.579437971115112],[.617941975593567,.508316040039062],[.825608015060425,.397674977779388],[.681214988231659,.39623498916626],[.656635999679565,.400596976280212],[.603900015354156,.710216999053955],[.81208598613739,.588539004325867],[.56801301240921,.944564998149872],[.681007981300354,.898285031318665],[.733752012252808,.869701027870178],[.633830010890961,.398822009563446],[.606792986392975,.39553701877594],[.589659988880157,.391062021255493],[.805015981197357,.342108011245728],[.611334979534149,.362284004688263],[.634037971496582,.355970978736877],[.656635999679565,.355356991291046],[.681214988231659,.35834002494812],[.698584973812103,.363156020641327],[.941866993904114,.319076001644135],[.698584973812103,.387449026107788],[.584177017211914,.624107003211975],[.554318010807037,.566076993942261],[.534153997898102,.62064003944397],[.711217999458313,.819975018501282],[.664629995822906,.852871000766754],[.559099972248077,.902631998062134],[.871706008911133,.791940987110138],[.591234028339386,.373893976211548],[.544341027736664,.451583981513977],[.624562978744507,.924192011356354],[.88577002286911,.615028977394104],[.551338016986847,.695277988910675],[.551980018615723,.704632043838501],[.552887976169586,.715808033943176],[.555167973041534,.730794012546539],[.569944024085999,.767035007476807],[.593203008174896,.685675978660583],[.599261999130249,.681069016456604],[.607599973678589,.677703022956848],[.631937980651855,.663500010967255],[.752032995223999,.601315021514893],[.547226011753082,.420395016670227],[.563543975353241,.359827995300293],[.583841025829315,.368713974952698],[.586614012718201,.692366003990173],[.771915018558502,.683578014373779],[.531597018241882,.352482974529266],[.588370978832245,.804440975189209],[.52079701423645,.442565023899078],[.567984998226166,.493479013442993],[.543282985687256,.819254994392395],[.655317008495331,.745514988899231],[.621008992195129,.574018001556396],[.625559985637665,.78031200170517],[.680198013782501,.570719003677368],[.64276397228241,.604337990283966],[.704662978649139,.621529996395111],[.552012026309967,.862591981887817],[.589071989059448,.508637011051178],[.685944974422455,.775357007980347],[.645735025405884,.812640011310577],[.675342977046967,.703978002071381],[.810858011245728,.646304965019226],[.72012197971344,.714666962623596],[.866151988506317,.682704985141754],[.663187026977539,.644596993923187],[.570082008838654,.466325998306274],[.544561982154846,.548375964164734],[.562758982181549,.558784961700439],[.531987011432648,.530140042304993],[.585271000862122,.335177004337311],[.622952997684479,.32277899980545],[.655896008014679,.320163011550903],[.687132000923157,.322345972061157],[.716481983661652,.333200991153717],[.758756995201111,.382786989212036],[.897013008594513,.468769013881683],[.732392013072968,.424547016620636],[.70211398601532,.433162987232208],[.66652500629425,.433866024017334],[.633504986763,.426087975502014],[.603875994682312,.416586995124817],[.579657971858978,.409945011138916],[.992439985275269,.480777025222778],[.567192018032074,.569419980049133],[.54136598110199,.478899002075195],[.526564002037048,.546118021011353],[.523913025856018,.563830018043518],[.531529009342194,.555056989192963],[.566035985946655,.582329034805298],[.51631098985672,.563053965568542],[.5174720287323,.577877044677734],[.573594987392426,.389806985855103],[.560697972774506,.395331978797913],[.549755990505219,.399751007556915],[.710287988185883,.368252992630005],[.723330020904541,.363372981548309]],K0=[127,34,139,11,0,37,232,231,120,72,37,39,128,121,47,232,121,128,104,69,67,175,171,148,157,154,155,118,50,101,73,39,40,9,151,108,48,115,131,194,204,211,74,40,185,80,42,183,40,92,186,230,229,118,202,212,214,83,18,17,76,61,146,160,29,30,56,157,173,106,204,194,135,214,192,203,165,98,21,71,68,51,45,4,144,24,23,77,146,91,205,50,187,201,200,18,91,106,182,90,91,181,85,84,17,206,203,36,148,171,140,92,40,39,193,189,244,159,158,28,247,246,161,236,3,196,54,68,104,193,168,8,117,228,31,189,193,55,98,97,99,126,47,100,166,79,218,155,154,26,209,49,131,135,136,150,47,126,217,223,52,53,45,51,134,211,170,140,67,69,108,43,106,91,230,119,120,226,130,247,63,53,52,238,20,242,46,70,156,78,62,96,46,53,63,143,34,227,173,155,133,123,117,111,44,125,19,236,134,51,216,206,205,154,153,22,39,37,167,200,201,208,36,142,100,57,212,202,20,60,99,28,158,157,35,226,113,160,159,27,204,202,210,113,225,46,43,202,204,62,76,77,137,123,116,41,38,72,203,129,142,64,98,240,49,102,64,41,73,74,212,216,207,42,74,184,169,170,211,170,149,176,105,66,69,122,6,168,123,147,187,96,77,90,65,55,107,89,90,180,101,100,120,63,105,104,93,137,227,15,86,85,129,102,49,14,87,86,55,8,9,100,47,121,145,23,22,88,89,179,6,122,196,88,95,96,138,172,136,215,58,172,115,48,219,42,80,81,195,3,51,43,146,61,171,175,199,81,82,38,53,46,225,144,163,110,246,33,7,52,65,66,229,228,117,34,127,234,107,108,69,109,108,151,48,64,235,62,78,191,129,209,126,111,35,143,163,161,246,117,123,50,222,65,52,19,125,141,221,55,65,3,195,197,25,7,33,220,237,44,70,71,139,122,193,245,247,130,33,71,21,162,153,158,159,170,169,150,188,174,196,216,186,92,144,160,161,2,97,167,141,125,241,164,167,37,72,38,12,145,159,160,38,82,13,63,68,71,226,35,111,158,153,154,101,50,205,206,92,165,209,198,217,165,167,97,220,115,218,133,112,243,239,238,241,214,135,169,190,173,133,171,208,32,125,44,237,86,87,178,85,86,179,84,85,180,83,84,181,201,83,182,137,93,132,76,62,183,61,76,184,57,61,185,212,57,186,214,207,187,34,143,156,79,239,237,123,137,177,44,1,4,201,194,32,64,102,129,213,215,138,59,166,219,242,99,97,2,94,141,75,59,235,24,110,228,25,130,226,23,24,229,22,23,230,26,22,231,112,26,232,189,190,243,221,56,190,28,56,221,27,28,222,29,27,223,30,29,224,247,30,225,238,79,20,166,59,75,60,75,240,147,177,215,20,79,166,187,147,213,112,233,244,233,128,245,128,114,188,114,217,174,131,115,220,217,198,236,198,131,134,177,132,58,143,35,124,110,163,7,228,110,25,356,389,368,11,302,267,452,350,349,302,303,269,357,343,277,452,453,357,333,332,297,175,152,377,384,398,382,347,348,330,303,304,270,9,336,337,278,279,360,418,262,431,304,408,409,310,415,407,270,409,410,450,348,347,422,430,434,313,314,17,306,307,375,387,388,260,286,414,398,335,406,418,364,367,416,423,358,327,251,284,298,281,5,4,373,374,253,307,320,321,425,427,411,421,313,18,321,405,406,320,404,405,315,16,17,426,425,266,377,400,369,322,391,269,417,465,464,386,257,258,466,260,388,456,399,419,284,332,333,417,285,8,346,340,261,413,441,285,327,460,328,355,371,329,392,439,438,382,341,256,429,420,360,364,394,379,277,343,437,443,444,283,275,440,363,431,262,369,297,338,337,273,375,321,450,451,349,446,342,467,293,334,282,458,461,462,276,353,383,308,324,325,276,300,293,372,345,447,382,398,362,352,345,340,274,1,19,456,248,281,436,427,425,381,256,252,269,391,393,200,199,428,266,330,329,287,273,422,250,462,328,258,286,384,265,353,342,387,259,257,424,431,430,342,353,276,273,335,424,292,325,307,366,447,345,271,303,302,423,266,371,294,455,460,279,278,294,271,272,304,432,434,427,272,407,408,394,430,431,395,369,400,334,333,299,351,417,168,352,280,411,325,319,320,295,296,336,319,403,404,330,348,349,293,298,333,323,454,447,15,16,315,358,429,279,14,15,316,285,336,9,329,349,350,374,380,252,318,402,403,6,197,419,318,319,325,367,364,365,435,367,397,344,438,439,272,271,311,195,5,281,273,287,291,396,428,199,311,271,268,283,444,445,373,254,339,263,466,249,282,334,296,449,347,346,264,447,454,336,296,299,338,10,151,278,439,455,292,407,415,358,371,355,340,345,372,390,249,466,346,347,280,442,443,282,19,94,370,441,442,295,248,419,197,263,255,359,440,275,274,300,383,368,351,412,465,263,467,466,301,368,389,380,374,386,395,378,379,412,351,419,436,426,322,373,390,388,2,164,393,370,462,461,164,0,267,302,11,12,374,373,387,268,12,13,293,300,301,446,261,340,385,384,381,330,266,425,426,423,391,429,355,437,391,327,326,440,457,438,341,382,362,459,457,461,434,430,394,414,463,362,396,369,262,354,461,457,316,403,402,315,404,403,314,405,404,313,406,405,421,418,406,366,401,361,306,408,407,291,409,408,287,410,409,432,436,410,434,416,411,264,368,383,309,438,457,352,376,401,274,275,4,421,428,262,294,327,358,433,416,367,289,455,439,462,370,326,2,326,370,305,460,455,254,449,448,255,261,446,253,450,449,252,451,450,256,452,451,341,453,452,413,464,463,441,413,414,258,442,441,257,443,442,259,444,443,260,445,444,467,342,445,459,458,250,289,392,290,290,328,460,376,433,435,250,290,392,411,416,433,341,463,464,453,464,465,357,465,412,343,412,399,360,363,440,437,399,456,420,456,363,401,435,288,372,383,353,339,255,249,448,261,255,133,243,190,133,155,112,33,246,247,33,130,25,398,384,286,362,398,414,362,463,341,263,359,467,263,249,255,466,467,260,75,60,166,238,239,79,162,127,139,72,11,37,121,232,120,73,72,39,114,128,47,233,232,128,103,104,67,152,175,148,173,157,155,119,118,101,74,73,40,107,9,108,49,48,131,32,194,211,184,74,185,191,80,183,185,40,186,119,230,118,210,202,214,84,83,17,77,76,146,161,160,30,190,56,173,182,106,194,138,135,192,129,203,98,54,21,68,5,51,4,145,144,23,90,77,91,207,205,187,83,201,18,181,91,182,180,90,181,16,85,17,205,206,36,176,148,140,165,92,39,245,193,244,27,159,28,30,247,161,174,236,196,103,54,104,55,193,8,111,117,31,221,189,55,240,98,99,142,126,100,219,166,218,112,155,26,198,209,131,169,135,150,114,47,217,224,223,53,220,45,134,32,211,140,109,67,108,146,43,91,231,230,120,113,226,247,105,63,52,241,238,242,124,46,156,95,78,96,70,46,63,116,143,227,116,123,111,1,44,19,3,236,51,207,216,205,26,154,22,165,39,167,199,200,208,101,36,100,43,57,202,242,20,99,56,28,157,124,35,113,29,160,27,211,204,210,124,113,46,106,43,204,96,62,77,227,137,116,73,41,72,36,203,142,235,64,240,48,49,64,42,41,74,214,212,207,183,42,184,210,169,211,140,170,176,104,105,69,193,122,168,50,123,187,89,96,90,66,65,107,179,89,180,119,101,120,68,63,104,234,93,227,16,15,85,209,129,49,15,14,86,107,55,9,120,100,121,153,145,22,178,88,179,197,6,196,89,88,96,135,138,136,138,215,172,218,115,219,41,42,81,5,195,51,57,43,61,208,171,199,41,81,38,224,53,225,24,144,110,105,52,66,118,229,117,227,34,234,66,107,69,10,109,151,219,48,235,183,62,191,142,129,126,116,111,143,7,163,246,118,117,50,223,222,52,94,19,141,222,221,65,196,3,197,45,220,44,156,70,139,188,122,245,139,71,162,145,153,159,149,170,150,122,188,196,206,216,92,163,144,161,164,2,167,242,141,241,0,164,37,11,72,12,144,145,160,12,38,13,70,63,71,31,226,111,157,158,154,36,101,205,203,206,165,126,209,217,98,165,97,237,220,218,237,239,241,210,214,169,140,171,32,241,125,237,179,86,178,180,85,179,181,84,180,182,83,181,194,201,182,177,137,132,184,76,183,185,61,184,186,57,185,216,212,186,192,214,187,139,34,156,218,79,237,147,123,177,45,44,4,208,201,32,98,64,129,192,213,138,235,59,219,141,242,97,97,2,141,240,75,235,229,24,228,31,25,226,230,23,229,231,22,230,232,26,231,233,112,232,244,189,243,189,221,190,222,28,221,223,27,222,224,29,223,225,30,224,113,247,225,99,60,240,213,147,215,60,20,166,192,187,213,243,112,244,244,233,245,245,128,188,188,114,174,134,131,220,174,217,236,236,198,134,215,177,58,156,143,124,25,110,7,31,228,25,264,356,368,0,11,267,451,452,349,267,302,269,350,357,277,350,452,357,299,333,297,396,175,377,381,384,382,280,347,330,269,303,270,151,9,337,344,278,360,424,418,431,270,304,409,272,310,407,322,270,410,449,450,347,432,422,434,18,313,17,291,306,375,259,387,260,424,335,418,434,364,416,391,423,327,301,251,298,275,281,4,254,373,253,375,307,321,280,425,411,200,421,18,335,321,406,321,320,405,314,315,17,423,426,266,396,377,369,270,322,269,413,417,464,385,386,258,248,456,419,298,284,333,168,417,8,448,346,261,417,413,285,326,327,328,277,355,329,309,392,438,381,382,256,279,429,360,365,364,379,355,277,437,282,443,283,281,275,363,395,431,369,299,297,337,335,273,321,348,450,349,359,446,467,283,293,282,250,458,462,300,276,383,292,308,325,283,276,293,264,372,447,346,352,340,354,274,19,363,456,281,426,436,425,380,381,252,267,269,393,421,200,428,371,266,329,432,287,422,290,250,328,385,258,384,446,265,342,386,387,257,422,424,430,445,342,276,422,273,424,306,292,307,352,366,345,268,271,302,358,423,371,327,294,460,331,279,294,303,271,304,436,432,427,304,272,408,395,394,431,378,395,400,296,334,299,6,351,168,376,352,411,307,325,320,285,295,336,320,319,404,329,330,349,334,293,333,366,323,447,316,15,315,331,358,279,317,14,316,8,285,9,277,329,350,253,374,252,319,318,403,351,6,419,324,318,325,397,367,365,288,435,397,278,344,439,310,272,311,248,195,281,375,273,291,175,396,199,312,311,268,276,283,445,390,373,339,295,282,296,448,449,346,356,264,454,337,336,299,337,338,151,294,278,455,308,292,415,429,358,355,265,340,372,388,390,466,352,346,280,295,442,282,354,19,370,285,441,295,195,248,197,457,440,274,301,300,368,417,351,465,251,301,389,385,380,386,394,395,379,399,412,419,410,436,322,387,373,388,326,2,393,354,370,461,393,164,267,268,302,12,386,374,387,312,268,13,298,293,301,265,446,340,380,385,381,280,330,425,322,426,391,420,429,437,393,391,326,344,440,438,458,459,461,364,434,394,428,396,262,274,354,457,317,316,402,316,315,403,315,314,404,314,313,405,313,421,406,323,366,361,292,306,407,306,291,408,291,287,409,287,432,410,427,434,411,372,264,383,459,309,457,366,352,401,1,274,4,418,421,262,331,294,358,435,433,367,392,289,439,328,462,326,94,2,370,289,305,455,339,254,448,359,255,446,254,253,449,253,252,450,252,256,451,256,341,452,414,413,463,286,441,414,286,258,441,258,257,442,257,259,443,259,260,444,260,467,445,309,459,250,305,289,290,305,290,460,401,376,435,309,250,392,376,411,433,453,341,464,357,453,465,343,357,412,437,343,399,344,360,440,420,437,456,360,420,363,361,401,288,265,372,353,390,339,249,339,448,255];var wr=[127,234,132,58,172,150,149,148,152,377,378,379,397,288,361,454,356,70,63,105,66,107,336,296,334,293,300,168,6,195,4,98,97,2,326,327,33,160,158,133,153,144,362,385,387,263,373,380,57,40,37,0,267,270,287,321,314,17,84,91,78,81,13,311,308,402,14,178],kr=[33,133,362,263,1,62,308,159,145,386,374,6,102,331,2,13,14,70,105,107,336,334,300,54,10,284,50,280,234,454,58,288,152],Er=[33,133,362,263,1,78,308],vs=wr.map(e=>Ce[e]),Ts=kr.map(e=>Ce[e]),Rs=Er.map(e=>Ce[e]);var le=e=>[Math.abs(e.endPoint[0]-e.startPoint[0]),Math.abs(e.endPoint[1]-e.startPoint[1])],Ye=e=>[e.startPoint[0]+(e.endPoint[0]-e.startPoint[0])/2,e.startPoint[1]+(e.endPoint[1]-e.startPoint[1])/2,1],Jt=(e,t)=>e?[Math.trunc(Math.max(0,e.startPoint[0])),Math.trunc(Math.max(0,e.startPoint[1])),Math.trunc(Math.min(t.shape[2]||0,e.endPoint[0])-Math.max(0,e.startPoint[0])),Math.trunc(Math.min(t.shape[1]||0,e.endPoint[1])-Math.max(0,e.startPoint[1]))]:[0,0,0,0],Yt=(e,t)=>e?[e.startPoint[0]/(t.shape[2]||0),e.startPoint[1]/(t.shape[1]||0),(e.endPoint[0]-e.startPoint[0])/(t.shape[2]||0),(e.endPoint[1]-e.startPoint[1])/(t.shape[1]||0)]:[0,0,0,0],Xo=(e,t)=>{let o=[e.startPoint[0]*t[0],e.startPoint[1]*t[1]],A=[e.endPoint[0]*t[0],e.endPoint[1]*t[1]];return{startPoint:o,endPoint:A,landmarks:e.landmarks,confidence:e.confidence}},qt=(e,t,o)=>{let A=t.shape[1],n=t.shape[2],s=[e.startPoint[1]/A,e.startPoint[0]/n,e.endPoint[1]/A,e.endPoint[0]/n],a=r.image.cropAndResize(t,[s],[0],o),i=r.div(a,L.tf255);return r.dispose(a),i},Ke=(e,t)=>{let o=Ye(e),A=le(e),n=[t*A[0]/2,t*A[1]/2];return{startPoint:[o[0]-n[0],o[1]-n[1]],endPoint:[o[0]+n[0],o[1]+n[1]],landmarks:e.landmarks,confidence:e.confidence}},Qe=e=>{let t=Ye(e),o=le(e),A=Math.max(...o)/2;return{startPoint:[Math.round(t[0]-A),Math.round(t[1]-A)],endPoint:[Math.round(t[0]+A),Math.round(t[1]+A)],landmarks:e.landmarks,confidence:e.confidence}},Do=e=>{let t=e.map(A=>A[0]),o=e.map(A=>A[1]);return{startPoint:[Math.min(...t),Math.min(...o)],endPoint:[Math.max(...t),Math.max(...o)],landmarks:e}},Ut=[[1,0,0],[0,1,0],[0,0,1]],zr=e=>e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI)),jr=(e,t)=>zr(Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]));var Vo=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]],Q0=(e,t)=>{let o=0;for(let A=0;A{let o=[];for(let A=0;A{let o=[],A=e.length;for(let n=0;n{let o=Math.cos(e),A=Math.sin(e),n=[[o,-A,0],[A,o,0],[0,0,1]],s=Vo(t[0],t[1]),a=Zo(s,n),i=Vo(-t[0],-t[1]);return Zo(a,i)},Wr=e=>{let t=[[e[0][0],e[1][0]],[e[0][1],e[1][1]]],o=[e[0][2],e[1][2]],A=[-Q0(t[0],o),-Q0(t[1],o)];return[t[0].concat(A[0]),t[1].concat(A[1]),[0,0,1]]},Cr=(e,t)=>[Q0(e,t[0]),Q0(e,t[1])];function Uo(e){let t={strides:[e/16,e/8],anchors:[2,6]},o=[];for(let A=0;A[s[0]/n*(f[0]-n/2),s[1]/n*(f[1]-n/2),f[2]||0]),i=o&&o!==0&&Math.abs(o)>.2,x=i?qo(o,[0,0]):Ut,d=i?a.map(f=>[...Cr(f,x),f[2]]):a,l=i?Wr(A):Ut,y=Ye(t),c=[Q0(y,l[0]),Q0(y,l[1])];return d.map(f=>[Math.trunc(f[0]+c[0]),Math.trunc(f[1]+c[1]),Math.trunc(f[2]||0)])}function Yo(e,t,o,A){let n=t.landmarks.length>=Zt.count?Zt.symmetryLine:We.symmetryLine,s=0,a=Ut,i;if(e&&R.kernels.includes("rotatewithoffset"))if(s=jr(t.landmarks[n[0]],t.landmarks[n[1]]),s&&s!==0&&Math.abs(s)>.2){let d=Ye(t),l=[d[0]/o.shape[2],d[1]/o.shape[1]],y=r.image.rotateWithOffset(o,s,0,l);a=qo(-s,d),i=qt(t,y,[A,A]),r.dispose(y)}else i=qt(t,o,[A,A]);else i=qt(t,o,[A,A]);return[s,a,i]}var Ir=e=>{let t=e.map(A=>A[0]),o=e.map(A=>A[1]);return[Math.min(...t)+(Math.max(...t)-Math.min(...t))/2,Math.min(...o)+(Math.max(...o)-Math.min(...o))/2]},Ko=(e,t)=>{let o=Ir(e),A=le(t);return{startPoint:[o[0]-A[0]/2,o[1]-A[1]/2],endPoint:[o[0]+A[0]/2,o[1]+A[1]/2]}};var Qo=6,Or=1.2,T0,_o=null,H0=0,Ie=null,_e=()=>H0;async function $o(e){var t;return R.initial&&(T0=null),T0?e.debug&&g("cached model:",T0.modelUrl):T0=await N((t=e.face.detector)==null?void 0:t.modelPath),H0=T0.inputs[0].shape?T0.inputs[0].shape[2]:0,Ie=r.scalar(H0,"int32"),_o=r.tensor2d(Uo(H0)),T0}function Nr(e){let t={};t.boxStarts=r.slice(e,[0,1],[-1,2]),t.centers=r.add(t.boxStarts,_o),t.boxSizes=r.slice(e,[0,3],[-1,2]),t.boxSizesNormalized=r.div(t.boxSizes,Ie),t.centersNormalized=r.div(t.centers,Ie),t.halfBoxSize=r.div(t.boxSizesNormalized,L.tf2),t.starts=r.sub(t.centersNormalized,t.halfBoxSize),t.ends=r.add(t.centersNormalized,t.halfBoxSize),t.startNormalized=r.mul(t.starts,Ie),t.endNormalized=r.mul(t.ends,Ie);let o=r.concat2d([t.startNormalized,t.endNormalized],1);return Object.keys(t).forEach(A=>r.dispose(t[A])),o}async function eA(e,t){var i,x,d,l;if(!e||e.isDisposedInternal||e.shape.length!==4||e.shape[1]<1||e.shape[2]<1)return[];let o={};o.resized=r.image.resizeBilinear(e,[H0,H0]),o.div=r.div(o.resized,L.tf127),o.normalized=r.sub(o.div,L.tf05);let A=T0==null?void 0:T0.execute(o.normalized);if(Array.isArray(A)){let y=A.sort((c,f)=>c.size-f.size);o.concat384=r.concat([y[0],y[2]],2),o.concat512=r.concat([y[1],y[3]],2),o.concat=r.concat([o.concat512,o.concat384],1),o.batch=r.squeeze(o.concat,0)}else o.batch=r.squeeze(A);r.dispose(A),o.boxes=Nr(o.batch),o.logits=r.slice(o.batch,[0,0],[-1,1]),o.sigmoid=r.sigmoid(o.logits),o.scores=r.squeeze(o.sigmoid),o.nms=await r.image.nonMaxSuppressionAsync(o.boxes,o.scores,((i=t.face.detector)==null?void 0:i.maxDetected)||0,((x=t.face.detector)==null?void 0:x.iouThreshold)||0,((d=t.face.detector)==null?void 0:d.minConfidence)||0);let n=await o.nms.array(),s=[],a=await o.scores.data();for(let y=0;y(((l=t.face.detector)==null?void 0:l.minConfidence)||0)){let f={};f.bbox=r.slice(o.boxes,[n[y],0],[1,-1]),f.slice=r.slice(o.batch,[n[y],Qo-1],[1,-1]),f.squeeze=r.squeeze(f.slice),f.landmarks=r.reshape(f.squeeze,[Qo,-1]);let h=await f.bbox.data(),m={startPoint:[h[0],h[1]],endPoint:[h[2],h[3]],landmarks:await f.landmarks.array(),confidence:c},v=Xo(m,[(e.shape[2]||0)/H0,(e.shape[1]||0)/H0]),b=Ke(v,t.face.scale||Or),M=Qe(b);s.push(M),Object.keys(f).forEach(p=>r.dispose(f[p]))}}return Object.keys(o).forEach(y=>r.dispose(o[y])),s}var $e={};Ze($e,{connected:()=>_t,kpt:()=>Qt});var Qt=["nose","leftEyeInside","leftEye","leftEyeOutside","rightEyeInside","rightEye","rightEyeOutside","leftEar","rightEar","leftMouth","rightMouth","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftPinky","rightPinky","leftIndex","rightIndex","leftThumb","rightThumb","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle","leftHeel","rightHeel","leftFoot","rightFoot","bodyCenter","bodyTop","leftPalm","leftHand","rightPalm","rightHand"],_t={shoulders:["leftShoulder","rightShoulder"],hips:["rightHip","leftHip"],mouth:["leftMouth","rightMouth"],leftLegUpper:["leftHip","leftKnee"],leftLegLower:["leftKnee","leftAnkle"],leftFoot:["leftAnkle","leftHeel","leftFoot"],leftTorso:["leftShoulder","leftHip"],leftArmUpper:["leftShoulder","leftElbow"],leftArmLower:["leftElbow","leftWrist"],leftHand:["leftWrist","leftPalm"],leftHandPinky:["leftPalm","leftPinky"],leftHandIndex:["leftPalm","leftIndex"],leftHandThumb:["leftPalm","leftThumb"],leftEyeOutline:["leftEyeInside","leftEyeOutside"],rightLegUpper:["rightHip","rightKnee"],rightLegLower:["rightKnee","rightAnkle"],rightFoot:["rightAnkle","rightHeel","rightFoot"],rightTorso:["rightShoulder","rightHip"],rightArmUpper:["rightShoulder","rightElbow"],rightArmLower:["rightElbow","rightWrist"],rightHand:["rightWrist","rightPalm"],rightHandPinky:["rightPalm","rightPinky"],rightHandIndex:["rightPalm","rightIndex"],rightHandThumb:["rightPalm","rightThumb"],rightEyeOutline:["rightEyeInside","rightEyeOutside"]};var oA=224,Lr,Br=5,et=[8,16,32,32,32];async function AA(){let e=[],t=0;for(;to.x)),y:r.tensor1d(e.map(o=>o.y))}}function S0(e,t=[1,1]){let o=[e.map(i=>i[0]),e.map(i=>i[1])],A=[Math.min(...o[0]),Math.min(...o[1])],n=[Math.max(...o[0]),Math.max(...o[1])],s=[A[0],A[1],n[0]-A[0],n[1]-A[1]],a=[s[0]/t[0],s[1]/t[1],s[2]/t[0],s[3]/t[1]];return{box:s,boxRaw:a}}function nA(e,t=[1,1]){let o=[e.map(d=>d[0]),e.map(d=>d[1])],A=[Math.min(...o[0]),Math.min(...o[1])],n=[Math.max(...o[0]),Math.max(...o[1])],s=[(A[0]+n[0])/2,(A[1]+n[1])/2],a=Math.max(s[0]-A[0],s[1]-A[1],-s[0]+n[0],-s[1]+n[1]),i=[Math.trunc(s[0]-a),Math.trunc(s[1]-a),Math.trunc(2*a),Math.trunc(2*a)],x=[i[0]/t[0],i[1]/t[1],i[2]/t[0],i[3]/t[1]];return{box:i,boxRaw:x}}function tt(e,t){let o=[e[2]*t,e[3]*t];return[e[0]-(o[0]-e[2])/2,e[1]-(o[1]-e[3])/2,o[0],o[1]]}var aA={initial:!0},y0={detector:null,landmarks:null},ye={detector:[224,224],landmarks:[256,256]},$t=Number.MAX_SAFE_INTEGER,Hr={landmarks:["ld_3d","activation_segmentation","activation_heatmap","world_3d","output_poseflag"],detector:[]},At=null,Oe,F0=[[0,0],[0,0],[0,0],[0,0]],rA=0,sA=e=>1-1/(1+Math.exp(e));async function iA(e){if(aA.initial&&(y0.detector=null),!y0.detector&&e.body.detector&&e.body.detector.modelPath){y0.detector=await N(e.body.detector.modelPath);let t=Object.values(y0.detector.modelSignature.inputs);ye.detector[0]=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0,ye.detector[1]=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):0}else e.debug&&y0.detector&&g("cached model:",y0.detector.modelUrl);return await AA(),y0.detector}async function lA(e){if(aA.initial&&(y0.landmarks=null),y0.landmarks)e.debug&&g("cached model:",y0.landmarks.modelUrl);else{y0.landmarks=await N(e.body.modelPath);let t=Object.values(y0.landmarks.modelSignature.inputs);ye.landmarks[0]=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0,ye.landmarks[1]=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):0}return y0.landmarks}async function Fr(e,t){let o={};if(!e.shape||!e.shape[1]||!e.shape[2])return e;let A;if(Oe&&(o.cropped=r.image.cropAndResize(e,[Oe],[0],[e.shape[1],e.shape[2]])),e.shape[1]!==e.shape[2]){let n=[e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],s=[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0];F0=[[0,0],n,s,[0,0]],o.pad=r.pad(o.cropped||e,F0),o.resize=r.image.resizeBilinear(o.pad,[t,t]),A=r.div(o.resize,L.tf255)}else e.shape[1]!==t?(o.resize=r.image.resizeBilinear(o.cropped||e,[t,t]),A=r.div(o.resize,L.tf255)):A=r.div(o.cropped||e,L.tf255);return Object.keys(o).forEach(n=>r.dispose(o[n])),A}function Vr(e,t){for(let o of e)o.position=[Math.trunc(o.position[0]*(t[0]+F0[2][0]+F0[2][1])/t[0]-F0[2][0]),Math.trunc(o.position[1]*(t[1]+F0[1][0]+F0[1][1])/t[1]-F0[1][0]),o.position[2]],o.positionRaw=[o.position[0]/t[0],o.position[1]/t[1],2*o.position[2]/(t[0]+t[1])];if(Oe)for(let o of e)o.positionRaw=[o.positionRaw[0]+Oe[1],o.positionRaw[1]+Oe[0],o.positionRaw[2]],o.position=[Math.trunc(o.positionRaw[0]*t[0]),Math.trunc(o.positionRaw[1]*t[1]),o.positionRaw[2]];return e}async function Zr(e){let t=e.find(i=>i.part==="leftPalm"),o=e.find(i=>i.part==="leftWrist"),A=e.find(i=>i.part==="leftIndex");t.position[2]=((o.position[2]||0)+(A.position[2]||0))/2;let n=e.find(i=>i.part==="rightPalm"),s=e.find(i=>i.part==="rightWrist"),a=e.find(i=>i.part==="rightIndex");n.position[2]=((s.position[2]||0)+(a.position[2]||0))/2}async function Xr(e,t,o){var h;let A={};[A.ld,A.segmentation,A.heatmap,A.world,A.poseflag]=(h=y0.landmarks)==null?void 0:h.execute(e,Hr.landmarks);let n=(await A.poseflag.data())[0],s=await A.ld.data(),a=await A.world.data();Object.keys(A).forEach(m=>r.dispose(A[m]));let i=[],x=5;for(let m=0;mm.position),y=S0(l,[o[0],o[1]]),c={};for(let[m,v]of Object.entries(_t)){let b=[];for(let M=0;ME.part===v[M]),u=d.find(E=>E.part===v[M+1]);p&&u&&b.push([p.position,u.position])}c[m]=b}return{id:0,score:Math.trunc(100*n)/100,box:y.box,boxRaw:y.boxRaw,keypoints:d,annotations:c}}async function e5(e,t){let o=[e.shape[2]||0,e.shape[1]||0],A=(t.body.skipTime||0)>P()-rA,n=$t<(t.body.skipFrames||0);if(t.skipAllowed&&A&&n&&At!==null)$t++;else{let s={};s.landmarks=await Fr(e,256),At=await Xr(s.landmarks,t,o),Object.keys(s).forEach(a=>r.dispose(s[a])),rA=P(),$t=0}return At?[At]:[]}var xe=[{class:1,label:"person"},{class:2,label:"bicycle"},{class:3,label:"car"},{class:4,label:"motorcycle"},{class:5,label:"airplane"},{class:6,label:"bus"},{class:7,label:"train"},{class:8,label:"truck"},{class:9,label:"boat"},{class:10,label:"traffic light"},{class:11,label:"fire hydrant"},{class:12,label:"stop sign"},{class:13,label:"parking meter"},{class:14,label:"bench"},{class:15,label:"bird"},{class:16,label:"cat"},{class:17,label:"dog"},{class:18,label:"horse"},{class:19,label:"sheep"},{class:20,label:"cow"},{class:21,label:"elephant"},{class:22,label:"bear"},{class:23,label:"zebra"},{class:24,label:"giraffe"},{class:25,label:"backpack"},{class:26,label:"umbrella"},{class:27,label:"handbag"},{class:28,label:"tie"},{class:29,label:"suitcase"},{class:30,label:"frisbee"},{class:31,label:"skis"},{class:32,label:"snowboard"},{class:33,label:"sports ball"},{class:34,label:"kite"},{class:35,label:"baseball bat"},{class:36,label:"baseball glove"},{class:37,label:"skateboard"},{class:38,label:"surfboard"},{class:39,label:"tennis racket"},{class:40,label:"bottle"},{class:41,label:"wine glass"},{class:42,label:"cup"},{class:43,label:"fork"},{class:44,label:"knife"},{class:45,label:"spoon"},{class:46,label:"bowl"},{class:47,label:"banana"},{class:48,label:"apple"},{class:49,label:"sandwich"},{class:50,label:"orange"},{class:51,label:"broccoli"},{class:52,label:"carrot"},{class:53,label:"hot dog"},{class:54,label:"pizza"},{class:55,label:"donut"},{class:56,label:"cake"},{class:57,label:"chair"},{class:58,label:"couch"},{class:59,label:"potted plant"},{class:60,label:"bed"},{class:61,label:"dining table"},{class:62,label:"toilet"},{class:63,label:"tv"},{class:64,label:"laptop"},{class:65,label:"mouse"},{class:66,label:"remote"},{class:67,label:"keyboard"},{class:68,label:"cell phone"},{class:69,label:"microwave"},{class:70,label:"oven"},{class:71,label:"toaster"},{class:72,label:"sink"},{class:73,label:"refrigerator"},{class:74,label:"book"},{class:75,label:"clock"},{class:76,label:"vase"},{class:77,label:"scissors"},{class:78,label:"teddy bear"},{class:79,label:"hair drier"},{class:80,label:"toothbrush"}];var W0,_0=0,t5=[],xA=0,o5=Number.MAX_SAFE_INTEGER;async function cA(e){if(R.initial&&(W0=null),W0)e.debug&&g("cached model:",W0.modelUrl);else{W0=await N(e.object.modelPath);let t=Object.values(W0.modelSignature.inputs);_0=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):0}return W0}async function Dr(e,t,o){if(!e)return[];let A={},n=[],s=await e.array();A.squeeze=r.squeeze(e);let a=r.split(A.squeeze,6,1);A.stack=r.stack([a[1],a[0],a[3],a[2]],1),A.boxes=r.squeeze(A.stack),A.scores=r.squeeze(a[4]),A.classes=r.squeeze(a[5]),r.dispose([e,...a]),A.nms=await r.image.nonMaxSuppressionAsync(A.boxes,A.scores,o.object.maxDetected,o.object.iouThreshold,o.object.minConfidence||0);let i=await A.nms.data(),x=0;for(let d of Array.from(i)){let l=Math.trunc(100*s[0][d][4])/100,y=s[0][d][5],c=xe[y].label,[f,h]=[s[0][d][0]/_0,s[0][d][1]/_0],m=[f,h,s[0][d][2]/_0-f,s[0][d][3]/_0-h],v=[Math.trunc(m[0]*t[0]),Math.trunc(m[1]*t[1]),Math.trunc(m[2]*t[0]),Math.trunc(m[3]*t[1])];n.push({id:x++,score:l,class:y,label:c,box:v,boxRaw:m})}return Object.keys(A).forEach(d=>r.dispose(A[d])),n}async function A5(e,t){let o=(t.object.skipTime||0)>P()-xA,A=o5<(t.object.skipFrames||0);return t.skipAllowed&&o&&A&&t5.length>0?(o5++,t5):(o5=0,new Promise(async n=>{let s=[e.shape[2]||0,e.shape[1]||0],a=r.image.resizeBilinear(e,[_0,_0]),i=t.object.enabled?W0==null?void 0:W0.execute(a,["tower_0/detections"]):null;xA=P(),r.dispose(a);let x=await Dr(i,s,t);t5=x,n(x)}))}var nt={};Ze(nt,{connected:()=>r5,kpt:()=>n5});var n5=["head","neck","rightShoulder","rightElbow","rightWrist","chest","leftShoulder","leftElbow","leftWrist","bodyCenter","rightHip","rightKnee","rightAnkle","leftHip","leftKnee","leftAnkle"],r5={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var n0,fA=0,a0={id:0,keypoints:[],box:[0,0,0,0],boxRaw:[0,0,0,0],score:0,annotations:{}},s5=Number.MAX_SAFE_INTEGER;async function mA(e){return R.initial&&(n0=null),n0?e.debug&&g("cached model:",n0.modelUrl):n0=await N(e.body.modelPath),n0}async function qr(e,t){let[o,A]=e.shape,n=r.reshape(e,[A*o]),s=r.max(n,0),a=(await s.data())[0];if(r.dispose([n,s]),a>t){let i=r.argMax(n,0),x=r.mod(i,o),d=(await x.data())[0],l=r.div(i,r.scalar(o,"int32")),y=(await l.data())[0];return r.dispose([x,l]),[d,y,a]}return[0,0,a]}async function a5(e,t){let o=(t.body.skipTime||0)>P()-fA,A=s5<(t.body.skipFrames||0);return t.skipAllowed&&o&&A&&Object.keys(a0.keypoints).length>0?(s5++,[a0]):(s5=0,new Promise(async n=>{var y;let s=r.tidy(()=>{if(!(n0!=null&&n0.inputs[0].shape))return null;let c=r.image.resizeBilinear(e,[n0.inputs[0].shape[2],n0.inputs[0].shape[1]],!1),f=r.mul(c,L.tf2);return r.sub(f,L.tf1)}),a;if(t.body.enabled&&(a=n0==null?void 0:n0.execute(s)),fA=P(),r.dispose(s),a){a0.keypoints.length=0;let c=a.squeeze();r.dispose(a);let f=c.unstack(2);r.dispose(c);for(let h=0;h(((y=t.body)==null?void 0:y.minConfidence)||0)&&a0.keypoints.push({score:Math.round(100*b)/100,part:n5[h],positionRaw:[m/n0.inputs[0].shape[2],v/n0.inputs[0].shape[1]],position:[Math.round(e.shape[2]*m/n0.inputs[0].shape[2]),Math.round(e.shape[1]*v/n0.inputs[0].shape[1])]})}f.forEach(h=>r.dispose(h))}a0.score=a0.keypoints.reduce((c,f)=>f.score>c?f.score:c,0);let i=a0.keypoints.map(c=>c.position[0]),x=a0.keypoints.map(c=>c.position[1]);a0.box=[Math.min(...i),Math.min(...x),Math.max(...i)-Math.min(...i),Math.max(...x)-Math.min(...x)];let d=a0.keypoints.map(c=>c.positionRaw[0]),l=a0.keypoints.map(c=>c.positionRaw[1]);a0.boxRaw=[Math.min(...d),Math.min(...l),Math.max(...d)-Math.min(...d),Math.max(...l)-Math.min(...l)];for(let[c,f]of Object.entries(r5)){let h=[];for(let m=0;mM.part===f[m]),b=a0.keypoints.find(M=>M.part===f[m+1]);v&&b&&v.score>(t.body.minConfidence||0)&&b.score>(t.body.minConfidence||0)&&h.push([v.position,b.position])}a0.annotations[c]=h}n([a0])}))}var Ur=["angry","disgust","fear","happy","sad","surprise","neutral"],p0,rt=[],uA=0,hA=0,i5=Number.MAX_SAFE_INTEGER;async function bA(e){var t;return R.initial&&(p0=null),p0?e.debug&&g("cached model:",p0.modelUrl):p0=await N((t=e.face.emotion)==null?void 0:t.modelPath),p0}async function l5(e,t,o,A){var a,i;if(!p0)return[];let n=i5<(((a=t.face.emotion)==null?void 0:a.skipFrames)||0),s=(((i=t.face.emotion)==null?void 0:i.skipTime)||0)>P()-hA;return t.skipAllowed&&s&&n&&uA===A&&rt[o]&&rt[o].length>0?(i5++,rt[o]):(i5=0,new Promise(async x=>{var l,y;let d=[];if((l=t.face.emotion)!=null&&l.enabled){let c={},f=p0!=null&&p0.inputs[0].shape?p0.inputs[0].shape[2]:0;c.resize=r.image.resizeBilinear(e,[f,f],!1),c.channels=r.mul(c.resize,L.rgb),c.grayscale=r.sum(c.channels,3,!0),c.grayscaleSub=r.sub(c.grayscale,L.tf05),c.grayscaleMul=r.mul(c.grayscaleSub,L.tf2),c.emotion=p0==null?void 0:p0.execute(c.grayscaleMul),hA=P();let h=await c.emotion.data();for(let m=0;m(((y=t.face.emotion)==null?void 0:y.minConfidence)||0)&&d.push({score:Math.min(.99,Math.trunc(100*h[m])/100),emotion:Ur[m]});d.sort((m,v)=>v.score-m.score),Object.keys(c).forEach(m=>r.dispose(c[m]))}rt[o]=d,uA=A,x(d)}))}var x0,y5=[],PA=0,MA=0,vA=Number.MAX_SAFE_INTEGER;async function TA(e){return R.initial&&(x0=null),x0?e.debug&&g("cached model:",x0.modelUrl):x0=await N(e.face.mobilefacenet.modelPath),x0}async function x5(e,t,o,A){var a,i;if(!x0)return[];let n=vA<(((a=t.face.embedding)==null?void 0:a.skipFrames)||0),s=(((i=t.face.embedding)==null?void 0:i.skipTime)||0)>P()-MA;return t.skipAllowed&&s&&n&&PA===A&&y5[o]?(vA++,y5[o]):new Promise(async x=>{var l;let d=[];if(((l=t.face.embedding)==null?void 0:l.enabled)&&(x0==null?void 0:x0.inputs[0].shape)){let y={};y.crop=r.image.resizeBilinear(e,[x0.inputs[0].shape[2],x0.inputs[0].shape[1]],!1),y.data=x0==null?void 0:x0.execute(y.crop);let c=await y.data.data();d=Array.from(c)}y5[o]=d,PA=A,MA=P(),x(d)})}var C0,V0=0,Jr=2.3,c5=b0.leftEyeLower0,d5=b0.rightEyeLower0,ce={leftBounds:[c5[0],c5[c5.length-1]],rightBounds:[d5[0],d5[d5.length-1]]},de={upperCenter:3,lowerCenter:4,index:71,numCoordinates:76};async function zA(e){var t;return R.initial&&(C0=null),C0?e.debug&&g("cached model:",C0.modelUrl):C0=await N((t=e.face.iris)==null?void 0:t.modelPath),V0=C0.inputs[0].shape?C0.inputs[0].shape[2]:0,V0===-1&&(V0=64),C0}function st(e,t,o,A){for(let n=0;n{let t=e[ce.leftBounds[0]][2],o=e[ce.rightBounds[0]][2];return t-o},wA=(e,t,o,A,n,s=!1)=>{let a=Qe(Ke(Do([e[o],e[A]]),Jr)),i=le(a),x=r.image.cropAndResize(t,[[a.startPoint[1]/n,a.startPoint[0]/n,a.endPoint[1]/n,a.endPoint[0]/n]],[0],[V0,V0]);if(s&&R.kernels.includes("flipleftright")){let d=r.image.flipLeftRight(x);r.dispose(x),x=d}return{box:a,boxSize:i,crop:x}},kA=(e,t,o,A=!1)=>{let n=[];for(let s=0;s{let A=e[b0[`${o}EyeUpper0`][de.upperCenter]][2],n=e[b0[`${o}EyeLower0`][de.lowerCenter]][2],s=(A+n)/2;return t.map((a,i)=>{let x=s;return i===2?x=A:i===4&&(x=n),[a[0],a[1],x]})};async function jA(e,t,o,A){if(!C0)return o.debug&&g("face mesh iris detection requested, but model is not loaded"),e;let{box:n,boxSize:s,crop:a}=wA(e,t,ce.leftBounds[0],ce.leftBounds[1],A,!0),{box:i,boxSize:x,crop:d}=wA(e,t,ce.rightBounds[0],ce.rightBounds[1],A,!0),l=r.concat([a,d]);r.dispose(a),r.dispose(d);let y=C0.execute(l);r.dispose(l);let c=await y.data();r.dispose(y);let f=c.slice(0,de.numCoordinates*3),{rawCoords:h,iris:m}=kA(f,n,s,!0),v=c.slice(de.numCoordinates*3),{rawCoords:b,iris:M}=kA(v,i,x),p=Yr(e);Math.abs(p)<30?(st(e,h,"left",null),st(e,b,"right",null)):p<1?st(e,h,"left",["EyeUpper0","EyeLower0"]):st(e,b,"right",["EyeUpper0","EyeLower0"]);let u=EA(e,m,"left"),E=EA(e,M,"right");return e.concat(u).concat(E)}var R0={boxes:[],skipped:Number.MAX_SAFE_INTEGER,timestamp:0},I0=null,fe=0;async function WA(e,t){var i,x,d,l,y,c,f,h,m;let o=(((i=t.face.detector)==null?void 0:i.skipTime)||0)>P()-R0.timestamp,A=R0.skipped<(((x=t.face.detector)==null?void 0:x.skipFrames)||0);!t.skipAllowed||!o||!A||R0.boxes.length===0?(R0.boxes=await eA(e,t),R0.timestamp=P(),R0.skipped=0):R0.skipped++;let n=[],s=[],a=0;for(let v=0;v[H[0]/(e.shape[2]||0),H[1]/(e.shape[1]||0),(H[2]||0)/fe]);for(let H of Object.keys(b0))u.annotations[H]=b0[H].map(t0=>u.mesh[t0]);u.score=u.faceScore;let B={...Ko(u.mesh,b),confidence:b.confidence,landmarks:b.landmarks};u.box=Jt(B,e),u.boxRaw=Yt(B,e),s.push(B)}}else{u.box=Jt(b,e),u.boxRaw=Yt(b,e),u.score=u.boxScore,u.mesh=b.landmarks.map(E=>[(b.startPoint[0]+b.endPoint[0])/2+(b.endPoint[0]+b.startPoint[0])*E[0]/_e(),(b.startPoint[1]+b.endPoint[1])/2+(b.endPoint[1]+b.startPoint[1])*E[1]/_e()]),u.meshRaw=u.mesh.map(E=>[E[0]/(e.shape[2]||0),E[1]/(e.shape[1]||0),(E[2]||0)/fe]);for(let E of Object.keys(We))u.annotations[E]=[u.mesh[We[E]]]}u.score>(((m=t.face.detector)==null?void 0:m.minConfidence)||1)?n.push(u):r.dispose(u.tensor)}return R0.boxes=s,n}async function CA(e){var t;return R.initial&&(I0=null),I0?e.debug&&g("cached model:",I0.modelUrl):I0=await N((t=e.face.mesh)==null?void 0:t.modelPath),fe=I0.inputs[0].shape?I0.inputs[0].shape[2]:0,I0}var IA=K0,OA=Ce;var c0,at=[],NA=0,LA=0,m5=Number.MAX_SAFE_INTEGER;async function BA(e){var t;return R.initial&&(c0=null),c0?e.debug&&g("cached model:",c0.modelUrl):c0=await N((t=e.face.description)==null?void 0:t.modelPath),c0}function p5(e){let t=e.image||e.tensor||e;if(!(c0!=null&&c0.inputs[0].shape))return t;let o=r.image.resizeBilinear(t,[c0.inputs[0].shape[2],c0.inputs[0].shape[1]],!1),A=r.mul(o,L.tf255);return r.dispose(o),A}async function u5(e,t,o,A){var a,i,x,d;if(!c0)return{age:0,gender:"unknown",genderScore:0,descriptor:[]};let n=m5<(((a=t.face.description)==null?void 0:a.skipFrames)||0),s=(((i=t.face.description)==null?void 0:i.skipTime)||0)>P()-NA;return t.skipAllowed&&n&&s&&LA===A&&((x=at[o])==null?void 0:x.age)&&((d=at[o])==null?void 0:d.age)>0?(m5++,at[o]):(m5=0,new Promise(async l=>{var c,f;let y={age:0,gender:"unknown",genderScore:0,descriptor:[]};if((c=t.face.description)!=null&&c.enabled){let h=p5(e),m=c0==null?void 0:c0.execute(h);NA=P(),r.dispose(h);let b=await(await m.find(O=>O.shape[1]===1)).data(),M=Math.trunc(200*Math.abs(b[0]-.5))/100;M>(((f=t.face.description)==null?void 0:f.minConfidence)||0)&&(y.gender=b[0]<=.5?"female":"male",y.genderScore=Math.min(.99,M));let p=r.argMax(m.find(O=>O.shape[1]===100),1),u=(await p.data())[0];r.dispose(p);let W=await m.find(O=>O.shape[1]===100).data();y.age=Math.round(W[u-1]>W[u+1]?10*u-100*W[u-1]:10*u+100*W[u+1])/10;let C=m.find(O=>O.shape[1]===1024),S=C?await C.data():[];y.descriptor=Array.from(S),m.forEach(O=>r.dispose(O))}at[o]=y,LA=A,l(y)}))}function it(e){return[Math.abs(e.endPoint[0]-e.startPoint[0]),Math.abs(e.endPoint[1]-e.startPoint[1])]}function Ne(e){return[e.startPoint[0]+(e.endPoint[0]-e.startPoint[0])/2,e.startPoint[1]+(e.endPoint[1]-e.startPoint[1])/2]}function FA(e,t,o){let A=t.shape[1],n=t.shape[2],s=[[e.startPoint[1]/A,e.startPoint[0]/n,e.endPoint[1]/A,e.endPoint[0]/n]];return r.image.cropAndResize(t,s,[0],o)}function VA(e,t){let o=[e.startPoint[0]*t[0],e.startPoint[1]*t[1]],A=[e.endPoint[0]*t[0],e.endPoint[1]*t[1]],n=e.palmLandmarks.map(s=>[s[0]*t[0],s[1]*t[1]]);return{startPoint:o,endPoint:A,palmLandmarks:n,confidence:e.confidence}}function lt(e,t=1.5){let o=Ne(e),A=it(e),n=[t*A[0]/2,t*A[1]/2],s=[o[0]-n[0],o[1]-n[1]],a=[o[0]+n[0],o[1]+n[1]];return{startPoint:s,endPoint:a,palmLandmarks:e.palmLandmarks}}function yt(e){let t=Ne(e),o=it(e),n=Math.max(...o)/2,s=[t[0]-n,t[1]-n],a=[t[0]+n,t[1]+n];return{startPoint:s,endPoint:a,palmLandmarks:e.palmLandmarks}}function Kr(e){return e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI))}function ZA(e,t){let o=Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]);return Kr(o)}var GA=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]];function Z0(e,t){let o=0;for(let A=0;A[o.x,o.y]),this.anchorsTensor=r.tensor2d(this.anchors),this.inputSize=this.model&&this.model.inputs&&this.model.inputs[0].shape?this.model.inputs[0].shape[2]:0,this.inputSizeTensor=r.tensor1d([this.inputSize,this.inputSize]),this.doubleInputSizeTensor=r.tensor1d([this.inputSize*2,this.inputSize*2])}normalizeBoxes(t){let o={};o.boxOffsets=r.slice(t,[0,0],[-1,2]),o.boxSizes=r.slice(t,[0,2],[-1,2]),o.div=r.div(o.boxOffsets,this.inputSizeTensor),o.boxCenterPoints=r.add(o.div,this.anchorsTensor),o.halfBoxSizes=r.div(o.boxSizes,this.doubleInputSizeTensor),o.sub=r.sub(o.boxCenterPoints,o.halfBoxSizes),o.startPoints=r.mul(o.sub,this.inputSizeTensor),o.add=r.add(o.boxCenterPoints,o.halfBoxSizes),o.endPoints=r.mul(o.add,this.inputSizeTensor);let A=r.concat2d([o.startPoints,o.endPoints],1);return Object.keys(o).forEach(n=>r.dispose(o[n])),A}normalizeLandmarks(t,o){let A={};A.reshape=r.reshape(t,[-1,7,2]),A.div=r.div(A.reshape,this.inputSizeTensor),A.landmarks=r.add(A.div,this.anchors[o]);let n=r.mul(A.landmarks,this.inputSizeTensor);return Object.keys(A).forEach(s=>r.dispose(A[s])),n}async predict(t,o){let A={};A.resize=r.image.resizeBilinear(t,[this.inputSize,this.inputSize]),A.div=r.div(A.resize,L.tf127),A.image=r.sub(A.div,L.tf1),A.batched=this.model.execute(A.image),A.predictions=r.squeeze(A.batched),A.slice=r.slice(A.predictions,[0,0],[-1,1]),A.sigmoid=r.sigmoid(A.slice),A.scores=r.squeeze(A.sigmoid);let n=await A.scores.data();A.boxes=r.slice(A.predictions,[0,1],[-1,4]),A.norm=this.normalizeBoxes(A.boxes),A.nms=await r.image.nonMaxSuppressionAsync(A.norm,A.scores,3*o.hand.maxDetected,o.hand.iouThreshold,o.hand.minConfidence);let s=await A.nms.array(),a=[];for(let i of s){let x={};x.box=r.slice(A.norm,[i,0],[1,-1]),x.slice=r.slice(A.predictions,[i,5],[1,14]),x.norm=this.normalizeLandmarks(x.slice,i),x.palmLandmarks=r.reshape(x.norm,[-1,2]);let d=await x.box.data(),l=d.slice(0,2),y=d.slice(2,4),c=await x.palmLandmarks.array(),f={startPoint:l,endPoint:y,palmLandmarks:c,confidence:n[i]},h=VA(f,[t.shape[2]/this.inputSize,t.shape[1]/this.inputSize]);a.push(h),Object.keys(x).forEach(m=>r.dispose(x[m]))}return Object.keys(A).forEach(i=>r.dispose(A[i])),a}};var e2=5,UA=1.65,JA=[0,5,9,13,17,1,2],t2=0,o2=2,YA=0,M5=class{constructor(t,o){w(this,"handDetector");w(this,"handPoseModel");w(this,"inputSize");w(this,"storedBoxes");w(this,"skipped");w(this,"detectedHands");this.handDetector=t,this.handPoseModel=o,this.inputSize=this.handPoseModel&&this.handPoseModel.inputs[0].shape?this.handPoseModel.inputs[0].shape[2]:0,this.storedBoxes=[],this.skipped=Number.MAX_SAFE_INTEGER,this.detectedHands=0}calculateLandmarksBoundingBox(t){let o=t.map(a=>a[0]),A=t.map(a=>a[1]),n=[Math.min(...o),Math.min(...A)],s=[Math.max(...o),Math.max(...A)];return{startPoint:n,endPoint:s}}getBoxForPalmLandmarks(t,o){let A=t.map(s=>g5([...s,1],o)),n=this.calculateLandmarksBoundingBox(A);return lt(yt(n),e2)}getBoxForHandLandmarks(t){let o=this.calculateLandmarksBoundingBox(t),A=lt(yt(o),UA);A.palmLandmarks=[];for(let n=0;n[a[0]*(f[0]-this.inputSize/2),a[1]*(f[1]-this.inputSize/2),a[2]*f[2]]),x=b5(A,[0,0]),d=i.map(f=>[...g5(f,x),f[2]]),l=XA(n),y=[...Ne(o),1],c=[Z0(y,l[0]),Z0(y,l[1])];return d.map(f=>[Math.trunc(f[0]+c[0]),Math.trunc(f[1]+c[1]),Math.trunc(f[2])])}async estimateHands(t,o){let A=!1,n,s=(o.hand.skipTime||0)>P()-YA,a=this.skipped<(o.hand.skipFrames||0);o.skipAllowed&&s&&a&&(n=await this.handDetector.predict(t,o),this.skipped=0),o.skipAllowed&&this.skipped++,n&&n.length>0&&(n.length!==this.detectedHands&&this.detectedHands!==o.hand.maxDetected||!o.hand.landmarks)&&(this.detectedHands=0,this.storedBoxes=[...n],this.storedBoxes.length>0&&(A=!0));let i=[];for(let x=0;x=o.hand.minConfidence/4){let E=r.reshape(p,[-1,3]),W=await E.array();r.dispose(p),r.dispose(E);let C=this.transformRawCoords(W,m,l,h),S=this.getBoxForHandLandmarks(C);this.storedBoxes[x]={...S,confidence:u};let O={landmarks:C,confidence:u,boxConfidence:d.confidence,fingerConfidence:u,box:{topLeft:S.startPoint,bottomRight:S.endPoint}};i.push(O)}else this.storedBoxes[x]=null;r.dispose(p)}else{let l=lt(yt(d),UA),y={confidence:d.confidence,boxConfidence:d.confidence,fingerConfidence:0,box:{topLeft:l.startPoint,bottomRight:l.endPoint},landmarks:[]};i.push(y)}}return this.storedBoxes=this.storedBoxes.filter(x=>x!==null),this.detectedHands=i.length,i.length>o.hand.maxDetected&&(i.length=o.hand.maxDetected),i}};var i0={thumb:0,index:1,middle:2,ring:3,pinky:4,all:[0,1,2,3,4],nameMapping:{0:"thumb",1:"index",2:"middle",3:"ring",4:"pinky"},pointsMapping:{0:[[0,1],[1,2],[2,3],[3,4]],1:[[0,5],[5,6],[6,7],[7,8]],2:[[0,9],[9,10],[10,11],[11,12]],3:[[0,13],[13,14],[14,15],[15,16]],4:[[0,17],[17,18],[18,19],[19,20]]},getName:e=>i0.nameMapping[e],getPoints:e=>i0.pointsMapping[e]},X0={none:0,half:1,full:2,nameMapping:{0:"none",1:"half",2:"full"},getName:e=>X0.nameMapping[e]},U={verticalUp:0,verticalDown:1,horizontalLeft:2,horizontalRight:3,diagonalUpRight:4,diagonalUpLeft:5,diagonalDownRight:6,diagonalDownLeft:7,nameMapping:{0:"verticalUp",1:"verticalDown",2:"horizontalLeft",3:"horizontalRight",4:"diagonalUpRight",5:"diagonalUpLeft",6:"diagonalDownRight",7:"diagonalDownLeft"},getName:e=>U.nameMapping[e]},$0=class{constructor(t){w(this,"name");w(this,"curls");w(this,"directions");w(this,"weights");w(this,"weightsRelative");this.name=t,this.curls={},this.directions={},this.weights=[1,1,1,1,1],this.weightsRelative=[1,1,1,1,1]}curl(t,o,A){typeof this.curls[t]=="undefined"&&(this.curls[t]=[]),this.curls[t].push([o,A])}direction(t,o,A){this.directions[t]||(this.directions[t]=[]),this.directions[t].push([o,A])}weight(t,o){this.weights[t]=o;let A=this.weights.reduce((n,s)=>n+s,0);this.weightsRelative=this.weights.map(n=>n*5/A)}matchAgainst(t,o){let A=0;for(let n in t){let s=t[n],a=this.curls[n];if(typeof a=="undefined"){A+=this.weightsRelative[n];continue}for(let[i,x]of a)if(s===i){A+=x*this.weightsRelative[n];break}}for(let n in o){let s=o[n],a=this.directions[n];if(typeof a=="undefined"){A+=this.weightsRelative[n];continue}for(let[i,x]of a)if(s===i){A+=x*this.weightsRelative[n];break}}return A/10}};var{thumb:g0,index:O0,middle:N0,ring:ee,pinky:te}=i0,{none:P0,half:n2,full:M0}=X0,{verticalUp:me,verticalDown:fa,horizontalLeft:v5,horizontalRight:r2,diagonalUpRight:s2,diagonalUpLeft:pe,diagonalDownRight:ma,diagonalDownLeft:pa}=U,D0=new $0("thumbs up");D0.curl(g0,P0,1);D0.direction(g0,me,1);D0.direction(g0,pe,.25);D0.direction(g0,s2,.25);for(let e of[i0.index,i0.middle,i0.ring,i0.pinky])D0.curl(e,M0,1),D0.direction(e,v5,1),D0.direction(e,r2,1);var K=new $0("victory");K.curl(g0,n2,.5);K.curl(g0,P0,.5);K.direction(g0,me,1);K.direction(g0,pe,1);K.curl(O0,P0,1);K.direction(O0,me,.75);K.direction(O0,pe,1);K.curl(N0,P0,1);K.direction(N0,me,1);K.direction(N0,pe,.75);K.curl(ee,M0,1);K.direction(ee,me,.2);K.direction(ee,pe,1);K.direction(ee,v5,.2);K.curl(te,M0,1);K.direction(te,me,.2);K.direction(te,pe,1);K.direction(te,v5,.2);K.weight(O0,2);K.weight(N0,2);var q0=new $0("point");q0.curl(g0,M0,1);q0.curl(O0,P0,.5);q0.curl(N0,M0,.5);q0.curl(ee,M0,.5);q0.curl(te,M0,.5);q0.weight(O0,2);q0.weight(N0,2);var U0=new $0("middle finger");U0.curl(g0,P0,1);U0.curl(O0,M0,.5);U0.curl(N0,M0,.5);U0.curl(ee,M0,.5);U0.curl(te,M0,.5);U0.weight(O0,2);U0.weight(N0,2);var ue=new $0("open palm");ue.curl(g0,P0,.75);ue.curl(O0,P0,.75);ue.curl(N0,P0,.75);ue.curl(ee,P0,.75);ue.curl(te,P0,.75);var KA=[D0,K,q0,U0,ue];var a2=.7,oe={HALF_CURL_START_LIMIT:60,NO_CURL_START_LIMIT:130,DISTANCE_VOTE_POWER:1.1,SINGLE_ANGLE_VOTE_POWER:.9,TOTAL_ANGLE_VOTE_POWER:1.6};function QA(e,t,o,A){let n=(t-A)/(e-o),s=Math.atan(n)*180/Math.PI;return s<=0?s=-s:s>0&&(s=180-s),s}function $A(e,t){if(!e||!t)return[0,0];let o=QA(e[0],e[1],t[0],t[1]);if(e.length===2)return o;let A=QA(e[1],e[2],t[1],t[2]);return[o,A]}function _A(e,t=1){let o=0,A=0,n=0;return e>=75&&e<=105?o=1*t:e>=25&&e<=155?A=1*t:n=1*t,[o,A,n]}function i2(e,t,o){let A=e[0]-t[0],n=e[0]-o[0],s=t[0]-o[0],a=e[1]-t[1],i=e[1]-o[1],x=t[1]-o[1],d=e[2]-t[2],l=e[2]-o[2],y=t[2]-o[2],c=Math.sqrt(A*A+a*a+d*d),f=Math.sqrt(n*n+i*i+l*l),h=Math.sqrt(s*s+x*x+y*y),m=(h*h+c*c-f*f)/(2*h*c);m>1?m=1:m<-1&&(m=-1);let v=Math.acos(m);v=57.2958*v%180;let b;return v>oe.NO_CURL_START_LIMIT?b=X0.none:v>oe.HALF_CURL_START_LIMIT?b=X0.half:b=X0.full,b}function en(e,t,o,A){let n;return A===Math.abs(e)?e>0?n=U.horizontalLeft:n=U.horizontalRight:A===Math.abs(t)?t>0?n=U.horizontalLeft:n=U.horizontalRight:o>0?n=U.horizontalLeft:n=U.horizontalRight,n}function tn(e,t,o,A){let n;return A===Math.abs(e)?e<0?n=U.verticalDown:n=U.verticalUp:A===Math.abs(t)?t<0?n=U.verticalDown:n=U.verticalUp:o<0?n=U.verticalDown:n=U.verticalUp,n}function l2(e,t,o,A,n,s,a,i){let x,d=tn(e,t,o,A),l=en(n,s,a,i);return d===U.verticalUp?l===U.horizontalLeft?x=U.diagonalUpLeft:x=U.diagonalUpRight:l===U.horizontalLeft?x=U.diagonalDownLeft:x=U.diagonalDownRight,x}function y2(e,t,o,A){let n=e[0]-t[0],s=e[0]-o[0],a=t[0]-o[0],i=e[1]-t[1],x=e[1]-o[1],d=t[1]-o[1],l=Math.max(Math.abs(n),Math.abs(s),Math.abs(a)),y=Math.max(Math.abs(i),Math.abs(x),Math.abs(d)),c=0,f=0,h=0,m=y/(l+1e-5);m>1.5?c+=oe.DISTANCE_VOTE_POWER:m>.66?f+=oe.DISTANCE_VOTE_POWER:h+=oe.DISTANCE_VOTE_POWER;let v=Math.sqrt(n*n+i*i),b=Math.sqrt(s*s+x*x),M=Math.sqrt(a*a+d*d),p=Math.max(v,b,M),u=e[0],E=e[1],W=o[0],C=o[1];p===v?(W=o[0],C=o[1]):p===M&&(u=t[0],E=t[1]);let V=$A([u,E],[W,C]),B=_A(V,oe.TOTAL_ANGLE_VOTE_POWER);c+=B[0],f+=B[1],h+=B[2];for(let t0 of A){let z=_A(t0,oe.SINGLE_ANGLE_VOTE_POWER);c+=z[0],f+=z[1],h+=z[2]}let H;return c===Math.max(c,f,h)?H=tn(x,i,d,y):h===Math.max(f,h)?H=en(s,n,a,l):H=l2(x,i,d,y,s,n,a,l),H}function on(e){let t=[],o=[],A=[],n=[];if(!e)return{curls:A,directions:n};for(let s of i0.all){let a=i0.getPoints(s),i=[],x=[];for(let d of a){let l=e[d[0]],y=e[d[1]],c=$A(l,y),f=c[0],h=c[1];i.push(f),x.push(h)}t.push(i),o.push(x)}for(let s of i0.all){let a=s===i0.thumb?1:0,i=i0.getPoints(s),x=e[i[a][0]],d=e[i[a+1][1]],l=e[i[3][1]],y=i2(x,d,l),c=y2(x,d,l,t[s].slice(a));A[s]=y,n[s]=c}return{curls:A,directions:n}}function xt(e){if(!e||e.length===0)return null;let t=on(e),o={};for(let A of i0.all)o[i0.getName(A)]={curl:X0.getName(t.curls[A]),direction:U.getName(t.directions[A])};return o}function An(e){let t=[];if(!e||e.length===0)return t;let o=on(e);for(let A of KA){let n=A.matchAgainst(o.curls,o.directions);n>=a2&&t.push({name:A.name,confidence:n})}return t}var nn={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],palm:[0]},he,be,rn;async function R5(e,t){let o=await rn.estimateHands(e,t);if(!o)return[];let A=[];for(let n=0;no[n].landmarks[y]);let a=o[n].landmarks,i=[Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER,0,0],x=[0,0,0,0];if(a&&a.length>0){for(let l of a)l[0]i[2]&&(i[2]=l[0]),l[1]>i[3]&&(i[3]=l[1]);i[2]-=i[0],i[3]-=i[1],x=[i[0]/(e.shape[2]||0),i[1]/(e.shape[1]||0),i[2]/(e.shape[2]||0),i[3]/(e.shape[1]||0)]}else i=o[n].box?[Math.trunc(Math.max(0,o[n].box.topLeft[0])),Math.trunc(Math.max(0,o[n].box.topLeft[1])),Math.trunc(Math.min(e.shape[2]||0,o[n].box.bottomRight[0])-Math.max(0,o[n].box.topLeft[0])),Math.trunc(Math.min(e.shape[1]||0,o[n].box.bottomRight[1])-Math.max(0,o[n].box.topLeft[1]))]:[0,0,0,0],x=[o[n].box.topLeft[0]/(e.shape[2]||0),o[n].box.topLeft[1]/(e.shape[1]||0),(o[n].box.bottomRight[0]-o[n].box.topLeft[0])/(e.shape[2]||0),(o[n].box.bottomRight[1]-o[n].box.topLeft[1])/(e.shape[1]||0)];let d=xt(a);A.push({id:n,score:Math.round(100*o[n].confidence)/100,boxScore:Math.round(100*o[n].boxConfidence)/100,fingerScore:Math.round(100*o[n].fingerConfidence)/100,label:"hand",box:i,boxRaw:x,keypoints:a,annotations:s,landmarks:d})}return A}async function w5(e){var o,A;R.initial&&(he=null,be=null),!he||!be?[he,be]=await Promise.all([e.hand.enabled?N((o=e.hand.detector)==null?void 0:o.modelPath):null,e.hand.landmarks?N((A=e.hand.skeleton)==null?void 0:A.modelPath):null]):(e.debug&&g("cached model:",he.modelUrl),e.debug&&g("cached model:",be.modelUrl));let t=new P5(he);return rn=new M5(t,be),[he,be]}var $=[null,null],x2=["StatefulPartitionedCall/Postprocessor/Slice","StatefulPartitionedCall/Postprocessor/ExpandDims_1"],J0=[[0,0],[0,0]],c2=["hand","fist","pinch","point","face","tip","pinchtip"],an=4,ln=1.6,d2=512,f2=1.4,ct=Number.MAX_SAFE_INTEGER,k5=0,L0=[0,0],J={boxes:[],hands:[]},yn={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],base:[0],palm:[0,17,13,9,5,1,0]};async function xn(e){var t;if(R.initial&&($[0]=null),$[0])e.debug&&g("cached model:",$[0].modelUrl);else{dt(["tensorlistreserve","enter","tensorlistfromtensor","merge","loopcond","switch","exit","tensorliststack","nextiteration","tensorlistsetitem","tensorlistgetitem","reciprocal","shape","split","where"],e),$[0]=await N((t=e.hand.detector)==null?void 0:t.modelPath);let o=Object.values($[0].modelSignature.inputs);J0[0][0]=Array.isArray(o)?parseInt(o[0].tensorShape.dim[1].size):0,J0[0][1]=Array.isArray(o)?parseInt(o[0].tensorShape.dim[2].size):0}return $[0]}async function cn(e){var t;if(R.initial&&($[1]=null),$[1])e.debug&&g("cached model:",$[1].modelUrl);else{$[1]=await N((t=e.hand.skeleton)==null?void 0:t.modelPath);let o=Object.values($[1].modelSignature.inputs);J0[1][0]=Array.isArray(o)?parseInt(o[0].tensorShape.dim[1].size):0,J0[1][1]=Array.isArray(o)?parseInt(o[0].tensorShape.dim[2].size):0}return $[1]}async function m2(e,t){let o=[];if(!e||!$[0])return o;let A={},n=(e.shape[2]||1)/(e.shape[1]||1),s=Math.min(Math.round((e.shape[1]||0)/8)*8,d2),a=Math.round(s*n/8)*8;A.resize=r.image.resizeBilinear(e,[s,a]),A.cast=r.cast(A.resize,"int32"),[A.rawScores,A.rawBoxes]=await $[0].executeAsync(A.cast,x2),A.boxes=r.squeeze(A.rawBoxes,[0,2]),A.scores=r.squeeze(A.rawScores,[0]);let i=r.unstack(A.scores,1);r.dispose(i[an]),i.splice(an,1),A.filtered=r.stack(i,1),r.dispose(i),A.max=r.max(A.filtered,1),A.argmax=r.argMax(A.filtered,1);let x=0;A.nms=await r.image.nonMaxSuppressionAsync(A.boxes,A.max,(t.hand.maxDetected||0)+1,t.hand.iouThreshold||0,t.hand.minConfidence||1);let d=await A.nms.data(),l=await A.max.data(),y=await A.argmax.data();for(let c of Array.from(d)){let f=r.slice(A.boxes,c,1),h=await f.data();r.dispose(f);let m=[h[1],h[0],h[3]-h[1],h[2]-h[0]],v=tt(m,f2),b=[Math.trunc(m[0]*L0[0]),Math.trunc(m[1]*L0[1]),Math.trunc(m[2]*L0[0]),Math.trunc(m[3]*L0[1])],M=l[c],p=c2[y[c]],u={id:x++,score:M,box:b,boxRaw:v,label:p};o.push(u)}return Object.keys(A).forEach(c=>r.dispose(A[c])),o.sort((c,f)=>f.score-c.score),o.length>(t.hand.maxDetected||1)&&(o.length=t.hand.maxDetected||1),o}async function E5(e,t,o){let A={id:t.id,score:Math.round(100*t.score)/100,boxScore:Math.round(100*t.score)/100,fingerScore:0,box:t.box,boxRaw:t.boxRaw,label:t.label,keypoints:[],landmarks:{},annotations:{}};if(e&&$[1]&&o.hand.landmarks&&t.score>(o.hand.minConfidence||0)){let n={},s=[t.boxRaw[1],t.boxRaw[0],t.boxRaw[3]+t.boxRaw[1],t.boxRaw[2]+t.boxRaw[0]];n.crop=r.image.cropAndResize(e,[s],[0],[J0[1][0],J0[1][1]],"bilinear"),n.div=r.div(n.crop,L.tf255),[n.score,n.keypoints]=$[1].execute(n.div,["Identity_1","Identity"]);let a=(await n.score.data())[0],i=(100-Math.trunc(100/(1+Math.exp(a))))/100;if(i>=(o.hand.minConfidence||0)){A.fingerScore=i,n.reshaped=r.reshape(n.keypoints,[-1,3]);let l=(await n.reshaped.array()).map(y=>[y[0]/J0[1][1],y[1]/J0[1][0],y[2]||0]).map(y=>[y[0]*t.boxRaw[2],y[1]*t.boxRaw[3],y[2]||0]);A.keypoints=l.map(y=>[L0[0]*(y[0]+t.boxRaw[0]),L0[1]*(y[1]+t.boxRaw[1]),y[2]||0]),A.landmarks=xt(A.keypoints);for(let y of Object.keys(yn))A.annotations[y]=yn[y].map(c=>A.landmarks&&A.keypoints[c]?A.keypoints[c]:null)}Object.keys(n).forEach(x=>r.dispose(n[x]))}return A}async function z5(e,t){var n,s;if(!$[0]||!$[1]||!((n=$[0])!=null&&n.inputs[0].shape)||!((s=$[1])!=null&&s.inputs[0].shape))return[];L0=[e.shape[2]||0,e.shape[1]||0],ct++;let o=(t.hand.skipTime||0)>P()-k5,A=ct<(t.hand.skipFrames||0);return t.skipAllowed&&o&&A?J.hands:new Promise(async a=>{let i=3*(t.hand.skipTime||0)>P()-k5,x=ct<3*(t.hand.skipFrames||0);t.skipAllowed&&J.hands.length===t.hand.maxDetected?J.hands=await Promise.all(J.boxes.map(l=>E5(e,l,t))):t.skipAllowed&&i&&x&&J.hands.length>0?J.hands=await Promise.all(J.boxes.map(l=>E5(e,l,t))):(J.boxes=await m2(e,t),k5=P(),J.hands=await Promise.all(J.boxes.map(l=>E5(e,l,t))),ct=0);let d=[...J.boxes];if(J.boxes.length=0,t.cacheSensitivity>0)for(let l=0;l.05&&y.box[3]/(e.shape[1]||1)>.05&&J.hands[l].fingerScore&&J.hands[l].fingerScore>(t.hand.minConfidence||0)){let c=tt(y.box,ln),f=tt(y.boxRaw,ln);J.boxes.push({...d[l],box:c,boxRaw:f})}}for(let l=0;lP()-mn,s=j5<(((i=t.face.liveness)==null?void 0:i.skipFrames)||0);return t.skipAllowed&&n&&s&&fn===A&&ft[o]?(j5++,ft[o]):(j5=0,new Promise(async x=>{let d=r.image.resizeBilinear(e,[r0!=null&&r0.inputs[0].shape?r0.inputs[0].shape[2]:0,r0!=null&&r0.inputs[0].shape?r0.inputs[0].shape[1]:0],!1),l=r0==null?void 0:r0.execute(d),y=(await l.data())[0];ft[o]=Math.round(100*y)/100,fn=A,mn=P(),r.dispose([d,l]),x(ft[o])}))}var Le={};Ze(Le,{connected:()=>pt,horizontal:()=>W5,kpt:()=>mt,relative:()=>I5,vertical:()=>C5});var mt=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],W5=[["leftEye","rightEye"],["leftEar","rightEar"],["leftShoulder","rightShoulder"],["leftElbow","rightElbow"],["leftWrist","rightWrist"],["leftHip","rightHip"],["leftKnee","rightKnee"],["leftAnkle","rightAnkle"]],C5=[["leftKnee","leftShoulder"],["rightKnee","rightShoulder"],["leftAnkle","leftKnee"],["rightAnkle","rightKnee"]],I5=[[["leftHip","rightHip"],["leftShoulder","rightShoulder"]],[["leftElbow","rightElbow"],["leftShoulder","rightShoulder"]]],pt={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var hn=.005,d0={keypoints:[],padding:[[0,0],[0,0],[0,0],[0,0]]};function O5(e){for(let t of W5){let o=e.keypoints.findIndex(n=>n.part===t[0]),A=e.keypoints.findIndex(n=>n.part===t[1]);if(e.keypoints[o]&&e.keypoints[A]&&e.keypoints[o].position[0]n&&n.part===t[0]),A=e.keypoints.findIndex(n=>n&&n.part===t[1]);e.keypoints[o]&&e.keypoints[A]&&e.keypoints[o].position[1]d&&d.part===t[0]),n=e.keypoints.findIndex(d=>d&&d.part===t[1]),s=e.keypoints.findIndex(d=>d&&d.part===o[0]),a=e.keypoints.findIndex(d=>d&&d.part===o[1]);if(!e.keypoints[s]||!e.keypoints[a])continue;let i=e.keypoints[A]?[Math.abs(e.keypoints[s].position[0]-e.keypoints[A].position[0]),Math.abs(e.keypoints[a].position[0]-e.keypoints[A].position[0])]:[0,0],x=e.keypoints[n]?[Math.abs(e.keypoints[a].position[0]-e.keypoints[n].position[0]),Math.abs(e.keypoints[s].position[0]-e.keypoints[n].position[0])]:[0,0];if(i[0]>i[1]||x[0]>x[1]){let d=e.keypoints[A];e.keypoints[A]=e.keypoints[n],e.keypoints[n]=d}}}function bn(e){for(let t=0;te.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0],[0,0]],o.pad=r.pad(e,d0.padding),o.resize=r.image.resizeBilinear(o.pad,[t,t]);let A=r.cast(o.resize,"int32");return Object.keys(o).forEach(n=>r.dispose(o[n])),A}function Pn(e,t){e.keypoints=e.keypoints.filter(A=>A&&A.position);for(let A of e.keypoints)A.position=[A.position[0]*(t[0]+d0.padding[2][0]+d0.padding[2][1])/t[0]-d0.padding[2][0],A.position[1]*(t[1]+d0.padding[1][0]+d0.padding[1][1])/t[1]-d0.padding[1][0]],A.positionRaw=[A.position[0]/t[0],A.position[1]/t[1]];let o=S0(e.keypoints.map(A=>A.position),t);return e.box=o.box,e.boxRaw=o.boxRaw,e}var f0,ut=0,N5=Number.MAX_SAFE_INTEGER,Ae={boxes:[],bodies:[],last:0};async function Mn(e){return R.initial&&(f0=null),f0?e.debug&&g("cached model:",f0.modelUrl):(dt(["size"],e),f0=await N(e.body.modelPath)),ut=f0.inputs[0].shape?f0.inputs[0].shape[2]:0,ut<64&&(ut=256),f0}async function u2(e,t,o){let A=e[0][0],n=[],s=0;for(let l=0;lt.body.minConfidence){let y=[A[l][1],A[l][0]];n.push({score:Math.round(100*s)/100,part:mt[l],positionRaw:y,position:[Math.round((o.shape[2]||0)*y[0]),Math.round((o.shape[1]||0)*y[1])]})}s=n.reduce((l,y)=>y.score>l?y.score:l,0);let a=[],i=S0(n.map(l=>l.position),[o.shape[2],o.shape[1]]),x={};for(let[l,y]of Object.entries(pt)){let c=[];for(let f=0;fv.part===y[f]),m=n.find(v=>v.part===y[f+1]);h&&m&&h.score>(t.body.minConfidence||0)&&m.score>(t.body.minConfidence||0)&&c.push([h.position,m.position])}x[l]=c}let d={id:0,score:s,box:i.box,boxRaw:i.boxRaw,keypoints:n,annotations:x};return O5(d),a.push(d),a}async function h2(e,t,o){let A=[];for(let n=0;nt.body.minConfidence){let i=[];for(let y=0;y<17;y++){let c=s[3*y+2];if(c>t.body.minConfidence){let f=[s[3*y+1],s[3*y+0]];i.push({part:mt[y],score:Math.round(100*c)/100,positionRaw:f,position:[Math.round((o.shape[2]||0)*f[0]),Math.round((o.shape[1]||0)*f[1])]})}}let x=S0(i.map(y=>y.position),[o.shape[2],o.shape[1]]),d={};for(let[y,c]of Object.entries(pt)){let f=[];for(let h=0;hb.part===c[h]),v=i.find(b=>b.part===c[h+1]);m&&v&&m.score>(t.body.minConfidence||0)&&v.score>(t.body.minConfidence||0)&&f.push([m.position,v.position])}d[y]=f}let l={id:n,score:a,box:x.box,boxRaw:x.boxRaw,keypoints:[...i],annotations:d};O5(l),A.push(l)}}return A.sort((n,s)=>s.score-n.score),A.length>t.body.maxDetected&&(A.length=t.body.maxDetected),A}async function L5(e,t){if(!f0||!(f0!=null&&f0.inputs[0].shape))return[];t.skipAllowed||(Ae.boxes.length=0),N5++;let o=(t.body.skipTime||0)>P()-Ae.last,A=N5<(t.body.skipFrames||0);return t.skipAllowed&&o&&A?Ae.bodies:new Promise(async n=>{let s={};N5=0,s.input=gn(e,ut),s.res=f0==null?void 0:f0.execute(s.input),Ae.last=P();let a=await s.res.array();Ae.bodies=s.res.shape[2]===17?await u2(a,t,e):await h2(a,t,e);for(let i of Ae.bodies)Pn(i,[e.shape[2]||1,e.shape[1]||1]),bn(i.keypoints);Object.keys(s).forEach(i=>r.dispose(s[i])),n(Ae.bodies)})}var ge,ht=[],Tn=0,B5=Number.MAX_SAFE_INTEGER,gt=0,bt=2.5;async function Rn(e){if(!ge||R.initial){ge=await N(e.object.modelPath);let t=Object.values(ge.modelSignature.inputs);gt=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):0}else e.debug&&g("cached model:",ge.modelUrl);return ge}async function b2(e,t,o){let A=0,n=[];for(let x of[1,2,4])r.tidy(async()=>{let d=x*13,l=r.squeeze(e.find(m=>m.shape[1]===d**2&&(m.shape[2]||0)===xe.length)),y=r.squeeze(e.find(m=>m.shape[1]===d**2&&(m.shape[2]||0)(o.object.minConfidence||0)&&v!==61){let M=(.5+Math.trunc(m%d))/d,p=(.5+Math.trunc(m/d))/d,u=f[m].map(H=>H*(d/x/gt)),[E,W]=[M-bt/x*u[0],p-bt/x*u[1]],[C,S]=[M+bt/x*u[2]-E,p+bt/x*u[3]-W],O=[E,W,C,S];O=O.map(H=>Math.max(0,Math.min(H,1)));let V=[O[0]*t[0],O[1]*t[1],O[2]*t[0],O[3]*t[1]],B={id:A++,score:Math.round(100*b)/100,class:v+1,label:xe[v].label,box:V.map(H=>Math.trunc(H)),boxRaw:O};n.push(B)}}});e.forEach(x=>r.dispose(x));let s=n.map(x=>[x.boxRaw[1],x.boxRaw[0],x.boxRaw[3],x.boxRaw[2]]),a=n.map(x=>x.score),i=[];if(s&&s.length>0){let x=await r.image.nonMaxSuppressionAsync(s,a,o.object.maxDetected,o.object.iouThreshold,o.object.minConfidence);i=await x.data(),r.dispose(x)}return n=n.filter((x,d)=>i.includes(d)).sort((x,d)=>d.score-x.score),n}async function G5(e,t){let o=(t.object.skipTime||0)>P()-Tn,A=B5<(t.object.skipFrames||0);return t.skipAllowed&&o&&A&&ht.length>0?(B5++,ht):(B5=0,!R.kernels.includes("mod")||!R.kernels.includes("sparsetodense")?ht:new Promise(async n=>{let s=[e.shape[2]||0,e.shape[1]||0],a=r.image.resizeBilinear(e,[gt,gt],!1),i=r.div(a,L.tf255),x=i.transpose([0,3,1,2]);r.dispose(i),r.dispose(a);let d;t.object.enabled&&(d=ge.execute(x)),Tn=P(),r.dispose(x);let l=await b2(d,s,t);ht=l,n(l)}))}var Ge=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],g2=Ge.length,Be=Ge.reduce((e,t,o)=>(e[t]=o,e),{}),P2=[["leftHip","leftShoulder"],["leftElbow","leftShoulder"],["leftElbow","leftWrist"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["rightHip","rightShoulder"],["rightElbow","rightShoulder"],["rightElbow","rightWrist"],["rightHip","rightKnee"],["rightKnee","rightAnkle"],["leftShoulder","rightShoulder"],["leftHip","rightHip"]],Ha=P2.map(([e,t])=>[Be[e],Be[t]]),kn=[["nose","leftEye"],["leftEye","leftEar"],["nose","rightEye"],["rightEye","rightEar"],["nose","leftShoulder"],["leftShoulder","leftElbow"],["leftElbow","leftWrist"],["leftShoulder","leftHip"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["nose","rightShoulder"],["rightShoulder","rightElbow"],["rightElbow","rightWrist"],["rightShoulder","rightHip"],["rightHip","rightKnee"],["rightKnee","rightAnkle"]];function En(e){let t=e.reduce(({maxX:o,maxY:A,minX:n,minY:s},{position:{x:a,y:i}})=>({maxX:Math.max(o,a),maxY:Math.max(A,i),minX:Math.min(n,a),minY:Math.min(s,i)}),{maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY});return[t.minX,t.minY,t.maxX-t.minX,t.maxY-t.minY]}function zn(e,[t,o],[A,n]){let s=t/A,a=o/n,i=(d,l)=>({id:l,score:d.score,boxRaw:[d.box[0]/n,d.box[1]/A,d.box[2]/n,d.box[3]/A],box:[Math.trunc(d.box[0]*a),Math.trunc(d.box[1]*s),Math.trunc(d.box[2]*a),Math.trunc(d.box[3]*s)],keypoints:d.keypoints.map(({score:y,part:c,position:f})=>({score:y,part:c,position:[Math.trunc(f.x*a),Math.trunc(f.y*s)],positionRaw:[f.x/A,f.y/A]})),annotations:{}});return e.map((d,l)=>i(d,l))}var H5=class{constructor(t,o){w(this,"priorityQueue");w(this,"numberOfElements");w(this,"getElementValue");this.priorityQueue=new Array(t),this.numberOfElements=-1,this.getElementValue=o}enqueue(t){this.priorityQueue[++this.numberOfElements]=t,this.swim(this.numberOfElements)}dequeue(){let t=this.priorityQueue[0];return this.exchange(0,this.numberOfElements--),this.sink(0),this.priorityQueue[this.numberOfElements+1]=null,t}empty(){return this.numberOfElements===-1}size(){return this.numberOfElements+1}all(){return this.priorityQueue.slice(0,this.numberOfElements+1)}max(){return this.priorityQueue[0]}swim(t){for(;t>0&&this.less(Math.floor(t/2),t);)this.exchange(t,Math.floor(t/2)),t=Math.floor(t/2)}sink(t){for(;2*t<=this.numberOfElements;){let o=2*t;if(oo?o:e}function jn(e,t,o,A){let n=o-e,s=A-t;return n*n+s*s}function X5(e,t){return{x:e.x+t.x,y:e.y+t.y}}var v0,v2=["MobilenetV1/offset_2/BiasAdd","MobilenetV1/heatmap_2/BiasAdd","MobilenetV1/displacement_fwd_2/BiasAdd","MobilenetV1/displacement_bwd_2/BiasAdd"],Pt=1,Pe=16,T2=50**2;function Sn(e,t,o,A,n,s,a=2){let i=b=>({y:s.get(b.y,b.x,e),x:s.get(b.y,b.x,s.shape[2]/2+e)}),x=(b,M,p)=>({y:Z5(Math.round(b.y/Pe),0,M-1),x:Z5(Math.round(b.x/Pe),0,p-1)}),[d,l]=A.shape,y=x(t.position,d,l),c=i(y),h=X5(t.position,c);for(let b=0;b[Be[c],Be[f]]),a=s.map(([,c])=>c),i=s.map(([c])=>c),x=t.shape[2],d=a.length,l=new Array(x),y=V5(e.part,Pe,o);l[e.part.id]={score:e.score,part:Ge[e.part.id],position:y};for(let c=d-1;c>=0;--c){let f=a[c],h=i[c];l[f]&&!l[h]&&(l[h]=Sn(c,l[f],h,t,o,n))}for(let c=0;ct){i=!1;break}if(!i)break}return i}function k2(e,t){let[o,A,n]=t.shape,s=new H5(o*A*n,({score:a})=>a);for(let a=0;a{var a;let s=(a=n[A])==null?void 0:a.position;return s?jn(o,t,s.y,s.x)<=T2:!1})}function E2(e,t){return t.reduce((A,{position:n,score:s},a)=>(Wn(e,n,a)||(A+=s),A),0)/t.length}function z2(e,t,o,A,n,s){let a=[],i=k2(s,t);for(;a.lengthf.score>s);let y=E2(a,l),c=En(l);y>s&&a.push({keypoints:l,box:c,score:Math.round(100*y)/100})}return a}async function D5(e,t){let o=r.tidy(()=>{if(!v0.inputs[0].shape)return[];let a=r.image.resizeBilinear(e,[v0.inputs[0].shape[2],v0.inputs[0].shape[1]]),i=r.sub(r.div(r.cast(a,"float32"),127.5),1),d=v0.execute(i,v2).map(l=>r.squeeze(l,[0]));return d[1]=r.sigmoid(d[1]),d}),A=await Promise.all(o.map(a=>a.buffer()));for(let a of o)r.dispose(a);let n=await z2(A[0],A[1],A[2],A[3],t.body.maxDetected,t.body.minConfidence);return v0.inputs[0].shape?zn(n,[e.shape[1],e.shape[2]],[v0.inputs[0].shape[2],v0.inputs[0].shape[1]]):[]}async function Cn(e){return!v0||R.initial?v0=await N(e.body.modelPath):e.debug&&g("cached model:",v0.modelUrl),v0}var w0,q5=!1;async function U5(e){return!w0||R.initial?w0=await N(e.segmentation.modelPath):e.debug&&g("cached model:",w0.modelUrl),w0}async function On(e,t,o){var m,v;if(q5)return{data:[],canvas:null,alpha:null};q5=!0,w0||await U5(o);let A=await ie(e,o),n=((m=A.tensor)==null?void 0:m.shape[2])||0,s=((v=A.tensor)==null?void 0:v.shape[1])||0;if(!A.tensor)return{data:[],canvas:null,alpha:null};let a={};a.resize=r.image.resizeBilinear(A.tensor,[w0.inputs[0].shape?w0.inputs[0].shape[1]:0,w0.inputs[0].shape?w0.inputs[0].shape[2]:0],!1),r.dispose(A.tensor),a.norm=r.div(a.resize,L.tf255),a.res=w0.execute(a.norm),a.squeeze=r.squeeze(a.res,0),a.squeeze.shape[2]===2?(a.softmax=r.softmax(a.squeeze),[a.bg,a.fg]=r.unstack(a.softmax,2),a.expand=r.expandDims(a.fg,2),a.pad=r.expandDims(a.expand,0),a.crop=r.image.cropAndResize(a.pad,[[0,0,.5,.5]],[0],[n,s]),a.data=r.squeeze(a.crop,0)):a.data=r.image.resizeBilinear(a.squeeze,[s,n]);let i=Array.from(await a.data.data());if(R.node&&!R.Canvas&&typeof ImageData=="undefined")return o.debug&&g("canvas support missing"),Object.keys(a).forEach(b=>r.dispose(a[b])),{data:i,canvas:null,alpha:null};let x=s0(n,s);r.browser&&await r.browser.toPixels(a.data,x);let d=x.getContext("2d");o.segmentation.blur&&o.segmentation.blur>0&&(d.filter=`blur(${o.segmentation.blur}px)`);let l=d.getImageData(0,0,n,s),y=s0(n,s),c=y.getContext("2d");A.canvas&&c.drawImage(A.canvas,0,0),c.globalCompositeOperation="darken",o.segmentation.blur&&o.segmentation.blur>0&&(c.filter=`blur(${o.segmentation.blur}px)`),c.drawImage(x,0,0),c.globalCompositeOperation="source-over",c.filter="none";let f=c.getImageData(0,0,n,s);for(let b=0;br.dispose(a[b])),q5=!1,{data:i,canvas:y,alpha:x}}var J5=class{constructor(){w(this,"ssrnetage",null);w(this,"gear",null);w(this,"blazeposedetect",null);w(this,"blazepose",null);w(this,"centernet",null);w(this,"efficientpose",null);w(this,"mobilefacenet",null);w(this,"emotion",null);w(this,"facedetect",null);w(this,"faceiris",null);w(this,"facemesh",null);w(this,"faceres",null);w(this,"ssrnetgender",null);w(this,"handpose",null);w(this,"handskeleton",null);w(this,"handtrack",null);w(this,"liveness",null);w(this,"movenet",null);w(this,"nanodet",null);w(this,"posenet",null);w(this,"segmentation",null);w(this,"antispoof",null)}};function Y5(e){for(let t of Object.keys(e.models))e.models[t]=null}async function Ln(e){var t,o,A,n,s,a,i,x,d,l,y,c,f,h,m,v,b,M,p,u,E,W,C,S,O,V,B,H,t0,z;R.initial&&Y5(e),e.config.hand.enabled&&(!e.models.handpose&&((o=(t=e.config.hand.detector)==null?void 0:t.modelPath)==null?void 0:o.includes("handdetect"))&&([e.models.handpose,e.models.handskeleton]=await w5(e.config)),!e.models.handskeleton&&e.config.hand.landmarks&&((n=(A=e.config.hand.detector)==null?void 0:A.modelPath)==null?void 0:n.includes("handdetect"))&&([e.models.handpose,e.models.handskeleton]=await w5(e.config))),e.config.body.enabled&&!e.models.blazepose&&((a=(s=e.config.body)==null?void 0:s.modelPath)==null?void 0:a.includes("blazepose"))&&(e.models.blazepose=lA(e.config)),e.config.body.enabled&&!e.models.blazeposedetect&&e.config.body.detector&&e.config.body.detector.modelPath&&(e.models.blazeposedetect=iA(e.config)),e.config.body.enabled&&!e.models.efficientpose&&((x=(i=e.config.body)==null?void 0:i.modelPath)==null?void 0:x.includes("efficientpose"))&&(e.models.efficientpose=mA(e.config)),e.config.body.enabled&&!e.models.movenet&&((l=(d=e.config.body)==null?void 0:d.modelPath)==null?void 0:l.includes("movenet"))&&(e.models.movenet=Mn(e.config)),e.config.body.enabled&&!e.models.posenet&&((c=(y=e.config.body)==null?void 0:y.modelPath)==null?void 0:c.includes("posenet"))&&(e.models.posenet=Cn(e.config)),e.config.face.enabled&&!e.models.facedetect&&(e.models.facedetect=$o(e.config)),e.config.face.enabled&&((f=e.config.face.antispoof)==null?void 0:f.enabled)&&!e.models.antispoof&&(e.models.antispoof=Ho(e.config)),e.config.face.enabled&&((h=e.config.face.liveness)==null?void 0:h.enabled)&&!e.models.liveness&&(e.models.liveness=pn(e.config)),e.config.face.enabled&&((m=e.config.face.description)==null?void 0:m.enabled)&&!e.models.faceres&&(e.models.faceres=BA(e.config)),e.config.face.enabled&&((v=e.config.face.emotion)==null?void 0:v.enabled)&&!e.models.emotion&&(e.models.emotion=bA(e.config)),e.config.face.enabled&&((b=e.config.face.iris)==null?void 0:b.enabled)&&!e.models.faceiris&&(e.models.faceiris=zA(e.config)),e.config.face.enabled&&((M=e.config.face.mesh)==null?void 0:M.enabled)&&!e.models.facemesh&&(e.models.facemesh=CA(e.config)),e.config.face.enabled&&((p=e.config.face.gear)==null?void 0:p.enabled)&&!e.models.gear&&(e.models.gear=ko(e.config)),e.config.face.enabled&&((u=e.config.face.ssrnet)==null?void 0:u.enabled)&&!e.models.ssrnetage&&(e.models.ssrnetage=Wo(e.config)),e.config.face.enabled&&((E=e.config.face.ssrnet)==null?void 0:E.enabled)&&!e.models.ssrnetgender&&(e.models.ssrnetgender=No(e.config)),e.config.face.enabled&&((W=e.config.face.mobilefacenet)==null?void 0:W.enabled)&&!e.models.mobilefacenet&&(e.models.mobilefacenet=TA(e.config)),e.config.hand.enabled&&!e.models.handtrack&&((S=(C=e.config.hand.detector)==null?void 0:C.modelPath)==null?void 0:S.includes("handtrack"))&&(e.models.handtrack=xn(e.config)),e.config.hand.enabled&&e.config.hand.landmarks&&!e.models.handskeleton&&((V=(O=e.config.hand.detector)==null?void 0:O.modelPath)==null?void 0:V.includes("handtrack"))&&(e.models.handskeleton=cn(e.config)),e.config.object.enabled&&!e.models.centernet&&((H=(B=e.config.object)==null?void 0:B.modelPath)==null?void 0:H.includes("centernet"))&&(e.models.centernet=cA(e.config)),e.config.object.enabled&&!e.models.nanodet&&((z=(t0=e.config.object)==null?void 0:t0.modelPath)==null?void 0:z.includes("nanodet"))&&(e.models.nanodet=Rn(e.config)),e.config.segmentation.enabled&&!e.models.segmentation&&(e.models.segmentation=U5(e.config));for await(let m0 of Object.keys(e.models))e.models[m0]&&typeof e.models[m0]!="undefined"&&(e.models[m0]=await e.models[m0])}async function Bn(e){let t=["const","placeholder","noop","pad","squeeze","add","sub","mul","div"];for(let o of Object.keys(e.models)){let A=e.models[o];if(!A)continue;let n=[],s=A==null?void 0:A.executor;if(s&&s.graph.nodes)for(let i of Object.values(s.graph.nodes)){let x=i.op.toLowerCase();n.includes(x)||n.push(x)}else!s&&e.config.debug&&g("model signature not determined:",o);let a=[];for(let i of n)!t.includes(i)&&!e.env.kernels.includes(i)&&!e.env.kernels.includes(i.replace("_",""))&&!e.env.kernels.includes(i.replace("native",""))&&!e.env.kernels.includes(i.replace("v2",""))&&a.push(i);e.config.debug&&a.length>0&&g("model validation failed:",o,a)}}var q={name:"humangl",priority:999,canvas:null,gl:null,extensions:[],webGLattr:{alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!1,desynchronized:!0}};function j2(){let e=q.gl;!e||(q.extensions=e.getSupportedExtensions())}async function Hn(e){var t;if(e.config.backend==="humangl"&&(q.name in r.engine().registry&&(!q.gl||!q.gl.getParameter(q.gl.VERSION))&&(g("error: humangl backend invalid context"),Y5(e)),!r.findBackend(q.name))){try{q.canvas=await s0(100,100)}catch(A){g("error: cannot create canvas:",A);return}try{if(q.gl=(t=q.canvas)==null?void 0:t.getContext("webgl2",q.webGLattr),!q.gl.getParameter(q.gl.VERSION).includes("2.0")){g("override: using fallback webgl backend as webgl 2.0 is not detected"),e.config.backend="webgl";return}q.canvas&&(q.canvas.addEventListener("webglcontextlost",async n=>{throw g("error: humangl:",n.type),g("possible browser memory leak using webgl or conflict with multiple backend registrations"),e.emit("error"),new Error("backend error: webgl context lost")}),q.canvas.addEventListener("webglcontextrestored",n=>{g("error: humangl context restored:",n)}),q.canvas.addEventListener("webglcontextcreationerror",n=>{g("error: humangl context create:",n)}))}catch(A){g("error: cannot get WebGL context:",A);return}try{r.setWebGLContext(2,q.gl)}catch(A){g("error: cannot set WebGL context:",A);return}try{let A=new r.GPGPUContext(q.gl);r.registerBackend(q.name,()=>new r.MathBackendWebGL(A),q.priority)}catch(A){g("error: cannot register WebGL backend:",A);return}try{r.getKernelsForBackend("webgl").forEach(n=>{let s={...n,backendName:q.name};r.registerKernel(s)})}catch(A){g("error: cannot update WebGL backend registration:",A);return}let o=r.backend().getGPGPUContext?r.backend().getGPGPUContext().gl:null;if(o)g(`humangl webgl version:${o.getParameter(o.VERSION)} renderer:${o.getParameter(o.RENDERER)}`);else{g("error: no current gl context:",o,q.gl);return}try{r.ENV.set("WEBGL_VERSION",2)}catch(A){g("error: cannot set WebGL backend flags:",A);return}j2(),g("backend registered:",q.name)}}function S2(){if(!R.kernels.includes("mod")){let e={kernelName:"Mod",backendName:r.getBackend(),kernelFunc:t=>r.tidy(()=>r.sub(t.inputs.a,r.mul(r.div(t.inputs.a,t.inputs.b),t.inputs.b)))};r.registerKernel(e),R.kernels.push("mod")}if(!R.kernels.includes("floormod")){let e={kernelName:"FloorMod",backendName:r.getBackend(),kernelFunc:t=>r.tidy(()=>r.floorDiv(t.inputs.a/t.inputs.b)*t.inputs.b+r.mod(t.inputs.a,t.inputs.b))};r.registerKernel(e),R.kernels.push("floormod")}}async function Mt(e,t=!1){if(e.state="backend",t||R.initial||e.config.backend&&e.config.backend.length>0&&r.getBackend()!==e.config.backend){let o=P();if(e.config.backend&&e.config.backend.length>0){if(typeof window=="undefined"&&typeof WorkerGlobalScope!="undefined"&&e.config.debug&&e.config.debug&&g("running inside web worker"),R.browser&&e.config.backend==="tensorflow"&&(e.config.debug&&g("override: backend set to tensorflow while running in browser"),e.config.backend="humangl"),R.node&&(e.config.backend==="webgl"||e.config.backend==="humangl")&&(e.config.debug&&g(`override: backend set to ${e.config.backend} while running in nodejs`),e.config.backend="tensorflow"),R.browser&&e.config.backend==="webgpu")if(typeof navigator=="undefined"||typeof navigator.gpu=="undefined")g("override: backend set to webgpu but browser does not support webgpu"),e.config.backend="humangl";else{let n=await navigator.gpu.requestAdapter();e.config.debug&&g("enumerated webgpu adapter:",n)}e.config.backend==="humangl"&&await Hn(e);let A=Object.keys(r.engine().registryFactory);if(e.config.debug&&g("available backends:",A),A.includes(e.config.backend)||(g(`error: backend ${e.config.backend} not found in registry`),e.config.backend=R.node?"tensorflow":"webgl",e.config.debug&&g(`override: setting backend ${e.config.backend}`)),e.config.debug&&g("setting backend:",e.config.backend),e.config.backend==="wasm"){if(e.config.debug&&g("wasm path:",e.config.wasmPath),typeof(r==null?void 0:r.setWasmPaths)!="undefined")await r.setWasmPaths(e.config.wasmPath,e.config.wasmPlatformFetch);else throw new Error("backend error: attempting to use wasm backend but wasm path is not set");let n=await r.env().getAsync("WASM_HAS_SIMD_SUPPORT"),s=await r.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT");e.config.debug&&g(`wasm execution: ${n?"SIMD":"no SIMD"} ${s?"multithreaded":"singlethreaded"}`),e.config.debug&&!n&&g("warning: wasm simd support is not enabled")}try{await r.setBackend(e.config.backend),await r.ready(),zo()}catch(n){return g("error: cannot set backend:",e.config.backend,n),!1}}if(r.getBackend()==="humangl"&&(r.ENV.set("CHECK_COMPUTATION_FOR_ERRORS",!1),r.ENV.set("WEBGL_CPU_FORWARD",!0),r.ENV.set("WEBGL_USE_SHAPES_UNIFORMS",!0),r.ENV.set("CPU_HANDOFF_SIZE_THRESHOLD",256),typeof e.config.deallocate!="undefined"&&e.config.deallocate&&(g("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",!0),r.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",0)),r.backend().getGPGPUContext)){let A=await r.backend().getGPGPUContext().gl;e.config.debug&&g(`gl version:${A.getParameter(A.VERSION)} renderer:${A.getParameter(A.RENDERER)}`)}r.getBackend(),r.enableProdMode(),await r.ready(),e.performance.initBackend=Math.trunc(P()-o),e.config.backend=r.getBackend(),await R.updateBackend(),S2()}return!0}function dt(e,t){for(let o of e){let A={kernelName:o,backendName:t.backend,kernelFunc:()=>{t.debug&&g("kernelFunc",o,t.backend)}};r.registerKernel(A)}R.kernels=r.getKernelsForBackend(r.getBackend()).map(o=>o.kernelName.toLowerCase())}var B0={color:"rgba(173, 216, 230, 0.6)",labelColor:"rgba(173, 216, 230, 1)",shadowColor:"black",font:'small-caps 16px "Segoe UI"',lineHeight:18,lineWidth:4,pointSize:2,roundRect:8,drawPoints:!1,drawLabels:!0,drawBoxes:!0,drawGestures:!0,drawPolygons:!0,drawGaze:!0,fillPolygons:!1,useDepth:!0,useCurves:!1},K5=0,ne=e=>{if(!e)g("draw error: invalid canvas");else if(!e.getContext)g("draw error: canvas context not defined");else{let t=e.getContext("2d");if(!t)g("draw error: cannot get canvas context");else return t}return null},Me=e=>Math.round(e*180/Math.PI);function Q5(e,t,o,A,n){A=A||0,e.fillStyle=n.useDepth&&A?`rgba(${127.5+2*A}, ${127.5-2*A}, 255, 0.3)`:n.color,e.beginPath(),e.arc(t,o,n.pointSize,0,2*Math.PI),e.fill()}function He(e,t,o,A,n,s){if(e.beginPath(),e.lineWidth=s.lineWidth,s.useCurves){let a=(t+t+A)/2,i=(o+o+n)/2;e.ellipse(a,i,A/2,n/2,0,0,2*Math.PI)}else e.moveTo(t+s.roundRect,o),e.lineTo(t+A-s.roundRect,o),e.quadraticCurveTo(t+A,o,t+A,o+s.roundRect),e.lineTo(t+A,o+n-s.roundRect),e.quadraticCurveTo(t+A,o+n,t+A-s.roundRect,o+n),e.lineTo(t+s.roundRect,o+n),e.quadraticCurveTo(t,o+n,t,o+n-s.roundRect),e.lineTo(t,o+s.roundRect),e.quadraticCurveTo(t,o,t+s.roundRect,o),e.closePath();e.stroke()}function Zn(e,t,o){if(!(t.length<2)){e.beginPath(),e.moveTo(t[0][0],t[0][1]);for(let A of t){let n=A[2]||0;e.strokeStyle=o.useDepth&&n!==0?`rgba(${127.5+2*n}, ${127.5-2*n}, 255, 0.3)`:o.color,e.fillStyle=o.useDepth&&n!==0?`rgba(${127.5+2*n}, ${127.5-2*n}, 255, 0.3)`:o.color,e.lineTo(A[0],Math.round(A[1]))}e.stroke(),o.fillPolygons&&(e.closePath(),e.fill())}}function C2(e,t,o){if(!(t.length<2)){if(e.lineWidth=o.lineWidth,!o.useCurves||t.length<=2){Zn(e,t,o);return}e.moveTo(t[0][0],t[0][1]);for(let A=0;A1&&x[1].length>0){let d=i[1]>0?`#${i[1]}`:"",l=`${i[0]} ${d}: ${x[1]}`;A.shadowColor&&A.shadowColor!==""&&(n.fillStyle=A.shadowColor,n.fillText(l,8,2+s*A.lineHeight)),n.fillStyle=A.labelColor,n.fillText(l,6,0+s*A.lineHeight),s+=1}}}}async function $5(e,t,o){var s,a,i,x,d;let A=o0(B0,o);if(!t||!e)return;let n=ne(e);if(!!n)for(let l of t){if(n.font=A.font,n.strokeStyle=A.color,n.fillStyle=A.color,A.drawBoxes&&He(n,l.box[0],l.box[1],l.box[2],l.box[3],A),A.drawLabels){let y=[];if(y.push(`face: ${Math.trunc(100*l.score)}%`),l.genderScore&&y.push(`${l.gender||""} ${Math.trunc(100*l.genderScore)}%`),l.age&&y.push(`age: ${l.age||""}`),l.iris&&y.push(`distance: ${l.iris}`),l.real&&y.push(`real: ${Math.trunc(100*l.real)}%`),l.live&&y.push(`live: ${Math.trunc(100*l.live)}%`),l.emotion&&l.emotion.length>0){let c=l.emotion.map(f=>`${Math.trunc(100*f.score)}% ${f.emotion}`);c.length>3&&(c.length=3),y.push(c.join(" "))}l.rotation&&l.rotation.angle&&l.rotation.gaze&&(l.rotation.angle.roll&&y.push(`roll: ${Me(l.rotation.angle.roll)}\xB0 yaw:${Me(l.rotation.angle.yaw)}\xB0 pitch:${Me(l.rotation.angle.pitch)}\xB0`),l.rotation.gaze.bearing&&y.push(`gaze: ${Me(l.rotation.gaze.bearing)}\xB0`)),y.length===0&&y.push("face"),n.fillStyle=A.color;for(let c=y.length-1;c>=0;c--){let f=Math.max(l.box[0],0),h=c*A.lineHeight+l.box[1];A.shadowColor&&A.shadowColor!==""&&(n.fillStyle=A.shadowColor,n.fillText(y[c],f+5,h+16)),n.fillStyle=A.labelColor,n.fillText(y[c],f+4,h+15)}}if(n.lineWidth=2,l.mesh&&l.mesh.length>0){if(A.drawPoints)for(let y of l.mesh)Q5(n,y[0],y[1],y[2],A);if(A.drawPolygons){if(l.mesh.length>450)for(let y=0;yl.mesh[f]);Zn(n,c,A)}if(l.annotations&&l.annotations.leftEyeIris&&l.annotations.leftEyeIris[0]){n.strokeStyle=A.useDepth?"rgba(255, 200, 255, 0.3)":A.color,n.beginPath();let y=Math.abs(l.annotations.leftEyeIris[3][0]-l.annotations.leftEyeIris[1][0])/2,c=Math.abs(l.annotations.leftEyeIris[4][1]-l.annotations.leftEyeIris[2][1])/2;n.ellipse(l.annotations.leftEyeIris[0][0],l.annotations.leftEyeIris[0][1],y,c,0,0,2*Math.PI),n.stroke(),A.fillPolygons&&(n.fillStyle=A.useDepth?"rgba(255, 255, 200, 0.3)":A.color,n.fill())}if(l.annotations&&l.annotations.rightEyeIris&&l.annotations.rightEyeIris[0]){n.strokeStyle=A.useDepth?"rgba(255, 200, 255, 0.3)":A.color,n.beginPath();let y=Math.abs(l.annotations.rightEyeIris[3][0]-l.annotations.rightEyeIris[1][0])/2,c=Math.abs(l.annotations.rightEyeIris[4][1]-l.annotations.rightEyeIris[2][1])/2;n.ellipse(l.annotations.rightEyeIris[0][0],l.annotations.rightEyeIris[0][1],y,c,0,0,2*Math.PI),n.stroke(),A.fillPolygons&&(n.fillStyle=A.useDepth?"rgba(255, 255, 200, 0.3)":A.color,n.fill())}if(A.drawGaze&&((s=l.rotation)==null?void 0:s.angle)&&typeof Path2D!="undefined"){n.strokeStyle="pink";let y=l.box[0]+l.box[2]/2-l.box[3]*Me(l.rotation.angle.yaw)/90,c=l.box[1]+l.box[3]/2+l.box[2]*Me(l.rotation.angle.pitch)/90,f=new Path2D(` +`;var jt=(e,t,o)=>{let A=new RegExp("\\b"+t+" \\w+ (\\w+)","ig");e.replace(A,(n,s)=>(o[s]=0,n))},go=class{constructor(t,o,A){w(this,"uniform",{});w(this,"attribute",{});w(this,"gl");w(this,"id");w(this,"compile",(t,o)=>{let A=this.gl.createShader(o);return A?(this.gl.shaderSource(A,t),this.gl.compileShader(A),this.gl.getShaderParameter(A,this.gl.COMPILE_STATUS)?A:(g(`filter: gl compile failed: ${this.gl.getShaderInfoLog(A)}`),null)):(g("filter: could not create shader"),null)});this.gl=t;let n=this.compile(o,this.gl.VERTEX_SHADER),s=this.compile(A,this.gl.FRAGMENT_SHADER);if(this.id=this.gl.createProgram(),!(!n||!s)){if(!this.id){g("filter: could not create webgl program");return}if(this.gl.attachShader(this.id,n),this.gl.attachShader(this.id,s),this.gl.linkProgram(this.id),!this.gl.getProgramParameter(this.id,this.gl.LINK_STATUS)){g(`filter: gl link failed: ${this.gl.getProgramInfoLog(this.id)}`);return}this.gl.useProgram(this.id),jt(o,"attribute",this.attribute);for(let a in this.attribute)this.attribute[a]=this.gl.getAttribLocation(this.id,a);jt(o,"uniform",this.uniform),jt(A,"uniform",this.uniform);for(let a in this.uniform)this.uniform[a]=this.gl.getUniformLocation(this.id,a)}}};function Po(){let e=0,t=null,o=!1,A=-1,n=[null,null],s=[],a=null,i=null,x=s0(100,100),d={},l={INTERMEDIATE:1},y=x.getContext("webgl");if(this.gl=y,!y){g("filter: cannot get webgl context");return}function c(M,p){if(!(M===x.width&&p===x.height)){if(x.width=M,x.height=p,!a){let u=new Float32Array([-1,-1,0,1,1,-1,1,1,-1,1,0,0,-1,1,0,0,1,-1,1,1,1,1,1,0]);a=y.createBuffer(),y.bindBuffer(y.ARRAY_BUFFER,a),y.bufferData(y.ARRAY_BUFFER,u,y.STATIC_DRAW),y.pixelStorei(y.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0)}y.viewport(0,0,x.width,x.height),n=[null,null]}}function f(M,p){let u=y.createFramebuffer();y.bindFramebuffer(y.FRAMEBUFFER,u);let E=y.createRenderbuffer();y.bindRenderbuffer(y.RENDERBUFFER,E);let W=y.createTexture();return y.bindTexture(y.TEXTURE_2D,W),y.texImage2D(y.TEXTURE_2D,0,y.RGBA,M,p,0,y.RGBA,y.UNSIGNED_BYTE,null),y.texParameteri(y.TEXTURE_2D,y.TEXTURE_MAG_FILTER,y.LINEAR),y.texParameteri(y.TEXTURE_2D,y.TEXTURE_MIN_FILTER,y.LINEAR),y.texParameteri(y.TEXTURE_2D,y.TEXTURE_WRAP_S,y.CLAMP_TO_EDGE),y.texParameteri(y.TEXTURE_2D,y.TEXTURE_WRAP_T,y.CLAMP_TO_EDGE),y.framebufferTexture2D(y.FRAMEBUFFER,y.COLOR_ATTACHMENT0,y.TEXTURE_2D,W,0),y.bindTexture(y.TEXTURE_2D,null),y.bindFramebuffer(y.FRAMEBUFFER,null),{fbo:u,texture:W}}function h(M){return n[M]=n[M]||f(x.width,x.height),n[M]}function m(M=0){if(!i)return;let p=null,u=null,E=!1;e===0?p=t:p=h(A).texture||null,e++,o&&!(M&l.INTERMEDIATE)?(u=null,E=e%2===0):(A=(A+1)%2,u=h(A).fbo||null),y.bindTexture(y.TEXTURE_2D,p),y.bindFramebuffer(y.FRAMEBUFFER,u),y.uniform1f(i.uniform.flipY,E?-1:1),y.drawArrays(y.TRIANGLES,0,6)}function v(M){if(d[M])return i=d[M],y.useProgram((i?i.id:null)||null),i;if(i=new go(y,fo,M),!i)return g("filter: could not get webgl program"),null;let p=Float32Array.BYTES_PER_ELEMENT,u=4*p;return y.enableVertexAttribArray(i.attribute.pos),y.vertexAttribPointer(i.attribute.pos,2,y.FLOAT,!1,u,0*p),y.enableVertexAttribArray(i.attribute.uv),y.vertexAttribPointer(i.attribute.uv,2,y.FLOAT,!1,u,2*p),d[M]=i,i}let b={colorMatrix:M=>{let p=new Float32Array(M);p[4]/=255,p[9]/=255,p[14]/=255,p[19]/=255;let u=p[18]===1&&p[3]===0&&p[8]===0&&p[13]===0&&p[15]===0&&p[16]===0&&p[17]===0&&p[19]===0?po:mo,E=v(u);!E||(y.uniform1fv(E.uniform.m,p),m())},brightness:M=>{let p=(M||0)+1;b.colorMatrix([p,0,0,0,0,0,p,0,0,0,0,0,p,0,0,0,0,0,1,0])},saturation:M=>{let p=(M||0)*2/3+1,u=(p-1)*-.5;b.colorMatrix([p,u,u,0,0,u,p,u,0,0,u,u,p,0,0,0,0,0,1,0])},desaturate:()=>{b.saturation(-1)},contrast:M=>{let p=(M||0)+1,u=-128*(p-1);b.colorMatrix([p,0,0,0,u,0,p,0,0,u,0,0,p,0,u,0,0,0,1,0])},negative:()=>{b.contrast(-2)},hue:M=>{M=(M||0)/180*Math.PI;let p=Math.cos(M),u=Math.sin(M),E=.213,W=.715,C=.072;b.colorMatrix([E+p*(1-E)+u*-E,W+p*-W+u*-W,C+p*-C+u*(1-C),0,0,E+p*-E+u*.143,W+p*(1-W)+u*.14,C+p*-C+u*-.283,0,0,E+p*-E+u*-(1-E),W+p*-W+u*W,C+p*(1-C)+u*C,0,0,0,0,0,1,0])},desaturateLuminance:()=>{b.colorMatrix([.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,0,0,0,1,0])},sepia:()=>{b.colorMatrix([.393,.7689999,.18899999,0,0,.349,.6859999,.16799999,0,0,.272,.5339999,.13099999,0,0,0,0,0,1,0])},brownie:()=>{b.colorMatrix([.5997023498159715,.34553243048391263,-.2708298674538042,0,47.43192855600873,-.037703249837783157,.8609577587992641,.15059552388459913,0,-36.96841498319127,.24113635128153335,-.07441037908422492,.44972182064877153,0,-7.562075277591283,0,0,0,1,0])},vintagePinhole:()=>{b.colorMatrix([.6279345635605994,.3202183420819367,-.03965408211312453,0,9.651285835294123,.02578397704808868,.6441188644374771,.03259127616149294,0,7.462829176470591,.0466055556782719,-.0851232987247891,.5241648018700465,0,5.159190588235296,0,0,0,1,0])},kodachrome:()=>{b.colorMatrix([1.1285582396593525,-.3967382283601348,-.03992559172921793,0,63.72958762196502,-.16404339962244616,1.0835251566291304,-.05498805115633132,0,24.732407896706203,-.16786010706155763,-.5603416277695248,1.6014850761964943,0,35.62982807460946,0,0,0,1,0])},technicolor:()=>{b.colorMatrix([1.9125277891456083,-.8545344976951645,-.09155508482755585,0,11.793603434377337,-.3087833385928097,1.7658908555458428,-.10601743074722245,0,-70.35205161461398,-.231103377548616,-.7501899197440212,1.847597816108189,0,30.950940869491138,0,0,0,1,0])},polaroid:()=>{b.colorMatrix([1.438,-.062,-.062,0,0,-.122,1.378,-.122,0,0,-.016,-.016,1.483,0,0,0,0,0,1,0])},shiftToBGR:()=>{b.colorMatrix([0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0])},convolution:M=>{let p=new Float32Array(M),u=1/x.width,E=1/x.height,W=v(bo);!W||(y.uniform1fv(W.uniform.m,p),y.uniform2f(W.uniform.px,u,E),m())},detectEdges:()=>{b.convolution.call(this,[0,1,0,1,-4,1,0,1,0])},sobelX:()=>{b.convolution.call(this,[-1,0,1,-2,0,2,-1,0,1])},sobelY:()=>{b.convolution.call(this,[-1,-2,-1,0,0,0,1,2,1])},sharpen:M=>{let p=M||1;b.convolution.call(this,[0,-1*p,0,-1*p,1+4*p,-1*p,0,-1*p,0])},emboss:M=>{let p=M||1;b.convolution.call(this,[-2*p,-1*p,0,-1*p,1,1*p,0,1*p,2*p])},blur:M=>{let p=M/7/x.width,u=M/7/x.height,E=v(ho);!E||(y.uniform2f(E.uniform.px,0,u),m(l.INTERMEDIATE),y.uniform2f(E.uniform.px,p,0),m())},pixelate:M=>{let p=M/x.width,u=M/x.height,E=v(uo);!E||(y.uniform2f(E.uniform.size,p,u),m())}};this.add=function(M){let p=Array.prototype.slice.call(arguments,1),u=b[M];s.push({func:u,args:p})},this.reset=function(){s=[]},this.get=function(){return s},this.apply=function(M){c(M.width,M.height),e=0,t||(t=y.createTexture()),y.bindTexture(y.TEXTURE_2D,t),y.texParameteri(y.TEXTURE_2D,y.TEXTURE_WRAP_S,y.CLAMP_TO_EDGE),y.texParameteri(y.TEXTURE_2D,y.TEXTURE_WRAP_T,y.CLAMP_TO_EDGE),y.texParameteri(y.TEXTURE_2D,y.TEXTURE_MIN_FILTER,y.NEAREST),y.texParameteri(y.TEXTURE_2D,y.TEXTURE_MAG_FILTER,y.NEAREST),y.texImage2D(y.TEXTURE_2D,0,y.RGBA,y.RGBA,y.UNSIGNED_BYTE,M);for(let p=0;pf.data())),a=.99*Math.max(s[0][0],s[1][0],s[2][0]),i=[r.sub(o[0],A[0]),r.sub(o[1],A[1]),r.sub(o[2],A[2])],x=[r.sub(n[0],A[0]),r.sub(n[1],A[1]),r.sub(n[2],A[2])],d=[r.div(a,x[0]),r.div(a,x[1]),r.div(a,x[2])],l=[r.mul(i[0],d[0]),r.mul(i[1],d[1]),r.mul(i[2],d[2])],y=r.stack([l[0],l[1],l[2]],2),c=r.reshape(y,[1,t.shape[0],t.shape[1],3]);return r.dispose([...o,...A,...n,...i,...x,...d,...l,y,t]),c}var De=2048,G=null,_=null,ae=null,D,z0={inputSum:0,cacheDiff:1,sumMethod:0,inputTensor:void 0};function s0(e,t){let o;if(R.browser)if(R.worker){if(typeof OffscreenCanvas=="undefined")throw new Error("canvas error: attempted to run in web worker but OffscreenCanvas is not supported");o=new OffscreenCanvas(e,t)}else{if(typeof document=="undefined")throw new Error("canvas error: attempted to run in browser but DOM is not defined");o=document.createElement("canvas"),o.width=e,o.height=t}else typeof R.Canvas!="undefined"?o=new R.Canvas(e,t):typeof globalThis.Canvas!="undefined"&&(o=new globalThis.Canvas(e,t));return o}function St(e,t){let o=t||s0(e.width,e.height);return o.getContext("2d").drawImage(e,0,0),o}async function ie(e,t,o=!0){if(!e)return t.debug&&g("input error: input is missing"),{tensor:null,canvas:null};if(!(e instanceof se)&&!(typeof Image!="undefined"&&e instanceof Image)&&!(typeof R.Canvas!="undefined"&&e instanceof R.Canvas)&&!(typeof globalThis.Canvas!="undefined"&&e instanceof globalThis.Canvas)&&!(typeof ImageData!="undefined"&&e instanceof ImageData)&&!(typeof ImageBitmap!="undefined"&&e instanceof ImageBitmap)&&!(typeof HTMLImageElement!="undefined"&&e instanceof HTMLImageElement)&&!(typeof HTMLMediaElement!="undefined"&&e instanceof HTMLMediaElement)&&!(typeof HTMLVideoElement!="undefined"&&e instanceof HTMLVideoElement)&&!(typeof HTMLCanvasElement!="undefined"&&e instanceof HTMLCanvasElement)&&!(typeof OffscreenCanvas!="undefined"&&e instanceof OffscreenCanvas))throw new Error("input error: type is not recognized");if(e instanceof se){let A=null;if(e.isDisposedInternal)throw new Error("input error: attempted to use tensor but it is disposed");if(!e.shape)throw new Error("input error: attempted to use tensor without a shape");if(e.shape.length===3){if(e.shape[2]===3)A=r.expandDims(e,0);else if(e.shape[2]===4){let n=r.slice3d(e,[0,0,0],[-1,-1,3]);A=r.expandDims(n,0),r.dispose(n)}}else e.shape.length===4&&(e.shape[3]===3?A=r.clone(e):e.shape[3]===4&&(A=r.slice4d(e,[0,0,0,0],[-1,-1,-1,3])));if(A==null||A.shape.length!==4||A.shape[0]!==1||A.shape[3]!==3)throw new Error(`input error: attempted to use tensor with unrecognized shape: ${e.shape}`);if(A.dtype==="int32"){let n=r.cast(A,"float32");r.dispose(A),A=n}return{tensor:A,canvas:t.filter.return?_:null}}else{if(typeof e.readyState!="undefined"&&e.readyState<=2)return t.debug&&g("input stream is not ready"),{tensor:null,canvas:G};let A=e.naturalWidth||e.videoWidth||e.width||e.shape&&e.shape[1]>0,n=e.naturalHeight||e.videoHeight||e.height||e.shape&&e.shape[2]>0;if(!A||!n)return t.debug&&g("cannot determine input dimensions"),{tensor:null,canvas:G};let s=A,a=n;if(s>De&&(s=De,a=Math.trunc(s*n/A)),a>De&&(a=De,s=Math.trunc(a*A/n)),(t.filter.width||0)>0?s=t.filter.width:(t.filter.height||0)>0&&(s=A*((t.filter.height||0)/n)),(t.filter.height||0)>0?a=t.filter.height:(t.filter.width||0)>0&&(a=n*((t.filter.width||0)/A)),!s||!a)throw new Error("input error: cannot determine dimension");(!G||(G==null?void 0:G.width)!==s||(G==null?void 0:G.height)!==a)&&(G=s0(s,a));let i=G.getContext("2d");if(typeof ImageData!="undefined"&&e instanceof ImageData?i.putImageData(e,0,0):t.filter.flip&&typeof i.translate!="undefined"?(i.translate(A,0),i.scale(-1,1),i.drawImage(e,0,0,A,n,0,0,G==null?void 0:G.width,G==null?void 0:G.height),i.setTransform(1,0,0,1,0,0)):i.drawImage(e,0,0,A,n,0,0,G==null?void 0:G.width,G==null?void 0:G.height),(!_||G.width!==_.width||(G==null?void 0:G.height)!==(_==null?void 0:_.height))&&(_=s0(G.width,G.height)),t.filter.enabled&&R.webgl.supported){if(D||(D=R.browser?new Po:null),R.filter=!!D,!D||!D.add)return t.debug&&g("input process error: cannot initialize filters"),{tensor:null,canvas:G};D.reset(),t.filter.brightness!==0&&D.add("brightness",t.filter.brightness),t.filter.contrast!==0&&D.add("contrast",t.filter.contrast),t.filter.sharpness!==0&&D.add("sharpen",t.filter.sharpness),t.filter.blur!==0&&D.add("blur",t.filter.blur),t.filter.saturation!==0&&D.add("saturation",t.filter.saturation),t.filter.hue!==0&&D.add("hue",t.filter.hue),t.filter.negative&&D.add("negative"),t.filter.sepia&&D.add("sepia"),t.filter.vintage&&D.add("brownie"),t.filter.sepia&&D.add("sepia"),t.filter.kodachrome&&D.add("kodachrome"),t.filter.technicolor&&D.add("technicolor"),t.filter.polaroid&&D.add("polaroid"),t.filter.pixelate!==0&&D.add("pixelate",t.filter.pixelate),D.get()>0?_=D.apply(G):_=D.draw(G)}else St(G,_),D&&(D=null),R.filter=!!D;if(!o)return{tensor:null,canvas:_};if(!_)throw new Error("canvas error: cannot create output");let x,d=3;if(typeof ImageData!="undefined"&&e instanceof ImageData||e.data&&e.width&&e.height)if(R.browser&&r.browser)x=r.browser?r.browser.fromPixels(e):null;else{d=e.data.length/e.height/e.width;let c=new Uint8Array(e.data.buffer);x=r.tensor(c,[e.height,e.width,d],"int32")}else if((!ae||_.width!==ae.width||_.height!==ae.height)&&(ae=s0(_.width,_.height)),r.browser&&R.browser)t.backend==="webgl"||t.backend==="humangl"||t.backend==="webgpu"?x=r.browser.fromPixels(_):(ae=St(_),x=r.browser.fromPixels(ae));else{let h=St(_).getContext("2d").getImageData(0,0,s,a);d=h.data.length/s/a;let m=new Uint8Array(h.data.buffer);x=r.tensor(m,[s,a,d])}if(d===4){let c=r.slice3d(x,[0,0,0],[-1,-1,3]);r.dispose(x),x=c}if(!x)throw new Error("input error: cannot create tensor");let l=r.cast(x,"float32"),y=t.filter.equalization?await Xe(l):r.expandDims(l,0);return r.dispose([x,l]),{tensor:y,canvas:t.filter.return?_:null}}}async function Mo(e,t){let o=!1;if(e.cacheSensitivity===0||!t.shape||t.shape.length!==4||t.shape[1]>2048||t.shape[2]>2048)return o;if(!z0.inputTensor)z0.inputTensor=r.clone(t);else if(z0.inputTensor.shape[1]!==t.shape[1]||z0.inputTensor.shape[2]!==t.shape[2])r.dispose(z0.inputTensor),z0.inputTensor=r.clone(t);else{let A={};A.diff=r.sub(t,z0.inputTensor),A.squared=r.mul(A.diff,A.diff),A.sum=r.sum(A.squared);let s=(await A.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;r.dispose([z0.inputTensor,A.diff,A.squared,A.sum]),z0.inputTensor=r.clone(t),o=s<=(e.cacheSensitivity||0)}return o}async function vo(e,t,o){let A={};if(!t||!o||t.shape.length!==4||t.shape.length!==o.shape.length)return e.debug||g("invalid input tensor or tensor shapes do not match:",t.shape,o.shape),0;if(t.shape[0]!==1||o.shape[0]!==1||t.shape[3]!==3||o.shape[3]!==3)return e.debug||g("input tensors must be of shape [1, height, width, 3]:",t.shape,o.shape),0;A.input1=r.clone(t),A.input2=t.shape[1]!==o.shape[1]||t.shape[2]!==o.shape[2]?r.image.resizeBilinear(o,[t.shape[1],t.shape[2]]):r.clone(o),A.diff=r.sub(A.input1,A.input2),A.squared=r.mul(A.diff,A.diff),A.sum=r.sum(A.squared);let s=(await A.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;return r.dispose([A.input1,A.input2,A.diff,A.squared,A.sum]),s}var To=class{constructor(){w(this,"browser");w(this,"node");w(this,"worker");w(this,"platform","");w(this,"agent","");w(this,"backends",[]);w(this,"initial");w(this,"filter");w(this,"tfjs");w(this,"offscreen");w(this,"perfadd",!1);w(this,"wasm",{supported:void 0,backend:void 0,simd:void 0,multithread:void 0});w(this,"webgl",{supported:void 0,backend:void 0,version:void 0,renderer:void 0});w(this,"webgpu",{supported:void 0,backend:void 0,adapter:void 0});w(this,"cpu",{model:void 0,flags:[]});w(this,"kernels",[]);w(this,"Canvas");w(this,"Image");w(this,"ImageData");if(this.browser=typeof navigator!="undefined",this.node=typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined",this.tfjs={version:je["tfjs-core"]},this.offscreen=typeof OffscreenCanvas!="undefined",this.initial=!0,this.worker=this.browser&&this.offscreen?typeof WorkerGlobalScope!="undefined":void 0,typeof navigator!="undefined"){let t=navigator.userAgent.match(/\(([^()]+)\)/g);if(t&&t[0]){let o=t[0].match(/\(([^()]+)\)/g);this.platform=o&&o[0]?o[0].replace(/\(|\)/g,""):"",this.agent=navigator.userAgent.replace(t[0],""),this.platform[1]&&(this.agent=this.agent.replace(t[1],"")),this.agent=this.agent.replace(/ /g," ")}}else typeof process!="undefined"&&(this.platform=`${process.platform} ${process.arch}`,this.agent=`NodeJS ${process.version}`)}async updateBackend(){this.backends=Object.keys(r.engine().registryFactory),this.wasm.supported=typeof WebAssembly!="undefined",this.wasm.backend=this.backends.includes("wasm"),this.wasm.supported&&this.wasm.backend&&r.getBackend()==="wasm"&&(this.wasm.simd=await r.env().getAsync("WASM_HAS_SIMD_SUPPORT"),this.wasm.multithread=await r.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"));let t=s0(100,100),o=t?t.getContext("webgl2"):void 0;if(this.webgl.supported=typeof o!="undefined",this.webgl.backend=this.backends.includes("webgl"),this.webgl.supported&&this.webgl.backend&&(r.getBackend()==="webgl"||r.getBackend()==="humangl")){let A=r.backend().gpgpu!=="undefined"?await r.backend().getGPGPUContext().gl:null;A&&(this.webgl.version=A.getParameter(A.VERSION),this.webgl.renderer=A.getParameter(A.RENDERER))}this.webgpu.supported=this.browser&&typeof navigator.gpu!="undefined",this.webgpu.backend=this.backends.includes("webgpu");try{this.webgpu.supported&&(this.webgpu.adapter=(await navigator.gpu.requestAdapter()).name)}catch(A){this.webgpu.supported=!1}try{this.kernels=r.getKernelsForBackend(r.getBackend()).map(A=>A.kernelName.toLowerCase())}catch(A){}}async updateCPU(){let t={model:"",flags:[]};this.node&&this.platform.startsWith("linux"),this.cpu?this.cpu=t:Object.defineProperty(this,"cpu",{value:t})}},R=new To;var j0={cacheModels:!1,verbose:!0,debug:!1,modelBasePath:""};async function Pr(e,t){return j0.debug&&g("load model fetch:",e,t),fetch(e,t)}function Ro(e){j0.cacheModels=e.cacheModels,j0.verbose=e.debug,j0.modelBasePath=e.modelBasePath}async function N(e){let t=co(j0.modelBasePath,e||""),o=t.split("/"),A="indexeddb://"+o[o.length-1].replace(".json",""),n=await r.io.listModels(),s=j0.cacheModels&&Object.keys(n).includes(A),a=typeof fetch=="undefined"?{}:{fetchFunc:(x,d)=>Pr(x,d)},i=new zt(s?A:t,a);try{i.findIOHandler(),j0.debug&&g("model load handler:",i.handler);let x=await i.handler.load();i.loadSync(x),j0.verbose&&g("load model:",i.modelUrl)}catch(x){g("error loading model:",t,x)}if(j0.cacheModels&&!s)try{let x=await i.save(A);g("model saved:",A,x)}catch(x){g("error saving model:",t,x)}return i}var Wt="2.6.4";var u0,Ct=[],Tr=["white","black","asian","indian","other"],Rr=[15,23,28,35.5,45.5,55.5,65],wo=0,ko=0,It=Number.MAX_SAFE_INTEGER;async function Eo(e){return R.initial&&(u0=null),u0?e.debug&&g("cached model:",u0.modelUrl):u0=await N(e.face.gear),u0}async function Ot(e,t,o,A){var a,i;if(!u0)return{age:0,gender:"unknown",genderScore:0,race:[]};let n=It<(((a=t.face.gear)==null?void 0:a.skipFrames)||0),s=(((i=t.face.gear)==null?void 0:i.skipTime)||0)>P()-ko;return t.skipAllowed&&s&&n&&wo===A&&Ct[o]?(It++,Ct[o]):(It=0,new Promise(async x=>{var b,M;if(!(u0!=null&&u0.inputs[0].shape))return;let d={},l=[[0,.1,.9,.9]];d.resize=r.image.cropAndResize(e,l,[0],[u0.inputs[0].shape[2],u0.inputs[0].shape[1]]);let y={age:0,gender:"unknown",genderScore:0,race:[]};(b=t.face.gear)!=null&&b.enabled&&([d.age,d.gender,d.race]=u0.execute(d.resize,["age_output","gender_output","race_output"]));let c=await d.gender.data();y.gender=c[0]>c[1]?"male":"female",y.genderScore=Math.round(100*(c[0]>c[1]?c[0]:c[1]))/100;let f=await d.race.data();for(let p=0;p(((M=t.face.gear)==null?void 0:M.minConfidence)||.2)&&y.race.push({score:Math.round(100*f[p])/100,race:Tr[p]});y.race.sort((p,u)=>u.score-p.score);let m=Array.from(await d.age.data()).map((p,u)=>[Rr[u],p]).sort((p,u)=>u[1]-p[1]),v=m[0][0];for(let p=1;pr.dispose(d[p])),Ct[o]=y,wo=A,ko=P(),x(y)}))}var L={tf255:255,tf1:1,tf2:2,tf05:.5,tf127:127.5,rgb:[.2989,.587,.114]};function jo(){L.tf255=r.scalar(255,"float32"),L.tf1=r.scalar(1,"float32"),L.tf2=r.scalar(2,"float32"),L.tf05=r.scalar(.5,"float32"),L.tf127=r.scalar(127.5,"float32"),L.rgb=r.tensor1d([.2989,.587,.114],"float32")}var l0,qe=[],So=0,Wo=0,Nt=Number.MAX_SAFE_INTEGER;async function Co(e){return R.initial&&(l0=null),l0?e.debug&&g("cached model:",l0.modelUrl):l0=await N(e.face.ssrnet.modelPathAge),l0}async function Lt(e,t,o,A){var a,i,x,d;if(!l0)return{age:0};let n=Nt<(((a=t.face.ssrnet)==null?void 0:a.skipFrames)||0),s=(((i=t.face.ssrnet)==null?void 0:i.skipTime)||0)>P()-Wo;return t.skipAllowed&&n&&s&&So===A&&((x=qe[o])==null?void 0:x.age)&&((d=qe[o])==null?void 0:d.age)>0?(Nt++,qe[o]):(Nt=0,new Promise(async l=>{if(!(l0!=null&&l0.inputs)||!l0.inputs[0]||!l0.inputs[0].shape)return;let y={};y.resize=r.image.resizeBilinear(e,[l0.inputs[0].shape[2],l0.inputs[0].shape[1]],!1),y.enhance=r.mul(y.resize,L.tf255);let c={age:0};if(t.face.ssrnet.enabled&&(y.age=l0.execute(y.enhance)),y.age){let f=await y.age.data();c.age=Math.trunc(10*f[0])/10}Object.keys(y).forEach(f=>r.dispose(y[f])),qe[o]=c,So=A,Wo=P(),l(c)}))}var h0,Ue=[],Oo=0,No=0,Bt=Number.MAX_SAFE_INTEGER,Gt=[.2989,.587,.114];async function Lo(e){return R.initial&&(h0=null),h0?e.debug&&g("cached model:",h0.modelUrl):h0=await N(e.face.ssrnet.modelPathGender),h0}async function Ht(e,t,o,A){var a,i,x,d;if(!h0)return{gender:"unknown",genderScore:0};let n=Bt<(((a=t.face.ssrnet)==null?void 0:a.skipFrames)||0),s=(((i=t.face.ssrnet)==null?void 0:i.skipTime)||0)>P()-No;return t.skipAllowed&&n&&s&&Oo===A&&((x=Ue[o])==null?void 0:x.gender)&&((d=Ue[o])==null?void 0:d.genderScore)>0?(Bt++,Ue[o]):(Bt=0,new Promise(async l=>{if(!(h0!=null&&h0.inputs[0].shape))return;let y={};y.resize=r.image.resizeBilinear(e,[h0.inputs[0].shape[2],h0.inputs[0].shape[1]],!1),y.enhance=r.tidy(()=>{let[h,m,v]=r.split(y.resize,3,3),b=r.mul(h,Gt[0]),M=r.mul(m,Gt[1]),p=r.mul(v,Gt[2]),u=r.addN([b,M,p]);return r.mul(r.sub(u,L.tf05),2)});let c={gender:"unknown",genderScore:0};t.face.ssrnet.enabled&&(y.gender=h0.execute(y.enhance));let f=await y.gender.data();c.gender=f[0]>f[1]?"female":"male",c.genderScore=f[0]>f[1]?Math.trunc(100*f[0])/100:Math.trunc(100*f[1])/100,Object.keys(y).forEach(h=>r.dispose(y[h])),Ue[o]=c,Oo=A,No=P(),l(c)}))}var A0,Je=[],Ft=Number.MAX_SAFE_INTEGER,Go=0,Ho=0;async function Fo(e){var t;return R.initial&&(A0=null),A0?e.debug&&g("cached model:",A0.modelUrl):A0=await N((t=e.face.antispoof)==null?void 0:t.modelPath),A0}async function Vt(e,t,o,A){var a,i;if(!A0)return 0;let n=(((a=t.face.antispoof)==null?void 0:a.skipTime)||0)>P()-Ho,s=Ft<(((i=t.face.antispoof)==null?void 0:i.skipFrames)||0);return t.skipAllowed&&n&&s&&Go===A&&Je[o]?(Ft++,Je[o]):(Ft=0,new Promise(async x=>{let d=r.image.resizeBilinear(e,[A0!=null&&A0.inputs[0].shape?A0.inputs[0].shape[2]:0,A0!=null&&A0.inputs[0].shape?A0.inputs[0].shape[1]:0],!1),l=A0==null?void 0:A0.execute(d),y=(await l.data())[0];Je[o]=Math.round(100*y)/100,Go=A,Ho=P(),r.dispose([d,l]),x(Je[o])}))}var b0={silhouette:[10,338,297,332,284,251,389,356,454,323,361,288,397,365,379,378,400,377,152,148,176,149,150,136,172,58,132,93,234,127,162,21,54,103,67,109],lipsUpperOuter:[61,185,40,39,37,0,267,269,270,409,291],lipsLowerOuter:[146,91,181,84,17,314,405,321,375,291],lipsUpperInner:[78,191,80,81,82,13,312,311,310,415,308],lipsLowerInner:[78,95,88,178,87,14,317,402,318,324,308],rightEyeUpper0:[246,161,160,159,158,157,173],rightEyeLower0:[33,7,163,144,145,153,154,155,133],rightEyeUpper1:[247,30,29,27,28,56,190],rightEyeLower1:[130,25,110,24,23,22,26,112,243],rightEyeUpper2:[113,225,224,223,222,221,189],rightEyeLower2:[226,31,228,229,230,231,232,233,244],rightEyeLower3:[143,111,117,118,119,120,121,128,245],rightEyebrowUpper:[156,70,63,105,66,107,55,193],rightEyebrowLower:[35,124,46,53,52,65],rightEyeIris:[473,474,475,476,477],leftEyeUpper0:[466,388,387,386,385,384,398],leftEyeLower0:[263,249,390,373,374,380,381,382,362],leftEyeUpper1:[467,260,259,257,258,286,414],leftEyeLower1:[359,255,339,254,253,252,256,341,463],leftEyeUpper2:[342,445,444,443,442,441,413],leftEyeLower2:[446,261,448,449,450,451,452,453,464],leftEyeLower3:[372,340,346,347,348,349,350,357,465],leftEyebrowUpper:[383,300,293,334,296,336,285,417],leftEyebrowLower:[265,353,276,283,282,295],leftEyeIris:[468,469,470,471,472],midwayBetweenEyes:[168],noseTip:[1],noseBottom:[2],noseRightCorner:[98],noseLeftCorner:[327],rightCheek:[205],leftCheek:[425]},Zt={count:468,mouth:13,symmetryLine:[13,b0.midwayBetweenEyes[0]]},We={leftEye:0,rightEye:1,nose:2,mouth:3,leftEar:4,rightEar:5,symmetryLine:[3,2]},Xt=[{key:"EyeUpper0",indices:[9,10,11,12,13,14,15]},{key:"EyeUpper1",indices:[25,26,27,28,29,30,31]},{key:"EyeUpper2",indices:[41,42,43,44,45,46,47]},{key:"EyeLower0",indices:[0,1,2,3,4,5,6,7,8]},{key:"EyeLower1",indices:[16,17,18,19,20,21,22,23,24]},{key:"EyeLower2",indices:[32,33,34,35,36,37,38,39,40]},{key:"EyeLower3",indices:[54,55,56,57,58,59,60,61,62]}],Ce=[[.499976992607117,.652534008026123],[.500025987625122,.547487020492554],[.499974012374878,.602371990680695],[.482113003730774,.471979022026062],[.500150978565216,.527155995368958],[.499909996986389,.498252987861633],[.499523013830185,.40106201171875],[.289712011814117,.380764007568359],[.499954998493195,.312398016452789],[.499987006187439,.269918978214264],[.500023007392883,.107050001621246],[.500023007392883,.666234016418457],[.5000159740448,.679224014282227],[.500023007392883,.692348003387451],[.499976992607117,.695277988910675],[.499976992607117,.70593398809433],[.499976992607117,.719385027885437],[.499976992607117,.737019002437592],[.499967992305756,.781370997428894],[.499816000461578,.562981009483337],[.473773002624512,.573909997940063],[.104906998574734,.254140973091125],[.365929991006851,.409575998783112],[.338757991790771,.41302502155304],[.311120003461838,.409460008144379],[.274657994508743,.389131009578705],[.393361985683441,.403706014156342],[.345234006643295,.344011008739471],[.370094001293182,.346076011657715],[.319321990013123,.347265005111694],[.297903001308441,.353591024875641],[.24779200553894,.410809993743896],[.396889001131058,.842755019664764],[.280097991228104,.375599980354309],[.106310002505779,.399955987930298],[.2099249958992,.391353011131287],[.355807989835739,.534406006336212],[.471751004457474,.65040397644043],[.474155008792877,.680191993713379],[.439785003662109,.657229006290436],[.414617002010345,.66654098033905],[.450374007225037,.680860996246338],[.428770989179611,.682690978050232],[.374971002340317,.727805018424988],[.486716985702515,.547628998756409],[.485300987958908,.527395009994507],[.257764995098114,.314490020275116],[.401223003864288,.455172002315521],[.429818987846375,.548614978790283],[.421351999044418,.533740997314453],[.276895999908447,.532056987285614],[.483370006084442,.499586999416351],[.33721199631691,.282882988452911],[.296391993761063,.293242990970612],[.169294998049736,.193813979625702],[.447580009698868,.302609980106354],[.392390012741089,.353887975215912],[.354490011930466,.696784019470215],[.067304998636246,.730105042457581],[.442739009857178,.572826027870178],[.457098007202148,.584792017936707],[.381974011659622,.694710969924927],[.392388999462128,.694203019142151],[.277076005935669,.271932005882263],[.422551989555359,.563233017921448],[.385919004678726,.281364023685455],[.383103013038635,.255840003490448],[.331431001424789,.119714021682739],[.229923993349075,.232002973556519],[.364500999450684,.189113974571228],[.229622006416321,.299540996551514],[.173287004232407,.278747975826263],[.472878992557526,.666198015213013],[.446828007698059,.668527007102966],[.422762006521225,.673889994621277],[.445307999849319,.580065965652466],[.388103008270264,.693961024284363],[.403039008378983,.706539988517761],[.403629004955292,.693953037261963],[.460041999816895,.557139039039612],[.431158006191254,.692366003990173],[.452181994915009,.692366003990173],[.475387006998062,.692366003990173],[.465828001499176,.779190003871918],[.472328990697861,.736225962638855],[.473087012767792,.717857003211975],[.473122000694275,.704625964164734],[.473033010959625,.695277988910675],[.427942007780075,.695277988910675],[.426479011774063,.703539967536926],[.423162013292313,.711845993995667],[.4183090031147,.720062971115112],[.390094995498657,.639572978019714],[.013953999616206,.560034036636353],[.499913990497589,.58014702796936],[.413199990987778,.69539999961853],[.409626007080078,.701822996139526],[.468080013990402,.601534962654114],[.422728985548019,.585985004901886],[.463079988956451,.593783974647522],[.37211999297142,.47341400384903],[.334562003612518,.496073007583618],[.411671012639999,.546965003013611],[.242175996303558,.14767599105835],[.290776997804642,.201445996761322],[.327338010072708,.256527006626129],[.399509996175766,.748921036720276],[.441727995872498,.261676013469696],[.429764986038208,.187834024429321],[.412198007106781,.108901023864746],[.288955003023148,.398952007293701],[.218936994671822,.435410976409912],[.41278201341629,.398970007896423],[.257135003805161,.355440020561218],[.427684992551804,.437960982322693],[.448339998722076,.536936044692993],[.178560003638268,.45755398273468],[.247308000922203,.457193970680237],[.286267012357712,.467674970626831],[.332827985286713,.460712015628815],[.368755996227264,.447206974029541],[.398963987827301,.432654976844788],[.476410001516342,.405806005001068],[.189241006970406,.523923993110657],[.228962004184723,.348950982093811],[.490725994110107,.562400996685028],[.404670000076294,.485132992267609],[.019469000399113,.401564002037048],[.426243007183075,.420431017875671],[.396993011236191,.548797011375427],[.266469985246658,.376977026462555],[.439121007919312,.51895797252655],[.032313998788595,.644356966018677],[.419054001569748,.387154996395111],[.462783008813858,.505746960639954],[.238978996872902,.779744982719421],[.198220998048782,.831938028335571],[.107550002634525,.540755033493042],[.183610007166862,.740257024765015],[.134409993886948,.333683013916016],[.385764002799988,.883153975009918],[.490967005491257,.579378008842468],[.382384985685349,.508572995662689],[.174399003386497,.397670984268188],[.318785011768341,.39623498916626],[.343364000320435,.400596976280212],[.396100014448166,.710216999053955],[.187885001301765,.588537991046906],[.430987000465393,.944064974784851],[.318993002176285,.898285031318665],[.266247987747192,.869701027870178],[.500023007392883,.190576016902924],[.499976992607117,.954452991485596],[.366169989109039,.398822009563446],[.393207013607025,.39553701877594],[.410373002290726,.391080021858215],[.194993004202843,.342101991176605],[.388664990663528,.362284004688263],[.365961998701096,.355970978736877],[.343364000320435,.355356991291046],[.318785011768341,.35834002494812],[.301414996385574,.363156020641327],[.058132998645306,.319076001644135],[.301414996385574,.387449026107788],[.499987989664078,.618434011936188],[.415838003158569,.624195992946625],[.445681989192963,.566076993942261],[.465844005346298,.620640993118286],[.49992299079895,.351523995399475],[.288718998432159,.819945991039276],[.335278987884521,.852819979190826],[.440512001514435,.902418971061707],[.128294005990028,.791940987110138],[.408771991729736,.373893976211548],[.455606997013092,.451801002025604],[.499877005815506,.908990025520325],[.375436991453171,.924192011356354],[.11421000212431,.615022003650665],[.448662012815475,.695277988910675],[.4480200111866,.704632043838501],[.447111994028091,.715808033943176],[.444831997156143,.730794012546539],[.430011987686157,.766808986663818],[.406787008047104,.685672998428345],[.400738000869751,.681069016456604],[.392399996519089,.677703022956848],[.367855995893478,.663918972015381],[.247923001646996,.601333022117615],[.452769994735718,.420849978923798],[.43639200925827,.359887003898621],[.416164010763168,.368713974952698],[.413385987281799,.692366003990173],[.228018000721931,.683571994304657],[.468268007040024,.352671027183533],[.411361992359161,.804327011108398],[.499989002943039,.469825029373169],[.479153990745544,.442654013633728],[.499974012374878,.439637005329132],[.432112008333206,.493588984012604],[.499886006116867,.866917014122009],[.49991300702095,.821729004383087],[.456548988819122,.819200992584229],[.344549000263214,.745438992977142],[.37890899181366,.574010014533997],[.374292999505997,.780184984207153],[.319687992334366,.570737957954407],[.357154995203018,.604269981384277],[.295284003019333,.621580958366394],[.447750002145767,.862477004528046],[.410986006259918,.508723020553589],[.31395098567009,.775308012962341],[.354128003120422,.812552988529205],[.324548006057739,.703992962837219],[.189096003770828,.646299958229065],[.279776990413666,.71465802192688],[.1338230073452,.682700991630554],[.336768001317978,.644733011722565],[.429883986711502,.466521978378296],[.455527991056442,.548622965812683],[.437114000320435,.558896005153656],[.467287987470627,.529924988746643],[.414712011814117,.335219979286194],[.37704598903656,.322777986526489],[.344107985496521,.320150971412659],[.312875986099243,.32233202457428],[.283526003360748,.333190023899078],[.241245999932289,.382785975933075],[.102986000478268,.468762993812561],[.267612010240555,.424560010433197],[.297879010438919,.433175981044769],[.333433985710144,.433878004550934],[.366427004337311,.426115989685059],[.396012008190155,.416696012020111],[.420121014118195,.41022801399231],[.007561000064015,.480777025222778],[.432949006557465,.569517970085144],[.458638995885849,.479089021682739],[.473466008901596,.545744001865387],[.476087987422943,.563830018043518],[.468472003936768,.555056989192963],[.433990985155106,.582361996173859],[.483518004417419,.562983989715576],[.482482999563217,.57784903049469],[.42645001411438,.389798998832703],[.438998997211456,.39649498462677],[.450067013502121,.400434017181396],[.289712011814117,.368252992630005],[.276670008897781,.363372981548309],[.517862021923065,.471948027610779],[.710287988185883,.380764007568359],[.526226997375488,.573909997940063],[.895093023777008,.254140973091125],[.634069979190826,.409575998783112],[.661242008209229,.41302502155304],[.688880026340485,.409460008144379],[.725341975688934,.389131009578705],[.606630027294159,.40370500087738],[.654766023159027,.344011008739471],[.629905998706818,.346076011657715],[.680678009986877,.347265005111694],[.702096998691559,.353591024875641],[.75221198797226,.410804986953735],[.602918028831482,.842862963676453],[.719901978969574,.375599980354309],[.893692970275879,.399959981441498],[.790081977844238,.391354024410248],[.643998026847839,.534487962722778],[.528249025344849,.65040397644043],[.525849997997284,.680191040039062],[.560214996337891,.657229006290436],[.585384011268616,.66654098033905],[.549625992774963,.680860996246338],[.57122802734375,.682691991329193],[.624852001667023,.72809898853302],[.513050019741058,.547281980514526],[.51509702205658,.527251958847046],[.742246985435486,.314507007598877],[.598631024360657,.454979002475739],[.570338010787964,.548575043678284],[.578631997108459,.533622980117798],[.723087012767792,.532054007053375],[.516445994377136,.499638974666595],[.662801027297974,.282917976379395],[.70362401008606,.293271005153656],[.830704987049103,.193813979625702],[.552385985851288,.302568018436432],[.607609987258911,.353887975215912],[.645429015159607,.696707010269165],[.932694971561432,.730105042457581],[.557260990142822,.572826027870178],[.542901992797852,.584792017936707],[.6180260181427,.694710969924927],[.607590973377228,.694203019142151],[.722943007946014,.271963000297546],[.577413976192474,.563166975975037],[.614082992076874,.281386971473694],[.616907000541687,.255886018276215],[.668509006500244,.119913995265961],[.770092010498047,.232020974159241],[.635536015033722,.189248979091644],[.77039098739624,.299556016921997],[.826722025871277,.278755009174347],[.527121007442474,.666198015213013],[.553171992301941,.668527007102966],[.577238023281097,.673889994621277],[.554691970348358,.580065965652466],[.611896991729736,.693961024284363],[.59696102142334,.706539988517761],[.596370995044708,.693953037261963],[.539958000183105,.557139039039612],[.568841993808746,.692366003990173],[.547818005084991,.692366003990173],[.52461302280426,.692366003990173],[.534089982509613,.779141008853912],[.527670979499817,.736225962638855],[.526912987232208,.717857003211975],[.526877999305725,.704625964164734],[.526966989040375,.695277988910675],[.572058022022247,.695277988910675],[.573521018028259,.703539967536926],[.57683801651001,.711845993995667],[.581691026687622,.720062971115112],[.609944999217987,.639909982681274],[.986046016216278,.560034036636353],[.5867999792099,.69539999961853],[.590372025966644,.701822996139526],[.531915009021759,.601536989212036],[.577268004417419,.585934996604919],[.536915004253387,.593786001205444],[.627542972564697,.473352015018463],[.665585994720459,.495950996875763],[.588353991508484,.546862006187439],[.757824003696442,.14767599105835],[.709249973297119,.201507985591888],[.672684013843536,.256581008434296],[.600408971309662,.74900496006012],[.55826598405838,.261672019958496],[.570303976535797,.187870979309082],[.588165998458862,.109044015407562],[.711045026779175,.398952007293701],[.781069993972778,.435405015945435],[.587247014045715,.398931980133057],[.742869973182678,.355445981025696],[.572156012058258,.437651991844177],[.55186802148819,.536570012569427],[.821442008018494,.457556009292603],[.752701997756958,.457181990146637],[.71375697851181,.467626988887787],[.66711300611496,.460672974586487],[.631101012229919,.447153985500336],[.6008620262146,.432473003864288],[.523481011390686,.405627012252808],[.810747981071472,.523926019668579],[.771045982837677,.348959028720856],[.509127020835876,.562718033790588],[.595292985439301,.485023975372314],[.980530977249146,.401564002037048],[.573499977588654,.420000016689301],[.602994978427887,.548687994480133],[.733529984951019,.376977026462555],[.560611009597778,.519016981124878],[.967685997486115,.644356966018677],[.580985009670258,.387160003185272],[.537728011608124,.505385041236877],[.760966002941132,.779752969741821],[.801778972148895,.831938028335571],[.892440974712372,.54076099395752],[.816350996494293,.740260004997253],[.865594983100891,.333687007427216],[.614073991775513,.883246004581451],[.508952975273132,.579437971115112],[.617941975593567,.508316040039062],[.825608015060425,.397674977779388],[.681214988231659,.39623498916626],[.656635999679565,.400596976280212],[.603900015354156,.710216999053955],[.81208598613739,.588539004325867],[.56801301240921,.944564998149872],[.681007981300354,.898285031318665],[.733752012252808,.869701027870178],[.633830010890961,.398822009563446],[.606792986392975,.39553701877594],[.589659988880157,.391062021255493],[.805015981197357,.342108011245728],[.611334979534149,.362284004688263],[.634037971496582,.355970978736877],[.656635999679565,.355356991291046],[.681214988231659,.35834002494812],[.698584973812103,.363156020641327],[.941866993904114,.319076001644135],[.698584973812103,.387449026107788],[.584177017211914,.624107003211975],[.554318010807037,.566076993942261],[.534153997898102,.62064003944397],[.711217999458313,.819975018501282],[.664629995822906,.852871000766754],[.559099972248077,.902631998062134],[.871706008911133,.791940987110138],[.591234028339386,.373893976211548],[.544341027736664,.451583981513977],[.624562978744507,.924192011356354],[.88577002286911,.615028977394104],[.551338016986847,.695277988910675],[.551980018615723,.704632043838501],[.552887976169586,.715808033943176],[.555167973041534,.730794012546539],[.569944024085999,.767035007476807],[.593203008174896,.685675978660583],[.599261999130249,.681069016456604],[.607599973678589,.677703022956848],[.631937980651855,.663500010967255],[.752032995223999,.601315021514893],[.547226011753082,.420395016670227],[.563543975353241,.359827995300293],[.583841025829315,.368713974952698],[.586614012718201,.692366003990173],[.771915018558502,.683578014373779],[.531597018241882,.352482974529266],[.588370978832245,.804440975189209],[.52079701423645,.442565023899078],[.567984998226166,.493479013442993],[.543282985687256,.819254994392395],[.655317008495331,.745514988899231],[.621008992195129,.574018001556396],[.625559985637665,.78031200170517],[.680198013782501,.570719003677368],[.64276397228241,.604337990283966],[.704662978649139,.621529996395111],[.552012026309967,.862591981887817],[.589071989059448,.508637011051178],[.685944974422455,.775357007980347],[.645735025405884,.812640011310577],[.675342977046967,.703978002071381],[.810858011245728,.646304965019226],[.72012197971344,.714666962623596],[.866151988506317,.682704985141754],[.663187026977539,.644596993923187],[.570082008838654,.466325998306274],[.544561982154846,.548375964164734],[.562758982181549,.558784961700439],[.531987011432648,.530140042304993],[.585271000862122,.335177004337311],[.622952997684479,.32277899980545],[.655896008014679,.320163011550903],[.687132000923157,.322345972061157],[.716481983661652,.333200991153717],[.758756995201111,.382786989212036],[.897013008594513,.468769013881683],[.732392013072968,.424547016620636],[.70211398601532,.433162987232208],[.66652500629425,.433866024017334],[.633504986763,.426087975502014],[.603875994682312,.416586995124817],[.579657971858978,.409945011138916],[.992439985275269,.480777025222778],[.567192018032074,.569419980049133],[.54136598110199,.478899002075195],[.526564002037048,.546118021011353],[.523913025856018,.563830018043518],[.531529009342194,.555056989192963],[.566035985946655,.582329034805298],[.51631098985672,.563053965568542],[.5174720287323,.577877044677734],[.573594987392426,.389806985855103],[.560697972774506,.395331978797913],[.549755990505219,.399751007556915],[.710287988185883,.368252992630005],[.723330020904541,.363372981548309]],K0=[127,34,139,11,0,37,232,231,120,72,37,39,128,121,47,232,121,128,104,69,67,175,171,148,157,154,155,118,50,101,73,39,40,9,151,108,48,115,131,194,204,211,74,40,185,80,42,183,40,92,186,230,229,118,202,212,214,83,18,17,76,61,146,160,29,30,56,157,173,106,204,194,135,214,192,203,165,98,21,71,68,51,45,4,144,24,23,77,146,91,205,50,187,201,200,18,91,106,182,90,91,181,85,84,17,206,203,36,148,171,140,92,40,39,193,189,244,159,158,28,247,246,161,236,3,196,54,68,104,193,168,8,117,228,31,189,193,55,98,97,99,126,47,100,166,79,218,155,154,26,209,49,131,135,136,150,47,126,217,223,52,53,45,51,134,211,170,140,67,69,108,43,106,91,230,119,120,226,130,247,63,53,52,238,20,242,46,70,156,78,62,96,46,53,63,143,34,227,173,155,133,123,117,111,44,125,19,236,134,51,216,206,205,154,153,22,39,37,167,200,201,208,36,142,100,57,212,202,20,60,99,28,158,157,35,226,113,160,159,27,204,202,210,113,225,46,43,202,204,62,76,77,137,123,116,41,38,72,203,129,142,64,98,240,49,102,64,41,73,74,212,216,207,42,74,184,169,170,211,170,149,176,105,66,69,122,6,168,123,147,187,96,77,90,65,55,107,89,90,180,101,100,120,63,105,104,93,137,227,15,86,85,129,102,49,14,87,86,55,8,9,100,47,121,145,23,22,88,89,179,6,122,196,88,95,96,138,172,136,215,58,172,115,48,219,42,80,81,195,3,51,43,146,61,171,175,199,81,82,38,53,46,225,144,163,110,246,33,7,52,65,66,229,228,117,34,127,234,107,108,69,109,108,151,48,64,235,62,78,191,129,209,126,111,35,143,163,161,246,117,123,50,222,65,52,19,125,141,221,55,65,3,195,197,25,7,33,220,237,44,70,71,139,122,193,245,247,130,33,71,21,162,153,158,159,170,169,150,188,174,196,216,186,92,144,160,161,2,97,167,141,125,241,164,167,37,72,38,12,145,159,160,38,82,13,63,68,71,226,35,111,158,153,154,101,50,205,206,92,165,209,198,217,165,167,97,220,115,218,133,112,243,239,238,241,214,135,169,190,173,133,171,208,32,125,44,237,86,87,178,85,86,179,84,85,180,83,84,181,201,83,182,137,93,132,76,62,183,61,76,184,57,61,185,212,57,186,214,207,187,34,143,156,79,239,237,123,137,177,44,1,4,201,194,32,64,102,129,213,215,138,59,166,219,242,99,97,2,94,141,75,59,235,24,110,228,25,130,226,23,24,229,22,23,230,26,22,231,112,26,232,189,190,243,221,56,190,28,56,221,27,28,222,29,27,223,30,29,224,247,30,225,238,79,20,166,59,75,60,75,240,147,177,215,20,79,166,187,147,213,112,233,244,233,128,245,128,114,188,114,217,174,131,115,220,217,198,236,198,131,134,177,132,58,143,35,124,110,163,7,228,110,25,356,389,368,11,302,267,452,350,349,302,303,269,357,343,277,452,453,357,333,332,297,175,152,377,384,398,382,347,348,330,303,304,270,9,336,337,278,279,360,418,262,431,304,408,409,310,415,407,270,409,410,450,348,347,422,430,434,313,314,17,306,307,375,387,388,260,286,414,398,335,406,418,364,367,416,423,358,327,251,284,298,281,5,4,373,374,253,307,320,321,425,427,411,421,313,18,321,405,406,320,404,405,315,16,17,426,425,266,377,400,369,322,391,269,417,465,464,386,257,258,466,260,388,456,399,419,284,332,333,417,285,8,346,340,261,413,441,285,327,460,328,355,371,329,392,439,438,382,341,256,429,420,360,364,394,379,277,343,437,443,444,283,275,440,363,431,262,369,297,338,337,273,375,321,450,451,349,446,342,467,293,334,282,458,461,462,276,353,383,308,324,325,276,300,293,372,345,447,382,398,362,352,345,340,274,1,19,456,248,281,436,427,425,381,256,252,269,391,393,200,199,428,266,330,329,287,273,422,250,462,328,258,286,384,265,353,342,387,259,257,424,431,430,342,353,276,273,335,424,292,325,307,366,447,345,271,303,302,423,266,371,294,455,460,279,278,294,271,272,304,432,434,427,272,407,408,394,430,431,395,369,400,334,333,299,351,417,168,352,280,411,325,319,320,295,296,336,319,403,404,330,348,349,293,298,333,323,454,447,15,16,315,358,429,279,14,15,316,285,336,9,329,349,350,374,380,252,318,402,403,6,197,419,318,319,325,367,364,365,435,367,397,344,438,439,272,271,311,195,5,281,273,287,291,396,428,199,311,271,268,283,444,445,373,254,339,263,466,249,282,334,296,449,347,346,264,447,454,336,296,299,338,10,151,278,439,455,292,407,415,358,371,355,340,345,372,390,249,466,346,347,280,442,443,282,19,94,370,441,442,295,248,419,197,263,255,359,440,275,274,300,383,368,351,412,465,263,467,466,301,368,389,380,374,386,395,378,379,412,351,419,436,426,322,373,390,388,2,164,393,370,462,461,164,0,267,302,11,12,374,373,387,268,12,13,293,300,301,446,261,340,385,384,381,330,266,425,426,423,391,429,355,437,391,327,326,440,457,438,341,382,362,459,457,461,434,430,394,414,463,362,396,369,262,354,461,457,316,403,402,315,404,403,314,405,404,313,406,405,421,418,406,366,401,361,306,408,407,291,409,408,287,410,409,432,436,410,434,416,411,264,368,383,309,438,457,352,376,401,274,275,4,421,428,262,294,327,358,433,416,367,289,455,439,462,370,326,2,326,370,305,460,455,254,449,448,255,261,446,253,450,449,252,451,450,256,452,451,341,453,452,413,464,463,441,413,414,258,442,441,257,443,442,259,444,443,260,445,444,467,342,445,459,458,250,289,392,290,290,328,460,376,433,435,250,290,392,411,416,433,341,463,464,453,464,465,357,465,412,343,412,399,360,363,440,437,399,456,420,456,363,401,435,288,372,383,353,339,255,249,448,261,255,133,243,190,133,155,112,33,246,247,33,130,25,398,384,286,362,398,414,362,463,341,263,359,467,263,249,255,466,467,260,75,60,166,238,239,79,162,127,139,72,11,37,121,232,120,73,72,39,114,128,47,233,232,128,103,104,67,152,175,148,173,157,155,119,118,101,74,73,40,107,9,108,49,48,131,32,194,211,184,74,185,191,80,183,185,40,186,119,230,118,210,202,214,84,83,17,77,76,146,161,160,30,190,56,173,182,106,194,138,135,192,129,203,98,54,21,68,5,51,4,145,144,23,90,77,91,207,205,187,83,201,18,181,91,182,180,90,181,16,85,17,205,206,36,176,148,140,165,92,39,245,193,244,27,159,28,30,247,161,174,236,196,103,54,104,55,193,8,111,117,31,221,189,55,240,98,99,142,126,100,219,166,218,112,155,26,198,209,131,169,135,150,114,47,217,224,223,53,220,45,134,32,211,140,109,67,108,146,43,91,231,230,120,113,226,247,105,63,52,241,238,242,124,46,156,95,78,96,70,46,63,116,143,227,116,123,111,1,44,19,3,236,51,207,216,205,26,154,22,165,39,167,199,200,208,101,36,100,43,57,202,242,20,99,56,28,157,124,35,113,29,160,27,211,204,210,124,113,46,106,43,204,96,62,77,227,137,116,73,41,72,36,203,142,235,64,240,48,49,64,42,41,74,214,212,207,183,42,184,210,169,211,140,170,176,104,105,69,193,122,168,50,123,187,89,96,90,66,65,107,179,89,180,119,101,120,68,63,104,234,93,227,16,15,85,209,129,49,15,14,86,107,55,9,120,100,121,153,145,22,178,88,179,197,6,196,89,88,96,135,138,136,138,215,172,218,115,219,41,42,81,5,195,51,57,43,61,208,171,199,41,81,38,224,53,225,24,144,110,105,52,66,118,229,117,227,34,234,66,107,69,10,109,151,219,48,235,183,62,191,142,129,126,116,111,143,7,163,246,118,117,50,223,222,52,94,19,141,222,221,65,196,3,197,45,220,44,156,70,139,188,122,245,139,71,162,145,153,159,149,170,150,122,188,196,206,216,92,163,144,161,164,2,167,242,141,241,0,164,37,11,72,12,144,145,160,12,38,13,70,63,71,31,226,111,157,158,154,36,101,205,203,206,165,126,209,217,98,165,97,237,220,218,237,239,241,210,214,169,140,171,32,241,125,237,179,86,178,180,85,179,181,84,180,182,83,181,194,201,182,177,137,132,184,76,183,185,61,184,186,57,185,216,212,186,192,214,187,139,34,156,218,79,237,147,123,177,45,44,4,208,201,32,98,64,129,192,213,138,235,59,219,141,242,97,97,2,141,240,75,235,229,24,228,31,25,226,230,23,229,231,22,230,232,26,231,233,112,232,244,189,243,189,221,190,222,28,221,223,27,222,224,29,223,225,30,224,113,247,225,99,60,240,213,147,215,60,20,166,192,187,213,243,112,244,244,233,245,245,128,188,188,114,174,134,131,220,174,217,236,236,198,134,215,177,58,156,143,124,25,110,7,31,228,25,264,356,368,0,11,267,451,452,349,267,302,269,350,357,277,350,452,357,299,333,297,396,175,377,381,384,382,280,347,330,269,303,270,151,9,337,344,278,360,424,418,431,270,304,409,272,310,407,322,270,410,449,450,347,432,422,434,18,313,17,291,306,375,259,387,260,424,335,418,434,364,416,391,423,327,301,251,298,275,281,4,254,373,253,375,307,321,280,425,411,200,421,18,335,321,406,321,320,405,314,315,17,423,426,266,396,377,369,270,322,269,413,417,464,385,386,258,248,456,419,298,284,333,168,417,8,448,346,261,417,413,285,326,327,328,277,355,329,309,392,438,381,382,256,279,429,360,365,364,379,355,277,437,282,443,283,281,275,363,395,431,369,299,297,337,335,273,321,348,450,349,359,446,467,283,293,282,250,458,462,300,276,383,292,308,325,283,276,293,264,372,447,346,352,340,354,274,19,363,456,281,426,436,425,380,381,252,267,269,393,421,200,428,371,266,329,432,287,422,290,250,328,385,258,384,446,265,342,386,387,257,422,424,430,445,342,276,422,273,424,306,292,307,352,366,345,268,271,302,358,423,371,327,294,460,331,279,294,303,271,304,436,432,427,304,272,408,395,394,431,378,395,400,296,334,299,6,351,168,376,352,411,307,325,320,285,295,336,320,319,404,329,330,349,334,293,333,366,323,447,316,15,315,331,358,279,317,14,316,8,285,9,277,329,350,253,374,252,319,318,403,351,6,419,324,318,325,397,367,365,288,435,397,278,344,439,310,272,311,248,195,281,375,273,291,175,396,199,312,311,268,276,283,445,390,373,339,295,282,296,448,449,346,356,264,454,337,336,299,337,338,151,294,278,455,308,292,415,429,358,355,265,340,372,388,390,466,352,346,280,295,442,282,354,19,370,285,441,295,195,248,197,457,440,274,301,300,368,417,351,465,251,301,389,385,380,386,394,395,379,399,412,419,410,436,322,387,373,388,326,2,393,354,370,461,393,164,267,268,302,12,386,374,387,312,268,13,298,293,301,265,446,340,380,385,381,280,330,425,322,426,391,420,429,437,393,391,326,344,440,438,458,459,461,364,434,394,428,396,262,274,354,457,317,316,402,316,315,403,315,314,404,314,313,405,313,421,406,323,366,361,292,306,407,306,291,408,291,287,409,287,432,410,427,434,411,372,264,383,459,309,457,366,352,401,1,274,4,418,421,262,331,294,358,435,433,367,392,289,439,328,462,326,94,2,370,289,305,455,339,254,448,359,255,446,254,253,449,253,252,450,252,256,451,256,341,452,414,413,463,286,441,414,286,258,441,258,257,442,257,259,443,259,260,444,260,467,445,309,459,250,305,289,290,305,290,460,401,376,435,309,250,392,376,411,433,453,341,464,357,453,465,343,357,412,437,343,399,344,360,440,420,437,456,360,420,363,361,401,288,265,372,353,390,339,249,339,448,255];var kr=[127,234,132,58,172,150,149,148,152,377,378,379,397,288,361,454,356,70,63,105,66,107,336,296,334,293,300,168,6,195,4,98,97,2,326,327,33,160,158,133,153,144,362,385,387,263,373,380,57,40,37,0,267,270,287,321,314,17,84,91,78,81,13,311,308,402,14,178],Er=[33,133,362,263,1,62,308,159,145,386,374,6,102,331,2,13,14,70,105,107,336,334,300,54,10,284,50,280,234,454,58,288,152],zr=[33,133,362,263,1,78,308],Ts=kr.map(e=>Ce[e]),Rs=Er.map(e=>Ce[e]),ws=zr.map(e=>Ce[e]);var le=e=>[Math.abs(e.endPoint[0]-e.startPoint[0]),Math.abs(e.endPoint[1]-e.startPoint[1])],Ye=e=>[e.startPoint[0]+(e.endPoint[0]-e.startPoint[0])/2,e.startPoint[1]+(e.endPoint[1]-e.startPoint[1])/2,1],Jt=(e,t)=>e?[Math.trunc(Math.max(0,e.startPoint[0])),Math.trunc(Math.max(0,e.startPoint[1])),Math.trunc(Math.min(t.shape[2]||0,e.endPoint[0])-Math.max(0,e.startPoint[0])),Math.trunc(Math.min(t.shape[1]||0,e.endPoint[1])-Math.max(0,e.startPoint[1]))]:[0,0,0,0],Yt=(e,t)=>e?[e.startPoint[0]/(t.shape[2]||0),e.startPoint[1]/(t.shape[1]||0),(e.endPoint[0]-e.startPoint[0])/(t.shape[2]||0),(e.endPoint[1]-e.startPoint[1])/(t.shape[1]||0)]:[0,0,0,0],Do=(e,t)=>{let o=[e.startPoint[0]*t[0],e.startPoint[1]*t[1]],A=[e.endPoint[0]*t[0],e.endPoint[1]*t[1]];return{startPoint:o,endPoint:A,landmarks:e.landmarks,confidence:e.confidence}},qt=(e,t,o)=>{let A=t.shape[1],n=t.shape[2],s=[e.startPoint[1]/A,e.startPoint[0]/n,e.endPoint[1]/A,e.endPoint[0]/n],a=r.image.cropAndResize(t,[s],[0],o),i=r.div(a,L.tf255);return r.dispose(a),i},Ke=(e,t)=>{let o=Ye(e),A=le(e),n=[t*A[0]/2,t*A[1]/2];return{startPoint:[o[0]-n[0],o[1]-n[1]],endPoint:[o[0]+n[0],o[1]+n[1]],landmarks:e.landmarks,confidence:e.confidence}},Qe=e=>{let t=Ye(e),o=le(e),A=Math.max(...o)/2;return{startPoint:[Math.round(t[0]-A),Math.round(t[1]-A)],endPoint:[Math.round(t[0]+A),Math.round(t[1]+A)],landmarks:e.landmarks,confidence:e.confidence}},qo=e=>{let t=e.map(A=>A[0]),o=e.map(A=>A[1]);return{startPoint:[Math.min(...t),Math.min(...o)],endPoint:[Math.max(...t),Math.max(...o)],landmarks:e}},Ut=[[1,0,0],[0,1,0],[0,0,1]],jr=e=>e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI)),Sr=(e,t)=>jr(Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]));var Zo=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]],Q0=(e,t)=>{let o=0;for(let A=0;A{let o=[];for(let A=0;A{let o=[],A=e.length;for(let n=0;n{let o=Math.cos(e),A=Math.sin(e),n=[[o,-A,0],[A,o,0],[0,0,1]],s=Zo(t[0],t[1]),a=Xo(s,n),i=Zo(-t[0],-t[1]);return Xo(a,i)},Cr=e=>{let t=[[e[0][0],e[1][0]],[e[0][1],e[1][1]]],o=[e[0][2],e[1][2]],A=[-Q0(t[0],o),-Q0(t[1],o)];return[t[0].concat(A[0]),t[1].concat(A[1]),[0,0,1]]},Ir=(e,t)=>[Q0(e,t[0]),Q0(e,t[1])];function Jo(e){let t={strides:[e/16,e/8],anchors:[2,6]},o=[];for(let A=0;A[s[0]/n*(f[0]-n/2),s[1]/n*(f[1]-n/2),f[2]||0]),i=o&&o!==0&&Math.abs(o)>.2,x=i?Uo(o,[0,0]):Ut,d=i?a.map(f=>[...Ir(f,x),f[2]]):a,l=i?Cr(A):Ut,y=Ye(t),c=[Q0(y,l[0]),Q0(y,l[1])];return d.map(f=>[Math.trunc(f[0]+c[0]),Math.trunc(f[1]+c[1]),Math.trunc(f[2]||0)])}function Ko(e,t,o,A){let n=t.landmarks.length>=Zt.count?Zt.symmetryLine:We.symmetryLine,s=0,a=Ut,i;if(e&&R.kernels.includes("rotatewithoffset"))if(s=Sr(t.landmarks[n[0]],t.landmarks[n[1]]),s&&s!==0&&Math.abs(s)>.2){let d=Ye(t),l=[d[0]/o.shape[2],d[1]/o.shape[1]],y=r.image.rotateWithOffset(o,s,0,l);a=Uo(-s,d),i=qt(t,y,[A,A]),r.dispose(y)}else i=qt(t,o,[A,A]);else i=qt(t,o,[A,A]);return[s,a,i]}var Or=e=>{let t=e.map(A=>A[0]),o=e.map(A=>A[1]);return[Math.min(...t)+(Math.max(...t)-Math.min(...t))/2,Math.min(...o)+(Math.max(...o)-Math.min(...o))/2]},Qo=(e,t)=>{let o=Or(e),A=le(t);return{startPoint:[o[0]-A[0]/2,o[1]-A[1]/2],endPoint:[o[0]+A[0]/2,o[1]+A[1]/2]}};var _o=6,Nr=1.2,T0,$o=null,H0=0,Ie=null,_e=()=>H0;async function eA(e){var t;return R.initial&&(T0=null),T0?e.debug&&g("cached model:",T0.modelUrl):T0=await N((t=e.face.detector)==null?void 0:t.modelPath),H0=T0.inputs[0].shape?T0.inputs[0].shape[2]:0,Ie=r.scalar(H0,"int32"),$o=r.tensor2d(Jo(H0)),T0}function Lr(e){let t={};t.boxStarts=r.slice(e,[0,1],[-1,2]),t.centers=r.add(t.boxStarts,$o),t.boxSizes=r.slice(e,[0,3],[-1,2]),t.boxSizesNormalized=r.div(t.boxSizes,Ie),t.centersNormalized=r.div(t.centers,Ie),t.halfBoxSize=r.div(t.boxSizesNormalized,L.tf2),t.starts=r.sub(t.centersNormalized,t.halfBoxSize),t.ends=r.add(t.centersNormalized,t.halfBoxSize),t.startNormalized=r.mul(t.starts,Ie),t.endNormalized=r.mul(t.ends,Ie);let o=r.concat2d([t.startNormalized,t.endNormalized],1);return Object.keys(t).forEach(A=>r.dispose(t[A])),o}async function tA(e,t){var i,x,d,l;if(!e||e.isDisposedInternal||e.shape.length!==4||e.shape[1]<1||e.shape[2]<1)return[];let o={};o.resized=r.image.resizeBilinear(e,[H0,H0]),o.div=r.div(o.resized,L.tf127),o.normalized=r.sub(o.div,L.tf05);let A=T0==null?void 0:T0.execute(o.normalized);if(Array.isArray(A)){let y=A.sort((c,f)=>c.size-f.size);o.concat384=r.concat([y[0],y[2]],2),o.concat512=r.concat([y[1],y[3]],2),o.concat=r.concat([o.concat512,o.concat384],1),o.batch=r.squeeze(o.concat,0)}else o.batch=r.squeeze(A);r.dispose(A),o.boxes=Lr(o.batch),o.logits=r.slice(o.batch,[0,0],[-1,1]),o.sigmoid=r.sigmoid(o.logits),o.scores=r.squeeze(o.sigmoid),o.nms=await r.image.nonMaxSuppressionAsync(o.boxes,o.scores,((i=t.face.detector)==null?void 0:i.maxDetected)||0,((x=t.face.detector)==null?void 0:x.iouThreshold)||0,((d=t.face.detector)==null?void 0:d.minConfidence)||0);let n=await o.nms.array(),s=[],a=await o.scores.data();for(let y=0;y(((l=t.face.detector)==null?void 0:l.minConfidence)||0)){let f={};f.bbox=r.slice(o.boxes,[n[y],0],[1,-1]),f.slice=r.slice(o.batch,[n[y],_o-1],[1,-1]),f.squeeze=r.squeeze(f.slice),f.landmarks=r.reshape(f.squeeze,[_o,-1]);let h=await f.bbox.data(),m={startPoint:[h[0],h[1]],endPoint:[h[2],h[3]],landmarks:await f.landmarks.array(),confidence:c},v=Do(m,[(e.shape[2]||0)/H0,(e.shape[1]||0)/H0]),b=Ke(v,t.face.scale||Nr),M=Qe(b);s.push(M),Object.keys(f).forEach(p=>r.dispose(f[p]))}}return Object.keys(o).forEach(y=>r.dispose(o[y])),s}var $e={};Ze($e,{connected:()=>_t,kpt:()=>Qt});var Qt=["nose","leftEyeInside","leftEye","leftEyeOutside","rightEyeInside","rightEye","rightEyeOutside","leftEar","rightEar","leftMouth","rightMouth","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftPinky","rightPinky","leftIndex","rightIndex","leftThumb","rightThumb","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle","leftHeel","rightHeel","leftFoot","rightFoot","bodyCenter","bodyTop","leftPalm","leftHand","rightPalm","rightHand"],_t={shoulders:["leftShoulder","rightShoulder"],hips:["rightHip","leftHip"],mouth:["leftMouth","rightMouth"],leftLegUpper:["leftHip","leftKnee"],leftLegLower:["leftKnee","leftAnkle"],leftFoot:["leftAnkle","leftHeel","leftFoot"],leftTorso:["leftShoulder","leftHip"],leftArmUpper:["leftShoulder","leftElbow"],leftArmLower:["leftElbow","leftWrist"],leftHand:["leftWrist","leftPalm"],leftHandPinky:["leftPalm","leftPinky"],leftHandIndex:["leftPalm","leftIndex"],leftHandThumb:["leftPalm","leftThumb"],leftEyeOutline:["leftEyeInside","leftEyeOutside"],rightLegUpper:["rightHip","rightKnee"],rightLegLower:["rightKnee","rightAnkle"],rightFoot:["rightAnkle","rightHeel","rightFoot"],rightTorso:["rightShoulder","rightHip"],rightArmUpper:["rightShoulder","rightElbow"],rightArmLower:["rightElbow","rightWrist"],rightHand:["rightWrist","rightPalm"],rightHandPinky:["rightPalm","rightPinky"],rightHandIndex:["rightPalm","rightIndex"],rightHandThumb:["rightPalm","rightThumb"],rightEyeOutline:["rightEyeInside","rightEyeOutside"]};var AA=224,Br,Gr=5,et=[8,16,32,32,32];async function nA(){let e=[],t=0;for(;to.x)),y:r.tensor1d(e.map(o=>o.y))}}function S0(e,t=[1,1]){let o=[e.map(i=>i[0]),e.map(i=>i[1])],A=[Math.min(...o[0]),Math.min(...o[1])],n=[Math.max(...o[0]),Math.max(...o[1])],s=[A[0],A[1],n[0]-A[0],n[1]-A[1]],a=[s[0]/t[0],s[1]/t[1],s[2]/t[0],s[3]/t[1]];return{box:s,boxRaw:a}}function rA(e,t=[1,1]){let o=[e.map(d=>d[0]),e.map(d=>d[1])],A=[Math.min(...o[0]),Math.min(...o[1])],n=[Math.max(...o[0]),Math.max(...o[1])],s=[(A[0]+n[0])/2,(A[1]+n[1])/2],a=Math.max(s[0]-A[0],s[1]-A[1],-s[0]+n[0],-s[1]+n[1]),i=[Math.trunc(s[0]-a),Math.trunc(s[1]-a),Math.trunc(2*a),Math.trunc(2*a)],x=[i[0]/t[0],i[1]/t[1],i[2]/t[0],i[3]/t[1]];return{box:i,boxRaw:x}}function tt(e,t){let o=[e[2]*t,e[3]*t];return[e[0]-(o[0]-e[2])/2,e[1]-(o[1]-e[3])/2,o[0],o[1]]}var iA={initial:!0},y0={detector:null,landmarks:null},ye={detector:[224,224],landmarks:[256,256]},$t=Number.MAX_SAFE_INTEGER,Fr={landmarks:["ld_3d","activation_segmentation","activation_heatmap","world_3d","output_poseflag"],detector:[]},At=null,Oe,F0=[[0,0],[0,0],[0,0],[0,0]],sA=0,aA=e=>1-1/(1+Math.exp(e));async function lA(e){if(iA.initial&&(y0.detector=null),!y0.detector&&e.body.detector&&e.body.detector.modelPath){y0.detector=await N(e.body.detector.modelPath);let t=Object.values(y0.detector.modelSignature.inputs);ye.detector[0]=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0,ye.detector[1]=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):0}else e.debug&&y0.detector&&g("cached model:",y0.detector.modelUrl);return await nA(),y0.detector}async function yA(e){if(iA.initial&&(y0.landmarks=null),y0.landmarks)e.debug&&g("cached model:",y0.landmarks.modelUrl);else{y0.landmarks=await N(e.body.modelPath);let t=Object.values(y0.landmarks.modelSignature.inputs);ye.landmarks[0]=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0,ye.landmarks[1]=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):0}return y0.landmarks}async function Vr(e,t){let o={};if(!e.shape||!e.shape[1]||!e.shape[2])return e;let A;if(Oe&&(o.cropped=r.image.cropAndResize(e,[Oe],[0],[e.shape[1],e.shape[2]])),e.shape[1]!==e.shape[2]){let n=[e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],s=[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0];F0=[[0,0],n,s,[0,0]],o.pad=r.pad(o.cropped||e,F0),o.resize=r.image.resizeBilinear(o.pad,[t,t]),A=r.div(o.resize,L.tf255)}else e.shape[1]!==t?(o.resize=r.image.resizeBilinear(o.cropped||e,[t,t]),A=r.div(o.resize,L.tf255)):A=r.div(o.cropped||e,L.tf255);return Object.keys(o).forEach(n=>r.dispose(o[n])),A}function Zr(e,t){for(let o of e)o.position=[Math.trunc(o.position[0]*(t[0]+F0[2][0]+F0[2][1])/t[0]-F0[2][0]),Math.trunc(o.position[1]*(t[1]+F0[1][0]+F0[1][1])/t[1]-F0[1][0]),o.position[2]],o.positionRaw=[o.position[0]/t[0],o.position[1]/t[1],2*o.position[2]/(t[0]+t[1])];if(Oe)for(let o of e)o.positionRaw=[o.positionRaw[0]+Oe[1],o.positionRaw[1]+Oe[0],o.positionRaw[2]],o.position=[Math.trunc(o.positionRaw[0]*t[0]),Math.trunc(o.positionRaw[1]*t[1]),o.positionRaw[2]];return e}async function Xr(e){let t=e.find(i=>i.part==="leftPalm"),o=e.find(i=>i.part==="leftWrist"),A=e.find(i=>i.part==="leftIndex");t.position[2]=((o.position[2]||0)+(A.position[2]||0))/2;let n=e.find(i=>i.part==="rightPalm"),s=e.find(i=>i.part==="rightWrist"),a=e.find(i=>i.part==="rightIndex");n.position[2]=((s.position[2]||0)+(a.position[2]||0))/2}async function Dr(e,t,o){var h;let A={};[A.ld,A.segmentation,A.heatmap,A.world,A.poseflag]=(h=y0.landmarks)==null?void 0:h.execute(e,Fr.landmarks);let n=(await A.poseflag.data())[0],s=await A.ld.data(),a=await A.world.data();Object.keys(A).forEach(m=>r.dispose(A[m]));let i=[],x=5;for(let m=0;mm.position),y=S0(l,[o[0],o[1]]),c={};for(let[m,v]of Object.entries(_t)){let b=[];for(let M=0;ME.part===v[M]),u=d.find(E=>E.part===v[M+1]);p&&u&&b.push([p.position,u.position])}c[m]=b}return{id:0,score:Math.trunc(100*n)/100,box:y.box,boxRaw:y.boxRaw,keypoints:d,annotations:c}}async function e5(e,t){let o=[e.shape[2]||0,e.shape[1]||0],A=(t.body.skipTime||0)>P()-sA,n=$t<(t.body.skipFrames||0);if(t.skipAllowed&&A&&n&&At!==null)$t++;else{let s={};s.landmarks=await Vr(e,256),At=await Dr(s.landmarks,t,o),Object.keys(s).forEach(a=>r.dispose(s[a])),sA=P(),$t=0}return At?[At]:[]}var xe=[{class:1,label:"person"},{class:2,label:"bicycle"},{class:3,label:"car"},{class:4,label:"motorcycle"},{class:5,label:"airplane"},{class:6,label:"bus"},{class:7,label:"train"},{class:8,label:"truck"},{class:9,label:"boat"},{class:10,label:"traffic light"},{class:11,label:"fire hydrant"},{class:12,label:"stop sign"},{class:13,label:"parking meter"},{class:14,label:"bench"},{class:15,label:"bird"},{class:16,label:"cat"},{class:17,label:"dog"},{class:18,label:"horse"},{class:19,label:"sheep"},{class:20,label:"cow"},{class:21,label:"elephant"},{class:22,label:"bear"},{class:23,label:"zebra"},{class:24,label:"giraffe"},{class:25,label:"backpack"},{class:26,label:"umbrella"},{class:27,label:"handbag"},{class:28,label:"tie"},{class:29,label:"suitcase"},{class:30,label:"frisbee"},{class:31,label:"skis"},{class:32,label:"snowboard"},{class:33,label:"sports ball"},{class:34,label:"kite"},{class:35,label:"baseball bat"},{class:36,label:"baseball glove"},{class:37,label:"skateboard"},{class:38,label:"surfboard"},{class:39,label:"tennis racket"},{class:40,label:"bottle"},{class:41,label:"wine glass"},{class:42,label:"cup"},{class:43,label:"fork"},{class:44,label:"knife"},{class:45,label:"spoon"},{class:46,label:"bowl"},{class:47,label:"banana"},{class:48,label:"apple"},{class:49,label:"sandwich"},{class:50,label:"orange"},{class:51,label:"broccoli"},{class:52,label:"carrot"},{class:53,label:"hot dog"},{class:54,label:"pizza"},{class:55,label:"donut"},{class:56,label:"cake"},{class:57,label:"chair"},{class:58,label:"couch"},{class:59,label:"potted plant"},{class:60,label:"bed"},{class:61,label:"dining table"},{class:62,label:"toilet"},{class:63,label:"tv"},{class:64,label:"laptop"},{class:65,label:"mouse"},{class:66,label:"remote"},{class:67,label:"keyboard"},{class:68,label:"cell phone"},{class:69,label:"microwave"},{class:70,label:"oven"},{class:71,label:"toaster"},{class:72,label:"sink"},{class:73,label:"refrigerator"},{class:74,label:"book"},{class:75,label:"clock"},{class:76,label:"vase"},{class:77,label:"scissors"},{class:78,label:"teddy bear"},{class:79,label:"hair drier"},{class:80,label:"toothbrush"}];var W0,_0=0,t5=[],cA=0,o5=Number.MAX_SAFE_INTEGER;async function dA(e){if(R.initial&&(W0=null),W0)e.debug&&g("cached model:",W0.modelUrl);else{W0=await N(e.object.modelPath);let t=Object.values(W0.modelSignature.inputs);_0=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):0}return W0}async function qr(e,t,o){if(!e)return[];let A={},n=[],s=await e.array();A.squeeze=r.squeeze(e);let a=r.split(A.squeeze,6,1);A.stack=r.stack([a[1],a[0],a[3],a[2]],1),A.boxes=r.squeeze(A.stack),A.scores=r.squeeze(a[4]),A.classes=r.squeeze(a[5]),r.dispose([e,...a]),A.nms=await r.image.nonMaxSuppressionAsync(A.boxes,A.scores,o.object.maxDetected,o.object.iouThreshold,o.object.minConfidence||0);let i=await A.nms.data(),x=0;for(let d of Array.from(i)){let l=Math.trunc(100*s[0][d][4])/100,y=s[0][d][5],c=xe[y].label,[f,h]=[s[0][d][0]/_0,s[0][d][1]/_0],m=[f,h,s[0][d][2]/_0-f,s[0][d][3]/_0-h],v=[Math.trunc(m[0]*t[0]),Math.trunc(m[1]*t[1]),Math.trunc(m[2]*t[0]),Math.trunc(m[3]*t[1])];n.push({id:x++,score:l,class:y,label:c,box:v,boxRaw:m})}return Object.keys(A).forEach(d=>r.dispose(A[d])),n}async function A5(e,t){let o=(t.object.skipTime||0)>P()-cA,A=o5<(t.object.skipFrames||0);return t.skipAllowed&&o&&A&&t5.length>0?(o5++,t5):(o5=0,new Promise(async n=>{let s=[e.shape[2]||0,e.shape[1]||0],a=r.image.resizeBilinear(e,[_0,_0]),i=t.object.enabled?W0==null?void 0:W0.execute(a,["tower_0/detections"]):null;cA=P(),r.dispose(a);let x=await qr(i,s,t);t5=x,n(x)}))}var nt={};Ze(nt,{connected:()=>r5,kpt:()=>n5});var n5=["head","neck","rightShoulder","rightElbow","rightWrist","chest","leftShoulder","leftElbow","leftWrist","bodyCenter","rightHip","rightKnee","rightAnkle","leftHip","leftKnee","leftAnkle"],r5={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var n0,mA=0,a0={id:0,keypoints:[],box:[0,0,0,0],boxRaw:[0,0,0,0],score:0,annotations:{}},s5=Number.MAX_SAFE_INTEGER;async function pA(e){return R.initial&&(n0=null),n0?e.debug&&g("cached model:",n0.modelUrl):n0=await N(e.body.modelPath),n0}async function Ur(e,t){let[o,A]=e.shape,n=r.reshape(e,[A*o]),s=r.max(n,0),a=(await s.data())[0];if(r.dispose([n,s]),a>t){let i=r.argMax(n,0),x=r.mod(i,o),d=(await x.data())[0],l=r.div(i,r.scalar(o,"int32")),y=(await l.data())[0];return r.dispose([x,l]),[d,y,a]}return[0,0,a]}async function a5(e,t){let o=(t.body.skipTime||0)>P()-mA,A=s5<(t.body.skipFrames||0);return t.skipAllowed&&o&&A&&Object.keys(a0.keypoints).length>0?(s5++,[a0]):(s5=0,new Promise(async n=>{var y;let s=r.tidy(()=>{if(!(n0!=null&&n0.inputs[0].shape))return null;let c=r.image.resizeBilinear(e,[n0.inputs[0].shape[2],n0.inputs[0].shape[1]],!1),f=r.mul(c,L.tf2);return r.sub(f,L.tf1)}),a;if(t.body.enabled&&(a=n0==null?void 0:n0.execute(s)),mA=P(),r.dispose(s),a){a0.keypoints.length=0;let c=a.squeeze();r.dispose(a);let f=c.unstack(2);r.dispose(c);for(let h=0;h(((y=t.body)==null?void 0:y.minConfidence)||0)&&a0.keypoints.push({score:Math.round(100*b)/100,part:n5[h],positionRaw:[m/n0.inputs[0].shape[2],v/n0.inputs[0].shape[1]],position:[Math.round(e.shape[2]*m/n0.inputs[0].shape[2]),Math.round(e.shape[1]*v/n0.inputs[0].shape[1])]})}f.forEach(h=>r.dispose(h))}a0.score=a0.keypoints.reduce((c,f)=>f.score>c?f.score:c,0);let i=a0.keypoints.map(c=>c.position[0]),x=a0.keypoints.map(c=>c.position[1]);a0.box=[Math.min(...i),Math.min(...x),Math.max(...i)-Math.min(...i),Math.max(...x)-Math.min(...x)];let d=a0.keypoints.map(c=>c.positionRaw[0]),l=a0.keypoints.map(c=>c.positionRaw[1]);a0.boxRaw=[Math.min(...d),Math.min(...l),Math.max(...d)-Math.min(...d),Math.max(...l)-Math.min(...l)];for(let[c,f]of Object.entries(r5)){let h=[];for(let m=0;mM.part===f[m]),b=a0.keypoints.find(M=>M.part===f[m+1]);v&&b&&v.score>(t.body.minConfidence||0)&&b.score>(t.body.minConfidence||0)&&h.push([v.position,b.position])}a0.annotations[c]=h}n([a0])}))}var Jr=["angry","disgust","fear","happy","sad","surprise","neutral"],p0,rt=[],hA=0,bA=0,i5=Number.MAX_SAFE_INTEGER;async function gA(e){var t;return R.initial&&(p0=null),p0?e.debug&&g("cached model:",p0.modelUrl):p0=await N((t=e.face.emotion)==null?void 0:t.modelPath),p0}async function l5(e,t,o,A){var a,i;if(!p0)return[];let n=i5<(((a=t.face.emotion)==null?void 0:a.skipFrames)||0),s=(((i=t.face.emotion)==null?void 0:i.skipTime)||0)>P()-bA;return t.skipAllowed&&s&&n&&hA===A&&rt[o]&&rt[o].length>0?(i5++,rt[o]):(i5=0,new Promise(async x=>{var l,y;let d=[];if((l=t.face.emotion)!=null&&l.enabled){let c={},f=p0!=null&&p0.inputs[0].shape?p0.inputs[0].shape[2]:0;c.resize=r.image.resizeBilinear(e,[f,f],!1),c.channels=r.mul(c.resize,L.rgb),c.grayscale=r.sum(c.channels,3,!0),c.grayscaleSub=r.sub(c.grayscale,L.tf05),c.grayscaleMul=r.mul(c.grayscaleSub,L.tf2),c.emotion=p0==null?void 0:p0.execute(c.grayscaleMul),bA=P();let h=await c.emotion.data();for(let m=0;m(((y=t.face.emotion)==null?void 0:y.minConfidence)||0)&&d.push({score:Math.min(.99,Math.trunc(100*h[m])/100),emotion:Jr[m]});d.sort((m,v)=>v.score-m.score),Object.keys(c).forEach(m=>r.dispose(c[m]))}rt[o]=d,hA=A,x(d)}))}var x0,y5=[],MA=0,vA=0,TA=Number.MAX_SAFE_INTEGER;async function RA(e){return R.initial&&(x0=null),x0?e.debug&&g("cached model:",x0.modelUrl):x0=await N(e.face.mobilefacenet.modelPath),x0}async function x5(e,t,o,A){var a,i;if(!x0)return[];let n=TA<(((a=t.face.embedding)==null?void 0:a.skipFrames)||0),s=(((i=t.face.embedding)==null?void 0:i.skipTime)||0)>P()-vA;return t.skipAllowed&&s&&n&&MA===A&&y5[o]?(TA++,y5[o]):new Promise(async x=>{var l;let d=[];if(((l=t.face.embedding)==null?void 0:l.enabled)&&(x0==null?void 0:x0.inputs[0].shape)){let y={};y.crop=r.image.resizeBilinear(e,[x0.inputs[0].shape[2],x0.inputs[0].shape[1]],!1),y.data=x0==null?void 0:x0.execute(y.crop);let c=await y.data.data();d=Array.from(c)}y5[o]=d,MA=A,vA=P(),x(d)})}var C0,V0=0,Yr=2.3,c5=b0.leftEyeLower0,d5=b0.rightEyeLower0,ce={leftBounds:[c5[0],c5[c5.length-1]],rightBounds:[d5[0],d5[d5.length-1]]},de={upperCenter:3,lowerCenter:4,index:71,numCoordinates:76};async function jA(e){var t;return R.initial&&(C0=null),C0?e.debug&&g("cached model:",C0.modelUrl):C0=await N((t=e.face.iris)==null?void 0:t.modelPath),V0=C0.inputs[0].shape?C0.inputs[0].shape[2]:0,V0===-1&&(V0=64),C0}function st(e,t,o,A){for(let n=0;n{let t=e[ce.leftBounds[0]][2],o=e[ce.rightBounds[0]][2];return t-o},kA=(e,t,o,A,n,s=!1)=>{let a=Qe(Ke(qo([e[o],e[A]]),Yr)),i=le(a),x=r.image.cropAndResize(t,[[a.startPoint[1]/n,a.startPoint[0]/n,a.endPoint[1]/n,a.endPoint[0]/n]],[0],[V0,V0]);if(s&&R.kernels.includes("flipleftright")){let d=r.image.flipLeftRight(x);r.dispose(x),x=d}return{box:a,boxSize:i,crop:x}},EA=(e,t,o,A=!1)=>{let n=[];for(let s=0;s{let A=e[b0[`${o}EyeUpper0`][de.upperCenter]][2],n=e[b0[`${o}EyeLower0`][de.lowerCenter]][2],s=(A+n)/2;return t.map((a,i)=>{let x=s;return i===2?x=A:i===4&&(x=n),[a[0],a[1],x]})};async function SA(e,t,o,A){if(!C0)return o.debug&&g("face mesh iris detection requested, but model is not loaded"),e;let{box:n,boxSize:s,crop:a}=kA(e,t,ce.leftBounds[0],ce.leftBounds[1],A,!0),{box:i,boxSize:x,crop:d}=kA(e,t,ce.rightBounds[0],ce.rightBounds[1],A,!0),l=r.concat([a,d]);r.dispose(a),r.dispose(d);let y=C0.execute(l);r.dispose(l);let c=await y.data();r.dispose(y);let f=c.slice(0,de.numCoordinates*3),{rawCoords:h,iris:m}=EA(f,n,s,!0),v=c.slice(de.numCoordinates*3),{rawCoords:b,iris:M}=EA(v,i,x),p=Kr(e);Math.abs(p)<30?(st(e,h,"left",null),st(e,b,"right",null)):p<1?st(e,h,"left",["EyeUpper0","EyeLower0"]):st(e,b,"right",["EyeUpper0","EyeLower0"]);let u=zA(e,m,"left"),E=zA(e,M,"right");return e.concat(u).concat(E)}var R0={boxes:[],skipped:Number.MAX_SAFE_INTEGER,timestamp:0},I0=null,fe=0;async function CA(e,t){var i,x,d,l,y,c,f,h,m;let o=(((i=t.face.detector)==null?void 0:i.skipTime)||0)>P()-R0.timestamp,A=R0.skipped<(((x=t.face.detector)==null?void 0:x.skipFrames)||0);!t.skipAllowed||!o||!A||R0.boxes.length===0?(R0.boxes=await tA(e,t),R0.timestamp=P(),R0.skipped=0):R0.skipped++;let n=[],s=[],a=0;for(let v=0;v[H[0]/(e.shape[2]||0),H[1]/(e.shape[1]||0),(H[2]||0)/fe]);for(let H of Object.keys(b0))u.annotations[H]=b0[H].map(t0=>u.mesh[t0]);u.score=u.faceScore;let B={...Qo(u.mesh,b),confidence:b.confidence,landmarks:b.landmarks};u.box=Jt(B,e),u.boxRaw=Yt(B,e),s.push(B)}}else{u.box=Jt(b,e),u.boxRaw=Yt(b,e),u.score=u.boxScore,u.mesh=b.landmarks.map(E=>[(b.startPoint[0]+b.endPoint[0])/2+(b.endPoint[0]+b.startPoint[0])*E[0]/_e(),(b.startPoint[1]+b.endPoint[1])/2+(b.endPoint[1]+b.startPoint[1])*E[1]/_e()]),u.meshRaw=u.mesh.map(E=>[E[0]/(e.shape[2]||0),E[1]/(e.shape[1]||0),(E[2]||0)/fe]);for(let E of Object.keys(We))u.annotations[E]=[u.mesh[We[E]]]}u.score>(((m=t.face.detector)==null?void 0:m.minConfidence)||1)?n.push(u):r.dispose(u.tensor)}return R0.boxes=s,n}async function IA(e){var t;return R.initial&&(I0=null),I0?e.debug&&g("cached model:",I0.modelUrl):I0=await N((t=e.face.mesh)==null?void 0:t.modelPath),fe=I0.inputs[0].shape?I0.inputs[0].shape[2]:0,I0}var OA=K0,NA=Ce;var c0,at=[],LA=0,BA=0,m5=Number.MAX_SAFE_INTEGER;async function GA(e){var t;return R.initial&&(c0=null),c0?e.debug&&g("cached model:",c0.modelUrl):c0=await N((t=e.face.description)==null?void 0:t.modelPath),c0}function p5(e){let t=e.image||e.tensor||e;if(!(c0!=null&&c0.inputs[0].shape))return t;let o=r.image.resizeBilinear(t,[c0.inputs[0].shape[2],c0.inputs[0].shape[1]],!1),A=r.mul(o,L.tf255);return r.dispose(o),A}async function u5(e,t,o,A){var a,i,x,d;if(!c0)return{age:0,gender:"unknown",genderScore:0,descriptor:[]};let n=m5<(((a=t.face.description)==null?void 0:a.skipFrames)||0),s=(((i=t.face.description)==null?void 0:i.skipTime)||0)>P()-LA;return t.skipAllowed&&n&&s&&BA===A&&((x=at[o])==null?void 0:x.age)&&((d=at[o])==null?void 0:d.age)>0?(m5++,at[o]):(m5=0,new Promise(async l=>{var c,f;let y={age:0,gender:"unknown",genderScore:0,descriptor:[]};if((c=t.face.description)!=null&&c.enabled){let h=p5(e),m=c0==null?void 0:c0.execute(h);LA=P(),r.dispose(h);let b=await(await m.find(O=>O.shape[1]===1)).data(),M=Math.trunc(200*Math.abs(b[0]-.5))/100;M>(((f=t.face.description)==null?void 0:f.minConfidence)||0)&&(y.gender=b[0]<=.5?"female":"male",y.genderScore=Math.min(.99,M));let p=r.argMax(m.find(O=>O.shape[1]===100),1),u=(await p.data())[0];r.dispose(p);let W=await m.find(O=>O.shape[1]===100).data();y.age=Math.round(W[u-1]>W[u+1]?10*u-100*W[u-1]:10*u+100*W[u+1])/10;let C=m.find(O=>O.shape[1]===1024),S=C?await C.data():[];y.descriptor=Array.from(S),m.forEach(O=>r.dispose(O))}at[o]=y,BA=A,l(y)}))}function it(e){return[Math.abs(e.endPoint[0]-e.startPoint[0]),Math.abs(e.endPoint[1]-e.startPoint[1])]}function Ne(e){return[e.startPoint[0]+(e.endPoint[0]-e.startPoint[0])/2,e.startPoint[1]+(e.endPoint[1]-e.startPoint[1])/2]}function VA(e,t,o){let A=t.shape[1],n=t.shape[2],s=[[e.startPoint[1]/A,e.startPoint[0]/n,e.endPoint[1]/A,e.endPoint[0]/n]];return r.image.cropAndResize(t,s,[0],o)}function ZA(e,t){let o=[e.startPoint[0]*t[0],e.startPoint[1]*t[1]],A=[e.endPoint[0]*t[0],e.endPoint[1]*t[1]],n=e.palmLandmarks.map(s=>[s[0]*t[0],s[1]*t[1]]);return{startPoint:o,endPoint:A,palmLandmarks:n,confidence:e.confidence}}function lt(e,t=1.5){let o=Ne(e),A=it(e),n=[t*A[0]/2,t*A[1]/2],s=[o[0]-n[0],o[1]-n[1]],a=[o[0]+n[0],o[1]+n[1]];return{startPoint:s,endPoint:a,palmLandmarks:e.palmLandmarks}}function yt(e){let t=Ne(e),o=it(e),n=Math.max(...o)/2,s=[t[0]-n,t[1]-n],a=[t[0]+n,t[1]+n];return{startPoint:s,endPoint:a,palmLandmarks:e.palmLandmarks}}function Qr(e){return e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI))}function XA(e,t){let o=Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]);return Qr(o)}var HA=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]];function Z0(e,t){let o=0;for(let A=0;A[o.x,o.y]),this.anchorsTensor=r.tensor2d(this.anchors),this.inputSize=this.model&&this.model.inputs&&this.model.inputs[0].shape?this.model.inputs[0].shape[2]:0,this.inputSizeTensor=r.tensor1d([this.inputSize,this.inputSize]),this.doubleInputSizeTensor=r.tensor1d([this.inputSize*2,this.inputSize*2])}normalizeBoxes(t){let o={};o.boxOffsets=r.slice(t,[0,0],[-1,2]),o.boxSizes=r.slice(t,[0,2],[-1,2]),o.div=r.div(o.boxOffsets,this.inputSizeTensor),o.boxCenterPoints=r.add(o.div,this.anchorsTensor),o.halfBoxSizes=r.div(o.boxSizes,this.doubleInputSizeTensor),o.sub=r.sub(o.boxCenterPoints,o.halfBoxSizes),o.startPoints=r.mul(o.sub,this.inputSizeTensor),o.add=r.add(o.boxCenterPoints,o.halfBoxSizes),o.endPoints=r.mul(o.add,this.inputSizeTensor);let A=r.concat2d([o.startPoints,o.endPoints],1);return Object.keys(o).forEach(n=>r.dispose(o[n])),A}normalizeLandmarks(t,o){let A={};A.reshape=r.reshape(t,[-1,7,2]),A.div=r.div(A.reshape,this.inputSizeTensor),A.landmarks=r.add(A.div,this.anchors[o]);let n=r.mul(A.landmarks,this.inputSizeTensor);return Object.keys(A).forEach(s=>r.dispose(A[s])),n}async predict(t,o){let A={};A.resize=r.image.resizeBilinear(t,[this.inputSize,this.inputSize]),A.div=r.div(A.resize,L.tf127),A.image=r.sub(A.div,L.tf1),A.batched=this.model.execute(A.image),A.predictions=r.squeeze(A.batched),A.slice=r.slice(A.predictions,[0,0],[-1,1]),A.sigmoid=r.sigmoid(A.slice),A.scores=r.squeeze(A.sigmoid);let n=await A.scores.data();A.boxes=r.slice(A.predictions,[0,1],[-1,4]),A.norm=this.normalizeBoxes(A.boxes),A.nms=await r.image.nonMaxSuppressionAsync(A.norm,A.scores,3*o.hand.maxDetected,o.hand.iouThreshold,o.hand.minConfidence);let s=await A.nms.array(),a=[];for(let i of s){let x={};x.box=r.slice(A.norm,[i,0],[1,-1]),x.slice=r.slice(A.predictions,[i,5],[1,14]),x.norm=this.normalizeLandmarks(x.slice,i),x.palmLandmarks=r.reshape(x.norm,[-1,2]);let d=await x.box.data(),l=d.slice(0,2),y=d.slice(2,4),c=await x.palmLandmarks.array(),f={startPoint:l,endPoint:y,palmLandmarks:c,confidence:n[i]},h=ZA(f,[t.shape[2]/this.inputSize,t.shape[1]/this.inputSize]);a.push(h),Object.keys(x).forEach(m=>r.dispose(x[m]))}return Object.keys(A).forEach(i=>r.dispose(A[i])),a}};var t2=5,JA=1.65,YA=[0,5,9,13,17,1,2],o2=0,A2=2,KA=0,M5=class{constructor(t,o){w(this,"handDetector");w(this,"handPoseModel");w(this,"inputSize");w(this,"storedBoxes");w(this,"skipped");w(this,"detectedHands");this.handDetector=t,this.handPoseModel=o,this.inputSize=this.handPoseModel&&this.handPoseModel.inputs[0].shape?this.handPoseModel.inputs[0].shape[2]:0,this.storedBoxes=[],this.skipped=Number.MAX_SAFE_INTEGER,this.detectedHands=0}calculateLandmarksBoundingBox(t){let o=t.map(a=>a[0]),A=t.map(a=>a[1]),n=[Math.min(...o),Math.min(...A)],s=[Math.max(...o),Math.max(...A)];return{startPoint:n,endPoint:s}}getBoxForPalmLandmarks(t,o){let A=t.map(s=>g5([...s,1],o)),n=this.calculateLandmarksBoundingBox(A);return lt(yt(n),t2)}getBoxForHandLandmarks(t){let o=this.calculateLandmarksBoundingBox(t),A=lt(yt(o),JA);A.palmLandmarks=[];for(let n=0;n[a[0]*(f[0]-this.inputSize/2),a[1]*(f[1]-this.inputSize/2),a[2]*f[2]]),x=b5(A,[0,0]),d=i.map(f=>[...g5(f,x),f[2]]),l=DA(n),y=[...Ne(o),1],c=[Z0(y,l[0]),Z0(y,l[1])];return d.map(f=>[Math.trunc(f[0]+c[0]),Math.trunc(f[1]+c[1]),Math.trunc(f[2])])}async estimateHands(t,o){let A=!1,n,s=(o.hand.skipTime||0)>P()-KA,a=this.skipped<(o.hand.skipFrames||0);o.skipAllowed&&s&&a&&(n=await this.handDetector.predict(t,o),this.skipped=0),o.skipAllowed&&this.skipped++,n&&n.length>0&&(n.length!==this.detectedHands&&this.detectedHands!==o.hand.maxDetected||!o.hand.landmarks)&&(this.detectedHands=0,this.storedBoxes=[...n],this.storedBoxes.length>0&&(A=!0));let i=[];for(let x=0;x=o.hand.minConfidence/4){let E=r.reshape(p,[-1,3]),W=await E.array();r.dispose(p),r.dispose(E);let C=this.transformRawCoords(W,m,l,h),S=this.getBoxForHandLandmarks(C);this.storedBoxes[x]={...S,confidence:u};let O={landmarks:C,confidence:u,boxConfidence:d.confidence,fingerConfidence:u,box:{topLeft:S.startPoint,bottomRight:S.endPoint}};i.push(O)}else this.storedBoxes[x]=null;r.dispose(p)}else{let l=lt(yt(d),JA),y={confidence:d.confidence,boxConfidence:d.confidence,fingerConfidence:0,box:{topLeft:l.startPoint,bottomRight:l.endPoint},landmarks:[]};i.push(y)}}return this.storedBoxes=this.storedBoxes.filter(x=>x!==null),this.detectedHands=i.length,i.length>o.hand.maxDetected&&(i.length=o.hand.maxDetected),i}};var i0={thumb:0,index:1,middle:2,ring:3,pinky:4,all:[0,1,2,3,4],nameMapping:{0:"thumb",1:"index",2:"middle",3:"ring",4:"pinky"},pointsMapping:{0:[[0,1],[1,2],[2,3],[3,4]],1:[[0,5],[5,6],[6,7],[7,8]],2:[[0,9],[9,10],[10,11],[11,12]],3:[[0,13],[13,14],[14,15],[15,16]],4:[[0,17],[17,18],[18,19],[19,20]]},getName:e=>i0.nameMapping[e],getPoints:e=>i0.pointsMapping[e]},X0={none:0,half:1,full:2,nameMapping:{0:"none",1:"half",2:"full"},getName:e=>X0.nameMapping[e]},U={verticalUp:0,verticalDown:1,horizontalLeft:2,horizontalRight:3,diagonalUpRight:4,diagonalUpLeft:5,diagonalDownRight:6,diagonalDownLeft:7,nameMapping:{0:"verticalUp",1:"verticalDown",2:"horizontalLeft",3:"horizontalRight",4:"diagonalUpRight",5:"diagonalUpLeft",6:"diagonalDownRight",7:"diagonalDownLeft"},getName:e=>U.nameMapping[e]},$0=class{constructor(t){w(this,"name");w(this,"curls");w(this,"directions");w(this,"weights");w(this,"weightsRelative");this.name=t,this.curls={},this.directions={},this.weights=[1,1,1,1,1],this.weightsRelative=[1,1,1,1,1]}curl(t,o,A){typeof this.curls[t]=="undefined"&&(this.curls[t]=[]),this.curls[t].push([o,A])}direction(t,o,A){this.directions[t]||(this.directions[t]=[]),this.directions[t].push([o,A])}weight(t,o){this.weights[t]=o;let A=this.weights.reduce((n,s)=>n+s,0);this.weightsRelative=this.weights.map(n=>n*5/A)}matchAgainst(t,o){let A=0;for(let n in t){let s=t[n],a=this.curls[n];if(typeof a=="undefined"){A+=this.weightsRelative[n];continue}for(let[i,x]of a)if(s===i){A+=x*this.weightsRelative[n];break}}for(let n in o){let s=o[n],a=this.directions[n];if(typeof a=="undefined"){A+=this.weightsRelative[n];continue}for(let[i,x]of a)if(s===i){A+=x*this.weightsRelative[n];break}}return A/10}};var{thumb:g0,index:O0,middle:N0,ring:ee,pinky:te}=i0,{none:P0,half:r2,full:M0}=X0,{verticalUp:me,verticalDown:ma,horizontalLeft:v5,horizontalRight:s2,diagonalUpRight:a2,diagonalUpLeft:pe,diagonalDownRight:pa,diagonalDownLeft:ua}=U,D0=new $0("thumbs up");D0.curl(g0,P0,1);D0.direction(g0,me,1);D0.direction(g0,pe,.25);D0.direction(g0,a2,.25);for(let e of[i0.index,i0.middle,i0.ring,i0.pinky])D0.curl(e,M0,1),D0.direction(e,v5,1),D0.direction(e,s2,1);var K=new $0("victory");K.curl(g0,r2,.5);K.curl(g0,P0,.5);K.direction(g0,me,1);K.direction(g0,pe,1);K.curl(O0,P0,1);K.direction(O0,me,.75);K.direction(O0,pe,1);K.curl(N0,P0,1);K.direction(N0,me,1);K.direction(N0,pe,.75);K.curl(ee,M0,1);K.direction(ee,me,.2);K.direction(ee,pe,1);K.direction(ee,v5,.2);K.curl(te,M0,1);K.direction(te,me,.2);K.direction(te,pe,1);K.direction(te,v5,.2);K.weight(O0,2);K.weight(N0,2);var q0=new $0("point");q0.curl(g0,M0,1);q0.curl(O0,P0,.5);q0.curl(N0,M0,.5);q0.curl(ee,M0,.5);q0.curl(te,M0,.5);q0.weight(O0,2);q0.weight(N0,2);var U0=new $0("middle finger");U0.curl(g0,P0,1);U0.curl(O0,M0,.5);U0.curl(N0,M0,.5);U0.curl(ee,M0,.5);U0.curl(te,M0,.5);U0.weight(O0,2);U0.weight(N0,2);var ue=new $0("open palm");ue.curl(g0,P0,.75);ue.curl(O0,P0,.75);ue.curl(N0,P0,.75);ue.curl(ee,P0,.75);ue.curl(te,P0,.75);var QA=[D0,K,q0,U0,ue];var i2=.7,oe={HALF_CURL_START_LIMIT:60,NO_CURL_START_LIMIT:130,DISTANCE_VOTE_POWER:1.1,SINGLE_ANGLE_VOTE_POWER:.9,TOTAL_ANGLE_VOTE_POWER:1.6};function _A(e,t,o,A){let n=(t-A)/(e-o),s=Math.atan(n)*180/Math.PI;return s<=0?s=-s:s>0&&(s=180-s),s}function en(e,t){if(!e||!t)return[0,0];let o=_A(e[0],e[1],t[0],t[1]);if(e.length===2)return o;let A=_A(e[1],e[2],t[1],t[2]);return[o,A]}function $A(e,t=1){let o=0,A=0,n=0;return e>=75&&e<=105?o=1*t:e>=25&&e<=155?A=1*t:n=1*t,[o,A,n]}function l2(e,t,o){let A=e[0]-t[0],n=e[0]-o[0],s=t[0]-o[0],a=e[1]-t[1],i=e[1]-o[1],x=t[1]-o[1],d=e[2]-t[2],l=e[2]-o[2],y=t[2]-o[2],c=Math.sqrt(A*A+a*a+d*d),f=Math.sqrt(n*n+i*i+l*l),h=Math.sqrt(s*s+x*x+y*y),m=(h*h+c*c-f*f)/(2*h*c);m>1?m=1:m<-1&&(m=-1);let v=Math.acos(m);v=57.2958*v%180;let b;return v>oe.NO_CURL_START_LIMIT?b=X0.none:v>oe.HALF_CURL_START_LIMIT?b=X0.half:b=X0.full,b}function tn(e,t,o,A){let n;return A===Math.abs(e)?e>0?n=U.horizontalLeft:n=U.horizontalRight:A===Math.abs(t)?t>0?n=U.horizontalLeft:n=U.horizontalRight:o>0?n=U.horizontalLeft:n=U.horizontalRight,n}function on(e,t,o,A){let n;return A===Math.abs(e)?e<0?n=U.verticalDown:n=U.verticalUp:A===Math.abs(t)?t<0?n=U.verticalDown:n=U.verticalUp:o<0?n=U.verticalDown:n=U.verticalUp,n}function y2(e,t,o,A,n,s,a,i){let x,d=on(e,t,o,A),l=tn(n,s,a,i);return d===U.verticalUp?l===U.horizontalLeft?x=U.diagonalUpLeft:x=U.diagonalUpRight:l===U.horizontalLeft?x=U.diagonalDownLeft:x=U.diagonalDownRight,x}function x2(e,t,o,A){let n=e[0]-t[0],s=e[0]-o[0],a=t[0]-o[0],i=e[1]-t[1],x=e[1]-o[1],d=t[1]-o[1],l=Math.max(Math.abs(n),Math.abs(s),Math.abs(a)),y=Math.max(Math.abs(i),Math.abs(x),Math.abs(d)),c=0,f=0,h=0,m=y/(l+1e-5);m>1.5?c+=oe.DISTANCE_VOTE_POWER:m>.66?f+=oe.DISTANCE_VOTE_POWER:h+=oe.DISTANCE_VOTE_POWER;let v=Math.sqrt(n*n+i*i),b=Math.sqrt(s*s+x*x),M=Math.sqrt(a*a+d*d),p=Math.max(v,b,M),u=e[0],E=e[1],W=o[0],C=o[1];p===v?(W=o[0],C=o[1]):p===M&&(u=t[0],E=t[1]);let V=en([u,E],[W,C]),B=$A(V,oe.TOTAL_ANGLE_VOTE_POWER);c+=B[0],f+=B[1],h+=B[2];for(let t0 of A){let z=$A(t0,oe.SINGLE_ANGLE_VOTE_POWER);c+=z[0],f+=z[1],h+=z[2]}let H;return c===Math.max(c,f,h)?H=on(x,i,d,y):h===Math.max(f,h)?H=tn(s,n,a,l):H=y2(x,i,d,y,s,n,a,l),H}function An(e){let t=[],o=[],A=[],n=[];if(!e)return{curls:A,directions:n};for(let s of i0.all){let a=i0.getPoints(s),i=[],x=[];for(let d of a){let l=e[d[0]],y=e[d[1]],c=en(l,y),f=c[0],h=c[1];i.push(f),x.push(h)}t.push(i),o.push(x)}for(let s of i0.all){let a=s===i0.thumb?1:0,i=i0.getPoints(s),x=e[i[a][0]],d=e[i[a+1][1]],l=e[i[3][1]],y=l2(x,d,l),c=x2(x,d,l,t[s].slice(a));A[s]=y,n[s]=c}return{curls:A,directions:n}}function xt(e){if(!e||e.length===0)return null;let t=An(e),o={};for(let A of i0.all)o[i0.getName(A)]={curl:X0.getName(t.curls[A]),direction:U.getName(t.directions[A])};return o}function nn(e){let t=[];if(!e||e.length===0)return t;let o=An(e);for(let A of QA){let n=A.matchAgainst(o.curls,o.directions);n>=i2&&t.push({name:A.name,confidence:n})}return t}var rn={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],palm:[0]},he,be,sn;async function R5(e,t){let o=await sn.estimateHands(e,t);if(!o)return[];let A=[];for(let n=0;no[n].landmarks[y]);let a=o[n].landmarks,i=[Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER,0,0],x=[0,0,0,0];if(a&&a.length>0){for(let l of a)l[0]i[2]&&(i[2]=l[0]),l[1]>i[3]&&(i[3]=l[1]);i[2]-=i[0],i[3]-=i[1],x=[i[0]/(e.shape[2]||0),i[1]/(e.shape[1]||0),i[2]/(e.shape[2]||0),i[3]/(e.shape[1]||0)]}else i=o[n].box?[Math.trunc(Math.max(0,o[n].box.topLeft[0])),Math.trunc(Math.max(0,o[n].box.topLeft[1])),Math.trunc(Math.min(e.shape[2]||0,o[n].box.bottomRight[0])-Math.max(0,o[n].box.topLeft[0])),Math.trunc(Math.min(e.shape[1]||0,o[n].box.bottomRight[1])-Math.max(0,o[n].box.topLeft[1]))]:[0,0,0,0],x=[o[n].box.topLeft[0]/(e.shape[2]||0),o[n].box.topLeft[1]/(e.shape[1]||0),(o[n].box.bottomRight[0]-o[n].box.topLeft[0])/(e.shape[2]||0),(o[n].box.bottomRight[1]-o[n].box.topLeft[1])/(e.shape[1]||0)];let d=xt(a);A.push({id:n,score:Math.round(100*o[n].confidence)/100,boxScore:Math.round(100*o[n].boxConfidence)/100,fingerScore:Math.round(100*o[n].fingerConfidence)/100,label:"hand",box:i,boxRaw:x,keypoints:a,annotations:s,landmarks:d})}return A}async function w5(e){var o,A;R.initial&&(he=null,be=null),!he||!be?[he,be]=await Promise.all([e.hand.enabled?N((o=e.hand.detector)==null?void 0:o.modelPath):null,e.hand.landmarks?N((A=e.hand.skeleton)==null?void 0:A.modelPath):null]):(e.debug&&g("cached model:",he.modelUrl),e.debug&&g("cached model:",be.modelUrl));let t=new P5(he);return sn=new M5(t,be),[he,be]}var $=[null,null],c2=["StatefulPartitionedCall/Postprocessor/Slice","StatefulPartitionedCall/Postprocessor/ExpandDims_1"],J0=[[0,0],[0,0]],d2=["hand","fist","pinch","point","face","tip","pinchtip"],ln=4,yn=1.6,f2=512,m2=1.4,ct=Number.MAX_SAFE_INTEGER,k5=0,L0=[0,0],J={boxes:[],hands:[]},xn={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],base:[0],palm:[0,17,13,9,5,1,0]};async function cn(e){var t;if(R.initial&&($[0]=null),$[0])e.debug&&g("cached model:",$[0].modelUrl);else{dt(["tensorlistreserve","enter","tensorlistfromtensor","merge","loopcond","switch","exit","tensorliststack","nextiteration","tensorlistsetitem","tensorlistgetitem","reciprocal","shape","split","where"],e),$[0]=await N((t=e.hand.detector)==null?void 0:t.modelPath);let o=Object.values($[0].modelSignature.inputs);J0[0][0]=Array.isArray(o)?parseInt(o[0].tensorShape.dim[1].size):0,J0[0][1]=Array.isArray(o)?parseInt(o[0].tensorShape.dim[2].size):0}return $[0]}async function dn(e){var t;if(R.initial&&($[1]=null),$[1])e.debug&&g("cached model:",$[1].modelUrl);else{$[1]=await N((t=e.hand.skeleton)==null?void 0:t.modelPath);let o=Object.values($[1].modelSignature.inputs);J0[1][0]=Array.isArray(o)?parseInt(o[0].tensorShape.dim[1].size):0,J0[1][1]=Array.isArray(o)?parseInt(o[0].tensorShape.dim[2].size):0}return $[1]}async function p2(e,t){let o=[];if(!e||!$[0])return o;let A={},n=(e.shape[2]||1)/(e.shape[1]||1),s=Math.min(Math.round((e.shape[1]||0)/8)*8,f2),a=Math.round(s*n/8)*8;A.resize=r.image.resizeBilinear(e,[s,a]),A.cast=r.cast(A.resize,"int32"),[A.rawScores,A.rawBoxes]=await $[0].executeAsync(A.cast,c2),A.boxes=r.squeeze(A.rawBoxes,[0,2]),A.scores=r.squeeze(A.rawScores,[0]);let i=r.unstack(A.scores,1);r.dispose(i[ln]),i.splice(ln,1),A.filtered=r.stack(i,1),r.dispose(i),A.max=r.max(A.filtered,1),A.argmax=r.argMax(A.filtered,1);let x=0;A.nms=await r.image.nonMaxSuppressionAsync(A.boxes,A.max,(t.hand.maxDetected||0)+1,t.hand.iouThreshold||0,t.hand.minConfidence||1);let d=await A.nms.data(),l=await A.max.data(),y=await A.argmax.data();for(let c of Array.from(d)){let f=r.slice(A.boxes,c,1),h=await f.data();r.dispose(f);let m=[h[1],h[0],h[3]-h[1],h[2]-h[0]],v=tt(m,m2),b=[Math.trunc(m[0]*L0[0]),Math.trunc(m[1]*L0[1]),Math.trunc(m[2]*L0[0]),Math.trunc(m[3]*L0[1])],M=l[c],p=d2[y[c]],u={id:x++,score:M,box:b,boxRaw:v,label:p};o.push(u)}return Object.keys(A).forEach(c=>r.dispose(A[c])),o.sort((c,f)=>f.score-c.score),o.length>(t.hand.maxDetected||1)&&(o.length=t.hand.maxDetected||1),o}async function E5(e,t,o){let A={id:t.id,score:Math.round(100*t.score)/100,boxScore:Math.round(100*t.score)/100,fingerScore:0,box:t.box,boxRaw:t.boxRaw,label:t.label,keypoints:[],landmarks:{},annotations:{}};if(e&&$[1]&&o.hand.landmarks&&t.score>(o.hand.minConfidence||0)){let n={},s=[t.boxRaw[1],t.boxRaw[0],t.boxRaw[3]+t.boxRaw[1],t.boxRaw[2]+t.boxRaw[0]];n.crop=r.image.cropAndResize(e,[s],[0],[J0[1][0],J0[1][1]],"bilinear"),n.div=r.div(n.crop,L.tf255),[n.score,n.keypoints]=$[1].execute(n.div,["Identity_1","Identity"]);let a=(await n.score.data())[0],i=(100-Math.trunc(100/(1+Math.exp(a))))/100;if(i>=(o.hand.minConfidence||0)){A.fingerScore=i,n.reshaped=r.reshape(n.keypoints,[-1,3]);let l=(await n.reshaped.array()).map(y=>[y[0]/J0[1][1],y[1]/J0[1][0],y[2]||0]).map(y=>[y[0]*t.boxRaw[2],y[1]*t.boxRaw[3],y[2]||0]);A.keypoints=l.map(y=>[L0[0]*(y[0]+t.boxRaw[0]),L0[1]*(y[1]+t.boxRaw[1]),y[2]||0]),A.landmarks=xt(A.keypoints);for(let y of Object.keys(xn))A.annotations[y]=xn[y].map(c=>A.landmarks&&A.keypoints[c]?A.keypoints[c]:null)}Object.keys(n).forEach(x=>r.dispose(n[x]))}return A}async function z5(e,t){var n,s;if(!$[0]||!$[1]||!((n=$[0])!=null&&n.inputs[0].shape)||!((s=$[1])!=null&&s.inputs[0].shape))return[];L0=[e.shape[2]||0,e.shape[1]||0],ct++;let o=(t.hand.skipTime||0)>P()-k5,A=ct<(t.hand.skipFrames||0);return t.skipAllowed&&o&&A?J.hands:new Promise(async a=>{let i=3*(t.hand.skipTime||0)>P()-k5,x=ct<3*(t.hand.skipFrames||0);t.skipAllowed&&J.hands.length===t.hand.maxDetected?J.hands=await Promise.all(J.boxes.map(l=>E5(e,l,t))):t.skipAllowed&&i&&x&&J.hands.length>0?J.hands=await Promise.all(J.boxes.map(l=>E5(e,l,t))):(J.boxes=await p2(e,t),k5=P(),J.hands=await Promise.all(J.boxes.map(l=>E5(e,l,t))),ct=0);let d=[...J.boxes];if(J.boxes.length=0,t.cacheSensitivity>0)for(let l=0;l.05&&y.box[3]/(e.shape[1]||1)>.05&&J.hands[l].fingerScore&&J.hands[l].fingerScore>(t.hand.minConfidence||0)){let c=tt(y.box,yn),f=tt(y.boxRaw,yn);J.boxes.push({...d[l],box:c,boxRaw:f})}}for(let l=0;lP()-pn,s=j5<(((i=t.face.liveness)==null?void 0:i.skipFrames)||0);return t.skipAllowed&&n&&s&&mn===A&&ft[o]?(j5++,ft[o]):(j5=0,new Promise(async x=>{let d=r.image.resizeBilinear(e,[r0!=null&&r0.inputs[0].shape?r0.inputs[0].shape[2]:0,r0!=null&&r0.inputs[0].shape?r0.inputs[0].shape[1]:0],!1),l=r0==null?void 0:r0.execute(d),y=(await l.data())[0];ft[o]=Math.round(100*y)/100,mn=A,pn=P(),r.dispose([d,l]),x(ft[o])}))}var Le={};Ze(Le,{connected:()=>pt,horizontal:()=>W5,kpt:()=>mt,relative:()=>I5,vertical:()=>C5});var mt=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],W5=[["leftEye","rightEye"],["leftEar","rightEar"],["leftShoulder","rightShoulder"],["leftElbow","rightElbow"],["leftWrist","rightWrist"],["leftHip","rightHip"],["leftKnee","rightKnee"],["leftAnkle","rightAnkle"]],C5=[["leftKnee","leftShoulder"],["rightKnee","rightShoulder"],["leftAnkle","leftKnee"],["rightAnkle","rightKnee"]],I5=[[["leftHip","rightHip"],["leftShoulder","rightShoulder"]],[["leftElbow","rightElbow"],["leftShoulder","rightShoulder"]]],pt={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var bn=.005,d0={keypoints:[],padding:[[0,0],[0,0],[0,0],[0,0]]};function O5(e){for(let t of W5){let o=e.keypoints.findIndex(n=>n.part===t[0]),A=e.keypoints.findIndex(n=>n.part===t[1]);if(e.keypoints[o]&&e.keypoints[A]&&e.keypoints[o].position[0]n&&n.part===t[0]),A=e.keypoints.findIndex(n=>n&&n.part===t[1]);e.keypoints[o]&&e.keypoints[A]&&e.keypoints[o].position[1]d&&d.part===t[0]),n=e.keypoints.findIndex(d=>d&&d.part===t[1]),s=e.keypoints.findIndex(d=>d&&d.part===o[0]),a=e.keypoints.findIndex(d=>d&&d.part===o[1]);if(!e.keypoints[s]||!e.keypoints[a])continue;let i=e.keypoints[A]?[Math.abs(e.keypoints[s].position[0]-e.keypoints[A].position[0]),Math.abs(e.keypoints[a].position[0]-e.keypoints[A].position[0])]:[0,0],x=e.keypoints[n]?[Math.abs(e.keypoints[a].position[0]-e.keypoints[n].position[0]),Math.abs(e.keypoints[s].position[0]-e.keypoints[n].position[0])]:[0,0];if(i[0]>i[1]||x[0]>x[1]){let d=e.keypoints[A];e.keypoints[A]=e.keypoints[n],e.keypoints[n]=d}}}function gn(e){for(let t=0;te.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0],[0,0]],o.pad=r.pad(e,d0.padding),o.resize=r.image.resizeBilinear(o.pad,[t,t]);let A=r.cast(o.resize,"int32");return Object.keys(o).forEach(n=>r.dispose(o[n])),A}function Mn(e,t){e.keypoints=e.keypoints.filter(A=>A&&A.position);for(let A of e.keypoints)A.position=[A.position[0]*(t[0]+d0.padding[2][0]+d0.padding[2][1])/t[0]-d0.padding[2][0],A.position[1]*(t[1]+d0.padding[1][0]+d0.padding[1][1])/t[1]-d0.padding[1][0]],A.positionRaw=[A.position[0]/t[0],A.position[1]/t[1]];let o=S0(e.keypoints.map(A=>A.position),t);return e.box=o.box,e.boxRaw=o.boxRaw,e}var f0,ut=0,N5=Number.MAX_SAFE_INTEGER,Ae={boxes:[],bodies:[],last:0};async function vn(e){return R.initial&&(f0=null),f0?e.debug&&g("cached model:",f0.modelUrl):(dt(["size"],e),f0=await N(e.body.modelPath)),ut=f0.inputs[0].shape?f0.inputs[0].shape[2]:0,ut<64&&(ut=256),f0}async function h2(e,t,o){let A=e[0][0],n=[],s=0;for(let l=0;lt.body.minConfidence){let y=[A[l][1],A[l][0]];n.push({score:Math.round(100*s)/100,part:mt[l],positionRaw:y,position:[Math.round((o.shape[2]||0)*y[0]),Math.round((o.shape[1]||0)*y[1])]})}s=n.reduce((l,y)=>y.score>l?y.score:l,0);let a=[],i=S0(n.map(l=>l.position),[o.shape[2],o.shape[1]]),x={};for(let[l,y]of Object.entries(pt)){let c=[];for(let f=0;fv.part===y[f]),m=n.find(v=>v.part===y[f+1]);h&&m&&h.score>(t.body.minConfidence||0)&&m.score>(t.body.minConfidence||0)&&c.push([h.position,m.position])}x[l]=c}let d={id:0,score:s,box:i.box,boxRaw:i.boxRaw,keypoints:n,annotations:x};return O5(d),a.push(d),a}async function b2(e,t,o){let A=[];for(let n=0;nt.body.minConfidence){let i=[];for(let y=0;y<17;y++){let c=s[3*y+2];if(c>t.body.minConfidence){let f=[s[3*y+1],s[3*y+0]];i.push({part:mt[y],score:Math.round(100*c)/100,positionRaw:f,position:[Math.round((o.shape[2]||0)*f[0]),Math.round((o.shape[1]||0)*f[1])]})}}let x=S0(i.map(y=>y.position),[o.shape[2],o.shape[1]]),d={};for(let[y,c]of Object.entries(pt)){let f=[];for(let h=0;hb.part===c[h]),v=i.find(b=>b.part===c[h+1]);m&&v&&m.score>(t.body.minConfidence||0)&&v.score>(t.body.minConfidence||0)&&f.push([m.position,v.position])}d[y]=f}let l={id:n,score:a,box:x.box,boxRaw:x.boxRaw,keypoints:[...i],annotations:d};O5(l),A.push(l)}}return A.sort((n,s)=>s.score-n.score),A.length>t.body.maxDetected&&(A.length=t.body.maxDetected),A}async function L5(e,t){if(!f0||!(f0!=null&&f0.inputs[0].shape))return[];t.skipAllowed||(Ae.boxes.length=0),N5++;let o=(t.body.skipTime||0)>P()-Ae.last,A=N5<(t.body.skipFrames||0);return t.skipAllowed&&o&&A?Ae.bodies:new Promise(async n=>{let s={};N5=0,s.input=Pn(e,ut),s.res=f0==null?void 0:f0.execute(s.input),Ae.last=P();let a=await s.res.array();Ae.bodies=s.res.shape[2]===17?await h2(a,t,e):await b2(a,t,e);for(let i of Ae.bodies)Mn(i,[e.shape[2]||1,e.shape[1]||1]),gn(i.keypoints);Object.keys(s).forEach(i=>r.dispose(s[i])),n(Ae.bodies)})}var ge,ht=[],Rn=0,B5=Number.MAX_SAFE_INTEGER,gt=0,bt=2.5;async function wn(e){if(!ge||R.initial){ge=await N(e.object.modelPath);let t=Object.values(ge.modelSignature.inputs);gt=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):0}else e.debug&&g("cached model:",ge.modelUrl);return ge}async function g2(e,t,o){let A=0,n=[];for(let x of[1,2,4])r.tidy(async()=>{let d=x*13,l=r.squeeze(e.find(m=>m.shape[1]===d**2&&(m.shape[2]||0)===xe.length)),y=r.squeeze(e.find(m=>m.shape[1]===d**2&&(m.shape[2]||0)(o.object.minConfidence||0)&&v!==61){let M=(.5+Math.trunc(m%d))/d,p=(.5+Math.trunc(m/d))/d,u=f[m].map(H=>H*(d/x/gt)),[E,W]=[M-bt/x*u[0],p-bt/x*u[1]],[C,S]=[M+bt/x*u[2]-E,p+bt/x*u[3]-W],O=[E,W,C,S];O=O.map(H=>Math.max(0,Math.min(H,1)));let V=[O[0]*t[0],O[1]*t[1],O[2]*t[0],O[3]*t[1]],B={id:A++,score:Math.round(100*b)/100,class:v+1,label:xe[v].label,box:V.map(H=>Math.trunc(H)),boxRaw:O};n.push(B)}}});e.forEach(x=>r.dispose(x));let s=n.map(x=>[x.boxRaw[1],x.boxRaw[0],x.boxRaw[3],x.boxRaw[2]]),a=n.map(x=>x.score),i=[];if(s&&s.length>0){let x=await r.image.nonMaxSuppressionAsync(s,a,o.object.maxDetected,o.object.iouThreshold,o.object.minConfidence);i=await x.data(),r.dispose(x)}return n=n.filter((x,d)=>i.includes(d)).sort((x,d)=>d.score-x.score),n}async function G5(e,t){let o=(t.object.skipTime||0)>P()-Rn,A=B5<(t.object.skipFrames||0);return t.skipAllowed&&o&&A&&ht.length>0?(B5++,ht):(B5=0,!R.kernels.includes("mod")||!R.kernels.includes("sparsetodense")?ht:new Promise(async n=>{let s=[e.shape[2]||0,e.shape[1]||0],a=r.image.resizeBilinear(e,[gt,gt],!1),i=r.div(a,L.tf255),x=i.transpose([0,3,1,2]);r.dispose(i),r.dispose(a);let d;t.object.enabled&&(d=ge.execute(x)),Rn=P(),r.dispose(x);let l=await g2(d,s,t);ht=l,n(l)}))}var Ge=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],P2=Ge.length,Be=Ge.reduce((e,t,o)=>(e[t]=o,e),{}),M2=[["leftHip","leftShoulder"],["leftElbow","leftShoulder"],["leftElbow","leftWrist"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["rightHip","rightShoulder"],["rightElbow","rightShoulder"],["rightElbow","rightWrist"],["rightHip","rightKnee"],["rightKnee","rightAnkle"],["leftShoulder","rightShoulder"],["leftHip","rightHip"]],Fa=M2.map(([e,t])=>[Be[e],Be[t]]),En=[["nose","leftEye"],["leftEye","leftEar"],["nose","rightEye"],["rightEye","rightEar"],["nose","leftShoulder"],["leftShoulder","leftElbow"],["leftElbow","leftWrist"],["leftShoulder","leftHip"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["nose","rightShoulder"],["rightShoulder","rightElbow"],["rightElbow","rightWrist"],["rightShoulder","rightHip"],["rightHip","rightKnee"],["rightKnee","rightAnkle"]];function zn(e){let t=e.reduce(({maxX:o,maxY:A,minX:n,minY:s},{position:{x:a,y:i}})=>({maxX:Math.max(o,a),maxY:Math.max(A,i),minX:Math.min(n,a),minY:Math.min(s,i)}),{maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY});return[t.minX,t.minY,t.maxX-t.minX,t.maxY-t.minY]}function jn(e,[t,o],[A,n]){let s=t/A,a=o/n,i=(d,l)=>({id:l,score:d.score,boxRaw:[d.box[0]/n,d.box[1]/A,d.box[2]/n,d.box[3]/A],box:[Math.trunc(d.box[0]*a),Math.trunc(d.box[1]*s),Math.trunc(d.box[2]*a),Math.trunc(d.box[3]*s)],keypoints:d.keypoints.map(({score:y,part:c,position:f})=>({score:y,part:c,position:[Math.trunc(f.x*a),Math.trunc(f.y*s)],positionRaw:[f.x/A,f.y/A]})),annotations:{}});return e.map((d,l)=>i(d,l))}var H5=class{constructor(t,o){w(this,"priorityQueue");w(this,"numberOfElements");w(this,"getElementValue");this.priorityQueue=new Array(t),this.numberOfElements=-1,this.getElementValue=o}enqueue(t){this.priorityQueue[++this.numberOfElements]=t,this.swim(this.numberOfElements)}dequeue(){let t=this.priorityQueue[0];return this.exchange(0,this.numberOfElements--),this.sink(0),this.priorityQueue[this.numberOfElements+1]=null,t}empty(){return this.numberOfElements===-1}size(){return this.numberOfElements+1}all(){return this.priorityQueue.slice(0,this.numberOfElements+1)}max(){return this.priorityQueue[0]}swim(t){for(;t>0&&this.less(Math.floor(t/2),t);)this.exchange(t,Math.floor(t/2)),t=Math.floor(t/2)}sink(t){for(;2*t<=this.numberOfElements;){let o=2*t;if(oo?o:e}function Sn(e,t,o,A){let n=o-e,s=A-t;return n*n+s*s}function X5(e,t){return{x:e.x+t.x,y:e.y+t.y}}var v0,T2=["MobilenetV1/offset_2/BiasAdd","MobilenetV1/heatmap_2/BiasAdd","MobilenetV1/displacement_fwd_2/BiasAdd","MobilenetV1/displacement_bwd_2/BiasAdd"],Pt=1,Pe=16,R2=50**2;function Wn(e,t,o,A,n,s,a=2){let i=b=>({y:s.get(b.y,b.x,e),x:s.get(b.y,b.x,s.shape[2]/2+e)}),x=(b,M,p)=>({y:Z5(Math.round(b.y/Pe),0,M-1),x:Z5(Math.round(b.x/Pe),0,p-1)}),[d,l]=A.shape,y=x(t.position,d,l),c=i(y),h=X5(t.position,c);for(let b=0;b[Be[c],Be[f]]),a=s.map(([,c])=>c),i=s.map(([c])=>c),x=t.shape[2],d=a.length,l=new Array(x),y=V5(e.part,Pe,o);l[e.part.id]={score:e.score,part:Ge[e.part.id],position:y};for(let c=d-1;c>=0;--c){let f=a[c],h=i[c];l[f]&&!l[h]&&(l[h]=Wn(c,l[f],h,t,o,n))}for(let c=0;ct){i=!1;break}if(!i)break}return i}function E2(e,t){let[o,A,n]=t.shape,s=new H5(o*A*n,({score:a})=>a);for(let a=0;a{var a;let s=(a=n[A])==null?void 0:a.position;return s?Sn(o,t,s.y,s.x)<=R2:!1})}function z2(e,t){return t.reduce((A,{position:n,score:s},a)=>(Cn(e,n,a)||(A+=s),A),0)/t.length}function j2(e,t,o,A,n,s){let a=[],i=E2(s,t);for(;a.lengthf.score>s);let y=z2(a,l),c=zn(l);y>s&&a.push({keypoints:l,box:c,score:Math.round(100*y)/100})}return a}async function D5(e,t){let o=r.tidy(()=>{if(!v0.inputs[0].shape)return[];let a=r.image.resizeBilinear(e,[v0.inputs[0].shape[2],v0.inputs[0].shape[1]]),i=r.sub(r.div(r.cast(a,"float32"),127.5),1),d=v0.execute(i,T2).map(l=>r.squeeze(l,[0]));return d[1]=r.sigmoid(d[1]),d}),A=await Promise.all(o.map(a=>a.buffer()));for(let a of o)r.dispose(a);let n=await j2(A[0],A[1],A[2],A[3],t.body.maxDetected,t.body.minConfidence);return v0.inputs[0].shape?jn(n,[e.shape[1],e.shape[2]],[v0.inputs[0].shape[2],v0.inputs[0].shape[1]]):[]}async function In(e){return!v0||R.initial?v0=await N(e.body.modelPath):e.debug&&g("cached model:",v0.modelUrl),v0}var w0,q5=!1;async function U5(e){return!w0||R.initial?w0=await N(e.segmentation.modelPath):e.debug&&g("cached model:",w0.modelUrl),w0}async function Nn(e,t,o){var m,v;if(q5)return{data:[],canvas:null,alpha:null};q5=!0,w0||await U5(o);let A=await ie(e,o),n=((m=A.tensor)==null?void 0:m.shape[2])||0,s=((v=A.tensor)==null?void 0:v.shape[1])||0;if(!A.tensor)return{data:[],canvas:null,alpha:null};let a={};a.resize=r.image.resizeBilinear(A.tensor,[w0.inputs[0].shape?w0.inputs[0].shape[1]:0,w0.inputs[0].shape?w0.inputs[0].shape[2]:0],!1),r.dispose(A.tensor),a.norm=r.div(a.resize,L.tf255),a.res=w0.execute(a.norm),a.squeeze=r.squeeze(a.res,0),a.squeeze.shape[2]===2?(a.softmax=r.softmax(a.squeeze),[a.bg,a.fg]=r.unstack(a.softmax,2),a.expand=r.expandDims(a.fg,2),a.pad=r.expandDims(a.expand,0),a.crop=r.image.cropAndResize(a.pad,[[0,0,.5,.5]],[0],[n,s]),a.data=r.squeeze(a.crop,0)):a.data=r.image.resizeBilinear(a.squeeze,[s,n]);let i=Array.from(await a.data.data());if(R.node&&!R.Canvas&&typeof ImageData=="undefined")return o.debug&&g("canvas support missing"),Object.keys(a).forEach(b=>r.dispose(a[b])),{data:i,canvas:null,alpha:null};let x=s0(n,s);r.browser&&await r.browser.toPixels(a.data,x);let d=x.getContext("2d");o.segmentation.blur&&o.segmentation.blur>0&&(d.filter=`blur(${o.segmentation.blur}px)`);let l=d.getImageData(0,0,n,s),y=s0(n,s),c=y.getContext("2d");A.canvas&&c.drawImage(A.canvas,0,0),c.globalCompositeOperation="darken",o.segmentation.blur&&o.segmentation.blur>0&&(c.filter=`blur(${o.segmentation.blur}px)`),c.drawImage(x,0,0),c.globalCompositeOperation="source-over",c.filter="none";let f=c.getImageData(0,0,n,s);for(let b=0;br.dispose(a[b])),q5=!1,{data:i,canvas:y,alpha:x}}var J5=class{constructor(){w(this,"ssrnetage",null);w(this,"gear",null);w(this,"blazeposedetect",null);w(this,"blazepose",null);w(this,"centernet",null);w(this,"efficientpose",null);w(this,"mobilefacenet",null);w(this,"emotion",null);w(this,"facedetect",null);w(this,"faceiris",null);w(this,"facemesh",null);w(this,"faceres",null);w(this,"ssrnetgender",null);w(this,"handpose",null);w(this,"handskeleton",null);w(this,"handtrack",null);w(this,"liveness",null);w(this,"movenet",null);w(this,"nanodet",null);w(this,"posenet",null);w(this,"segmentation",null);w(this,"antispoof",null)}};function Y5(e){for(let t of Object.keys(e.models))e.models[t]=null}async function Bn(e){var t,o,A,n,s,a,i,x,d,l,y,c,f,h,m,v,b,M,p,u,E,W,C,S,O,V,B,H,t0,z;R.initial&&Y5(e),e.config.hand.enabled&&(!e.models.handpose&&((o=(t=e.config.hand.detector)==null?void 0:t.modelPath)==null?void 0:o.includes("handdetect"))&&([e.models.handpose,e.models.handskeleton]=await w5(e.config)),!e.models.handskeleton&&e.config.hand.landmarks&&((n=(A=e.config.hand.detector)==null?void 0:A.modelPath)==null?void 0:n.includes("handdetect"))&&([e.models.handpose,e.models.handskeleton]=await w5(e.config))),e.config.body.enabled&&!e.models.blazepose&&((a=(s=e.config.body)==null?void 0:s.modelPath)==null?void 0:a.includes("blazepose"))&&(e.models.blazepose=yA(e.config)),e.config.body.enabled&&!e.models.blazeposedetect&&e.config.body.detector&&e.config.body.detector.modelPath&&(e.models.blazeposedetect=lA(e.config)),e.config.body.enabled&&!e.models.efficientpose&&((x=(i=e.config.body)==null?void 0:i.modelPath)==null?void 0:x.includes("efficientpose"))&&(e.models.efficientpose=pA(e.config)),e.config.body.enabled&&!e.models.movenet&&((l=(d=e.config.body)==null?void 0:d.modelPath)==null?void 0:l.includes("movenet"))&&(e.models.movenet=vn(e.config)),e.config.body.enabled&&!e.models.posenet&&((c=(y=e.config.body)==null?void 0:y.modelPath)==null?void 0:c.includes("posenet"))&&(e.models.posenet=In(e.config)),e.config.face.enabled&&!e.models.facedetect&&(e.models.facedetect=eA(e.config)),e.config.face.enabled&&((f=e.config.face.antispoof)==null?void 0:f.enabled)&&!e.models.antispoof&&(e.models.antispoof=Fo(e.config)),e.config.face.enabled&&((h=e.config.face.liveness)==null?void 0:h.enabled)&&!e.models.liveness&&(e.models.liveness=un(e.config)),e.config.face.enabled&&((m=e.config.face.description)==null?void 0:m.enabled)&&!e.models.faceres&&(e.models.faceres=GA(e.config)),e.config.face.enabled&&((v=e.config.face.emotion)==null?void 0:v.enabled)&&!e.models.emotion&&(e.models.emotion=gA(e.config)),e.config.face.enabled&&((b=e.config.face.iris)==null?void 0:b.enabled)&&!e.models.faceiris&&(e.models.faceiris=jA(e.config)),e.config.face.enabled&&((M=e.config.face.mesh)==null?void 0:M.enabled)&&!e.models.facemesh&&(e.models.facemesh=IA(e.config)),e.config.face.enabled&&((p=e.config.face.gear)==null?void 0:p.enabled)&&!e.models.gear&&(e.models.gear=Eo(e.config)),e.config.face.enabled&&((u=e.config.face.ssrnet)==null?void 0:u.enabled)&&!e.models.ssrnetage&&(e.models.ssrnetage=Co(e.config)),e.config.face.enabled&&((E=e.config.face.ssrnet)==null?void 0:E.enabled)&&!e.models.ssrnetgender&&(e.models.ssrnetgender=Lo(e.config)),e.config.face.enabled&&((W=e.config.face.mobilefacenet)==null?void 0:W.enabled)&&!e.models.mobilefacenet&&(e.models.mobilefacenet=RA(e.config)),e.config.hand.enabled&&!e.models.handtrack&&((S=(C=e.config.hand.detector)==null?void 0:C.modelPath)==null?void 0:S.includes("handtrack"))&&(e.models.handtrack=cn(e.config)),e.config.hand.enabled&&e.config.hand.landmarks&&!e.models.handskeleton&&((V=(O=e.config.hand.detector)==null?void 0:O.modelPath)==null?void 0:V.includes("handtrack"))&&(e.models.handskeleton=dn(e.config)),e.config.object.enabled&&!e.models.centernet&&((H=(B=e.config.object)==null?void 0:B.modelPath)==null?void 0:H.includes("centernet"))&&(e.models.centernet=dA(e.config)),e.config.object.enabled&&!e.models.nanodet&&((z=(t0=e.config.object)==null?void 0:t0.modelPath)==null?void 0:z.includes("nanodet"))&&(e.models.nanodet=wn(e.config)),e.config.segmentation.enabled&&!e.models.segmentation&&(e.models.segmentation=U5(e.config));for await(let m0 of Object.keys(e.models))e.models[m0]&&typeof e.models[m0]!="undefined"&&(e.models[m0]=await e.models[m0])}async function Gn(e){let t=["const","placeholder","noop","pad","squeeze","add","sub","mul","div"];for(let o of Object.keys(e.models)){let A=e.models[o];if(!A)continue;let n=[],s=A==null?void 0:A.executor;if(s&&s.graph.nodes)for(let i of Object.values(s.graph.nodes)){let x=i.op.toLowerCase();n.includes(x)||n.push(x)}else!s&&e.config.debug&&g("model signature not determined:",o);let a=[];for(let i of n)!t.includes(i)&&!e.env.kernels.includes(i)&&!e.env.kernels.includes(i.replace("_",""))&&!e.env.kernels.includes(i.replace("native",""))&&!e.env.kernels.includes(i.replace("v2",""))&&a.push(i);e.config.debug&&a.length>0&&g("model validation failed:",o,a)}}var q={name:"humangl",priority:999,canvas:null,gl:null,extensions:[],webGLattr:{alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!1,desynchronized:!0}};function S2(){let e=q.gl;!e||(q.extensions=e.getSupportedExtensions())}async function Fn(e){var t;if(e.config.backend==="humangl"&&(q.name in r.engine().registry&&(!q.gl||!q.gl.getParameter(q.gl.VERSION))&&(g("error: humangl backend invalid context"),Y5(e)),!r.findBackend(q.name))){try{q.canvas=await s0(100,100)}catch(A){g("error: cannot create canvas:",A);return}try{if(q.gl=(t=q.canvas)==null?void 0:t.getContext("webgl2",q.webGLattr),!q.gl.getParameter(q.gl.VERSION).includes("2.0")){g("override: using fallback webgl backend as webgl 2.0 is not detected"),e.config.backend="webgl";return}q.canvas&&(q.canvas.addEventListener("webglcontextlost",async n=>{throw g("error: humangl:",n.type),g("possible browser memory leak using webgl or conflict with multiple backend registrations"),e.emit("error"),new Error("backend error: webgl context lost")}),q.canvas.addEventListener("webglcontextrestored",n=>{g("error: humangl context restored:",n)}),q.canvas.addEventListener("webglcontextcreationerror",n=>{g("error: humangl context create:",n)}))}catch(A){g("error: cannot get WebGL context:",A);return}try{r.setWebGLContext(2,q.gl)}catch(A){g("error: cannot set WebGL context:",A);return}try{let A=new r.GPGPUContext(q.gl);r.registerBackend(q.name,()=>new r.MathBackendWebGL(A),q.priority)}catch(A){g("error: cannot register WebGL backend:",A);return}try{r.getKernelsForBackend("webgl").forEach(n=>{let s={...n,backendName:q.name};r.registerKernel(s)})}catch(A){g("error: cannot update WebGL backend registration:",A);return}let o=r.backend().getGPGPUContext?r.backend().getGPGPUContext().gl:null;if(o)g(`humangl webgl version:${o.getParameter(o.VERSION)} renderer:${o.getParameter(o.RENDERER)}`);else{g("error: no current gl context:",o,q.gl);return}try{r.ENV.set("WEBGL_VERSION",2)}catch(A){g("error: cannot set WebGL backend flags:",A);return}S2(),g("backend registered:",q.name)}}function W2(){if(!R.kernels.includes("mod")){let e={kernelName:"Mod",backendName:r.getBackend(),kernelFunc:t=>r.tidy(()=>r.sub(t.inputs.a,r.mul(r.div(t.inputs.a,t.inputs.b),t.inputs.b)))};r.registerKernel(e),R.kernels.push("mod")}if(!R.kernels.includes("floormod")){let e={kernelName:"FloorMod",backendName:r.getBackend(),kernelFunc:t=>r.tidy(()=>r.floorDiv(t.inputs.a/t.inputs.b)*t.inputs.b+r.mod(t.inputs.a,t.inputs.b))};r.registerKernel(e),R.kernels.push("floormod")}}async function Mt(e,t=!1){if(e.state="backend",t||R.initial||e.config.backend&&e.config.backend.length>0&&r.getBackend()!==e.config.backend){let o=P();if(e.config.backend&&e.config.backend.length>0){if(typeof window=="undefined"&&typeof WorkerGlobalScope!="undefined"&&e.config.debug&&e.config.debug&&g("running inside web worker"),R.browser&&e.config.backend==="tensorflow"&&(e.config.debug&&g("override: backend set to tensorflow while running in browser"),e.config.backend="humangl"),R.node&&(e.config.backend==="webgl"||e.config.backend==="humangl")&&(e.config.debug&&g(`override: backend set to ${e.config.backend} while running in nodejs`),e.config.backend="tensorflow"),R.browser&&e.config.backend==="webgpu")if(typeof navigator=="undefined"||typeof navigator.gpu=="undefined")g("override: backend set to webgpu but browser does not support webgpu"),e.config.backend="humangl";else{let n=await navigator.gpu.requestAdapter();e.config.debug&&g("enumerated webgpu adapter:",n)}e.config.backend==="humangl"&&await Fn(e);let A=Object.keys(r.engine().registryFactory);if(e.config.debug&&g("available backends:",A),A.includes(e.config.backend)||(g(`error: backend ${e.config.backend} not found in registry`),e.config.backend=R.node?"tensorflow":"webgl",e.config.debug&&g(`override: setting backend ${e.config.backend}`)),e.config.debug&&g("setting backend:",e.config.backend),e.config.backend==="wasm"){if(e.config.debug&&g("wasm path:",e.config.wasmPath),typeof(r==null?void 0:r.setWasmPaths)!="undefined")await r.setWasmPaths(e.config.wasmPath,e.config.wasmPlatformFetch);else throw new Error("backend error: attempting to use wasm backend but wasm path is not set");let n=await r.env().getAsync("WASM_HAS_SIMD_SUPPORT"),s=await r.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT");e.config.debug&&g(`wasm execution: ${n?"SIMD":"no SIMD"} ${s?"multithreaded":"singlethreaded"}`),e.config.debug&&!n&&g("warning: wasm simd support is not enabled")}try{await r.setBackend(e.config.backend),await r.ready(),jo()}catch(n){return g("error: cannot set backend:",e.config.backend,n),!1}}if(r.getBackend()==="humangl"&&(r.ENV.set("CHECK_COMPUTATION_FOR_ERRORS",!1),r.ENV.set("WEBGL_CPU_FORWARD",!0),r.ENV.set("WEBGL_USE_SHAPES_UNIFORMS",!0),r.ENV.set("CPU_HANDOFF_SIZE_THRESHOLD",256),typeof e.config.deallocate!="undefined"&&e.config.deallocate&&(g("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",!0),r.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",0)),r.backend().getGPGPUContext)){let A=await r.backend().getGPGPUContext().gl;e.config.debug&&g(`gl version:${A.getParameter(A.VERSION)} renderer:${A.getParameter(A.RENDERER)}`)}r.getBackend(),r.enableProdMode(),await r.ready(),e.performance.initBackend=Math.trunc(P()-o),e.config.backend=r.getBackend(),await R.updateBackend(),W2()}return!0}function dt(e,t){for(let o of e){let A={kernelName:o,backendName:t.backend,kernelFunc:()=>{t.debug&&g("kernelFunc",o,t.backend)}};r.registerKernel(A)}R.kernels=r.getKernelsForBackend(r.getBackend()).map(o=>o.kernelName.toLowerCase())}var B0={color:"rgba(173, 216, 230, 0.6)",labelColor:"rgba(173, 216, 230, 1)",shadowColor:"black",font:'small-caps 16px "Segoe UI"',lineHeight:18,lineWidth:4,pointSize:2,roundRect:8,drawPoints:!1,drawLabels:!0,drawBoxes:!0,drawGestures:!0,drawPolygons:!0,drawGaze:!0,fillPolygons:!1,useDepth:!0,useCurves:!1},K5=0,ne=e=>{if(!e)g("draw error: invalid canvas");else if(!e.getContext)g("draw error: canvas context not defined");else{let t=e.getContext("2d");if(!t)g("draw error: cannot get canvas context");else return t}return null},Me=e=>Math.round(e*180/Math.PI);function Q5(e,t,o,A,n){A=A||0,e.fillStyle=n.useDepth&&A?`rgba(${127.5+2*A}, ${127.5-2*A}, 255, 0.3)`:n.color,e.beginPath(),e.arc(t,o,n.pointSize,0,2*Math.PI),e.fill()}function He(e,t,o,A,n,s){if(e.beginPath(),e.lineWidth=s.lineWidth,s.useCurves){let a=(t+t+A)/2,i=(o+o+n)/2;e.ellipse(a,i,A/2,n/2,0,0,2*Math.PI)}else e.moveTo(t+s.roundRect,o),e.lineTo(t+A-s.roundRect,o),e.quadraticCurveTo(t+A,o,t+A,o+s.roundRect),e.lineTo(t+A,o+n-s.roundRect),e.quadraticCurveTo(t+A,o+n,t+A-s.roundRect,o+n),e.lineTo(t+s.roundRect,o+n),e.quadraticCurveTo(t,o+n,t,o+n-s.roundRect),e.lineTo(t,o+s.roundRect),e.quadraticCurveTo(t,o,t+s.roundRect,o),e.closePath();e.stroke()}function Xn(e,t,o){if(!(t.length<2)){e.beginPath(),e.moveTo(t[0][0],t[0][1]);for(let A of t){let n=A[2]||0;e.strokeStyle=o.useDepth&&n!==0?`rgba(${127.5+2*n}, ${127.5-2*n}, 255, 0.3)`:o.color,e.fillStyle=o.useDepth&&n!==0?`rgba(${127.5+2*n}, ${127.5-2*n}, 255, 0.3)`:o.color,e.lineTo(A[0],Math.round(A[1]))}e.stroke(),o.fillPolygons&&(e.closePath(),e.fill())}}function I2(e,t,o){if(!(t.length<2)){if(e.lineWidth=o.lineWidth,!o.useCurves||t.length<=2){Xn(e,t,o);return}e.moveTo(t[0][0],t[0][1]);for(let A=0;A1&&x[1].length>0){let d=i[1]>0?`#${i[1]}`:"",l=`${i[0]} ${d}: ${x[1]}`;A.shadowColor&&A.shadowColor!==""&&(n.fillStyle=A.shadowColor,n.fillText(l,8,2+s*A.lineHeight)),n.fillStyle=A.labelColor,n.fillText(l,6,0+s*A.lineHeight),s+=1}}}}async function $5(e,t,o){var s,a,i,x,d;let A=o0(B0,o);if(!t||!e)return;let n=ne(e);if(!!n)for(let l of t){if(n.font=A.font,n.strokeStyle=A.color,n.fillStyle=A.color,A.drawBoxes&&He(n,l.box[0],l.box[1],l.box[2],l.box[3],A),A.drawLabels){let y=[];if(y.push(`face: ${Math.trunc(100*l.score)}%`),l.genderScore&&y.push(`${l.gender||""} ${Math.trunc(100*l.genderScore)}%`),l.age&&y.push(`age: ${l.age||""}`),l.iris&&y.push(`distance: ${l.iris}`),l.real&&y.push(`real: ${Math.trunc(100*l.real)}%`),l.live&&y.push(`live: ${Math.trunc(100*l.live)}%`),l.emotion&&l.emotion.length>0){let c=l.emotion.map(f=>`${Math.trunc(100*f.score)}% ${f.emotion}`);c.length>3&&(c.length=3),y.push(c.join(" "))}l.rotation&&l.rotation.angle&&l.rotation.gaze&&(l.rotation.angle.roll&&y.push(`roll: ${Me(l.rotation.angle.roll)}\xB0 yaw:${Me(l.rotation.angle.yaw)}\xB0 pitch:${Me(l.rotation.angle.pitch)}\xB0`),l.rotation.gaze.bearing&&y.push(`gaze: ${Me(l.rotation.gaze.bearing)}\xB0`)),y.length===0&&y.push("face"),n.fillStyle=A.color;for(let c=y.length-1;c>=0;c--){let f=Math.max(l.box[0],0),h=c*A.lineHeight+l.box[1];A.shadowColor&&A.shadowColor!==""&&(n.fillStyle=A.shadowColor,n.fillText(y[c],f+5,h+16)),n.fillStyle=A.labelColor,n.fillText(y[c],f+4,h+15)}}if(n.lineWidth=2,l.mesh&&l.mesh.length>0){if(A.drawPoints)for(let y of l.mesh)Q5(n,y[0],y[1],y[2],A);if(A.drawPolygons){if(l.mesh.length>450)for(let y=0;yl.mesh[f]);Xn(n,c,A)}if(l.annotations&&l.annotations.leftEyeIris&&l.annotations.leftEyeIris[0]){n.strokeStyle=A.useDepth?"rgba(255, 200, 255, 0.3)":A.color,n.beginPath();let y=Math.abs(l.annotations.leftEyeIris[3][0]-l.annotations.leftEyeIris[1][0])/2,c=Math.abs(l.annotations.leftEyeIris[4][1]-l.annotations.leftEyeIris[2][1])/2;n.ellipse(l.annotations.leftEyeIris[0][0],l.annotations.leftEyeIris[0][1],y,c,0,0,2*Math.PI),n.stroke(),A.fillPolygons&&(n.fillStyle=A.useDepth?"rgba(255, 255, 200, 0.3)":A.color,n.fill())}if(l.annotations&&l.annotations.rightEyeIris&&l.annotations.rightEyeIris[0]){n.strokeStyle=A.useDepth?"rgba(255, 200, 255, 0.3)":A.color,n.beginPath();let y=Math.abs(l.annotations.rightEyeIris[3][0]-l.annotations.rightEyeIris[1][0])/2,c=Math.abs(l.annotations.rightEyeIris[4][1]-l.annotations.rightEyeIris[2][1])/2;n.ellipse(l.annotations.rightEyeIris[0][0],l.annotations.rightEyeIris[0][1],y,c,0,0,2*Math.PI),n.stroke(),A.fillPolygons&&(n.fillStyle=A.useDepth?"rgba(255, 255, 200, 0.3)":A.color,n.fill())}if(A.drawGaze&&((s=l.rotation)==null?void 0:s.angle)&&typeof Path2D!="undefined"){n.strokeStyle="pink";let y=l.box[0]+l.box[2]/2-l.box[3]*Me(l.rotation.angle.yaw)/90,c=l.box[1]+l.box[3]/2+l.box[2]*Me(l.rotation.angle.pitch)/90,f=new Path2D(` M ${l.box[0]+l.box[2]/2} ${l.box[1]} C ${y} ${l.box[1]}, @@ -108,7 +108,7 @@ var kt=Object.defineProperty;var rr=Object.getOwnPropertyDescriptor;var sr=Objec ${l.box[0]} ${c}, ${l.box[0]+l.box[2]} ${c}, ${l.box[0]+l.box[2]} ${l.box[1]+l.box[3]/2} - `);n.stroke(h),n.stroke(f)}if(A.drawGaze&&((i=(a=l.rotation)==null?void 0:a.gaze)==null?void 0:i.strength)&&((d=(x=l.rotation)==null?void 0:x.gaze)==null?void 0:d.bearing)&&l.annotations.leftEyeIris&&l.annotations.rightEyeIris&&l.annotations.leftEyeIris[0]&&l.annotations.rightEyeIris[0]){n.strokeStyle="pink",n.fillStyle="pink";let y=[l.annotations.leftEyeIris[0][0]+Math.sin(l.rotation.gaze.bearing)*l.rotation.gaze.strength*l.box[3],l.annotations.leftEyeIris[0][1]+Math.cos(l.rotation.gaze.bearing)*l.rotation.gaze.strength*l.box[2]];Vn(n,[l.annotations.leftEyeIris[0][0],l.annotations.leftEyeIris[0][1]],[y[0],y[1]],4);let c=[l.annotations.rightEyeIris[0][0]+Math.sin(l.rotation.gaze.bearing)*l.rotation.gaze.strength*l.box[3],l.annotations.rightEyeIris[0][1]+Math.cos(l.rotation.gaze.bearing)*l.rotation.gaze.strength*l.box[2]];Vn(n,[l.annotations.rightEyeIris[0][0],l.annotations.rightEyeIris[0][1]],[c[0],c[1]],4)}}}}}async function eo(e,t,o){var s;let A=o0(B0,o);if(!t||!e)return;let n=ne(e);if(!!n){n.lineJoin="round";for(let a=0;a0)for(let a of s.keypoints)n.fillStyle=A.useDepth?`rgba(${127.5+2*(a[2]||0)}, ${127.5-2*(a[2]||0)}, 255, 0.5)`:A.color,Q5(n,a[0],a[1],0,A);if(A.drawLabels&&s.annotations){let a=(i,x)=>{if(!i||i.length===0||!i[0])return;let d=i[i.length-1][2]||0;n.fillStyle=A.useDepth?`rgba(${127.5+2*d}, ${127.5-2*d}, 255, 0.5)`:A.color,n.fillText(x,i[i.length-1][0]+4,i[i.length-1][1]+4)};n.font=A.font,a(s.annotations.index,"index"),a(s.annotations.middle,"middle"),a(s.annotations.ring,"ring"),a(s.annotations.pinky,"pinky"),a(s.annotations.thumb,"thumb"),a(s.annotations.palm,"palm")}if(A.drawPolygons&&s.annotations){let a=i=>{if(!(!i||i.length===0||!i[0]))for(let x=0;x0?x-1:0][0],i[x>0?x-1:0][1]),n.lineTo(i[x][0],i[x][1]),n.stroke()}};n.lineWidth=A.lineWidth,a(s.annotations.index),a(s.annotations.middle),a(s.annotations.ring),a(s.annotations.pinky),a(s.annotations.thumb)}}}}async function oo(e,t,o){let A=o0(B0,o);if(!t||!e)return;let n=ne(e);if(!!n){n.lineJoin="round",n.font=A.font;for(let s of t)if(A.drawBoxes){if(n.strokeStyle=A.color,n.fillStyle=A.color,He(n,s.box[0],s.box[1],s.box[2],s.box[3],A),A.drawLabels){let a=`${s.label} ${Math.round(100*s.score)}%`;A.shadowColor&&A.shadowColor!==""&&(n.fillStyle=A.shadowColor,n.fillText(a,s.box[0]+3,1+s.box[1]+A.lineHeight,s.box[2])),n.fillStyle=A.labelColor,n.fillText(a,s.box[0]+2,0+s.box[1]+A.lineHeight,s.box[2])}n.stroke()}}}async function Xn(e,t,o){let A=o0(B0,o);if(!t||!e)return;let n=ne(e);if(!!n){n.lineJoin="round",n.font=A.font;for(let s=0;st!=o[n].y>t&&e<(o[n].x-o[s].x)*(t-o[s].y)/(o[n].y-o[s].y)+o[s].x&&(A=!A);return A}async function Un(e){if(!e.tensor||!e.mesh||e.mesh.length<100)return e.tensor;let t=e.tensor.shape[2]||0,o=e.tensor.shape[1]||0,A=await e.tensor.buffer(),n=[];for(let a of b0.silhouette)n.push({x:(e.mesh[a][0]-e.box[0])/e.box[2],y:(e.mesh[a][1]-e.box[1])/e.box[3]});ve&&ve>0&&(n=n.map(a=>({x:a.x>.5?a.x+ve:a.x-ve,y:a.y>.5?a.y+ve:a.y-ve})));for(let a=0;a{let t=(y,c)=>Math.atan2(y[1]-c[1],y[0]-c[0]);if(!e.annotations.rightEyeIris||!e.annotations.leftEyeIris)return{bearing:0,strength:0};let o=[0,-.1],A=1,n=(e.mesh[33][2]||0)>(e.mesh[263][2]||0),s=n?e.mesh[473]:e.mesh[468],a=n?[(e.mesh[133][0]+e.mesh[33][0])/2,(e.mesh[133][1]+e.mesh[33][1])/2]:[(e.mesh[263][0]+e.mesh[362][0])/2,(e.mesh[263][1]+e.mesh[362][1])/2],i=n?[e.mesh[133][0]-e.mesh[33][0],e.mesh[23][1]-e.mesh[27][1]]:[e.mesh[263][0]-e.mesh[362][0],e.mesh[253][1]-e.mesh[257][1]],x=[(a[0]-s[0])/i[0]-o[0],A*(s[1]-a[1])/i[1]-o[1]],d=Math.sqrt(x[0]*x[0]+x[1]*x[1]);return d=Math.min(d,e.boxRaw[2]/2,e.boxRaw[3]/2),{bearing:(t([0,0],x)+Math.PI/2)%Math.PI,strength:d}},Jn=(e,t)=>{let o=m=>{let v=Math.sqrt(m[0]*m[0]+m[1]*m[1]+m[2]*m[2]);return m[0]/=v,m[1]/=v,m[2]/=v,m},A=(m,v)=>{let b=m[0]-v[0],M=m[1]-v[1],p=m[2]-v[2];return[b,M,p]},n=(m,v)=>{let b=m[1]*v[2]-m[2]*v[1],M=m[2]*v[0]-m[0]*v[2],p=m[0]*v[1]-m[1]*v[0];return[b,M,p]},s=m=>{let[v,b,M,p,u,E,W,C,S]=m,O,V,B;return p<1?p>-1?(B=Math.asin(p),V=Math.atan2(-W,v),O=Math.atan2(-E,u)):(B=-Math.PI/2,V=-Math.atan2(C,S),O=0):(B=Math.PI/2,V=Math.atan2(C,S),O=0),isNaN(O)&&(O=0),isNaN(V)&&(V=0),isNaN(B)&&(B=0),{pitch:2*-O,yaw:2*-V,roll:2*-B}},a=e.meshRaw;if(!a||a.length<300)return{angle:{pitch:0,yaw:0,roll:0},matrix:[1,0,0,0,1,0,0,0,1],gaze:{bearing:0,strength:0}};let i=Math.max(e.boxRaw[2]*t[0],e.boxRaw[3]*t[1])/1.5,x=[a[10],a[152],a[234],a[454]].map(m=>[m[0]*t[0]/i,m[1]*t[1]/i,m[2]]),d=o(A(x[1],x[0])),l=o(A(x[3],x[2])),y=o(n(l,d));l=n(d,y);let c=[l[0],l[1],l[2],d[0],d[1],d[2],y[0],y[1],y[2]],f=s(c),h=a.length===478?L2(e):{bearing:0,strength:0};return{angle:f,matrix:c,gaze:h}};var no=async(e,t)=>{var f,h,m,v,b,M,p,u,E,W,C,S,O,V,B,H,t0,z,m0,G0,T,Q;let o=P(),A,n,s,a,i,x,d,l,y=[];e.state="run:face";let c=await WA(t,e.config);if(e.performance.face=R.perfadd?(e.performance.face||0)+Math.trunc(P()-o):Math.trunc(P()-o),!t.shape||t.shape.length!==4)return[];if(!c)return[];for(let k=0;k200?Jn(c[k],[t.shape[2],t.shape[1]]):null;e.analyze("Start Emotion:"),e.config.async?a=(h=e.config.face.emotion)!=null&&h.enabled?l5(c[k].tensor||r.tensor([]),e.config,k,c.length):[]:(e.state="run:emotion",o=P(),a=(m=e.config.face.emotion)!=null&&m.enabled?await l5(c[k].tensor||r.tensor([]),e.config,k,c.length):[],e.performance.emotion=R.perfadd?(e.performance.emotion||0)+Math.trunc(P()-o):Math.trunc(P()-o)),e.analyze("End Emotion:"),e.analyze("Start AntiSpoof:"),e.config.async?x=(v=e.config.face.antispoof)!=null&&v.enabled?Vt(c[k].tensor||r.tensor([]),e.config,k,c.length):0:(e.state="run:antispoof",o=P(),x=(b=e.config.face.antispoof)!=null&&b.enabled?await Vt(c[k].tensor||r.tensor([]),e.config,k,c.length):0,e.performance.antispoof=R.perfadd?(e.performance.antispoof||0)+Math.trunc(P()-o):Math.trunc(P()-o)),e.analyze("End AntiSpoof:"),e.analyze("Start Liveness:"),e.config.async?d=(M=e.config.face.liveness)!=null&&M.enabled?S5(c[k].tensor||r.tensor([]),e.config,k,c.length):0:(e.state="run:liveness",o=P(),d=(p=e.config.face.liveness)!=null&&p.enabled?await S5(c[k].tensor||r.tensor([]),e.config,k,c.length):0,e.performance.liveness=R.perfadd?(e.performance.antispoof||0)+Math.trunc(P()-o):Math.trunc(P()-o)),e.analyze("End Liveness:"),e.analyze("Start GEAR:"),e.config.async?n=(u=e.config.face.gear)!=null&&u.enabled?Ot(c[k].tensor||r.tensor([]),e.config,k,c.length):null:(e.state="run:gear",o=P(),n=(E=e.config.face.gear)!=null&&E.enabled?await Ot(c[k].tensor||r.tensor([]),e.config,k,c.length):null,e.performance.gear=Math.trunc(P()-o)),e.analyze("End GEAR:"),e.analyze("Start SSRNet:"),e.config.async?(A=(W=e.config.face.ssrnet)!=null&&W.enabled?Lt(c[k].tensor||r.tensor([]),e.config,k,c.length):null,s=(C=e.config.face.ssrnet)!=null&&C.enabled?Ht(c[k].tensor||r.tensor([]),e.config,k,c.length):null):(e.state="run:ssrnet",o=P(),A=(S=e.config.face.ssrnet)!=null&&S.enabled?await Lt(c[k].tensor||r.tensor([]),e.config,k,c.length):null,s=(O=e.config.face.ssrnet)!=null&&O.enabled?await Ht(c[k].tensor||r.tensor([]),e.config,k,c.length):null,e.performance.ssrnet=Math.trunc(P()-o)),e.analyze("End SSRNet:"),e.analyze("Start MobileFaceNet:"),e.config.async?i=(V=e.config.face.mobilefacenet)!=null&&V.enabled?x5(c[k].tensor||r.tensor([]),e.config,k,c.length):null:(e.state="run:mobilefacenet",o=P(),i=(B=e.config.face.mobilefacenet)!=null&&B.enabled?await x5(c[k].tensor||r.tensor([]),e.config,k,c.length):null,e.performance.mobilefacenet=Math.trunc(P()-o)),e.analyze("End MobileFaceNet:"),e.analyze("Start Description:"),e.config.async?l=(H=e.config.face.description)!=null&&H.enabled?u5(c[k].tensor||r.tensor([]),e.config,k,c.length):null:(e.state="run:description",o=P(),l=(t0=e.config.face.description)!=null&&t0.enabled?await u5(c[k].tensor||r.tensor([]),e.config,k,c.length):null,e.performance.description=R.perfadd?(e.performance.description||0)+Math.trunc(P()-o):Math.trunc(P()-o)),e.analyze("End Description:"),e.config.async&&([A,s,a,i,l,n,x,d]=await Promise.all([A,s,a,i,l,n,x,d])),e.analyze("Finish Face:"),((z=e.config.face.ssrnet)==null?void 0:z.enabled)&&A&&s&&(l={...l,age:A.age,gender:s.gender,genderScore:s.genderScore}),((m0=e.config.face.gear)==null?void 0:m0.enabled)&&n&&(l={...l,age:n.age,gender:n.gender,genderScore:n.genderScore,race:n.race}),((G0=e.config.face.mobilefacenet)==null?void 0:G0.enabled)&&i&&(l.descriptor=i),(T=e.config.face.iris)!=null&&T.enabled;let Y=c[k].annotations&&c[k].annotations.leftEyeIris&&c[k].annotations.leftEyeIris[0]&&c[k].annotations.rightEyeIris&&c[k].annotations.rightEyeIris[0]&&c[k].annotations.leftEyeIris.length>0&&c[k].annotations.rightEyeIris.length>0&&c[k].annotations.leftEyeIris[0]!==null&&c[k].annotations.rightEyeIris[0]!==null?Math.max(Math.abs(c[k].annotations.leftEyeIris[3][0]-c[k].annotations.leftEyeIris[1][0]),Math.abs(c[k].annotations.rightEyeIris[4][1]-c[k].annotations.rightEyeIris[2][1]))/t.shape[2]:0,e0=(Q=e.config.face.detector)!=null&&Q.return?r.squeeze(c[k].tensor):null;r.dispose(c[k].tensor),c[k].tensor&&delete c[k].tensor;let I={...c[k],id:k};l!=null&&l.age&&(I.age=l.age),l!=null&&l.gender&&(I.gender=l.gender),l!=null&&l.genderScore&&(I.genderScore=l==null?void 0:l.genderScore),l!=null&&l.descriptor&&(I.embedding=l==null?void 0:l.descriptor),l!=null&&l.race&&(I.race=l==null?void 0:l.race),a&&(I.emotion=a),x&&(I.real=x),d&&(I.live=d),Y&&Y!==0&&(I.iris=Math.trunc(500/Y/11.7)/100),X&&(I.rotation=X),e0&&(I.tensor=e0),y.push(I),e.analyze("End Face")}return e.analyze("End FaceMesh:"),e.config.async&&(e.performance.face&&delete e.performance.face,e.performance.age&&delete e.performance.age,e.performance.gender&&delete e.performance.gender,e.performance.emotion&&delete e.performance.emotion),y};var Yn=e=>{if(!e)return[];let t=[];for(let o=0;ox.part==="leftWrist"),n=e[o].keypoints.find(x=>x.part==="rightWrist"),s=e[o].keypoints.find(x=>x.part==="nose");s&&A&&n&&A.position[1]x.part==="leftShoulder"),i=e[o].keypoints.find(x=>x.part==="rightShoulder");a&&i&&Math.abs(a.positionRaw[1]-i.positionRaw[1])>.1&&t.push({body:o,gesture:`leaning ${a.position[1]>i.position[1]?"left":"right"}`})}return t},Kn=e=>{if(!e)return[];let t=[];for(let o=0;o450){let A=(e[o].mesh[33][2]||0)-(e[o].mesh[263][2]||0),n=e[o].mesh[33][0]-e[o].mesh[263][0];Math.abs(A/n)<=.15?t.push({face:o,gesture:"facing center"}):t.push({face:o,gesture:`facing ${A<0?"left":"right"}`}),Math.abs(e[o].mesh[374][1]-e[o].mesh[386][1])/Math.abs(e[o].mesh[443][1]-e[o].mesh[450][1])<.2&&t.push({face:o,gesture:"blink left eye"}),Math.abs(e[o].mesh[145][1]-e[o].mesh[159][1])/Math.abs(e[o].mesh[223][1]-e[o].mesh[230][1])<.2&&t.push({face:o,gesture:"blink right eye"});let i=Math.min(100,500*Math.abs(e[o].mesh[13][1]-e[o].mesh[14][1])/Math.abs(e[o].mesh[10][1]-e[o].mesh[152][1]));i>10&&t.push({face:o,gesture:`mouth ${Math.trunc(i)}% open`});let x=e[o].mesh[152][2]||0;Math.abs(x)>10&&t.push({face:o,gesture:`head ${x<0?"up":"down"}`})}return t},Qn=e=>{if(!e)return[];let t=[];for(let o=0;o.06||c>.06)&&(d=!1),y>c?y>.05&&t.push({iris:o,gesture:"looking right"}):c>.05&&t.push({iris:o,gesture:"looking left"});let f=Math.abs(e[o].mesh[145][1]-e[o].annotations.rightEyeIris[0][1])/e[o].box[3],h=Math.abs(e[o].mesh[374][1]-e[o].annotations.leftEyeIris[0][1])/e[o].box[3];(h<.01||f<.01||h>.022||f>.022)&&(d=!1),(h<.01||f<.01)&&t.push({iris:o,gesture:"looking down"}),(h>.022||f>.022)&&t.push({iris:o,gesture:"looking up"}),d&&t.push({iris:o,gesture:"looking center"})}return t},_n=e=>{if(!e)return[];let t=[];for(let o=0;o0){let n=A.reduce((a,i)=>(a.position[2]||0)<(i.position[2]||0)?a:i);t.push({hand:o,gesture:`${n.name} forward`});let s=A.reduce((a,i)=>a.position[1]((n-1)*j.body[T].box[F]+I)/n),k=e.body[T].boxRaw.map((I,F)=>((n-1)*j.body[T].boxRaw[F]+I)/n),X=e.body[T].keypoints.map((I,F)=>{var k0,E0,Re,we,re,so,ao,io,lo;return{score:I.score,part:I.part,position:[j.body[T].keypoints[F]?((n-1)*(j.body[T].keypoints[F].position[0]||0)+(I.position[0]||0))/n:I.position[0],j.body[T].keypoints[F]?((n-1)*(j.body[T].keypoints[F].position[1]||0)+(I.position[1]||0))/n:I.position[1],j.body[T].keypoints[F]?((n-1)*(j.body[T].keypoints[F].position[2]||0)+(I.position[2]||0))/n:I.position[2]],positionRaw:[j.body[T].keypoints[F]?((n-1)*(j.body[T].keypoints[F].positionRaw[0]||0)+(I.positionRaw[0]||0))/n:I.positionRaw[0],j.body[T].keypoints[F]?((n-1)*(j.body[T].keypoints[F].positionRaw[1]||0)+(I.positionRaw[1]||0))/n:I.positionRaw[1],j.body[T].keypoints[F]?((n-1)*(j.body[T].keypoints[F].positionRaw[2]||0)+(I.positionRaw[2]||0))/n:I.positionRaw[2]],distance:[j.body[T].keypoints[F]?((n-1)*(((k0=j.body[T].keypoints[F].distance)==null?void 0:k0[0])||0)+(((E0=I.distance)==null?void 0:E0[0])||0))/n:(Re=I.distance)==null?void 0:Re[0],j.body[T].keypoints[F]?((n-1)*(((we=j.body[T].keypoints[F].distance)==null?void 0:we[1])||0)+(((re=I.distance)==null?void 0:re[1])||0))/n:(so=I.distance)==null?void 0:so[1],j.body[T].keypoints[F]?((n-1)*(((ao=j.body[T].keypoints[F].distance)==null?void 0:ao[2])||0)+(((io=I.distance)==null?void 0:io[2])||0))/n:(lo=I.distance)==null?void 0:lo[2]]}}),Y={},e0={connected:{}};(i=(a=t.body)==null?void 0:a.modelPath)!=null&&i.includes("efficientpose")?e0=nt:(d=(x=t.body)==null?void 0:x.modelPath)!=null&&d.includes("blazepose")?e0=$e:(y=(l=t.body)==null?void 0:l.modelPath)!=null&&y.includes("movenet")&&(e0=Le);for(let[I,F]of Object.entries(e0.connected)){let k0=[];for(let E0=0;E0re.part===F[E0]),we=X.find(re=>re.part===F[E0+1]);Re&&we&&k0.push([Re.position,we.position])}Y[I]=k0}j.body[T]={...e.body[T],box:Q,boxRaw:k,keypoints:X,annotations:Y}}if(!j.hand||e.hand.length!==j.hand.length)j.hand=JSON.parse(JSON.stringify(e.hand));else for(let T=0;T((n-1)*j.hand[T].box[I]+e0)/n),k=e.hand[T].boxRaw.map((e0,I)=>((n-1)*j.hand[T].boxRaw[I]+e0)/n);j.hand[T].keypoints.length!==e.hand[T].keypoints.length&&(j.hand[T].keypoints=e.hand[T].keypoints);let X=e.hand[T].keypoints&&e.hand[T].keypoints.length>0?e.hand[T].keypoints.map((e0,I)=>e0.map((F,k0)=>((n-1)*(j.hand[T].keypoints[I][k0]||1)+(F||0))/n)):[],Y={};if(Object.keys(j.hand[T].annotations).length!==Object.keys(e.hand[T].annotations).length)j.hand[T].annotations=e.hand[T].annotations,Y=j.hand[T].annotations;else if(e.hand[T].annotations)for(let e0 of Object.keys(e.hand[T].annotations))Y[e0]=e.hand[T].annotations[e0]&&e.hand[T].annotations[e0][0]?e.hand[T].annotations[e0].map((I,F)=>I.map((k0,E0)=>((n-1)*j.hand[T].annotations[e0][F][E0]+k0)/n)):null;j.hand[T]={...e.hand[T],box:Q,boxRaw:k,keypoints:X,annotations:Y}}if(!j.face||e.face.length!==j.face.length)j.face=JSON.parse(JSON.stringify(e.face));else for(let T=0;T((n-1)*j.face[T].box[Y]+X)/n),k=e.face[T].boxRaw.map((X,Y)=>((n-1)*j.face[T].boxRaw[Y]+X)/n);if(e.face[T].rotation){let X={matrix:[0,0,0,0,0,0,0,0,0],angle:{roll:0,yaw:0,pitch:0},gaze:{bearing:0,strength:0}};X.matrix=(c=e.face[T].rotation)==null?void 0:c.matrix,X.angle={roll:((n-1)*(((h=(f=j.face[T].rotation)==null?void 0:f.angle)==null?void 0:h.roll)||0)+(((v=(m=e.face[T].rotation)==null?void 0:m.angle)==null?void 0:v.roll)||0))/n,yaw:((n-1)*(((M=(b=j.face[T].rotation)==null?void 0:b.angle)==null?void 0:M.yaw)||0)+(((u=(p=e.face[T].rotation)==null?void 0:p.angle)==null?void 0:u.yaw)||0))/n,pitch:((n-1)*(((W=(E=j.face[T].rotation)==null?void 0:E.angle)==null?void 0:W.pitch)||0)+(((S=(C=e.face[T].rotation)==null?void 0:C.angle)==null?void 0:S.pitch)||0))/n},X.gaze={bearing:((n-1)*(((V=(O=j.face[T].rotation)==null?void 0:O.gaze)==null?void 0:V.bearing)||0)+(((H=(B=e.face[T].rotation)==null?void 0:B.gaze)==null?void 0:H.bearing)||0))/n,strength:((n-1)*(((z=(t0=j.face[T].rotation)==null?void 0:t0.gaze)==null?void 0:z.strength)||0)+(((G0=(m0=e.face[T].rotation)==null?void 0:m0.gaze)==null?void 0:G0.strength)||0))/n},j.face[T]={...e.face[T],rotation:X,box:Q,boxRaw:k}}j.face[T]={...e.face[T],box:Q,boxRaw:k}}if(!j.object||e.object.length!==j.object.length)j.object=JSON.parse(JSON.stringify(e.object));else for(let T=0;T((n-1)*j.object[T].box[Y]+X)/n),k=e.object[T].boxRaw.map((X,Y)=>((n-1)*j.object[T].boxRaw[Y]+X)/n);j.object[T]={...e.object[T],box:Q,boxRaw:k}}if(e.persons){let T=e.persons;if(!j.persons||T.length!==j.persons.length)j.persons=JSON.parse(JSON.stringify(T));else for(let Q=0;Q((n-1)*j.persons[Q].box[X]+k)/n)}e.gesture&&(j.gesture=e.gesture);let s=P();return ro=R.perfadd?ro+Math.round(s-o):Math.round(s-o),e.performance&&(j.performance={...e.performance,interpolate:ro}),j}function vt(e,t,o={order:2,multiplier:25}){let A=0;for(let n=0;n{if(e===0)return 1;let n=t===2?Math.sqrt(e):e**(1/t),s=(1-n/100-o)/(A-o);return Math.max(Math.min(s,1),0)};function tr(e,t,o={order:2,multiplier:25,min:.2,max:.8}){let A=vt(e,t,o);return er(A,o.order||2,o.min||0,o.max||1)}function or(e,t,o={order:2,multiplier:25,threshold:0,min:.2,max:.8}){if(!Array.isArray(e)||!Array.isArray(t)||e.length<64||t.length===0||e.length!==t[0].length)return{index:-1,distance:Number.POSITIVE_INFINITY,similarity:0};let A=Number.MAX_SAFE_INTEGER,n=-1;for(let a=0;az.box[0]&&C.box[0]z.box[1]&&C.box[1]+C.box[3]S.body.box[0]&&z.box[0]+z.box[2]S.body.box[1]&&z.box[1]+z.box[3]S.body.box[0]&&z.box[1]+z.box[3]>S.body.box[1]&&z.box[1]+z.box[3]{z&&z.length===4&&(O.push(z[0],z[0]+z[2]),V.push(z[1],z[1]+z[3]))};B((b=S.face)==null?void 0:b.box),B((M=S.body)==null?void 0:M.box),B((u=(p=S.hands)==null?void 0:p.left)==null?void 0:u.box),B((W=(E=S.hands)==null?void 0:E.right)==null?void 0:W.box);let H=Math.min(...O),t0=Math.min(...V);S.box=[H,t0,Math.max(...O)-H,Math.max(...V)-t0],n&&n[1]&&n[2]&&(S.boxRaw=[S.box[0]/n[2],S.box[1]/n[1],S.box[2]/n[2],S.box[3]/n[1]]),a.push(S)}return a}var Tt=` + `);n.stroke(h),n.stroke(f)}if(A.drawGaze&&((i=(a=l.rotation)==null?void 0:a.gaze)==null?void 0:i.strength)&&((d=(x=l.rotation)==null?void 0:x.gaze)==null?void 0:d.bearing)&&l.annotations.leftEyeIris&&l.annotations.rightEyeIris&&l.annotations.leftEyeIris[0]&&l.annotations.rightEyeIris[0]){n.strokeStyle="pink",n.fillStyle="pink";let y=[l.annotations.leftEyeIris[0][0]+Math.sin(l.rotation.gaze.bearing)*l.rotation.gaze.strength*l.box[3],l.annotations.leftEyeIris[0][1]+Math.cos(l.rotation.gaze.bearing)*l.rotation.gaze.strength*l.box[2]];Zn(n,[l.annotations.leftEyeIris[0][0],l.annotations.leftEyeIris[0][1]],[y[0],y[1]],4);let c=[l.annotations.rightEyeIris[0][0]+Math.sin(l.rotation.gaze.bearing)*l.rotation.gaze.strength*l.box[3],l.annotations.rightEyeIris[0][1]+Math.cos(l.rotation.gaze.bearing)*l.rotation.gaze.strength*l.box[2]];Zn(n,[l.annotations.rightEyeIris[0][0],l.annotations.rightEyeIris[0][1]],[c[0],c[1]],4)}}}}}async function eo(e,t,o){var s;let A=o0(B0,o);if(!t||!e)return;let n=ne(e);if(!!n){n.lineJoin="round";for(let a=0;a0)for(let a of s.keypoints)n.fillStyle=A.useDepth?`rgba(${127.5+2*(a[2]||0)}, ${127.5-2*(a[2]||0)}, 255, 0.5)`:A.color,Q5(n,a[0],a[1],0,A);if(A.drawLabels&&s.annotations){let a=(i,x)=>{if(!i||i.length===0||!i[0])return;let d=i[i.length-1][2]||0;n.fillStyle=A.useDepth?`rgba(${127.5+2*d}, ${127.5-2*d}, 255, 0.5)`:A.color,n.fillText(x,i[i.length-1][0]+4,i[i.length-1][1]+4)};n.font=A.font,a(s.annotations.index,"index"),a(s.annotations.middle,"middle"),a(s.annotations.ring,"ring"),a(s.annotations.pinky,"pinky"),a(s.annotations.thumb,"thumb"),a(s.annotations.palm,"palm")}if(A.drawPolygons&&s.annotations){let a=i=>{if(!(!i||i.length===0||!i[0]))for(let x=0;x0?x-1:0][0],i[x>0?x-1:0][1]),n.lineTo(i[x][0],i[x][1]),n.stroke()}};n.lineWidth=A.lineWidth,a(s.annotations.index),a(s.annotations.middle),a(s.annotations.ring),a(s.annotations.pinky),a(s.annotations.thumb)}}}}async function oo(e,t,o){let A=o0(B0,o);if(!t||!e)return;let n=ne(e);if(!!n){n.lineJoin="round",n.font=A.font;for(let s of t)if(A.drawBoxes){if(n.strokeStyle=A.color,n.fillStyle=A.color,He(n,s.box[0],s.box[1],s.box[2],s.box[3],A),A.drawLabels){let a=`${s.label} ${Math.round(100*s.score)}%`;A.shadowColor&&A.shadowColor!==""&&(n.fillStyle=A.shadowColor,n.fillText(a,s.box[0]+3,1+s.box[1]+A.lineHeight,s.box[2])),n.fillStyle=A.labelColor,n.fillText(a,s.box[0]+2,0+s.box[1]+A.lineHeight,s.box[2])}n.stroke()}}}async function Dn(e,t,o){let A=o0(B0,o);if(!t||!e)return;let n=ne(e);if(!!n){n.lineJoin="round",n.font=A.font;for(let s=0;st!=o[n].y>t&&e<(o[n].x-o[s].x)*(t-o[s].y)/(o[n].y-o[s].y)+o[s].x&&(A=!A);return A}async function Jn(e){if(!e.tensor||!e.mesh||e.mesh.length<100)return e.tensor;let t=e.tensor.shape[2]||0,o=e.tensor.shape[1]||0,A=await e.tensor.buffer(),n=[];for(let a of b0.silhouette)n.push({x:(e.mesh[a][0]-e.box[0])/e.box[2],y:(e.mesh[a][1]-e.box[1])/e.box[3]});ve&&ve>0&&(n=n.map(a=>({x:a.x>.5?a.x+ve:a.x-ve,y:a.y>.5?a.y+ve:a.y-ve})));for(let a=0;a{let t=(y,c)=>Math.atan2(y[1]-c[1],y[0]-c[0]);if(!e.annotations.rightEyeIris||!e.annotations.leftEyeIris)return{bearing:0,strength:0};let o=[0,-.1],A=1,n=(e.mesh[33][2]||0)>(e.mesh[263][2]||0),s=n?e.mesh[473]:e.mesh[468],a=n?[(e.mesh[133][0]+e.mesh[33][0])/2,(e.mesh[133][1]+e.mesh[33][1])/2]:[(e.mesh[263][0]+e.mesh[362][0])/2,(e.mesh[263][1]+e.mesh[362][1])/2],i=n?[e.mesh[133][0]-e.mesh[33][0],e.mesh[23][1]-e.mesh[27][1]]:[e.mesh[263][0]-e.mesh[362][0],e.mesh[253][1]-e.mesh[257][1]],x=[(a[0]-s[0])/i[0]-o[0],A*(s[1]-a[1])/i[1]-o[1]],d=Math.sqrt(x[0]*x[0]+x[1]*x[1]);return d=Math.min(d,e.boxRaw[2]/2,e.boxRaw[3]/2),{bearing:(t([0,0],x)+Math.PI/2)%Math.PI,strength:d}},Yn=(e,t)=>{let o=m=>{let v=Math.sqrt(m[0]*m[0]+m[1]*m[1]+m[2]*m[2]);return m[0]/=v,m[1]/=v,m[2]/=v,m},A=(m,v)=>{let b=m[0]-v[0],M=m[1]-v[1],p=m[2]-v[2];return[b,M,p]},n=(m,v)=>{let b=m[1]*v[2]-m[2]*v[1],M=m[2]*v[0]-m[0]*v[2],p=m[0]*v[1]-m[1]*v[0];return[b,M,p]},s=m=>{let[v,b,M,p,u,E,W,C,S]=m,O,V,B;return p<1?p>-1?(B=Math.asin(p),V=Math.atan2(-W,v),O=Math.atan2(-E,u)):(B=-Math.PI/2,V=-Math.atan2(C,S),O=0):(B=Math.PI/2,V=Math.atan2(C,S),O=0),isNaN(O)&&(O=0),isNaN(V)&&(V=0),isNaN(B)&&(B=0),{pitch:2*-O,yaw:2*-V,roll:2*-B}},a=e.meshRaw;if(!a||a.length<300)return{angle:{pitch:0,yaw:0,roll:0},matrix:[1,0,0,0,1,0,0,0,1],gaze:{bearing:0,strength:0}};let i=Math.max(e.boxRaw[2]*t[0],e.boxRaw[3]*t[1])/1.5,x=[a[10],a[152],a[234],a[454]].map(m=>[m[0]*t[0]/i,m[1]*t[1]/i,m[2]]),d=o(A(x[1],x[0])),l=o(A(x[3],x[2])),y=o(n(l,d));l=n(d,y);let c=[l[0],l[1],l[2],d[0],d[1],d[2],y[0],y[1],y[2]],f=s(c),h=a.length===478?B2(e):{bearing:0,strength:0};return{angle:f,matrix:c,gaze:h}};var no=async(e,t)=>{var f,h,m,v,b,M,p,u,E,W,C,S,O,V,B,H,t0,z,m0,G0,T,Q;let o=P(),A,n,s,a,i,x,d,l,y=[];e.state="run:face";let c=await CA(t,e.config);if(e.performance.face=R.perfadd?(e.performance.face||0)+Math.trunc(P()-o):Math.trunc(P()-o),!t.shape||t.shape.length!==4)return[];if(!c)return[];for(let k=0;k200?Yn(c[k],[t.shape[2],t.shape[1]]):null;e.analyze("Start Emotion:"),e.config.async?a=(h=e.config.face.emotion)!=null&&h.enabled?l5(c[k].tensor||r.tensor([]),e.config,k,c.length):[]:(e.state="run:emotion",o=P(),a=(m=e.config.face.emotion)!=null&&m.enabled?await l5(c[k].tensor||r.tensor([]),e.config,k,c.length):[],e.performance.emotion=R.perfadd?(e.performance.emotion||0)+Math.trunc(P()-o):Math.trunc(P()-o)),e.analyze("End Emotion:"),e.analyze("Start AntiSpoof:"),e.config.async?x=(v=e.config.face.antispoof)!=null&&v.enabled?Vt(c[k].tensor||r.tensor([]),e.config,k,c.length):0:(e.state="run:antispoof",o=P(),x=(b=e.config.face.antispoof)!=null&&b.enabled?await Vt(c[k].tensor||r.tensor([]),e.config,k,c.length):0,e.performance.antispoof=R.perfadd?(e.performance.antispoof||0)+Math.trunc(P()-o):Math.trunc(P()-o)),e.analyze("End AntiSpoof:"),e.analyze("Start Liveness:"),e.config.async?d=(M=e.config.face.liveness)!=null&&M.enabled?S5(c[k].tensor||r.tensor([]),e.config,k,c.length):0:(e.state="run:liveness",o=P(),d=(p=e.config.face.liveness)!=null&&p.enabled?await S5(c[k].tensor||r.tensor([]),e.config,k,c.length):0,e.performance.liveness=R.perfadd?(e.performance.antispoof||0)+Math.trunc(P()-o):Math.trunc(P()-o)),e.analyze("End Liveness:"),e.analyze("Start GEAR:"),e.config.async?n=(u=e.config.face.gear)!=null&&u.enabled?Ot(c[k].tensor||r.tensor([]),e.config,k,c.length):null:(e.state="run:gear",o=P(),n=(E=e.config.face.gear)!=null&&E.enabled?await Ot(c[k].tensor||r.tensor([]),e.config,k,c.length):null,e.performance.gear=Math.trunc(P()-o)),e.analyze("End GEAR:"),e.analyze("Start SSRNet:"),e.config.async?(A=(W=e.config.face.ssrnet)!=null&&W.enabled?Lt(c[k].tensor||r.tensor([]),e.config,k,c.length):null,s=(C=e.config.face.ssrnet)!=null&&C.enabled?Ht(c[k].tensor||r.tensor([]),e.config,k,c.length):null):(e.state="run:ssrnet",o=P(),A=(S=e.config.face.ssrnet)!=null&&S.enabled?await Lt(c[k].tensor||r.tensor([]),e.config,k,c.length):null,s=(O=e.config.face.ssrnet)!=null&&O.enabled?await Ht(c[k].tensor||r.tensor([]),e.config,k,c.length):null,e.performance.ssrnet=Math.trunc(P()-o)),e.analyze("End SSRNet:"),e.analyze("Start MobileFaceNet:"),e.config.async?i=(V=e.config.face.mobilefacenet)!=null&&V.enabled?x5(c[k].tensor||r.tensor([]),e.config,k,c.length):null:(e.state="run:mobilefacenet",o=P(),i=(B=e.config.face.mobilefacenet)!=null&&B.enabled?await x5(c[k].tensor||r.tensor([]),e.config,k,c.length):null,e.performance.mobilefacenet=Math.trunc(P()-o)),e.analyze("End MobileFaceNet:"),e.analyze("Start Description:"),e.config.async?l=(H=e.config.face.description)!=null&&H.enabled?u5(c[k].tensor||r.tensor([]),e.config,k,c.length):null:(e.state="run:description",o=P(),l=(t0=e.config.face.description)!=null&&t0.enabled?await u5(c[k].tensor||r.tensor([]),e.config,k,c.length):null,e.performance.description=R.perfadd?(e.performance.description||0)+Math.trunc(P()-o):Math.trunc(P()-o)),e.analyze("End Description:"),e.config.async&&([A,s,a,i,l,n,x,d]=await Promise.all([A,s,a,i,l,n,x,d])),e.analyze("Finish Face:"),((z=e.config.face.ssrnet)==null?void 0:z.enabled)&&A&&s&&(l={...l,age:A.age,gender:s.gender,genderScore:s.genderScore}),((m0=e.config.face.gear)==null?void 0:m0.enabled)&&n&&(l={...l,age:n.age,gender:n.gender,genderScore:n.genderScore,race:n.race}),((G0=e.config.face.mobilefacenet)==null?void 0:G0.enabled)&&i&&(l.descriptor=i),(T=e.config.face.iris)!=null&&T.enabled;let Y=c[k].annotations&&c[k].annotations.leftEyeIris&&c[k].annotations.leftEyeIris[0]&&c[k].annotations.rightEyeIris&&c[k].annotations.rightEyeIris[0]&&c[k].annotations.leftEyeIris.length>0&&c[k].annotations.rightEyeIris.length>0&&c[k].annotations.leftEyeIris[0]!==null&&c[k].annotations.rightEyeIris[0]!==null?Math.max(Math.abs(c[k].annotations.leftEyeIris[3][0]-c[k].annotations.leftEyeIris[1][0]),Math.abs(c[k].annotations.rightEyeIris[4][1]-c[k].annotations.rightEyeIris[2][1]))/t.shape[2]:0,e0=(Q=e.config.face.detector)!=null&&Q.return?r.squeeze(c[k].tensor):null;r.dispose(c[k].tensor),c[k].tensor&&delete c[k].tensor;let I={...c[k],id:k};l!=null&&l.age&&(I.age=l.age),l!=null&&l.gender&&(I.gender=l.gender),l!=null&&l.genderScore&&(I.genderScore=l==null?void 0:l.genderScore),l!=null&&l.descriptor&&(I.embedding=l==null?void 0:l.descriptor),l!=null&&l.race&&(I.race=l==null?void 0:l.race),a&&(I.emotion=a),x&&(I.real=x),d&&(I.live=d),Y&&Y!==0&&(I.iris=Math.trunc(500/Y/11.7)/100),X&&(I.rotation=X),e0&&(I.tensor=e0),y.push(I),e.analyze("End Face")}return e.analyze("End FaceMesh:"),e.config.async&&(e.performance.face&&delete e.performance.face,e.performance.age&&delete e.performance.age,e.performance.gender&&delete e.performance.gender,e.performance.emotion&&delete e.performance.emotion),y};var Kn=e=>{if(!e)return[];let t=[];for(let o=0;ox.part==="leftWrist"),n=e[o].keypoints.find(x=>x.part==="rightWrist"),s=e[o].keypoints.find(x=>x.part==="nose");s&&A&&n&&A.position[1]x.part==="leftShoulder"),i=e[o].keypoints.find(x=>x.part==="rightShoulder");a&&i&&Math.abs(a.positionRaw[1]-i.positionRaw[1])>.1&&t.push({body:o,gesture:`leaning ${a.position[1]>i.position[1]?"left":"right"}`})}return t},Qn=e=>{if(!e)return[];let t=[];for(let o=0;o450){let A=(e[o].mesh[33][2]||0)-(e[o].mesh[263][2]||0),n=e[o].mesh[33][0]-e[o].mesh[263][0];Math.abs(A/n)<=.15?t.push({face:o,gesture:"facing center"}):t.push({face:o,gesture:`facing ${A<0?"left":"right"}`}),Math.abs(e[o].mesh[374][1]-e[o].mesh[386][1])/Math.abs(e[o].mesh[443][1]-e[o].mesh[450][1])<.2&&t.push({face:o,gesture:"blink left eye"}),Math.abs(e[o].mesh[145][1]-e[o].mesh[159][1])/Math.abs(e[o].mesh[223][1]-e[o].mesh[230][1])<.2&&t.push({face:o,gesture:"blink right eye"});let i=Math.min(100,500*Math.abs(e[o].mesh[13][1]-e[o].mesh[14][1])/Math.abs(e[o].mesh[10][1]-e[o].mesh[152][1]));i>10&&t.push({face:o,gesture:`mouth ${Math.trunc(i)}% open`});let x=e[o].mesh[152][2]||0;Math.abs(x)>10&&t.push({face:o,gesture:`head ${x<0?"up":"down"}`})}return t},_n=e=>{if(!e)return[];let t=[];for(let o=0;o.06||c>.06)&&(d=!1),y>c?y>.05&&t.push({iris:o,gesture:"looking right"}):c>.05&&t.push({iris:o,gesture:"looking left"});let f=Math.abs(e[o].mesh[145][1]-e[o].annotations.rightEyeIris[0][1])/e[o].box[3],h=Math.abs(e[o].mesh[374][1]-e[o].annotations.leftEyeIris[0][1])/e[o].box[3];(h<.01||f<.01||h>.022||f>.022)&&(d=!1),(h<.01||f<.01)&&t.push({iris:o,gesture:"looking down"}),(h>.022||f>.022)&&t.push({iris:o,gesture:"looking up"}),d&&t.push({iris:o,gesture:"looking center"})}return t},$n=e=>{if(!e)return[];let t=[];for(let o=0;o0){let n=A.reduce((a,i)=>(a.position[2]||0)<(i.position[2]||0)?a:i);t.push({hand:o,gesture:`${n.name} forward`});let s=A.reduce((a,i)=>a.position[1]((n-1)*j.body[T].box[F]+I)/n),k=e.body[T].boxRaw.map((I,F)=>((n-1)*j.body[T].boxRaw[F]+I)/n),X=e.body[T].keypoints.map((I,F)=>{var k0,E0,Re,we,re,so,ao,io,lo;return{score:I.score,part:I.part,position:[j.body[T].keypoints[F]?((n-1)*(j.body[T].keypoints[F].position[0]||0)+(I.position[0]||0))/n:I.position[0],j.body[T].keypoints[F]?((n-1)*(j.body[T].keypoints[F].position[1]||0)+(I.position[1]||0))/n:I.position[1],j.body[T].keypoints[F]?((n-1)*(j.body[T].keypoints[F].position[2]||0)+(I.position[2]||0))/n:I.position[2]],positionRaw:[j.body[T].keypoints[F]?((n-1)*(j.body[T].keypoints[F].positionRaw[0]||0)+(I.positionRaw[0]||0))/n:I.positionRaw[0],j.body[T].keypoints[F]?((n-1)*(j.body[T].keypoints[F].positionRaw[1]||0)+(I.positionRaw[1]||0))/n:I.positionRaw[1],j.body[T].keypoints[F]?((n-1)*(j.body[T].keypoints[F].positionRaw[2]||0)+(I.positionRaw[2]||0))/n:I.positionRaw[2]],distance:[j.body[T].keypoints[F]?((n-1)*(((k0=j.body[T].keypoints[F].distance)==null?void 0:k0[0])||0)+(((E0=I.distance)==null?void 0:E0[0])||0))/n:(Re=I.distance)==null?void 0:Re[0],j.body[T].keypoints[F]?((n-1)*(((we=j.body[T].keypoints[F].distance)==null?void 0:we[1])||0)+(((re=I.distance)==null?void 0:re[1])||0))/n:(so=I.distance)==null?void 0:so[1],j.body[T].keypoints[F]?((n-1)*(((ao=j.body[T].keypoints[F].distance)==null?void 0:ao[2])||0)+(((io=I.distance)==null?void 0:io[2])||0))/n:(lo=I.distance)==null?void 0:lo[2]]}}),Y={},e0={connected:{}};(i=(a=t.body)==null?void 0:a.modelPath)!=null&&i.includes("efficientpose")?e0=nt:(d=(x=t.body)==null?void 0:x.modelPath)!=null&&d.includes("blazepose")?e0=$e:(y=(l=t.body)==null?void 0:l.modelPath)!=null&&y.includes("movenet")&&(e0=Le);for(let[I,F]of Object.entries(e0.connected)){let k0=[];for(let E0=0;E0re.part===F[E0]),we=X.find(re=>re.part===F[E0+1]);Re&&we&&k0.push([Re.position,we.position])}Y[I]=k0}j.body[T]={...e.body[T],box:Q,boxRaw:k,keypoints:X,annotations:Y}}if(!j.hand||e.hand.length!==j.hand.length)j.hand=JSON.parse(JSON.stringify(e.hand));else for(let T=0;T((n-1)*j.hand[T].box[I]+e0)/n),k=e.hand[T].boxRaw.map((e0,I)=>((n-1)*j.hand[T].boxRaw[I]+e0)/n);j.hand[T].keypoints.length!==e.hand[T].keypoints.length&&(j.hand[T].keypoints=e.hand[T].keypoints);let X=e.hand[T].keypoints&&e.hand[T].keypoints.length>0?e.hand[T].keypoints.map((e0,I)=>e0.map((F,k0)=>((n-1)*(j.hand[T].keypoints[I][k0]||1)+(F||0))/n)):[],Y={};if(Object.keys(j.hand[T].annotations).length!==Object.keys(e.hand[T].annotations).length)j.hand[T].annotations=e.hand[T].annotations,Y=j.hand[T].annotations;else if(e.hand[T].annotations)for(let e0 of Object.keys(e.hand[T].annotations))Y[e0]=e.hand[T].annotations[e0]&&e.hand[T].annotations[e0][0]?e.hand[T].annotations[e0].map((I,F)=>I.map((k0,E0)=>((n-1)*j.hand[T].annotations[e0][F][E0]+k0)/n)):null;j.hand[T]={...e.hand[T],box:Q,boxRaw:k,keypoints:X,annotations:Y}}if(!j.face||e.face.length!==j.face.length)j.face=JSON.parse(JSON.stringify(e.face));else for(let T=0;T((n-1)*j.face[T].box[Y]+X)/n),k=e.face[T].boxRaw.map((X,Y)=>((n-1)*j.face[T].boxRaw[Y]+X)/n);if(e.face[T].rotation){let X={matrix:[0,0,0,0,0,0,0,0,0],angle:{roll:0,yaw:0,pitch:0},gaze:{bearing:0,strength:0}};X.matrix=(c=e.face[T].rotation)==null?void 0:c.matrix,X.angle={roll:((n-1)*(((h=(f=j.face[T].rotation)==null?void 0:f.angle)==null?void 0:h.roll)||0)+(((v=(m=e.face[T].rotation)==null?void 0:m.angle)==null?void 0:v.roll)||0))/n,yaw:((n-1)*(((M=(b=j.face[T].rotation)==null?void 0:b.angle)==null?void 0:M.yaw)||0)+(((u=(p=e.face[T].rotation)==null?void 0:p.angle)==null?void 0:u.yaw)||0))/n,pitch:((n-1)*(((W=(E=j.face[T].rotation)==null?void 0:E.angle)==null?void 0:W.pitch)||0)+(((S=(C=e.face[T].rotation)==null?void 0:C.angle)==null?void 0:S.pitch)||0))/n},X.gaze={bearing:((n-1)*(((V=(O=j.face[T].rotation)==null?void 0:O.gaze)==null?void 0:V.bearing)||0)+(((H=(B=e.face[T].rotation)==null?void 0:B.gaze)==null?void 0:H.bearing)||0))/n,strength:((n-1)*(((z=(t0=j.face[T].rotation)==null?void 0:t0.gaze)==null?void 0:z.strength)||0)+(((G0=(m0=e.face[T].rotation)==null?void 0:m0.gaze)==null?void 0:G0.strength)||0))/n},j.face[T]={...e.face[T],rotation:X,box:Q,boxRaw:k}}j.face[T]={...e.face[T],box:Q,boxRaw:k}}if(!j.object||e.object.length!==j.object.length)j.object=JSON.parse(JSON.stringify(e.object));else for(let T=0;T((n-1)*j.object[T].box[Y]+X)/n),k=e.object[T].boxRaw.map((X,Y)=>((n-1)*j.object[T].boxRaw[Y]+X)/n);j.object[T]={...e.object[T],box:Q,boxRaw:k}}if(e.persons){let T=e.persons;if(!j.persons||T.length!==j.persons.length)j.persons=JSON.parse(JSON.stringify(T));else for(let Q=0;Q((n-1)*j.persons[Q].box[X]+k)/n)}e.gesture&&(j.gesture=e.gesture);let s=P();return ro=R.perfadd?ro+Math.round(s-o):Math.round(s-o),e.performance&&(j.performance={...e.performance,interpolate:ro}),j}function vt(e,t,o={order:2,multiplier:25}){let A=0;for(let n=0;n{if(e===0)return 1;let n=t===2?Math.sqrt(e):e**(1/t),s=(1-n/100-o)/(A-o);return Math.max(Math.min(s,1),0)};function or(e,t,o={order:2,multiplier:25,min:.2,max:.8}){let A=vt(e,t,o);return tr(A,o.order||2,o.min||0,o.max||1)}function Ar(e,t,o={order:2,multiplier:25,threshold:0,min:.2,max:.8}){if(!Array.isArray(e)||!Array.isArray(t)||e.length<64||t.length===0||e.length!==t[0].length)return{index:-1,distance:Number.POSITIVE_INFINITY,similarity:0};let A=Number.MAX_SAFE_INTEGER,n=-1;for(let a=0;az.box[0]&&C.box[0]z.box[1]&&C.box[1]+C.box[3]S.body.box[0]&&z.box[0]+z.box[2]S.body.box[1]&&z.box[1]+z.box[3]S.body.box[0]&&z.box[1]+z.box[3]>S.body.box[1]&&z.box[1]+z.box[3]{z&&z.length===4&&(O.push(z[0],z[0]+z[2]),V.push(z[1],z[1]+z[3]))};B((b=S.face)==null?void 0:b.box),B((M=S.body)==null?void 0:M.box),B((u=(p=S.hands)==null?void 0:p.left)==null?void 0:u.box),B((W=(E=S.hands)==null?void 0:E.right)==null?void 0:W.box);let H=Math.min(...O),t0=Math.min(...V);S.box=[H,t0,Math.max(...O)-H,Math.max(...V)-t0],n&&n[1]&&n[2]&&(S.boxRaw=[S.box[0]/n[2],S.box[1]/n[1],S.box[2]/n[2],S.box[3]/n[1]]),a.push(S)}return a}var Tt=` /9j/4AAQSkZJRgABAQEAYABgAAD/4QBoRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUA AAABAAAARgEoAAMAAAABAAIAAAExAAIAAAARAAAATgAAAAAAAABgAAAAAQAAAGAAAAABcGFpbnQu bmV0IDQuMi4xMwAA/9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxob @@ -827,7 +827,7 @@ AAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA BAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2 SbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/ -2Q==`;async function X2(e){let t=(n,s="application/octet-stream")=>fetch(`data:${s};base64,${n}`).then(a=>a.blob()),o,A;switch(e.config.warmup){case"face":o=await t(Tt);break;case"body":case"full":o=await t(Rt);break;default:o=null}if(o){let n=await createImageBitmap(o);A=await e.detect(n,e.config),n.close()}return A}async function D2(e){return new Promise(t=>{let o;switch(e.config.warmup){case"face":o="data:image/jpeg;base64,"+Tt;break;case"full":case"body":o="data:image/jpeg;base64,"+Rt;break;default:o=null}let A;if(typeof Image!="undefined")A=new Image;else if(R.Image)A=new R.Image;else return;A.onload=async()=>{let n=s0(A.naturalWidth,A.naturalHeight);if(!n)g("Warmup: Canvas not found"),t(void 0);else{let s=n.getContext("2d");s&&s.drawImage(A,0,0);let a=await e.image(n),i=await e.detect(a.tensor,e.config);t(i)}},o?A.src=o:t(void 0)})}async function q2(e){let t=n=>Buffer.from(n,"base64"),o;e.config.warmup==="face"?o=t(Tt):o=t(Rt);let A;if("node"in r){let n=r.node.decodeJpeg(o),s=n.expandDims(0);e.tf.dispose(n),A=await e.detect(s,e.config),e.tf.dispose(s)}else e.config.debug&&g("Warmup tfjs-node not loaded");return A}async function nr(e,t){let o=P();if(e.state="warmup",t&&(e.config=o0(e.config,t)),!e.config.warmup||e.config.warmup.length===0||e.config.warmup==="none")return{face:[],body:[],hand:[],gesture:[],object:[],performance:e.performance,timestamp:P(),persons:[],error:null};let A;return new Promise(async n=>{typeof createImageBitmap=="function"?A=await X2(e):typeof Image!="undefined"||R.Canvas!==void 0?A=await D2(e):A=await q2(e);let s=P();e.config.debug&&g("Warmup",e.config.warmup,Math.round(s-o),"ms"),e.emit("warmup"),n(A)})}var Te,Fe,Ve,wt,J2=class{constructor(t){w(this,"version");w(this,"config");w(this,"result");w(this,"state");w(this,"process");w(this,"tf");w(this,"env");w(this,"draw");w(this,"models");w(this,"events");w(this,"faceTriangulation");w(this,"faceUVMap");w(this,"performance");Ee(this,Te,void 0);Ee(this,Fe,void 0);Ee(this,Ve,void 0);w(this,"gl");w(this,"analyze",(...t)=>{if(!ke(this,Fe))return;let o=this.tf.engine().state.numTensors,A=ke(this,Te);ze(this,Te,o);let n=o-A;n!==0&&g(...t,n)});Ee(this,wt,t=>{if(!ke(this,Ve))return null;if(!t)return"input is not defined";if(this.env.node&&!(t instanceof se))return"input must be a tensor";try{this.tf.getBackend()}catch(o){return"backend not loaded"}return null});w(this,"similarity",tr);w(this,"distance",vt);w(this,"match",or);w(this,"emit",t=>{var o;this.events&&this.events.dispatchEvent&&((o=this.events)==null||o.dispatchEvent(new Event(t)))});this.env=R,Y0.wasmPath=je["tfjs-core"].includes("-")?"https://vladmandic.github.io/tfjs/dist/":`https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${r.version_core}/dist/`,Y0.modelBasePath=R.browser?"../models/":"file://models/",Y0.backend=R.browser?"humangl":"tensorflow",this.version=Wt,Object.defineProperty(this,"version",{value:Wt}),this.config=JSON.parse(JSON.stringify(Y0)),Object.seal(this.config),t&&(this.config=o0(this.config,t)),this.config.cacheModels=typeof indexedDB!="undefined",To(this.config),this.tf=r,this.state="idle",ze(this,Te,0),ze(this,Fe,!1),ze(this,Ve,!1),this.performance={},this.events=typeof EventTarget!="undefined"?new EventTarget:void 0,this.models=new J5,this.draw={options:B0,canvas:(o,A)=>Dn(o,A),face:(o,A,n)=>$5(o,A,n),body:(o,A,n)=>eo(o,A,n),hand:(o,A,n)=>to(o,A,n),gesture:(o,A,n)=>_5(o,A,n),object:(o,A,n)=>oo(o,A,n),person:(o,A,n)=>Xn(o,A,n),all:(o,A,n)=>qn(o,A,n)},this.result={face:[],body:[],hand:[],gesture:[],object:[],performance:{},timestamp:0,persons:[],error:null},this.process={tensor:null,canvas:null},this.faceTriangulation=IA,this.faceUVMap=OA,this.gl=q,this.emit("create")}reset(){let t=this.config.backend;this.config=JSON.parse(JSON.stringify(Y0)),this.config.backend=t}validate(t){return Et(Y0,t||this.config)}now(){return P()}image(t,o=!0){return ie(t,this.config,o)}async segmentation(t,o){return On(t,o,this.config)}enhance(t){return p5(t)}compare(t,o){return Mo(this.config,t,o)}async init(){await Mt(this,!0),await this.tf.ready()}async load(t){this.state="load";let o=P(),A=Object.values(this.models).filter(a=>a).length;t&&(this.config=o0(this.config,t)),this.env.initial&&(this.config.debug&&g(`version: ${this.version}`),this.config.debug&&g(`tfjs version: ${this.tf.version["tfjs-core"]}`),await Mt(this)||g("error: backend check failed"),await r.ready(),this.env.browser&&(this.config.debug&&g("configuration:",this.config),this.config.debug&&g("environment:",this.env),this.config.debug&&g("tf flags:",this.tf.ENV.flags))),await Ln(this),this.env.initial&&this.config.debug&&g("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),this.env.initial=!1,Object.values(this.models).filter(a=>a).length!==A&&(await Bn(this),this.emit("load"));let s=Math.trunc(P()-o);s>(this.performance.loadModels||0)&&(this.performance.loadModels=this.env.perfadd?(this.performance.loadModels||0)+s:s)}next(t=this.result){return $n(t,this.config)}async warmup(t){let o=P(),A=await nr(this,t),n=P();return this.performance.warmup=Math.trunc(n-o),A}async profile(t,o){let A=await this.tf.profile(()=>this.detect(t,o)),n={};for(let i of A.kernels)n[i.name]?n[i.name]+=i.kernelTimeMs:n[i.name]=i.kernelTimeMs;let s=[];Object.entries(n).forEach(i=>s.push({name:i[0],ms:i[1]})),s.sort((i,x)=>x.ms-i.ms),s.length=20;let a={};for(let i of s)a[i.name]=i.ms;return a}async detect(t,o){return this.state="detect",new Promise(async A=>{var v,b,M,p,u,E,W,C,S,O,V,B,H,t0,z,m0,G0,T,Q,k,X,Y;this.state="config";let n;this.config=o0(this.config,o),this.state="check";let s=ke(this,wt).call(this,t);s&&(g(s,t),this.emit("error"),A({face:[],body:[],hand:[],gesture:[],object:[],performance:this.performance,timestamp:P(),persons:[],error:s}));let a=P();await Mt(this),await this.load(),n=P(),this.state="image";let i=await ie(t,this.config);if(this.process=i,this.performance.inputProcess=this.env.perfadd?(this.performance.inputProcess||0)+Math.trunc(P()-n):Math.trunc(P()-n),this.analyze("Get Image:"),!i.tensor){this.config.debug&&g("could not convert input to tensor"),this.emit("error"),A({face:[],body:[],hand:[],gesture:[],object:[],performance:this.performance,timestamp:P(),persons:[],error:"could not convert input to tensor"});return}this.emit("image"),n=P(),this.config.skipAllowed=await Po(this.config,i.tensor),this.performance.totalFrames||(this.performance.totalFrames=0),this.performance.cachedFrames||(this.performance.cachedFrames=0),this.performance.totalFrames++,this.config.skipAllowed&&this.performance.cachedFrames++,this.performance.cacheCheck=this.env.perfadd?(this.performance.cacheCheck||0)+Math.trunc(P()-n):Math.trunc(P()-n),this.analyze("Check Changed:");let x=[],d=[],l=[],y=[];this.state="detect:face",this.config.async?(x=this.config.face.enabled?no(this,i.tensor):[],this.performance.face&&delete this.performance.face):(n=P(),x=this.config.face.enabled?await no(this,i.tensor):[],this.performance.face=this.env.perfadd?(this.performance.face||0)+Math.trunc(P()-n):Math.trunc(P()-n)),this.config.async&&(this.config.body.maxDetected===-1||this.config.hand.maxDetected===-1)&&(x=await x),this.analyze("Start Body:"),this.state="detect:body";let c=this.config.body.maxDetected===-1?o0(this.config,{body:{maxDetected:this.config.face.enabled?1*x.length:1}}):this.config;this.config.async?((v=this.config.body.modelPath)!=null&&v.includes("posenet")?d=this.config.body.enabled?D5(i.tensor,c):[]:(b=this.config.body.modelPath)!=null&&b.includes("blazepose")?d=this.config.body.enabled?e5(i.tensor,c):[]:(M=this.config.body.modelPath)!=null&&M.includes("efficientpose")?d=this.config.body.enabled?a5(i.tensor,c):[]:(p=this.config.body.modelPath)!=null&&p.includes("movenet")&&(d=this.config.body.enabled?L5(i.tensor,c):[]),this.performance.body&&delete this.performance.body):(n=P(),(u=this.config.body.modelPath)!=null&&u.includes("posenet")?d=this.config.body.enabled?await D5(i.tensor,c):[]:(E=this.config.body.modelPath)!=null&&E.includes("blazepose")?d=this.config.body.enabled?await e5(i.tensor,c):[]:(W=this.config.body.modelPath)!=null&&W.includes("efficientpose")?d=this.config.body.enabled?await a5(i.tensor,c):[]:(C=this.config.body.modelPath)!=null&&C.includes("movenet")&&(d=this.config.body.enabled?await L5(i.tensor,c):[]),this.performance.body=this.env.perfadd?(this.performance.body||0)+Math.trunc(P()-n):Math.trunc(P()-n)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.state="detect:hand";let f=this.config.hand.maxDetected===-1?o0(this.config,{hand:{maxDetected:this.config.face.enabled?2*x.length:1}}):this.config;this.config.async?((O=(S=this.config.hand.detector)==null?void 0:S.modelPath)!=null&&O.includes("handdetect")?l=this.config.hand.enabled?R5(i.tensor,f):[]:(B=(V=this.config.hand.detector)==null?void 0:V.modelPath)!=null&&B.includes("handtrack")&&(l=this.config.hand.enabled?z5(i.tensor,f):[]),this.performance.hand&&delete this.performance.hand):(n=P(),(t0=(H=this.config.hand.detector)==null?void 0:H.modelPath)!=null&&t0.includes("handdetect")?l=this.config.hand.enabled?await R5(i.tensor,f):[]:(m0=(z=this.config.hand.detector)==null?void 0:z.modelPath)!=null&&m0.includes("handtrack")&&(l=this.config.hand.enabled?await z5(i.tensor,f):[]),this.performance.hand=this.env.perfadd?(this.performance.hand||0)+Math.trunc(P()-n):Math.trunc(P()-n)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.state="detect:object",this.config.async?((G0=this.config.object.modelPath)!=null&&G0.includes("nanodet")?y=this.config.object.enabled?G5(i.tensor,this.config):[]:(T=this.config.object.modelPath)!=null&&T.includes("centernet")&&(y=this.config.object.enabled?A5(i.tensor,this.config):[]),this.performance.object&&delete this.performance.object):(n=P(),(Q=this.config.object.modelPath)!=null&&Q.includes("nanodet")?y=this.config.object.enabled?await G5(i.tensor,this.config):[]:(k=this.config.object.modelPath)!=null&&k.includes("centernet")&&(y=this.config.object.enabled?await A5(i.tensor,this.config):[]),this.performance.object=this.env.perfadd?(this.performance.object||0)+Math.trunc(P()-n):Math.trunc(P()-n)),this.analyze("End Object:"),this.state="detect:await",this.config.async&&([x,d,l,y]=await Promise.all([x,d,l,y])),this.state="detect:gesture";let h=[];this.config.gesture.enabled&&(n=P(),h=[...Kn(x),...Yn(d),..._n(l),...Qn(x)],this.config.async?this.performance.gesture&&delete this.performance.gesture:this.performance.gesture=this.env.perfadd?(this.performance.gesture||0)+Math.trunc(P()-n):Math.trunc(P()-n)),this.performance.total=this.env.perfadd?(this.performance.total||0)+Math.trunc(P()-a):Math.trunc(P()-a);let m=((Y=(X=this.process)==null?void 0:X.tensor)==null?void 0:Y.shape)||[];this.result={face:x,body:d,hand:l,gesture:h,object:y,performance:this.performance,canvas:this.process.canvas,timestamp:Date.now(),error:null,get persons(){return Ar(x,d,l,h,m)}},r.dispose(i.tensor),this.emit("detect"),this.state="idle",A(this.result)})}};Te=new WeakMap,Fe=new WeakMap,Ve=new WeakMap,wt=new WeakMap;export{J2 as Human,J2 as default,Y0 as defaults,R as env}; +2Q==`;async function D2(e){let t=(n,s="application/octet-stream")=>fetch(`data:${s};base64,${n}`).then(a=>a.blob()),o,A;switch(e.config.warmup){case"face":o=await t(Tt);break;case"body":case"full":o=await t(Rt);break;default:o=null}if(o){let n=await createImageBitmap(o);A=await e.detect(n,e.config),n.close()}return A}async function q2(e){return new Promise(t=>{let o;switch(e.config.warmup){case"face":o="data:image/jpeg;base64,"+Tt;break;case"full":case"body":o="data:image/jpeg;base64,"+Rt;break;default:o=null}let A;if(typeof Image!="undefined")A=new Image;else if(R.Image)A=new R.Image;else return;A.onload=async()=>{let n=s0(A.naturalWidth,A.naturalHeight);if(!n)g("Warmup: Canvas not found"),t(void 0);else{let s=n.getContext("2d");s&&s.drawImage(A,0,0);let a=await e.image(n),i=await e.detect(a.tensor,e.config);t(i)}},o?A.src=o:t(void 0)})}async function U2(e){let t=n=>Buffer.from(n,"base64"),o;e.config.warmup==="face"?o=t(Tt):o=t(Rt);let A;if("node"in r){let n=r.node.decodeJpeg(o),s=n.expandDims(0);e.tf.dispose(n),A=await e.detect(s,e.config),e.tf.dispose(s)}else e.config.debug&&g("Warmup tfjs-node not loaded");return A}async function rr(e,t){let o=P();if(e.state="warmup",t&&(e.config=o0(e.config,t)),!e.config.warmup||e.config.warmup.length===0||e.config.warmup==="none")return{face:[],body:[],hand:[],gesture:[],object:[],performance:e.performance,timestamp:P(),persons:[],error:null};let A;return new Promise(async n=>{typeof createImageBitmap=="function"?A=await D2(e):typeof Image!="undefined"||R.Canvas!==void 0?A=await q2(e):A=await U2(e);let s=P();e.config.debug&&g("Warmup",e.config.warmup,Math.round(s-o),"ms"),e.emit("warmup"),n(A)})}var Te,Fe,Ve,wt,Y2=class{constructor(t){w(this,"version");w(this,"config");w(this,"result");w(this,"state");w(this,"process");w(this,"tf");w(this,"env");w(this,"draw");w(this,"models");w(this,"events");w(this,"faceTriangulation");w(this,"faceUVMap");w(this,"performance");Ee(this,Te,void 0);Ee(this,Fe,void 0);Ee(this,Ve,void 0);w(this,"gl");w(this,"analyze",(...t)=>{if(!ke(this,Fe))return;let o=this.tf.engine().state.numTensors,A=ke(this,Te);ze(this,Te,o);let n=o-A;n!==0&&g(...t,n)});Ee(this,wt,t=>{if(!ke(this,Ve))return null;if(!t)return"input is not defined";if(this.env.node&&!(t instanceof se))return"input must be a tensor";try{this.tf.getBackend()}catch(o){return"backend not loaded"}return null});w(this,"similarity",or);w(this,"distance",vt);w(this,"match",Ar);w(this,"emit",t=>{var o;this.events&&this.events.dispatchEvent&&((o=this.events)==null||o.dispatchEvent(new Event(t)))});this.env=R,Y0.wasmPath=je["tfjs-core"].includes("-")?"https://vladmandic.github.io/tfjs/dist/":`https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${r.version_core}/dist/`,Y0.modelBasePath=R.browser?"../models/":"file://models/",Y0.backend=R.browser?"humangl":"tensorflow",this.version=Wt,Object.defineProperty(this,"version",{value:Wt}),this.config=JSON.parse(JSON.stringify(Y0)),Object.seal(this.config),this.config.cacheModels=typeof indexedDB!="undefined",t&&(this.config=o0(this.config,t)),Ro(this.config),this.tf=r,this.state="idle",ze(this,Te,0),ze(this,Fe,!1),ze(this,Ve,!1),this.performance={},this.events=typeof EventTarget!="undefined"?new EventTarget:void 0,this.models=new J5,this.draw={options:B0,canvas:(o,A)=>qn(o,A),face:(o,A,n)=>$5(o,A,n),body:(o,A,n)=>eo(o,A,n),hand:(o,A,n)=>to(o,A,n),gesture:(o,A,n)=>_5(o,A,n),object:(o,A,n)=>oo(o,A,n),person:(o,A,n)=>Dn(o,A,n),all:(o,A,n)=>Un(o,A,n)},this.result={face:[],body:[],hand:[],gesture:[],object:[],performance:{},timestamp:0,persons:[],error:null},this.process={tensor:null,canvas:null},this.faceTriangulation=OA,this.faceUVMap=NA,this.gl=q,this.emit("create")}reset(){let t=this.config.backend;this.config=JSON.parse(JSON.stringify(Y0)),this.config.backend=t}validate(t){return Et(Y0,t||this.config)}now(){return P()}image(t,o=!0){return ie(t,this.config,o)}async segmentation(t,o){return Nn(t,o,this.config)}enhance(t){return p5(t)}compare(t,o){return vo(this.config,t,o)}async init(){await Mt(this,!0),await this.tf.ready()}async load(t){this.state="load";let o=P(),A=Object.values(this.models).filter(a=>a).length;t&&(this.config=o0(this.config,t)),this.env.initial&&(this.config.debug&&g(`version: ${this.version}`),this.config.debug&&g(`tfjs version: ${this.tf.version["tfjs-core"]}`),await Mt(this)||g("error: backend check failed"),await r.ready(),this.env.browser&&(this.config.debug&&g("configuration:",this.config),this.config.debug&&g("environment:",this.env),this.config.debug&&g("tf flags:",this.tf.ENV.flags))),await Bn(this),this.env.initial&&this.config.debug&&g("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),this.env.initial=!1,Object.values(this.models).filter(a=>a).length!==A&&(await Gn(this),this.emit("load"));let s=Math.trunc(P()-o);s>(this.performance.loadModels||0)&&(this.performance.loadModels=this.env.perfadd?(this.performance.loadModels||0)+s:s)}next(t=this.result){return er(t,this.config)}async warmup(t){let o=P(),A=await rr(this,t),n=P();return this.performance.warmup=Math.trunc(n-o),A}async profile(t,o){let A=await this.tf.profile(()=>this.detect(t,o)),n={};for(let i of A.kernels)n[i.name]?n[i.name]+=i.kernelTimeMs:n[i.name]=i.kernelTimeMs;let s=[];Object.entries(n).forEach(i=>s.push({name:i[0],ms:i[1]})),s.sort((i,x)=>x.ms-i.ms),s.length=20;let a={};for(let i of s)a[i.name]=i.ms;return a}async detect(t,o){return this.state="detect",new Promise(async A=>{var v,b,M,p,u,E,W,C,S,O,V,B,H,t0,z,m0,G0,T,Q,k,X,Y;this.state="config";let n;this.config=o0(this.config,o),this.state="check";let s=ke(this,wt).call(this,t);s&&(g(s,t),this.emit("error"),A({face:[],body:[],hand:[],gesture:[],object:[],performance:this.performance,timestamp:P(),persons:[],error:s}));let a=P();await Mt(this),await this.load(),n=P(),this.state="image";let i=await ie(t,this.config);if(this.process=i,this.performance.inputProcess=this.env.perfadd?(this.performance.inputProcess||0)+Math.trunc(P()-n):Math.trunc(P()-n),this.analyze("Get Image:"),!i.tensor){this.config.debug&&g("could not convert input to tensor"),this.emit("error"),A({face:[],body:[],hand:[],gesture:[],object:[],performance:this.performance,timestamp:P(),persons:[],error:"could not convert input to tensor"});return}this.emit("image"),n=P(),this.config.skipAllowed=await Mo(this.config,i.tensor),this.performance.totalFrames||(this.performance.totalFrames=0),this.performance.cachedFrames||(this.performance.cachedFrames=0),this.performance.totalFrames++,this.config.skipAllowed&&this.performance.cachedFrames++,this.performance.cacheCheck=this.env.perfadd?(this.performance.cacheCheck||0)+Math.trunc(P()-n):Math.trunc(P()-n),this.analyze("Check Changed:");let x=[],d=[],l=[],y=[];this.state="detect:face",this.config.async?(x=this.config.face.enabled?no(this,i.tensor):[],this.performance.face&&delete this.performance.face):(n=P(),x=this.config.face.enabled?await no(this,i.tensor):[],this.performance.face=this.env.perfadd?(this.performance.face||0)+Math.trunc(P()-n):Math.trunc(P()-n)),this.config.async&&(this.config.body.maxDetected===-1||this.config.hand.maxDetected===-1)&&(x=await x),this.analyze("Start Body:"),this.state="detect:body";let c=this.config.body.maxDetected===-1?o0(this.config,{body:{maxDetected:this.config.face.enabled?1*x.length:1}}):this.config;this.config.async?((v=this.config.body.modelPath)!=null&&v.includes("posenet")?d=this.config.body.enabled?D5(i.tensor,c):[]:(b=this.config.body.modelPath)!=null&&b.includes("blazepose")?d=this.config.body.enabled?e5(i.tensor,c):[]:(M=this.config.body.modelPath)!=null&&M.includes("efficientpose")?d=this.config.body.enabled?a5(i.tensor,c):[]:(p=this.config.body.modelPath)!=null&&p.includes("movenet")&&(d=this.config.body.enabled?L5(i.tensor,c):[]),this.performance.body&&delete this.performance.body):(n=P(),(u=this.config.body.modelPath)!=null&&u.includes("posenet")?d=this.config.body.enabled?await D5(i.tensor,c):[]:(E=this.config.body.modelPath)!=null&&E.includes("blazepose")?d=this.config.body.enabled?await e5(i.tensor,c):[]:(W=this.config.body.modelPath)!=null&&W.includes("efficientpose")?d=this.config.body.enabled?await a5(i.tensor,c):[]:(C=this.config.body.modelPath)!=null&&C.includes("movenet")&&(d=this.config.body.enabled?await L5(i.tensor,c):[]),this.performance.body=this.env.perfadd?(this.performance.body||0)+Math.trunc(P()-n):Math.trunc(P()-n)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.state="detect:hand";let f=this.config.hand.maxDetected===-1?o0(this.config,{hand:{maxDetected:this.config.face.enabled?2*x.length:1}}):this.config;this.config.async?((O=(S=this.config.hand.detector)==null?void 0:S.modelPath)!=null&&O.includes("handdetect")?l=this.config.hand.enabled?R5(i.tensor,f):[]:(B=(V=this.config.hand.detector)==null?void 0:V.modelPath)!=null&&B.includes("handtrack")&&(l=this.config.hand.enabled?z5(i.tensor,f):[]),this.performance.hand&&delete this.performance.hand):(n=P(),(t0=(H=this.config.hand.detector)==null?void 0:H.modelPath)!=null&&t0.includes("handdetect")?l=this.config.hand.enabled?await R5(i.tensor,f):[]:(m0=(z=this.config.hand.detector)==null?void 0:z.modelPath)!=null&&m0.includes("handtrack")&&(l=this.config.hand.enabled?await z5(i.tensor,f):[]),this.performance.hand=this.env.perfadd?(this.performance.hand||0)+Math.trunc(P()-n):Math.trunc(P()-n)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.state="detect:object",this.config.async?((G0=this.config.object.modelPath)!=null&&G0.includes("nanodet")?y=this.config.object.enabled?G5(i.tensor,this.config):[]:(T=this.config.object.modelPath)!=null&&T.includes("centernet")&&(y=this.config.object.enabled?A5(i.tensor,this.config):[]),this.performance.object&&delete this.performance.object):(n=P(),(Q=this.config.object.modelPath)!=null&&Q.includes("nanodet")?y=this.config.object.enabled?await G5(i.tensor,this.config):[]:(k=this.config.object.modelPath)!=null&&k.includes("centernet")&&(y=this.config.object.enabled?await A5(i.tensor,this.config):[]),this.performance.object=this.env.perfadd?(this.performance.object||0)+Math.trunc(P()-n):Math.trunc(P()-n)),this.analyze("End Object:"),this.state="detect:await",this.config.async&&([x,d,l,y]=await Promise.all([x,d,l,y])),this.state="detect:gesture";let h=[];this.config.gesture.enabled&&(n=P(),h=[...Qn(x),...Kn(d),...$n(l),..._n(x)],this.config.async?this.performance.gesture&&delete this.performance.gesture:this.performance.gesture=this.env.perfadd?(this.performance.gesture||0)+Math.trunc(P()-n):Math.trunc(P()-n)),this.performance.total=this.env.perfadd?(this.performance.total||0)+Math.trunc(P()-a):Math.trunc(P()-a);let m=((Y=(X=this.process)==null?void 0:X.tensor)==null?void 0:Y.shape)||[];this.result={face:x,body:d,hand:l,gesture:h,object:y,performance:this.performance,canvas:this.process.canvas,timestamp:Date.now(),error:null,get persons(){return nr(x,d,l,h,m)}},r.dispose(i.tensor),this.emit("detect"),this.state="idle",A(this.result)})}};Te=new WeakMap,Fe=new WeakMap,Ve=new WeakMap,wt=new WeakMap;export{Y2 as Human,Y2 as default,Y0 as defaults,R as env}; /** * Human main module * @default Human Library diff --git a/dist/human.esm-nobundle.js.map b/dist/human.esm-nobundle.js.map index 8d52710e..3f7244af 100644 --- a/dist/human.esm-nobundle.js.map +++ b/dist/human.esm-nobundle.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/util/util.ts", "../src/config.ts", "tfjs.esm.js", "../src/image/imagefxshaders.ts", "../src/image/imagefx.ts", "../src/image/enhance.ts", "../src/image/image.ts", "../src/util/env.ts", "../src/tfjs/load.ts", "../src/gear/gear.ts", "../src/tfjs/constants.ts", "../src/gear/ssrnet-age.ts", "../src/gear/ssrnet-gender.ts", "../src/face/antispoof.ts", "../src/face/facemeshcoords.ts", "../src/face/facemeshutil.ts", "../src/face/blazeface.ts", "../src/body/blazeposecoords.ts", "../src/body/blazeposedetector.ts", "../src/util/box.ts", "../src/body/blazepose.ts", "../src/object/labels.ts", "../src/object/centernet.ts", "../src/body/efficientposecoords.ts", "../src/body/efficientpose.ts", "../src/gear/emotion.ts", "../src/face/mobilefacenet.ts", "../src/face/iris.ts", "../src/face/facemesh.ts", "../src/face/faceres.ts", "../src/hand/handposeutil.ts", "../src/hand/handposeanchors.ts", "../src/hand/handposedetector.ts", "../src/hand/handposepipeline.ts", "../src/hand/fingerdef.ts", "../src/hand/fingergesture.ts", "../src/hand/fingerpose.ts", "../src/hand/handpose.ts", "../src/hand/handtrack.ts", "../src/face/liveness.ts", "../src/body/movenetcoords.ts", "../src/body/movenetfix.ts", "../src/body/movenet.ts", "../src/object/nanodet.ts", "../src/body/posenetutils.ts", "../src/body/posenet.ts", "../src/segmentation/segmentation.ts", "../src/models.ts", "../src/tfjs/humangl.ts", "../src/tfjs/backend.ts", "../src/util/draw.ts", "../src/face/mask.ts", "../src/face/angles.ts", "../src/face/face.ts", "../src/gesture/gesture.ts", "../src/util/interpolate.ts", "../src/face/match.ts", "../src/util/persons.ts", "../src/sample.ts", "../src/warmup.ts", "../src/human.ts"], - "sourcesContent": ["import type { Config } from '../exports';\n\n/**\n * Simple helper functions used accross codebase\n */\n\n// helper function: wrapper around console output\nexport function log(...msg): void {\n const dt = new Date();\n const ts = `${dt.getHours().toString().padStart(2, '0')}:${dt.getMinutes().toString().padStart(2, '0')}:${dt.getSeconds().toString().padStart(2, '0')}.${dt.getMilliseconds().toString().padStart(3, '0')}`;\n // eslint-disable-next-line no-console\n if (msg) console.log(ts, 'Human:', ...msg);\n}\n\n// helper function: join two paths\nexport function join(folder: string, file: string): string {\n const separator = folder.endsWith('/') ? '' : '/';\n const skipJoin = file.startsWith('.') || file.startsWith('/') || file.startsWith('http:') || file.startsWith('https:') || file.startsWith('file:');\n const path = skipJoin ? `${file}` : `${folder}${separator}${file}`;\n if (!path.toLocaleLowerCase().includes('.json')) throw new Error(`modelpath error: expecting json file: ${path}`);\n return path;\n}\n\n// helper function: gets elapsed time on both browser and nodejs\nexport const now = () => {\n if (typeof performance !== 'undefined') return performance.now();\n return parseInt((Number(process.hrtime.bigint()) / 1000 / 1000).toString());\n};\n\n// helper function: checks current config validity\nexport function validate(defaults: Partial, config: Partial, parent = 'config', msgs: Array<{ reason: string, where: string, expected?: string }> = []) {\n for (const key of Object.keys(config)) {\n if (typeof config[key] === 'object') {\n validate(defaults[key], config[key], key, msgs);\n } else {\n const defined = defaults && (typeof defaults[key] !== 'undefined');\n if (!defined) msgs.push({ reason: 'unknown property', where: `${parent}.${key} = ${config[key]}` });\n const same = defaults && typeof defaults[key] === typeof config[key];\n if (defined && !same) msgs.push({ reason: 'property type mismatch', where: `${parent}.${key} = ${config[key]}`, expected: typeof defaults[key] });\n }\n // ok = ok && defined && same;\n }\n if (config.debug && parent === 'config' && msgs.length > 0) log('invalid configuration', msgs);\n return msgs;\n}\n\n// helper function: perform deep merge of multiple objects so it allows full inheritance with overrides\nexport function mergeDeep(...objects) {\n const isObject = (obj) => obj && typeof obj === 'object';\n return objects.reduce((prev, obj) => {\n Object.keys(obj || {}).forEach((key) => {\n const pVal = prev[key];\n const oVal = obj[key];\n if (Array.isArray(pVal) && Array.isArray(oVal)) prev[key] = pVal.concat(...oVal);\n else if (isObject(pVal) && isObject(oVal)) prev[key] = mergeDeep(pVal, oVal);\n else prev[key] = oVal;\n });\n return prev;\n }, {});\n}\n\n// helper function: return min and max from input array\nexport const minmax = (data: Array) => data.reduce((acc: Array, val) => {\n acc[0] = (acc[0] === undefined || val < acc[0]) ? val : acc[0];\n acc[1] = (acc[1] === undefined || val > acc[1]) ? val : acc[1];\n return acc;\n}, []);\n\n// helper function: async wait\nexport async function wait(time: number) {\n const waiting = new Promise((resolve) => { setTimeout(() => resolve(true), time); });\n await waiting;\n}\n", "/* eslint-disable indent */\n/* eslint-disable no-multi-spaces */\n\n/** Generic config type inherited by all module types */\nexport interface GenericConfig {\n /** is module enabled? */\n enabled: boolean,\n /** path to model json file (relative to `modelBasePath` */\n modelPath: string,\n /** how many max frames to go without re-running model if cached results are acceptable\n * for two-phase models such as face and hand caching applies to bounding boxes detection only */\n skipFrames: number,\n /** how many max milliseconds to go without re-running model if cached results are acceptable\n * for two-phase models such as face and hand caching applies to bounding boxes detection only */\n skipTime: number,\n}\n\n/** Detector part of face configuration */\nexport interface FaceDetectorConfig extends GenericConfig {\n /** is face rotation correction performed after detecting face?\n * used to correctly analyze faces under high angles\n */\n rotation: boolean,\n /** maximum number of detected faces */\n maxDetected: number,\n /** minimum confidence for a detected face before results are discarded */\n minConfidence: number,\n /** minimum overlap between two detected faces before one is discarded */\n iouThreshold: number,\n /** should child models perform on masked image of a face */\n mask: boolean,\n /** should face detection return processed and cropped face tensor that can with an external model for addtional processing?\n * if enabled it must be manually deallocated to avoid memory leak */\n return: boolean,\n}\n\n/** Mesh part of face configuration */\nexport interface FaceMeshConfig extends GenericConfig {}\n\n/** Iris part of face configuration */\nexport interface FaceIrisConfig extends GenericConfig {}\n\n/** Description or face embedding part of face configuration\n * - also used by age and gender detection\n */\nexport interface FaceDescriptionConfig extends GenericConfig {\n /** minimum confidence for a detected face before results are discarded */\n minConfidence: number,\n}\n\n/** Emotion part of face configuration */\nexport interface FaceEmotionConfig extends GenericConfig {\n /** minimum confidence for a detected face before results are discarded */\n minConfidence: number,\n}\n\n/** Anti-spoofing part of face configuration */\nexport interface FaceAntiSpoofConfig extends GenericConfig {}\n\n/** Liveness part of face configuration */\nexport interface FaceLivenessConfig extends GenericConfig {}\n\n/** Configures all face-specific options: face detection, mesh analysis, age, gender, emotion detection and face description */\nexport interface FaceConfig extends GenericConfig {\n detector: Partial,\n mesh: Partial,\n iris: Partial,\n description: Partial,\n emotion: Partial,\n antispoof: Partial,\n liveness: Partial,\n}\n\n/** Configures all body detection specific options */\nexport interface BodyConfig extends GenericConfig {\n /** maximum number of detected bodies */\n maxDetected: number,\n /** minimum confidence for a detected body before results are discarded */\n minConfidence: number,\n /* experimental\n /** experimental: detector used for body model before actual analysis\n detector?: {\n /** experimental: enable body detector before body landmarks\n enabled: boolean,\n /** experimental: path to optional body detector model json file\n modelPath: string,\n /** experimental: minimum confidence for a detected body before results are discarded\n minConfidence: number,\n /** experimental: minimum overlap between two detected bodies before one is discarded\n iouThreshold: number\n },\n */\n}\n\n/** Configures all hand detection specific options */\nexport interface HandConfig extends GenericConfig {\n /** should hand rotation correction be performed after hand detection? */\n rotation: boolean,\n /** minimum confidence for a detected hand before results are discarded */\n minConfidence: number,\n /** minimum overlap between two detected hands before one is discarded */\n iouThreshold: number,\n /** maximum number of detected hands */\n maxDetected: number,\n /** should hand landmarks be detected or just return detected hand box */\n landmarks: boolean,\n detector: {\n /** path to hand detector model json */\n modelPath?: string,\n },\n skeleton: {\n /** path to hand skeleton model json */\n modelPath?: string,\n },\n}\n\n/** Configures all object detection specific options */\nexport interface ObjectConfig extends GenericConfig {\n /** minimum confidence for a detected objects before results are discarded */\n minConfidence: number,\n /** minimum overlap between two detected objects before one is discarded */\n iouThreshold: number,\n /** maximum number of detected objects */\n maxDetected: number,\n}\n\n/** Configures all body segmentation module\n * removes background from input containing person\n * if segmentation is enabled it will run as preprocessing task before any other model\n * alternatively leave it disabled and use it on-demand using human.segmentation method which can\n * remove background or replace it with user-provided background\n*/\nexport interface SegmentationConfig extends GenericConfig {\n /** blur segmentation output by pixels for more realistic image */\n blur: number,\n}\n\n/** Run input through image filters before inference\n * - available only in Browser environments\n * - image filters run with near-zero latency as they are executed on the GPU using WebGL\n*/\nexport interface FilterConfig {\n /** are image filters enabled? */\n enabled: boolean,\n /** perform image histogram equalization\n * - equalization is performed on input as a whole and detected face before its passed for further analysis\n */\n equalization: boolean,\n /** resize input width\n * - if both width and height are set to 0, there is no resizing\n * - if just one is set, second one is scaled automatically\n * - if both are set, values are used as-is\n */\n width: number,\n /** resize input height\n * - if both width and height are set to 0, there is no resizing\n * - if just one is set, second one is scaled automatically\n * - if both are set, values are used as-is\n */\n height: number,\n /** return processed canvas imagedata in result */\n return: boolean,\n /** flip input as mirror image */\n flip: boolean,\n /** range: -1 (darken) to 1 (lighten) */\n brightness: number,\n /** range: -1 (reduce contrast) to 1 (increase contrast) */\n contrast: number,\n /** range: 0 (no sharpening) to 1 (maximum sharpening) */\n sharpness: number,\n /** range: 0 (no blur) to N (blur radius in pixels) */\n blur: number\n /** range: -1 (reduce saturation) to 1 (increase saturation) */\n saturation: number,\n /** range: 0 (no change) to 360 (hue rotation in degrees) */\n hue: number,\n /** image negative */\n negative: boolean,\n /** image sepia colors */\n sepia: boolean,\n /** image vintage colors */\n vintage: boolean,\n /** image kodachrome colors */\n kodachrome: boolean,\n /** image technicolor colors */\n technicolor: boolean,\n /** image polaroid camera effect */\n polaroid: boolean,\n /** range: 0 (no pixelate) to N (number of pixels to pixelate) */\n pixelate: number,\n}\n\n/** Controlls gesture detection */\nexport interface GestureConfig {\n /** is gesture detection enabled? */\n enabled: boolean,\n}\n/** Possible TensorFlow backends */\nexport type BackendType = ['cpu', 'wasm', 'webgl', 'humangl', 'tensorflow', 'webgpu'];\n\n/** Possible values for `human.warmup` */\nexport type WarmupType = ['' | 'none' | 'face' | 'full' | 'body'];\n\n/**\n * Configuration interface definition for **Human** library\n * Contains all configurable parameters\n * Defaults: [config](https://github.com/vladmandic/human/blob/main/src/config.ts#L262)\n */\nexport interface Config {\n /** Backend used for TFJS operations\n * valid build-in backends are:\n * - Browser: `cpu`, `wasm`, `webgl`, `humangl`, `webgpu`\n * - NodeJS: `cpu`, `wasm`, `tensorflow`\n * default: `humangl` for browser and `tensorflow` for nodejs\n */\n backend: '' | 'cpu' | 'wasm' | 'webgl' | 'humangl' | 'tensorflow' | 'webgpu',\n\n /** Path to *.wasm files if backend is set to `wasm`\n *\n * default: auto-detects to link to CDN `jsdelivr` when running in browser\n */\n wasmPath: string,\n\n /** Force WASM loader to use platform fetch\n *\n * default: auto-detects to link to CDN `jsdelivr` when running in browser\n */\n wasmPlatformFetch: boolean,\n\n /** Print debug statements to console\n *\n * default: `true`\n */\n debug: boolean,\n\n /** Perform model loading and inference concurrently or sequentially\n *\n * default: `true`\n */\n async: boolean,\n\n /** What to use for `human.warmup()`\n * - warmup pre-initializes all models for faster inference but can take significant time on startup\n * - used by `webgl`, `humangl` and `webgpu` backends\n *\n * default: `full`\n */\n warmup: '' | 'none' | 'face' | 'full' | 'body',\n\n /** Base model path (typically starting with file://, http:// or https://) for all models\n * - individual modelPath values are relative to this path\n *\n * default: `../models/` for browsers and `file://models/` for nodejs\n */\n modelBasePath: string,\n\n /** Cache models in IndexDB on first sucessfull load\n * default: true if indexdb is available (browsers), false if its not (nodejs)\n */\n cacheModels: boolean,\n\n /** Cache sensitivity\n * - values 0..1 where 0.01 means reset cache if input changed more than 1%\n * - set to 0 to disable caching\n *\n * default: 0.7\n */\n cacheSensitivity: number;\n\n /** Perform immediate garbage collection on deallocated tensors instead of caching them */\n deallocate: boolean;\n\n /** Internal Variable */\n skipAllowed: boolean;\n\n /** Filter config {@link FilterConfig} */\n filter: Partial,\n\n /** Gesture config {@link GestureConfig} */\n gesture: Partial;\n\n /** Face config {@link FaceConfig} */\n face: Partial,\n\n /** Body config {@link BodyConfig} */\n body: Partial,\n\n /** Hand config {@link HandConfig} */\n hand: Partial,\n\n /** Object config {@link ObjectConfig} */\n object: Partial,\n\n /** Segmentation config {@link SegmentationConfig} */\n segmentation: Partial,\n}\n\n/** - [See all default Config values...](https://github.com/vladmandic/human/blob/main/src/config.ts#L262) */\nconst config: Config = {\n backend: '',\n modelBasePath: '',\n cacheModels: true,\n wasmPath: '',\n wasmPlatformFetch: false,\n debug: true,\n async: true,\n warmup: 'full',\n cacheSensitivity: 0.70,\n skipAllowed: false,\n deallocate: false,\n filter: {\n enabled: true,\n equalization: false,\n width: 0,\n height: 0,\n flip: false,\n return: true,\n brightness: 0,\n contrast: 0,\n sharpness: 0,\n blur: 0,\n saturation: 0,\n hue: 0,\n negative: false,\n sepia: false,\n vintage: false,\n kodachrome: false,\n technicolor: false,\n polaroid: false,\n pixelate: 0,\n },\n gesture: {\n enabled: true,\n },\n face: {\n enabled: true,\n detector: {\n modelPath: 'blazeface.json',\n rotation: true,\n maxDetected: 1,\n skipFrames: 99,\n skipTime: 2500,\n minConfidence: 0.2,\n iouThreshold: 0.1,\n mask: false,\n return: false,\n },\n mesh: {\n enabled: true,\n modelPath: 'facemesh.json',\n },\n iris: {\n enabled: true,\n modelPath: 'iris.json',\n },\n emotion: {\n enabled: true,\n minConfidence: 0.1,\n skipFrames: 99,\n skipTime: 1500,\n modelPath: 'emotion.json',\n },\n description: {\n enabled: true,\n modelPath: 'faceres.json',\n skipFrames: 99,\n skipTime: 3000,\n minConfidence: 0.1,\n },\n antispoof: {\n enabled: false,\n skipFrames: 99,\n skipTime: 4000,\n modelPath: 'antispoof.json',\n },\n liveness: {\n enabled: false,\n skipFrames: 99,\n skipTime: 4000,\n modelPath: 'liveness.json',\n },\n },\n body: {\n enabled: true,\n modelPath: 'movenet-lightning.json',\n maxDetected: -1,\n minConfidence: 0.3,\n skipFrames: 1,\n skipTime: 200,\n },\n hand: {\n enabled: true,\n rotation: true,\n skipFrames: 99,\n skipTime: 1000,\n minConfidence: 0.50,\n iouThreshold: 0.2,\n maxDetected: -1,\n landmarks: true,\n detector: {\n modelPath: 'handtrack.json',\n },\n skeleton: {\n modelPath: 'handlandmark-full.json',\n },\n },\n object: {\n enabled: false,\n modelPath: 'mb3-centernet.json',\n minConfidence: 0.2,\n iouThreshold: 0.4,\n maxDetected: 10,\n skipFrames: 99,\n skipTime: 2000,\n },\n segmentation: {\n enabled: false,\n modelPath: 'selfie.json',\n blur: 8,\n },\n};\n\nexport { config as defaults };\n", "/*\n Human\n homepage: \n author: '\n*/\n\nexport*from\"@tensorflow/tfjs/dist/index.js\";export*from\"@tensorflow/tfjs-backend-webgl/dist/index.js\";var r=\"3.14.0\",a=\"3.14.0\",e=\"3.14.0\",o=\"3.14.0\",t=\"3.14.0\",s=\"3.14.0\",f=\"3.14.0\",v=\"3.14.0\",j={tfjs:r,\"tfjs-core\":a,\"tfjs-data\":e,\"tfjs-layers\":o,\"tfjs-converter\":t,\"tfjs-backend-cpu\":s,\"tfjs-backend-webgl\":f,\"tfjs-backend-wasm\":v};import{Tensor as b}from\"@tensorflow/tfjs/dist/index.js\";import{GraphModel as i}from\"@tensorflow/tfjs-converter/dist/index\";export{i as GraphModel,b as Tensor,j as version};\n", "export const vertexIdentity = `\n precision highp float;\n attribute vec2 pos;\n attribute vec2 uv;\n varying vec2 vUv;\n uniform float flipY;\n void main(void) {\n vUv = uv;\n gl_Position = vec4(pos.x, pos.y*flipY, 0.0, 1.);\n }\n`;\n\nexport const fragmentIdentity = `\n precision highp float;\n varying vec2 vUv;\n uniform sampler2D texture;\n void main(void) {\n gl_FragColor = texture2D(texture, vUv);\n }\n`;\n\nexport const colorMatrixWithAlpha = `\n precision highp float;\n varying vec2 vUv;\n uniform sampler2D texture;\n uniform float m[20];\n void main(void) {\n vec4 c = texture2D(texture, vUv);\n gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[3] * c.a + m[4];\n gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[8] * c.a + m[9];\n gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[13] * c.a + m[14];\n gl_FragColor.a = m[15] * c.r + m[16] * c.g + m[17] * c.b + m[18] * c.a + m[19];\n }\n`;\n\nexport const colorMatrixWithoutAlpha = `\n precision highp float;\n varying vec2 vUv;\n uniform sampler2D texture;\n uniform float m[20];\n void main(void) {\n vec4 c = texture2D(texture, vUv);\n gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[4];\n gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[9];\n gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[14];\n gl_FragColor.a = c.a;\n }\n`;\n\nexport const pixelate = `\n precision highp float;\n varying vec2 vUv;\n uniform vec2 size;\n uniform sampler2D texture;\n vec2 pixelate(vec2 coord, vec2 size) {\n return floor( coord / size ) * size;\n }\n void main(void) {\n gl_FragColor = vec4(0.0);\n vec2 coord = pixelate(vUv, size);\n gl_FragColor += texture2D(texture, coord);\n }\n`;\n\nexport const blur = `\n precision highp float;\n varying vec2 vUv;\n uniform sampler2D texture;\n uniform vec2 px;\n void main(void) {\n gl_FragColor = vec4(0.0);\n gl_FragColor += texture2D(texture, vUv + vec2(-7.0*px.x, -7.0*px.y))*0.0044299121055113265;\n gl_FragColor += texture2D(texture, vUv + vec2(-6.0*px.x, -6.0*px.y))*0.00895781211794;\n gl_FragColor += texture2D(texture, vUv + vec2(-5.0*px.x, -5.0*px.y))*0.0215963866053;\n gl_FragColor += texture2D(texture, vUv + vec2(-4.0*px.x, -4.0*px.y))*0.0443683338718;\n gl_FragColor += texture2D(texture, vUv + vec2(-3.0*px.x, -3.0*px.y))*0.0776744219933;\n gl_FragColor += texture2D(texture, vUv + vec2(-2.0*px.x, -2.0*px.y))*0.115876621105;\n gl_FragColor += texture2D(texture, vUv + vec2(-1.0*px.x, -1.0*px.y))*0.147308056121;\n gl_FragColor += texture2D(texture, vUv )*0.159576912161;\n gl_FragColor += texture2D(texture, vUv + vec2( 1.0*px.x, 1.0*px.y))*0.147308056121;\n gl_FragColor += texture2D(texture, vUv + vec2( 2.0*px.x, 2.0*px.y))*0.115876621105;\n gl_FragColor += texture2D(texture, vUv + vec2( 3.0*px.x, 3.0*px.y))*0.0776744219933;\n gl_FragColor += texture2D(texture, vUv + vec2( 4.0*px.x, 4.0*px.y))*0.0443683338718;\n gl_FragColor += texture2D(texture, vUv + vec2( 5.0*px.x, 5.0*px.y))*0.0215963866053;\n gl_FragColor += texture2D(texture, vUv + vec2( 6.0*px.x, 6.0*px.y))*0.00895781211794;\n gl_FragColor += texture2D(texture, vUv + vec2( 7.0*px.x, 7.0*px.y))*0.0044299121055113265;\n }\n`;\n\nexport const convolution = `\n precision highp float;\n varying vec2 vUv;\n uniform sampler2D texture;\n uniform vec2 px;\n uniform float m[9];\n void main(void) {\n vec4 c11 = texture2D(texture, vUv - px); // top left\n vec4 c12 = texture2D(texture, vec2(vUv.x, vUv.y - px.y)); // top center\n vec4 c13 = texture2D(texture, vec2(vUv.x + px.x, vUv.y - px.y)); // top right\n vec4 c21 = texture2D(texture, vec2(vUv.x - px.x, vUv.y) ); // mid left\n vec4 c22 = texture2D(texture, vUv); // mid center\n vec4 c23 = texture2D(texture, vec2(vUv.x + px.x, vUv.y) ); // mid right\n vec4 c31 = texture2D(texture, vec2(vUv.x - px.x, vUv.y + px.y) ); // bottom left\n vec4 c32 = texture2D(texture, vec2(vUv.x, vUv.y + px.y) ); // bottom center\n vec4 c33 = texture2D(texture, vUv + px ); // bottom right\n gl_FragColor = \n c11 * m[0] + c12 * m[1] + c22 * m[2] +\n c21 * m[3] + c22 * m[4] + c23 * m[5] +\n c31 * m[6] + c32 * m[7] + c33 * m[8];\n gl_FragColor.a = c22.a;\n }\n`;\n", "/**\n * Image Filters in WebGL algoritm implementation\n * Based on: [WebGLImageFilter](https://github.com/phoboslab/WebGLImageFilter)\n */\n\nimport * as shaders from './imagefxshaders';\nimport { canvas } from './image';\nimport { log } from '../util/util';\n\nconst collect = (source, prefix, collection) => {\n const r = new RegExp('\\\\b' + prefix + ' \\\\w+ (\\\\w+)', 'ig');\n source.replace(r, (match, name) => {\n collection[name] = 0;\n return match;\n });\n};\n\nclass GLProgram {\n uniform = {};\n attribute = {};\n gl: WebGLRenderingContext;\n id: WebGLProgram;\n\n constructor(gl, vertexSource, fragmentSource) {\n this.gl = gl;\n const vertexShader = this.compile(vertexSource, this.gl.VERTEX_SHADER);\n const fragmentShader = this.compile(fragmentSource, this.gl.FRAGMENT_SHADER);\n this.id = this.gl.createProgram() as WebGLProgram;\n if (!vertexShader || !fragmentShader) return;\n if (!this.id) {\n log('filter: could not create webgl program');\n return;\n }\n this.gl.attachShader(this.id, vertexShader);\n this.gl.attachShader(this.id, fragmentShader);\n this.gl.linkProgram(this.id);\n if (!this.gl.getProgramParameter(this.id, this.gl.LINK_STATUS)) {\n log(`filter: gl link failed: ${this.gl.getProgramInfoLog(this.id)}`);\n return;\n }\n this.gl.useProgram(this.id);\n collect(vertexSource, 'attribute', this.attribute); // Collect attributes\n for (const a in this.attribute) this.attribute[a] = this.gl.getAttribLocation(this.id, a);\n collect(vertexSource, 'uniform', this.uniform); // Collect uniforms\n collect(fragmentSource, 'uniform', this.uniform);\n for (const u in this.uniform) this.uniform[u] = this.gl.getUniformLocation(this.id, u);\n }\n\n compile = (source, type): WebGLShader | null => {\n const shader = this.gl.createShader(type) as WebGLShader;\n if (!shader) {\n log('filter: could not create shader');\n return null;\n }\n this.gl.shaderSource(shader, source);\n this.gl.compileShader(shader);\n if (!this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS)) {\n log(`filter: gl compile failed: ${this.gl.getShaderInfoLog(shader)}`);\n return null;\n }\n return shader;\n };\n}\n\n// function that is instantiated as class so it has private this members\n/**\n * @class GLImageFilter\n * @property {function} reset reset current filter chain\n * @property {function} add add specified filter to filter chain\n * @property {function} apply execute filter chain and draw result\n * @property {function} draw just draw input to result\n */\n\nexport function GLImageFilter() {\n let drawCount = 0;\n let sourceTexture: WebGLTexture | null = null;\n let lastInChain = false;\n let currentFramebufferIndex = -1;\n let tempFramebuffers: [null, null] | [{ fbo: WebGLFramebuffer | null, texture: WebGLTexture | null }] = [null, null];\n let filterChain: Record[] = [];\n let vertexBuffer: WebGLBuffer | null = null;\n let currentProgram: GLProgram | null = null;\n const fxcanvas = canvas(100, 100);\n const shaderProgramCache = { }; // key is the shader program source, value is the compiled program\n const DRAW = { INTERMEDIATE: 1 };\n const gl = fxcanvas.getContext('webgl') as WebGLRenderingContext;\n // @ts-ignore used for sanity checks outside of imagefx\n this.gl = gl;\n if (!gl) {\n log('filter: cannot get webgl context');\n return;\n }\n\n function resize(width, height) {\n if (width === fxcanvas.width && height === fxcanvas.height) return; // Same width/height? Nothing to do here\n fxcanvas.width = width;\n fxcanvas.height = height;\n if (!vertexBuffer) { // Create the context if we don't have it yet\n const vertices = new Float32Array([-1, -1, 0, 1, 1, -1, 1, 1, -1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 1, 1, 1, 1, 1, 0]); // Create the vertex buffer for the two triangles [x, y, u, v] * 6\n vertexBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n }\n gl.viewport(0, 0, fxcanvas.width, fxcanvas.height);\n tempFramebuffers = [null, null]; // Delete old temp framebuffers\n }\n\n function createFramebufferTexture(width, height) {\n const fbo = gl.createFramebuffer() as WebGLFramebuffer;\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n const renderbuffer = gl.createRenderbuffer();\n gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);\n const texture = gl.createTexture() as WebGLTexture;\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n return { fbo, texture };\n }\n\n function getTempFramebuffer(index): { fbo: WebGLFramebuffer | null, texture: WebGLTexture | null } {\n tempFramebuffers[index] = tempFramebuffers[index] || createFramebufferTexture(fxcanvas.width, fxcanvas.height);\n return tempFramebuffers[index] as { fbo: WebGLFramebuffer, texture: WebGLTexture };\n }\n\n function draw(flags = 0) {\n if (!currentProgram) return;\n let source: WebGLTexture | null = null;\n let target: WebGLFramebuffer | null = null;\n let flipY = false;\n if (drawCount === 0) source = sourceTexture; // First draw call - use the source texture\n else source = getTempFramebuffer(currentFramebufferIndex).texture || null; // All following draw calls use the temp buffer last drawn to\n drawCount++;\n if (lastInChain && !(flags & DRAW.INTERMEDIATE)) { // Last filter in our chain - draw directly to the WebGL Canvas. We may also have to flip the image vertically now\n target = null;\n flipY = drawCount % 2 === 0;\n } else {\n currentFramebufferIndex = (currentFramebufferIndex + 1) % 2;\n target = getTempFramebuffer(currentFramebufferIndex).fbo || null; // Intermediate draw call - get a temp buffer to draw to\n }\n gl.bindTexture(gl.TEXTURE_2D, source); // Bind the source and target and draw the two triangles\n gl.bindFramebuffer(gl.FRAMEBUFFER, target);\n gl.uniform1f(currentProgram.uniform['flipY'], (flipY ? -1 : 1));\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n\n function compileShader(fragmentSource): GLProgram | null {\n if (shaderProgramCache[fragmentSource]) {\n currentProgram = shaderProgramCache[fragmentSource];\n gl.useProgram((currentProgram ? currentProgram.id : null) || null);\n return currentProgram as GLProgram;\n }\n currentProgram = new GLProgram(gl, shaders.vertexIdentity, fragmentSource);\n if (!currentProgram) {\n log('filter: could not get webgl program');\n return null;\n }\n const floatSize = Float32Array.BYTES_PER_ELEMENT;\n const vertSize = 4 * floatSize;\n gl.enableVertexAttribArray(currentProgram.attribute['pos']);\n gl.vertexAttribPointer(currentProgram.attribute['pos'], 2, gl.FLOAT, false, vertSize, 0 * floatSize);\n gl.enableVertexAttribArray(currentProgram.attribute['uv']);\n gl.vertexAttribPointer(currentProgram.attribute['uv'], 2, gl.FLOAT, false, vertSize, 2 * floatSize);\n shaderProgramCache[fragmentSource] = currentProgram;\n return currentProgram as GLProgram;\n }\n\n const filter = {\n colorMatrix: (matrix) => { // general color matrix filter\n const m = new Float32Array(matrix);\n m[4] /= 255;\n m[9] /= 255;\n m[14] /= 255;\n m[19] /= 255;\n const shader = (m[18] === 1 && m[3] === 0 && m[8] === 0 && m[13] === 0 && m[15] === 0 && m[16] === 0 && m[17] === 0 && m[19] === 0) // Can we ignore the alpha value? Makes things a bit faster.\n ? shaders.colorMatrixWithoutAlpha\n : shaders.colorMatrixWithAlpha;\n const program = compileShader(shader);\n if (!program) return;\n gl.uniform1fv(program.uniform['m'], m);\n draw();\n },\n\n brightness: (brightness) => {\n const b = (brightness || 0) + 1;\n filter.colorMatrix([\n b, 0, 0, 0, 0,\n 0, b, 0, 0, 0,\n 0, 0, b, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n saturation: (amount) => {\n const x = (amount || 0) * 2 / 3 + 1;\n const y = ((x - 1) * -0.5);\n filter.colorMatrix([\n x, y, y, 0, 0,\n y, x, y, 0, 0,\n y, y, x, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n desaturate: () => {\n filter.saturation(-1);\n },\n\n contrast: (amount) => {\n const v = (amount || 0) + 1;\n const o = -128 * (v - 1);\n filter.colorMatrix([\n v, 0, 0, 0, o,\n 0, v, 0, 0, o,\n 0, 0, v, 0, o,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n negative: () => {\n filter.contrast(-2);\n },\n\n hue: (rotation) => {\n rotation = (rotation || 0) / 180 * Math.PI;\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n const lumR = 0.213;\n const lumG = 0.715;\n const lumB = 0.072;\n filter.colorMatrix([\n lumR + cos * (1 - lumR) + sin * (-lumR), lumG + cos * (-lumG) + sin * (-lumG), lumB + cos * (-lumB) + sin * (1 - lumB), 0, 0,\n lumR + cos * (-lumR) + sin * (0.143), lumG + cos * (1 - lumG) + sin * (0.140), lumB + cos * (-lumB) + sin * (-0.283), 0, 0,\n lumR + cos * (-lumR) + sin * (-(1 - lumR)), lumG + cos * (-lumG) + sin * (lumG), lumB + cos * (1 - lumB) + sin * (lumB), 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n desaturateLuminance: () => {\n filter.colorMatrix([\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n sepia: () => {\n filter.colorMatrix([\n 0.393, 0.7689999, 0.18899999, 0, 0,\n 0.349, 0.6859999, 0.16799999, 0, 0,\n 0.272, 0.5339999, 0.13099999, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n brownie: () => {\n filter.colorMatrix([\n 0.5997023498159715, 0.34553243048391263, -0.2708298674538042, 0, 47.43192855600873,\n -0.037703249837783157, 0.8609577587992641, 0.15059552388459913, 0, -36.96841498319127,\n 0.24113635128153335, -0.07441037908422492, 0.44972182064877153, 0, -7.562075277591283,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n vintagePinhole: () => {\n filter.colorMatrix([\n 0.6279345635605994, 0.3202183420819367, -0.03965408211312453, 0, 9.651285835294123,\n 0.02578397704808868, 0.6441188644374771, 0.03259127616149294, 0, 7.462829176470591,\n 0.0466055556782719, -0.0851232987247891, 0.5241648018700465, 0, 5.159190588235296,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n kodachrome: () => {\n filter.colorMatrix([\n 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n technicolor: () => {\n filter.colorMatrix([\n 1.9125277891456083, -0.8545344976951645, -0.09155508482755585, 0, 11.793603434377337,\n -0.3087833385928097, 1.7658908555458428, -0.10601743074722245, 0, -70.35205161461398,\n -0.231103377548616, -0.7501899197440212, 1.847597816108189, 0, 30.950940869491138,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n polaroid: () => {\n filter.colorMatrix([\n 1.438, -0.062, -0.062, 0, 0,\n -0.122, 1.378, -0.122, 0, 0,\n -0.016, -0.016, 1.483, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n shiftToBGR: () => {\n filter.colorMatrix([\n 0, 0, 1, 0, 0,\n 0, 1, 0, 0, 0,\n 1, 0, 0, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n convolution: (matrix) => { // general convolution Filter\n const m = new Float32Array(matrix);\n const pixelSizeX = 1 / fxcanvas.width;\n const pixelSizeY = 1 / fxcanvas.height;\n const program = compileShader(shaders.convolution);\n if (!program) return;\n gl.uniform1fv(program.uniform['m'], m);\n gl.uniform2f(program.uniform['px'], pixelSizeX, pixelSizeY);\n draw();\n },\n\n detectEdges: () => {\n // @ts-ignore this\n filter.convolution.call(this, [\n 0, 1, 0,\n 1, -4, 1,\n 0, 1, 0,\n ]);\n },\n\n sobelX: () => {\n // @ts-ignore this\n filter.convolution.call(this, [\n -1, 0, 1,\n -2, 0, 2,\n -1, 0, 1,\n ]);\n },\n\n sobelY: () => {\n // @ts-ignore this\n filter.convolution.call(this, [\n -1, -2, -1,\n 0, 0, 0,\n 1, 2, 1,\n ]);\n },\n\n sharpen: (amount) => {\n const a = amount || 1;\n // @ts-ignore this\n filter.convolution.call(this, [\n 0, -1 * a, 0,\n -1 * a, 1 + 4 * a, -1 * a,\n 0, -1 * a, 0,\n ]);\n },\n\n emboss: (size) => {\n const s = size || 1;\n // @ts-ignore this\n filter.convolution.call(this, [\n -2 * s, -1 * s, 0,\n -1 * s, 1, 1 * s,\n 0, 1 * s, 2 * s,\n ]);\n },\n\n blur: (size) => {\n const blurSizeX = (size / 7) / fxcanvas.width;\n const blurSizeY = (size / 7) / fxcanvas.height;\n const program = compileShader(shaders.blur);\n if (!program) return;\n // Vertical\n gl.uniform2f(program.uniform['px'], 0, blurSizeY);\n draw(DRAW.INTERMEDIATE);\n // Horizontal\n gl.uniform2f(program.uniform['px'], blurSizeX, 0);\n draw();\n },\n\n pixelate: (size) => {\n const blurSizeX = (size) / fxcanvas.width;\n const blurSizeY = (size) / fxcanvas.height;\n const program = compileShader(shaders.pixelate);\n if (!program) return;\n gl.uniform2f(program.uniform['size'], blurSizeX, blurSizeY);\n draw();\n },\n };\n\n // @ts-ignore this\n this.add = function (name) {\n // eslint-disable-next-line prefer-rest-params\n const args = Array.prototype.slice.call(arguments, 1);\n const func = filter[name];\n filterChain.push({ func, args });\n };\n\n // @ts-ignore this\n this.reset = function () {\n filterChain = [];\n };\n\n // @ts-ignore this\n this.get = function () {\n return filterChain;\n };\n\n // @ts-ignore this\n this.apply = function (image) {\n resize(image.width, image.height);\n drawCount = 0;\n if (!sourceTexture) sourceTexture = gl.createTexture(); // Create the texture for the input image if we haven't yet\n gl.bindTexture(gl.TEXTURE_2D, sourceTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n for (let i = 0; i < filterChain.length; i++) {\n lastInChain = (i === filterChain.length - 1);\n const f = filterChain[i];\n // @ts-ignore function assigment\n f.func.apply(this, f.args || []);\n }\n return fxcanvas;\n };\n\n // @ts-ignore this\n this.draw = function (image) {\n this.add('brightness', 0);\n return this.apply(image);\n };\n}\n", "/**\n * Image enhancements\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport type { Tensor } from '../exports';\n\nexport async function histogramEqualization(inputImage: Tensor): Promise {\n // const maxValue = 254; // using 255 results in values slightly larger than 1 due to math rounding errors\n const squeeze = inputImage.shape.length === 4 ? tf.squeeze(inputImage) : inputImage;\n const channels = tf.split(squeeze, 3, 2);\n const min: Tensor[] = [tf.min(channels[0]), tf.min(channels[1]), tf.min(channels[2])];\n const max: Tensor[] = [tf.max(channels[0]), tf.max(channels[1]), tf.max(channels[2])];\n const absMax = await Promise.all(max.map((channel) => channel.data()));\n const maxValue = 0.99 * Math.max(absMax[0][0], absMax[1][0], absMax[2][0]);\n const sub = [tf.sub(channels[0], min[0]), tf.sub(channels[1], min[1]), tf.sub(channels[2], min[2])];\n const range = [tf.sub(max[0], min[0]), tf.sub(max[1], min[1]), tf.sub(max[2], min[2])];\n const fact = [tf.div(maxValue, range[0]), tf.div(maxValue, range[1]), tf.div(maxValue, range[2])];\n const enh = [tf.mul(sub[0], fact[0]), tf.mul(sub[1], fact[1]), tf.mul(sub[2], fact[2])];\n const rgb = tf.stack([enh[0], enh[1], enh[2]], 2);\n const reshape = tf.reshape(rgb, [1, squeeze.shape[0], squeeze.shape[1], 3]);\n tf.dispose([...channels, ...min, ...max, ...sub, ...range, ...fact, ...enh, rgb, squeeze]);\n return reshape; // output shape is [1, height, width, 3]\n}\n", "/**\n * Image Processing algorithm implementation\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as fxImage from './imagefx';\nimport type { Input, AnyCanvas, Tensor, Config } from '../exports';\nimport { env } from '../util/env';\nimport { log } from '../util/util';\nimport * as enhance from './enhance';\n\nconst maxSize = 2048;\n// internal temp canvases\nlet inCanvas: AnyCanvas | null = null; // use global variable to avoid recreating canvas on each frame\nlet outCanvas: AnyCanvas | null = null; // use global variable to avoid recreating canvas on each frame\nlet tmpCanvas: AnyCanvas | null = null; // use global variable to avoid recreating canvas on each frame\n// @ts-ignore // imagefx is js module that should be converted to a class\nlet fx: fxImage.GLImageFilter | null; // instance of imagefx\n\nconst last: { inputSum: number, cacheDiff: number, sumMethod: number, inputTensor: undefined | Tensor } = {\n inputSum: 0,\n cacheDiff: 1,\n sumMethod: 0,\n inputTensor: undefined,\n};\n\nexport function canvas(width: number, height: number): AnyCanvas {\n let c;\n if (env.browser) { // browser defines canvas object\n if (env.worker) { // if runing in web worker use OffscreenCanvas\n if (typeof OffscreenCanvas === 'undefined') throw new Error('canvas error: attempted to run in web worker but OffscreenCanvas is not supported');\n c = new OffscreenCanvas(width, height);\n } else { // otherwise use DOM canvas\n if (typeof document === 'undefined') throw new Error('canvas error: attempted to run in browser but DOM is not defined');\n c = document.createElement('canvas');\n c.width = width;\n c.height = height;\n }\n } else { // if not running in browser, there is no \"default\" canvas object, so we need monkey patch or fail\n // @ts-ignore // env.canvas is an external monkey-patch\n if (typeof env.Canvas !== 'undefined') c = new env.Canvas(width, height);\n else if (typeof globalThis.Canvas !== 'undefined') c = new globalThis.Canvas(width, height);\n // else throw new Error('canvas error: attempted to use canvas in nodejs without canvas support installed');\n }\n return c;\n}\n\n// helper function to copy canvas from input to output\nexport function copy(input: AnyCanvas, output?: AnyCanvas) {\n const outputCanvas = output || canvas(input.width, input.height);\n const ctx = outputCanvas.getContext('2d') as CanvasRenderingContext2D;\n ctx.drawImage(input, 0, 0);\n return outputCanvas;\n}\n\n// process input image and return tensor\n// input can be tensor, imagedata, htmlimageelement, htmlvideoelement\n// input is resized and run through imagefx filter\nexport async function process(input: Input, config: Config, getTensor: boolean = true): Promise<{ tensor: Tensor | null, canvas: AnyCanvas | null }> {\n if (!input) {\n // throw new Error('input is missing');\n if (config.debug) log('input error: input is missing');\n return { tensor: null, canvas: null }; // video may become temporarily unavailable due to onresize\n }\n // sanity checks since different browsers do not implement all dom elements\n if (\n !(input instanceof tf.Tensor)\n && !(typeof Image !== 'undefined' && input instanceof Image)\n && !(typeof env.Canvas !== 'undefined' && input instanceof env.Canvas)\n && !(typeof globalThis.Canvas !== 'undefined' && input instanceof globalThis.Canvas)\n && !(typeof ImageData !== 'undefined' && input instanceof ImageData)\n && !(typeof ImageBitmap !== 'undefined' && input instanceof ImageBitmap)\n && !(typeof HTMLImageElement !== 'undefined' && input instanceof HTMLImageElement)\n && !(typeof HTMLMediaElement !== 'undefined' && input instanceof HTMLMediaElement)\n && !(typeof HTMLVideoElement !== 'undefined' && input instanceof HTMLVideoElement)\n && !(typeof HTMLCanvasElement !== 'undefined' && input instanceof HTMLCanvasElement)\n && !(typeof OffscreenCanvas !== 'undefined' && input instanceof OffscreenCanvas)\n ) {\n throw new Error('input error: type is not recognized');\n }\n if (input instanceof tf.Tensor) { // if input is tensor use as-is without filters but correct shape as needed\n let tensor: Tensor | null = null;\n if ((input as Tensor)['isDisposedInternal']) throw new Error('input error: attempted to use tensor but it is disposed');\n if (!(input as Tensor)['shape']) throw new Error('input error: attempted to use tensor without a shape');\n if ((input as Tensor).shape.length === 3) { // [height, width, 3 || 4]\n if ((input as Tensor).shape[2] === 3) { // [height, width, 3] so add batch\n tensor = tf.expandDims(input, 0);\n } else if ((input as Tensor).shape[2] === 4) { // [height, width, 4] so strip alpha and add batch\n const rgb = tf.slice3d(input, [0, 0, 0], [-1, -1, 3]);\n tensor = tf.expandDims(rgb, 0);\n tf.dispose(rgb);\n }\n } else if ((input as Tensor).shape.length === 4) { // [1, width, height, 3 || 4]\n if ((input as Tensor).shape[3] === 3) { // [1, width, height, 3] just clone\n tensor = tf.clone(input);\n } else if ((input as Tensor).shape[3] === 4) { // [1, width, height, 4] so strip alpha\n tensor = tf.slice4d(input, [0, 0, 0, 0], [-1, -1, -1, 3]);\n }\n }\n // at the end shape must be [1, height, width, 3]\n if (tensor == null || tensor.shape.length !== 4 || tensor.shape[0] !== 1 || tensor.shape[3] !== 3) throw new Error(`input error: attempted to use tensor with unrecognized shape: ${input['shape']}`);\n if ((tensor as Tensor).dtype === 'int32') {\n const cast = tf.cast(tensor, 'float32');\n tf.dispose(tensor);\n tensor = cast;\n }\n return { tensor, canvas: (config.filter.return ? outCanvas : null) };\n } else {\n // check if resizing will be needed\n if (typeof input['readyState'] !== 'undefined' && input['readyState'] <= 2) {\n if (config.debug) log('input stream is not ready');\n return { tensor: null, canvas: inCanvas }; // video may become temporarily unavailable due to onresize\n }\n const originalWidth = input['naturalWidth'] || input['videoWidth'] || input['width'] || (input['shape'] && (input['shape'][1] > 0));\n const originalHeight = input['naturalHeight'] || input['videoHeight'] || input['height'] || (input['shape'] && (input['shape'][2] > 0));\n if (!originalWidth || !originalHeight) {\n if (config.debug) log('cannot determine input dimensions');\n return { tensor: null, canvas: inCanvas }; // video may become temporarily unavailable due to onresize\n }\n let targetWidth = originalWidth;\n let targetHeight = originalHeight;\n if (targetWidth > maxSize) {\n targetWidth = maxSize;\n targetHeight = Math.trunc(targetWidth * originalHeight / originalWidth);\n }\n if (targetHeight > maxSize) {\n targetHeight = maxSize;\n targetWidth = Math.trunc(targetHeight * originalWidth / originalHeight);\n }\n\n // create our canvas and resize it if needed\n if ((config.filter.width || 0) > 0) targetWidth = config.filter.width;\n else if ((config.filter.height || 0) > 0) targetWidth = originalWidth * ((config.filter.height || 0) / originalHeight);\n if ((config.filter.height || 0) > 0) targetHeight = config.filter.height;\n else if ((config.filter.width || 0) > 0) targetHeight = originalHeight * ((config.filter.width || 0) / originalWidth);\n if (!targetWidth || !targetHeight) throw new Error('input error: cannot determine dimension');\n if (!inCanvas || (inCanvas?.width !== targetWidth) || (inCanvas?.height !== targetHeight)) inCanvas = canvas(targetWidth, targetHeight);\n\n // draw input to our canvas\n const inCtx = inCanvas.getContext('2d') as CanvasRenderingContext2D;\n if ((typeof ImageData !== 'undefined') && (input instanceof ImageData)) {\n inCtx.putImageData(input, 0, 0);\n } else {\n if (config.filter.flip && typeof inCtx.translate !== 'undefined') {\n inCtx.translate(originalWidth, 0);\n inCtx.scale(-1, 1);\n inCtx.drawImage(input as AnyCanvas, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas?.width, inCanvas?.height);\n inCtx.setTransform(1, 0, 0, 1, 0, 0); // resets transforms to defaults\n } else {\n inCtx.drawImage(input as AnyCanvas, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas?.width, inCanvas?.height);\n }\n }\n\n if (!outCanvas || (inCanvas.width !== outCanvas.width) || (inCanvas?.height !== outCanvas?.height)) outCanvas = canvas(inCanvas.width, inCanvas.height); // init output canvas\n\n // imagefx transforms using gl from input canvas to output canvas\n if (config.filter.enabled && env.webgl.supported) {\n if (!fx) fx = env.browser ? new fxImage.GLImageFilter() : null; // && (typeof document !== 'undefined')\n env.filter = !!fx;\n if (!fx || !fx.add) {\n if (config.debug) log('input process error: cannot initialize filters');\n return { tensor: null, canvas: inCanvas };\n }\n fx.reset();\n if (config.filter.brightness !== 0) fx.add('brightness', config.filter.brightness);\n if (config.filter.contrast !== 0) fx.add('contrast', config.filter.contrast);\n if (config.filter.sharpness !== 0) fx.add('sharpen', config.filter.sharpness);\n if (config.filter.blur !== 0) fx.add('blur', config.filter.blur);\n if (config.filter.saturation !== 0) fx.add('saturation', config.filter.saturation);\n if (config.filter.hue !== 0) fx.add('hue', config.filter.hue);\n if (config.filter.negative) fx.add('negative');\n if (config.filter.sepia) fx.add('sepia');\n if (config.filter.vintage) fx.add('brownie');\n if (config.filter.sepia) fx.add('sepia');\n if (config.filter.kodachrome) fx.add('kodachrome');\n if (config.filter.technicolor) fx.add('technicolor');\n if (config.filter.polaroid) fx.add('polaroid');\n if (config.filter.pixelate !== 0) fx.add('pixelate', config.filter.pixelate);\n if (fx.get() > 0) outCanvas = fx.apply(inCanvas);\n else outCanvas = fx.draw(inCanvas);\n } else {\n copy(inCanvas, outCanvas); // if no filters applied, output canvas is input canvas\n if (fx) fx = null;\n env.filter = !!fx;\n }\n\n if (!getTensor) return { tensor: null, canvas: outCanvas }; // just canvas was requested\n if (!outCanvas) throw new Error('canvas error: cannot create output');\n\n // create tensor from image unless input was a tensor already\n let pixels;\n let depth = 3;\n if ((typeof ImageData !== 'undefined' && input instanceof ImageData) || (input['data'] && input['width'] && input['height'])) { // if input is imagedata, just use it\n if (env.browser && tf.browser) {\n pixels = tf.browser ? tf.browser.fromPixels(input) : null;\n } else {\n depth = input['data'].length / input['height'] / input['width'];\n // const arr = Uint8Array.from(input['data']);\n const arr = new Uint8Array(input['data']['buffer']);\n pixels = tf.tensor(arr, [input['height'], input['width'], depth], 'int32');\n }\n } else {\n if (!tmpCanvas || (outCanvas.width !== tmpCanvas.width) || (outCanvas.height !== tmpCanvas.height)) tmpCanvas = canvas(outCanvas.width, outCanvas.height); // init output canvas\n if (tf.browser && env.browser) {\n if (config.backend === 'webgl' || config.backend === 'humangl' || config.backend === 'webgpu') {\n pixels = tf.browser.fromPixels(outCanvas); // safe to reuse since both backend and context are gl based\n } else {\n tmpCanvas = copy(outCanvas); // cannot use output canvas as it already has gl context so we do a silly one more canvas\n pixels = tf.browser.fromPixels(tmpCanvas);\n }\n } else {\n const tempCanvas = copy(outCanvas); // cannot use output canvas as it already has gl context so we do a silly one more canvas\n const tempCtx = tempCanvas.getContext('2d') as CanvasRenderingContext2D;\n const tempData = tempCtx.getImageData(0, 0, targetWidth, targetHeight);\n depth = tempData.data.length / targetWidth / targetHeight;\n const arr = new Uint8Array(tempData.data.buffer);\n pixels = tf.tensor(arr, [targetWidth, targetHeight, depth]);\n }\n }\n if (depth === 4) { // rgba to rgb\n const rgb = tf.slice3d(pixels, [0, 0, 0], [-1, -1, 3]); // strip alpha channel\n tf.dispose(pixels);\n pixels = rgb;\n }\n if (!pixels) throw new Error('input error: cannot create tensor');\n const casted = tf.cast(pixels, 'float32');\n const tensor = config.filter.equalization ? await enhance.histogramEqualization(casted) : tf.expandDims(casted, 0);\n tf.dispose([pixels, casted]);\n return { tensor, canvas: (config.filter.return ? outCanvas : null) };\n }\n}\n\n/*\nconst checksum = async (input: Tensor): Promise => { // use tf sum or js based sum loop depending on which is faster\n const resizeFact = 48;\n const reduced: Tensor = tf.image.resizeBilinear(input, [Math.trunc((input.shape[1] || 1) / resizeFact), Math.trunc((input.shape[2] || 1) / resizeFact)]);\n const tfSum = async (): Promise => {\n const sumT = tf.sum(reduced);\n const sum0 = await sumT.data();\n tf.dispose(sumT);\n return sum0[0];\n };\n const jsSum = async (): Promise => {\n const reducedData = await reduced.data(); // raw image rgb array\n let sum0 = 0;\n for (let i = 0; i < reducedData.length / 3; i++) sum0 += reducedData[3 * i + 2]; // look only at green value of each pixel\n return sum0;\n };\n if (last.sumMethod === 0) {\n const t0 = now();\n await jsSum();\n const t1 = now();\n await tfSum();\n const t2 = now();\n last.sumMethod = t1 - t0 < t2 - t1 ? 1 : 2;\n }\n const res = last.sumMethod === 1 ? await jsSum() : await tfSum();\n tf.dispose(reduced);\n return res;\n};\n*/\n\nexport async function skip(config: Partial, input: Tensor) {\n let skipFrame = false;\n if (config.cacheSensitivity === 0 || !input.shape || input.shape.length !== 4 || input.shape[1] > 2048 || input.shape[2] > 2048) return skipFrame; // cache disabled or input is invalid or too large for cache analysis\n\n /*\n const checkSum = await checksum(input);\n const diff = 100 * (Math.max(checkSum, last.inputSum) / Math.min(checkSum, last.inputSum) - 1);\n last.inputSum = checkSum;\n // if previous frame was skipped, skip this frame if changed more than cacheSensitivity\n // if previous frame was not skipped, then look for cacheSensitivity or difference larger than one in previous frame to avoid resetting cache in subsequent frames unnecessarily\n let skipFrame = diff < Math.max(config.cacheSensitivity, last.cacheDiff);\n // if difference is above 10x threshold, don't use last value to force reset cache for significant change of scenes or images\n last.cacheDiff = diff > 10 * config.cacheSensitivity ? 0 : diff;\n skipFrame = skipFrame && (last.cacheDiff > 0); // if no cached diff value then force no skip\n */\n\n if (!last.inputTensor) {\n last.inputTensor = tf.clone(input);\n } else if (last.inputTensor.shape[1] !== input.shape[1] || last.inputTensor.shape[2] !== input.shape[2]) { // input resolution changed\n tf.dispose(last.inputTensor);\n last.inputTensor = tf.clone(input);\n } else {\n const t: Record = {};\n t.diff = tf.sub(input, last.inputTensor);\n t.squared = tf.mul(t.diff, t.diff);\n t.sum = tf.sum(t.squared);\n const diffSum = await t.sum.data();\n const diffRelative = diffSum[0] / (input.shape[1] || 1) / (input.shape[2] || 1) / 255 / 3; // squared difference relative to input resolution and averaged per channel\n tf.dispose([last.inputTensor, t.diff, t.squared, t.sum]);\n last.inputTensor = tf.clone(input);\n skipFrame = diffRelative <= (config.cacheSensitivity || 0);\n }\n return skipFrame;\n}\n\nexport async function compare(config: Partial, input1: Tensor, input2: Tensor): Promise {\n const t: Record = {};\n if (!input1 || !input2 || input1.shape.length !== 4 || input1.shape.length !== input2.shape.length) {\n if (!config.debug) log('invalid input tensor or tensor shapes do not match:', input1.shape, input2.shape);\n return 0;\n }\n if (input1.shape[0] !== 1 || input2.shape[0] !== 1 || input1.shape[3] !== 3 || input2.shape[3] !== 3) {\n if (!config.debug) log('input tensors must be of shape [1, height, width, 3]:', input1.shape, input2.shape);\n return 0;\n }\n t.input1 = tf.clone(input1);\n t.input2 = (input1.shape[1] !== input2.shape[1] || input1.shape[2] !== input2.shape[2]) ? tf.image.resizeBilinear(input2, [input1.shape[1], input1.shape[2]]) : tf.clone(input2);\n t.diff = tf.sub(t.input1, t.input2);\n t.squared = tf.mul(t.diff, t.diff);\n t.sum = tf.sum(t.squared);\n const diffSum = await t.sum.data();\n const diffRelative = diffSum[0] / (input1.shape[1] || 1) / (input1.shape[2] || 1) / 255 / 3;\n tf.dispose([t.input1, t.input2, t.diff, t.squared, t.sum]);\n return diffRelative;\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as image from '../image/image';\n\n/** Env class that holds detected capabilities */\nexport class Env {\n /** Running in Browser */\n browser: boolean;\n /** Running in NodeJS */\n node: boolean;\n /** Running in WebWorker thread */\n worker: boolean;\n /** Detected platform */\n platform: string = '';\n /** Detected agent */\n agent: string = '';\n /** List of supported backends */\n backends: string[] = [];\n /** Has any work been performed so far */\n initial: boolean;\n /** Are image filters supported? */\n filter: boolean | undefined;\n /** TFJS instance details */\n tfjs: {\n version: undefined | string,\n };\n /** Is offscreenCanvas supported? */\n offscreen: undefined | boolean;\n /** Are performance counter instant values or additive */\n perfadd: boolean = false;\n /** WASM detected capabilities */\n wasm: {\n supported: undefined | boolean,\n backend: undefined | boolean,\n simd: undefined | boolean,\n multithread: undefined | boolean,\n } = {\n supported: undefined,\n backend: undefined,\n simd: undefined,\n multithread: undefined,\n };\n /** WebGL detected capabilities */\n webgl: {\n supported: undefined | boolean,\n backend: undefined | boolean,\n version: undefined | string,\n renderer: undefined | string,\n } = {\n supported: undefined,\n backend: undefined,\n version: undefined,\n renderer: undefined,\n };\n /** WebGPU detected capabilities */\n webgpu: {\n supported: undefined | boolean,\n backend: undefined | boolean,\n adapter: undefined | string,\n } = {\n supported: undefined,\n backend: undefined,\n adapter: undefined,\n };\n /** CPU info */\n cpu: {\n model: undefined | string,\n flags: string[],\n } = {\n model: undefined,\n flags: [],\n };\n /** List of supported kernels for current backend */\n kernels: string[] = [];\n /** MonkeyPatch for Canvas */\n Canvas: undefined;\n /** MonkeyPatch for Image */\n Image: undefined;\n /** MonkeyPatch for ImageData */\n ImageData: undefined;\n\n constructor() {\n this.browser = typeof navigator !== 'undefined';\n this.node = (typeof process !== 'undefined') && (typeof process.versions !== 'undefined') && (typeof process.versions.node !== 'undefined');\n this.tfjs = { version: tf.version['tfjs-core'] };\n this.offscreen = typeof OffscreenCanvas !== 'undefined';\n this.initial = true;\n // @ts-ignore WorkerGlobalScope evaluated in browser only\n this.worker = this.browser && this.offscreen ? (typeof WorkerGlobalScope !== 'undefined') : undefined;\n if (typeof navigator !== 'undefined') {\n const raw = navigator.userAgent.match(/\\(([^()]+)\\)/g);\n if (raw && raw[0]) {\n const platformMatch = raw[0].match(/\\(([^()]+)\\)/g);\n this.platform = (platformMatch && platformMatch[0]) ? platformMatch[0].replace(/\\(|\\)/g, '') : '';\n this.agent = navigator.userAgent.replace(raw[0], '');\n if (this.platform[1]) this.agent = this.agent.replace(raw[1], '');\n this.agent = this.agent.replace(/ /g, ' ');\n // chrome offscreencanvas gpu memory leak\n /*\n const isChrome = env.agent.match(/Chrome\\/.[0-9]/g);\n const verChrome = isChrome && isChrome[0] ? isChrome[0].split('/')[1] : 0;\n if (verChrome > 92 && verChrome < 96) {\n log('disabling offscreenCanvas due to browser error:', isChrome ? isChrome[0] : 'unknown');\n this.offscreen = false;\n }\n */\n }\n } else if (typeof process !== 'undefined') {\n this.platform = `${process.platform} ${process.arch}`;\n this.agent = `NodeJS ${process.version}`;\n }\n }\n\n /** update backend information */\n async updateBackend() {\n // analyze backends\n this.backends = Object.keys(tf.engine().registryFactory);\n this.wasm.supported = typeof WebAssembly !== 'undefined';\n this.wasm.backend = this.backends.includes('wasm');\n if (this.wasm.supported && this.wasm.backend && tf.getBackend() === 'wasm') {\n this.wasm.simd = await tf.env().getAsync('WASM_HAS_SIMD_SUPPORT');\n this.wasm.multithread = await tf.env().getAsync('WASM_HAS_MULTITHREAD_SUPPORT');\n }\n const c = image.canvas(100, 100);\n const ctx = c ? c.getContext('webgl2') : undefined; // causes too many gl contexts\n // const ctx = typeof tf.backend().getGPGPUContext !== undefined ? tf.backend().getGPGPUContext : null;\n this.webgl.supported = typeof ctx !== 'undefined';\n this.webgl.backend = this.backends.includes('webgl');\n if (this.webgl.supported && this.webgl.backend && (tf.getBackend() === 'webgl' || tf.getBackend() === 'humangl')) {\n // @ts-ignore getGPGPUContext only exists on WebGL backend\n const gl = tf.backend().gpgpu !== 'undefined' ? await tf.backend().getGPGPUContext().gl : null;\n if (gl) {\n this.webgl.version = gl.getParameter(gl.VERSION);\n this.webgl.renderer = gl.getParameter(gl.RENDERER);\n }\n }\n // @ts-ignore navigator.gpu is only defined when webgpu is available in browser\n this.webgpu.supported = this.browser && typeof navigator['gpu'] !== 'undefined';\n this.webgpu.backend = this.backends.includes('webgpu');\n try {\n // @ts-ignore navigator.gpu is only defined when webgpu is available in browser\n if (this.webgpu.supported) this.webgpu.adapter = (await navigator['gpu'].requestAdapter()).name;\n } catch {\n this.webgpu.supported = false;\n }\n try {\n this.kernels = tf.getKernelsForBackend(tf.getBackend()).map((kernel) => kernel.kernelName.toLowerCase());\n } catch { /**/ }\n }\n\n /** update cpu information */\n async updateCPU() {\n const cpu = { model: '', flags: [] };\n if (this.node && this.platform.startsWith('linux')) {\n /*\n // eslint-disable-next-line global-require\n const fs = require('fs');\n try {\n const data = fs.readFileSync('/proc/cpuinfo').toString();\n for (const line of data.split('\\n')) {\n if (line.startsWith('model name')) {\n cpu.model = line.match(/:(.*)/g)[0].replace(':', '').trim();\n }\n if (line.startsWith('flags')) {\n cpu.flags = line.match(/:(.*)/g)[0].replace(':', '').trim().split(' ').sort();\n }\n }\n } catch { }\n */\n }\n if (!this['cpu']) Object.defineProperty(this, 'cpu', { value: cpu });\n else this['cpu'] = cpu;\n }\n}\n\nexport const env = new Env();\n", "import { log, join } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport type { GraphModel } from './types';\nimport type { Config } from '../config';\n\nconst options = {\n cacheModels: false,\n verbose: true,\n debug: false,\n modelBasePath: '',\n};\n\nasync function httpHandler(url, init?): Promise {\n if (options.debug) log('load model fetch:', url, init);\n return fetch(url, init);\n}\n\nexport function setModelLoadOptions(config: Config) {\n options.cacheModels = config.cacheModels;\n options.verbose = config.debug;\n options.modelBasePath = config.modelBasePath;\n}\n\nexport async function loadModel(modelPath: string | undefined): Promise {\n const modelUrl = join(options.modelBasePath, modelPath || '');\n const modelPathSegments = modelUrl.split('/');\n const cachedModelName = 'indexeddb://' + modelPathSegments[modelPathSegments.length - 1].replace('.json', ''); // generate short model name for cache\n const cachedModels = await tf.io.listModels(); // list all models already in cache\n const modelCached = options.cacheModels && Object.keys(cachedModels).includes(cachedModelName); // is model found in cache\n const tfLoadOptions = typeof fetch === 'undefined' ? {} : { fetchFunc: (url, init?) => httpHandler(url, init) };\n const model: GraphModel = new tf.GraphModel(modelCached ? cachedModelName : modelUrl, tfLoadOptions) as unknown as GraphModel; // create model prototype and decide if load from cache or from original modelurl\n try {\n // @ts-ignore private function\n model.findIOHandler(); // decide how to actually load a model\n // @ts-ignore private property\n if (options.debug) log('model load handler:', model.handler);\n // @ts-ignore private property\n const artifacts = await model.handler.load(); // load manifest\n model.loadSync(artifacts); // load weights\n if (options.verbose) log('load model:', model['modelUrl']);\n } catch (err) {\n log('error loading model:', modelUrl, err);\n }\n if (options.cacheModels && !modelCached) { // save model to cache\n try {\n const saveResult = await model.save(cachedModelName);\n log('model saved:', cachedModelName, saveResult);\n } catch (err) {\n log('error saving model:', modelUrl, err);\n }\n }\n return model;\n}\n", "/**\n * GEAR [gender/emotion/age/race] model implementation\n *\n * Based on: [**GEAR Predictor**](https://github.com/Udolf15/GEAR-Predictor)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport type { Gender, Race } from '../result';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport { env } from '../util/env';\n\nexport type GearType = { age: number, gender: Gender, genderScore: number, race: Array<{ score: number, race: Race }> }\nlet model: GraphModel | null;\nconst last: Array = [];\nconst raceNames = ['white', 'black', 'asian', 'indian', 'other'];\nconst ageWeights = [15, 23, 28, 35.5, 45.5, 55.5, 65];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function load(config: Config) {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face['gear']);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise {\n if (!model) return { age: 0, gender: 'unknown', genderScore: 0, race: [] };\n const skipFrame = skipped < (config.face['gear']?.skipFrames || 0);\n const skipTime = (config.face['gear']?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && last[idx]) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n if (!model?.inputs[0].shape) return;\n const t: Record = {};\n // t.resize = tf.image.resizeBilinear(image, [model?.inputs[0].shape[2], model?.inputs[0].shape[1]], false);\n const box = [[0.0, 0.10, 0.90, 0.90]]; // empyrical values for top, left, bottom, right\n t.resize = tf.image.cropAndResize(image, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n const obj: GearType = { age: 0, gender: 'unknown', genderScore: 0, race: [] };\n if (config.face['gear']?.enabled) [t.age, t.gender, t.race] = model.execute(t.resize, ['age_output', 'gender_output', 'race_output']) as Tensor[];\n const gender = await t.gender.data();\n obj.gender = gender[0] > gender[1] ? 'male' : 'female';\n obj.genderScore = Math.round(100 * (gender[0] > gender[1] ? gender[0] : gender[1])) / 100;\n const race = await t.race.data();\n for (let i = 0; i < race.length; i++) {\n if (race[i] > (config.face['gear']?.minConfidence || 0.2)) obj.race.push({ score: Math.round(100 * race[i]) / 100, race: raceNames[i] as Race });\n }\n obj.race.sort((a, b) => b.score - a.score);\n // {0: 'Below20', 1: '21-25', 2: '26-30', 3: '31-40',4: '41-50', 5: '51-60', 6: 'Above60'}\n const ageDistribution = Array.from(await t.age.data());\n const ageSorted = ageDistribution.map((a, i) => [ageWeights[i], a]).sort((a, b) => b[1] - a[1]);\n let age = ageSorted[0][0]; // pick best starting point\n for (let i = 1; i < ageSorted.length; i++) age += ageSorted[i][1] * (ageSorted[i][0] - age); // adjust with each other choice by weight\n obj.age = Math.round(10 * age) / 10;\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n last[idx] = obj;\n lastCount = count;\n lastTime = now();\n resolve(obj);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport type { Tensor } from './types';\n\nexport const constants: Record = {\n tf255: 255,\n tf1: 1,\n tf2: 2,\n tf05: 0.5,\n tf127: 127.5,\n rgb: [0.2989, 0.5870, 0.1140],\n};\n\nexport function init() {\n constants.tf255 = tf.scalar(255, 'float32');\n constants.tf1 = tf.scalar(1, 'float32');\n constants.tf2 = tf.scalar(2, 'float32');\n constants.tf05 = tf.scalar(0.5, 'float32');\n constants.tf127 = tf.scalar(127.5, 'float32');\n constants.rgb = tf.tensor1d([0.2989, 0.5870, 0.1140], 'float32'); // factors for red/green/blue colors when converting to grayscale\n}\n", "/**\n * Age model implementation\n *\n * Based on: [**SSR-Net**](https://github.com/shamangary/SSR-Net)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { env } from '../util/env';\nimport { constants } from '../tfjs/constants';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\n\nlet model: GraphModel | null;\nconst last: Array<{ age: number }> = [];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function load(config: Config) {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face['ssrnet'].modelPathAge);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise<{ age: number }> {\n if (!model) return { age: 0 };\n const skipFrame = skipped < (config.face['ssrnet']?.skipFrames || 0);\n const skipTime = (config.face['ssrnet']?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipFrame && skipTime && (lastCount === count) && last[idx]?.age && (last[idx]?.age > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n if (!model?.inputs || !model.inputs[0] || !model.inputs[0].shape) return;\n const t: Record = {};\n t.resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n t.enhance = tf.mul(t.resize, constants.tf255);\n const obj = { age: 0 };\n if (config.face['ssrnet'].enabled) t.age = model.execute(t.enhance) as Tensor;\n if (t.age) {\n const data = await t.age.data();\n obj.age = Math.trunc(10 * data[0]) / 10;\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n last[idx] = obj;\n lastCount = count;\n lastTime = now();\n resolve(obj);\n });\n}\n", "/**\n * Gender model implementation\n *\n * Based on: [**SSR-Net**](https://github.com/shamangary/SSR-Net)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport type { Gender } from '../result';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nconst last: Array<{ gender: Gender, genderScore: number }> = [];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\n// tuning values\nconst rgb = [0.2989, 0.5870, 0.1140]; // factors for red/green/blue colors when converting to grayscale\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function load(config: Config | any) {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face['ssrnet'].modelPathGender);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function predict(image: Tensor, config: Config, idx, count): Promise<{ gender: Gender, genderScore: number }> {\n if (!model) return { gender: 'unknown', genderScore: 0 };\n const skipFrame = skipped < (config.face['ssrnet']?.skipFrames || 0);\n const skipTime = (config.face['ssrnet']?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipFrame && skipTime && (lastCount === count) && last[idx]?.gender && (last[idx]?.genderScore > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n if (!model?.inputs[0].shape) return;\n const t: Record = {};\n t.resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n t.enhance = tf.tidy(() => {\n const [red, green, blue] = tf.split(t.resize, 3, 3);\n const redNorm = tf.mul(red, rgb[0]);\n const greenNorm = tf.mul(green, rgb[1]);\n const blueNorm = tf.mul(blue, rgb[2]);\n const grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\n const normalize = tf.mul(tf.sub(grayscale, constants.tf05), 2); // range grayscale:-1..1\n return normalize;\n });\n const obj: { gender: Gender, genderScore: number } = { gender: 'unknown', genderScore: 0 };\n if (config.face['ssrnet'].enabled) t.gender = model.execute(t.enhance) as Tensor;\n const data = await t.gender.data();\n obj.gender = data[0] > data[1] ? 'female' : 'male'; // returns two values 0..1, bigger one is prediction\n obj.genderScore = data[0] > data[1] ? (Math.trunc(100 * data[0]) / 100) : (Math.trunc(100 * data[1]) / 100);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n last[idx] = obj;\n lastCount = count;\n lastTime = now();\n resolve(obj);\n });\n}\n", "/**\n * Anti-spoofing model implementation\n */\n\nimport { log, now } from '../util/util';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nconst cached: Array = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\nlet lastCount = 0;\nlet lastTime = 0;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.antispoof?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise {\n if (!model) return 0;\n const skipTime = (config.face.antispoof?.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.face.antispoof?.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && cached[idx]) {\n skipped++;\n return cached[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const resize = tf.image.resizeBilinear(image, [model?.inputs[0].shape ? model.inputs[0].shape[2] : 0, model?.inputs[0].shape ? model.inputs[0].shape[1] : 0], false);\n const res = model?.execute(resize) as Tensor;\n const num = (await res.data())[0];\n cached[idx] = Math.round(100 * num) / 100;\n lastCount = count;\n lastTime = now();\n tf.dispose([resize, res]);\n resolve(cached[idx]);\n });\n}\n", "/**\n * BlazeFace, FaceMesh & Iris model implementation\n * See `facemesh.ts` for entry point\n */\n\nexport const meshAnnotations: Record = {\n silhouette: [\n 10, 338, 297, 332, 284, 251, 389, 356, 454, 323, 361, 288,\n 397, 365, 379, 378, 400, 377, 152, 148, 176, 149, 150, 136,\n 172, 58, 132, 93, 234, 127, 162, 21, 54, 103, 67, 109,\n ],\n lipsUpperOuter: [61, 185, 40, 39, 37, 0, 267, 269, 270, 409, 291],\n lipsLowerOuter: [146, 91, 181, 84, 17, 314, 405, 321, 375, 291],\n lipsUpperInner: [78, 191, 80, 81, 82, 13, 312, 311, 310, 415, 308],\n lipsLowerInner: [78, 95, 88, 178, 87, 14, 317, 402, 318, 324, 308],\n rightEyeUpper0: [246, 161, 160, 159, 158, 157, 173],\n rightEyeLower0: [33, 7, 163, 144, 145, 153, 154, 155, 133],\n rightEyeUpper1: [247, 30, 29, 27, 28, 56, 190],\n rightEyeLower1: [130, 25, 110, 24, 23, 22, 26, 112, 243],\n rightEyeUpper2: [113, 225, 224, 223, 222, 221, 189],\n rightEyeLower2: [226, 31, 228, 229, 230, 231, 232, 233, 244],\n rightEyeLower3: [143, 111, 117, 118, 119, 120, 121, 128, 245],\n rightEyebrowUpper: [156, 70, 63, 105, 66, 107, 55, 193],\n rightEyebrowLower: [35, 124, 46, 53, 52, 65],\n rightEyeIris: [473, 474, 475, 476, 477],\n leftEyeUpper0: [466, 388, 387, 386, 385, 384, 398],\n leftEyeLower0: [263, 249, 390, 373, 374, 380, 381, 382, 362],\n leftEyeUpper1: [467, 260, 259, 257, 258, 286, 414],\n leftEyeLower1: [359, 255, 339, 254, 253, 252, 256, 341, 463],\n leftEyeUpper2: [342, 445, 444, 443, 442, 441, 413],\n leftEyeLower2: [446, 261, 448, 449, 450, 451, 452, 453, 464],\n leftEyeLower3: [372, 340, 346, 347, 348, 349, 350, 357, 465],\n leftEyebrowUpper: [383, 300, 293, 334, 296, 336, 285, 417],\n leftEyebrowLower: [265, 353, 276, 283, 282, 295],\n leftEyeIris: [468, 469, 470, 471, 472],\n midwayBetweenEyes: [168],\n noseTip: [1],\n noseBottom: [2],\n noseRightCorner: [98],\n noseLeftCorner: [327],\n rightCheek: [205],\n leftCheek: [425],\n};\n\nexport const meshLandmarks: Record = {\n count: 468,\n mouth: 13,\n symmetryLine: [13, meshAnnotations['midwayBetweenEyes'][0]],\n};\n\nexport const blazeFaceLandmarks: Record = {\n leftEye: 0,\n rightEye: 1,\n nose: 2,\n mouth: 3,\n leftEar: 4,\n rightEar: 5,\n symmetryLine: [3, 2],\n};\n\nexport const MESH_TO_IRIS_INDICES_MAP: Array<{ key: string, indices: number[] }> = [ // A mapping from facemesh model keypoints to iris model keypoints.\n { key: 'EyeUpper0', indices: [9, 10, 11, 12, 13, 14, 15] },\n { key: 'EyeUpper1', indices: [25, 26, 27, 28, 29, 30, 31] },\n { key: 'EyeUpper2', indices: [41, 42, 43, 44, 45, 46, 47] },\n { key: 'EyeLower0', indices: [0, 1, 2, 3, 4, 5, 6, 7, 8] },\n { key: 'EyeLower1', indices: [16, 17, 18, 19, 20, 21, 22, 23, 24] },\n { key: 'EyeLower2', indices: [32, 33, 34, 35, 36, 37, 38, 39, 40] },\n { key: 'EyeLower3', indices: [54, 55, 56, 57, 58, 59, 60, 61, 62] },\n // { key: 'EyebrowUpper', indices: [63, 64, 65, 66, 67, 68, 69, 70] },\n // { key: 'EyebrowLower', indices: [48, 49, 50, 51, 52, 53] },\n];\n\nexport const UV468: [number, number][] = [\n [0.499976992607117, 0.652534008026123],\n [0.500025987625122, 0.547487020492554],\n [0.499974012374878, 0.602371990680695],\n [0.482113003730774, 0.471979022026062],\n [0.500150978565216, 0.527155995368958],\n [0.499909996986389, 0.498252987861633],\n [0.499523013830185, 0.40106201171875],\n [0.289712011814117, 0.380764007568359],\n [0.499954998493195, 0.312398016452789],\n [0.499987006187439, 0.269918978214264],\n [0.500023007392883, 0.107050001621246],\n [0.500023007392883, 0.666234016418457],\n [0.5000159740448, 0.679224014282227],\n [0.500023007392883, 0.692348003387451],\n [0.499976992607117, 0.695277988910675],\n [0.499976992607117, 0.70593398809433],\n [0.499976992607117, 0.719385027885437],\n [0.499976992607117, 0.737019002437592],\n [0.499967992305756, 0.781370997428894],\n [0.499816000461578, 0.562981009483337],\n [0.473773002624512, 0.573909997940063],\n [0.104906998574734, 0.254140973091125],\n [0.365929991006851, 0.409575998783112],\n [0.338757991790771, 0.41302502155304],\n [0.311120003461838, 0.409460008144379],\n [0.274657994508743, 0.389131009578705],\n [0.393361985683441, 0.403706014156342],\n [0.345234006643295, 0.344011008739471],\n [0.370094001293182, 0.346076011657715],\n [0.319321990013123, 0.347265005111694],\n [0.297903001308441, 0.353591024875641],\n [0.24779200553894, 0.410809993743896],\n [0.396889001131058, 0.842755019664764],\n [0.280097991228104, 0.375599980354309],\n [0.106310002505779, 0.399955987930298],\n [0.2099249958992, 0.391353011131287],\n [0.355807989835739, 0.534406006336212],\n [0.471751004457474, 0.65040397644043],\n [0.474155008792877, 0.680191993713379],\n [0.439785003662109, 0.657229006290436],\n [0.414617002010345, 0.66654098033905],\n [0.450374007225037, 0.680860996246338],\n [0.428770989179611, 0.682690978050232],\n [0.374971002340317, 0.727805018424988],\n [0.486716985702515, 0.547628998756409],\n [0.485300987958908, 0.527395009994507],\n [0.257764995098114, 0.314490020275116],\n [0.401223003864288, 0.455172002315521],\n [0.429818987846375, 0.548614978790283],\n [0.421351999044418, 0.533740997314453],\n [0.276895999908447, 0.532056987285614],\n [0.483370006084442, 0.499586999416351],\n [0.33721199631691, 0.282882988452911],\n [0.296391993761063, 0.293242990970612],\n [0.169294998049736, 0.193813979625702],\n [0.447580009698868, 0.302609980106354],\n [0.392390012741089, 0.353887975215912],\n [0.354490011930466, 0.696784019470215],\n [0.067304998636246, 0.730105042457581],\n [0.442739009857178, 0.572826027870178],\n [0.457098007202148, 0.584792017936707],\n [0.381974011659622, 0.694710969924927],\n [0.392388999462128, 0.694203019142151],\n [0.277076005935669, 0.271932005882263],\n [0.422551989555359, 0.563233017921448],\n [0.385919004678726, 0.281364023685455],\n [0.383103013038635, 0.255840003490448],\n [0.331431001424789, 0.119714021682739],\n [0.229923993349075, 0.232002973556519],\n [0.364500999450684, 0.189113974571228],\n [0.229622006416321, 0.299540996551514],\n [0.173287004232407, 0.278747975826263],\n [0.472878992557526, 0.666198015213013],\n [0.446828007698059, 0.668527007102966],\n [0.422762006521225, 0.673889994621277],\n [0.445307999849319, 0.580065965652466],\n [0.388103008270264, 0.693961024284363],\n [0.403039008378983, 0.706539988517761],\n [0.403629004955292, 0.693953037261963],\n [0.460041999816895, 0.557139039039612],\n [0.431158006191254, 0.692366003990173],\n [0.452181994915009, 0.692366003990173],\n [0.475387006998062, 0.692366003990173],\n [0.465828001499176, 0.779190003871918],\n [0.472328990697861, 0.736225962638855],\n [0.473087012767792, 0.717857003211975],\n [0.473122000694275, 0.704625964164734],\n [0.473033010959625, 0.695277988910675],\n [0.427942007780075, 0.695277988910675],\n [0.426479011774063, 0.703539967536926],\n [0.423162013292313, 0.711845993995667],\n [0.4183090031147, 0.720062971115112],\n [0.390094995498657, 0.639572978019714],\n [0.013953999616206, 0.560034036636353],\n [0.499913990497589, 0.58014702796936],\n [0.413199990987778, 0.69539999961853],\n [0.409626007080078, 0.701822996139526],\n [0.468080013990402, 0.601534962654114],\n [0.422728985548019, 0.585985004901886],\n [0.463079988956451, 0.593783974647522],\n [0.37211999297142, 0.47341400384903],\n [0.334562003612518, 0.496073007583618],\n [0.411671012639999, 0.546965003013611],\n [0.242175996303558, 0.14767599105835],\n [0.290776997804642, 0.201445996761322],\n [0.327338010072708, 0.256527006626129],\n [0.399509996175766, 0.748921036720276],\n [0.441727995872498, 0.261676013469696],\n [0.429764986038208, 0.187834024429321],\n [0.412198007106781, 0.108901023864746],\n [0.288955003023148, 0.398952007293701],\n [0.218936994671822, 0.435410976409912],\n [0.41278201341629, 0.398970007896423],\n [0.257135003805161, 0.355440020561218],\n [0.427684992551804, 0.437960982322693],\n [0.448339998722076, 0.536936044692993],\n [0.178560003638268, 0.45755398273468],\n [0.247308000922203, 0.457193970680237],\n [0.286267012357712, 0.467674970626831],\n [0.332827985286713, 0.460712015628815],\n [0.368755996227264, 0.447206974029541],\n [0.398963987827301, 0.432654976844788],\n [0.476410001516342, 0.405806005001068],\n [0.189241006970406, 0.523923993110657],\n [0.228962004184723, 0.348950982093811],\n [0.490725994110107, 0.562400996685028],\n [0.404670000076294, 0.485132992267609],\n [0.019469000399113, 0.401564002037048],\n [0.426243007183075, 0.420431017875671],\n [0.396993011236191, 0.548797011375427],\n [0.266469985246658, 0.376977026462555],\n [0.439121007919312, 0.51895797252655],\n [0.032313998788595, 0.644356966018677],\n [0.419054001569748, 0.387154996395111],\n [0.462783008813858, 0.505746960639954],\n [0.238978996872902, 0.779744982719421],\n [0.198220998048782, 0.831938028335571],\n [0.107550002634525, 0.540755033493042],\n [0.183610007166862, 0.740257024765015],\n [0.134409993886948, 0.333683013916016],\n [0.385764002799988, 0.883153975009918],\n [0.490967005491257, 0.579378008842468],\n [0.382384985685349, 0.508572995662689],\n [0.174399003386497, 0.397670984268188],\n [0.318785011768341, 0.39623498916626],\n [0.343364000320435, 0.400596976280212],\n [0.396100014448166, 0.710216999053955],\n [0.187885001301765, 0.588537991046906],\n [0.430987000465393, 0.944064974784851],\n [0.318993002176285, 0.898285031318665],\n [0.266247987747192, 0.869701027870178],\n [0.500023007392883, 0.190576016902924],\n [0.499976992607117, 0.954452991485596],\n [0.366169989109039, 0.398822009563446],\n [0.393207013607025, 0.39553701877594],\n [0.410373002290726, 0.391080021858215],\n [0.194993004202843, 0.342101991176605],\n [0.388664990663528, 0.362284004688263],\n [0.365961998701096, 0.355970978736877],\n [0.343364000320435, 0.355356991291046],\n [0.318785011768341, 0.35834002494812],\n [0.301414996385574, 0.363156020641327],\n [0.058132998645306, 0.319076001644135],\n [0.301414996385574, 0.387449026107788],\n [0.499987989664078, 0.618434011936188],\n [0.415838003158569, 0.624195992946625],\n [0.445681989192963, 0.566076993942261],\n [0.465844005346298, 0.620640993118286],\n [0.49992299079895, 0.351523995399475],\n [0.288718998432159, 0.819945991039276],\n [0.335278987884521, 0.852819979190826],\n [0.440512001514435, 0.902418971061707],\n [0.128294005990028, 0.791940987110138],\n [0.408771991729736, 0.373893976211548],\n [0.455606997013092, 0.451801002025604],\n [0.499877005815506, 0.908990025520325],\n [0.375436991453171, 0.924192011356354],\n [0.11421000212431, 0.615022003650665],\n [0.448662012815475, 0.695277988910675],\n [0.4480200111866, 0.704632043838501],\n [0.447111994028091, 0.715808033943176],\n [0.444831997156143, 0.730794012546539],\n [0.430011987686157, 0.766808986663818],\n [0.406787008047104, 0.685672998428345],\n [0.400738000869751, 0.681069016456604],\n [0.392399996519089, 0.677703022956848],\n [0.367855995893478, 0.663918972015381],\n [0.247923001646996, 0.601333022117615],\n [0.452769994735718, 0.420849978923798],\n [0.43639200925827, 0.359887003898621],\n [0.416164010763168, 0.368713974952698],\n [0.413385987281799, 0.692366003990173],\n [0.228018000721931, 0.683571994304657],\n [0.468268007040024, 0.352671027183533],\n [0.411361992359161, 0.804327011108398],\n [0.499989002943039, 0.469825029373169],\n [0.479153990745544, 0.442654013633728],\n [0.499974012374878, 0.439637005329132],\n [0.432112008333206, 0.493588984012604],\n [0.499886006116867, 0.866917014122009],\n [0.49991300702095, 0.821729004383087],\n [0.456548988819122, 0.819200992584229],\n [0.344549000263214, 0.745438992977142],\n [0.37890899181366, 0.574010014533997],\n [0.374292999505997, 0.780184984207153],\n [0.319687992334366, 0.570737957954407],\n [0.357154995203018, 0.604269981384277],\n [0.295284003019333, 0.621580958366394],\n [0.447750002145767, 0.862477004528046],\n [0.410986006259918, 0.508723020553589],\n [0.31395098567009, 0.775308012962341],\n [0.354128003120422, 0.812552988529205],\n [0.324548006057739, 0.703992962837219],\n [0.189096003770828, 0.646299958229065],\n [0.279776990413666, 0.71465802192688],\n [0.1338230073452, 0.682700991630554],\n [0.336768001317978, 0.644733011722565],\n [0.429883986711502, 0.466521978378296],\n [0.455527991056442, 0.548622965812683],\n [0.437114000320435, 0.558896005153656],\n [0.467287987470627, 0.529924988746643],\n [0.414712011814117, 0.335219979286194],\n [0.37704598903656, 0.322777986526489],\n [0.344107985496521, 0.320150971412659],\n [0.312875986099243, 0.32233202457428],\n [0.283526003360748, 0.333190023899078],\n [0.241245999932289, 0.382785975933075],\n [0.102986000478268, 0.468762993812561],\n [0.267612010240555, 0.424560010433197],\n [0.297879010438919, 0.433175981044769],\n [0.333433985710144, 0.433878004550934],\n [0.366427004337311, 0.426115989685059],\n [0.396012008190155, 0.416696012020111],\n [0.420121014118195, 0.41022801399231],\n [0.007561000064015, 0.480777025222778],\n [0.432949006557465, 0.569517970085144],\n [0.458638995885849, 0.479089021682739],\n [0.473466008901596, 0.545744001865387],\n [0.476087987422943, 0.563830018043518],\n [0.468472003936768, 0.555056989192963],\n [0.433990985155106, 0.582361996173859],\n [0.483518004417419, 0.562983989715576],\n [0.482482999563217, 0.57784903049469],\n [0.42645001411438, 0.389798998832703],\n [0.438998997211456, 0.39649498462677],\n [0.450067013502121, 0.400434017181396],\n [0.289712011814117, 0.368252992630005],\n [0.276670008897781, 0.363372981548309],\n [0.517862021923065, 0.471948027610779],\n [0.710287988185883, 0.380764007568359],\n [0.526226997375488, 0.573909997940063],\n [0.895093023777008, 0.254140973091125],\n [0.634069979190826, 0.409575998783112],\n [0.661242008209229, 0.41302502155304],\n [0.688880026340485, 0.409460008144379],\n [0.725341975688934, 0.389131009578705],\n [0.606630027294159, 0.40370500087738],\n [0.654766023159027, 0.344011008739471],\n [0.629905998706818, 0.346076011657715],\n [0.680678009986877, 0.347265005111694],\n [0.702096998691559, 0.353591024875641],\n [0.75221198797226, 0.410804986953735],\n [0.602918028831482, 0.842862963676453],\n [0.719901978969574, 0.375599980354309],\n [0.893692970275879, 0.399959981441498],\n [0.790081977844238, 0.391354024410248],\n [0.643998026847839, 0.534487962722778],\n [0.528249025344849, 0.65040397644043],\n [0.525849997997284, 0.680191040039062],\n [0.560214996337891, 0.657229006290436],\n [0.585384011268616, 0.66654098033905],\n [0.549625992774963, 0.680860996246338],\n [0.57122802734375, 0.682691991329193],\n [0.624852001667023, 0.72809898853302],\n [0.513050019741058, 0.547281980514526],\n [0.51509702205658, 0.527251958847046],\n [0.742246985435486, 0.314507007598877],\n [0.598631024360657, 0.454979002475739],\n [0.570338010787964, 0.548575043678284],\n [0.578631997108459, 0.533622980117798],\n [0.723087012767792, 0.532054007053375],\n [0.516445994377136, 0.499638974666595],\n [0.662801027297974, 0.282917976379395],\n [0.70362401008606, 0.293271005153656],\n [0.830704987049103, 0.193813979625702],\n [0.552385985851288, 0.302568018436432],\n [0.607609987258911, 0.353887975215912],\n [0.645429015159607, 0.696707010269165],\n [0.932694971561432, 0.730105042457581],\n [0.557260990142822, 0.572826027870178],\n [0.542901992797852, 0.584792017936707],\n [0.6180260181427, 0.694710969924927],\n [0.607590973377228, 0.694203019142151],\n [0.722943007946014, 0.271963000297546],\n [0.577413976192474, 0.563166975975037],\n [0.614082992076874, 0.281386971473694],\n [0.616907000541687, 0.255886018276215],\n [0.668509006500244, 0.119913995265961],\n [0.770092010498047, 0.232020974159241],\n [0.635536015033722, 0.189248979091644],\n [0.77039098739624, 0.299556016921997],\n [0.826722025871277, 0.278755009174347],\n [0.527121007442474, 0.666198015213013],\n [0.553171992301941, 0.668527007102966],\n [0.577238023281097, 0.673889994621277],\n [0.554691970348358, 0.580065965652466],\n [0.611896991729736, 0.693961024284363],\n [0.59696102142334, 0.706539988517761],\n [0.596370995044708, 0.693953037261963],\n [0.539958000183105, 0.557139039039612],\n [0.568841993808746, 0.692366003990173],\n [0.547818005084991, 0.692366003990173],\n [0.52461302280426, 0.692366003990173],\n [0.534089982509613, 0.779141008853912],\n [0.527670979499817, 0.736225962638855],\n [0.526912987232208, 0.717857003211975],\n [0.526877999305725, 0.704625964164734],\n [0.526966989040375, 0.695277988910675],\n [0.572058022022247, 0.695277988910675],\n [0.573521018028259, 0.703539967536926],\n [0.57683801651001, 0.711845993995667],\n [0.581691026687622, 0.720062971115112],\n [0.609944999217987, 0.639909982681274],\n [0.986046016216278, 0.560034036636353],\n [0.5867999792099, 0.69539999961853],\n [0.590372025966644, 0.701822996139526],\n [0.531915009021759, 0.601536989212036],\n [0.577268004417419, 0.585934996604919],\n [0.536915004253387, 0.593786001205444],\n [0.627542972564697, 0.473352015018463],\n [0.665585994720459, 0.495950996875763],\n [0.588353991508484, 0.546862006187439],\n [0.757824003696442, 0.14767599105835],\n [0.709249973297119, 0.201507985591888],\n [0.672684013843536, 0.256581008434296],\n [0.600408971309662, 0.74900496006012],\n [0.55826598405838, 0.261672019958496],\n [0.570303976535797, 0.187870979309082],\n [0.588165998458862, 0.109044015407562],\n [0.711045026779175, 0.398952007293701],\n [0.781069993972778, 0.435405015945435],\n [0.587247014045715, 0.398931980133057],\n [0.742869973182678, 0.355445981025696],\n [0.572156012058258, 0.437651991844177],\n [0.55186802148819, 0.536570012569427],\n [0.821442008018494, 0.457556009292603],\n [0.752701997756958, 0.457181990146637],\n [0.71375697851181, 0.467626988887787],\n [0.66711300611496, 0.460672974586487],\n [0.631101012229919, 0.447153985500336],\n [0.6008620262146, 0.432473003864288],\n [0.523481011390686, 0.405627012252808],\n [0.810747981071472, 0.523926019668579],\n [0.771045982837677, 0.348959028720856],\n [0.509127020835876, 0.562718033790588],\n [0.595292985439301, 0.485023975372314],\n [0.980530977249146, 0.401564002037048],\n [0.573499977588654, 0.420000016689301],\n [0.602994978427887, 0.548687994480133],\n [0.733529984951019, 0.376977026462555],\n [0.560611009597778, 0.519016981124878],\n [0.967685997486115, 0.644356966018677],\n [0.580985009670258, 0.387160003185272],\n [0.537728011608124, 0.505385041236877],\n [0.760966002941132, 0.779752969741821],\n [0.801778972148895, 0.831938028335571],\n [0.892440974712372, 0.54076099395752],\n [0.816350996494293, 0.740260004997253],\n [0.865594983100891, 0.333687007427216],\n [0.614073991775513, 0.883246004581451],\n [0.508952975273132, 0.579437971115112],\n [0.617941975593567, 0.508316040039062],\n [0.825608015060425, 0.397674977779388],\n [0.681214988231659, 0.39623498916626],\n [0.656635999679565, 0.400596976280212],\n [0.603900015354156, 0.710216999053955],\n [0.81208598613739, 0.588539004325867],\n [0.56801301240921, 0.944564998149872],\n [0.681007981300354, 0.898285031318665],\n [0.733752012252808, 0.869701027870178],\n [0.633830010890961, 0.398822009563446],\n [0.606792986392975, 0.39553701877594],\n [0.589659988880157, 0.391062021255493],\n [0.805015981197357, 0.342108011245728],\n [0.611334979534149, 0.362284004688263],\n [0.634037971496582, 0.355970978736877],\n [0.656635999679565, 0.355356991291046],\n [0.681214988231659, 0.35834002494812],\n [0.698584973812103, 0.363156020641327],\n [0.941866993904114, 0.319076001644135],\n [0.698584973812103, 0.387449026107788],\n [0.584177017211914, 0.624107003211975],\n [0.554318010807037, 0.566076993942261],\n [0.534153997898102, 0.62064003944397],\n [0.711217999458313, 0.819975018501282],\n [0.664629995822906, 0.852871000766754],\n [0.559099972248077, 0.902631998062134],\n [0.871706008911133, 0.791940987110138],\n [0.591234028339386, 0.373893976211548],\n [0.544341027736664, 0.451583981513977],\n [0.624562978744507, 0.924192011356354],\n [0.88577002286911, 0.615028977394104],\n [0.551338016986847, 0.695277988910675],\n [0.551980018615723, 0.704632043838501],\n [0.552887976169586, 0.715808033943176],\n [0.555167973041534, 0.730794012546539],\n [0.569944024085999, 0.767035007476807],\n [0.593203008174896, 0.685675978660583],\n [0.599261999130249, 0.681069016456604],\n [0.607599973678589, 0.677703022956848],\n [0.631937980651855, 0.663500010967255],\n [0.752032995223999, 0.601315021514893],\n [0.547226011753082, 0.420395016670227],\n [0.563543975353241, 0.359827995300293],\n [0.583841025829315, 0.368713974952698],\n [0.586614012718201, 0.692366003990173],\n [0.771915018558502, 0.683578014373779],\n [0.531597018241882, 0.352482974529266],\n [0.588370978832245, 0.804440975189209],\n [0.52079701423645, 0.442565023899078],\n [0.567984998226166, 0.493479013442993],\n [0.543282985687256, 0.819254994392395],\n [0.655317008495331, 0.745514988899231],\n [0.621008992195129, 0.574018001556396],\n [0.625559985637665, 0.78031200170517],\n [0.680198013782501, 0.570719003677368],\n [0.64276397228241, 0.604337990283966],\n [0.704662978649139, 0.621529996395111],\n [0.552012026309967, 0.862591981887817],\n [0.589071989059448, 0.508637011051178],\n [0.685944974422455, 0.775357007980347],\n [0.645735025405884, 0.812640011310577],\n [0.675342977046967, 0.703978002071381],\n [0.810858011245728, 0.646304965019226],\n [0.72012197971344, 0.714666962623596],\n [0.866151988506317, 0.682704985141754],\n [0.663187026977539, 0.644596993923187],\n [0.570082008838654, 0.466325998306274],\n [0.544561982154846, 0.548375964164734],\n [0.562758982181549, 0.558784961700439],\n [0.531987011432648, 0.530140042304993],\n [0.585271000862122, 0.335177004337311],\n [0.622952997684479, 0.32277899980545],\n [0.655896008014679, 0.320163011550903],\n [0.687132000923157, 0.322345972061157],\n [0.716481983661652, 0.333200991153717],\n [0.758756995201111, 0.382786989212036],\n [0.897013008594513, 0.468769013881683],\n [0.732392013072968, 0.424547016620636],\n [0.70211398601532, 0.433162987232208],\n [0.66652500629425, 0.433866024017334],\n [0.633504986763, 0.426087975502014],\n [0.603875994682312, 0.416586995124817],\n [0.579657971858978, 0.409945011138916],\n [0.992439985275269, 0.480777025222778],\n [0.567192018032074, 0.569419980049133],\n [0.54136598110199, 0.478899002075195],\n [0.526564002037048, 0.546118021011353],\n [0.523913025856018, 0.563830018043518],\n [0.531529009342194, 0.555056989192963],\n [0.566035985946655, 0.582329034805298],\n [0.51631098985672, 0.563053965568542],\n [0.5174720287323, 0.577877044677734],\n [0.573594987392426, 0.389806985855103],\n [0.560697972774506, 0.395331978797913],\n [0.549755990505219, 0.399751007556915],\n [0.710287988185883, 0.368252992630005],\n [0.723330020904541, 0.363372981548309],\n];\n\nexport const TRI468: Array = [\n 127, 34, 139, 11, 0, 37, 232, 231, 120, 72, 37, 39, 128, 121, 47, 232, 121, 128, 104, 69, 67, 175, 171, 148, 157, 154, 155, 118, 50, 101, 73, 39, 40, 9,\n 151, 108, 48, 115, 131, 194, 204, 211, 74, 40, 185, 80, 42, 183, 40, 92, 186, 230, 229, 118, 202, 212, 214, 83, 18, 17, 76, 61, 146, 160, 29, 30, 56,\n 157, 173, 106, 204, 194, 135, 214, 192, 203, 165, 98, 21, 71, 68, 51, 45, 4, 144, 24, 23, 77, 146, 91, 205, 50, 187, 201, 200, 18, 91, 106, 182, 90, 91,\n 181, 85, 84, 17, 206, 203, 36, 148, 171, 140, 92, 40, 39, 193, 189, 244, 159, 158, 28, 247, 246, 161, 236, 3, 196, 54, 68, 104, 193, 168, 8, 117,\n 228, 31, 189, 193, 55, 98, 97, 99, 126, 47, 100, 166, 79, 218, 155, 154, 26, 209, 49, 131, 135, 136, 150, 47, 126, 217, 223, 52, 53, 45, 51, 134, 211,\n 170, 140, 67, 69, 108, 43, 106, 91, 230, 119, 120, 226, 130, 247, 63, 53, 52, 238, 20, 242, 46, 70, 156, 78, 62, 96, 46, 53, 63, 143, 34, 227, 173,\n 155, 133, 123, 117, 111, 44, 125, 19, 236, 134, 51, 216, 206, 205, 154, 153, 22, 39, 37, 167, 200, 201, 208, 36, 142, 100, 57, 212, 202, 20, 60, 99, 28,\n 158, 157, 35, 226, 113, 160, 159, 27, 204, 202, 210, 113, 225, 46, 43, 202, 204, 62, 76, 77, 137, 123, 116, 41, 38, 72, 203, 129, 142, 64, 98, 240, 49,\n 102, 64, 41, 73, 74, 212, 216, 207, 42, 74, 184, 169, 170, 211, 170, 149, 176, 105, 66, 69, 122, 6, 168, 123, 147, 187, 96, 77, 90, 65, 55, 107, 89,\n 90, 180, 101, 100, 120, 63, 105, 104, 93, 137, 227, 15, 86, 85, 129, 102, 49, 14, 87, 86, 55, 8, 9, 100, 47, 121, 145, 23, 22, 88, 89, 179, 6, 122,\n 196, 88, 95, 96, 138, 172, 136, 215, 58, 172, 115, 48, 219, 42, 80, 81, 195, 3, 51, 43, 146, 61, 171, 175, 199, 81, 82, 38, 53, 46, 225, 144, 163, 110,\n 246, 33, 7, 52, 65, 66, 229, 228, 117, 34, 127, 234, 107, 108, 69, 109, 108, 151, 48, 64, 235, 62, 78, 191, 129, 209, 126, 111, 35, 143, 163, 161, 246,\n 117, 123, 50, 222, 65, 52, 19, 125, 141, 221, 55, 65, 3, 195, 197, 25, 7, 33, 220, 237, 44, 70, 71, 139, 122, 193, 245, 247, 130, 33, 71, 21, 162,\n 153, 158, 159, 170, 169, 150, 188, 174, 196, 216, 186, 92, 144, 160, 161, 2, 97, 167, 141, 125, 241, 164, 167, 37, 72, 38, 12, 145, 159, 160, 38, 82, 13,\n 63, 68, 71, 226, 35, 111, 158, 153, 154, 101, 50, 205, 206, 92, 165, 209, 198, 217, 165, 167, 97, 220, 115, 218, 133, 112, 243, 239, 238, 241, 214,\n 135, 169, 190, 173, 133, 171, 208, 32, 125, 44, 237, 86, 87, 178, 85, 86, 179, 84, 85, 180, 83, 84, 181, 201, 83, 182, 137, 93, 132, 76, 62, 183, 61,\n 76, 184, 57, 61, 185, 212, 57, 186, 214, 207, 187, 34, 143, 156, 79, 239, 237, 123, 137, 177, 44, 1, 4, 201, 194, 32, 64, 102, 129, 213, 215, 138, 59,\n 166, 219, 242, 99, 97, 2, 94, 141, 75, 59, 235, 24, 110, 228, 25, 130, 226, 23, 24, 229, 22, 23, 230, 26, 22, 231, 112, 26, 232, 189, 190, 243, 221, 56,\n 190, 28, 56, 221, 27, 28, 222, 29, 27, 223, 30, 29, 224, 247, 30, 225, 238, 79, 20, 166, 59, 75, 60, 75, 240, 147, 177, 215, 20, 79, 166, 187, 147, 213,\n 112, 233, 244, 233, 128, 245, 128, 114, 188, 114, 217, 174, 131, 115, 220, 217, 198, 236, 198, 131, 134, 177, 132, 58, 143, 35, 124, 110, 163, 7, 228,\n 110, 25, 356, 389, 368, 11, 302, 267, 452, 350, 349, 302, 303, 269, 357, 343, 277, 452, 453, 357, 333, 332, 297, 175, 152, 377, 384, 398, 382, 347,\n 348, 330, 303, 304, 270, 9, 336, 337, 278, 279, 360, 418, 262, 431, 304, 408, 409, 310, 415, 407, 270, 409, 410, 450, 348, 347, 422, 430, 434, 313,\n 314, 17, 306, 307, 375, 387, 388, 260, 286, 414, 398, 335, 406, 418, 364, 367, 416, 423, 358, 327, 251, 284, 298, 281, 5, 4, 373, 374, 253, 307, 320,\n 321, 425, 427, 411, 421, 313, 18, 321, 405, 406, 320, 404, 405, 315, 16, 17, 426, 425, 266, 377, 400, 369, 322, 391, 269, 417, 465, 464, 386, 257, 258,\n 466, 260, 388, 456, 399, 419, 284, 332, 333, 417, 285, 8, 346, 340, 261, 413, 441, 285, 327, 460, 328, 355, 371, 329, 392, 439, 438, 382, 341, 256,\n 429, 420, 360, 364, 394, 379, 277, 343, 437, 443, 444, 283, 275, 440, 363, 431, 262, 369, 297, 338, 337, 273, 375, 321, 450, 451, 349, 446, 342, 467,\n 293, 334, 282, 458, 461, 462, 276, 353, 383, 308, 324, 325, 276, 300, 293, 372, 345, 447, 382, 398, 362, 352, 345, 340, 274, 1, 19, 456, 248, 281, 436,\n 427, 425, 381, 256, 252, 269, 391, 393, 200, 199, 428, 266, 330, 329, 287, 273, 422, 250, 462, 328, 258, 286, 384, 265, 353, 342, 387, 259, 257, 424,\n 431, 430, 342, 353, 276, 273, 335, 424, 292, 325, 307, 366, 447, 345, 271, 303, 302, 423, 266, 371, 294, 455, 460, 279, 278, 294, 271, 272, 304, 432,\n 434, 427, 272, 407, 408, 394, 430, 431, 395, 369, 400, 334, 333, 299, 351, 417, 168, 352, 280, 411, 325, 319, 320, 295, 296, 336, 319, 403, 404, 330,\n 348, 349, 293, 298, 333, 323, 454, 447, 15, 16, 315, 358, 429, 279, 14, 15, 316, 285, 336, 9, 329, 349, 350, 374, 380, 252, 318, 402, 403, 6, 197, 419,\n 318, 319, 325, 367, 364, 365, 435, 367, 397, 344, 438, 439, 272, 271, 311, 195, 5, 281, 273, 287, 291, 396, 428, 199, 311, 271, 268, 283, 444, 445,\n 373, 254, 339, 263, 466, 249, 282, 334, 296, 449, 347, 346, 264, 447, 454, 336, 296, 299, 338, 10, 151, 278, 439, 455, 292, 407, 415, 358, 371, 355,\n 340, 345, 372, 390, 249, 466, 346, 347, 280, 442, 443, 282, 19, 94, 370, 441, 442, 295, 248, 419, 197, 263, 255, 359, 440, 275, 274, 300, 383, 368,\n 351, 412, 465, 263, 467, 466, 301, 368, 389, 380, 374, 386, 395, 378, 379, 412, 351, 419, 436, 426, 322, 373, 390, 388, 2, 164, 393, 370, 462, 461,\n 164, 0, 267, 302, 11, 12, 374, 373, 387, 268, 12, 13, 293, 300, 301, 446, 261, 340, 385, 384, 381, 330, 266, 425, 426, 423, 391, 429, 355, 437, 391,\n 327, 326, 440, 457, 438, 341, 382, 362, 459, 457, 461, 434, 430, 394, 414, 463, 362, 396, 369, 262, 354, 461, 457, 316, 403, 402, 315, 404, 403, 314,\n 405, 404, 313, 406, 405, 421, 418, 406, 366, 401, 361, 306, 408, 407, 291, 409, 408, 287, 410, 409, 432, 436, 410, 434, 416, 411, 264, 368, 383, 309,\n 438, 457, 352, 376, 401, 274, 275, 4, 421, 428, 262, 294, 327, 358, 433, 416, 367, 289, 455, 439, 462, 370, 326, 2, 326, 370, 305, 460, 455, 254,\n 449, 448, 255, 261, 446, 253, 450, 449, 252, 451, 450, 256, 452, 451, 341, 453, 452, 413, 464, 463, 441, 413, 414, 258, 442, 441, 257, 443, 442, 259,\n 444, 443, 260, 445, 444, 467, 342, 445, 459, 458, 250, 289, 392, 290, 290, 328, 460, 376, 433, 435, 250, 290, 392, 411, 416, 433, 341, 463, 464, 453,\n 464, 465, 357, 465, 412, 343, 412, 399, 360, 363, 440, 437, 399, 456, 420, 456, 363, 401, 435, 288, 372, 383, 353, 339, 255, 249, 448, 261, 255, 133,\n 243, 190, 133, 155, 112, 33, 246, 247, 33, 130, 25, 398, 384, 286, 362, 398, 414, 362, 463, 341, 263, 359, 467, 263, 249, 255, 466, 467, 260, 75, 60,\n 166, 238, 239, 79, 162, 127, 139, 72, 11, 37, 121, 232, 120, 73, 72, 39, 114, 128, 47, 233, 232, 128, 103, 104, 67, 152, 175, 148, 173, 157, 155,\n 119, 118, 101, 74, 73, 40, 107, 9, 108, 49, 48, 131, 32, 194, 211, 184, 74, 185, 191, 80, 183, 185, 40, 186, 119, 230, 118, 210, 202, 214, 84, 83, 17,\n 77, 76, 146, 161, 160, 30, 190, 56, 173, 182, 106, 194, 138, 135, 192, 129, 203, 98, 54, 21, 68, 5, 51, 4, 145, 144, 23, 90, 77, 91, 207, 205, 187, 83,\n 201, 18, 181, 91, 182, 180, 90, 181, 16, 85, 17, 205, 206, 36, 176, 148, 140, 165, 92, 39, 245, 193, 244, 27, 159, 28, 30, 247, 161, 174, 236, 196,\n 103, 54, 104, 55, 193, 8, 111, 117, 31, 221, 189, 55, 240, 98, 99, 142, 126, 100, 219, 166, 218, 112, 155, 26, 198, 209, 131, 169, 135, 150, 114, 47,\n 217, 224, 223, 53, 220, 45, 134, 32, 211, 140, 109, 67, 108, 146, 43, 91, 231, 230, 120, 113, 226, 247, 105, 63, 52, 241, 238, 242, 124, 46, 156, 95,\n 78, 96, 70, 46, 63, 116, 143, 227, 116, 123, 111, 1, 44, 19, 3, 236, 51, 207, 216, 205, 26, 154, 22, 165, 39, 167, 199, 200, 208, 101, 36, 100, 43,\n 57, 202, 242, 20, 99, 56, 28, 157, 124, 35, 113, 29, 160, 27, 211, 204, 210, 124, 113, 46, 106, 43, 204, 96, 62, 77, 227, 137, 116, 73, 41, 72, 36, 203,\n 142, 235, 64, 240, 48, 49, 64, 42, 41, 74, 214, 212, 207, 183, 42, 184, 210, 169, 211, 140, 170, 176, 104, 105, 69, 193, 122, 168, 50, 123, 187, 89, 96,\n 90, 66, 65, 107, 179, 89, 180, 119, 101, 120, 68, 63, 104, 234, 93, 227, 16, 15, 85, 209, 129, 49, 15, 14, 86, 107, 55, 9, 120, 100, 121, 153, 145, 22,\n 178, 88, 179, 197, 6, 196, 89, 88, 96, 135, 138, 136, 138, 215, 172, 218, 115, 219, 41, 42, 81, 5, 195, 51, 57, 43, 61, 208, 171, 199, 41, 81, 38,\n 224, 53, 225, 24, 144, 110, 105, 52, 66, 118, 229, 117, 227, 34, 234, 66, 107, 69, 10, 109, 151, 219, 48, 235, 183, 62, 191, 142, 129, 126, 116, 111,\n 143, 7, 163, 246, 118, 117, 50, 223, 222, 52, 94, 19, 141, 222, 221, 65, 196, 3, 197, 45, 220, 44, 156, 70, 139, 188, 122, 245, 139, 71, 162, 145,\n 153, 159, 149, 170, 150, 122, 188, 196, 206, 216, 92, 163, 144, 161, 164, 2, 167, 242, 141, 241, 0, 164, 37, 11, 72, 12, 144, 145, 160, 12, 38, 13, 70,\n 63, 71, 31, 226, 111, 157, 158, 154, 36, 101, 205, 203, 206, 165, 126, 209, 217, 98, 165, 97, 237, 220, 218, 237, 239, 241, 210, 214, 169, 140, 171, 32,\n 241, 125, 237, 179, 86, 178, 180, 85, 179, 181, 84, 180, 182, 83, 181, 194, 201, 182, 177, 137, 132, 184, 76, 183, 185, 61, 184, 186, 57, 185, 216, 212,\n 186, 192, 214, 187, 139, 34, 156, 218, 79, 237, 147, 123, 177, 45, 44, 4, 208, 201, 32, 98, 64, 129, 192, 213, 138, 235, 59, 219, 141, 242, 97, 97, 2,\n 141, 240, 75, 235, 229, 24, 228, 31, 25, 226, 230, 23, 229, 231, 22, 230, 232, 26, 231, 233, 112, 232, 244, 189, 243, 189, 221, 190, 222, 28, 221,\n 223, 27, 222, 224, 29, 223, 225, 30, 224, 113, 247, 225, 99, 60, 240, 213, 147, 215, 60, 20, 166, 192, 187, 213, 243, 112, 244, 244, 233, 245, 245,\n 128, 188, 188, 114, 174, 134, 131, 220, 174, 217, 236, 236, 198, 134, 215, 177, 58, 156, 143, 124, 25, 110, 7, 31, 228, 25, 264, 356, 368, 0, 11, 267,\n 451, 452, 349, 267, 302, 269, 350, 357, 277, 350, 452, 357, 299, 333, 297, 396, 175, 377, 381, 384, 382, 280, 347, 330, 269, 303, 270, 151, 9, 337,\n 344, 278, 360, 424, 418, 431, 270, 304, 409, 272, 310, 407, 322, 270, 410, 449, 450, 347, 432, 422, 434, 18, 313, 17, 291, 306, 375, 259, 387, 260,\n 424, 335, 418, 434, 364, 416, 391, 423, 327, 301, 251, 298, 275, 281, 4, 254, 373, 253, 375, 307, 321, 280, 425, 411, 200, 421, 18, 335, 321, 406,\n 321, 320, 405, 314, 315, 17, 423, 426, 266, 396, 377, 369, 270, 322, 269, 413, 417, 464, 385, 386, 258, 248, 456, 419, 298, 284, 333, 168, 417, 8,\n 448, 346, 261, 417, 413, 285, 326, 327, 328, 277, 355, 329, 309, 392, 438, 381, 382, 256, 279, 429, 360, 365, 364, 379, 355, 277, 437, 282, 443, 283,\n 281, 275, 363, 395, 431, 369, 299, 297, 337, 335, 273, 321, 348, 450, 349, 359, 446, 467, 283, 293, 282, 250, 458, 462, 300, 276, 383, 292, 308, 325,\n 283, 276, 293, 264, 372, 447, 346, 352, 340, 354, 274, 19, 363, 456, 281, 426, 436, 425, 380, 381, 252, 267, 269, 393, 421, 200, 428, 371, 266, 329,\n 432, 287, 422, 290, 250, 328, 385, 258, 384, 446, 265, 342, 386, 387, 257, 422, 424, 430, 445, 342, 276, 422, 273, 424, 306, 292, 307, 352, 366, 345,\n 268, 271, 302, 358, 423, 371, 327, 294, 460, 331, 279, 294, 303, 271, 304, 436, 432, 427, 304, 272, 408, 395, 394, 431, 378, 395, 400, 296, 334, 299,\n 6, 351, 168, 376, 352, 411, 307, 325, 320, 285, 295, 336, 320, 319, 404, 329, 330, 349, 334, 293, 333, 366, 323, 447, 316, 15, 315, 331, 358, 279,\n 317, 14, 316, 8, 285, 9, 277, 329, 350, 253, 374, 252, 319, 318, 403, 351, 6, 419, 324, 318, 325, 397, 367, 365, 288, 435, 397, 278, 344, 439, 310,\n 272, 311, 248, 195, 281, 375, 273, 291, 175, 396, 199, 312, 311, 268, 276, 283, 445, 390, 373, 339, 295, 282, 296, 448, 449, 346, 356, 264, 454, 337,\n 336, 299, 337, 338, 151, 294, 278, 455, 308, 292, 415, 429, 358, 355, 265, 340, 372, 388, 390, 466, 352, 346, 280, 295, 442, 282, 354, 19, 370, 285,\n 441, 295, 195, 248, 197, 457, 440, 274, 301, 300, 368, 417, 351, 465, 251, 301, 389, 385, 380, 386, 394, 395, 379, 399, 412, 419, 410, 436, 322, 387,\n 373, 388, 326, 2, 393, 354, 370, 461, 393, 164, 267, 268, 302, 12, 386, 374, 387, 312, 268, 13, 298, 293, 301, 265, 446, 340, 380, 385, 381, 280, 330,\n 425, 322, 426, 391, 420, 429, 437, 393, 391, 326, 344, 440, 438, 458, 459, 461, 364, 434, 394, 428, 396, 262, 274, 354, 457, 317, 316, 402, 316, 315,\n 403, 315, 314, 404, 314, 313, 405, 313, 421, 406, 323, 366, 361, 292, 306, 407, 306, 291, 408, 291, 287, 409, 287, 432, 410, 427, 434, 411, 372, 264,\n 383, 459, 309, 457, 366, 352, 401, 1, 274, 4, 418, 421, 262, 331, 294, 358, 435, 433, 367, 392, 289, 439, 328, 462, 326, 94, 2, 370, 289, 305, 455, 339,\n 254, 448, 359, 255, 446, 254, 253, 449, 253, 252, 450, 252, 256, 451, 256, 341, 452, 414, 413, 463, 286, 441, 414, 286, 258, 441, 258, 257, 442, 257,\n 259, 443, 259, 260, 444, 260, 467, 445, 309, 459, 250, 305, 289, 290, 305, 290, 460, 401, 376, 435, 309, 250, 392, 376, 411, 433, 453, 341, 464, 357,\n 453, 465, 343, 357, 412, 437, 343, 399, 344, 360, 440, 420, 437, 456, 360, 420, 363, 361, 401, 288, 265, 372, 353, 390, 339, 249, 339, 448, 255];\n\nexport const TRI68: Array = [0, 1, 36, 0, 36, 17, 1, 2, 41, 1, 41, 36, 2, 3, 31, 2, 31, 41, 3, 4, 48, 3, 48, 31, 4, 5, 48, 5, 6, 48, 6, 7, 59, 6, 59, 48, 7, 8, 58, 7, 58, 59,\n 8, 9, 56, 8, 56, 57, 8, 57, 58, 9, 10, 55, 9, 55, 56, 10, 11, 54, 10, 54, 55, 11, 12, 54, 12, 13, 54, 13, 14, 35, 13, 35, 54, 14, 15, 46, 14, 46, 35, 15, 16,\n 45, 15, 45, 46, 16, 26, 45, 17, 36, 18, 18, 37, 19, 18, 36, 37, 19, 38, 20, 19, 37, 38, 20, 39, 21, 20, 38, 39, 21, 39, 27, 22, 42, 23, 22, 27, 42, 23, 43, 24,\n 23, 42, 43, 24, 44, 25, 24, 43, 44, 25, 45, 26, 25, 44, 45, 27, 39, 28, 27, 28, 42, 28, 39, 29, 28, 29, 42, 29, 31, 30, 29, 30, 35, 29, 40, 31, 29, 35, 47, 29,\n 39, 40, 29, 47, 42, 30, 31, 32, 30, 32, 33, 30, 33, 34, 30, 34, 35, 31, 50, 32, 31, 40, 41, 31, 48, 49, 31, 49, 50, 32, 51, 33, 32, 50, 51, 33, 51, 34, 34, 52,\n 35, 34, 51, 52, 35, 46, 47, 35, 52, 53, 35, 53, 54, 36, 41, 37, 37, 40, 38, 37, 41, 40, 38, 40, 39, 42, 47, 43, 43, 47, 44, 44, 46, 45, 44, 47, 46, 48, 60, 49,\n 48, 59, 60, 49, 61, 50, 49, 60, 61, 50, 62, 51, 50, 61, 62, 51, 62, 52, 52, 63, 53, 52, 62, 63, 53, 64, 54, 53, 63, 64, 54, 64, 55, 55, 65, 56, 55, 64, 65, 56,\n 66, 57, 56, 65, 66, 57, 66, 58, 58, 67, 59, 58, 66, 67, 59, 67, 60, 60, 67, 61, 61, 66, 62, 61, 67, 66, 62, 66, 63, 63, 65, 64, 63, 66, 65, 21, 27, 22];\n\nexport const TRI33: Array = [\n /* eyes */ 0, 8, 7, 7, 8, 1, 2, 10, 9, 9, 10, 3,\n /* brows */ 17, 0, 18, 18, 0, 7, 18, 7, 19, 19, 7, 1, 19, 1, 11, 19, 11, 20, 21, 3, 22, 21, 9, 3, 20, 9, 21, 20, 2, 9, 20, 11, 2,\n /* 4head */ 23, 17, 18, 25, 21, 22, 24, 19, 20, 24, 18, 19, 24, 20, 21, 24, 23, 18, 24, 21, 25,\n /* nose */ 11, 12, 4, 11, 4, 13, 1, 12, 11, 11, 13, 2, 12, 14, 4, 4, 14, 13,\n /* up-lip */ 14, 5, 15, 14, 15, 6, 12, 5, 14, 14, 6, 13,\n /* cheeks */ 8, 12, 1, 2, 13, 10, 8, 26, 12, 10, 13, 27, 26, 5, 12, 13, 6, 27, 0, 26, 8, 10, 27, 3,\n /* chin */ 5, 32, 16, 16, 32, 6, 5, 30, 32, 6, 32, 31,\n /* cont */ 26, 30, 5, 27, 6, 31, 0, 28, 26, 3, 27, 29, 17, 28, 0, 3, 29, 22, 23, 28, 17, 22, 29, 25, 28, 30, 26, 27, 31, 29,\n];\n\nexport const TRI7: Array = [0, 4, 1, 2, 4, 3, 4, 5, 6];\n\nexport const VTX68: Array = [\n /* cont */ 127, 234, 132, 58, 172, 150, 149, 148, 152, 377, 378, 379, 397, 288, 361, 454, 356,\n /* brows */ 70, 63, 105, 66, 107, 336, 296, 334, 293, 300,\n /* nose */ 168, 6, 195, 4, 98, 97, 2, 326, 327,\n /* eyes */ 33, 160, 158, 133, 153, 144, 362, 385, 387, 263, 373, 380,\n /* lip */ 57, 40, 37, 0, 267, 270, 287, 321, 314, 17, 84, 91,\n /* mouth */ 78, 81, 13, 311, 308, 402, 14, 178,\n];\n\nexport const VTX33: Array = [33, 133, 362, 263, 1, 62, 308, 159, 145, 386, 374, 6, 102, 331, 2, 13, 14, 70, 105, 107, 336, 334, 300, 54, 10, 284, 50, 280, 234, 454, 58, 288, 152];\n\nexport const VTX7: Array = [33, 133, 362, 263, 1, 78, 308];\n\nexport const UV68 = VTX68.map((x) => UV468[x]);\n\nexport const UV33 = VTX33.map((x) => UV468[x]);\n\nexport const UV7 = VTX7.map((x) => UV468[x]);\n", "/**\n * BlazeFace, FaceMesh & Iris model implementation\n * See `facemesh.ts` for entry point\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as coords from './facemeshcoords';\nimport { constants } from '../tfjs/constants';\nimport type { Box, Point } from '../result';\nimport { env } from '../util/env';\n\nexport const createBox = (startEndTensor) => ({ startPoint: tf.slice(startEndTensor, [0, 0], [-1, 2]), endPoint: tf.slice(startEndTensor, [0, 2], [-1, 2]) });\n\nexport const disposeBox = (t) => tf.dispose([t.startPoint, t.endPoint]);\n\nexport const getBoxSize = (box): [number, number] => [Math.abs(box.endPoint[0] - box.startPoint[0]), Math.abs(box.endPoint[1] - box.startPoint[1])];\n\nexport const getBoxCenter = (box): [number, number, number] => [box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2, box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2, 1];\n\nexport const clampBox = (box, input): Box => (box ? [\n Math.trunc(Math.max(0, box.startPoint[0])),\n Math.trunc(Math.max(0, box.startPoint[1])),\n Math.trunc(Math.min((input.shape[2] || 0), box.endPoint[0]) - Math.max(0, box.startPoint[0])),\n Math.trunc(Math.min((input.shape[1] || 0), box.endPoint[1]) - Math.max(0, box.startPoint[1])),\n] : [0, 0, 0, 0]);\n\nexport const getRawBox = (box, input): Box => (box ? [\n box.startPoint[0] / (input.shape[2] || 0),\n box.startPoint[1] / (input.shape[1] || 0),\n (box.endPoint[0] - box.startPoint[0]) / (input.shape[2] || 0),\n (box.endPoint[1] - box.startPoint[1]) / (input.shape[1] || 0),\n] : [0, 0, 0, 0]);\n\nexport const scaleBoxCoordinates = (box, factor) => {\n const startPoint: Point = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]];\n const endPoint: Point = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]];\n return { startPoint, endPoint, landmarks: box.landmarks, confidence: box.confidence };\n};\n\nexport const cutAndResize = (box, image, cropSize) => {\n const h = image.shape[1];\n const w = image.shape[2];\n const cutBox = [box.startPoint[1] / h, box.startPoint[0] / w, box.endPoint[1] / h, box.endPoint[0] / w];\n const crop = tf.image.cropAndResize(image, [cutBox], [0], cropSize);\n const norm = tf.div(crop, constants.tf255);\n tf.dispose(crop);\n return norm;\n};\n\nexport const enlargeBox = (box, factor) => {\n const center = getBoxCenter(box);\n const size = getBoxSize(box);\n const halfSize: [number, number] = [factor * size[0] / 2, factor * size[1] / 2];\n return { startPoint: [center[0] - halfSize[0], center[1] - halfSize[1]] as Point, endPoint: [center[0] + halfSize[0], center[1] + halfSize[1]] as Point, landmarks: box.landmarks, confidence: box.confidence };\n};\n\nexport const squarifyBox = (box) => {\n const centers = getBoxCenter(box);\n const size = getBoxSize(box);\n const halfSize = Math.max(...size) / 2;\n return { startPoint: [Math.round(centers[0] - halfSize), Math.round(centers[1] - halfSize)] as Point, endPoint: [Math.round(centers[0] + halfSize), Math.round(centers[1] + halfSize)] as Point, landmarks: box.landmarks, confidence: box.confidence };\n};\n\nexport const calculateLandmarksBoundingBox = (landmarks) => {\n const x = landmarks.map((d) => d[0]);\n const y = landmarks.map((d) => d[1]);\n return { startPoint: [Math.min(...x), Math.min(...y)] as Point, endPoint: [Math.max(...x), Math.max(...y)] as Point, landmarks };\n};\n\nexport const fixedRotationMatrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];\n\nexport const normalizeRadians = (angle) => angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI));\n\nexport const computeRotation = (point1, point2) => normalizeRadians(Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]));\n\nexport const radToDegrees = (rad) => rad * 180 / Math.PI;\n\nexport const buildTranslationMatrix = (x, y) => [[1, 0, x], [0, 1, y], [0, 0, 1]];\n\nexport const dot = (v1: number[], v2: number[]) => {\n let product = 0;\n for (let i = 0; i < v1.length; i++) product += v1[i] * v2[i];\n return product;\n};\n\nexport const getColumnFrom2DArr = (arr, columnIndex) => {\n const column: Array = [];\n for (let i = 0; i < arr.length; i++) column.push(arr[i][columnIndex]);\n return column;\n};\n\nexport const multiplyTransformMatrices = (mat1, mat2) => {\n const product: Array = [];\n const size = mat1.length;\n for (let row = 0; row < size; row++) {\n product.push([]);\n for (let col = 0; col < size; col++) product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col)));\n }\n return product;\n};\n\nexport const buildRotationMatrix = (rotation, center) => {\n const cosA = Math.cos(rotation);\n const sinA = Math.sin(rotation);\n const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]];\n const translationMatrix = buildTranslationMatrix(center[0], center[1]);\n const translationTimesRotation = multiplyTransformMatrices(translationMatrix, rotationMatrix);\n const negativeTranslationMatrix = buildTranslationMatrix(-center[0], -center[1]);\n return multiplyTransformMatrices(translationTimesRotation, negativeTranslationMatrix);\n};\n\nexport const invertTransformMatrix = (matrix) => {\n const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]];\n const translationComponent = [matrix[0][2], matrix[1][2]];\n const invertedTranslation = [-dot(rotationComponent[0], translationComponent), -dot(rotationComponent[1], translationComponent)];\n return [rotationComponent[0].concat(invertedTranslation[0]), rotationComponent[1].concat(invertedTranslation[1]), [0, 0, 1]];\n};\n\nexport const rotatePoint = (homogeneousCoordinate, rotationMatrix) => [dot(homogeneousCoordinate, rotationMatrix[0]), dot(homogeneousCoordinate, rotationMatrix[1])];\n\nexport const xyDistanceBetweenPoints = (a, b) => Math.sqrt(((a[0] - b[0]) ** 2) + ((a[1] - b[1]) ** 2));\n\nexport function generateAnchors(inputSize) {\n const spec = { strides: [inputSize / 16, inputSize / 8], anchors: [2, 6] };\n const anchors: Array<[number, number]> = [];\n for (let i = 0; i < spec.strides.length; i++) {\n const stride = spec.strides[i];\n const gridRows = Math.floor((inputSize + stride - 1) / stride);\n const gridCols = Math.floor((inputSize + stride - 1) / stride);\n const anchorsNum = spec.anchors[i];\n for (let gridY = 0; gridY < gridRows; gridY++) {\n const anchorY = stride * (gridY + 0.5);\n for (let gridX = 0; gridX < gridCols; gridX++) {\n const anchorX = stride * (gridX + 0.5);\n for (let n = 0; n < anchorsNum; n++) anchors.push([anchorX, anchorY]);\n }\n }\n }\n return anchors;\n}\n\nexport function transformRawCoords(coordsRaw, box, angle, rotationMatrix, inputSize) {\n const boxSize = getBoxSize(box);\n const coordsScaled = coordsRaw.map((coord) => ([ // scaled around zero-point\n (boxSize[0] / inputSize) * (coord[0] - (inputSize / 2)),\n (boxSize[1] / inputSize) * (coord[1] - (inputSize / 2)),\n (coord[2] || 0),\n ]));\n const largeAngle = angle && (angle !== 0) && (Math.abs(angle) > 0.2);\n const coordsRotationMatrix = largeAngle ? buildRotationMatrix(angle, [0, 0]) : fixedRotationMatrix;\n const coordsRotated = largeAngle ? coordsScaled.map((coord) => ([...rotatePoint(coord, coordsRotationMatrix), coord[2]])) : coordsScaled;\n const inverseRotationMatrix = largeAngle ? invertTransformMatrix(rotationMatrix) : fixedRotationMatrix;\n const boxCenter = getBoxCenter(box);\n const offsets = [dot(boxCenter, inverseRotationMatrix[0]), dot(boxCenter, inverseRotationMatrix[1])];\n return coordsRotated.map((coord) => ([\n Math.trunc(coord[0] + offsets[0]),\n Math.trunc(coord[1] + offsets[1]),\n Math.trunc(coord[2] || 0),\n ]));\n}\n\nexport function correctFaceRotation(rotate, box, input, inputSize) {\n const symmetryLine = (box.landmarks.length >= coords.meshLandmarks.count)\n ? coords.meshLandmarks.symmetryLine\n : coords.blazeFaceLandmarks.symmetryLine;\n let angle = 0; // default\n let rotationMatrix = fixedRotationMatrix; // default\n let face; // default\n\n if (rotate && env.kernels.includes('rotatewithoffset')) { // rotateWithOffset is not defined for tfjs-node\n angle = computeRotation(box.landmarks[symmetryLine[0]], box.landmarks[symmetryLine[1]]);\n const largeAngle = angle && (angle !== 0) && (Math.abs(angle) > 0.2);\n if (largeAngle) { // perform rotation only if angle is sufficiently high\n const center: Point = getBoxCenter(box);\n const centerRaw: Point = [center[0] / input.shape[2], center[1] / input.shape[1]];\n const rotated = tf.image.rotateWithOffset(input, angle, 0, centerRaw);\n rotationMatrix = buildRotationMatrix(-angle, center);\n face = cutAndResize(box, rotated, [inputSize, inputSize]);\n tf.dispose(rotated);\n } else {\n face = cutAndResize(box, input, [inputSize, inputSize]);\n }\n } else {\n face = cutAndResize(box, input, [inputSize, inputSize]);\n }\n return [angle, rotationMatrix, face];\n}\n\nexport const findFaceCenter = (mesh) => {\n const x = mesh.map((m) => m[0]);\n const y = mesh.map((m) => m[1]);\n // weighted center\n /*\n const sum = (arr: number[]) => arr.reduce((prev, curr) => prev + curr, 0);\n return [sum(x) / mesh.length, sum(y) / mesh.length];\n */\n // absolute center\n return [Math.min(...x) + (Math.max(...x) - Math.min(...x)) / 2, Math.min(...y) + (Math.max(...y) - Math.min(...y)) / 2];\n};\n\nexport const calculateFaceBox = (mesh, previousBox) => {\n const center = findFaceCenter(mesh);\n const boxSize = getBoxSize(previousBox);\n const calculatedBox = {\n startPoint: [center[0] - boxSize[0] / 2, center[1] - boxSize[1] / 2] as Point,\n endPoint: [center[0] + boxSize[0] / 2, center[1] + boxSize[1] / 2] as Point,\n };\n return calculatedBox;\n};\n", "/**\n * BlazeFace, FaceMesh & Iris model implementation\n * See `facemesh.ts` for entry point\n */\n\nimport { log } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as util from './facemeshutil';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport type { Config } from '../config';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport { env } from '../util/env';\nimport type { Point } from '../result';\n\nconst keypointsCount = 6;\nconst faceBoxScaleFactor = 1.2;\nlet model: GraphModel | null;\nlet anchors: Tensor | null = null;\nlet inputSize = 0;\nlet inputSizeT: Tensor | null = null;\n\ntype DetectBox = { startPoint: Point, endPoint: Point, landmarks: Array, confidence: number };\n\nexport const size = () => inputSize;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.detector?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n inputSize = model.inputs[0].shape ? model.inputs[0].shape[2] : 0;\n inputSizeT = tf.scalar(inputSize, 'int32') as Tensor;\n anchors = tf.tensor2d(util.generateAnchors(inputSize)) as Tensor;\n return model;\n}\n\nfunction decodeBounds(boxOutputs: Tensor) {\n const t: Record = {};\n t.boxStarts = tf.slice(boxOutputs, [0, 1], [-1, 2]);\n t.centers = tf.add(t.boxStarts, anchors);\n t.boxSizes = tf.slice(boxOutputs, [0, 3], [-1, 2]);\n t.boxSizesNormalized = tf.div(t.boxSizes, inputSizeT);\n t.centersNormalized = tf.div(t.centers, inputSizeT);\n t.halfBoxSize = tf.div(t.boxSizesNormalized, constants.tf2);\n t.starts = tf.sub(t.centersNormalized, t.halfBoxSize);\n t.ends = tf.add(t.centersNormalized, t.halfBoxSize);\n t.startNormalized = tf.mul(t.starts, inputSizeT);\n t.endNormalized = tf.mul(t.ends, inputSizeT);\n const boxes = tf.concat2d([t.startNormalized, t.endNormalized], 1);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return boxes;\n}\n\nexport async function getBoxes(inputImage: Tensor, config: Config) {\n // sanity check on input\n if ((!inputImage) || (inputImage['isDisposedInternal']) || (inputImage.shape.length !== 4) || (inputImage.shape[1] < 1) || (inputImage.shape[2] < 1)) return [];\n const t: Record = {};\n\n t.resized = tf.image.resizeBilinear(inputImage, [inputSize, inputSize]);\n t.div = tf.div(t.resized, constants.tf127);\n t.normalized = tf.sub(t.div, constants.tf05);\n const res = model?.execute(t.normalized) as Tensor[];\n if (Array.isArray(res)) { // are we using tfhub or pinto converted model?\n const sorted = res.sort((a, b) => a.size - b.size);\n t.concat384 = tf.concat([sorted[0], sorted[2]], 2); // dim: 384, 1 + 16\n t.concat512 = tf.concat([sorted[1], sorted[3]], 2); // dim: 512, 1 + 16\n t.concat = tf.concat([t.concat512, t.concat384], 1);\n t.batch = tf.squeeze(t.concat, 0);\n } else {\n t.batch = tf.squeeze(res); // when using tfhub model\n }\n tf.dispose(res);\n t.boxes = decodeBounds(t.batch);\n t.logits = tf.slice(t.batch, [0, 0], [-1, 1]);\n t.sigmoid = tf.sigmoid(t.logits);\n t.scores = tf.squeeze(t.sigmoid);\n t.nms = await tf.image.nonMaxSuppressionAsync(t.boxes, t.scores, (config.face.detector?.maxDetected || 0), (config.face.detector?.iouThreshold || 0), (config.face.detector?.minConfidence || 0));\n const nms = await t.nms.array() as number[];\n const boxes: Array = [];\n const scores = await t.scores.data();\n for (let i = 0; i < nms.length; i++) {\n const confidence = scores[nms[i]];\n if (confidence > (config.face.detector?.minConfidence || 0)) {\n const b: Record = {};\n b.bbox = tf.slice(t.boxes, [nms[i], 0], [1, -1]);\n b.slice = tf.slice(t.batch, [nms[i], keypointsCount - 1], [1, -1]);\n b.squeeze = tf.squeeze(b.slice);\n b.landmarks = tf.reshape(b.squeeze, [keypointsCount, -1]);\n const points = await b.bbox.data();\n const rawBox = {\n startPoint: [points[0], points[1]] as Point,\n endPoint: [points[2], points[3]] as Point,\n landmarks: (await b.landmarks.array()) as Point[],\n confidence,\n };\n const scaledBox = util.scaleBoxCoordinates(rawBox, [(inputImage.shape[2] || 0) / inputSize, (inputImage.shape[1] || 0) / inputSize]);\n const enlargedBox = util.enlargeBox(scaledBox, config.face['scale'] || faceBoxScaleFactor);\n const squaredBox = util.squarifyBox(enlargedBox);\n boxes.push(squaredBox);\n Object.keys(b).forEach((tensor) => tf.dispose(b[tensor]));\n }\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return boxes;\n}\n", "/* eslint-disable no-multi-spaces */\n\nexport const kpt: Array = [\n 'nose', // 0\n 'leftEyeInside', // 1\n 'leftEye', // 2\n 'leftEyeOutside', // 3\n 'rightEyeInside', // 4\n 'rightEye', // 5\n 'rightEyeOutside', // 6\n 'leftEar', // 7\n 'rightEar', // 8\n 'leftMouth', // 9\n 'rightMouth', // 10\n 'leftShoulder', // 11\n 'rightShoulder', // 12\n 'leftElbow', // 13\n 'rightElbow', // 14\n 'leftWrist', // 15\n 'rightWrist', // 16\n 'leftPinky', // 17\n 'rightPinky', // 18\n 'leftIndex', // 19\n 'rightIndex', // 20\n 'leftThumb', // 21\n 'rightThumb', // 22\n 'leftHip', // 23\n 'rightHip', // 24\n 'leftKnee', // 25\n 'rightKnee', // 26\n 'leftAnkle', // 27\n 'rightAnkle', // 28\n 'leftHeel', // 29\n 'rightHeel', // 30\n 'leftFoot', // 31\n 'rightFoot', // 32\n 'bodyCenter', // 33\n 'bodyTop', // 34\n 'leftPalm', // 35 // z-coord not ok\n 'leftHand', // 36 // similar to wrist but z-coord not ok\n 'rightPalm', // 37 // z-coord not ok\n 'rightHand', // 38 // similar to wrist but z-coord not ok\n];\n\nexport const connected: Record = {\n shoulders: ['leftShoulder', 'rightShoulder'],\n hips: ['rightHip', 'leftHip'],\n mouth: ['leftMouth', 'rightMouth'],\n leftLegUpper: ['leftHip', 'leftKnee'],\n leftLegLower: ['leftKnee', 'leftAnkle'],\n leftFoot: ['leftAnkle', 'leftHeel', 'leftFoot'],\n leftTorso: ['leftShoulder', 'leftHip'],\n leftArmUpper: ['leftShoulder', 'leftElbow'],\n leftArmLower: ['leftElbow', 'leftWrist'],\n leftHand: ['leftWrist', 'leftPalm'],\n leftHandPinky: ['leftPalm', 'leftPinky'],\n leftHandIndex: ['leftPalm', 'leftIndex'],\n leftHandThumb: ['leftPalm', 'leftThumb'],\n leftEyeOutline: ['leftEyeInside', 'leftEyeOutside'],\n rightLegUpper: ['rightHip', 'rightKnee'],\n rightLegLower: ['rightKnee', 'rightAnkle'],\n rightFoot: ['rightAnkle', 'rightHeel', 'rightFoot'],\n rightTorso: ['rightShoulder', 'rightHip'],\n rightArmUpper: ['rightShoulder', 'rightElbow'],\n rightArmLower: ['rightElbow', 'rightWrist'],\n rightHand: ['rightWrist', 'rightPalm'],\n rightHandPinky: ['rightPalm', 'rightPinky'],\n rightHandIndex: ['rightPalm', 'rightIndex'],\n rightHandThumb: ['rightPalm', 'rightThumb'],\n rightEyeOutline: ['rightEyeInside', 'rightEyeOutside'],\n};\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport type { Tensor } from '../tfjs/types';\nimport type { Box } from '../result';\nimport type { Config } from '../config';\n\ninterface DetectedBox { box: Box, boxRaw: Box, score: number }\n\nconst inputSize = 224;\nlet anchorTensor: { x, y };\nconst numLayers = 5;\nconst strides = [8, 16, 32, 32, 32];\n\nexport async function createAnchors() {\n const anchors: Array<{ x: number, y: number }> = [];\n let layerId = 0;\n while (layerId < numLayers) {\n let anchorCount = 0;\n let lastSameStrideLayer = layerId;\n while (lastSameStrideLayer < strides.length && strides[lastSameStrideLayer] === strides[layerId]) {\n anchorCount += 2;\n lastSameStrideLayer++;\n }\n const stride = strides[layerId];\n const featureMapHeight = Math.ceil(inputSize / stride);\n const featureMapWidth = Math.ceil(inputSize / stride);\n for (let y = 0; y < featureMapHeight; ++y) {\n for (let x = 0; x < featureMapWidth; ++x) {\n for (let anchorId = 0; anchorId < anchorCount; ++anchorId) {\n anchors.push({ x: (x + 0.5) / featureMapWidth, y: (y + 0.5) / featureMapHeight });\n }\n }\n }\n layerId = lastSameStrideLayer;\n }\n anchorTensor = { x: tf.tensor1d(anchors.map((a) => a.x)), y: tf.tensor1d(anchors.map((a) => a.y)) };\n}\n\nconst cropFactor = [5.0, 5.0];\nfunction decodeBoxes(boxesTensor, anchor): Tensor {\n return tf.tidy(() => {\n const split = tf.split(boxesTensor, 12, 1); // first 4 are box data [x,y,w,h] and 4 are keypoints data [x,y] for total of 12\n let xCenter = tf.squeeze(split[0]);\n let yCenter = tf.squeeze(split[1]);\n let width = tf.squeeze(split[2]);\n let height = tf.squeeze(split[3]);\n xCenter = tf.add(tf.div(xCenter, inputSize), anchor.x);\n yCenter = tf.add(tf.div(yCenter, inputSize), anchor.y);\n width = tf.mul(tf.div(width, inputSize), cropFactor[0]);\n height = tf.mul(tf.div(height, inputSize), cropFactor[1]);\n const xMin = tf.sub(xCenter, tf.div(width, 2));\n const yMin = tf.sub(yCenter, tf.div(height, 2));\n const boxes = tf.stack([xMin, yMin, width, height], 1);\n return boxes;\n });\n}\n\nexport async function decode(boxesTensor: Tensor, logitsTensor: Tensor, config: Config, outputSize: [number, number]): Promise {\n const t: Record = {};\n t.boxes = decodeBoxes(boxesTensor, anchorTensor);\n t.scores = tf.sigmoid(logitsTensor);\n t.argmax = tf.argMax(t.scores);\n const i = (await t.argmax.data())[0] as number;\n const scores = await t.scores.data();\n const detected: Array<{ box: Box, boxRaw: Box, score: number }> = [];\n const minScore = (config.body['detector'] && config.body['detector']['minConfidence']) ? config.body['detector']['minConfidence'] : 0;\n if (scores[i] >= minScore) {\n const boxes = await t.boxes.array();\n const boxRaw: Box = boxes[i];\n const box: Box = [boxRaw[0] * outputSize[0], boxRaw[1] * outputSize[1], boxRaw[2] * outputSize[0], boxRaw[3] * outputSize[1]];\n // console.log(box);\n detected.push({ box, boxRaw, score: scores[i] });\n }\n /*\n t.nms = await tf.image.nonMaxSuppressionAsync(t.boxes, t.scores, 1, config.body.detector?.minConfidence || 0.1, config.body.detector?.iouThreshold || 0.1);\n const boxes = t.boxes.arraySync();\n const scores = t.scores.dataSync();\n const nms = t.nms.dataSync();\n const detected: Array = [];\n for (const i of Array.from(nms)) {\n const boxRaw: Box = boxes[i];\n const box: Box = [boxRaw[0] * outputSize[0], boxRaw[0] * outputSize[1], boxRaw[3] * outputSize[0], boxRaw[2] * outputSize[1]];\n detected.push({ box, boxRaw, score: scores[i] });\n }\n */\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return detected;\n}\n", "import type { Point, Box } from '../result';\n\nexport function calc(keypoints: Array, outputSize: [number, number] = [1, 1]) {\n const coords = [keypoints.map((pt) => pt[0]), keypoints.map((pt) => pt[1])]; // all x/y coords\n const min = [Math.min(...coords[0]), Math.min(...coords[1])];\n const max = [Math.max(...coords[0]), Math.max(...coords[1])];\n const box: Box = [min[0], min[1], max[0] - min[0], max[1] - min[1]];\n const boxRaw: Box = [box[0] / outputSize[0], box[1] / outputSize[1], box[2] / outputSize[0], box[3] / outputSize[1]];\n return { box, boxRaw };\n}\n\nexport function square(keypoints: Array, outputSize: [number, number] = [1, 1]) {\n const coords = [keypoints.map((pt) => pt[0]), keypoints.map((pt) => pt[1])]; // all x/y coords\n const min = [Math.min(...coords[0]), Math.min(...coords[1])];\n const max = [Math.max(...coords[0]), Math.max(...coords[1])];\n const center = [(min[0] + max[0]) / 2, (min[1] + max[1]) / 2]; // find center x and y coord of all fingers\n const dist = Math.max(center[0] - min[0], center[1] - min[1], -center[0] + max[0], -center[1] + max[1]); // largest distance from center in any direction\n const box: Box = [Math.trunc(center[0] - dist), Math.trunc(center[1] - dist), Math.trunc(2 * dist), Math.trunc(2 * dist)];\n const boxRaw: Box = [box[0] / outputSize[0], box[1] / outputSize[1], box[2] / outputSize[0], box[3] / outputSize[1]];\n return { box, boxRaw };\n}\n\nexport function scale(box: Box, scaleFact: number) {\n const dist = [box[2] * scaleFact, box[3] * scaleFact];\n const newBox: Box = [\n box[0] - (dist[0] - box[2]) / 2,\n box[1] - (dist[1] - box[3]) / 2,\n dist[0],\n dist[1],\n ];\n return newBox;\n}\n\nexport function crop(box: Box) { // [y1, x1, y2, x2] clamped to 0..1\n const yxBox: Box = [Math.max(0, box[1]), Math.max(0, box[0]), Math.min(1, box[3] + box[1]), Math.min(1, box[2] + box[0])];\n return yxBox;\n}\n", "/**\n * BlazePose model implementation\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport { log, now } from '../util/util';\nimport type { BodyKeypoint, BodyResult, BodyLandmark, Box, Point, BodyAnnotation } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport * as coords from './blazeposecoords';\nimport * as detect from './blazeposedetector';\nimport * as box from '../util/box';\n\nconst env = { initial: true };\n// const models: [GraphModel | null, GraphModel | null] = [null, null];\nconst models: { detector: GraphModel | null, landmarks: GraphModel | null } = { detector: null, landmarks: null };\nconst inputSize: { detector: [number, number], landmarks: [number, number] } = { detector: [224, 224], landmarks: [256, 256] };\nlet skipped = Number.MAX_SAFE_INTEGER;\nconst outputNodes: { detector: string[], landmarks: string[] } = {\n landmarks: ['ld_3d', 'activation_segmentation', 'activation_heatmap', 'world_3d', 'output_poseflag'],\n detector: [],\n};\n\nlet cache: BodyResult | null = null;\nlet cropBox: Box | undefined;\nlet padding: [number, number][] = [[0, 0], [0, 0], [0, 0], [0, 0]];\nlet lastTime = 0;\n\nconst sigmoid = (x) => (1 - (1 / (1 + Math.exp(x))));\n\nexport async function loadDetect(config: Config): Promise {\n if (env.initial) models.detector = null;\n if (!models.detector && config.body['detector'] && config.body['detector']['modelPath'] || '') {\n models.detector = await loadModel(config.body['detector']['modelPath']);\n const inputs = Object.values(models.detector.modelSignature['inputs']);\n inputSize.detector[0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;\n inputSize.detector[1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug && models.detector) log('cached model:', models.detector['modelUrl']);\n await detect.createAnchors();\n return models.detector as GraphModel;\n}\n\nexport async function loadPose(config: Config): Promise {\n if (env.initial) models.landmarks = null;\n if (!models.landmarks) {\n models.landmarks = await loadModel(config.body.modelPath);\n const inputs = Object.values(models.landmarks.modelSignature['inputs']);\n inputSize.landmarks[0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;\n inputSize.landmarks[1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug) log('cached model:', models.landmarks['modelUrl']);\n return models.landmarks;\n}\n\nexport async function load(config: Config): Promise<[GraphModel | null, GraphModel | null]> {\n if (!models.detector) await loadDetect(config);\n if (!models.landmarks) await loadPose(config);\n return [models.detector, models.landmarks];\n}\n\nasync function prepareImage(input: Tensor, size: number): Promise {\n const t: Record = {};\n if (!input.shape || !input.shape[1] || !input.shape[2]) return input;\n let final: Tensor;\n if (cropBox) {\n t.cropped = tf.image.cropAndResize(input, [cropBox], [0], [input.shape[1], input.shape[2]]); // if we have cached box use it to crop input\n }\n if (input.shape[1] !== input.shape[2]) { // only pad if width different than height\n const height: [number, number] = [\n input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0,\n input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0,\n ];\n const width: [number, number] = [\n input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0,\n input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0,\n ];\n padding = [\n [0, 0], // dont touch batch\n height, // height before&after\n width, // width before&after\n [0, 0], // dont touch rbg\n ];\n t.pad = tf.pad(t.cropped || input, padding); // use cropped box if it exists\n t.resize = tf.image.resizeBilinear(t.pad, [size, size]);\n final = tf.div(t.resize, constants.tf255);\n } else if (input.shape[1] !== size) { // if input needs resizing\n t.resize = tf.image.resizeBilinear(t.cropped || input, [size, size]);\n final = tf.div(t.resize, constants.tf255);\n } else { // if input is already in a correct resolution just normalize it\n final = tf.div(t.cropped || input, constants.tf255);\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return final;\n}\n\nfunction rescaleKeypoints(keypoints: Array, outputSize: [number, number]): Array {\n for (const kpt of keypoints) { // first rescale due to padding\n kpt.position = [\n Math.trunc(kpt.position[0] * (outputSize[0] + padding[2][0] + padding[2][1]) / outputSize[0] - padding[2][0]),\n Math.trunc(kpt.position[1] * (outputSize[1] + padding[1][0] + padding[1][1]) / outputSize[1] - padding[1][0]),\n kpt.position[2] as number,\n ];\n kpt.positionRaw = [kpt.position[0] / outputSize[0], kpt.position[1] / outputSize[1], 2 * (kpt.position[2] as number) / (outputSize[0] + outputSize[1])];\n }\n if (cropBox) { // second rescale due to cropping\n for (const kpt of keypoints) {\n kpt.positionRaw = [\n kpt.positionRaw[0] + cropBox[1], // correct offset due to crop\n kpt.positionRaw[1] + cropBox[0], // correct offset due to crop\n kpt.positionRaw[2] as number,\n ];\n kpt.position = [\n Math.trunc(kpt.positionRaw[0] * outputSize[0]),\n Math.trunc(kpt.positionRaw[1] * outputSize[1]),\n kpt.positionRaw[2] as number,\n ];\n }\n }\n return keypoints;\n}\n\nasync function fixKeypoints(keypoints: Array) {\n // palm z-coord is incorrect around near-zero so we approximate it\n const leftPalm = keypoints.find((k) => k.part === 'leftPalm') as BodyKeypoint;\n const leftWrist = keypoints.find((k) => k.part === 'leftWrist') as BodyKeypoint;\n const leftIndex = keypoints.find((k) => k.part === 'leftIndex') as BodyKeypoint;\n leftPalm.position[2] = ((leftWrist.position[2] || 0) + (leftIndex.position[2] || 0)) / 2;\n const rightPalm = keypoints.find((k) => k.part === 'rightPalm') as BodyKeypoint;\n const rightWrist = keypoints.find((k) => k.part === 'rightWrist') as BodyKeypoint;\n const rightIndex = keypoints.find((k) => k.part === 'rightIndex') as BodyKeypoint;\n rightPalm.position[2] = ((rightWrist.position[2] || 0) + (rightIndex.position[2] || 0)) / 2;\n}\n\nasync function detectLandmarks(input: Tensor, config: Config, outputSize: [number, number]): Promise {\n /**\n * t.ld: 39 keypoints [x,y,z,score,presence] normalized to input size\n * t.segmentation:\n * t.heatmap:\n * t.world: 39 keypoints [x,y,z] normalized to -1..1\n * t.poseflag: body score\n */\n const t: Record = {};\n [t.ld/* 1,195(39*5) */, t.segmentation/* 1,256,256,1 */, t.heatmap/* 1,64,64,39 */, t.world/* 1,117(39*3) */, t.poseflag/* 1,1 */] = models.landmarks?.execute(input, outputNodes.landmarks) as Tensor[]; // run model\n const poseScore = (await t.poseflag.data())[0];\n const points = await t.ld.data();\n const distances = await t.world.data();\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor])); // dont need tensors after this\n const keypointsRelative: Array = [];\n const depth = 5; // each points has x,y,z,visibility,presence\n for (let i = 0; i < points.length / depth; i++) {\n const score = sigmoid(points[depth * i + 3]);\n const presence = sigmoid(points[depth * i + 4]);\n const adjScore = Math.trunc(100 * score * presence * poseScore) / 100;\n const positionRaw: Point = [points[depth * i + 0] / inputSize.landmarks[0], points[depth * i + 1] / inputSize.landmarks[1], points[depth * i + 2] + 0];\n const position: Point = [Math.trunc(outputSize[0] * positionRaw[0]), Math.trunc(outputSize[1] * positionRaw[1]), positionRaw[2] as number];\n const distance: Point = [distances[depth * i + 0], distances[depth * i + 1], distances[depth * i + 2] + 0];\n keypointsRelative.push({ part: coords.kpt[i] as BodyLandmark, positionRaw, position, distance, score: adjScore });\n }\n if (poseScore < (config.body.minConfidence || 0)) return null;\n fixKeypoints(keypointsRelative);\n const keypoints: Array = rescaleKeypoints(keypointsRelative, outputSize); // keypoints were relative to input image which is padded\n const kpts = keypoints.map((k) => k.position);\n const boxes = box.calc(kpts, [outputSize[0], outputSize[1]]); // now find boxes based on rescaled keypoints\n const annotations: Record = {} as Record;\n for (const [name, indexes] of Object.entries(coords.connected)) {\n const pt: Array = [];\n for (let i = 0; i < indexes.length - 1; i++) {\n const pt0 = keypoints.find((kpt) => kpt.part === indexes[i]);\n const pt1 = keypoints.find((kpt) => kpt.part === indexes[i + 1]);\n if (pt0 && pt1) pt.push([pt0.position, pt1.position]);\n }\n annotations[name] = pt;\n }\n const body = { id: 0, score: Math.trunc(100 * poseScore) / 100, box: boxes.box, boxRaw: boxes.boxRaw, keypoints, annotations };\n return body;\n}\n\n/*\ninterface DetectedBox { box: Box, boxRaw: Box, score: number }\n\nfunction rescaleBoxes(boxes: Array, outputSize: [number, number]): Array {\n for (const b of boxes) {\n b.box = [\n Math.trunc(b.box[0] * (outputSize[0] + padding[2][0] + padding[2][1]) / outputSize[0]),\n Math.trunc(b.box[1] * (outputSize[1] + padding[1][0] + padding[1][1]) / outputSize[1]),\n Math.trunc(b.box[2] * (outputSize[0] + padding[2][0] + padding[2][1]) / outputSize[0]),\n Math.trunc(b.box[3] * (outputSize[1] + padding[1][0] + padding[1][1]) / outputSize[1]),\n ];\n b.boxRaw = [b.box[0] / outputSize[0], b.box[1] / outputSize[1], b.box[2] / outputSize[0], b.box[3] / outputSize[1]];\n }\n return boxes;\n}\n\nasync function detectBoxes(input: Tensor, config: Config, outputSize: [number, number]) {\n const t: Record = {};\n t.res = models.detector?.execute(input, ['Identity']) as Tensor; //\n t.logitsRaw = tf.slice(t.res, [0, 0, 0], [1, -1, 1]);\n t.boxesRaw = tf.slice(t.res, [0, 0, 1], [1, -1, -1]);\n t.logits = tf.squeeze(t.logitsRaw);\n t.boxes = tf.squeeze(t.boxesRaw);\n const boxes = await detect.decode(t.boxes, t.logits, config, outputSize);\n rescaleBoxes(boxes, outputSize);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return boxes;\n}\n*/\n\nexport async function predict(input: Tensor, config: Config): Promise {\n const outputSize: [number, number] = [input.shape[2] || 0, input.shape[1] || 0];\n const skipTime = (config.body.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.body.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && cache !== null) {\n skipped++;\n } else {\n const t: Record = {};\n /*\n if (config.body['detector'] && config.body['detector']['enabled']) {\n t.detector = await prepareImage(input, 224);\n const boxes = await detectBoxes(t.detector, config, outputSize);\n }\n */\n t.landmarks = await prepareImage(input, 256); // padded and resized\n cache = await detectLandmarks(t.landmarks, config, outputSize);\n /*\n cropBox = [0, 0, 1, 1]; // reset crop coordinates\n if (cache?.boxRaw && config.skipAllowed) {\n const cx = (2.0 * cache.boxRaw[0] + cache.boxRaw[2]) / 2;\n const cy = (2.0 * cache.boxRaw[1] + cache.boxRaw[3]) / 2;\n let size = cache.boxRaw[2] > cache.boxRaw[3] ? cache.boxRaw[2] : cache.boxRaw[3];\n size = (size * 1.0) / 2; // enlarge and half it\n if (cx > 0.1 && cx < 0.9 && cy > 0.1 && cy < 0.9 && size > 0.1) { // only update if box is sane\n const y = 0; // cy - size;\n const x = cx - size;\n cropBox = [y, x, y + 1, x + 1]; // [y0,x0,y1,x1] used for cropping but width/height are not yet implemented so we only reposition image to center of body\n }\n }\n */\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n lastTime = now();\n skipped = 0;\n }\n return cache ? [cache] : [];\n}\n", "/**\n * CoCo Labels used by object detection implementations\n */\nexport const labels = [\n { class: 1, label: 'person' },\n { class: 2, label: 'bicycle' },\n { class: 3, label: 'car' },\n { class: 4, label: 'motorcycle' },\n { class: 5, label: 'airplane' },\n { class: 6, label: 'bus' },\n { class: 7, label: 'train' },\n { class: 8, label: 'truck' },\n { class: 9, label: 'boat' },\n { class: 10, label: 'traffic light' },\n { class: 11, label: 'fire hydrant' },\n { class: 12, label: 'stop sign' },\n { class: 13, label: 'parking meter' },\n { class: 14, label: 'bench' },\n { class: 15, label: 'bird' },\n { class: 16, label: 'cat' },\n { class: 17, label: 'dog' },\n { class: 18, label: 'horse' },\n { class: 19, label: 'sheep' },\n { class: 20, label: 'cow' },\n { class: 21, label: 'elephant' },\n { class: 22, label: 'bear' },\n { class: 23, label: 'zebra' },\n { class: 24, label: 'giraffe' },\n { class: 25, label: 'backpack' },\n { class: 26, label: 'umbrella' },\n { class: 27, label: 'handbag' },\n { class: 28, label: 'tie' },\n { class: 29, label: 'suitcase' },\n { class: 30, label: 'frisbee' },\n { class: 31, label: 'skis' },\n { class: 32, label: 'snowboard' },\n { class: 33, label: 'sports ball' },\n { class: 34, label: 'kite' },\n { class: 35, label: 'baseball bat' },\n { class: 36, label: 'baseball glove' },\n { class: 37, label: 'skateboard' },\n { class: 38, label: 'surfboard' },\n { class: 39, label: 'tennis racket' },\n { class: 40, label: 'bottle' },\n { class: 41, label: 'wine glass' },\n { class: 42, label: 'cup' },\n { class: 43, label: 'fork' },\n { class: 44, label: 'knife' },\n { class: 45, label: 'spoon' },\n { class: 46, label: 'bowl' },\n { class: 47, label: 'banana' },\n { class: 48, label: 'apple' },\n { class: 49, label: 'sandwich' },\n { class: 50, label: 'orange' },\n { class: 51, label: 'broccoli' },\n { class: 52, label: 'carrot' },\n { class: 53, label: 'hot dog' },\n { class: 54, label: 'pizza' },\n { class: 55, label: 'donut' },\n { class: 56, label: 'cake' },\n { class: 57, label: 'chair' },\n { class: 58, label: 'couch' },\n { class: 59, label: 'potted plant' },\n { class: 60, label: 'bed' },\n { class: 61, label: 'dining table' },\n { class: 62, label: 'toilet' },\n { class: 63, label: 'tv' },\n { class: 64, label: 'laptop' },\n { class: 65, label: 'mouse' },\n { class: 66, label: 'remote' },\n { class: 67, label: 'keyboard' },\n { class: 68, label: 'cell phone' },\n { class: 69, label: 'microwave' },\n { class: 70, label: 'oven' },\n { class: 71, label: 'toaster' },\n { class: 72, label: 'sink' },\n { class: 73, label: 'refrigerator' },\n { class: 74, label: 'book' },\n { class: 75, label: 'clock' },\n { class: 76, label: 'vase' },\n { class: 77, label: 'scissors' },\n { class: 78, label: 'teddy bear' },\n { class: 79, label: 'hair drier' },\n { class: 80, label: 'toothbrush' },\n];\n", "/**\n * CenterNet object detection model implementation\n *\n * Based on: [**NanoDet**](https://github.com/RangiLyu/nanodet)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { labels } from './labels';\nimport type { ObjectResult, ObjectType, Box } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nlet inputSize = 0;\nlet last: ObjectResult[] = [];\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) {\n // fakeOps(['floormod'], config);\n model = await loadModel(config.object.modelPath);\n const inputs = Object.values(model.modelSignature['inputs']);\n inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nasync function process(res: Tensor | null, outputShape: [number, number], config: Config) {\n if (!res) return [];\n const t: Record = {};\n const results: Array = [];\n const detections = await res.array() as number[][][];\n t.squeeze = tf.squeeze(res);\n const arr = tf.split(t.squeeze, 6, 1) as Tensor[]; // x1, y1, x2, y2, score, class\n t.stack = tf.stack([arr[1], arr[0], arr[3], arr[2]], 1); // reorder dims as tf.nms expects y, x\n t.boxes = tf.squeeze(t.stack);\n t.scores = tf.squeeze(arr[4]);\n t.classes = tf.squeeze(arr[5]);\n tf.dispose([res, ...arr]);\n t.nms = await tf.image.nonMaxSuppressionAsync(t.boxes, t.scores, config.object.maxDetected, config.object.iouThreshold, (config.object.minConfidence || 0));\n const nms = await t.nms.data();\n let i = 0;\n for (const id of Array.from(nms)) {\n const score = Math.trunc(100 * detections[0][id][4]) / 100;\n const classVal = detections[0][id][5];\n const label = labels[classVal].label as ObjectType;\n const [x, y] = [\n detections[0][id][0] / inputSize,\n detections[0][id][1] / inputSize,\n ];\n const boxRaw: Box = [\n x,\n y,\n detections[0][id][2] / inputSize - x,\n detections[0][id][3] / inputSize - y,\n ];\n const box: Box = [\n Math.trunc(boxRaw[0] * outputShape[0]),\n Math.trunc(boxRaw[1] * outputShape[1]),\n Math.trunc(boxRaw[2] * outputShape[0]),\n Math.trunc(boxRaw[3] * outputShape[1]),\n ];\n results.push({ id: i++, score, class: classVal, label, box, boxRaw });\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return results;\n}\n\nexport async function predict(input: Tensor, config: Config): Promise {\n const skipTime = (config.object.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.object.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && (last.length > 0)) {\n skipped++;\n return last;\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const outputSize = [input.shape[2] || 0, input.shape[1] || 0] as [number, number];\n const resize = tf.image.resizeBilinear(input, [inputSize, inputSize]);\n const objectT = config.object.enabled ? model?.execute(resize, ['tower_0/detections']) as Tensor : null;\n lastTime = now();\n tf.dispose(resize);\n\n const obj = await process(objectT, outputSize, config);\n last = obj;\n\n resolve(obj);\n });\n}\n", "export const kpt: Array = [\n 'head',\n 'neck',\n 'rightShoulder',\n 'rightElbow',\n 'rightWrist',\n 'chest',\n 'leftShoulder',\n 'leftElbow',\n 'leftWrist',\n 'bodyCenter',\n 'rightHip',\n 'rightKnee',\n 'rightAnkle',\n 'leftHip',\n 'leftKnee',\n 'leftAnkle',\n];\n\nexport const connected: Record = {\n leftLeg: ['leftHip', 'leftKnee', 'leftAnkle'],\n rightLeg: ['rightHip', 'rightKnee', 'rightAnkle'],\n torso: ['leftShoulder', 'rightShoulder', 'rightHip', 'leftHip', 'leftShoulder'],\n leftArm: ['leftShoulder', 'leftElbow', 'leftWrist'],\n rightArm: ['rightShoulder', 'rightElbow', 'rightWrist'],\n head: [],\n};\n", "/**\n * EfficientPose model implementation\n *\n * Based on: [**EfficientPose**](https://github.com/daniegr/EfficientPose)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport * as coords from './efficientposecoords';\nimport { constants } from '../tfjs/constants';\nimport type { BodyResult, Point, BodyLandmark, BodyAnnotation } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nlet lastTime = 0;\nconst cache: BodyResult = { id: 0, keypoints: [], box: [0, 0, 0, 0], boxRaw: [0, 0, 0, 0], score: 0, annotations: {} as Record };\n\n// const keypoints: Array = [];\n// let box: Box = [0, 0, 0, 0];\n// let boxRaw: Box = [0, 0, 0, 0];\n// let score = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.body.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n// performs argmax and max functions on a 2d tensor\nasync function max2d(inputs, minScore) {\n const [width, height] = inputs.shape;\n const reshaped = tf.reshape(inputs, [height * width]); // combine all data\n const max = tf.max(reshaped, 0);\n const newScore = (await max.data())[0]; // get highest score\n tf.dispose([reshaped, max]);\n if (newScore > minScore) { // skip coordinate calculation is score is too low\n const coordinates = tf.argMax(reshaped, 0);\n const mod = tf.mod(coordinates, width);\n const x = (await mod.data())[0];\n const div = tf.div(coordinates, tf.scalar(width, 'int32'));\n const y = (await div.data())[0];\n tf.dispose([mod, div]);\n return [x, y, newScore];\n }\n return [0, 0, newScore];\n}\n\nexport async function predict(image: Tensor, config: Config): Promise {\n const skipTime = (config.body.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.body.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && Object.keys(cache.keypoints).length > 0) {\n skipped++;\n return [cache];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const tensor = tf.tidy(() => {\n if (!model?.inputs[0].shape) return null;\n const resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n const enhance = tf.mul(resize, constants.tf2);\n const norm = tf.sub(enhance, constants.tf1);\n return norm;\n });\n\n let resT;\n if (config.body.enabled) resT = model?.execute(tensor);\n lastTime = now();\n tf.dispose(tensor);\n\n if (resT) {\n cache.keypoints.length = 0;\n const squeeze = resT.squeeze();\n tf.dispose(resT);\n // body parts are basically just a stack of 2d tensors\n const stack = squeeze.unstack(2);\n tf.dispose(squeeze);\n // process each unstacked tensor as a separate body part\n for (let id = 0; id < stack.length; id++) {\n // actual processing to get coordinates and score\n const [x, y, partScore] = await max2d(stack[id], config.body.minConfidence);\n if (partScore > (config.body?.minConfidence || 0)) {\n cache.keypoints.push({\n score: Math.round(100 * partScore) / 100,\n part: coords.kpt[id] as BodyLandmark,\n positionRaw: [ // normalized to 0..1\n // @ts-ignore model is not undefined here\n x / model.inputs[0].shape[2], y / model.inputs[0].shape[1],\n ],\n position: [ // normalized to input image size\n // @ts-ignore model is not undefined here\n Math.round(image.shape[2] * x / model.inputs[0].shape[2]), Math.round(image.shape[1] * y / model.inputs[0].shape[1]),\n ],\n });\n }\n }\n stack.forEach((s) => tf.dispose(s));\n }\n cache.score = cache.keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n const x = cache.keypoints.map((a) => a.position[0]);\n const y = cache.keypoints.map((a) => a.position[1]);\n cache.box = [\n Math.min(...x),\n Math.min(...y),\n Math.max(...x) - Math.min(...x),\n Math.max(...y) - Math.min(...y),\n ];\n const xRaw = cache.keypoints.map((a) => a.positionRaw[0]);\n const yRaw = cache.keypoints.map((a) => a.positionRaw[1]);\n cache.boxRaw = [\n Math.min(...xRaw),\n Math.min(...yRaw),\n Math.max(...xRaw) - Math.min(...xRaw),\n Math.max(...yRaw) - Math.min(...yRaw),\n ];\n for (const [name, indexes] of Object.entries(coords.connected)) {\n const pt: Array = [];\n for (let i = 0; i < indexes.length - 1; i++) {\n const pt0 = cache.keypoints.find((kpt) => kpt.part === indexes[i]);\n const pt1 = cache.keypoints.find((kpt) => kpt.part === indexes[i + 1]);\n if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);\n }\n cache.annotations[name] = pt;\n }\n resolve([cache]);\n });\n}\n", "/**\n * Emotion model implementation\n *\n * [**Oarriaga**](https://github.com/oarriaga/face_classification)\n */\n\nimport type { Emotion } from '../result';\nimport { log, now } from '../util/util';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { env } from '../util/env';\nimport { constants } from '../tfjs/constants';\n\nconst annotations = ['angry', 'disgust', 'fear', 'happy', 'sad', 'surprise', 'neutral'];\nlet model: GraphModel | null;\nconst last: Array> = [];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.emotion?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise> {\n if (!model) return [];\n const skipFrame = skipped < (config.face.emotion?.skipFrames || 0);\n const skipTime = (config.face.emotion?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && last[idx] && (last[idx].length > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const obj: Array<{ score: number, emotion: Emotion }> = [];\n if (config.face.emotion?.enabled) {\n const t: Record = {};\n const inputSize = model?.inputs[0].shape ? model.inputs[0].shape[2] : 0;\n t.resize = tf.image.resizeBilinear(image, [inputSize, inputSize], false);\n // const box = [[0.15, 0.15, 0.85, 0.85]]; // empyrical values for top, left, bottom, right\n // const resize = tf.image.cropAndResize(image, box, [0], [inputSize, inputSize]);\n // [t.red, t.green, t.blue] = tf.split(t.resize, 3, 3);\n // weighted rgb to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\n // t.redNorm = tf.mul(t.red, rgb[0]);\n // t.greenNorm = tf.mul(t.green, rgb[1]);\n // t.blueNorm = tf.mul(t.blue, rgb[2]);\n // t.grayscale = tf.addN([t.redNorm, t.greenNorm, t.blueNorm]);\n t.channels = tf.mul(t.resize, constants.rgb);\n t.grayscale = tf.sum(t.channels, 3, true);\n t.grayscaleSub = tf.sub(t.grayscale, constants.tf05);\n t.grayscaleMul = tf.mul(t.grayscaleSub, constants.tf2);\n t.emotion = model?.execute(t.grayscaleMul) as Tensor; // result is already in range 0..1, no need for additional activation\n lastTime = now();\n const data = await t.emotion.data();\n for (let i = 0; i < data.length; i++) {\n if (data[i] > (config.face.emotion?.minConfidence || 0)) obj.push({ score: Math.min(0.99, Math.trunc(100 * data[i]) / 100), emotion: annotations[i] as Emotion });\n }\n obj.sort((a, b) => b.score - a.score);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "/**\n * EfficientPose model implementation\n *\n * Based on: [**BecauseofAI MobileFace**](https://github.com/becauseofAI/MobileFace)\n *\n * Obsolete and replaced by `faceres` that performs age/gender/descriptor analysis\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nconst last: Array = [];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face['mobilefacenet'].modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n/*\n// convert to black&white to avoid colorization impact\nconst rgb = [0.2989, 0.5870, 0.1140]; // factors for red/green/blue colors when converting to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\nconst [red, green, blue] = tf.split(crop, 3, 3);\nconst redNorm = tf.mul(red, rgb[0]);\nconst greenNorm = tf.mul(green, rgb[1]);\nconst blueNorm = tf.mul(blue, rgb[2]);\nconst grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\nconst merge = tf.stack([grayscale, grayscale, grayscale], 3).squeeze(4);\n\n// optional increase image contrast\n// or do it per-channel so mean is done on each channel\n// or do it based on histogram\nconst mean = merge.mean();\nconst factor = 5;\nconst contrast = merge.sub(mean).mul(factor).add(mean);\n*/\n\nexport async function predict(input: Tensor, config: Config, idx, count): Promise {\n if (!model) return [];\n const skipFrame = skipped < (config.face['embedding']?.skipFrames || 0);\n const skipTime = (config.face['embedding']?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && last[idx]) {\n skipped++;\n return last[idx];\n }\n return new Promise(async (resolve) => {\n let data: Array = [];\n if (config.face['embedding']?.enabled && model?.inputs[0].shape) {\n const t: Record = {};\n t.crop = tf.image.resizeBilinear(input, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false); // just resize to fit the embedding model\n // do a tight crop of image and resize it to fit the model\n // const box = [[0.05, 0.15, 0.85, 0.85]]; // empyrical values for top, left, bottom, right\n // t.crop = tf.image.cropAndResize(input, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n t.data = model?.execute(t.crop) as Tensor;\n /*\n // optional normalize outputs with l2 normalization\n const scaled = tf.tidy(() => {\n const l2 = res.norm('euclidean');\n const scale = res.div(l2);\n return scale;\n });\n\n // optional reduce feature vector complexity\n const reshape = tf.reshape(res, [128, 2]); // split 256 vectors into 128 x 2\n const reduce = reshape.logSumExp(1); // reduce 2nd dimension by calculating logSumExp on it\n */\n const output = await t.data.data();\n data = Array.from(output); // convert typed array to simple array\n }\n last[idx] = data;\n lastCount = count;\n lastTime = now();\n resolve(data);\n });\n}\n", "import * as coords from './facemeshcoords';\nimport * as util from './facemeshutil';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport { env } from '../util/env';\nimport { log } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport type { Config } from '../config';\nimport type { Point } from '../result';\n\nlet model: GraphModel | null;\nlet inputSize = 0;\n\nconst irisEnlarge = 2.3;\n\nconst leftOutline = coords.meshAnnotations['leftEyeLower0'];\nconst rightOutline = coords.meshAnnotations['rightEyeLower0'];\n\nconst eyeLandmarks = {\n leftBounds: [leftOutline[0], leftOutline[leftOutline.length - 1]],\n rightBounds: [rightOutline[0], rightOutline[rightOutline.length - 1]],\n};\n\nconst irisLandmarks = {\n upperCenter: 3,\n lowerCenter: 4,\n index: 71,\n numCoordinates: 76,\n};\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.iris?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n inputSize = model.inputs[0].shape ? model.inputs[0].shape[2] : 0;\n if (inputSize === -1) inputSize = 64;\n return model;\n}\n\n// Replace the raw coordinates returned by facemesh with refined iris model coordinates\n// Update the z coordinate to be an average of the original and the new.\nfunction replaceRawCoordinates(rawCoords, newCoords, prefix, keys) {\n for (let i = 0; i < coords.MESH_TO_IRIS_INDICES_MAP.length; i++) {\n const { key, indices } = coords.MESH_TO_IRIS_INDICES_MAP[i];\n const originalIndices = coords.meshAnnotations[`${prefix}${key}`];\n if (!keys || keys.includes(key)) {\n for (let j = 0; j < indices.length; j++) {\n const index = indices[j];\n rawCoords[originalIndices[j]] = [\n newCoords[index][0], newCoords[index][1],\n (newCoords[index][2] + rawCoords[originalIndices[j]][2]) / 2,\n ];\n }\n }\n }\n}\n\n// eslint-disable-next-line class-methods-use-this\nexport const getLeftToRightEyeDepthDifference = (rawCoords) => {\n const leftEyeZ = rawCoords[eyeLandmarks.leftBounds[0]][2];\n const rightEyeZ = rawCoords[eyeLandmarks.rightBounds[0]][2];\n return leftEyeZ - rightEyeZ;\n};\n\n// Returns a box describing a cropped region around the eye fit for passing to the iris model.\nexport const getEyeBox = (rawCoords, face, eyeInnerCornerIndex, eyeOuterCornerIndex, meshSize, flip = false) => {\n const box = util.squarifyBox(util.enlargeBox(util.calculateLandmarksBoundingBox([rawCoords[eyeInnerCornerIndex], rawCoords[eyeOuterCornerIndex]]), irisEnlarge));\n const boxSize = util.getBoxSize(box);\n let crop = tf.image.cropAndResize(face, [[\n box.startPoint[1] / meshSize,\n box.startPoint[0] / meshSize, box.endPoint[1] / meshSize,\n box.endPoint[0] / meshSize,\n ]], [0], [inputSize, inputSize]);\n if (flip && env.kernels.includes('flipleftright')) {\n const flipped = tf.image.flipLeftRight(crop); // flipLeftRight is not defined for tfjs-node\n tf.dispose(crop);\n crop = flipped;\n }\n return { box, boxSize, crop };\n};\n\n// Given a cropped image of an eye, returns the coordinates of the contours surrounding the eye and the iris.\nexport const getEyeCoords = (eyeData, eyeBox, eyeBoxSize, flip = false) => {\n const eyeRawCoords: Array = [];\n for (let i = 0; i < irisLandmarks.numCoordinates; i++) {\n const x = eyeData[i * 3];\n const y = eyeData[i * 3 + 1];\n const z = eyeData[i * 3 + 2];\n eyeRawCoords.push([\n (flip ? (1 - (x / inputSize)) : (x / inputSize)) * eyeBoxSize[0] + eyeBox.startPoint[0],\n (y / inputSize) * eyeBoxSize[1] + eyeBox.startPoint[1], z,\n ]);\n }\n return { rawCoords: eyeRawCoords, iris: eyeRawCoords.slice(irisLandmarks.index) };\n};\n\n// The z-coordinates returned for the iris are unreliable, so we take the z values from the surrounding keypoints.\n// eslint-disable-next-line class-methods-use-this\nexport const getAdjustedIrisCoords = (rawCoords, irisCoords, direction) => {\n const upperCenterZ = rawCoords[coords.meshAnnotations[`${direction}EyeUpper0`][irisLandmarks.upperCenter]][2];\n const lowerCenterZ = rawCoords[coords.meshAnnotations[`${direction}EyeLower0`][irisLandmarks.lowerCenter]][2];\n const averageZ = (upperCenterZ + lowerCenterZ) / 2;\n // Iris indices: 0: center | 1: right | 2: above | 3: left | 4: below\n return irisCoords.map((coord, i) => {\n let z = averageZ;\n if (i === 2) {\n z = upperCenterZ;\n } else if (i === 4) {\n z = lowerCenterZ;\n }\n return [coord[0], coord[1], z];\n });\n};\n\nexport async function augmentIris(rawCoords, face, config, meshSize) {\n if (!model) {\n if (config.debug) log('face mesh iris detection requested, but model is not loaded');\n return rawCoords;\n }\n const { box: leftEyeBox, boxSize: leftEyeBoxSize, crop: leftEyeCrop } = getEyeBox(rawCoords, face, eyeLandmarks.leftBounds[0], eyeLandmarks.leftBounds[1], meshSize, true);\n const { box: rightEyeBox, boxSize: rightEyeBoxSize, crop: rightEyeCrop } = getEyeBox(rawCoords, face, eyeLandmarks.rightBounds[0], eyeLandmarks.rightBounds[1], meshSize, true);\n const combined = tf.concat([leftEyeCrop, rightEyeCrop]);\n tf.dispose(leftEyeCrop);\n tf.dispose(rightEyeCrop);\n const eyePredictions = model.execute(combined) as Tensor;\n tf.dispose(combined);\n const eyePredictionsData = await eyePredictions.data();\n tf.dispose(eyePredictions);\n const leftEyeData = eyePredictionsData.slice(0, irisLandmarks.numCoordinates * 3);\n const { rawCoords: leftEyeRawCoords, iris: leftIrisRawCoords } = getEyeCoords(leftEyeData, leftEyeBox, leftEyeBoxSize, true);\n const rightEyeData = eyePredictionsData.slice(irisLandmarks.numCoordinates * 3);\n const { rawCoords: rightEyeRawCoords, iris: rightIrisRawCoords } = getEyeCoords(rightEyeData, rightEyeBox, rightEyeBoxSize);\n const leftToRightEyeDepthDifference = getLeftToRightEyeDepthDifference(rawCoords);\n if (Math.abs(leftToRightEyeDepthDifference) < 30) { // User is looking straight ahead.\n replaceRawCoordinates(rawCoords, leftEyeRawCoords, 'left', null);\n replaceRawCoordinates(rawCoords, rightEyeRawCoords, 'right', null);\n // If the user is looking to the left or to the right, the iris coordinates tend to diverge too much from the mesh coordinates for them to be merged\n // So we only update a single contour line above and below the eye.\n } else if (leftToRightEyeDepthDifference < 1) { // User is looking towards the right.\n replaceRawCoordinates(rawCoords, leftEyeRawCoords, 'left', ['EyeUpper0', 'EyeLower0']);\n } else { // User is looking towards the left.\n replaceRawCoordinates(rawCoords, rightEyeRawCoords, 'right', ['EyeUpper0', 'EyeLower0']);\n }\n const adjustedLeftIrisCoords = getAdjustedIrisCoords(rawCoords, leftIrisRawCoords, 'left');\n const adjustedRightIrisCoords = getAdjustedIrisCoords(rawCoords, rightIrisRawCoords, 'right');\n const newCoords = rawCoords.concat(adjustedLeftIrisCoords).concat(adjustedRightIrisCoords);\n return newCoords;\n}\n", "/**\n * BlazeFace, FaceMesh & Iris model implementation\n *\n * Based on:\n * - [**MediaPipe BlazeFace**](https://drive.google.com/file/d/1f39lSzU5Oq-j_OXgS67KfN5wNsoeAZ4V/view)\n * - Facial Spacial Geometry: [**MediaPipe FaceMesh**](https://drive.google.com/file/d/1VFC_wIpw4O7xBOiTgUldl79d9LA-LsnA/view)\n * - Eye Iris Details: [**MediaPipe Iris**](https://drive.google.com/file/d/1bsWbokp9AklH2ANjCfmjqEzzxO1CNbMu/view)\n */\n\nimport { log, now } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as blazeface from './blazeface';\nimport * as util from './facemeshutil';\nimport * as coords from './facemeshcoords';\nimport * as iris from './iris';\nimport { histogramEqualization } from '../image/enhance';\nimport { env } from '../util/env';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { FaceResult, FaceLandmark, Point } from '../result';\nimport type { Config } from '../config';\n\ntype DetectBox = { startPoint: Point, endPoint: Point, landmarks: Array, confidence: number };\n\nconst cache = {\n boxes: [] as DetectBox[],\n skipped: Number.MAX_SAFE_INTEGER,\n timestamp: 0,\n};\n\nlet model: GraphModel | null = null;\nlet inputSize = 0;\n\nexport async function predict(input: Tensor, config: Config): Promise {\n // reset cached boxes\n const skipTime = (config.face.detector?.skipTime || 0) > (now() - cache.timestamp);\n const skipFrame = cache.skipped < (config.face.detector?.skipFrames || 0);\n if (!config.skipAllowed || !skipTime || !skipFrame || cache.boxes.length === 0) {\n cache.boxes = await blazeface.getBoxes(input, config); // get results from blazeface detector\n cache.timestamp = now();\n cache.skipped = 0;\n } else {\n cache.skipped++;\n }\n const faces: Array = [];\n const newCache: Array = [];\n let id = 0;\n for (let i = 0; i < cache.boxes.length; i++) {\n const box = cache.boxes[i];\n let angle = 0;\n let rotationMatrix;\n const face: FaceResult = { // init face result\n id: id++,\n mesh: [],\n meshRaw: [],\n box: [0, 0, 0, 0],\n boxRaw: [0, 0, 0, 0],\n score: 0,\n boxScore: 0,\n faceScore: 0,\n annotations: {} as Record,\n };\n\n // optional rotation correction based on detector data only if mesh is disabled otherwise perform it later when we have more accurate mesh data. if no rotation correction this function performs crop\n [angle, rotationMatrix, face.tensor] = util.correctFaceRotation(config.face.detector?.rotation, box, input, config.face.mesh?.enabled ? inputSize : blazeface.size());\n if (config?.filter?.equalization) {\n const equilized = await histogramEqualization(face.tensor as Tensor);\n tf.dispose(face.tensor);\n face.tensor = equilized;\n }\n face.boxScore = Math.round(100 * box.confidence) / 100;\n if (!config.face.mesh?.enabled) { // mesh not enabled, return resuts from detector only\n face.box = util.clampBox(box, input);\n face.boxRaw = util.getRawBox(box, input);\n face.score = face.boxScore;\n face.mesh = box.landmarks.map((pt) => [\n ((box.startPoint[0] + box.endPoint[0])) / 2 + ((box.endPoint[0] + box.startPoint[0]) * pt[0] / blazeface.size()),\n ((box.startPoint[1] + box.endPoint[1])) / 2 + ((box.endPoint[1] + box.startPoint[1]) * pt[1] / blazeface.size()),\n ]);\n face.meshRaw = face.mesh.map((pt) => [pt[0] / (input.shape[2] || 0), pt[1] / (input.shape[1] || 0), (pt[2] || 0) / inputSize]);\n for (const key of Object.keys(coords.blazeFaceLandmarks)) face.annotations[key] = [face.mesh[coords.blazeFaceLandmarks[key] as number]]; // add annotations\n } else if (!model) { // mesh enabled, but not loaded\n if (config.debug) log('face mesh detection requested, but model is not loaded');\n } else { // mesh enabled\n const [contours, confidence, contourCoords] = model.execute(face.tensor as Tensor) as Array; // first returned tensor represents facial contours which are already included in the coordinates.\n const faceConfidence = await confidence.data();\n face.faceScore = Math.round(100 * faceConfidence[0]) / 100;\n const coordsReshaped = tf.reshape(contourCoords, [-1, 3]);\n let rawCoords = await coordsReshaped.array();\n tf.dispose([contourCoords, coordsReshaped, confidence, contours]);\n if (face.faceScore < (config.face.detector?.minConfidence || 1)) { // low confidence in detected mesh\n box.confidence = face.faceScore; // reset confidence of cached box\n } else {\n if (config.face.iris?.enabled) rawCoords = await iris.augmentIris(rawCoords, face.tensor, config, inputSize); // augment results with iris\n face.mesh = util.transformRawCoords(rawCoords, box, angle, rotationMatrix, inputSize); // get processed mesh\n face.meshRaw = face.mesh.map((pt) => [pt[0] / (input.shape[2] || 0), pt[1] / (input.shape[1] || 0), (pt[2] || 0) / inputSize]);\n for (const key of Object.keys(coords.meshAnnotations)) face.annotations[key] = coords.meshAnnotations[key].map((index) => face.mesh[index]); // add annotations\n face.score = face.faceScore;\n const calculatedBox = { ...util.calculateFaceBox(face.mesh, box), confidence: box.confidence, landmarks: box.landmarks };\n face.box = util.clampBox(calculatedBox, input);\n face.boxRaw = util.getRawBox(calculatedBox, input);\n newCache.push(calculatedBox);\n }\n }\n if (face.score > (config.face.detector?.minConfidence || 1)) faces.push(face);\n else tf.dispose(face.tensor);\n }\n cache.boxes = newCache; // reset cache\n return faces;\n}\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.mesh?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n inputSize = model.inputs[0].shape ? model.inputs[0].shape[2] : 0;\n return model;\n}\n\nexport const triangulation = coords.TRI468;\nexport const uvmap = coords.UV468;\n", "/**\n * FaceRes model implementation\n *\n * Returns Age, Gender, Descriptor\n * Implements Face simmilarity function\n *\n * Based on: [**HSE-FaceRes**](https://github.com/HSE-asavchenko/HSE_FaceRec_tf)\n */\n\nimport { log, now } from '../util/util';\nimport { env } from '../util/env';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport type { Config } from '../config';\nimport type { Gender, Race } from '../result';\n\nexport type FaceRes = { age: number, gender: Gender, genderScore: number, descriptor: number[], race?: { score: number, race: Race }[] };\n\nlet model: GraphModel | null;\nconst last: Array<{\n age: number,\n gender: Gender,\n genderScore: number,\n descriptor: number[],\n}> = [];\n\nlet lastTime = 0;\nlet lastCount = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.description?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport function enhance(input): Tensor {\n const tensor = (input.image || input.tensor || input) as Tensor; // input received from detector is already normalized to 0..1, input is also assumed to be straightened\n if (!model?.inputs[0].shape) return tensor; // model has no shape so no point continuing\n const crop = tf.image.resizeBilinear(tensor, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n const norm = tf.mul(crop, constants.tf255);\n tf.dispose(crop);\n return norm;\n /*\n // do a tight crop of image and resize it to fit the model\n const box = [[0.05, 0.15, 0.85, 0.85]]; // empyrical values for top, left, bottom, right\n const crop = (tensor.shape.length === 3)\n ? tf.image.cropAndResize(tf.expandDims(tensor, 0), box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]) // add batch dimension if missing\n : tf.image.cropAndResize(tensor, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n */\n /*\n // convert to black&white to avoid colorization impact\n const rgb = [0.2989, 0.5870, 0.1140]; // factors for red/green/blue colors when converting to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\n const [red, green, blue] = tf.split(crop, 3, 3);\n const redNorm = tf.mul(red, rgb[0]);\n const greenNorm = tf.mul(green, rgb[1]);\n const blueNorm = tf.mul(blue, rgb[2]);\n const grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\n const merge = tf.stack([grayscale, grayscale, grayscale], 3).squeeze(4);\n */\n}\n\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise {\n if (!model) return { age: 0, gender: 'unknown', genderScore: 0, descriptor: [] };\n const skipFrame = skipped < (config.face.description?.skipFrames || 0);\n const skipTime = (config.face.description?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipFrame && skipTime && (lastCount === count) && last[idx]?.age && (last[idx]?.age > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const obj = {\n age: 0,\n gender: 'unknown',\n genderScore: 0,\n descriptor: [],\n };\n\n if (config.face.description?.enabled) {\n const enhanced = enhance(image);\n const resT = model?.execute(enhanced) as Tensor[];\n lastTime = now();\n tf.dispose(enhanced);\n const genderT = await resT.find((t) => t.shape[1] === 1) as Tensor;\n const gender = await genderT.data();\n const confidence = Math.trunc(200 * Math.abs((gender[0] - 0.5))) / 100;\n if (confidence > (config.face.description?.minConfidence || 0)) {\n obj.gender = gender[0] <= 0.5 ? 'female' : 'male';\n obj.genderScore = Math.min(0.99, confidence);\n }\n const argmax = tf.argMax(resT.find((t) => t.shape[1] === 100), 1);\n const age = (await argmax.data())[0];\n tf.dispose(argmax);\n const ageT = resT.find((t) => t.shape[1] === 100) as Tensor;\n const all = await ageT.data();\n obj.age = Math.round(all[age - 1] > all[age + 1] ? 10 * age - 100 * all[age - 1] : 10 * age + 100 * all[age + 1]) / 10;\n\n const desc = resT.find((t) => t.shape[1] === 1024);\n // const reshape = desc.reshape([128, 8]); // reshape large 1024-element descriptor to 128 x 8\n // const reduce = reshape.logSumExp(1); // reduce 2nd dimension by calculating logSumExp on it which leaves us with 128-element descriptor\n const descriptor = desc ? await desc.data() : [];\n obj.descriptor = Array.from(descriptor);\n resT.forEach((t) => tf.dispose(t));\n }\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport type { Point } from '../result';\n\nexport function getBoxSize(box) {\n return [\n Math.abs(box.endPoint[0] - box.startPoint[0]),\n Math.abs(box.endPoint[1] - box.startPoint[1]),\n ];\n}\n\nexport function getBoxCenter(box) {\n return [\n box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2,\n box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2,\n ];\n}\n\nexport function cutBoxFromImageAndResize(box, image, cropSize) {\n const h = image.shape[1];\n const w = image.shape[2];\n const boxes = [[\n box.startPoint[1] / h,\n box.startPoint[0] / w,\n box.endPoint[1] / h,\n box.endPoint[0] / w,\n ]];\n return tf.image.cropAndResize(image, boxes, [0], cropSize);\n}\n\nexport function scaleBoxCoordinates(box, factor) {\n const startPoint = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]] as Point;\n const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]] as Point;\n const palmLandmarks = box.palmLandmarks.map((coord) => {\n const scaledCoord = [coord[0] * factor[0], coord[1] * factor[1]];\n return scaledCoord;\n });\n return { startPoint, endPoint, palmLandmarks, confidence: box.confidence };\n}\n\nexport function enlargeBox(box, factor = 1.5) {\n const center = getBoxCenter(box);\n const size = getBoxSize(box);\n const newHalfSize = [factor * size[0] / 2, factor * size[1] / 2];\n const startPoint = [center[0] - newHalfSize[0], center[1] - newHalfSize[1]] as Point;\n const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]] as Point;\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n\nexport function squarifyBox(box) {\n const centers = getBoxCenter(box);\n const size = getBoxSize(box);\n const maxEdge = Math.max(...size);\n const halfSize = maxEdge / 2;\n const startPoint = [centers[0] - halfSize, centers[1] - halfSize] as Point;\n const endPoint = [centers[0] + halfSize, centers[1] + halfSize] as Point;\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n\nexport function shiftBox(box, shiftFactor) {\n const boxSize = [\n box.endPoint[0] - box.startPoint[0],\n box.endPoint[1] - box.startPoint[1],\n ];\n const shiftVector = [boxSize[0] * shiftFactor[0], boxSize[1] * shiftFactor[1]];\n const startPoint = [box.startPoint[0] + shiftVector[0], box.startPoint[1] + shiftVector[1]] as Point;\n const endPoint = [box.endPoint[0] + shiftVector[0], box.endPoint[1] + shiftVector[1]] as Point;\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n\nexport function normalizeRadians(angle) {\n return angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI));\n}\n\nexport function computeRotation(point1, point2) {\n const radians = Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]);\n return normalizeRadians(radians);\n}\n\nexport const buildTranslationMatrix = (x, y) => [[1, 0, x], [0, 1, y], [0, 0, 1]];\n\nexport function dot(v1, v2) {\n let product = 0;\n for (let i = 0; i < v1.length; i++) {\n product += v1[i] * v2[i];\n }\n return product;\n}\n\nexport function getColumnFrom2DArr(arr, columnIndex) {\n const column: Array = [];\n for (let i = 0; i < arr.length; i++) {\n column.push(arr[i][columnIndex]);\n }\n return column;\n}\n\nexport function multiplyTransformMatrices(mat1, mat2) {\n const product: Array = [];\n const size = mat1.length;\n for (let row = 0; row < size; row++) {\n product.push([]);\n for (let col = 0; col < size; col++) {\n product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col)));\n }\n }\n return product;\n}\n\nexport function buildRotationMatrix(rotation, center) {\n const cosA = Math.cos(rotation);\n const sinA = Math.sin(rotation);\n const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]];\n const translationMatrix = buildTranslationMatrix(center[0], center[1]);\n const translationTimesRotation = multiplyTransformMatrices(translationMatrix, rotationMatrix);\n const negativeTranslationMatrix = buildTranslationMatrix(-center[0], -center[1]);\n return multiplyTransformMatrices(translationTimesRotation, negativeTranslationMatrix);\n}\n\nexport function invertTransformMatrix(matrix) {\n const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]];\n const translationComponent = [matrix[0][2], matrix[1][2]];\n const invertedTranslation = [\n -dot(rotationComponent[0], translationComponent),\n -dot(rotationComponent[1], translationComponent),\n ];\n return [\n rotationComponent[0].concat(invertedTranslation[0]),\n rotationComponent[1].concat(invertedTranslation[1]),\n [0, 0, 1],\n ];\n}\n\nexport function rotatePoint(homogeneousCoordinate, rotationMatrix) {\n return [\n dot(homogeneousCoordinate, rotationMatrix[0]),\n dot(homogeneousCoordinate, rotationMatrix[1]),\n ];\n}\n", "/**\n * HandPose model implementation constants\n * See `handpose.ts` for entry point\n */\n\nexport const anchors = [\n { x: 0.015625, y: 0.015625 },\n { x: 0.015625, y: 0.015625 },\n { x: 0.046875, y: 0.015625 },\n { x: 0.046875, y: 0.015625 },\n { x: 0.078125, y: 0.015625 },\n { x: 0.078125, y: 0.015625 },\n { x: 0.109375, y: 0.015625 },\n { x: 0.109375, y: 0.015625 },\n { x: 0.140625, y: 0.015625 },\n { x: 0.140625, y: 0.015625 },\n { x: 0.171875, y: 0.015625 },\n { x: 0.171875, y: 0.015625 },\n { x: 0.203125, y: 0.015625 },\n { x: 0.203125, y: 0.015625 },\n { x: 0.234375, y: 0.015625 },\n { x: 0.234375, y: 0.015625 },\n { x: 0.265625, y: 0.015625 },\n { x: 0.265625, y: 0.015625 },\n { x: 0.296875, y: 0.015625 },\n { x: 0.296875, y: 0.015625 },\n { x: 0.328125, y: 0.015625 },\n { x: 0.328125, y: 0.015625 },\n { x: 0.359375, y: 0.015625 },\n { x: 0.359375, y: 0.015625 },\n { x: 0.390625, y: 0.015625 },\n { x: 0.390625, y: 0.015625 },\n { x: 0.421875, y: 0.015625 },\n { x: 0.421875, y: 0.015625 },\n { x: 0.453125, y: 0.015625 },\n { x: 0.453125, y: 0.015625 },\n { x: 0.484375, y: 0.015625 },\n { x: 0.484375, y: 0.015625 },\n { x: 0.515625, y: 0.015625 },\n { x: 0.515625, y: 0.015625 },\n { x: 0.546875, y: 0.015625 },\n { x: 0.546875, y: 0.015625 },\n { x: 0.578125, y: 0.015625 },\n { x: 0.578125, y: 0.015625 },\n { x: 0.609375, y: 0.015625 },\n { x: 0.609375, y: 0.015625 },\n { x: 0.640625, y: 0.015625 },\n { x: 0.640625, y: 0.015625 },\n { x: 0.671875, y: 0.015625 },\n { x: 0.671875, y: 0.015625 },\n { x: 0.703125, y: 0.015625 },\n { x: 0.703125, y: 0.015625 },\n { x: 0.734375, y: 0.015625 },\n { x: 0.734375, y: 0.015625 },\n { x: 0.765625, y: 0.015625 },\n { x: 0.765625, y: 0.015625 },\n { x: 0.796875, y: 0.015625 },\n { x: 0.796875, y: 0.015625 },\n { x: 0.828125, y: 0.015625 },\n { x: 0.828125, y: 0.015625 },\n { x: 0.859375, y: 0.015625 },\n { x: 0.859375, y: 0.015625 },\n { x: 0.890625, y: 0.015625 },\n { x: 0.890625, y: 0.015625 },\n { x: 0.921875, y: 0.015625 },\n { x: 0.921875, y: 0.015625 },\n { x: 0.953125, y: 0.015625 },\n { x: 0.953125, y: 0.015625 },\n { x: 0.984375, y: 0.015625 },\n { x: 0.984375, y: 0.015625 },\n { x: 0.015625, y: 0.046875 },\n { x: 0.015625, y: 0.046875 },\n { x: 0.046875, y: 0.046875 },\n { x: 0.046875, y: 0.046875 },\n { x: 0.078125, y: 0.046875 },\n { x: 0.078125, y: 0.046875 },\n { x: 0.109375, y: 0.046875 },\n { x: 0.109375, y: 0.046875 },\n { x: 0.140625, y: 0.046875 },\n { x: 0.140625, y: 0.046875 },\n { x: 0.171875, y: 0.046875 },\n { x: 0.171875, y: 0.046875 },\n { x: 0.203125, y: 0.046875 },\n { x: 0.203125, y: 0.046875 },\n { x: 0.234375, y: 0.046875 },\n { x: 0.234375, y: 0.046875 },\n { x: 0.265625, y: 0.046875 },\n { x: 0.265625, y: 0.046875 },\n { x: 0.296875, y: 0.046875 },\n { x: 0.296875, y: 0.046875 },\n { x: 0.328125, y: 0.046875 },\n { x: 0.328125, y: 0.046875 },\n { x: 0.359375, y: 0.046875 },\n { x: 0.359375, y: 0.046875 },\n { x: 0.390625, y: 0.046875 },\n { x: 0.390625, y: 0.046875 },\n { x: 0.421875, y: 0.046875 },\n { x: 0.421875, y: 0.046875 },\n { x: 0.453125, y: 0.046875 },\n { x: 0.453125, y: 0.046875 },\n { x: 0.484375, y: 0.046875 },\n { x: 0.484375, y: 0.046875 },\n { x: 0.515625, y: 0.046875 },\n { x: 0.515625, y: 0.046875 },\n { x: 0.546875, y: 0.046875 },\n { x: 0.546875, y: 0.046875 },\n { x: 0.578125, y: 0.046875 },\n { x: 0.578125, y: 0.046875 },\n { x: 0.609375, y: 0.046875 },\n { x: 0.609375, y: 0.046875 },\n { x: 0.640625, y: 0.046875 },\n { x: 0.640625, y: 0.046875 },\n { x: 0.671875, y: 0.046875 },\n { x: 0.671875, y: 0.046875 },\n { x: 0.703125, y: 0.046875 },\n { x: 0.703125, y: 0.046875 },\n { x: 0.734375, y: 0.046875 },\n { x: 0.734375, y: 0.046875 },\n { x: 0.765625, y: 0.046875 },\n { x: 0.765625, y: 0.046875 },\n { x: 0.796875, y: 0.046875 },\n { x: 0.796875, y: 0.046875 },\n { x: 0.828125, y: 0.046875 },\n { x: 0.828125, y: 0.046875 },\n { x: 0.859375, y: 0.046875 },\n { x: 0.859375, y: 0.046875 },\n { x: 0.890625, y: 0.046875 },\n { x: 0.890625, y: 0.046875 },\n { x: 0.921875, y: 0.046875 },\n { x: 0.921875, y: 0.046875 },\n { x: 0.953125, y: 0.046875 },\n { x: 0.953125, y: 0.046875 },\n { x: 0.984375, y: 0.046875 },\n { x: 0.984375, y: 0.046875 },\n { x: 0.015625, y: 0.078125 },\n { x: 0.015625, y: 0.078125 },\n { x: 0.046875, y: 0.078125 },\n { x: 0.046875, y: 0.078125 },\n { x: 0.078125, y: 0.078125 },\n { x: 0.078125, y: 0.078125 },\n { x: 0.109375, y: 0.078125 },\n { x: 0.109375, y: 0.078125 },\n { x: 0.140625, y: 0.078125 },\n { x: 0.140625, y: 0.078125 },\n { x: 0.171875, y: 0.078125 },\n { x: 0.171875, y: 0.078125 },\n { x: 0.203125, y: 0.078125 },\n { x: 0.203125, y: 0.078125 },\n { x: 0.234375, y: 0.078125 },\n { x: 0.234375, y: 0.078125 },\n { x: 0.265625, y: 0.078125 },\n { x: 0.265625, y: 0.078125 },\n { x: 0.296875, y: 0.078125 },\n { x: 0.296875, y: 0.078125 },\n { x: 0.328125, y: 0.078125 },\n { x: 0.328125, y: 0.078125 },\n { x: 0.359375, y: 0.078125 },\n { x: 0.359375, y: 0.078125 },\n { x: 0.390625, y: 0.078125 },\n { x: 0.390625, y: 0.078125 },\n { x: 0.421875, y: 0.078125 },\n { x: 0.421875, y: 0.078125 },\n { x: 0.453125, y: 0.078125 },\n { x: 0.453125, y: 0.078125 },\n { x: 0.484375, y: 0.078125 },\n { x: 0.484375, y: 0.078125 },\n { x: 0.515625, y: 0.078125 },\n { x: 0.515625, y: 0.078125 },\n { x: 0.546875, y: 0.078125 },\n { x: 0.546875, y: 0.078125 },\n { x: 0.578125, y: 0.078125 },\n { x: 0.578125, y: 0.078125 },\n { x: 0.609375, y: 0.078125 },\n { x: 0.609375, y: 0.078125 },\n { x: 0.640625, y: 0.078125 },\n { x: 0.640625, y: 0.078125 },\n { x: 0.671875, y: 0.078125 },\n { x: 0.671875, y: 0.078125 },\n { x: 0.703125, y: 0.078125 },\n { x: 0.703125, y: 0.078125 },\n { x: 0.734375, y: 0.078125 },\n { x: 0.734375, y: 0.078125 },\n { x: 0.765625, y: 0.078125 },\n { x: 0.765625, y: 0.078125 },\n { x: 0.796875, y: 0.078125 },\n { x: 0.796875, y: 0.078125 },\n { x: 0.828125, y: 0.078125 },\n { x: 0.828125, y: 0.078125 },\n { x: 0.859375, y: 0.078125 },\n { x: 0.859375, y: 0.078125 },\n { x: 0.890625, y: 0.078125 },\n { x: 0.890625, y: 0.078125 },\n { x: 0.921875, y: 0.078125 },\n { x: 0.921875, y: 0.078125 },\n { x: 0.953125, y: 0.078125 },\n { x: 0.953125, y: 0.078125 },\n { x: 0.984375, y: 0.078125 },\n { x: 0.984375, y: 0.078125 },\n { x: 0.015625, y: 0.109375 },\n { x: 0.015625, y: 0.109375 },\n { x: 0.046875, y: 0.109375 },\n { x: 0.046875, y: 0.109375 },\n { x: 0.078125, y: 0.109375 },\n { x: 0.078125, y: 0.109375 },\n { x: 0.109375, y: 0.109375 },\n { x: 0.109375, y: 0.109375 },\n { x: 0.140625, y: 0.109375 },\n { x: 0.140625, y: 0.109375 },\n { x: 0.171875, y: 0.109375 },\n { x: 0.171875, y: 0.109375 },\n { x: 0.203125, y: 0.109375 },\n { x: 0.203125, y: 0.109375 },\n { x: 0.234375, y: 0.109375 },\n { x: 0.234375, y: 0.109375 },\n { x: 0.265625, y: 0.109375 },\n { x: 0.265625, y: 0.109375 },\n { x: 0.296875, y: 0.109375 },\n { x: 0.296875, y: 0.109375 },\n { x: 0.328125, y: 0.109375 },\n { x: 0.328125, y: 0.109375 },\n { x: 0.359375, y: 0.109375 },\n { x: 0.359375, y: 0.109375 },\n { x: 0.390625, y: 0.109375 },\n { x: 0.390625, y: 0.109375 },\n { x: 0.421875, y: 0.109375 },\n { x: 0.421875, y: 0.109375 },\n { x: 0.453125, y: 0.109375 },\n { x: 0.453125, y: 0.109375 },\n { x: 0.484375, y: 0.109375 },\n { x: 0.484375, y: 0.109375 },\n { x: 0.515625, y: 0.109375 },\n { x: 0.515625, y: 0.109375 },\n { x: 0.546875, y: 0.109375 },\n { x: 0.546875, y: 0.109375 },\n { x: 0.578125, y: 0.109375 },\n { x: 0.578125, y: 0.109375 },\n { x: 0.609375, y: 0.109375 },\n { x: 0.609375, y: 0.109375 },\n { x: 0.640625, y: 0.109375 },\n { x: 0.640625, y: 0.109375 },\n { x: 0.671875, y: 0.109375 },\n { x: 0.671875, y: 0.109375 },\n { x: 0.703125, y: 0.109375 },\n { x: 0.703125, y: 0.109375 },\n { x: 0.734375, y: 0.109375 },\n { x: 0.734375, y: 0.109375 },\n { x: 0.765625, y: 0.109375 },\n { x: 0.765625, y: 0.109375 },\n { x: 0.796875, y: 0.109375 },\n { x: 0.796875, y: 0.109375 },\n { x: 0.828125, y: 0.109375 },\n { x: 0.828125, y: 0.109375 },\n { x: 0.859375, y: 0.109375 },\n { x: 0.859375, y: 0.109375 },\n { x: 0.890625, y: 0.109375 },\n { x: 0.890625, y: 0.109375 },\n { x: 0.921875, y: 0.109375 },\n { x: 0.921875, y: 0.109375 },\n { x: 0.953125, y: 0.109375 },\n { x: 0.953125, y: 0.109375 },\n { x: 0.984375, y: 0.109375 },\n { x: 0.984375, y: 0.109375 },\n { x: 0.015625, y: 0.140625 },\n { x: 0.015625, y: 0.140625 },\n { x: 0.046875, y: 0.140625 },\n { x: 0.046875, y: 0.140625 },\n { x: 0.078125, y: 0.140625 },\n { x: 0.078125, y: 0.140625 },\n { x: 0.109375, y: 0.140625 },\n { x: 0.109375, y: 0.140625 },\n { x: 0.140625, y: 0.140625 },\n { x: 0.140625, y: 0.140625 },\n { x: 0.171875, y: 0.140625 },\n { x: 0.171875, y: 0.140625 },\n { x: 0.203125, y: 0.140625 },\n { x: 0.203125, y: 0.140625 },\n { x: 0.234375, y: 0.140625 },\n { x: 0.234375, y: 0.140625 },\n { x: 0.265625, y: 0.140625 },\n { x: 0.265625, y: 0.140625 },\n { x: 0.296875, y: 0.140625 },\n { x: 0.296875, y: 0.140625 },\n { x: 0.328125, y: 0.140625 },\n { x: 0.328125, y: 0.140625 },\n { x: 0.359375, y: 0.140625 },\n { x: 0.359375, y: 0.140625 },\n { x: 0.390625, y: 0.140625 },\n { x: 0.390625, y: 0.140625 },\n { x: 0.421875, y: 0.140625 },\n { x: 0.421875, y: 0.140625 },\n { x: 0.453125, y: 0.140625 },\n { x: 0.453125, y: 0.140625 },\n { x: 0.484375, y: 0.140625 },\n { x: 0.484375, y: 0.140625 },\n { x: 0.515625, y: 0.140625 },\n { x: 0.515625, y: 0.140625 },\n { x: 0.546875, y: 0.140625 },\n { x: 0.546875, y: 0.140625 },\n { x: 0.578125, y: 0.140625 },\n { x: 0.578125, y: 0.140625 },\n { x: 0.609375, y: 0.140625 },\n { x: 0.609375, y: 0.140625 },\n { x: 0.640625, y: 0.140625 },\n { x: 0.640625, y: 0.140625 },\n { x: 0.671875, y: 0.140625 },\n { x: 0.671875, y: 0.140625 },\n { x: 0.703125, y: 0.140625 },\n { x: 0.703125, y: 0.140625 },\n { x: 0.734375, y: 0.140625 },\n { x: 0.734375, y: 0.140625 },\n { x: 0.765625, y: 0.140625 },\n { x: 0.765625, y: 0.140625 },\n { x: 0.796875, y: 0.140625 },\n { x: 0.796875, y: 0.140625 },\n { x: 0.828125, y: 0.140625 },\n { x: 0.828125, y: 0.140625 },\n { x: 0.859375, y: 0.140625 },\n { x: 0.859375, y: 0.140625 },\n { x: 0.890625, y: 0.140625 },\n { x: 0.890625, y: 0.140625 },\n { x: 0.921875, y: 0.140625 },\n { x: 0.921875, y: 0.140625 },\n { x: 0.953125, y: 0.140625 },\n { x: 0.953125, y: 0.140625 },\n { x: 0.984375, y: 0.140625 },\n { x: 0.984375, y: 0.140625 },\n { x: 0.015625, y: 0.171875 },\n { x: 0.015625, y: 0.171875 },\n { x: 0.046875, y: 0.171875 },\n { x: 0.046875, y: 0.171875 },\n { x: 0.078125, y: 0.171875 },\n { x: 0.078125, y: 0.171875 },\n { x: 0.109375, y: 0.171875 },\n { x: 0.109375, y: 0.171875 },\n { x: 0.140625, y: 0.171875 },\n { x: 0.140625, y: 0.171875 },\n { x: 0.171875, y: 0.171875 },\n { x: 0.171875, y: 0.171875 },\n { x: 0.203125, y: 0.171875 },\n { x: 0.203125, y: 0.171875 },\n { x: 0.234375, y: 0.171875 },\n { x: 0.234375, y: 0.171875 },\n { x: 0.265625, y: 0.171875 },\n { x: 0.265625, y: 0.171875 },\n { x: 0.296875, y: 0.171875 },\n { x: 0.296875, y: 0.171875 },\n { x: 0.328125, y: 0.171875 },\n { x: 0.328125, y: 0.171875 },\n { x: 0.359375, y: 0.171875 },\n { x: 0.359375, y: 0.171875 },\n { x: 0.390625, y: 0.171875 },\n { x: 0.390625, y: 0.171875 },\n { x: 0.421875, y: 0.171875 },\n { x: 0.421875, y: 0.171875 },\n { x: 0.453125, y: 0.171875 },\n { x: 0.453125, y: 0.171875 },\n { x: 0.484375, y: 0.171875 },\n { x: 0.484375, y: 0.171875 },\n { x: 0.515625, y: 0.171875 },\n { x: 0.515625, y: 0.171875 },\n { x: 0.546875, y: 0.171875 },\n { x: 0.546875, y: 0.171875 },\n { x: 0.578125, y: 0.171875 },\n { x: 0.578125, y: 0.171875 },\n { x: 0.609375, y: 0.171875 },\n { x: 0.609375, y: 0.171875 },\n { x: 0.640625, y: 0.171875 },\n { x: 0.640625, y: 0.171875 },\n { x: 0.671875, y: 0.171875 },\n { x: 0.671875, y: 0.171875 },\n { x: 0.703125, y: 0.171875 },\n { x: 0.703125, y: 0.171875 },\n { x: 0.734375, y: 0.171875 },\n { x: 0.734375, y: 0.171875 },\n { x: 0.765625, y: 0.171875 },\n { x: 0.765625, y: 0.171875 },\n { x: 0.796875, y: 0.171875 },\n { x: 0.796875, y: 0.171875 },\n { x: 0.828125, y: 0.171875 },\n { x: 0.828125, y: 0.171875 },\n { x: 0.859375, y: 0.171875 },\n { x: 0.859375, y: 0.171875 },\n { x: 0.890625, y: 0.171875 },\n { x: 0.890625, y: 0.171875 },\n { x: 0.921875, y: 0.171875 },\n { x: 0.921875, y: 0.171875 },\n { x: 0.953125, y: 0.171875 },\n { x: 0.953125, y: 0.171875 },\n { x: 0.984375, y: 0.171875 },\n { x: 0.984375, y: 0.171875 },\n { x: 0.015625, y: 0.203125 },\n { x: 0.015625, y: 0.203125 },\n { x: 0.046875, y: 0.203125 },\n { x: 0.046875, y: 0.203125 },\n { x: 0.078125, y: 0.203125 },\n { x: 0.078125, y: 0.203125 },\n { x: 0.109375, y: 0.203125 },\n { x: 0.109375, y: 0.203125 },\n { x: 0.140625, y: 0.203125 },\n { x: 0.140625, y: 0.203125 },\n { x: 0.171875, y: 0.203125 },\n { x: 0.171875, y: 0.203125 },\n { x: 0.203125, y: 0.203125 },\n { x: 0.203125, y: 0.203125 },\n { x: 0.234375, y: 0.203125 },\n { x: 0.234375, y: 0.203125 },\n { x: 0.265625, y: 0.203125 },\n { x: 0.265625, y: 0.203125 },\n { x: 0.296875, y: 0.203125 },\n { x: 0.296875, y: 0.203125 },\n { x: 0.328125, y: 0.203125 },\n { x: 0.328125, y: 0.203125 },\n { x: 0.359375, y: 0.203125 },\n { x: 0.359375, y: 0.203125 },\n { x: 0.390625, y: 0.203125 },\n { x: 0.390625, y: 0.203125 },\n { x: 0.421875, y: 0.203125 },\n { x: 0.421875, y: 0.203125 },\n { x: 0.453125, y: 0.203125 },\n { x: 0.453125, y: 0.203125 },\n { x: 0.484375, y: 0.203125 },\n { x: 0.484375, y: 0.203125 },\n { x: 0.515625, y: 0.203125 },\n { x: 0.515625, y: 0.203125 },\n { x: 0.546875, y: 0.203125 },\n { x: 0.546875, y: 0.203125 },\n { x: 0.578125, y: 0.203125 },\n { x: 0.578125, y: 0.203125 },\n { x: 0.609375, y: 0.203125 },\n { x: 0.609375, y: 0.203125 },\n { x: 0.640625, y: 0.203125 },\n { x: 0.640625, y: 0.203125 },\n { x: 0.671875, y: 0.203125 },\n { x: 0.671875, y: 0.203125 },\n { x: 0.703125, y: 0.203125 },\n { x: 0.703125, y: 0.203125 },\n { x: 0.734375, y: 0.203125 },\n { x: 0.734375, y: 0.203125 },\n { x: 0.765625, y: 0.203125 },\n { x: 0.765625, y: 0.203125 },\n { x: 0.796875, y: 0.203125 },\n { x: 0.796875, y: 0.203125 },\n { x: 0.828125, y: 0.203125 },\n { x: 0.828125, y: 0.203125 },\n { x: 0.859375, y: 0.203125 },\n { x: 0.859375, y: 0.203125 },\n { x: 0.890625, y: 0.203125 },\n { x: 0.890625, y: 0.203125 },\n { x: 0.921875, y: 0.203125 },\n { x: 0.921875, y: 0.203125 },\n { x: 0.953125, y: 0.203125 },\n { x: 0.953125, y: 0.203125 },\n { x: 0.984375, y: 0.203125 },\n { x: 0.984375, y: 0.203125 },\n { x: 0.015625, y: 0.234375 },\n { x: 0.015625, y: 0.234375 },\n { x: 0.046875, y: 0.234375 },\n { x: 0.046875, y: 0.234375 },\n { x: 0.078125, y: 0.234375 },\n { x: 0.078125, y: 0.234375 },\n { x: 0.109375, y: 0.234375 },\n { x: 0.109375, y: 0.234375 },\n { x: 0.140625, y: 0.234375 },\n { x: 0.140625, y: 0.234375 },\n { x: 0.171875, y: 0.234375 },\n { x: 0.171875, y: 0.234375 },\n { x: 0.203125, y: 0.234375 },\n { x: 0.203125, y: 0.234375 },\n { x: 0.234375, y: 0.234375 },\n { x: 0.234375, y: 0.234375 },\n { x: 0.265625, y: 0.234375 },\n { x: 0.265625, y: 0.234375 },\n { x: 0.296875, y: 0.234375 },\n { x: 0.296875, y: 0.234375 },\n { x: 0.328125, y: 0.234375 },\n { x: 0.328125, y: 0.234375 },\n { x: 0.359375, y: 0.234375 },\n { x: 0.359375, y: 0.234375 },\n { x: 0.390625, y: 0.234375 },\n { x: 0.390625, y: 0.234375 },\n { x: 0.421875, y: 0.234375 },\n { x: 0.421875, y: 0.234375 },\n { x: 0.453125, y: 0.234375 },\n { x: 0.453125, y: 0.234375 },\n { x: 0.484375, y: 0.234375 },\n { x: 0.484375, y: 0.234375 },\n { x: 0.515625, y: 0.234375 },\n { x: 0.515625, y: 0.234375 },\n { x: 0.546875, y: 0.234375 },\n { x: 0.546875, y: 0.234375 },\n { x: 0.578125, y: 0.234375 },\n { x: 0.578125, y: 0.234375 },\n { x: 0.609375, y: 0.234375 },\n { x: 0.609375, y: 0.234375 },\n { x: 0.640625, y: 0.234375 },\n { x: 0.640625, y: 0.234375 },\n { x: 0.671875, y: 0.234375 },\n { x: 0.671875, y: 0.234375 },\n { x: 0.703125, y: 0.234375 },\n { x: 0.703125, y: 0.234375 },\n { x: 0.734375, y: 0.234375 },\n { x: 0.734375, y: 0.234375 },\n { x: 0.765625, y: 0.234375 },\n { x: 0.765625, y: 0.234375 },\n { x: 0.796875, y: 0.234375 },\n { x: 0.796875, y: 0.234375 },\n { x: 0.828125, y: 0.234375 },\n { x: 0.828125, y: 0.234375 },\n { x: 0.859375, y: 0.234375 },\n { x: 0.859375, y: 0.234375 },\n { x: 0.890625, y: 0.234375 },\n { x: 0.890625, y: 0.234375 },\n { x: 0.921875, y: 0.234375 },\n { x: 0.921875, y: 0.234375 },\n { x: 0.953125, y: 0.234375 },\n { x: 0.953125, y: 0.234375 },\n { x: 0.984375, y: 0.234375 },\n { x: 0.984375, y: 0.234375 },\n { x: 0.015625, y: 0.265625 },\n { x: 0.015625, y: 0.265625 },\n { x: 0.046875, y: 0.265625 },\n { x: 0.046875, y: 0.265625 },\n { x: 0.078125, y: 0.265625 },\n { x: 0.078125, y: 0.265625 },\n { x: 0.109375, y: 0.265625 },\n { x: 0.109375, y: 0.265625 },\n { x: 0.140625, y: 0.265625 },\n { x: 0.140625, y: 0.265625 },\n { x: 0.171875, y: 0.265625 },\n { x: 0.171875, y: 0.265625 },\n { x: 0.203125, y: 0.265625 },\n { x: 0.203125, y: 0.265625 },\n { x: 0.234375, y: 0.265625 },\n { x: 0.234375, y: 0.265625 },\n { x: 0.265625, y: 0.265625 },\n { x: 0.265625, y: 0.265625 },\n { x: 0.296875, y: 0.265625 },\n { x: 0.296875, y: 0.265625 },\n { x: 0.328125, y: 0.265625 },\n { x: 0.328125, y: 0.265625 },\n { x: 0.359375, y: 0.265625 },\n { x: 0.359375, y: 0.265625 },\n { x: 0.390625, y: 0.265625 },\n { x: 0.390625, y: 0.265625 },\n { x: 0.421875, y: 0.265625 },\n { x: 0.421875, y: 0.265625 },\n { x: 0.453125, y: 0.265625 },\n { x: 0.453125, y: 0.265625 },\n { x: 0.484375, y: 0.265625 },\n { x: 0.484375, y: 0.265625 },\n { x: 0.515625, y: 0.265625 },\n { x: 0.515625, y: 0.265625 },\n { x: 0.546875, y: 0.265625 },\n { x: 0.546875, y: 0.265625 },\n { x: 0.578125, y: 0.265625 },\n { x: 0.578125, y: 0.265625 },\n { x: 0.609375, y: 0.265625 },\n { x: 0.609375, y: 0.265625 },\n { x: 0.640625, y: 0.265625 },\n { x: 0.640625, y: 0.265625 },\n { x: 0.671875, y: 0.265625 },\n { x: 0.671875, y: 0.265625 },\n { x: 0.703125, y: 0.265625 },\n { x: 0.703125, y: 0.265625 },\n { x: 0.734375, y: 0.265625 },\n { x: 0.734375, y: 0.265625 },\n { x: 0.765625, y: 0.265625 },\n { x: 0.765625, y: 0.265625 },\n { x: 0.796875, y: 0.265625 },\n { x: 0.796875, y: 0.265625 },\n { x: 0.828125, y: 0.265625 },\n { x: 0.828125, y: 0.265625 },\n { x: 0.859375, y: 0.265625 },\n { x: 0.859375, y: 0.265625 },\n { x: 0.890625, y: 0.265625 },\n { x: 0.890625, y: 0.265625 },\n { x: 0.921875, y: 0.265625 },\n { x: 0.921875, y: 0.265625 },\n { x: 0.953125, y: 0.265625 },\n { x: 0.953125, y: 0.265625 },\n { x: 0.984375, y: 0.265625 },\n { x: 0.984375, y: 0.265625 },\n { x: 0.015625, y: 0.296875 },\n { x: 0.015625, y: 0.296875 },\n { x: 0.046875, y: 0.296875 },\n { x: 0.046875, y: 0.296875 },\n { x: 0.078125, y: 0.296875 },\n { x: 0.078125, y: 0.296875 },\n { x: 0.109375, y: 0.296875 },\n { x: 0.109375, y: 0.296875 },\n { x: 0.140625, y: 0.296875 },\n { x: 0.140625, y: 0.296875 },\n { x: 0.171875, y: 0.296875 },\n { x: 0.171875, y: 0.296875 },\n { x: 0.203125, y: 0.296875 },\n { x: 0.203125, y: 0.296875 },\n { x: 0.234375, y: 0.296875 },\n { x: 0.234375, y: 0.296875 },\n { x: 0.265625, y: 0.296875 },\n { x: 0.265625, y: 0.296875 },\n { x: 0.296875, y: 0.296875 },\n { x: 0.296875, y: 0.296875 },\n { x: 0.328125, y: 0.296875 },\n { x: 0.328125, y: 0.296875 },\n { x: 0.359375, y: 0.296875 },\n { x: 0.359375, y: 0.296875 },\n { x: 0.390625, y: 0.296875 },\n { x: 0.390625, y: 0.296875 },\n { x: 0.421875, y: 0.296875 },\n { x: 0.421875, y: 0.296875 },\n { x: 0.453125, y: 0.296875 },\n { x: 0.453125, y: 0.296875 },\n { x: 0.484375, y: 0.296875 },\n { x: 0.484375, y: 0.296875 },\n { x: 0.515625, y: 0.296875 },\n { x: 0.515625, y: 0.296875 },\n { x: 0.546875, y: 0.296875 },\n { x: 0.546875, y: 0.296875 },\n { x: 0.578125, y: 0.296875 },\n { x: 0.578125, y: 0.296875 },\n { x: 0.609375, y: 0.296875 },\n { x: 0.609375, y: 0.296875 },\n { x: 0.640625, y: 0.296875 },\n { x: 0.640625, y: 0.296875 },\n { x: 0.671875, y: 0.296875 },\n { x: 0.671875, y: 0.296875 },\n { x: 0.703125, y: 0.296875 },\n { x: 0.703125, y: 0.296875 },\n { x: 0.734375, y: 0.296875 },\n { x: 0.734375, y: 0.296875 },\n { x: 0.765625, y: 0.296875 },\n { x: 0.765625, y: 0.296875 },\n { x: 0.796875, y: 0.296875 },\n { x: 0.796875, y: 0.296875 },\n { x: 0.828125, y: 0.296875 },\n { x: 0.828125, y: 0.296875 },\n { x: 0.859375, y: 0.296875 },\n { x: 0.859375, y: 0.296875 },\n { x: 0.890625, y: 0.296875 },\n { x: 0.890625, y: 0.296875 },\n { x: 0.921875, y: 0.296875 },\n { x: 0.921875, y: 0.296875 },\n { x: 0.953125, y: 0.296875 },\n { x: 0.953125, y: 0.296875 },\n { x: 0.984375, y: 0.296875 },\n { x: 0.984375, y: 0.296875 },\n { x: 0.015625, y: 0.328125 },\n { x: 0.015625, y: 0.328125 },\n { x: 0.046875, y: 0.328125 },\n { x: 0.046875, y: 0.328125 },\n { x: 0.078125, y: 0.328125 },\n { x: 0.078125, y: 0.328125 },\n { x: 0.109375, y: 0.328125 },\n { x: 0.109375, y: 0.328125 },\n { x: 0.140625, y: 0.328125 },\n { x: 0.140625, y: 0.328125 },\n { x: 0.171875, y: 0.328125 },\n { x: 0.171875, y: 0.328125 },\n { x: 0.203125, y: 0.328125 },\n { x: 0.203125, y: 0.328125 },\n { x: 0.234375, y: 0.328125 },\n { x: 0.234375, y: 0.328125 },\n { x: 0.265625, y: 0.328125 },\n { x: 0.265625, y: 0.328125 },\n { x: 0.296875, y: 0.328125 },\n { x: 0.296875, y: 0.328125 },\n { x: 0.328125, y: 0.328125 },\n { x: 0.328125, y: 0.328125 },\n { x: 0.359375, y: 0.328125 },\n { x: 0.359375, y: 0.328125 },\n { x: 0.390625, y: 0.328125 },\n { x: 0.390625, y: 0.328125 },\n { x: 0.421875, y: 0.328125 },\n { x: 0.421875, y: 0.328125 },\n { x: 0.453125, y: 0.328125 },\n { x: 0.453125, y: 0.328125 },\n { x: 0.484375, y: 0.328125 },\n { x: 0.484375, y: 0.328125 },\n { x: 0.515625, y: 0.328125 },\n { x: 0.515625, y: 0.328125 },\n { x: 0.546875, y: 0.328125 },\n { x: 0.546875, y: 0.328125 },\n { x: 0.578125, y: 0.328125 },\n { x: 0.578125, y: 0.328125 },\n { x: 0.609375, y: 0.328125 },\n { x: 0.609375, y: 0.328125 },\n { x: 0.640625, y: 0.328125 },\n { x: 0.640625, y: 0.328125 },\n { x: 0.671875, y: 0.328125 },\n { x: 0.671875, y: 0.328125 },\n { x: 0.703125, y: 0.328125 },\n { x: 0.703125, y: 0.328125 },\n { x: 0.734375, y: 0.328125 },\n { x: 0.734375, y: 0.328125 },\n { x: 0.765625, y: 0.328125 },\n { x: 0.765625, y: 0.328125 },\n { x: 0.796875, y: 0.328125 },\n { x: 0.796875, y: 0.328125 },\n { x: 0.828125, y: 0.328125 },\n { x: 0.828125, y: 0.328125 },\n { x: 0.859375, y: 0.328125 },\n { x: 0.859375, y: 0.328125 },\n { x: 0.890625, y: 0.328125 },\n { x: 0.890625, y: 0.328125 },\n { x: 0.921875, y: 0.328125 },\n { x: 0.921875, y: 0.328125 },\n { x: 0.953125, y: 0.328125 },\n { x: 0.953125, y: 0.328125 },\n { x: 0.984375, y: 0.328125 },\n { x: 0.984375, y: 0.328125 },\n { x: 0.015625, y: 0.359375 },\n { x: 0.015625, y: 0.359375 },\n { x: 0.046875, y: 0.359375 },\n { x: 0.046875, y: 0.359375 },\n { x: 0.078125, y: 0.359375 },\n { x: 0.078125, y: 0.359375 },\n { x: 0.109375, y: 0.359375 },\n { x: 0.109375, y: 0.359375 },\n { x: 0.140625, y: 0.359375 },\n { x: 0.140625, y: 0.359375 },\n { x: 0.171875, y: 0.359375 },\n { x: 0.171875, y: 0.359375 },\n { x: 0.203125, y: 0.359375 },\n { x: 0.203125, y: 0.359375 },\n { x: 0.234375, y: 0.359375 },\n { x: 0.234375, y: 0.359375 },\n { x: 0.265625, y: 0.359375 },\n { x: 0.265625, y: 0.359375 },\n { x: 0.296875, y: 0.359375 },\n { x: 0.296875, y: 0.359375 },\n { x: 0.328125, y: 0.359375 },\n { x: 0.328125, y: 0.359375 },\n { x: 0.359375, y: 0.359375 },\n { x: 0.359375, y: 0.359375 },\n { x: 0.390625, y: 0.359375 },\n { x: 0.390625, y: 0.359375 },\n { x: 0.421875, y: 0.359375 },\n { x: 0.421875, y: 0.359375 },\n { x: 0.453125, y: 0.359375 },\n { x: 0.453125, y: 0.359375 },\n { x: 0.484375, y: 0.359375 },\n { x: 0.484375, y: 0.359375 },\n { x: 0.515625, y: 0.359375 },\n { x: 0.515625, y: 0.359375 },\n { x: 0.546875, y: 0.359375 },\n { x: 0.546875, y: 0.359375 },\n { x: 0.578125, y: 0.359375 },\n { x: 0.578125, y: 0.359375 },\n { x: 0.609375, y: 0.359375 },\n { x: 0.609375, y: 0.359375 },\n { x: 0.640625, y: 0.359375 },\n { x: 0.640625, y: 0.359375 },\n { x: 0.671875, y: 0.359375 },\n { x: 0.671875, y: 0.359375 },\n { x: 0.703125, y: 0.359375 },\n { x: 0.703125, y: 0.359375 },\n { x: 0.734375, y: 0.359375 },\n { x: 0.734375, y: 0.359375 },\n { x: 0.765625, y: 0.359375 },\n { x: 0.765625, y: 0.359375 },\n { x: 0.796875, y: 0.359375 },\n { x: 0.796875, y: 0.359375 },\n { x: 0.828125, y: 0.359375 },\n { x: 0.828125, y: 0.359375 },\n { x: 0.859375, y: 0.359375 },\n { x: 0.859375, y: 0.359375 },\n { x: 0.890625, y: 0.359375 },\n { x: 0.890625, y: 0.359375 },\n { x: 0.921875, y: 0.359375 },\n { x: 0.921875, y: 0.359375 },\n { x: 0.953125, y: 0.359375 },\n { x: 0.953125, y: 0.359375 },\n { x: 0.984375, y: 0.359375 },\n { x: 0.984375, y: 0.359375 },\n { x: 0.015625, y: 0.390625 },\n { x: 0.015625, y: 0.390625 },\n { x: 0.046875, y: 0.390625 },\n { x: 0.046875, y: 0.390625 },\n { x: 0.078125, y: 0.390625 },\n { x: 0.078125, y: 0.390625 },\n { x: 0.109375, y: 0.390625 },\n { x: 0.109375, y: 0.390625 },\n { x: 0.140625, y: 0.390625 },\n { x: 0.140625, y: 0.390625 },\n { x: 0.171875, y: 0.390625 },\n { x: 0.171875, y: 0.390625 },\n { x: 0.203125, y: 0.390625 },\n { x: 0.203125, y: 0.390625 },\n { x: 0.234375, y: 0.390625 },\n { x: 0.234375, y: 0.390625 },\n { x: 0.265625, y: 0.390625 },\n { x: 0.265625, y: 0.390625 },\n { x: 0.296875, y: 0.390625 },\n { x: 0.296875, y: 0.390625 },\n { x: 0.328125, y: 0.390625 },\n { x: 0.328125, y: 0.390625 },\n { x: 0.359375, y: 0.390625 },\n { x: 0.359375, y: 0.390625 },\n { x: 0.390625, y: 0.390625 },\n { x: 0.390625, y: 0.390625 },\n { x: 0.421875, y: 0.390625 },\n { x: 0.421875, y: 0.390625 },\n { x: 0.453125, y: 0.390625 },\n { x: 0.453125, y: 0.390625 },\n { x: 0.484375, y: 0.390625 },\n { x: 0.484375, y: 0.390625 },\n { x: 0.515625, y: 0.390625 },\n { x: 0.515625, y: 0.390625 },\n { x: 0.546875, y: 0.390625 },\n { x: 0.546875, y: 0.390625 },\n { x: 0.578125, y: 0.390625 },\n { x: 0.578125, y: 0.390625 },\n { x: 0.609375, y: 0.390625 },\n { x: 0.609375, y: 0.390625 },\n { x: 0.640625, y: 0.390625 },\n { x: 0.640625, y: 0.390625 },\n { x: 0.671875, y: 0.390625 },\n { x: 0.671875, y: 0.390625 },\n { x: 0.703125, y: 0.390625 },\n { x: 0.703125, y: 0.390625 },\n { x: 0.734375, y: 0.390625 },\n { x: 0.734375, y: 0.390625 },\n { x: 0.765625, y: 0.390625 },\n { x: 0.765625, y: 0.390625 },\n { x: 0.796875, y: 0.390625 },\n { x: 0.796875, y: 0.390625 },\n { x: 0.828125, y: 0.390625 },\n { x: 0.828125, y: 0.390625 },\n { x: 0.859375, y: 0.390625 },\n { x: 0.859375, y: 0.390625 },\n { x: 0.890625, y: 0.390625 },\n { x: 0.890625, y: 0.390625 },\n { x: 0.921875, y: 0.390625 },\n { x: 0.921875, y: 0.390625 },\n { x: 0.953125, y: 0.390625 },\n { x: 0.953125, y: 0.390625 },\n { x: 0.984375, y: 0.390625 },\n { x: 0.984375, y: 0.390625 },\n { x: 0.015625, y: 0.421875 },\n { x: 0.015625, y: 0.421875 },\n { x: 0.046875, y: 0.421875 },\n { x: 0.046875, y: 0.421875 },\n { x: 0.078125, y: 0.421875 },\n { x: 0.078125, y: 0.421875 },\n { x: 0.109375, y: 0.421875 },\n { x: 0.109375, y: 0.421875 },\n { x: 0.140625, y: 0.421875 },\n { x: 0.140625, y: 0.421875 },\n { x: 0.171875, y: 0.421875 },\n { x: 0.171875, y: 0.421875 },\n { x: 0.203125, y: 0.421875 },\n { x: 0.203125, y: 0.421875 },\n { x: 0.234375, y: 0.421875 },\n { x: 0.234375, y: 0.421875 },\n { x: 0.265625, y: 0.421875 },\n { x: 0.265625, y: 0.421875 },\n { x: 0.296875, y: 0.421875 },\n { x: 0.296875, y: 0.421875 },\n { x: 0.328125, y: 0.421875 },\n { x: 0.328125, y: 0.421875 },\n { x: 0.359375, y: 0.421875 },\n { x: 0.359375, y: 0.421875 },\n { x: 0.390625, y: 0.421875 },\n { x: 0.390625, y: 0.421875 },\n { x: 0.421875, y: 0.421875 },\n { x: 0.421875, y: 0.421875 },\n { x: 0.453125, y: 0.421875 },\n { x: 0.453125, y: 0.421875 },\n { x: 0.484375, y: 0.421875 },\n { x: 0.484375, y: 0.421875 },\n { x: 0.515625, y: 0.421875 },\n { x: 0.515625, y: 0.421875 },\n { x: 0.546875, y: 0.421875 },\n { x: 0.546875, y: 0.421875 },\n { x: 0.578125, y: 0.421875 },\n { x: 0.578125, y: 0.421875 },\n { x: 0.609375, y: 0.421875 },\n { x: 0.609375, y: 0.421875 },\n { x: 0.640625, y: 0.421875 },\n { x: 0.640625, y: 0.421875 },\n { x: 0.671875, y: 0.421875 },\n { x: 0.671875, y: 0.421875 },\n { x: 0.703125, y: 0.421875 },\n { x: 0.703125, y: 0.421875 },\n { x: 0.734375, y: 0.421875 },\n { x: 0.734375, y: 0.421875 },\n { x: 0.765625, y: 0.421875 },\n { x: 0.765625, y: 0.421875 },\n { x: 0.796875, y: 0.421875 },\n { x: 0.796875, y: 0.421875 },\n { x: 0.828125, y: 0.421875 },\n { x: 0.828125, y: 0.421875 },\n { x: 0.859375, y: 0.421875 },\n { x: 0.859375, y: 0.421875 },\n { x: 0.890625, y: 0.421875 },\n { x: 0.890625, y: 0.421875 },\n { x: 0.921875, y: 0.421875 },\n { x: 0.921875, y: 0.421875 },\n { x: 0.953125, y: 0.421875 },\n { x: 0.953125, y: 0.421875 },\n { x: 0.984375, y: 0.421875 },\n { x: 0.984375, y: 0.421875 },\n { x: 0.015625, y: 0.453125 },\n { x: 0.015625, y: 0.453125 },\n { x: 0.046875, y: 0.453125 },\n { x: 0.046875, y: 0.453125 },\n { x: 0.078125, y: 0.453125 },\n { x: 0.078125, y: 0.453125 },\n { x: 0.109375, y: 0.453125 },\n { x: 0.109375, y: 0.453125 },\n { x: 0.140625, y: 0.453125 },\n { x: 0.140625, y: 0.453125 },\n { x: 0.171875, y: 0.453125 },\n { x: 0.171875, y: 0.453125 },\n { x: 0.203125, y: 0.453125 },\n { x: 0.203125, y: 0.453125 },\n { x: 0.234375, y: 0.453125 },\n { x: 0.234375, y: 0.453125 },\n { x: 0.265625, y: 0.453125 },\n { x: 0.265625, y: 0.453125 },\n { x: 0.296875, y: 0.453125 },\n { x: 0.296875, y: 0.453125 },\n { x: 0.328125, y: 0.453125 },\n { x: 0.328125, y: 0.453125 },\n { x: 0.359375, y: 0.453125 },\n { x: 0.359375, y: 0.453125 },\n { x: 0.390625, y: 0.453125 },\n { x: 0.390625, y: 0.453125 },\n { x: 0.421875, y: 0.453125 },\n { x: 0.421875, y: 0.453125 },\n { x: 0.453125, y: 0.453125 },\n { x: 0.453125, y: 0.453125 },\n { x: 0.484375, y: 0.453125 },\n { x: 0.484375, y: 0.453125 },\n { x: 0.515625, y: 0.453125 },\n { x: 0.515625, y: 0.453125 },\n { x: 0.546875, y: 0.453125 },\n { x: 0.546875, y: 0.453125 },\n { x: 0.578125, y: 0.453125 },\n { x: 0.578125, y: 0.453125 },\n { x: 0.609375, y: 0.453125 },\n { x: 0.609375, y: 0.453125 },\n { x: 0.640625, y: 0.453125 },\n { x: 0.640625, y: 0.453125 },\n { x: 0.671875, y: 0.453125 },\n { x: 0.671875, y: 0.453125 },\n { x: 0.703125, y: 0.453125 },\n { x: 0.703125, y: 0.453125 },\n { x: 0.734375, y: 0.453125 },\n { x: 0.734375, y: 0.453125 },\n { x: 0.765625, y: 0.453125 },\n { x: 0.765625, y: 0.453125 },\n { x: 0.796875, y: 0.453125 },\n { x: 0.796875, y: 0.453125 },\n { x: 0.828125, y: 0.453125 },\n { x: 0.828125, y: 0.453125 },\n { x: 0.859375, y: 0.453125 },\n { x: 0.859375, y: 0.453125 },\n { x: 0.890625, y: 0.453125 },\n { x: 0.890625, y: 0.453125 },\n { x: 0.921875, y: 0.453125 },\n { x: 0.921875, y: 0.453125 },\n { x: 0.953125, y: 0.453125 },\n { x: 0.953125, y: 0.453125 },\n { x: 0.984375, y: 0.453125 },\n { x: 0.984375, y: 0.453125 },\n { x: 0.015625, y: 0.484375 },\n { x: 0.015625, y: 0.484375 },\n { x: 0.046875, y: 0.484375 },\n { x: 0.046875, y: 0.484375 },\n { x: 0.078125, y: 0.484375 },\n { x: 0.078125, y: 0.484375 },\n { x: 0.109375, y: 0.484375 },\n { x: 0.109375, y: 0.484375 },\n { x: 0.140625, y: 0.484375 },\n { x: 0.140625, y: 0.484375 },\n { x: 0.171875, y: 0.484375 },\n { x: 0.171875, y: 0.484375 },\n { x: 0.203125, y: 0.484375 },\n { x: 0.203125, y: 0.484375 },\n { x: 0.234375, y: 0.484375 },\n { x: 0.234375, y: 0.484375 },\n { x: 0.265625, y: 0.484375 },\n { x: 0.265625, y: 0.484375 },\n { x: 0.296875, y: 0.484375 },\n { x: 0.296875, y: 0.484375 },\n { x: 0.328125, y: 0.484375 },\n { x: 0.328125, y: 0.484375 },\n { x: 0.359375, y: 0.484375 },\n { x: 0.359375, y: 0.484375 },\n { x: 0.390625, y: 0.484375 },\n { x: 0.390625, y: 0.484375 },\n { x: 0.421875, y: 0.484375 },\n { x: 0.421875, y: 0.484375 },\n { x: 0.453125, y: 0.484375 },\n { x: 0.453125, y: 0.484375 },\n { x: 0.484375, y: 0.484375 },\n { x: 0.484375, y: 0.484375 },\n { x: 0.515625, y: 0.484375 },\n { x: 0.515625, y: 0.484375 },\n { x: 0.546875, y: 0.484375 },\n { x: 0.546875, y: 0.484375 },\n { x: 0.578125, y: 0.484375 },\n { x: 0.578125, y: 0.484375 },\n { x: 0.609375, y: 0.484375 },\n { x: 0.609375, y: 0.484375 },\n { x: 0.640625, y: 0.484375 },\n { x: 0.640625, y: 0.484375 },\n { x: 0.671875, y: 0.484375 },\n { x: 0.671875, y: 0.484375 },\n { x: 0.703125, y: 0.484375 },\n { x: 0.703125, y: 0.484375 },\n { x: 0.734375, y: 0.484375 },\n { x: 0.734375, y: 0.484375 },\n { x: 0.765625, y: 0.484375 },\n { x: 0.765625, y: 0.484375 },\n { x: 0.796875, y: 0.484375 },\n { x: 0.796875, y: 0.484375 },\n { x: 0.828125, y: 0.484375 },\n { x: 0.828125, y: 0.484375 },\n { x: 0.859375, y: 0.484375 },\n { x: 0.859375, y: 0.484375 },\n { x: 0.890625, y: 0.484375 },\n { x: 0.890625, y: 0.484375 },\n { x: 0.921875, y: 0.484375 },\n { x: 0.921875, y: 0.484375 },\n { x: 0.953125, y: 0.484375 },\n { x: 0.953125, y: 0.484375 },\n { x: 0.984375, y: 0.484375 },\n { x: 0.984375, y: 0.484375 },\n { x: 0.015625, y: 0.515625 },\n { x: 0.015625, y: 0.515625 },\n { x: 0.046875, y: 0.515625 },\n { x: 0.046875, y: 0.515625 },\n { x: 0.078125, y: 0.515625 },\n { x: 0.078125, y: 0.515625 },\n { x: 0.109375, y: 0.515625 },\n { x: 0.109375, y: 0.515625 },\n { x: 0.140625, y: 0.515625 },\n { x: 0.140625, y: 0.515625 },\n { x: 0.171875, y: 0.515625 },\n { x: 0.171875, y: 0.515625 },\n { x: 0.203125, y: 0.515625 },\n { x: 0.203125, y: 0.515625 },\n { x: 0.234375, y: 0.515625 },\n { x: 0.234375, y: 0.515625 },\n { x: 0.265625, y: 0.515625 },\n { x: 0.265625, y: 0.515625 },\n { x: 0.296875, y: 0.515625 },\n { x: 0.296875, y: 0.515625 },\n { x: 0.328125, y: 0.515625 },\n { x: 0.328125, y: 0.515625 },\n { x: 0.359375, y: 0.515625 },\n { x: 0.359375, y: 0.515625 },\n { x: 0.390625, y: 0.515625 },\n { x: 0.390625, y: 0.515625 },\n { x: 0.421875, y: 0.515625 },\n { x: 0.421875, y: 0.515625 },\n { x: 0.453125, y: 0.515625 },\n { x: 0.453125, y: 0.515625 },\n { x: 0.484375, y: 0.515625 },\n { x: 0.484375, y: 0.515625 },\n { x: 0.515625, y: 0.515625 },\n { x: 0.515625, y: 0.515625 },\n { x: 0.546875, y: 0.515625 },\n { x: 0.546875, y: 0.515625 },\n { x: 0.578125, y: 0.515625 },\n { x: 0.578125, y: 0.515625 },\n { x: 0.609375, y: 0.515625 },\n { x: 0.609375, y: 0.515625 },\n { x: 0.640625, y: 0.515625 },\n { x: 0.640625, y: 0.515625 },\n { x: 0.671875, y: 0.515625 },\n { x: 0.671875, y: 0.515625 },\n { x: 0.703125, y: 0.515625 },\n { x: 0.703125, y: 0.515625 },\n { x: 0.734375, y: 0.515625 },\n { x: 0.734375, y: 0.515625 },\n { x: 0.765625, y: 0.515625 },\n { x: 0.765625, y: 0.515625 },\n { x: 0.796875, y: 0.515625 },\n { x: 0.796875, y: 0.515625 },\n { x: 0.828125, y: 0.515625 },\n { x: 0.828125, y: 0.515625 },\n { x: 0.859375, y: 0.515625 },\n { x: 0.859375, y: 0.515625 },\n { x: 0.890625, y: 0.515625 },\n { x: 0.890625, y: 0.515625 },\n { x: 0.921875, y: 0.515625 },\n { x: 0.921875, y: 0.515625 },\n { x: 0.953125, y: 0.515625 },\n { x: 0.953125, y: 0.515625 },\n { x: 0.984375, y: 0.515625 },\n { x: 0.984375, y: 0.515625 },\n { x: 0.015625, y: 0.546875 },\n { x: 0.015625, y: 0.546875 },\n { x: 0.046875, y: 0.546875 },\n { x: 0.046875, y: 0.546875 },\n { x: 0.078125, y: 0.546875 },\n { x: 0.078125, y: 0.546875 },\n { x: 0.109375, y: 0.546875 },\n { x: 0.109375, y: 0.546875 },\n { x: 0.140625, y: 0.546875 },\n { x: 0.140625, y: 0.546875 },\n { x: 0.171875, y: 0.546875 },\n { x: 0.171875, y: 0.546875 },\n { x: 0.203125, y: 0.546875 },\n { x: 0.203125, y: 0.546875 },\n { x: 0.234375, y: 0.546875 },\n { x: 0.234375, y: 0.546875 },\n { x: 0.265625, y: 0.546875 },\n { x: 0.265625, y: 0.546875 },\n { x: 0.296875, y: 0.546875 },\n { x: 0.296875, y: 0.546875 },\n { x: 0.328125, y: 0.546875 },\n { x: 0.328125, y: 0.546875 },\n { x: 0.359375, y: 0.546875 },\n { x: 0.359375, y: 0.546875 },\n { x: 0.390625, y: 0.546875 },\n { x: 0.390625, y: 0.546875 },\n { x: 0.421875, y: 0.546875 },\n { x: 0.421875, y: 0.546875 },\n { x: 0.453125, y: 0.546875 },\n { x: 0.453125, y: 0.546875 },\n { x: 0.484375, y: 0.546875 },\n { x: 0.484375, y: 0.546875 },\n { x: 0.515625, y: 0.546875 },\n { x: 0.515625, y: 0.546875 },\n { x: 0.546875, y: 0.546875 },\n { x: 0.546875, y: 0.546875 },\n { x: 0.578125, y: 0.546875 },\n { x: 0.578125, y: 0.546875 },\n { x: 0.609375, y: 0.546875 },\n { x: 0.609375, y: 0.546875 },\n { x: 0.640625, y: 0.546875 },\n { x: 0.640625, y: 0.546875 },\n { x: 0.671875, y: 0.546875 },\n { x: 0.671875, y: 0.546875 },\n { x: 0.703125, y: 0.546875 },\n { x: 0.703125, y: 0.546875 },\n { x: 0.734375, y: 0.546875 },\n { x: 0.734375, y: 0.546875 },\n { x: 0.765625, y: 0.546875 },\n { x: 0.765625, y: 0.546875 },\n { x: 0.796875, y: 0.546875 },\n { x: 0.796875, y: 0.546875 },\n { x: 0.828125, y: 0.546875 },\n { x: 0.828125, y: 0.546875 },\n { x: 0.859375, y: 0.546875 },\n { x: 0.859375, y: 0.546875 },\n { x: 0.890625, y: 0.546875 },\n { x: 0.890625, y: 0.546875 },\n { x: 0.921875, y: 0.546875 },\n { x: 0.921875, y: 0.546875 },\n { x: 0.953125, y: 0.546875 },\n { x: 0.953125, y: 0.546875 },\n { x: 0.984375, y: 0.546875 },\n { x: 0.984375, y: 0.546875 },\n { x: 0.015625, y: 0.578125 },\n { x: 0.015625, y: 0.578125 },\n { x: 0.046875, y: 0.578125 },\n { x: 0.046875, y: 0.578125 },\n { x: 0.078125, y: 0.578125 },\n { x: 0.078125, y: 0.578125 },\n { x: 0.109375, y: 0.578125 },\n { x: 0.109375, y: 0.578125 },\n { x: 0.140625, y: 0.578125 },\n { x: 0.140625, y: 0.578125 },\n { x: 0.171875, y: 0.578125 },\n { x: 0.171875, y: 0.578125 },\n { x: 0.203125, y: 0.578125 },\n { x: 0.203125, y: 0.578125 },\n { x: 0.234375, y: 0.578125 },\n { x: 0.234375, y: 0.578125 },\n { x: 0.265625, y: 0.578125 },\n { x: 0.265625, y: 0.578125 },\n { x: 0.296875, y: 0.578125 },\n { x: 0.296875, y: 0.578125 },\n { x: 0.328125, y: 0.578125 },\n { x: 0.328125, y: 0.578125 },\n { x: 0.359375, y: 0.578125 },\n { x: 0.359375, y: 0.578125 },\n { x: 0.390625, y: 0.578125 },\n { x: 0.390625, y: 0.578125 },\n { x: 0.421875, y: 0.578125 },\n { x: 0.421875, y: 0.578125 },\n { x: 0.453125, y: 0.578125 },\n { x: 0.453125, y: 0.578125 },\n { x: 0.484375, y: 0.578125 },\n { x: 0.484375, y: 0.578125 },\n { x: 0.515625, y: 0.578125 },\n { x: 0.515625, y: 0.578125 },\n { x: 0.546875, y: 0.578125 },\n { x: 0.546875, y: 0.578125 },\n { x: 0.578125, y: 0.578125 },\n { x: 0.578125, y: 0.578125 },\n { x: 0.609375, y: 0.578125 },\n { x: 0.609375, y: 0.578125 },\n { x: 0.640625, y: 0.578125 },\n { x: 0.640625, y: 0.578125 },\n { x: 0.671875, y: 0.578125 },\n { x: 0.671875, y: 0.578125 },\n { x: 0.703125, y: 0.578125 },\n { x: 0.703125, y: 0.578125 },\n { x: 0.734375, y: 0.578125 },\n { x: 0.734375, y: 0.578125 },\n { x: 0.765625, y: 0.578125 },\n { x: 0.765625, y: 0.578125 },\n { x: 0.796875, y: 0.578125 },\n { x: 0.796875, y: 0.578125 },\n { x: 0.828125, y: 0.578125 },\n { x: 0.828125, y: 0.578125 },\n { x: 0.859375, y: 0.578125 },\n { x: 0.859375, y: 0.578125 },\n { x: 0.890625, y: 0.578125 },\n { x: 0.890625, y: 0.578125 },\n { x: 0.921875, y: 0.578125 },\n { x: 0.921875, y: 0.578125 },\n { x: 0.953125, y: 0.578125 },\n { x: 0.953125, y: 0.578125 },\n { x: 0.984375, y: 0.578125 },\n { x: 0.984375, y: 0.578125 },\n { x: 0.015625, y: 0.609375 },\n { x: 0.015625, y: 0.609375 },\n { x: 0.046875, y: 0.609375 },\n { x: 0.046875, y: 0.609375 },\n { x: 0.078125, y: 0.609375 },\n { x: 0.078125, y: 0.609375 },\n { x: 0.109375, y: 0.609375 },\n { x: 0.109375, y: 0.609375 },\n { x: 0.140625, y: 0.609375 },\n { x: 0.140625, y: 0.609375 },\n { x: 0.171875, y: 0.609375 },\n { x: 0.171875, y: 0.609375 },\n { x: 0.203125, y: 0.609375 },\n { x: 0.203125, y: 0.609375 },\n { x: 0.234375, y: 0.609375 },\n { x: 0.234375, y: 0.609375 },\n { x: 0.265625, y: 0.609375 },\n { x: 0.265625, y: 0.609375 },\n { x: 0.296875, y: 0.609375 },\n { x: 0.296875, y: 0.609375 },\n { x: 0.328125, y: 0.609375 },\n { x: 0.328125, y: 0.609375 },\n { x: 0.359375, y: 0.609375 },\n { x: 0.359375, y: 0.609375 },\n { x: 0.390625, y: 0.609375 },\n { x: 0.390625, y: 0.609375 },\n { x: 0.421875, y: 0.609375 },\n { x: 0.421875, y: 0.609375 },\n { x: 0.453125, y: 0.609375 },\n { x: 0.453125, y: 0.609375 },\n { x: 0.484375, y: 0.609375 },\n { x: 0.484375, y: 0.609375 },\n { x: 0.515625, y: 0.609375 },\n { x: 0.515625, y: 0.609375 },\n { x: 0.546875, y: 0.609375 },\n { x: 0.546875, y: 0.609375 },\n { x: 0.578125, y: 0.609375 },\n { x: 0.578125, y: 0.609375 },\n { x: 0.609375, y: 0.609375 },\n { x: 0.609375, y: 0.609375 },\n { x: 0.640625, y: 0.609375 },\n { x: 0.640625, y: 0.609375 },\n { x: 0.671875, y: 0.609375 },\n { x: 0.671875, y: 0.609375 },\n { x: 0.703125, y: 0.609375 },\n { x: 0.703125, y: 0.609375 },\n { x: 0.734375, y: 0.609375 },\n { x: 0.734375, y: 0.609375 },\n { x: 0.765625, y: 0.609375 },\n { x: 0.765625, y: 0.609375 },\n { x: 0.796875, y: 0.609375 },\n { x: 0.796875, y: 0.609375 },\n { x: 0.828125, y: 0.609375 },\n { x: 0.828125, y: 0.609375 },\n { x: 0.859375, y: 0.609375 },\n { x: 0.859375, y: 0.609375 },\n { x: 0.890625, y: 0.609375 },\n { x: 0.890625, y: 0.609375 },\n { x: 0.921875, y: 0.609375 },\n { x: 0.921875, y: 0.609375 },\n { x: 0.953125, y: 0.609375 },\n { x: 0.953125, y: 0.609375 },\n { x: 0.984375, y: 0.609375 },\n { x: 0.984375, y: 0.609375 },\n { x: 0.015625, y: 0.640625 },\n { x: 0.015625, y: 0.640625 },\n { x: 0.046875, y: 0.640625 },\n { x: 0.046875, y: 0.640625 },\n { x: 0.078125, y: 0.640625 },\n { x: 0.078125, y: 0.640625 },\n { x: 0.109375, y: 0.640625 },\n { x: 0.109375, y: 0.640625 },\n { x: 0.140625, y: 0.640625 },\n { x: 0.140625, y: 0.640625 },\n { x: 0.171875, y: 0.640625 },\n { x: 0.171875, y: 0.640625 },\n { x: 0.203125, y: 0.640625 },\n { x: 0.203125, y: 0.640625 },\n { x: 0.234375, y: 0.640625 },\n { x: 0.234375, y: 0.640625 },\n { x: 0.265625, y: 0.640625 },\n { x: 0.265625, y: 0.640625 },\n { x: 0.296875, y: 0.640625 },\n { x: 0.296875, y: 0.640625 },\n { x: 0.328125, y: 0.640625 },\n { x: 0.328125, y: 0.640625 },\n { x: 0.359375, y: 0.640625 },\n { x: 0.359375, y: 0.640625 },\n { x: 0.390625, y: 0.640625 },\n { x: 0.390625, y: 0.640625 },\n { x: 0.421875, y: 0.640625 },\n { x: 0.421875, y: 0.640625 },\n { x: 0.453125, y: 0.640625 },\n { x: 0.453125, y: 0.640625 },\n { x: 0.484375, y: 0.640625 },\n { x: 0.484375, y: 0.640625 },\n { x: 0.515625, y: 0.640625 },\n { x: 0.515625, y: 0.640625 },\n { x: 0.546875, y: 0.640625 },\n { x: 0.546875, y: 0.640625 },\n { x: 0.578125, y: 0.640625 },\n { x: 0.578125, y: 0.640625 },\n { x: 0.609375, y: 0.640625 },\n { x: 0.609375, y: 0.640625 },\n { x: 0.640625, y: 0.640625 },\n { x: 0.640625, y: 0.640625 },\n { x: 0.671875, y: 0.640625 },\n { x: 0.671875, y: 0.640625 },\n { x: 0.703125, y: 0.640625 },\n { x: 0.703125, y: 0.640625 },\n { x: 0.734375, y: 0.640625 },\n { x: 0.734375, y: 0.640625 },\n { x: 0.765625, y: 0.640625 },\n { x: 0.765625, y: 0.640625 },\n { x: 0.796875, y: 0.640625 },\n { x: 0.796875, y: 0.640625 },\n { x: 0.828125, y: 0.640625 },\n { x: 0.828125, y: 0.640625 },\n { x: 0.859375, y: 0.640625 },\n { x: 0.859375, y: 0.640625 },\n { x: 0.890625, y: 0.640625 },\n { x: 0.890625, y: 0.640625 },\n { x: 0.921875, y: 0.640625 },\n { x: 0.921875, y: 0.640625 },\n { x: 0.953125, y: 0.640625 },\n { x: 0.953125, y: 0.640625 },\n { x: 0.984375, y: 0.640625 },\n { x: 0.984375, y: 0.640625 },\n { x: 0.015625, y: 0.671875 },\n { x: 0.015625, y: 0.671875 },\n { x: 0.046875, y: 0.671875 },\n { x: 0.046875, y: 0.671875 },\n { x: 0.078125, y: 0.671875 },\n { x: 0.078125, y: 0.671875 },\n { x: 0.109375, y: 0.671875 },\n { x: 0.109375, y: 0.671875 },\n { x: 0.140625, y: 0.671875 },\n { x: 0.140625, y: 0.671875 },\n { x: 0.171875, y: 0.671875 },\n { x: 0.171875, y: 0.671875 },\n { x: 0.203125, y: 0.671875 },\n { x: 0.203125, y: 0.671875 },\n { x: 0.234375, y: 0.671875 },\n { x: 0.234375, y: 0.671875 },\n { x: 0.265625, y: 0.671875 },\n { x: 0.265625, y: 0.671875 },\n { x: 0.296875, y: 0.671875 },\n { x: 0.296875, y: 0.671875 },\n { x: 0.328125, y: 0.671875 },\n { x: 0.328125, y: 0.671875 },\n { x: 0.359375, y: 0.671875 },\n { x: 0.359375, y: 0.671875 },\n { x: 0.390625, y: 0.671875 },\n { x: 0.390625, y: 0.671875 },\n { x: 0.421875, y: 0.671875 },\n { x: 0.421875, y: 0.671875 },\n { x: 0.453125, y: 0.671875 },\n { x: 0.453125, y: 0.671875 },\n { x: 0.484375, y: 0.671875 },\n { x: 0.484375, y: 0.671875 },\n { x: 0.515625, y: 0.671875 },\n { x: 0.515625, y: 0.671875 },\n { x: 0.546875, y: 0.671875 },\n { x: 0.546875, y: 0.671875 },\n { x: 0.578125, y: 0.671875 },\n { x: 0.578125, y: 0.671875 },\n { x: 0.609375, y: 0.671875 },\n { x: 0.609375, y: 0.671875 },\n { x: 0.640625, y: 0.671875 },\n { x: 0.640625, y: 0.671875 },\n { x: 0.671875, y: 0.671875 },\n { x: 0.671875, y: 0.671875 },\n { x: 0.703125, y: 0.671875 },\n { x: 0.703125, y: 0.671875 },\n { x: 0.734375, y: 0.671875 },\n { x: 0.734375, y: 0.671875 },\n { x: 0.765625, y: 0.671875 },\n { x: 0.765625, y: 0.671875 },\n { x: 0.796875, y: 0.671875 },\n { x: 0.796875, y: 0.671875 },\n { x: 0.828125, y: 0.671875 },\n { x: 0.828125, y: 0.671875 },\n { x: 0.859375, y: 0.671875 },\n { x: 0.859375, y: 0.671875 },\n { x: 0.890625, y: 0.671875 },\n { x: 0.890625, y: 0.671875 },\n { x: 0.921875, y: 0.671875 },\n { x: 0.921875, y: 0.671875 },\n { x: 0.953125, y: 0.671875 },\n { x: 0.953125, y: 0.671875 },\n { x: 0.984375, y: 0.671875 },\n { x: 0.984375, y: 0.671875 },\n { x: 0.015625, y: 0.703125 },\n { x: 0.015625, y: 0.703125 },\n { x: 0.046875, y: 0.703125 },\n { x: 0.046875, y: 0.703125 },\n { x: 0.078125, y: 0.703125 },\n { x: 0.078125, y: 0.703125 },\n { x: 0.109375, y: 0.703125 },\n { x: 0.109375, y: 0.703125 },\n { x: 0.140625, y: 0.703125 },\n { x: 0.140625, y: 0.703125 },\n { x: 0.171875, y: 0.703125 },\n { x: 0.171875, y: 0.703125 },\n { x: 0.203125, y: 0.703125 },\n { x: 0.203125, y: 0.703125 },\n { x: 0.234375, y: 0.703125 },\n { x: 0.234375, y: 0.703125 },\n { x: 0.265625, y: 0.703125 },\n { x: 0.265625, y: 0.703125 },\n { x: 0.296875, y: 0.703125 },\n { x: 0.296875, y: 0.703125 },\n { x: 0.328125, y: 0.703125 },\n { x: 0.328125, y: 0.703125 },\n { x: 0.359375, y: 0.703125 },\n { x: 0.359375, y: 0.703125 },\n { x: 0.390625, y: 0.703125 },\n { x: 0.390625, y: 0.703125 },\n { x: 0.421875, y: 0.703125 },\n { x: 0.421875, y: 0.703125 },\n { x: 0.453125, y: 0.703125 },\n { x: 0.453125, y: 0.703125 },\n { x: 0.484375, y: 0.703125 },\n { x: 0.484375, y: 0.703125 },\n { x: 0.515625, y: 0.703125 },\n { x: 0.515625, y: 0.703125 },\n { x: 0.546875, y: 0.703125 },\n { x: 0.546875, y: 0.703125 },\n { x: 0.578125, y: 0.703125 },\n { x: 0.578125, y: 0.703125 },\n { x: 0.609375, y: 0.703125 },\n { x: 0.609375, y: 0.703125 },\n { x: 0.640625, y: 0.703125 },\n { x: 0.640625, y: 0.703125 },\n { x: 0.671875, y: 0.703125 },\n { x: 0.671875, y: 0.703125 },\n { x: 0.703125, y: 0.703125 },\n { x: 0.703125, y: 0.703125 },\n { x: 0.734375, y: 0.703125 },\n { x: 0.734375, y: 0.703125 },\n { x: 0.765625, y: 0.703125 },\n { x: 0.765625, y: 0.703125 },\n { x: 0.796875, y: 0.703125 },\n { x: 0.796875, y: 0.703125 },\n { x: 0.828125, y: 0.703125 },\n { x: 0.828125, y: 0.703125 },\n { x: 0.859375, y: 0.703125 },\n { x: 0.859375, y: 0.703125 },\n { x: 0.890625, y: 0.703125 },\n { x: 0.890625, y: 0.703125 },\n { x: 0.921875, y: 0.703125 },\n { x: 0.921875, y: 0.703125 },\n { x: 0.953125, y: 0.703125 },\n { x: 0.953125, y: 0.703125 },\n { x: 0.984375, y: 0.703125 },\n { x: 0.984375, y: 0.703125 },\n { x: 0.015625, y: 0.734375 },\n { x: 0.015625, y: 0.734375 },\n { x: 0.046875, y: 0.734375 },\n { x: 0.046875, y: 0.734375 },\n { x: 0.078125, y: 0.734375 },\n { x: 0.078125, y: 0.734375 },\n { x: 0.109375, y: 0.734375 },\n { x: 0.109375, y: 0.734375 },\n { x: 0.140625, y: 0.734375 },\n { x: 0.140625, y: 0.734375 },\n { x: 0.171875, y: 0.734375 },\n { x: 0.171875, y: 0.734375 },\n { x: 0.203125, y: 0.734375 },\n { x: 0.203125, y: 0.734375 },\n { x: 0.234375, y: 0.734375 },\n { x: 0.234375, y: 0.734375 },\n { x: 0.265625, y: 0.734375 },\n { x: 0.265625, y: 0.734375 },\n { x: 0.296875, y: 0.734375 },\n { x: 0.296875, y: 0.734375 },\n { x: 0.328125, y: 0.734375 },\n { x: 0.328125, y: 0.734375 },\n { x: 0.359375, y: 0.734375 },\n { x: 0.359375, y: 0.734375 },\n { x: 0.390625, y: 0.734375 },\n { x: 0.390625, y: 0.734375 },\n { x: 0.421875, y: 0.734375 },\n { x: 0.421875, y: 0.734375 },\n { x: 0.453125, y: 0.734375 },\n { x: 0.453125, y: 0.734375 },\n { x: 0.484375, y: 0.734375 },\n { x: 0.484375, y: 0.734375 },\n { x: 0.515625, y: 0.734375 },\n { x: 0.515625, y: 0.734375 },\n { x: 0.546875, y: 0.734375 },\n { x: 0.546875, y: 0.734375 },\n { x: 0.578125, y: 0.734375 },\n { x: 0.578125, y: 0.734375 },\n { x: 0.609375, y: 0.734375 },\n { x: 0.609375, y: 0.734375 },\n { x: 0.640625, y: 0.734375 },\n { x: 0.640625, y: 0.734375 },\n { x: 0.671875, y: 0.734375 },\n { x: 0.671875, y: 0.734375 },\n { x: 0.703125, y: 0.734375 },\n { x: 0.703125, y: 0.734375 },\n { x: 0.734375, y: 0.734375 },\n { x: 0.734375, y: 0.734375 },\n { x: 0.765625, y: 0.734375 },\n { x: 0.765625, y: 0.734375 },\n { x: 0.796875, y: 0.734375 },\n { x: 0.796875, y: 0.734375 },\n { x: 0.828125, y: 0.734375 },\n { x: 0.828125, y: 0.734375 },\n { x: 0.859375, y: 0.734375 },\n { x: 0.859375, y: 0.734375 },\n { x: 0.890625, y: 0.734375 },\n { x: 0.890625, y: 0.734375 },\n { x: 0.921875, y: 0.734375 },\n { x: 0.921875, y: 0.734375 },\n { x: 0.953125, y: 0.734375 },\n { x: 0.953125, y: 0.734375 },\n { x: 0.984375, y: 0.734375 },\n { x: 0.984375, y: 0.734375 },\n { x: 0.015625, y: 0.765625 },\n { x: 0.015625, y: 0.765625 },\n { x: 0.046875, y: 0.765625 },\n { x: 0.046875, y: 0.765625 },\n { x: 0.078125, y: 0.765625 },\n { x: 0.078125, y: 0.765625 },\n { x: 0.109375, y: 0.765625 },\n { x: 0.109375, y: 0.765625 },\n { x: 0.140625, y: 0.765625 },\n { x: 0.140625, y: 0.765625 },\n { x: 0.171875, y: 0.765625 },\n { x: 0.171875, y: 0.765625 },\n { x: 0.203125, y: 0.765625 },\n { x: 0.203125, y: 0.765625 },\n { x: 0.234375, y: 0.765625 },\n { x: 0.234375, y: 0.765625 },\n { x: 0.265625, y: 0.765625 },\n { x: 0.265625, y: 0.765625 },\n { x: 0.296875, y: 0.765625 },\n { x: 0.296875, y: 0.765625 },\n { x: 0.328125, y: 0.765625 },\n { x: 0.328125, y: 0.765625 },\n { x: 0.359375, y: 0.765625 },\n { x: 0.359375, y: 0.765625 },\n { x: 0.390625, y: 0.765625 },\n { x: 0.390625, y: 0.765625 },\n { x: 0.421875, y: 0.765625 },\n { x: 0.421875, y: 0.765625 },\n { x: 0.453125, y: 0.765625 },\n { x: 0.453125, y: 0.765625 },\n { x: 0.484375, y: 0.765625 },\n { x: 0.484375, y: 0.765625 },\n { x: 0.515625, y: 0.765625 },\n { x: 0.515625, y: 0.765625 },\n { x: 0.546875, y: 0.765625 },\n { x: 0.546875, y: 0.765625 },\n { x: 0.578125, y: 0.765625 },\n { x: 0.578125, y: 0.765625 },\n { x: 0.609375, y: 0.765625 },\n { x: 0.609375, y: 0.765625 },\n { x: 0.640625, y: 0.765625 },\n { x: 0.640625, y: 0.765625 },\n { x: 0.671875, y: 0.765625 },\n { x: 0.671875, y: 0.765625 },\n { x: 0.703125, y: 0.765625 },\n { x: 0.703125, y: 0.765625 },\n { x: 0.734375, y: 0.765625 },\n { x: 0.734375, y: 0.765625 },\n { x: 0.765625, y: 0.765625 },\n { x: 0.765625, y: 0.765625 },\n { x: 0.796875, y: 0.765625 },\n { x: 0.796875, y: 0.765625 },\n { x: 0.828125, y: 0.765625 },\n { x: 0.828125, y: 0.765625 },\n { x: 0.859375, y: 0.765625 },\n { x: 0.859375, y: 0.765625 },\n { x: 0.890625, y: 0.765625 },\n { x: 0.890625, y: 0.765625 },\n { x: 0.921875, y: 0.765625 },\n { x: 0.921875, y: 0.765625 },\n { x: 0.953125, y: 0.765625 },\n { x: 0.953125, y: 0.765625 },\n { x: 0.984375, y: 0.765625 },\n { x: 0.984375, y: 0.765625 },\n { x: 0.015625, y: 0.796875 },\n { x: 0.015625, y: 0.796875 },\n { x: 0.046875, y: 0.796875 },\n { x: 0.046875, y: 0.796875 },\n { x: 0.078125, y: 0.796875 },\n { x: 0.078125, y: 0.796875 },\n { x: 0.109375, y: 0.796875 },\n { x: 0.109375, y: 0.796875 },\n { x: 0.140625, y: 0.796875 },\n { x: 0.140625, y: 0.796875 },\n { x: 0.171875, y: 0.796875 },\n { x: 0.171875, y: 0.796875 },\n { x: 0.203125, y: 0.796875 },\n { x: 0.203125, y: 0.796875 },\n { x: 0.234375, y: 0.796875 },\n { x: 0.234375, y: 0.796875 },\n { x: 0.265625, y: 0.796875 },\n { x: 0.265625, y: 0.796875 },\n { x: 0.296875, y: 0.796875 },\n { x: 0.296875, y: 0.796875 },\n { x: 0.328125, y: 0.796875 },\n { x: 0.328125, y: 0.796875 },\n { x: 0.359375, y: 0.796875 },\n { x: 0.359375, y: 0.796875 },\n { x: 0.390625, y: 0.796875 },\n { x: 0.390625, y: 0.796875 },\n { x: 0.421875, y: 0.796875 },\n { x: 0.421875, y: 0.796875 },\n { x: 0.453125, y: 0.796875 },\n { x: 0.453125, y: 0.796875 },\n { x: 0.484375, y: 0.796875 },\n { x: 0.484375, y: 0.796875 },\n { x: 0.515625, y: 0.796875 },\n { x: 0.515625, y: 0.796875 },\n { x: 0.546875, y: 0.796875 },\n { x: 0.546875, y: 0.796875 },\n { x: 0.578125, y: 0.796875 },\n { x: 0.578125, y: 0.796875 },\n { x: 0.609375, y: 0.796875 },\n { x: 0.609375, y: 0.796875 },\n { x: 0.640625, y: 0.796875 },\n { x: 0.640625, y: 0.796875 },\n { x: 0.671875, y: 0.796875 },\n { x: 0.671875, y: 0.796875 },\n { x: 0.703125, y: 0.796875 },\n { x: 0.703125, y: 0.796875 },\n { x: 0.734375, y: 0.796875 },\n { x: 0.734375, y: 0.796875 },\n { x: 0.765625, y: 0.796875 },\n { x: 0.765625, y: 0.796875 },\n { x: 0.796875, y: 0.796875 },\n { x: 0.796875, y: 0.796875 },\n { x: 0.828125, y: 0.796875 },\n { x: 0.828125, y: 0.796875 },\n { x: 0.859375, y: 0.796875 },\n { x: 0.859375, y: 0.796875 },\n { x: 0.890625, y: 0.796875 },\n { x: 0.890625, y: 0.796875 },\n { x: 0.921875, y: 0.796875 },\n { x: 0.921875, y: 0.796875 },\n { x: 0.953125, y: 0.796875 },\n { x: 0.953125, y: 0.796875 },\n { x: 0.984375, y: 0.796875 },\n { x: 0.984375, y: 0.796875 },\n { x: 0.015625, y: 0.828125 },\n { x: 0.015625, y: 0.828125 },\n { x: 0.046875, y: 0.828125 },\n { x: 0.046875, y: 0.828125 },\n { x: 0.078125, y: 0.828125 },\n { x: 0.078125, y: 0.828125 },\n { x: 0.109375, y: 0.828125 },\n { x: 0.109375, y: 0.828125 },\n { x: 0.140625, y: 0.828125 },\n { x: 0.140625, y: 0.828125 },\n { x: 0.171875, y: 0.828125 },\n { x: 0.171875, y: 0.828125 },\n { x: 0.203125, y: 0.828125 },\n { x: 0.203125, y: 0.828125 },\n { x: 0.234375, y: 0.828125 },\n { x: 0.234375, y: 0.828125 },\n { x: 0.265625, y: 0.828125 },\n { x: 0.265625, y: 0.828125 },\n { x: 0.296875, y: 0.828125 },\n { x: 0.296875, y: 0.828125 },\n { x: 0.328125, y: 0.828125 },\n { x: 0.328125, y: 0.828125 },\n { x: 0.359375, y: 0.828125 },\n { x: 0.359375, y: 0.828125 },\n { x: 0.390625, y: 0.828125 },\n { x: 0.390625, y: 0.828125 },\n { x: 0.421875, y: 0.828125 },\n { x: 0.421875, y: 0.828125 },\n { x: 0.453125, y: 0.828125 },\n { x: 0.453125, y: 0.828125 },\n { x: 0.484375, y: 0.828125 },\n { x: 0.484375, y: 0.828125 },\n { x: 0.515625, y: 0.828125 },\n { x: 0.515625, y: 0.828125 },\n { x: 0.546875, y: 0.828125 },\n { x: 0.546875, y: 0.828125 },\n { x: 0.578125, y: 0.828125 },\n { x: 0.578125, y: 0.828125 },\n { x: 0.609375, y: 0.828125 },\n { x: 0.609375, y: 0.828125 },\n { x: 0.640625, y: 0.828125 },\n { x: 0.640625, y: 0.828125 },\n { x: 0.671875, y: 0.828125 },\n { x: 0.671875, y: 0.828125 },\n { x: 0.703125, y: 0.828125 },\n { x: 0.703125, y: 0.828125 },\n { x: 0.734375, y: 0.828125 },\n { x: 0.734375, y: 0.828125 },\n { x: 0.765625, y: 0.828125 },\n { x: 0.765625, y: 0.828125 },\n { x: 0.796875, y: 0.828125 },\n { x: 0.796875, y: 0.828125 },\n { x: 0.828125, y: 0.828125 },\n { x: 0.828125, y: 0.828125 },\n { x: 0.859375, y: 0.828125 },\n { x: 0.859375, y: 0.828125 },\n { x: 0.890625, y: 0.828125 },\n { x: 0.890625, y: 0.828125 },\n { x: 0.921875, y: 0.828125 },\n { x: 0.921875, y: 0.828125 },\n { x: 0.953125, y: 0.828125 },\n { x: 0.953125, y: 0.828125 },\n { x: 0.984375, y: 0.828125 },\n { x: 0.984375, y: 0.828125 },\n { x: 0.015625, y: 0.859375 },\n { x: 0.015625, y: 0.859375 },\n { x: 0.046875, y: 0.859375 },\n { x: 0.046875, y: 0.859375 },\n { x: 0.078125, y: 0.859375 },\n { x: 0.078125, y: 0.859375 },\n { x: 0.109375, y: 0.859375 },\n { x: 0.109375, y: 0.859375 },\n { x: 0.140625, y: 0.859375 },\n { x: 0.140625, y: 0.859375 },\n { x: 0.171875, y: 0.859375 },\n { x: 0.171875, y: 0.859375 },\n { x: 0.203125, y: 0.859375 },\n { x: 0.203125, y: 0.859375 },\n { x: 0.234375, y: 0.859375 },\n { x: 0.234375, y: 0.859375 },\n { x: 0.265625, y: 0.859375 },\n { x: 0.265625, y: 0.859375 },\n { x: 0.296875, y: 0.859375 },\n { x: 0.296875, y: 0.859375 },\n { x: 0.328125, y: 0.859375 },\n { x: 0.328125, y: 0.859375 },\n { x: 0.359375, y: 0.859375 },\n { x: 0.359375, y: 0.859375 },\n { x: 0.390625, y: 0.859375 },\n { x: 0.390625, y: 0.859375 },\n { x: 0.421875, y: 0.859375 },\n { x: 0.421875, y: 0.859375 },\n { x: 0.453125, y: 0.859375 },\n { x: 0.453125, y: 0.859375 },\n { x: 0.484375, y: 0.859375 },\n { x: 0.484375, y: 0.859375 },\n { x: 0.515625, y: 0.859375 },\n { x: 0.515625, y: 0.859375 },\n { x: 0.546875, y: 0.859375 },\n { x: 0.546875, y: 0.859375 },\n { x: 0.578125, y: 0.859375 },\n { x: 0.578125, y: 0.859375 },\n { x: 0.609375, y: 0.859375 },\n { x: 0.609375, y: 0.859375 },\n { x: 0.640625, y: 0.859375 },\n { x: 0.640625, y: 0.859375 },\n { x: 0.671875, y: 0.859375 },\n { x: 0.671875, y: 0.859375 },\n { x: 0.703125, y: 0.859375 },\n { x: 0.703125, y: 0.859375 },\n { x: 0.734375, y: 0.859375 },\n { x: 0.734375, y: 0.859375 },\n { x: 0.765625, y: 0.859375 },\n { x: 0.765625, y: 0.859375 },\n { x: 0.796875, y: 0.859375 },\n { x: 0.796875, y: 0.859375 },\n { x: 0.828125, y: 0.859375 },\n { x: 0.828125, y: 0.859375 },\n { x: 0.859375, y: 0.859375 },\n { x: 0.859375, y: 0.859375 },\n { x: 0.890625, y: 0.859375 },\n { x: 0.890625, y: 0.859375 },\n { x: 0.921875, y: 0.859375 },\n { x: 0.921875, y: 0.859375 },\n { x: 0.953125, y: 0.859375 },\n { x: 0.953125, y: 0.859375 },\n { x: 0.984375, y: 0.859375 },\n { x: 0.984375, y: 0.859375 },\n { x: 0.015625, y: 0.890625 },\n { x: 0.015625, y: 0.890625 },\n { x: 0.046875, y: 0.890625 },\n { x: 0.046875, y: 0.890625 },\n { x: 0.078125, y: 0.890625 },\n { x: 0.078125, y: 0.890625 },\n { x: 0.109375, y: 0.890625 },\n { x: 0.109375, y: 0.890625 },\n { x: 0.140625, y: 0.890625 },\n { x: 0.140625, y: 0.890625 },\n { x: 0.171875, y: 0.890625 },\n { x: 0.171875, y: 0.890625 },\n { x: 0.203125, y: 0.890625 },\n { x: 0.203125, y: 0.890625 },\n { x: 0.234375, y: 0.890625 },\n { x: 0.234375, y: 0.890625 },\n { x: 0.265625, y: 0.890625 },\n { x: 0.265625, y: 0.890625 },\n { x: 0.296875, y: 0.890625 },\n { x: 0.296875, y: 0.890625 },\n { x: 0.328125, y: 0.890625 },\n { x: 0.328125, y: 0.890625 },\n { x: 0.359375, y: 0.890625 },\n { x: 0.359375, y: 0.890625 },\n { x: 0.390625, y: 0.890625 },\n { x: 0.390625, y: 0.890625 },\n { x: 0.421875, y: 0.890625 },\n { x: 0.421875, y: 0.890625 },\n { x: 0.453125, y: 0.890625 },\n { x: 0.453125, y: 0.890625 },\n { x: 0.484375, y: 0.890625 },\n { x: 0.484375, y: 0.890625 },\n { x: 0.515625, y: 0.890625 },\n { x: 0.515625, y: 0.890625 },\n { x: 0.546875, y: 0.890625 },\n { x: 0.546875, y: 0.890625 },\n { x: 0.578125, y: 0.890625 },\n { x: 0.578125, y: 0.890625 },\n { x: 0.609375, y: 0.890625 },\n { x: 0.609375, y: 0.890625 },\n { x: 0.640625, y: 0.890625 },\n { x: 0.640625, y: 0.890625 },\n { x: 0.671875, y: 0.890625 },\n { x: 0.671875, y: 0.890625 },\n { x: 0.703125, y: 0.890625 },\n { x: 0.703125, y: 0.890625 },\n { x: 0.734375, y: 0.890625 },\n { x: 0.734375, y: 0.890625 },\n { x: 0.765625, y: 0.890625 },\n { x: 0.765625, y: 0.890625 },\n { x: 0.796875, y: 0.890625 },\n { x: 0.796875, y: 0.890625 },\n { x: 0.828125, y: 0.890625 },\n { x: 0.828125, y: 0.890625 },\n { x: 0.859375, y: 0.890625 },\n { x: 0.859375, y: 0.890625 },\n { x: 0.890625, y: 0.890625 },\n { x: 0.890625, y: 0.890625 },\n { x: 0.921875, y: 0.890625 },\n { x: 0.921875, y: 0.890625 },\n { x: 0.953125, y: 0.890625 },\n { x: 0.953125, y: 0.890625 },\n { x: 0.984375, y: 0.890625 },\n { x: 0.984375, y: 0.890625 },\n { x: 0.015625, y: 0.921875 },\n { x: 0.015625, y: 0.921875 },\n { x: 0.046875, y: 0.921875 },\n { x: 0.046875, y: 0.921875 },\n { x: 0.078125, y: 0.921875 },\n { x: 0.078125, y: 0.921875 },\n { x: 0.109375, y: 0.921875 },\n { x: 0.109375, y: 0.921875 },\n { x: 0.140625, y: 0.921875 },\n { x: 0.140625, y: 0.921875 },\n { x: 0.171875, y: 0.921875 },\n { x: 0.171875, y: 0.921875 },\n { x: 0.203125, y: 0.921875 },\n { x: 0.203125, y: 0.921875 },\n { x: 0.234375, y: 0.921875 },\n { x: 0.234375, y: 0.921875 },\n { x: 0.265625, y: 0.921875 },\n { x: 0.265625, y: 0.921875 },\n { x: 0.296875, y: 0.921875 },\n { x: 0.296875, y: 0.921875 },\n { x: 0.328125, y: 0.921875 },\n { x: 0.328125, y: 0.921875 },\n { x: 0.359375, y: 0.921875 },\n { x: 0.359375, y: 0.921875 },\n { x: 0.390625, y: 0.921875 },\n { x: 0.390625, y: 0.921875 },\n { x: 0.421875, y: 0.921875 },\n { x: 0.421875, y: 0.921875 },\n { x: 0.453125, y: 0.921875 },\n { x: 0.453125, y: 0.921875 },\n { x: 0.484375, y: 0.921875 },\n { x: 0.484375, y: 0.921875 },\n { x: 0.515625, y: 0.921875 },\n { x: 0.515625, y: 0.921875 },\n { x: 0.546875, y: 0.921875 },\n { x: 0.546875, y: 0.921875 },\n { x: 0.578125, y: 0.921875 },\n { x: 0.578125, y: 0.921875 },\n { x: 0.609375, y: 0.921875 },\n { x: 0.609375, y: 0.921875 },\n { x: 0.640625, y: 0.921875 },\n { x: 0.640625, y: 0.921875 },\n { x: 0.671875, y: 0.921875 },\n { x: 0.671875, y: 0.921875 },\n { x: 0.703125, y: 0.921875 },\n { x: 0.703125, y: 0.921875 },\n { x: 0.734375, y: 0.921875 },\n { x: 0.734375, y: 0.921875 },\n { x: 0.765625, y: 0.921875 },\n { x: 0.765625, y: 0.921875 },\n { x: 0.796875, y: 0.921875 },\n { x: 0.796875, y: 0.921875 },\n { x: 0.828125, y: 0.921875 },\n { x: 0.828125, y: 0.921875 },\n { x: 0.859375, y: 0.921875 },\n { x: 0.859375, y: 0.921875 },\n { x: 0.890625, y: 0.921875 },\n { x: 0.890625, y: 0.921875 },\n { x: 0.921875, y: 0.921875 },\n { x: 0.921875, y: 0.921875 },\n { x: 0.953125, y: 0.921875 },\n { x: 0.953125, y: 0.921875 },\n { x: 0.984375, y: 0.921875 },\n { x: 0.984375, y: 0.921875 },\n { x: 0.015625, y: 0.953125 },\n { x: 0.015625, y: 0.953125 },\n { x: 0.046875, y: 0.953125 },\n { x: 0.046875, y: 0.953125 },\n { x: 0.078125, y: 0.953125 },\n { x: 0.078125, y: 0.953125 },\n { x: 0.109375, y: 0.953125 },\n { x: 0.109375, y: 0.953125 },\n { x: 0.140625, y: 0.953125 },\n { x: 0.140625, y: 0.953125 },\n { x: 0.171875, y: 0.953125 },\n { x: 0.171875, y: 0.953125 },\n { x: 0.203125, y: 0.953125 },\n { x: 0.203125, y: 0.953125 },\n { x: 0.234375, y: 0.953125 },\n { x: 0.234375, y: 0.953125 },\n { x: 0.265625, y: 0.953125 },\n { x: 0.265625, y: 0.953125 },\n { x: 0.296875, y: 0.953125 },\n { x: 0.296875, y: 0.953125 },\n { x: 0.328125, y: 0.953125 },\n { x: 0.328125, y: 0.953125 },\n { x: 0.359375, y: 0.953125 },\n { x: 0.359375, y: 0.953125 },\n { x: 0.390625, y: 0.953125 },\n { x: 0.390625, y: 0.953125 },\n { x: 0.421875, y: 0.953125 },\n { x: 0.421875, y: 0.953125 },\n { x: 0.453125, y: 0.953125 },\n { x: 0.453125, y: 0.953125 },\n { x: 0.484375, y: 0.953125 },\n { x: 0.484375, y: 0.953125 },\n { x: 0.515625, y: 0.953125 },\n { x: 0.515625, y: 0.953125 },\n { x: 0.546875, y: 0.953125 },\n { x: 0.546875, y: 0.953125 },\n { x: 0.578125, y: 0.953125 },\n { x: 0.578125, y: 0.953125 },\n { x: 0.609375, y: 0.953125 },\n { x: 0.609375, y: 0.953125 },\n { x: 0.640625, y: 0.953125 },\n { x: 0.640625, y: 0.953125 },\n { x: 0.671875, y: 0.953125 },\n { x: 0.671875, y: 0.953125 },\n { x: 0.703125, y: 0.953125 },\n { x: 0.703125, y: 0.953125 },\n { x: 0.734375, y: 0.953125 },\n { x: 0.734375, y: 0.953125 },\n { x: 0.765625, y: 0.953125 },\n { x: 0.765625, y: 0.953125 },\n { x: 0.796875, y: 0.953125 },\n { x: 0.796875, y: 0.953125 },\n { x: 0.828125, y: 0.953125 },\n { x: 0.828125, y: 0.953125 },\n { x: 0.859375, y: 0.953125 },\n { x: 0.859375, y: 0.953125 },\n { x: 0.890625, y: 0.953125 },\n { x: 0.890625, y: 0.953125 },\n { x: 0.921875, y: 0.953125 },\n { x: 0.921875, y: 0.953125 },\n { x: 0.953125, y: 0.953125 },\n { x: 0.953125, y: 0.953125 },\n { x: 0.984375, y: 0.953125 },\n { x: 0.984375, y: 0.953125 },\n { x: 0.015625, y: 0.984375 },\n { x: 0.015625, y: 0.984375 },\n { x: 0.046875, y: 0.984375 },\n { x: 0.046875, y: 0.984375 },\n { x: 0.078125, y: 0.984375 },\n { x: 0.078125, y: 0.984375 },\n { x: 0.109375, y: 0.984375 },\n { x: 0.109375, y: 0.984375 },\n { x: 0.140625, y: 0.984375 },\n { x: 0.140625, y: 0.984375 },\n { x: 0.171875, y: 0.984375 },\n { x: 0.171875, y: 0.984375 },\n { x: 0.203125, y: 0.984375 },\n { x: 0.203125, y: 0.984375 },\n { x: 0.234375, y: 0.984375 },\n { x: 0.234375, y: 0.984375 },\n { x: 0.265625, y: 0.984375 },\n { x: 0.265625, y: 0.984375 },\n { x: 0.296875, y: 0.984375 },\n { x: 0.296875, y: 0.984375 },\n { x: 0.328125, y: 0.984375 },\n { x: 0.328125, y: 0.984375 },\n { x: 0.359375, y: 0.984375 },\n { x: 0.359375, y: 0.984375 },\n { x: 0.390625, y: 0.984375 },\n { x: 0.390625, y: 0.984375 },\n { x: 0.421875, y: 0.984375 },\n { x: 0.421875, y: 0.984375 },\n { x: 0.453125, y: 0.984375 },\n { x: 0.453125, y: 0.984375 },\n { x: 0.484375, y: 0.984375 },\n { x: 0.484375, y: 0.984375 },\n { x: 0.515625, y: 0.984375 },\n { x: 0.515625, y: 0.984375 },\n { x: 0.546875, y: 0.984375 },\n { x: 0.546875, y: 0.984375 },\n { x: 0.578125, y: 0.984375 },\n { x: 0.578125, y: 0.984375 },\n { x: 0.609375, y: 0.984375 },\n { x: 0.609375, y: 0.984375 },\n { x: 0.640625, y: 0.984375 },\n { x: 0.640625, y: 0.984375 },\n { x: 0.671875, y: 0.984375 },\n { x: 0.671875, y: 0.984375 },\n { x: 0.703125, y: 0.984375 },\n { x: 0.703125, y: 0.984375 },\n { x: 0.734375, y: 0.984375 },\n { x: 0.734375, y: 0.984375 },\n { x: 0.765625, y: 0.984375 },\n { x: 0.765625, y: 0.984375 },\n { x: 0.796875, y: 0.984375 },\n { x: 0.796875, y: 0.984375 },\n { x: 0.828125, y: 0.984375 },\n { x: 0.828125, y: 0.984375 },\n { x: 0.859375, y: 0.984375 },\n { x: 0.859375, y: 0.984375 },\n { x: 0.890625, y: 0.984375 },\n { x: 0.890625, y: 0.984375 },\n { x: 0.921875, y: 0.984375 },\n { x: 0.921875, y: 0.984375 },\n { x: 0.953125, y: 0.984375 },\n { x: 0.953125, y: 0.984375 },\n { x: 0.984375, y: 0.984375 },\n { x: 0.984375, y: 0.984375 },\n { x: 0.03125, y: 0.03125 },\n { x: 0.03125, y: 0.03125 },\n { x: 0.09375, y: 0.03125 },\n { x: 0.09375, y: 0.03125 },\n { x: 0.15625, y: 0.03125 },\n { x: 0.15625, y: 0.03125 },\n { x: 0.21875, y: 0.03125 },\n { x: 0.21875, y: 0.03125 },\n { x: 0.28125, y: 0.03125 },\n { x: 0.28125, y: 0.03125 },\n { x: 0.34375, y: 0.03125 },\n { x: 0.34375, y: 0.03125 },\n { x: 0.40625, y: 0.03125 },\n { x: 0.40625, y: 0.03125 },\n { x: 0.46875, y: 0.03125 },\n { x: 0.46875, y: 0.03125 },\n { x: 0.53125, y: 0.03125 },\n { x: 0.53125, y: 0.03125 },\n { x: 0.59375, y: 0.03125 },\n { x: 0.59375, y: 0.03125 },\n { x: 0.65625, y: 0.03125 },\n { x: 0.65625, y: 0.03125 },\n { x: 0.71875, y: 0.03125 },\n { x: 0.71875, y: 0.03125 },\n { x: 0.78125, y: 0.03125 },\n { x: 0.78125, y: 0.03125 },\n { x: 0.84375, y: 0.03125 },\n { x: 0.84375, y: 0.03125 },\n { x: 0.90625, y: 0.03125 },\n { x: 0.90625, y: 0.03125 },\n { x: 0.96875, y: 0.03125 },\n { x: 0.96875, y: 0.03125 },\n { x: 0.03125, y: 0.09375 },\n { x: 0.03125, y: 0.09375 },\n { x: 0.09375, y: 0.09375 },\n { x: 0.09375, y: 0.09375 },\n { x: 0.15625, y: 0.09375 },\n { x: 0.15625, y: 0.09375 },\n { x: 0.21875, y: 0.09375 },\n { x: 0.21875, y: 0.09375 },\n { x: 0.28125, y: 0.09375 },\n { x: 0.28125, y: 0.09375 },\n { x: 0.34375, y: 0.09375 },\n { x: 0.34375, y: 0.09375 },\n { x: 0.40625, y: 0.09375 },\n { x: 0.40625, y: 0.09375 },\n { x: 0.46875, y: 0.09375 },\n { x: 0.46875, y: 0.09375 },\n { x: 0.53125, y: 0.09375 },\n { x: 0.53125, y: 0.09375 },\n { x: 0.59375, y: 0.09375 },\n { x: 0.59375, y: 0.09375 },\n { x: 0.65625, y: 0.09375 },\n { x: 0.65625, y: 0.09375 },\n { x: 0.71875, y: 0.09375 },\n { x: 0.71875, y: 0.09375 },\n { x: 0.78125, y: 0.09375 },\n { x: 0.78125, y: 0.09375 },\n { x: 0.84375, y: 0.09375 },\n { x: 0.84375, y: 0.09375 },\n { x: 0.90625, y: 0.09375 },\n { x: 0.90625, y: 0.09375 },\n { x: 0.96875, y: 0.09375 },\n { x: 0.96875, y: 0.09375 },\n { x: 0.03125, y: 0.15625 },\n { x: 0.03125, y: 0.15625 },\n { x: 0.09375, y: 0.15625 },\n { x: 0.09375, y: 0.15625 },\n { x: 0.15625, y: 0.15625 },\n { x: 0.15625, y: 0.15625 },\n { x: 0.21875, y: 0.15625 },\n { x: 0.21875, y: 0.15625 },\n { x: 0.28125, y: 0.15625 },\n { x: 0.28125, y: 0.15625 },\n { x: 0.34375, y: 0.15625 },\n { x: 0.34375, y: 0.15625 },\n { x: 0.40625, y: 0.15625 },\n { x: 0.40625, y: 0.15625 },\n { x: 0.46875, y: 0.15625 },\n { x: 0.46875, y: 0.15625 },\n { x: 0.53125, y: 0.15625 },\n { x: 0.53125, y: 0.15625 },\n { x: 0.59375, y: 0.15625 },\n { x: 0.59375, y: 0.15625 },\n { x: 0.65625, y: 0.15625 },\n { x: 0.65625, y: 0.15625 },\n { x: 0.71875, y: 0.15625 },\n { x: 0.71875, y: 0.15625 },\n { x: 0.78125, y: 0.15625 },\n { x: 0.78125, y: 0.15625 },\n { x: 0.84375, y: 0.15625 },\n { x: 0.84375, y: 0.15625 },\n { x: 0.90625, y: 0.15625 },\n { x: 0.90625, y: 0.15625 },\n { x: 0.96875, y: 0.15625 },\n { x: 0.96875, y: 0.15625 },\n { x: 0.03125, y: 0.21875 },\n { x: 0.03125, y: 0.21875 },\n { x: 0.09375, y: 0.21875 },\n { x: 0.09375, y: 0.21875 },\n { x: 0.15625, y: 0.21875 },\n { x: 0.15625, y: 0.21875 },\n { x: 0.21875, y: 0.21875 },\n { x: 0.21875, y: 0.21875 },\n { x: 0.28125, y: 0.21875 },\n { x: 0.28125, y: 0.21875 },\n { x: 0.34375, y: 0.21875 },\n { x: 0.34375, y: 0.21875 },\n { x: 0.40625, y: 0.21875 },\n { x: 0.40625, y: 0.21875 },\n { x: 0.46875, y: 0.21875 },\n { x: 0.46875, y: 0.21875 },\n { x: 0.53125, y: 0.21875 },\n { x: 0.53125, y: 0.21875 },\n { x: 0.59375, y: 0.21875 },\n { x: 0.59375, y: 0.21875 },\n { x: 0.65625, y: 0.21875 },\n { x: 0.65625, y: 0.21875 },\n { x: 0.71875, y: 0.21875 },\n { x: 0.71875, y: 0.21875 },\n { x: 0.78125, y: 0.21875 },\n { x: 0.78125, y: 0.21875 },\n { x: 0.84375, y: 0.21875 },\n { x: 0.84375, y: 0.21875 },\n { x: 0.90625, y: 0.21875 },\n { x: 0.90625, y: 0.21875 },\n { x: 0.96875, y: 0.21875 },\n { x: 0.96875, y: 0.21875 },\n { x: 0.03125, y: 0.28125 },\n { x: 0.03125, y: 0.28125 },\n { x: 0.09375, y: 0.28125 },\n { x: 0.09375, y: 0.28125 },\n { x: 0.15625, y: 0.28125 },\n { x: 0.15625, y: 0.28125 },\n { x: 0.21875, y: 0.28125 },\n { x: 0.21875, y: 0.28125 },\n { x: 0.28125, y: 0.28125 },\n { x: 0.28125, y: 0.28125 },\n { x: 0.34375, y: 0.28125 },\n { x: 0.34375, y: 0.28125 },\n { x: 0.40625, y: 0.28125 },\n { x: 0.40625, y: 0.28125 },\n { x: 0.46875, y: 0.28125 },\n { x: 0.46875, y: 0.28125 },\n { x: 0.53125, y: 0.28125 },\n { x: 0.53125, y: 0.28125 },\n { x: 0.59375, y: 0.28125 },\n { x: 0.59375, y: 0.28125 },\n { x: 0.65625, y: 0.28125 },\n { x: 0.65625, y: 0.28125 },\n { x: 0.71875, y: 0.28125 },\n { x: 0.71875, y: 0.28125 },\n { x: 0.78125, y: 0.28125 },\n { x: 0.78125, y: 0.28125 },\n { x: 0.84375, y: 0.28125 },\n { x: 0.84375, y: 0.28125 },\n { x: 0.90625, y: 0.28125 },\n { x: 0.90625, y: 0.28125 },\n { x: 0.96875, y: 0.28125 },\n { x: 0.96875, y: 0.28125 },\n { x: 0.03125, y: 0.34375 },\n { x: 0.03125, y: 0.34375 },\n { x: 0.09375, y: 0.34375 },\n { x: 0.09375, y: 0.34375 },\n { x: 0.15625, y: 0.34375 },\n { x: 0.15625, y: 0.34375 },\n { x: 0.21875, y: 0.34375 },\n { x: 0.21875, y: 0.34375 },\n { x: 0.28125, y: 0.34375 },\n { x: 0.28125, y: 0.34375 },\n { x: 0.34375, y: 0.34375 },\n { x: 0.34375, y: 0.34375 },\n { x: 0.40625, y: 0.34375 },\n { x: 0.40625, y: 0.34375 },\n { x: 0.46875, y: 0.34375 },\n { x: 0.46875, y: 0.34375 },\n { x: 0.53125, y: 0.34375 },\n { x: 0.53125, y: 0.34375 },\n { x: 0.59375, y: 0.34375 },\n { x: 0.59375, y: 0.34375 },\n { x: 0.65625, y: 0.34375 },\n { x: 0.65625, y: 0.34375 },\n { x: 0.71875, y: 0.34375 },\n { x: 0.71875, y: 0.34375 },\n { x: 0.78125, y: 0.34375 },\n { x: 0.78125, y: 0.34375 },\n { x: 0.84375, y: 0.34375 },\n { x: 0.84375, y: 0.34375 },\n { x: 0.90625, y: 0.34375 },\n { x: 0.90625, y: 0.34375 },\n { x: 0.96875, y: 0.34375 },\n { x: 0.96875, y: 0.34375 },\n { x: 0.03125, y: 0.40625 },\n { x: 0.03125, y: 0.40625 },\n { x: 0.09375, y: 0.40625 },\n { x: 0.09375, y: 0.40625 },\n { x: 0.15625, y: 0.40625 },\n { x: 0.15625, y: 0.40625 },\n { x: 0.21875, y: 0.40625 },\n { x: 0.21875, y: 0.40625 },\n { x: 0.28125, y: 0.40625 },\n { x: 0.28125, y: 0.40625 },\n { x: 0.34375, y: 0.40625 },\n { x: 0.34375, y: 0.40625 },\n { x: 0.40625, y: 0.40625 },\n { x: 0.40625, y: 0.40625 },\n { x: 0.46875, y: 0.40625 },\n { x: 0.46875, y: 0.40625 },\n { x: 0.53125, y: 0.40625 },\n { x: 0.53125, y: 0.40625 },\n { x: 0.59375, y: 0.40625 },\n { x: 0.59375, y: 0.40625 },\n { x: 0.65625, y: 0.40625 },\n { x: 0.65625, y: 0.40625 },\n { x: 0.71875, y: 0.40625 },\n { x: 0.71875, y: 0.40625 },\n { x: 0.78125, y: 0.40625 },\n { x: 0.78125, y: 0.40625 },\n { x: 0.84375, y: 0.40625 },\n { x: 0.84375, y: 0.40625 },\n { x: 0.90625, y: 0.40625 },\n { x: 0.90625, y: 0.40625 },\n { x: 0.96875, y: 0.40625 },\n { x: 0.96875, y: 0.40625 },\n { x: 0.03125, y: 0.46875 },\n { x: 0.03125, y: 0.46875 },\n { x: 0.09375, y: 0.46875 },\n { x: 0.09375, y: 0.46875 },\n { x: 0.15625, y: 0.46875 },\n { x: 0.15625, y: 0.46875 },\n { x: 0.21875, y: 0.46875 },\n { x: 0.21875, y: 0.46875 },\n { x: 0.28125, y: 0.46875 },\n { x: 0.28125, y: 0.46875 },\n { x: 0.34375, y: 0.46875 },\n { x: 0.34375, y: 0.46875 },\n { x: 0.40625, y: 0.46875 },\n { x: 0.40625, y: 0.46875 },\n { x: 0.46875, y: 0.46875 },\n { x: 0.46875, y: 0.46875 },\n { x: 0.53125, y: 0.46875 },\n { x: 0.53125, y: 0.46875 },\n { x: 0.59375, y: 0.46875 },\n { x: 0.59375, y: 0.46875 },\n { x: 0.65625, y: 0.46875 },\n { x: 0.65625, y: 0.46875 },\n { x: 0.71875, y: 0.46875 },\n { x: 0.71875, y: 0.46875 },\n { x: 0.78125, y: 0.46875 },\n { x: 0.78125, y: 0.46875 },\n { x: 0.84375, y: 0.46875 },\n { x: 0.84375, y: 0.46875 },\n { x: 0.90625, y: 0.46875 },\n { x: 0.90625, y: 0.46875 },\n { x: 0.96875, y: 0.46875 },\n { x: 0.96875, y: 0.46875 },\n { x: 0.03125, y: 0.53125 },\n { x: 0.03125, y: 0.53125 },\n { x: 0.09375, y: 0.53125 },\n { x: 0.09375, y: 0.53125 },\n { x: 0.15625, y: 0.53125 },\n { x: 0.15625, y: 0.53125 },\n { x: 0.21875, y: 0.53125 },\n { x: 0.21875, y: 0.53125 },\n { x: 0.28125, y: 0.53125 },\n { x: 0.28125, y: 0.53125 },\n { x: 0.34375, y: 0.53125 },\n { x: 0.34375, y: 0.53125 },\n { x: 0.40625, y: 0.53125 },\n { x: 0.40625, y: 0.53125 },\n { x: 0.46875, y: 0.53125 },\n { x: 0.46875, y: 0.53125 },\n { x: 0.53125, y: 0.53125 },\n { x: 0.53125, y: 0.53125 },\n { x: 0.59375, y: 0.53125 },\n { x: 0.59375, y: 0.53125 },\n { x: 0.65625, y: 0.53125 },\n { x: 0.65625, y: 0.53125 },\n { x: 0.71875, y: 0.53125 },\n { x: 0.71875, y: 0.53125 },\n { x: 0.78125, y: 0.53125 },\n { x: 0.78125, y: 0.53125 },\n { x: 0.84375, y: 0.53125 },\n { x: 0.84375, y: 0.53125 },\n { x: 0.90625, y: 0.53125 },\n { x: 0.90625, y: 0.53125 },\n { x: 0.96875, y: 0.53125 },\n { x: 0.96875, y: 0.53125 },\n { x: 0.03125, y: 0.59375 },\n { x: 0.03125, y: 0.59375 },\n { x: 0.09375, y: 0.59375 },\n { x: 0.09375, y: 0.59375 },\n { x: 0.15625, y: 0.59375 },\n { x: 0.15625, y: 0.59375 },\n { x: 0.21875, y: 0.59375 },\n { x: 0.21875, y: 0.59375 },\n { x: 0.28125, y: 0.59375 },\n { x: 0.28125, y: 0.59375 },\n { x: 0.34375, y: 0.59375 },\n { x: 0.34375, y: 0.59375 },\n { x: 0.40625, y: 0.59375 },\n { x: 0.40625, y: 0.59375 },\n { x: 0.46875, y: 0.59375 },\n { x: 0.46875, y: 0.59375 },\n { x: 0.53125, y: 0.59375 },\n { x: 0.53125, y: 0.59375 },\n { x: 0.59375, y: 0.59375 },\n { x: 0.59375, y: 0.59375 },\n { x: 0.65625, y: 0.59375 },\n { x: 0.65625, y: 0.59375 },\n { x: 0.71875, y: 0.59375 },\n { x: 0.71875, y: 0.59375 },\n { x: 0.78125, y: 0.59375 },\n { x: 0.78125, y: 0.59375 },\n { x: 0.84375, y: 0.59375 },\n { x: 0.84375, y: 0.59375 },\n { x: 0.90625, y: 0.59375 },\n { x: 0.90625, y: 0.59375 },\n { x: 0.96875, y: 0.59375 },\n { x: 0.96875, y: 0.59375 },\n { x: 0.03125, y: 0.65625 },\n { x: 0.03125, y: 0.65625 },\n { x: 0.09375, y: 0.65625 },\n { x: 0.09375, y: 0.65625 },\n { x: 0.15625, y: 0.65625 },\n { x: 0.15625, y: 0.65625 },\n { x: 0.21875, y: 0.65625 },\n { x: 0.21875, y: 0.65625 },\n { x: 0.28125, y: 0.65625 },\n { x: 0.28125, y: 0.65625 },\n { x: 0.34375, y: 0.65625 },\n { x: 0.34375, y: 0.65625 },\n { x: 0.40625, y: 0.65625 },\n { x: 0.40625, y: 0.65625 },\n { x: 0.46875, y: 0.65625 },\n { x: 0.46875, y: 0.65625 },\n { x: 0.53125, y: 0.65625 },\n { x: 0.53125, y: 0.65625 },\n { x: 0.59375, y: 0.65625 },\n { x: 0.59375, y: 0.65625 },\n { x: 0.65625, y: 0.65625 },\n { x: 0.65625, y: 0.65625 },\n { x: 0.71875, y: 0.65625 },\n { x: 0.71875, y: 0.65625 },\n { x: 0.78125, y: 0.65625 },\n { x: 0.78125, y: 0.65625 },\n { x: 0.84375, y: 0.65625 },\n { x: 0.84375, y: 0.65625 },\n { x: 0.90625, y: 0.65625 },\n { x: 0.90625, y: 0.65625 },\n { x: 0.96875, y: 0.65625 },\n { x: 0.96875, y: 0.65625 },\n { x: 0.03125, y: 0.71875 },\n { x: 0.03125, y: 0.71875 },\n { x: 0.09375, y: 0.71875 },\n { x: 0.09375, y: 0.71875 },\n { x: 0.15625, y: 0.71875 },\n { x: 0.15625, y: 0.71875 },\n { x: 0.21875, y: 0.71875 },\n { x: 0.21875, y: 0.71875 },\n { x: 0.28125, y: 0.71875 },\n { x: 0.28125, y: 0.71875 },\n { x: 0.34375, y: 0.71875 },\n { x: 0.34375, y: 0.71875 },\n { x: 0.40625, y: 0.71875 },\n { x: 0.40625, y: 0.71875 },\n { x: 0.46875, y: 0.71875 },\n { x: 0.46875, y: 0.71875 },\n { x: 0.53125, y: 0.71875 },\n { x: 0.53125, y: 0.71875 },\n { x: 0.59375, y: 0.71875 },\n { x: 0.59375, y: 0.71875 },\n { x: 0.65625, y: 0.71875 },\n { x: 0.65625, y: 0.71875 },\n { x: 0.71875, y: 0.71875 },\n { x: 0.71875, y: 0.71875 },\n { x: 0.78125, y: 0.71875 },\n { x: 0.78125, y: 0.71875 },\n { x: 0.84375, y: 0.71875 },\n { x: 0.84375, y: 0.71875 },\n { x: 0.90625, y: 0.71875 },\n { x: 0.90625, y: 0.71875 },\n { x: 0.96875, y: 0.71875 },\n { x: 0.96875, y: 0.71875 },\n { x: 0.03125, y: 0.78125 },\n { x: 0.03125, y: 0.78125 },\n { x: 0.09375, y: 0.78125 },\n { x: 0.09375, y: 0.78125 },\n { x: 0.15625, y: 0.78125 },\n { x: 0.15625, y: 0.78125 },\n { x: 0.21875, y: 0.78125 },\n { x: 0.21875, y: 0.78125 },\n { x: 0.28125, y: 0.78125 },\n { x: 0.28125, y: 0.78125 },\n { x: 0.34375, y: 0.78125 },\n { x: 0.34375, y: 0.78125 },\n { x: 0.40625, y: 0.78125 },\n { x: 0.40625, y: 0.78125 },\n { x: 0.46875, y: 0.78125 },\n { x: 0.46875, y: 0.78125 },\n { x: 0.53125, y: 0.78125 },\n { x: 0.53125, y: 0.78125 },\n { x: 0.59375, y: 0.78125 },\n { x: 0.59375, y: 0.78125 },\n { x: 0.65625, y: 0.78125 },\n { x: 0.65625, y: 0.78125 },\n { x: 0.71875, y: 0.78125 },\n { x: 0.71875, y: 0.78125 },\n { x: 0.78125, y: 0.78125 },\n { x: 0.78125, y: 0.78125 },\n { x: 0.84375, y: 0.78125 },\n { x: 0.84375, y: 0.78125 },\n { x: 0.90625, y: 0.78125 },\n { x: 0.90625, y: 0.78125 },\n { x: 0.96875, y: 0.78125 },\n { x: 0.96875, y: 0.78125 },\n { x: 0.03125, y: 0.84375 },\n { x: 0.03125, y: 0.84375 },\n { x: 0.09375, y: 0.84375 },\n { x: 0.09375, y: 0.84375 },\n { x: 0.15625, y: 0.84375 },\n { x: 0.15625, y: 0.84375 },\n { x: 0.21875, y: 0.84375 },\n { x: 0.21875, y: 0.84375 },\n { x: 0.28125, y: 0.84375 },\n { x: 0.28125, y: 0.84375 },\n { x: 0.34375, y: 0.84375 },\n { x: 0.34375, y: 0.84375 },\n { x: 0.40625, y: 0.84375 },\n { x: 0.40625, y: 0.84375 },\n { x: 0.46875, y: 0.84375 },\n { x: 0.46875, y: 0.84375 },\n { x: 0.53125, y: 0.84375 },\n { x: 0.53125, y: 0.84375 },\n { x: 0.59375, y: 0.84375 },\n { x: 0.59375, y: 0.84375 },\n { x: 0.65625, y: 0.84375 },\n { x: 0.65625, y: 0.84375 },\n { x: 0.71875, y: 0.84375 },\n { x: 0.71875, y: 0.84375 },\n { x: 0.78125, y: 0.84375 },\n { x: 0.78125, y: 0.84375 },\n { x: 0.84375, y: 0.84375 },\n { x: 0.84375, y: 0.84375 },\n { x: 0.90625, y: 0.84375 },\n { x: 0.90625, y: 0.84375 },\n { x: 0.96875, y: 0.84375 },\n { x: 0.96875, y: 0.84375 },\n { x: 0.03125, y: 0.90625 },\n { x: 0.03125, y: 0.90625 },\n { x: 0.09375, y: 0.90625 },\n { x: 0.09375, y: 0.90625 },\n { x: 0.15625, y: 0.90625 },\n { x: 0.15625, y: 0.90625 },\n { x: 0.21875, y: 0.90625 },\n { x: 0.21875, y: 0.90625 },\n { x: 0.28125, y: 0.90625 },\n { x: 0.28125, y: 0.90625 },\n { x: 0.34375, y: 0.90625 },\n { x: 0.34375, y: 0.90625 },\n { x: 0.40625, y: 0.90625 },\n { x: 0.40625, y: 0.90625 },\n { x: 0.46875, y: 0.90625 },\n { x: 0.46875, y: 0.90625 },\n { x: 0.53125, y: 0.90625 },\n { x: 0.53125, y: 0.90625 },\n { x: 0.59375, y: 0.90625 },\n { x: 0.59375, y: 0.90625 },\n { x: 0.65625, y: 0.90625 },\n { x: 0.65625, y: 0.90625 },\n { x: 0.71875, y: 0.90625 },\n { x: 0.71875, y: 0.90625 },\n { x: 0.78125, y: 0.90625 },\n { x: 0.78125, y: 0.90625 },\n { x: 0.84375, y: 0.90625 },\n { x: 0.84375, y: 0.90625 },\n { x: 0.90625, y: 0.90625 },\n { x: 0.90625, y: 0.90625 },\n { x: 0.96875, y: 0.90625 },\n { x: 0.96875, y: 0.90625 },\n { x: 0.03125, y: 0.96875 },\n { x: 0.03125, y: 0.96875 },\n { x: 0.09375, y: 0.96875 },\n { x: 0.09375, y: 0.96875 },\n { x: 0.15625, y: 0.96875 },\n { x: 0.15625, y: 0.96875 },\n { x: 0.21875, y: 0.96875 },\n { x: 0.21875, y: 0.96875 },\n { x: 0.28125, y: 0.96875 },\n { x: 0.28125, y: 0.96875 },\n { x: 0.34375, y: 0.96875 },\n { x: 0.34375, y: 0.96875 },\n { x: 0.40625, y: 0.96875 },\n { x: 0.40625, y: 0.96875 },\n { x: 0.46875, y: 0.96875 },\n { x: 0.46875, y: 0.96875 },\n { x: 0.53125, y: 0.96875 },\n { x: 0.53125, y: 0.96875 },\n { x: 0.59375, y: 0.96875 },\n { x: 0.59375, y: 0.96875 },\n { x: 0.65625, y: 0.96875 },\n { x: 0.65625, y: 0.96875 },\n { x: 0.71875, y: 0.96875 },\n { x: 0.71875, y: 0.96875 },\n { x: 0.78125, y: 0.96875 },\n { x: 0.78125, y: 0.96875 },\n { x: 0.84375, y: 0.96875 },\n { x: 0.84375, y: 0.96875 },\n { x: 0.90625, y: 0.96875 },\n { x: 0.90625, y: 0.96875 },\n { x: 0.96875, y: 0.96875 },\n { x: 0.96875, y: 0.96875 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n];\n", "/**\n * HandPose model implementation\n * See `handpose.ts` for entry point\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as util from './handposeutil';\nimport * as anchors from './handposeanchors';\nimport { constants } from '../tfjs/constants';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport type { Point } from '../result';\n\nexport class HandDetector {\n model: GraphModel;\n anchors: number[][];\n anchorsTensor: Tensor;\n inputSize: number;\n inputSizeTensor: Tensor;\n doubleInputSizeTensor: Tensor;\n\n constructor(model) {\n this.model = model;\n this.anchors = anchors.anchors.map((anchor) => [anchor.x, anchor.y]);\n this.anchorsTensor = tf.tensor2d(this.anchors);\n this.inputSize = (this.model && this.model.inputs && this.model.inputs[0].shape) ? this.model.inputs[0].shape[2] : 0;\n this.inputSizeTensor = tf.tensor1d([this.inputSize, this.inputSize]);\n this.doubleInputSizeTensor = tf.tensor1d([this.inputSize * 2, this.inputSize * 2]);\n }\n\n normalizeBoxes(boxes) {\n const t: Record = {};\n t.boxOffsets = tf.slice(boxes, [0, 0], [-1, 2]);\n t.boxSizes = tf.slice(boxes, [0, 2], [-1, 2]);\n t.div = tf.div(t.boxOffsets, this.inputSizeTensor);\n t.boxCenterPoints = tf.add(t.div, this.anchorsTensor);\n t.halfBoxSizes = tf.div(t.boxSizes, this.doubleInputSizeTensor);\n t.sub = tf.sub(t.boxCenterPoints, t.halfBoxSizes);\n t.startPoints = tf.mul(t.sub, this.inputSizeTensor);\n t.add = tf.add(t.boxCenterPoints, t.halfBoxSizes);\n t.endPoints = tf.mul(t.add, this.inputSizeTensor);\n const res = tf.concat2d([t.startPoints, t.endPoints], 1);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return res;\n }\n\n normalizeLandmarks(rawPalmLandmarks, index) {\n const t: Record = {};\n t.reshape = tf.reshape(rawPalmLandmarks, [-1, 7, 2]);\n t.div = tf.div(t.reshape, this.inputSizeTensor);\n t.landmarks = tf.add(t.div, this.anchors[index]);\n const res = tf.mul(t.landmarks, this.inputSizeTensor);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return res;\n }\n\n async predict(input, config): Promise<{ startPoint: Point; endPoint: Point, palmLandmarks: Point[]; confidence: number }[]> {\n const t: Record = {};\n t.resize = tf.image.resizeBilinear(input, [this.inputSize, this.inputSize]);\n t.div = tf.div(t.resize, constants.tf127);\n t.image = tf.sub(t.div, constants.tf1);\n t.batched = this.model.execute(t.image) as Tensor;\n t.predictions = tf.squeeze(t.batched);\n t.slice = tf.slice(t.predictions, [0, 0], [-1, 1]);\n t.sigmoid = tf.sigmoid(t.slice);\n t.scores = tf.squeeze(t.sigmoid);\n const scores = await t.scores.data();\n t.boxes = tf.slice(t.predictions, [0, 1], [-1, 4]);\n t.norm = this.normalizeBoxes(t.boxes);\n // box detection is flaky so we look for 3x boxes than we need results\n t.nms = await tf.image.nonMaxSuppressionAsync(t.norm, t.scores, 3 * config.hand.maxDetected, config.hand.iouThreshold, config.hand.minConfidence);\n const nms = await t.nms.array() as Array;\n const hands: Array<{ startPoint: Point; endPoint: Point; palmLandmarks: Point[]; confidence: number }> = [];\n for (const index of nms) {\n const p: Record = {};\n p.box = tf.slice(t.norm, [index, 0], [1, -1]);\n p.slice = tf.slice(t.predictions, [index, 5], [1, 14]);\n p.norm = this.normalizeLandmarks(p.slice, index);\n p.palmLandmarks = tf.reshape(p.norm, [-1, 2]);\n const box = await p.box.data();\n const startPoint = box.slice(0, 2) as unknown as Point;\n const endPoint = box.slice(2, 4) as unknown as Point;\n const palmLandmarks = await p.palmLandmarks.array();\n const hand = { startPoint, endPoint, palmLandmarks, confidence: scores[index] };\n const scaled = util.scaleBoxCoordinates(hand, [input.shape[2] / this.inputSize, input.shape[1] / this.inputSize]);\n hands.push(scaled);\n Object.keys(p).forEach((tensor) => tf.dispose(p[tensor]));\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return hands;\n }\n}\n", "/**\n * HandPose model implementation\n * See `handpose.ts` for entry point\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as util from './handposeutil';\nimport type * as detector from './handposedetector';\nimport { constants } from '../tfjs/constants';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport { env } from '../util/env';\nimport { now } from '../util/util';\nimport type { Point } from '../result';\n\nconst palmBoxEnlargeFactor = 5; // default 3\nconst handBoxEnlargeFactor = 1.65; // default 1.65\nconst palmLandmarkIds = [0, 5, 9, 13, 17, 1, 2];\nconst palmLandmarksPalmBase = 0;\nconst palmLandmarksMiddleFingerBase = 2;\nlet lastTime = 0;\n\nexport class HandPipeline {\n handDetector: detector.HandDetector;\n handPoseModel: GraphModel;\n inputSize: number;\n storedBoxes: Array<{ startPoint: Point; endPoint: Point; palmLandmarks: Point[]; confidence: number } | null>;\n skipped: number;\n detectedHands: number;\n\n constructor(handDetector, handPoseModel) {\n this.handDetector = handDetector;\n this.handPoseModel = handPoseModel;\n this.inputSize = this.handPoseModel && this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0;\n this.storedBoxes = [];\n this.skipped = Number.MAX_SAFE_INTEGER;\n this.detectedHands = 0;\n }\n\n // eslint-disable-next-line class-methods-use-this\n calculateLandmarksBoundingBox(landmarks) {\n const xs = landmarks.map((d) => d[0]);\n const ys = landmarks.map((d) => d[1]);\n const startPoint = [Math.min(...xs), Math.min(...ys)];\n const endPoint = [Math.max(...xs), Math.max(...ys)];\n return { startPoint, endPoint };\n }\n\n getBoxForPalmLandmarks(palmLandmarks, rotationMatrix) {\n const rotatedPalmLandmarks = palmLandmarks.map((coord) => util.rotatePoint([...coord, 1], rotationMatrix));\n const boxAroundPalm = this.calculateLandmarksBoundingBox(rotatedPalmLandmarks);\n return util.enlargeBox(util.squarifyBox(boxAroundPalm), palmBoxEnlargeFactor);\n }\n\n getBoxForHandLandmarks(landmarks) {\n const boundingBox = this.calculateLandmarksBoundingBox(landmarks);\n const boxAroundHand = util.enlargeBox(util.squarifyBox(boundingBox), handBoxEnlargeFactor);\n boxAroundHand.palmLandmarks = [];\n for (let i = 0; i < palmLandmarkIds.length; i++) {\n boxAroundHand.palmLandmarks.push(landmarks[palmLandmarkIds[i]].slice(0, 2));\n }\n return boxAroundHand;\n }\n\n transformRawCoords(rawCoords, box2, angle, rotationMatrix) {\n const boxSize = util.getBoxSize(box2);\n const scaleFactor = [boxSize[0] / this.inputSize, boxSize[1] / this.inputSize, (boxSize[0] + boxSize[1]) / this.inputSize / 2];\n const coordsScaled = rawCoords.map((coord) => [\n scaleFactor[0] * (coord[0] - this.inputSize / 2),\n scaleFactor[1] * (coord[1] - this.inputSize / 2),\n scaleFactor[2] * coord[2],\n ]);\n const coordsRotationMatrix = util.buildRotationMatrix(angle, [0, 0]);\n const coordsRotated = coordsScaled.map((coord) => {\n const rotated = util.rotatePoint(coord, coordsRotationMatrix);\n return [...rotated, coord[2]];\n });\n const inverseRotationMatrix = util.invertTransformMatrix(rotationMatrix);\n const boxCenter = [...util.getBoxCenter(box2), 1];\n const originalBoxCenter = [\n util.dot(boxCenter, inverseRotationMatrix[0]),\n util.dot(boxCenter, inverseRotationMatrix[1]),\n ];\n return coordsRotated.map((coord) => [\n Math.trunc(coord[0] + originalBoxCenter[0]),\n Math.trunc(coord[1] + originalBoxCenter[1]),\n Math.trunc(coord[2]),\n ]);\n }\n\n async estimateHands(image, config) {\n let useFreshBox = false;\n\n // run new detector every skipFrames\n let boxes;\n const skipTime = (config.hand.skipTime || 0) > (now() - lastTime);\n const skipFrame = this.skipped < (config.hand.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame) {\n boxes = await this.handDetector.predict(image, config);\n this.skipped = 0;\n }\n if (config.skipAllowed) this.skipped++;\n\n // if detector result count doesn't match current working set, use it to reset current working set\n if (boxes && (boxes.length > 0) && ((boxes.length !== this.detectedHands) && (this.detectedHands !== config.hand.maxDetected) || !config.hand.landmarks)) {\n this.detectedHands = 0;\n this.storedBoxes = [...boxes];\n // for (const possible of boxes) this.storedBoxes.push(possible);\n if (this.storedBoxes.length > 0) useFreshBox = true;\n }\n const hands: Array<{ landmarks: Point[], confidence: number, boxConfidence: number, fingerConfidence: number, box: { topLeft: Point, bottomRight: Point } }> = [];\n\n // go through working set of boxes\n for (let i = 0; i < this.storedBoxes.length; i++) {\n const currentBox = this.storedBoxes[i];\n if (!currentBox) continue;\n if (config.hand.landmarks) {\n const angle = config.hand.rotation ? util.computeRotation(currentBox.palmLandmarks[palmLandmarksPalmBase], currentBox.palmLandmarks[palmLandmarksMiddleFingerBase]) : 0;\n const palmCenter = util.getBoxCenter(currentBox);\n const palmCenterNormalized = [palmCenter[0] / image.shape[2], palmCenter[1] / image.shape[1]];\n const rotatedImage = config.hand.rotation && env.kernels.includes('rotatewithoffset') ? tf.image.rotateWithOffset(image, angle, 0, palmCenterNormalized) : image.clone();\n const rotationMatrix = util.buildRotationMatrix(-angle, palmCenter);\n const newBox = useFreshBox ? this.getBoxForPalmLandmarks(currentBox.palmLandmarks, rotationMatrix) : currentBox;\n const croppedInput = util.cutBoxFromImageAndResize(newBox, rotatedImage, [this.inputSize, this.inputSize]);\n const handImage = tf.div(croppedInput, constants.tf255);\n tf.dispose(croppedInput);\n tf.dispose(rotatedImage);\n const [confidenceT, keypoints] = this.handPoseModel.execute(handImage) as Array;\n lastTime = now();\n tf.dispose(handImage);\n const confidence = (await confidenceT.data())[0];\n tf.dispose(confidenceT);\n if (confidence >= config.hand.minConfidence / 4) {\n const keypointsReshaped = tf.reshape(keypoints, [-1, 3]);\n const rawCoords = await keypointsReshaped.array();\n tf.dispose(keypoints);\n tf.dispose(keypointsReshaped);\n const coords = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix);\n const nextBoundingBox = this.getBoxForHandLandmarks(coords);\n this.storedBoxes[i] = { ...nextBoundingBox, confidence };\n const result = {\n landmarks: coords,\n confidence,\n boxConfidence: currentBox.confidence,\n fingerConfidence: confidence,\n box: { topLeft: nextBoundingBox.startPoint, bottomRight: nextBoundingBox.endPoint },\n };\n hands.push(result);\n } else {\n this.storedBoxes[i] = null;\n }\n tf.dispose(keypoints);\n } else {\n // const enlarged = box.enlargeBox(box.squarifyBox(box.shiftBox(currentBox, HAND_BOX_SHIFT_VECTOR)), handBoxEnlargeFactor);\n const enlarged = util.enlargeBox(util.squarifyBox(currentBox), handBoxEnlargeFactor);\n const result = {\n confidence: currentBox.confidence,\n boxConfidence: currentBox.confidence,\n fingerConfidence: 0,\n box: { topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint },\n landmarks: [],\n };\n hands.push(result);\n }\n }\n this.storedBoxes = this.storedBoxes.filter((a) => a !== null);\n this.detectedHands = hands.length;\n if (hands.length > config.hand.maxDetected) hands.length = config.hand.maxDetected;\n return hands;\n }\n}\n", "/**\n * FingerPose algorithm implementation\n * See `fingerpose.ts` for entry point\n */\n\nexport const Finger = {\n thumb: 0,\n index: 1,\n middle: 2,\n ring: 3,\n pinky: 4,\n all: [0, 1, 2, 3, 4], // just for convenience\n nameMapping: { 0: 'thumb', 1: 'index', 2: 'middle', 3: 'ring', 4: 'pinky' },\n // Describes mapping of joints based on the 21 points returned by handpose.\n // [0] Palm\n // [1-4] Thumb\n // [5-8] Index\n // [9-12] Middle\n // [13-16] Ring\n // [17-20] Pinky\n pointsMapping: {\n 0: [[0, 1], [1, 2], [2, 3], [3, 4]],\n 1: [[0, 5], [5, 6], [6, 7], [7, 8]],\n 2: [[0, 9], [9, 10], [10, 11], [11, 12]],\n 3: [[0, 13], [13, 14], [14, 15], [15, 16]],\n 4: [[0, 17], [17, 18], [18, 19], [19, 20]],\n },\n getName: (value) => Finger.nameMapping[value],\n getPoints: (value) => Finger.pointsMapping[value],\n};\n\nexport const FingerCurl = {\n none: 0,\n half: 1,\n full: 2,\n nameMapping: { 0: 'none', 1: 'half', 2: 'full' },\n getName: (value) => FingerCurl.nameMapping[value],\n};\n\nexport const FingerDirection = {\n verticalUp: 0,\n verticalDown: 1,\n horizontalLeft: 2,\n horizontalRight: 3,\n diagonalUpRight: 4,\n diagonalUpLeft: 5,\n diagonalDownRight: 6,\n diagonalDownLeft: 7,\n nameMapping: { 0: 'verticalUp', 1: 'verticalDown', 2: 'horizontalLeft', 3: 'horizontalRight', 4: 'diagonalUpRight', 5: 'diagonalUpLeft', 6: 'diagonalDownRight', 7: 'diagonalDownLeft' },\n getName: (value) => FingerDirection.nameMapping[value],\n};\n\nexport class FingerGesture {\n name;\n curls;\n directions;\n weights;\n weightsRelative;\n\n constructor(name) {\n // name (should be unique)\n this.name = name;\n this.curls = {};\n this.directions = {};\n this.weights = [1.0, 1.0, 1.0, 1.0, 1.0];\n this.weightsRelative = [1.0, 1.0, 1.0, 1.0, 1.0];\n }\n\n curl(finger, curl, confidence) {\n if (typeof this.curls[finger] === 'undefined') this.curls[finger] = [];\n this.curls[finger].push([curl, confidence]);\n }\n\n direction(finger, position, confidence) {\n if (!this.directions[finger]) this.directions[finger] = [];\n this.directions[finger].push([position, confidence]);\n }\n\n weight(finger, weight) {\n this.weights[finger] = weight;\n // recalculate relative weights\n const total = this.weights.reduce((a, b) => a + b, 0);\n this.weightsRelative = this.weights.map((el) => el * 5 / total);\n }\n\n matchAgainst(detectedCurls, detectedDirections) {\n let confidence = 0.0;\n // look at the detected curl of each finger and compare with\n // the expected curl of this finger inside current gesture\n for (const fingerIdx in detectedCurls) {\n const detectedCurl = detectedCurls[fingerIdx];\n const expectedCurls = this.curls[fingerIdx];\n if (typeof expectedCurls === 'undefined') {\n // no curl description available for this finger\n // add default confidence of \"1\"\n confidence += this.weightsRelative[fingerIdx];\n continue;\n }\n // compare to each possible curl of this specific finger\n for (const [expectedCurl, score] of expectedCurls) {\n if (detectedCurl === expectedCurl) {\n confidence += score * this.weightsRelative[fingerIdx];\n break;\n }\n }\n }\n // same for detected direction of each finger\n for (const fingerIdx in detectedDirections) {\n const detectedDirection = detectedDirections[fingerIdx];\n const expectedDirections = this.directions[fingerIdx];\n if (typeof expectedDirections === 'undefined') {\n // no direction description available for this finger\n // add default confidence of \"1\"\n confidence += this.weightsRelative[fingerIdx];\n continue;\n }\n // compare to each possible direction of this specific finger\n for (const [expectedDirection, score] of expectedDirections) {\n if (detectedDirection === expectedDirection) {\n confidence += score * this.weightsRelative[fingerIdx];\n break;\n }\n }\n }\n return confidence / 10;\n }\n}\n", "/**\n * FingerPose algorithm implementation\n * See `fingerpose.ts` for entry point\n */\n\nimport { Finger, FingerCurl, FingerDirection, FingerGesture } from './fingerdef';\n\n// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\nexport const { thumb, index, middle, ring, pinky } = Finger;\n// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\nexport const { none, half, full } = FingerCurl;\n// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\nexport const { verticalUp, verticalDown, horizontalLeft, horizontalRight, diagonalUpRight, diagonalUpLeft, diagonalDownRight, diagonalDownLeft } = FingerDirection;\n\n// describe thumbs up gesture \uD83D\uDC4D\nconst ThumbsUp = new FingerGesture('thumbs up');\nThumbsUp.curl(thumb, none, 1.0);\nThumbsUp.direction(thumb, verticalUp, 1.0);\nThumbsUp.direction(thumb, diagonalUpLeft, 0.25);\nThumbsUp.direction(thumb, diagonalUpRight, 0.25);\nfor (const finger of [Finger.index, Finger.middle, Finger.ring, Finger.pinky]) {\n ThumbsUp.curl(finger, full, 1.0);\n ThumbsUp.direction(finger, horizontalLeft, 1.0);\n ThumbsUp.direction(finger, horizontalRight, 1.0);\n}\n\n// describe Victory gesture \u270C\uFE0F\nconst Victory = new FingerGesture('victory');\nVictory.curl(thumb, half, 0.5);\nVictory.curl(thumb, none, 0.5);\nVictory.direction(thumb, verticalUp, 1.0);\nVictory.direction(thumb, diagonalUpLeft, 1.0);\nVictory.curl(index, none, 1.0);\nVictory.direction(index, verticalUp, 0.75);\nVictory.direction(index, diagonalUpLeft, 1.0);\nVictory.curl(middle, none, 1.0);\nVictory.direction(middle, verticalUp, 1.0);\nVictory.direction(middle, diagonalUpLeft, 0.75);\nVictory.curl(ring, full, 1.0);\nVictory.direction(ring, verticalUp, 0.2);\nVictory.direction(ring, diagonalUpLeft, 1.0);\nVictory.direction(ring, horizontalLeft, 0.2);\nVictory.curl(pinky, full, 1.0);\nVictory.direction(pinky, verticalUp, 0.2);\nVictory.direction(pinky, diagonalUpLeft, 1.0);\nVictory.direction(pinky, horizontalLeft, 0.2);\nVictory.weight(index, 2);\nVictory.weight(middle, 2);\n\n// describe Point gesture \u270C\uFE0F\nconst Point = new FingerGesture('point');\nPoint.curl(thumb, full, 1.0);\nPoint.curl(index, none, 0.5);\nPoint.curl(middle, full, 0.5);\nPoint.curl(ring, full, 0.5);\nPoint.curl(pinky, full, 0.5);\nPoint.weight(index, 2);\nPoint.weight(middle, 2);\n\n// describe Point gesture \u270C\uFE0F\nconst MiddleFinger = new FingerGesture('middle finger');\nMiddleFinger.curl(thumb, none, 1.0);\nMiddleFinger.curl(index, full, 0.5);\nMiddleFinger.curl(middle, full, 0.5);\nMiddleFinger.curl(ring, full, 0.5);\nMiddleFinger.curl(pinky, full, 0.5);\nMiddleFinger.weight(index, 2);\nMiddleFinger.weight(middle, 2);\n\n// describe Open Palm gesture \u270C\uFE0F\nconst OpenPalm = new FingerGesture('open palm');\nOpenPalm.curl(thumb, none, 0.75);\nOpenPalm.curl(index, none, 0.75);\nOpenPalm.curl(middle, none, 0.75);\nOpenPalm.curl(ring, none, 0.75);\nOpenPalm.curl(pinky, none, 0.75);\n\nexport default [ThumbsUp, Victory, Point, MiddleFinger, OpenPalm];\n", "/**\n * FingerPose algorithm implementation constants\n *\n * Based on: [**FingerPose***](https://github.com/andypotato/fingerpose)\n */\n\nimport { Finger, FingerCurl, FingerDirection } from './fingerdef';\nimport Gestures from '../hand/fingergesture';\n\nconst minConfidence = 0.7;\nconst options = {\n // curl estimation\n HALF_CURL_START_LIMIT: 60.0,\n NO_CURL_START_LIMIT: 130.0,\n // direction estimation\n DISTANCE_VOTE_POWER: 1.1,\n SINGLE_ANGLE_VOTE_POWER: 0.9,\n TOTAL_ANGLE_VOTE_POWER: 1.6,\n};\n\nfunction calculateSlope(point1x, point1y, point2x, point2y) {\n const value = (point1y - point2y) / (point1x - point2x);\n let slope = Math.atan(value) * 180 / Math.PI;\n if (slope <= 0) slope = -slope;\n else if (slope > 0) slope = 180 - slope;\n return slope;\n}\n\n// point1, point2 are 2d or 3d point arrays (xy[z])\n// returns either a single scalar (2d) or array of two slopes (3d)\nfunction getSlopes(point1, point2) {\n if (!point1 || !point2) return [0, 0];\n const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]);\n if (point1.length === 2) return slopeXY;\n const slopeYZ = calculateSlope(point1[1], point1[2], point2[1], point2[2]);\n return [slopeXY, slopeYZ];\n}\n\nfunction angleOrientationAt(angle, weightageAt = 1.0) {\n let isVertical = 0;\n let isDiagonal = 0;\n let isHorizontal = 0;\n if (angle >= 75.0 && angle <= 105.0) isVertical = 1 * weightageAt;\n else if (angle >= 25.0 && angle <= 155.0) isDiagonal = 1 * weightageAt;\n else isHorizontal = 1 * weightageAt;\n return [isVertical, isDiagonal, isHorizontal];\n}\n\nfunction estimateFingerCurl(startPoint, midPoint, endPoint) {\n const start_mid_x_dist = startPoint[0] - midPoint[0];\n const start_end_x_dist = startPoint[0] - endPoint[0];\n const mid_end_x_dist = midPoint[0] - endPoint[0];\n const start_mid_y_dist = startPoint[1] - midPoint[1];\n const start_end_y_dist = startPoint[1] - endPoint[1];\n const mid_end_y_dist = midPoint[1] - endPoint[1];\n const start_mid_z_dist = startPoint[2] - midPoint[2];\n const start_end_z_dist = startPoint[2] - endPoint[2];\n const mid_end_z_dist = midPoint[2] - endPoint[2];\n const start_mid_dist = Math.sqrt(start_mid_x_dist * start_mid_x_dist + start_mid_y_dist * start_mid_y_dist + start_mid_z_dist * start_mid_z_dist);\n const start_end_dist = Math.sqrt(start_end_x_dist * start_end_x_dist + start_end_y_dist * start_end_y_dist + start_end_z_dist * start_end_z_dist);\n const mid_end_dist = Math.sqrt(mid_end_x_dist * mid_end_x_dist + mid_end_y_dist * mid_end_y_dist + mid_end_z_dist * mid_end_z_dist);\n let cos_in = (mid_end_dist * mid_end_dist + start_mid_dist * start_mid_dist - start_end_dist * start_end_dist) / (2 * mid_end_dist * start_mid_dist);\n if (cos_in > 1.0) cos_in = 1.0;\n else if (cos_in < -1.0) cos_in = -1.0;\n let angleOfCurve = Math.acos(cos_in);\n angleOfCurve = (57.2958 * angleOfCurve) % 180;\n let fingerCurl;\n if (angleOfCurve > options.NO_CURL_START_LIMIT) fingerCurl = FingerCurl.none;\n else if (angleOfCurve > options.HALF_CURL_START_LIMIT) fingerCurl = FingerCurl.half;\n else fingerCurl = FingerCurl.full;\n return fingerCurl;\n}\n\nfunction estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x) {\n let estimatedDirection;\n if (max_dist_x === Math.abs(start_end_x_dist)) {\n if (start_end_x_dist > 0) estimatedDirection = FingerDirection.horizontalLeft;\n else estimatedDirection = FingerDirection.horizontalRight;\n } else if (max_dist_x === Math.abs(start_mid_x_dist)) {\n if (start_mid_x_dist > 0) estimatedDirection = FingerDirection.horizontalLeft;\n else estimatedDirection = FingerDirection.horizontalRight;\n } else {\n if (mid_end_x_dist > 0) estimatedDirection = FingerDirection.horizontalLeft;\n else estimatedDirection = FingerDirection.horizontalRight;\n }\n return estimatedDirection;\n}\n\nfunction estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y) {\n let estimatedDirection;\n if (max_dist_y === Math.abs(start_end_y_dist)) {\n if (start_end_y_dist < 0) estimatedDirection = FingerDirection.verticalDown;\n else estimatedDirection = FingerDirection.verticalUp;\n } else if (max_dist_y === Math.abs(start_mid_y_dist)) {\n if (start_mid_y_dist < 0) estimatedDirection = FingerDirection.verticalDown;\n else estimatedDirection = FingerDirection.verticalUp;\n } else {\n if (mid_end_y_dist < 0) estimatedDirection = FingerDirection.verticalDown;\n else estimatedDirection = FingerDirection.verticalUp;\n }\n return estimatedDirection;\n}\n\nfunction estimateDiagonalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y, start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x) {\n let estimatedDirection;\n const reqd_vertical_direction = estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y);\n const reqd_horizontal_direction = estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x);\n if (reqd_vertical_direction === FingerDirection.verticalUp) {\n if (reqd_horizontal_direction === FingerDirection.horizontalLeft) estimatedDirection = FingerDirection.diagonalUpLeft;\n else estimatedDirection = FingerDirection.diagonalUpRight;\n } else {\n if (reqd_horizontal_direction === FingerDirection.horizontalLeft) estimatedDirection = FingerDirection.diagonalDownLeft;\n else estimatedDirection = FingerDirection.diagonalDownRight;\n }\n return estimatedDirection;\n}\n\nfunction calculateFingerDirection(startPoint, midPoint, endPoint, fingerSlopes) {\n const start_mid_x_dist = startPoint[0] - midPoint[0];\n const start_end_x_dist = startPoint[0] - endPoint[0];\n const mid_end_x_dist = midPoint[0] - endPoint[0];\n const start_mid_y_dist = startPoint[1] - midPoint[1];\n const start_end_y_dist = startPoint[1] - endPoint[1];\n const mid_end_y_dist = midPoint[1] - endPoint[1];\n const max_dist_x = Math.max(Math.abs(start_mid_x_dist), Math.abs(start_end_x_dist), Math.abs(mid_end_x_dist));\n const max_dist_y = Math.max(Math.abs(start_mid_y_dist), Math.abs(start_end_y_dist), Math.abs(mid_end_y_dist));\n let voteVertical = 0.0;\n let voteDiagonal = 0.0;\n let voteHorizontal = 0.0;\n const start_end_x_y_dist_ratio = max_dist_y / (max_dist_x + 0.00001);\n if (start_end_x_y_dist_ratio > 1.5) voteVertical += options.DISTANCE_VOTE_POWER;\n else if (start_end_x_y_dist_ratio > 0.66) voteDiagonal += options.DISTANCE_VOTE_POWER;\n else voteHorizontal += options.DISTANCE_VOTE_POWER;\n const start_mid_dist = Math.sqrt(start_mid_x_dist * start_mid_x_dist + start_mid_y_dist * start_mid_y_dist);\n const start_end_dist = Math.sqrt(start_end_x_dist * start_end_x_dist + start_end_y_dist * start_end_y_dist);\n const mid_end_dist = Math.sqrt(mid_end_x_dist * mid_end_x_dist + mid_end_y_dist * mid_end_y_dist);\n const max_dist = Math.max(start_mid_dist, start_end_dist, mid_end_dist);\n let calc_start_point_x = startPoint[0];\n let calc_start_point_y = startPoint[1];\n let calc_end_point_x = endPoint[0];\n let calc_end_point_y = endPoint[1];\n if (max_dist === start_mid_dist) {\n calc_end_point_x = endPoint[0];\n calc_end_point_y = endPoint[1];\n } else if (max_dist === mid_end_dist) {\n calc_start_point_x = midPoint[0];\n calc_start_point_y = midPoint[1];\n }\n const calcStartPoint = [calc_start_point_x, calc_start_point_y];\n const calcEndPoint = [calc_end_point_x, calc_end_point_y];\n const totalAngle = getSlopes(calcStartPoint, calcEndPoint);\n const votes = angleOrientationAt(totalAngle, options.TOTAL_ANGLE_VOTE_POWER);\n voteVertical += votes[0];\n voteDiagonal += votes[1];\n voteHorizontal += votes[2];\n for (const fingerSlope of fingerSlopes) {\n const fingerVotes = angleOrientationAt(fingerSlope, options.SINGLE_ANGLE_VOTE_POWER);\n voteVertical += fingerVotes[0];\n voteDiagonal += fingerVotes[1];\n voteHorizontal += fingerVotes[2];\n }\n // in case of tie, highest preference goes to Vertical,\n // followed by horizontal and then diagonal\n let estimatedDirection;\n if (voteVertical === Math.max(voteVertical, voteDiagonal, voteHorizontal)) {\n estimatedDirection = estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y);\n } else if (voteHorizontal === Math.max(voteDiagonal, voteHorizontal)) {\n estimatedDirection = estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x);\n } else {\n estimatedDirection = estimateDiagonalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y, start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x);\n }\n return estimatedDirection;\n}\n\nfunction estimate(landmarks) {\n // step 1: calculate slopes\n const slopesXY: Array = [];\n const slopesYZ: Array = [];\n const fingerCurls: Array = [];\n const fingerDirections: Array = [];\n if (!landmarks) return { curls: fingerCurls, directions: fingerDirections };\n\n // step 1: calculate slopes\n for (const finger of Finger.all) {\n const points = Finger.getPoints(finger);\n const slopeAtXY: Array = [];\n const slopeAtYZ: Array = [];\n for (const point of points) {\n const point1 = landmarks[point[0]];\n const point2 = landmarks[point[1]];\n // calculate single slope\n const slopes = getSlopes(point1, point2);\n const slopeXY = slopes[0];\n const slopeYZ = slopes[1];\n slopeAtXY.push(slopeXY);\n slopeAtYZ.push(slopeYZ);\n }\n slopesXY.push(slopeAtXY);\n slopesYZ.push(slopeAtYZ);\n }\n\n // step 2: calculate orientations\n for (const finger of Finger.all) {\n // start finger predictions from palm - except for thumb\n const pointIndexAt = (finger === Finger.thumb) ? 1 : 0;\n const fingerPointsAt = Finger.getPoints(finger);\n const startPoint = landmarks[fingerPointsAt[pointIndexAt][0]];\n const midPoint = landmarks[fingerPointsAt[pointIndexAt + 1][1]];\n const endPoint = landmarks[fingerPointsAt[3][1]];\n // check if finger is curled\n const fingerCurled = estimateFingerCurl(startPoint, midPoint, endPoint);\n const fingerPosition = calculateFingerDirection(startPoint, midPoint, endPoint, slopesXY[finger].slice(pointIndexAt));\n fingerCurls[finger] = fingerCurled;\n fingerDirections[finger] = fingerPosition;\n }\n return { curls: fingerCurls, directions: fingerDirections };\n}\n\nexport function analyze(keypoints) { // get estimations of curl / direction for each finger\n if (!keypoints || keypoints.length === 0) return null;\n const estimatorRes = estimate(keypoints);\n const landmarks = {};\n for (const fingerIdx of Finger.all) {\n landmarks[Finger.getName(fingerIdx)] = {\n curl: FingerCurl.getName(estimatorRes.curls[fingerIdx]),\n direction: FingerDirection.getName(estimatorRes.directions[fingerIdx]),\n };\n }\n return landmarks;\n}\n\nexport function match(keypoints) { // compare gesture description to each known gesture\n const poses: Array<{ name: string, confidence: number }> = [];\n if (!keypoints || keypoints.length === 0) return poses;\n const estimatorRes = estimate(keypoints);\n for (const gesture of Gestures) {\n const confidence = gesture.matchAgainst(estimatorRes.curls, estimatorRes.directions);\n if (confidence >= minConfidence) poses.push({ name: gesture.name, confidence });\n }\n return poses;\n}\n", "/**\n * HandPose model implementation\n *\n * Based on: [**MediaPipe HandPose**](https://drive.google.com/file/d/1sv4sSb9BSNVZhLzxXJ0jBv9DqD-4jnAz/view)\n */\n\nimport { log } from '../util/util';\nimport * as handdetector from './handposedetector';\nimport * as handpipeline from './handposepipeline';\nimport * as fingerPose from './fingerpose';\nimport { loadModel } from '../tfjs/load';\nimport type { HandResult, Box, Point } from '../result';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nconst meshAnnotations = {\n thumb: [1, 2, 3, 4],\n index: [5, 6, 7, 8],\n middle: [9, 10, 11, 12],\n ring: [13, 14, 15, 16],\n pinky: [17, 18, 19, 20],\n palm: [0],\n};\n\nlet handDetectorModel: GraphModel | null;\nlet handPoseModel: GraphModel | null;\nlet handPipeline: handpipeline.HandPipeline;\n\nexport async function predict(input: Tensor, config: Config): Promise {\n const predictions = await handPipeline.estimateHands(input, config);\n if (!predictions) return [];\n const hands: Array = [];\n for (let i = 0; i < predictions.length; i++) {\n const annotations = {};\n if (predictions[i].landmarks) {\n for (const key of Object.keys(meshAnnotations)) {\n annotations[key] = meshAnnotations[key].map((index) => predictions[i].landmarks[index]);\n }\n }\n const keypoints = predictions[i].landmarks as unknown as Array;\n let box: Box = [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, 0, 0]; // maximums so conditionals work\n let boxRaw: Box = [0, 0, 0, 0];\n if (keypoints && keypoints.length > 0) { // if we have landmarks, calculate box based on landmarks\n for (const pt of keypoints) {\n if (pt[0] < box[0]) box[0] = pt[0];\n if (pt[1] < box[1]) box[1] = pt[1];\n if (pt[0] > box[2]) box[2] = pt[0];\n if (pt[1] > box[3]) box[3] = pt[1];\n }\n box[2] -= box[0];\n box[3] -= box[1];\n boxRaw = [box[0] / (input.shape[2] || 0), box[1] / (input.shape[1] || 0), box[2] / (input.shape[2] || 0), box[3] / (input.shape[1] || 0)];\n } else { // otherwise use box from prediction\n box = predictions[i].box ? [\n Math.trunc(Math.max(0, predictions[i].box.topLeft[0])),\n Math.trunc(Math.max(0, predictions[i].box.topLeft[1])),\n Math.trunc(Math.min((input.shape[2] || 0), predictions[i].box.bottomRight[0]) - Math.max(0, predictions[i].box.topLeft[0])),\n Math.trunc(Math.min((input.shape[1] || 0), predictions[i].box.bottomRight[1]) - Math.max(0, predictions[i].box.topLeft[1])),\n ] : [0, 0, 0, 0];\n boxRaw = [\n (predictions[i].box.topLeft[0]) / (input.shape[2] || 0),\n (predictions[i].box.topLeft[1]) / (input.shape[1] || 0),\n (predictions[i].box.bottomRight[0] - predictions[i].box.topLeft[0]) / (input.shape[2] || 0),\n (predictions[i].box.bottomRight[1] - predictions[i].box.topLeft[1]) / (input.shape[1] || 0),\n ];\n }\n const landmarks = fingerPose.analyze(keypoints);\n hands.push({\n id: i,\n score: Math.round(100 * predictions[i].confidence) / 100,\n boxScore: Math.round(100 * predictions[i].boxConfidence) / 100,\n fingerScore: Math.round(100 * predictions[i].fingerConfidence) / 100,\n label: 'hand',\n box,\n boxRaw,\n keypoints,\n annotations: annotations as HandResult['annotations'],\n landmarks: landmarks as HandResult['landmarks'],\n });\n }\n return hands;\n}\n\nexport async function load(config: Config): Promise<[GraphModel | null, GraphModel | null]> {\n if (env.initial) {\n handDetectorModel = null;\n handPoseModel = null;\n }\n if (!handDetectorModel || !handPoseModel) {\n [handDetectorModel, handPoseModel] = await Promise.all([\n config.hand.enabled ? loadModel(config.hand.detector?.modelPath) : null,\n config.hand.landmarks ? loadModel(config.hand.skeleton?.modelPath) : null,\n ]);\n } else {\n if (config.debug) log('cached model:', handDetectorModel['modelUrl']);\n if (config.debug) log('cached model:', handPoseModel['modelUrl']);\n }\n const handDetector = new handdetector.HandDetector(handDetectorModel);\n handPipeline = new handpipeline.HandPipeline(handDetector, handPoseModel);\n return [handDetectorModel, handPoseModel];\n}\n", "/**\n * HandTrack model implementation\n *\n * Based on:\n * - Hand Detection & Skeleton: [**MediaPipe HandPose**](https://drive.google.com/file/d/1sv4sSb9BSNVZhLzxXJ0jBv9DqD-4jnAz/view)\n * - Hand Tracking: [**HandTracking**](https://github.com/victordibia/handtracking)\n */\n\nimport { log, now } from '../util/util';\nimport * as box from '../util/box';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport type { HandResult, HandType, Box, Point } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\nimport * as fingerPose from './fingerpose';\nimport { fakeOps } from '../tfjs/backend';\nimport { constants } from '../tfjs/constants';\n\nconst models: [GraphModel | null, GraphModel | null] = [null, null];\nconst modelOutputNodes = ['StatefulPartitionedCall/Postprocessor/Slice', 'StatefulPartitionedCall/Postprocessor/ExpandDims_1'];\n\nconst inputSize = [[0, 0], [0, 0]];\n\nconst classes = ['hand', 'fist', 'pinch', 'point', 'face', 'tip', 'pinchtip'];\nconst faceIndex = 4;\n\nconst boxExpandFact = 1.6;\nconst maxDetectorResolution = 512;\nconst detectorExpandFact = 1.4;\n\nlet skipped = Number.MAX_SAFE_INTEGER;\nlet lastTime = 0;\nlet outputSize: [number, number] = [0, 0];\n\ntype HandDetectResult = {\n id: number,\n score: number,\n box: Box,\n boxRaw: Box,\n label: HandType,\n}\n\nconst cache: {\n boxes: Array,\n hands: Array;\n} = {\n boxes: [],\n hands: [],\n};\n\nconst fingerMap = {\n /*\n thumb: [0, 1, 2, 3, 4],\n index: [0, 5, 6, 7, 8],\n middle: [0, 9, 10, 11, 12],\n ring: [0, 13, 14, 15, 16],\n pinky: [0, 17, 18, 19, 20],\n palm: [0],\n */\n thumb: [1, 2, 3, 4],\n index: [5, 6, 7, 8],\n middle: [9, 10, 11, 12],\n ring: [13, 14, 15, 16],\n pinky: [17, 18, 19, 20],\n base: [0],\n palm: [0, 17, 13, 9, 5, 1, 0],\n};\n\nexport async function loadDetect(config: Config): Promise {\n // HandTrack Model: Original: TFJS Port: \n if (env.initial) models[0] = null;\n if (!models[0]) {\n // handtrack model has some kernel ops defined in model but those are never referenced and non-existent in tfjs\n // ideally need to prune the model itself\n fakeOps(['tensorlistreserve', 'enter', 'tensorlistfromtensor', 'merge', 'loopcond', 'switch', 'exit', 'tensorliststack', 'nextiteration', 'tensorlistsetitem', 'tensorlistgetitem', 'reciprocal', 'shape', 'split', 'where'], config);\n models[0] = await loadModel(config.hand.detector?.modelPath);\n const inputs = Object.values(models[0].modelSignature['inputs']);\n inputSize[0][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;\n inputSize[0][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug) log('cached model:', models[0]['modelUrl']);\n return models[0];\n}\n\nexport async function loadSkeleton(config: Config): Promise {\n if (env.initial) models[1] = null;\n if (!models[1]) {\n models[1] = await loadModel(config.hand.skeleton?.modelPath);\n const inputs = Object.values(models[1].modelSignature['inputs']);\n inputSize[1][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;\n inputSize[1][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug) log('cached model:', models[1]['modelUrl']);\n return models[1];\n}\n\nexport async function load(config: Config): Promise<[GraphModel | null, GraphModel | null]> {\n if (!models[0]) await loadDetect(config);\n if (!models[1]) await loadSkeleton(config);\n return models;\n}\n\nasync function detectHands(input: Tensor, config: Config): Promise {\n const hands: HandDetectResult[] = [];\n if (!input || !models[0]) return hands;\n const t: Record = {};\n const ratio = (input.shape[2] || 1) / (input.shape[1] || 1);\n const height = Math.min(Math.round((input.shape[1] || 0) / 8) * 8, maxDetectorResolution); // use dynamic input size but cap at 512\n const width = Math.round(height * ratio / 8) * 8;\n t.resize = tf.image.resizeBilinear(input, [height, width]); // todo: resize with padding\n t.cast = tf.cast(t.resize, 'int32');\n [t.rawScores, t.rawBoxes] = await models[0].executeAsync(t.cast, modelOutputNodes) as Tensor[];\n t.boxes = tf.squeeze(t.rawBoxes, [0, 2]);\n t.scores = tf.squeeze(t.rawScores, [0]);\n const classScores: Array = tf.unstack(t.scores, 1); // unstack scores based on classes\n tf.dispose(classScores[faceIndex]);\n classScores.splice(faceIndex, 1); // remove faces\n t.filtered = tf.stack(classScores, 1); // restack\n tf.dispose(classScores);\n // t.filtered = t.scores;\n t.max = tf.max(t.filtered, 1); // max overall score\n t.argmax = tf.argMax(t.filtered, 1); // class index of max overall score\n let id = 0;\n t.nms = await tf.image.nonMaxSuppressionAsync(t.boxes, t.max, (config.hand.maxDetected || 0) + 1, config.hand.iouThreshold || 0, config.hand.minConfidence || 1);\n const nms = await t.nms.data();\n const scores = await t.max.data();\n const classNum = await t.argmax.data();\n for (const nmsIndex of Array.from(nms)) { // generates results for each class\n const boxSlice = tf.slice(t.boxes, nmsIndex, 1);\n const boxYX = await boxSlice.data();\n tf.dispose(boxSlice);\n const boxData: Box = [boxYX[1], boxYX[0], boxYX[3] - boxYX[1], boxYX[2] - boxYX[0]]; // yx box reshaped to standard box\n const boxRaw: Box = box.scale(boxData, detectorExpandFact);\n const boxFull: Box = [Math.trunc(boxData[0] * outputSize[0]), Math.trunc(boxData[1] * outputSize[1]), Math.trunc(boxData[2] * outputSize[0]), Math.trunc(boxData[3] * outputSize[1])];\n const score = scores[nmsIndex];\n const label = classes[classNum[nmsIndex]] as HandType;\n const hand: HandDetectResult = { id: id++, score, box: boxFull, boxRaw, label };\n hands.push(hand);\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n hands.sort((a, b) => b.score - a.score);\n if (hands.length > (config.hand.maxDetected || 1)) hands.length = (config.hand.maxDetected || 1);\n return hands;\n}\n\nasync function detectFingers(input: Tensor, h: HandDetectResult, config: Config): Promise {\n const hand: HandResult = { // initial values inherited from hand detect\n id: h.id,\n score: Math.round(100 * h.score) / 100,\n boxScore: Math.round(100 * h.score) / 100,\n fingerScore: 0,\n box: h.box,\n boxRaw: h.boxRaw,\n label: h.label,\n keypoints: [],\n landmarks: {} as HandResult['landmarks'],\n annotations: {} as HandResult['annotations'],\n };\n if (input && models[1] && config.hand.landmarks && h.score > (config.hand.minConfidence || 0)) {\n const t: Record = {};\n const boxCrop = [h.boxRaw[1], h.boxRaw[0], h.boxRaw[3] + h.boxRaw[1], h.boxRaw[2] + h.boxRaw[0]] as Box;\n t.crop = tf.image.cropAndResize(input, [boxCrop], [0], [inputSize[1][0], inputSize[1][1]], 'bilinear');\n t.div = tf.div(t.crop, constants.tf255);\n [t.score, t.keypoints] = models[1].execute(t.div, ['Identity_1', 'Identity']) as Tensor[];\n const rawScore = (await t.score.data())[0];\n const score = (100 - Math.trunc(100 / (1 + Math.exp(rawScore)))) / 100; // reverse sigmoid value\n if (score >= (config.hand.minConfidence || 0)) {\n hand.fingerScore = score;\n t.reshaped = tf.reshape(t.keypoints, [-1, 3]);\n const coordsData: Point[] = await t.reshaped.array() as Point[];\n const coordsRaw: Point[] = coordsData.map((kpt) => [kpt[0] / inputSize[1][1], kpt[1] / inputSize[1][0], (kpt[2] || 0)]);\n const coordsNorm: Point[] = coordsRaw.map((kpt) => [kpt[0] * h.boxRaw[2], kpt[1] * h.boxRaw[3], (kpt[2] || 0)]);\n hand.keypoints = (coordsNorm).map((kpt) => [outputSize[0] * (kpt[0] + h.boxRaw[0]), outputSize[1] * (kpt[1] + h.boxRaw[1]), (kpt[2] || 0)]);\n hand.landmarks = fingerPose.analyze(hand.keypoints) as HandResult['landmarks']; // calculate finger gestures\n for (const key of Object.keys(fingerMap)) { // map keypoints to per-finger annotations\n hand.annotations[key] = fingerMap[key].map((index: number) => (hand.landmarks && hand.keypoints[index] ? hand.keypoints[index] : null));\n }\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n return hand;\n}\n\nexport async function predict(input: Tensor, config: Config): Promise {\n if (!models[0] || !models[1] || !models[0]?.inputs[0].shape || !models[1]?.inputs[0].shape) return []; // something is wrong with the model\n outputSize = [input.shape[2] || 0, input.shape[1] || 0];\n skipped++; // increment skip frames\n const skipTime = (config.hand.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.hand.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame) {\n return cache.hands; // return cached results without running anything\n }\n return new Promise(async (resolve) => {\n const skipTimeExtended = 3 * (config.hand.skipTime || 0) > (now() - lastTime);\n const skipFrameExtended = skipped < 3 * (config.hand.skipFrames || 0);\n if (config.skipAllowed && cache.hands.length === config.hand.maxDetected) { // we have all detected hands so we're definitely skipping\n cache.hands = await Promise.all(cache.boxes.map((handBox) => detectFingers(input, handBox, config)));\n } else if (config.skipAllowed && skipTimeExtended && skipFrameExtended && cache.hands.length > 0) { // we have some cached results: maybe not enough but anyhow continue for bit longer\n cache.hands = await Promise.all(cache.boxes.map((handBox) => detectFingers(input, handBox, config)));\n } else { // finally rerun detector\n cache.boxes = await detectHands(input, config);\n lastTime = now();\n cache.hands = await Promise.all(cache.boxes.map((handBox) => detectFingers(input, handBox, config)));\n skipped = 0;\n }\n\n const oldCache = [...cache.boxes];\n cache.boxes.length = 0; // reset cache\n if (config.cacheSensitivity > 0) {\n for (let i = 0; i < cache.hands.length; i++) {\n const boxKpt = box.square(cache.hands[i].keypoints, outputSize);\n if (boxKpt.box[2] / (input.shape[2] || 1) > 0.05 && boxKpt.box[3] / (input.shape[1] || 1) > 0.05 && cache.hands[i].fingerScore && cache.hands[i].fingerScore > (config.hand.minConfidence || 0)) {\n const boxScale = box.scale(boxKpt.box, boxExpandFact);\n const boxScaleRaw = box.scale(boxKpt.boxRaw, boxExpandFact);\n // const boxCrop = box.crop(boxScaleRaw);\n cache.boxes.push({ ...oldCache[i], box: boxScale, boxRaw: boxScaleRaw });\n }\n }\n }\n for (let i = 0; i < cache.hands.length; i++) { // replace detected boxes with calculated boxes in final output\n const bbox = box.calc(cache.hands[i].keypoints, outputSize);\n cache.hands[i].box = bbox.box;\n cache.hands[i].boxRaw = bbox.boxRaw;\n }\n resolve(cache.hands);\n });\n}\n", "/**\n * Anti-spoofing model implementation\n */\n\nimport { log, now } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nconst cached: Array = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\nlet lastCount = 0;\nlet lastTime = 0;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.liveness?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise {\n if (!model) return 0;\n const skipTime = (config.face.liveness?.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.face.liveness?.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && cached[idx]) {\n skipped++;\n return cached[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const resize = tf.image.resizeBilinear(image, [model?.inputs[0].shape ? model.inputs[0].shape[2] : 0, model?.inputs[0].shape ? model.inputs[0].shape[1] : 0], false);\n const res = model?.execute(resize) as Tensor;\n const num = (await res.data())[0];\n cached[idx] = Math.round(100 * num) / 100;\n lastCount = count;\n lastTime = now();\n tf.dispose([resize, res]);\n resolve(cached[idx]);\n });\n}\n", "export const kpt: Array = [ // used to create part labels\n 'nose',\n 'leftEye',\n 'rightEye',\n 'leftEar',\n 'rightEar',\n 'leftShoulder',\n 'rightShoulder',\n 'leftElbow',\n 'rightElbow',\n 'leftWrist',\n 'rightWrist',\n 'leftHip',\n 'rightHip',\n 'leftKnee',\n 'rightKnee',\n 'leftAnkle',\n 'rightAnkle',\n];\n\nexport const horizontal: Array = [ // used to fix left vs right\n ['leftEye', 'rightEye'],\n ['leftEar', 'rightEar'],\n ['leftShoulder', 'rightShoulder'],\n ['leftElbow', 'rightElbow'],\n ['leftWrist', 'rightWrist'],\n ['leftHip', 'rightHip'],\n ['leftKnee', 'rightKnee'],\n ['leftAnkle', 'rightAnkle'],\n];\n\nexport const vertical: Array = [ // used to remove unlikely keypoint positions\n ['leftKnee', 'leftShoulder'],\n ['rightKnee', 'rightShoulder'],\n ['leftAnkle', 'leftKnee'],\n ['rightAnkle', 'rightKnee'],\n];\n\nexport const relative: Array = [ // used to match relative body parts\n [['leftHip', 'rightHip'], ['leftShoulder', 'rightShoulder']],\n [['leftElbow', 'rightElbow'], ['leftShoulder', 'rightShoulder']],\n];\n\nexport const connected: Record = { // used to create body outline in annotations\n leftLeg: ['leftHip', 'leftKnee', 'leftAnkle'],\n rightLeg: ['rightHip', 'rightKnee', 'rightAnkle'],\n torso: ['leftShoulder', 'rightShoulder', 'rightHip', 'leftHip', 'leftShoulder'],\n leftArm: ['leftShoulder', 'leftElbow', 'leftWrist'],\n rightArm: ['rightShoulder', 'rightElbow', 'rightWrist'],\n head: [],\n};\n", "import type { BodyKeypoint, BodyResult } from '../result';\nimport * as box from '../util/box';\nimport * as coords from './movenetcoords';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport type { Tensor } from '../tfjs/types';\n\nconst maxJitter = 0.005; // default allowed jitter is within 0.5%\n\nconst cache: {\n keypoints: Array,\n padding: [number, number][];\n} = {\n keypoints: [],\n padding: [[0, 0], [0, 0], [0, 0], [0, 0]],\n};\n\nexport function bodyParts(body: BodyResult) { // model sometimes mixes up left vs right keypoints so we fix them\n for (const pair of coords.horizontal) { // fix body parts left vs right\n const left = body.keypoints.findIndex((kp) => kp.part === pair[0]);\n const right = body.keypoints.findIndex((kp) => kp.part === pair[1]);\n if (body.keypoints[left] && body.keypoints[right]) {\n if (body.keypoints[left].position[0] < body.keypoints[right].position[0]) {\n const tmp = body.keypoints[left];\n body.keypoints[left] = body.keypoints[right];\n body.keypoints[right] = tmp;\n }\n }\n }\n for (const pair of coords.vertical) { // remove body parts with improbable vertical position\n const lower = body.keypoints.findIndex((kp) => (kp && kp.part === pair[0]));\n const higher = body.keypoints.findIndex((kp) => (kp && kp.part === pair[1]));\n if (body.keypoints[lower] && body.keypoints[higher]) {\n if (body.keypoints[lower].position[1] < body.keypoints[higher].position[1]) {\n body.keypoints.splice(lower, 1);\n }\n }\n }\n for (const [pair, compare] of coords.relative) { // rearrange body parts according to their relative position\n const left = body.keypoints.findIndex((kp) => (kp && kp.part === pair[0]));\n const right = body.keypoints.findIndex((kp) => (kp && kp.part === pair[1]));\n const leftTo = body.keypoints.findIndex((kp) => (kp && kp.part === compare[0]));\n const rightTo = body.keypoints.findIndex((kp) => (kp && kp.part === compare[1]));\n if (!body.keypoints[leftTo] || !body.keypoints[rightTo]) continue; // only if we have both compare points\n const distanceLeft = body.keypoints[left] ? [\n Math.abs(body.keypoints[leftTo].position[0] - body.keypoints[left].position[0]),\n Math.abs(body.keypoints[rightTo].position[0] - body.keypoints[left].position[0]),\n ] : [0, 0];\n const distanceRight = body.keypoints[right] ? [\n Math.abs(body.keypoints[rightTo].position[0] - body.keypoints[right].position[0]),\n Math.abs(body.keypoints[leftTo].position[0] - body.keypoints[right].position[0]),\n ] : [0, 0];\n if (distanceLeft[0] > distanceLeft[1] || distanceRight[0] > distanceRight[1]) { // should flip keypoints\n const tmp = body.keypoints[left];\n body.keypoints[left] = body.keypoints[right];\n body.keypoints[right] = tmp;\n }\n }\n}\n\nexport function jitter(keypoints: Array): Array {\n for (let i = 0; i < keypoints.length; i++) {\n if (keypoints[i] && cache.keypoints[i]) {\n const diff = [Math.abs(keypoints[i].positionRaw[0] - cache.keypoints[i].positionRaw[0]), Math.abs(keypoints[i].positionRaw[1] - cache.keypoints[i].positionRaw[1])];\n if (diff[0] < maxJitter && diff[1] < maxJitter) {\n keypoints[i] = cache.keypoints[i]; // below jitter so replace keypoint\n } else {\n cache.keypoints[i] = keypoints[i]; // above jitter so update cache\n }\n } else {\n cache.keypoints[i] = keypoints[i]; // cache for keypoint doesnt exist so create it here\n }\n }\n return keypoints;\n}\n\nexport function padInput(input: Tensor, inputSize: number): Tensor {\n const t: Record = {};\n if (!input.shape || !input.shape[1] || !input.shape[2]) return input;\n cache.padding = [\n [0, 0], // dont touch batch\n [input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0, input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0], // height before&after\n [input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0, input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0], // width before&after\n [0, 0], // dont touch rbg\n ];\n t.pad = tf.pad(input, cache.padding);\n t.resize = tf.image.resizeBilinear(t.pad, [inputSize, inputSize]);\n const final = tf.cast(t.resize, 'int32');\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return final;\n}\n\nexport function rescaleBody(body: BodyResult, outputSize: [number, number]): BodyResult {\n body.keypoints = body.keypoints.filter((kpt) => kpt && kpt.position); // filter invalid keypoints\n for (const kpt of body.keypoints) {\n kpt.position = [\n kpt.position[0] * (outputSize[0] + cache.padding[2][0] + cache.padding[2][1]) / outputSize[0] - cache.padding[2][0],\n kpt.position[1] * (outputSize[1] + cache.padding[1][0] + cache.padding[1][1]) / outputSize[1] - cache.padding[1][0],\n ];\n kpt.positionRaw = [\n kpt.position[0] / outputSize[0], kpt.position[1] / outputSize[1],\n ];\n }\n const rescaledBoxes = box.calc(body.keypoints.map((pt) => pt.position), outputSize);\n body.box = rescaledBoxes.box;\n body.boxRaw = rescaledBoxes.boxRaw;\n return body;\n}\n", "/**\n * MoveNet model implementation\n *\n * Based on: [**MoveNet**](https://blog.tensorflow.org/2021/05/next-generation-pose-detection-with-movenet-and-tensorflowjs.html)\n */\n\nimport { log, now } from '../util/util';\nimport * as box from '../util/box';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as coords from './movenetcoords';\nimport * as fix from './movenetfix';\nimport { loadModel } from '../tfjs/load';\nimport type { BodyKeypoint, BodyResult, BodyLandmark, BodyAnnotation, Box, Point } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { fakeOps } from '../tfjs/backend';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nlet inputSize = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n// const boxExpandFact = 1.5; // increase to 150%\n\nconst cache: {\n boxes: Array, // unused\n bodies: Array;\n last: number,\n} = {\n boxes: [],\n bodies: [],\n last: 0,\n};\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) {\n fakeOps(['size'], config);\n model = await loadModel(config.body.modelPath);\n } else if (config.debug) log('cached model:', model['modelUrl']);\n inputSize = model.inputs[0].shape ? model.inputs[0].shape[2] : 0;\n if (inputSize < 64) inputSize = 256;\n return model;\n}\n\nasync function parseSinglePose(res, config, image) {\n const kpt = res[0][0];\n const keypoints: Array = [];\n let score = 0;\n for (let id = 0; id < kpt.length; id++) {\n score = kpt[id][2];\n if (score > config.body.minConfidence) {\n const positionRaw: Point = [kpt[id][1], kpt[id][0]];\n keypoints.push({\n score: Math.round(100 * score) / 100,\n part: coords.kpt[id] as BodyLandmark,\n positionRaw,\n position: [ // normalized to input image size\n Math.round((image.shape[2] || 0) * positionRaw[0]),\n Math.round((image.shape[1] || 0) * positionRaw[1]),\n ],\n });\n }\n }\n score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n const bodies: Array = [];\n const newBox = box.calc(keypoints.map((pt) => pt.position), [image.shape[2], image.shape[1]]);\n const annotations: Record = {};\n for (const [name, indexes] of Object.entries(coords.connected)) {\n const pt: Array = [];\n for (let i = 0; i < indexes.length - 1; i++) {\n const pt0 = keypoints.find((kp) => kp.part === indexes[i]);\n const pt1 = keypoints.find((kp) => kp.part === indexes[i + 1]);\n if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);\n }\n annotations[name] = pt;\n }\n const body: BodyResult = { id: 0, score, box: newBox.box, boxRaw: newBox.boxRaw, keypoints, annotations };\n fix.bodyParts(body);\n bodies.push(body);\n return bodies;\n}\n\nasync function parseMultiPose(res, config, image) {\n const bodies: Array = [];\n for (let id = 0; id < res[0].length; id++) {\n const kpt = res[0][id];\n const totalScore = Math.round(100 * kpt[51 + 4]) / 100;\n if (totalScore > config.body.minConfidence) {\n const keypoints: Array = [];\n for (let i = 0; i < 17; i++) {\n const score = kpt[3 * i + 2];\n if (score > config.body.minConfidence) {\n const positionRaw: Point = [kpt[3 * i + 1], kpt[3 * i + 0]];\n keypoints.push({\n part: coords.kpt[i] as BodyLandmark,\n score: Math.round(100 * score) / 100,\n positionRaw,\n position: [Math.round((image.shape[2] || 0) * positionRaw[0]), Math.round((image.shape[1] || 0) * positionRaw[1])],\n });\n }\n }\n const newBox = box.calc(keypoints.map((pt) => pt.position), [image.shape[2], image.shape[1]]);\n // movenet-multipose has built-in box details\n // const boxRaw: Box = [kpt[51 + 1], kpt[51 + 0], kpt[51 + 3] - kpt[51 + 1], kpt[51 + 2] - kpt[51 + 0]];\n // const box: Box = [Math.trunc(boxRaw[0] * (image.shape[2] || 0)), Math.trunc(boxRaw[1] * (image.shape[1] || 0)), Math.trunc(boxRaw[2] * (image.shape[2] || 0)), Math.trunc(boxRaw[3] * (image.shape[1] || 0))];\n const annotations: Record = {} as Record;\n for (const [name, indexes] of Object.entries(coords.connected)) {\n const pt: Array = [];\n for (let i = 0; i < indexes.length - 1; i++) {\n const pt0 = keypoints.find((kp) => kp.part === indexes[i]);\n const pt1 = keypoints.find((kp) => kp.part === indexes[i + 1]);\n if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);\n }\n annotations[name] = pt;\n }\n const body: BodyResult = { id, score: totalScore, box: newBox.box, boxRaw: newBox.boxRaw, keypoints: [...keypoints], annotations };\n fix.bodyParts(body);\n bodies.push(body);\n }\n }\n bodies.sort((a, b) => b.score - a.score);\n if (bodies.length > config.body.maxDetected) bodies.length = config.body.maxDetected;\n return bodies;\n}\n\nexport async function predict(input: Tensor, config: Config): Promise {\n if (!model || !model?.inputs[0].shape) return []; // something is wrong with the model\n if (!config.skipAllowed) cache.boxes.length = 0; // allowed to use cache or not\n skipped++; // increment skip frames\n const skipTime = (config.body.skipTime || 0) > (now() - cache.last);\n const skipFrame = skipped < (config.body.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame) {\n return cache.bodies; // return cached results without running anything\n }\n return new Promise(async (resolve) => {\n const t: Record = {};\n skipped = 0;\n // run detection on squared input and cached boxes\n /*\n cache.bodies = []; // reset bodies result\n if (cache.boxes.length >= (config.body.maxDetected || 0)) { // if we have enough cached boxes run detection using cache\n for (let i = 0; i < cache.boxes.length; i++) { // run detection based on cached boxes\n t.crop = tf.image.cropAndResize(input, [cache.boxes[i]], [0], [inputSize, inputSize], 'bilinear');\n t.cast = tf.cast(t.crop, 'int32');\n // t.input = prepareImage(input);\n t.res = model?.execute(t.cast) as Tensor;\n const res = await t.res.array();\n const newBodies = (t.res.shape[2] === 17) ? await parseSinglePose(res, config, input, cache.boxes[i]) : await parseMultiPose(res, config, input, cache.boxes[i]);\n cache.bodies = cache.bodies.concat(newBodies);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n }\n if (cache.bodies.length !== config.body.maxDetected) { // did not find enough bodies based on cached boxes so run detection on full frame\n t.input = prepareImage(input);\n t.res = model?.execute(t.input) as Tensor;\n const res = await t.res.array();\n cache.bodies = (t.res.shape[2] === 17) ? await parseSinglePose(res, config, input, [0, 0, 1, 1]) : await parseMultiPose(res, config, input, [0, 0, 1, 1]);\n for (const body of cache.bodies) rescaleBody(body, [input.shape[2] || 1, input.shape[1] || 1]);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n cache.boxes.length = 0; // reset cache\n for (let i = 0; i < cache.bodies.length; i++) {\n if (cache.bodies[i].keypoints.length > (coords.kpt.length / 2)) { // only update cache if we detected at least half keypoints\n const scaledBox = box.scale(cache.bodies[i].boxRaw, boxExpandFact);\n const cropBox = box.crop(scaledBox);\n cache.boxes.push(cropBox);\n }\n }\n */\n\n // run detection on squared input and no cached boxes\n t.input = fix.padInput(input, inputSize);\n t.res = model?.execute(t.input) as Tensor;\n cache.last = now();\n const res = await t.res.array();\n cache.bodies = (t.res.shape[2] === 17)\n ? await parseSinglePose(res, config, input)\n : await parseMultiPose(res, config, input);\n for (const body of cache.bodies) {\n fix.rescaleBody(body, [input.shape[2] || 1, input.shape[1] || 1]);\n fix.jitter(body.keypoints);\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n\n resolve(cache.bodies);\n });\n}\n", "/**\n * NanoDet object detection model implementation\n *\n * Based on: [**MB3-CenterNet**](https://github.com/610265158/mobilenetv3_centernet)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport { labels } from './labels';\nimport type { ObjectResult, ObjectType, Box } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel;\nlet last: Array = [];\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\nlet inputSize = 0;\n\nconst scaleBox = 2.5; // increase box size\n\nexport async function load(config: Config): Promise {\n if (!model || env.initial) {\n model = await loadModel(config.object.modelPath);\n const inputs = Object.values(model.modelSignature['inputs']);\n inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nasync function process(res: Tensor[], outputShape: [number, number], config: Config) {\n let id = 0;\n let results: Array = [];\n for (const strideSize of [1, 2, 4]) { // try each stride size as it detects large/medium/small objects\n // find scores, boxes, classes\n tf.tidy(async () => { // wrap in tidy to automatically deallocate temp tensors\n const baseSize = strideSize * 13; // 13x13=169, 26x26=676, 52x52=2704\n // find boxes and scores output depending on stride\n const scoresT = tf.squeeze(res.find((a: Tensor) => (a.shape[1] === (baseSize ** 2) && (a.shape[2] || 0) === labels.length)));\n const featuresT = tf.squeeze(res.find((a: Tensor) => (a.shape[1] === (baseSize ** 2) && (a.shape[2] || 0) < labels.length)));\n const boxesMax = featuresT.reshape([-1, 4, featuresT.shape[1] / 4]); // reshape [output] to [4, output / 4] where number is number of different features inside each stride\n const boxIdx = await boxesMax.argMax(2).array(); // what we need is indexes of features with highest scores, not values itself\n const scores = await scoresT.array(); // optionally use exponential scores or just as-is\n for (let i = 0; i < scoresT.shape[0]; i++) { // total strides (x * y matrix)\n for (let j = 0; j < scoresT.shape[1]; j++) { // one score for each class\n const score = scores[i][j]; // get score for current position\n if (score > (config.object.minConfidence || 0) && j !== 61) {\n const cx = (0.5 + Math.trunc(i % baseSize)) / baseSize; // center.x normalized to range 0..1\n const cy = (0.5 + Math.trunc(i / baseSize)) / baseSize; // center.y normalized to range 0..1\n const boxOffset = boxIdx[i].map((a: number) => a * (baseSize / strideSize / inputSize)); // just grab indexes of features with highest scores\n const [x, y] = [\n cx - (scaleBox / strideSize * boxOffset[0]),\n cy - (scaleBox / strideSize * boxOffset[1]),\n ];\n const [w, h] = [\n cx + (scaleBox / strideSize * boxOffset[2]) - x,\n cy + (scaleBox / strideSize * boxOffset[3]) - y,\n ];\n let boxRaw: Box = [x, y, w, h]; // results normalized to range 0..1\n boxRaw = boxRaw.map((a) => Math.max(0, Math.min(a, 1))) as Box; // fix out-of-bounds coords\n const box = [ // results normalized to input image pixels\n boxRaw[0] * outputShape[0],\n boxRaw[1] * outputShape[1],\n boxRaw[2] * outputShape[0],\n boxRaw[3] * outputShape[1],\n ];\n const result = {\n id: id++,\n // strideSize,\n score: Math.round(100 * score) / 100,\n class: j + 1,\n label: labels[j].label as ObjectType,\n // center: [Math.trunc(outputShape[0] * cx), Math.trunc(outputShape[1] * cy)],\n // centerRaw: [cx, cy],\n box: box.map((a) => Math.trunc(a)) as Box,\n boxRaw,\n };\n results.push(result);\n }\n }\n }\n });\n }\n // deallocate tensors\n res.forEach((t) => tf.dispose(t));\n\n // normally nms is run on raw results, but since boxes need to be calculated this way we skip calulcation of\n // unnecessary boxes and run nms only on good candidates (basically it just does IOU analysis as scores are already filtered)\n const nmsBoxes = results.map((a) => [a.boxRaw[1], a.boxRaw[0], a.boxRaw[3], a.boxRaw[2]]); // switches coordinates from x,y to y,x as expected by tf.nms\n const nmsScores = results.map((a) => a.score);\n let nmsIdx: Array = [];\n if (nmsBoxes && nmsBoxes.length > 0) {\n const nms = await tf.image.nonMaxSuppressionAsync(nmsBoxes, nmsScores, config.object.maxDetected, config.object.iouThreshold, config.object.minConfidence);\n nmsIdx = await nms.data();\n tf.dispose(nms);\n }\n\n // filter & sort results\n results = results\n .filter((_val, idx) => nmsIdx.includes(idx))\n .sort((a, b) => (b.score - a.score));\n\n return results;\n}\n\nexport async function predict(image: Tensor, config: Config): Promise {\n const skipTime = (config.object.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.object.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && (last.length > 0)) {\n skipped++;\n return last;\n }\n skipped = 0;\n if (!env.kernels.includes('mod') || !env.kernels.includes('sparsetodense')) return last;\n return new Promise(async (resolve) => {\n const outputSize = [image.shape[2] || 0, image.shape[1] || 0];\n const resize = tf.image.resizeBilinear(image, [inputSize, inputSize], false);\n const norm = tf.div(resize, constants.tf255);\n const transpose = norm.transpose([0, 3, 1, 2]);\n tf.dispose(norm);\n tf.dispose(resize);\n\n let objectT;\n if (config.object.enabled) objectT = model.execute(transpose);\n lastTime = now();\n tf.dispose(transpose);\n\n const obj = await process(objectT as Tensor[], outputSize as [number, number], config);\n last = obj;\n resolve(obj);\n });\n}\n", "/**\n * PoseNet body detection model implementation constants\n * See `posenet.ts` for entry point\n */\n\nimport type { Point, BodyResult, BodyAnnotation, BodyLandmark } from '../result';\n\nexport const partNames = [\n 'nose', 'leftEye', 'rightEye', 'leftEar', 'rightEar', 'leftShoulder',\n 'rightShoulder', 'leftElbow', 'rightElbow', 'leftWrist', 'rightWrist',\n 'leftHip', 'rightHip', 'leftKnee', 'rightKnee', 'leftAnkle', 'rightAnkle',\n];\n\nexport const count = partNames.length; // 17 keypoints\n\nexport const partIds = partNames.reduce((result, jointName, i) => {\n result[jointName] = i;\n return result;\n}, {});\n\nconst connectedPartNames = [\n ['leftHip', 'leftShoulder'], ['leftElbow', 'leftShoulder'],\n ['leftElbow', 'leftWrist'], ['leftHip', 'leftKnee'],\n ['leftKnee', 'leftAnkle'], ['rightHip', 'rightShoulder'],\n ['rightElbow', 'rightShoulder'], ['rightElbow', 'rightWrist'],\n ['rightHip', 'rightKnee'], ['rightKnee', 'rightAnkle'],\n ['leftShoulder', 'rightShoulder'], ['leftHip', 'rightHip'],\n];\nexport const connectedPartIndices = connectedPartNames.map(([jointNameA, jointNameB]) => ([partIds[jointNameA], partIds[jointNameB]]));\n\nexport const poseChain = [\n ['nose', 'leftEye'], ['leftEye', 'leftEar'], ['nose', 'rightEye'],\n ['rightEye', 'rightEar'], ['nose', 'leftShoulder'],\n ['leftShoulder', 'leftElbow'], ['leftElbow', 'leftWrist'],\n ['leftShoulder', 'leftHip'], ['leftHip', 'leftKnee'],\n ['leftKnee', 'leftAnkle'], ['nose', 'rightShoulder'],\n ['rightShoulder', 'rightElbow'], ['rightElbow', 'rightWrist'],\n ['rightShoulder', 'rightHip'], ['rightHip', 'rightKnee'],\n ['rightKnee', 'rightAnkle'],\n];\n\nexport function eitherPointDoesntMeetConfidence(a: number, b: number, minConfidence: number) {\n return (a < minConfidence || b < minConfidence);\n}\n\nexport function getAdjacentKeyPoints(keypoints, minConfidence: number) {\n return connectedPartIndices.reduce((result, [leftJoint, rightJoint]) => {\n if (eitherPointDoesntMeetConfidence(keypoints[leftJoint].score, keypoints[rightJoint].score, minConfidence)) {\n return result;\n }\n result.push([keypoints[leftJoint], keypoints[rightJoint]]);\n return result;\n }, []);\n}\n\nexport function getBoundingBox(keypoints): [number, number, number, number] {\n const coord = keypoints.reduce(({ maxX, maxY, minX, minY }, { position: { x, y } }) => ({\n maxX: Math.max(maxX, x),\n maxY: Math.max(maxY, y),\n minX: Math.min(minX, x),\n minY: Math.min(minY, y),\n }), {\n maxX: Number.NEGATIVE_INFINITY,\n maxY: Number.NEGATIVE_INFINITY,\n minX: Number.POSITIVE_INFINITY,\n minY: Number.POSITIVE_INFINITY,\n });\n return [coord.minX, coord.minY, coord.maxX - coord.minX, coord.maxY - coord.minY];\n}\n\nexport function scalePoses(poses, [height, width], [inputResolutionHeight, inputResolutionWidth]): Array {\n const scaleY = height / inputResolutionHeight;\n const scaleX = width / inputResolutionWidth;\n const scalePose = (pose, i): BodyResult => ({\n id: i,\n score: pose.score,\n boxRaw: [pose.box[0] / inputResolutionWidth, pose.box[1] / inputResolutionHeight, pose.box[2] / inputResolutionWidth, pose.box[3] / inputResolutionHeight],\n box: [Math.trunc(pose.box[0] * scaleX), Math.trunc(pose.box[1] * scaleY), Math.trunc(pose.box[2] * scaleX), Math.trunc(pose.box[3] * scaleY)],\n keypoints: pose.keypoints.map(({ score, part, position }) => ({\n score: score as number,\n part: part as BodyLandmark,\n position: [Math.trunc(position.x * scaleX), Math.trunc(position.y * scaleY)] as Point,\n positionRaw: [position.x / inputResolutionHeight, position.y / inputResolutionHeight] as Point,\n })),\n annotations: {} as Record,\n });\n const scaledPoses = poses.map((pose, i) => scalePose(pose, i));\n return scaledPoses;\n}\n\n// algorithm based on Coursera Lecture from Algorithms, Part 1: https://www.coursera.org/learn/algorithms-part1/lecture/ZjoSM/heapsort\nexport class MaxHeap {\n priorityQueue: Array; // don't touch\n numberOfElements: number;\n getElementValue: unknown; // function call\n\n constructor(maxSize, getElementValue) {\n this.priorityQueue = new Array(maxSize);\n this.numberOfElements = -1;\n this.getElementValue = getElementValue;\n }\n\n enqueue(x) {\n this.priorityQueue[++this.numberOfElements] = x;\n this.swim(this.numberOfElements);\n }\n\n dequeue() {\n const max = this.priorityQueue[0];\n this.exchange(0, this.numberOfElements--);\n this.sink(0);\n this.priorityQueue[this.numberOfElements + 1] = null;\n return max;\n }\n\n empty() { return this.numberOfElements === -1; }\n\n size() { return this.numberOfElements + 1; }\n\n all() { return this.priorityQueue.slice(0, this.numberOfElements + 1); }\n\n max() { return this.priorityQueue[0]; }\n\n swim(k) {\n while (k > 0 && this.less(Math.floor(k / 2), k)) {\n this.exchange(k, Math.floor(k / 2));\n k = Math.floor(k / 2);\n }\n }\n\n sink(k) {\n while (2 * k <= this.numberOfElements) {\n let j = 2 * k;\n if (j < this.numberOfElements && this.less(j, j + 1)) j++;\n if (!this.less(k, j)) break;\n this.exchange(k, j);\n k = j;\n }\n }\n\n getValueAt(i) {\n // @ts-ignore getter is of unknown type\n return this.getElementValue(this.priorityQueue[i]);\n }\n\n less(i, j) {\n return this.getValueAt(i) < this.getValueAt(j);\n }\n\n exchange(i, j) {\n const t = this.priorityQueue[i];\n this.priorityQueue[i] = this.priorityQueue[j];\n this.priorityQueue[j] = t;\n }\n}\n\nexport function getOffsetPoint(y, x, keypoint, offsets) {\n return {\n y: offsets.get(y, x, keypoint),\n x: offsets.get(y, x, keypoint + count),\n };\n}\n\nexport function getImageCoords(part, outputStride, offsets) {\n const { heatmapY, heatmapX, id: keypoint } = part;\n const { y, x } = getOffsetPoint(heatmapY, heatmapX, keypoint, offsets);\n return {\n x: part.heatmapX * outputStride + x,\n y: part.heatmapY * outputStride + y,\n };\n}\n\nexport function fillArray(element, size) {\n const result = new Array(size);\n for (let i = 0; i < size; i++) {\n result[i] = element;\n }\n return result;\n}\n\nexport function clamp(a, min, max) {\n if (a < min) return min;\n if (a > max) return max;\n return a;\n}\n\nexport function squaredDistance(y1, x1, y2, x2) {\n const dy = y2 - y1;\n const dx = x2 - x1;\n return dy * dy + dx * dx;\n}\n\nexport function addVectors(a, b) {\n return { x: a.x + b.x, y: a.y + b.y };\n}\n\nexport function clampVector(a, min, max) {\n return { y: clamp(a.y, min, max), x: clamp(a.x, min, max) };\n}\n", "/**\n * PoseNet body detection model implementation\n *\n * Based on: [**PoseNet**](https://medium.com/tensorflow/real-time-human-pose-estimation-in-the-browser-with-tensorflow-js-7dd0bc881cd5)\n */\n\nimport { log } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport type { BodyResult, BodyLandmark, Box } from '../result';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\nimport * as utils from './posenetutils';\n\nlet model: GraphModel;\nconst poseNetOutputs = ['MobilenetV1/offset_2/BiasAdd'/* offsets */, 'MobilenetV1/heatmap_2/BiasAdd'/* heatmapScores */, 'MobilenetV1/displacement_fwd_2/BiasAdd'/* displacementFwd */, 'MobilenetV1/displacement_bwd_2/BiasAdd'/* displacementBwd */];\nconst localMaximumRadius = 1;\nconst outputStride = 16;\nconst squaredNmsRadius = 50 ** 2;\n\nfunction traverse(edgeId, sourceKeypoint, targetId, scores, offsets, displacements, offsetRefineStep = 2) {\n const getDisplacement = (point) => ({\n y: displacements.get(point.y, point.x, edgeId),\n x: displacements.get(point.y, point.x, (displacements.shape[2] / 2) + edgeId),\n });\n const getStridedIndexNearPoint = (point, height, width) => ({\n y: utils.clamp(Math.round(point.y / outputStride), 0, height - 1),\n x: utils.clamp(Math.round(point.x / outputStride), 0, width - 1),\n });\n\n const [height, width] = scores.shape;\n // Nearest neighbor interpolation for the source->target displacements.\n const sourceKeypointIndices = getStridedIndexNearPoint(sourceKeypoint.position, height, width);\n const displacement = getDisplacement(sourceKeypointIndices);\n const displacedPoint = utils.addVectors(sourceKeypoint.position, displacement);\n let targetKeypoint = displacedPoint;\n for (let i = 0; i < offsetRefineStep; i++) {\n const targetKeypointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);\n const offsetPoint = utils.getOffsetPoint(targetKeypointIndices.y, targetKeypointIndices.x, targetId, offsets);\n targetKeypoint = utils.addVectors(\n { x: targetKeypointIndices.x * outputStride, y: targetKeypointIndices.y * outputStride },\n { x: offsetPoint.x, y: offsetPoint.y },\n );\n }\n const targetKeyPointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);\n const score = scores.get(targetKeyPointIndices.y, targetKeyPointIndices.x, targetId);\n return { position: targetKeypoint, part: utils.partNames[targetId], score };\n}\n\nexport function decodePose(root, scores, offsets, displacementsFwd, displacementsBwd) {\n const tuples = utils.poseChain.map(([parentJoinName, childJoinName]) => ([utils.partIds[parentJoinName], utils.partIds[childJoinName]]));\n const edgesFwd = tuples.map(([, childJointId]) => childJointId);\n const edgesBwd = tuples.map(([parentJointId]) => parentJointId);\n const numParts = scores.shape[2]; // [21,21,17]\n const numEdges = edgesFwd.length;\n const keypoints = new Array(numParts);\n // Start a new detection instance at the position of the root.\n const rootPoint = utils.getImageCoords(root.part, outputStride, offsets);\n keypoints[root.part.id] = {\n score: root.score,\n part: utils.partNames[root.part.id] as BodyLandmark,\n position: rootPoint,\n };\n // Decode the part positions upwards in the tree, following the backward displacements.\n for (let edge = numEdges - 1; edge >= 0; --edge) {\n const sourceId = edgesFwd[edge];\n const targetId = edgesBwd[edge];\n if (keypoints[sourceId] && !keypoints[targetId]) {\n keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsBwd);\n }\n }\n // Decode the part positions downwards in the tree, following the forward displacements.\n for (let edge = 0; edge < numEdges; ++edge) {\n const sourceId = edgesBwd[edge];\n const targetId = edgesFwd[edge];\n if (keypoints[sourceId] && !keypoints[targetId]) {\n keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsFwd);\n }\n }\n return keypoints;\n}\n\nfunction scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores) {\n const [height, width] = scores.shape;\n let localMaximum = true;\n const yStart = Math.max(heatmapY - localMaximumRadius, 0);\n const yEnd = Math.min(heatmapY + localMaximumRadius + 1, height);\n for (let yCurrent = yStart; yCurrent < yEnd; ++yCurrent) {\n const xStart = Math.max(heatmapX - localMaximumRadius, 0);\n const xEnd = Math.min(heatmapX + localMaximumRadius + 1, width);\n for (let xCurrent = xStart; xCurrent < xEnd; ++xCurrent) {\n if (scores.get(yCurrent, xCurrent, keypointId) > score) {\n localMaximum = false;\n break;\n }\n }\n if (!localMaximum) break;\n }\n return localMaximum;\n}\n\nexport function buildPartWithScoreQueue(minConfidence, scores) {\n const [height, width, numKeypoints] = scores.shape;\n const queue = new utils.MaxHeap(height * width * numKeypoints, ({ score }) => score);\n for (let heatmapY = 0; heatmapY < height; ++heatmapY) {\n for (let heatmapX = 0; heatmapX < width; ++heatmapX) {\n for (let keypointId = 0; keypointId < numKeypoints; ++keypointId) {\n const score = scores.get(heatmapY, heatmapX, keypointId);\n // Only consider parts with score greater or equal to threshold as root candidates.\n if (score < minConfidence) continue;\n // Only consider keypoints whose score is maximum in a local window.\n if (scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores)) queue.enqueue({ score, part: { heatmapY, heatmapX, id: keypointId } });\n }\n }\n }\n return queue;\n}\n\nfunction withinRadius(poses, { x, y }, keypointId) {\n return poses.some(({ keypoints }) => {\n const correspondingKeypoint = keypoints[keypointId]?.position;\n if (!correspondingKeypoint) return false;\n return utils.squaredDistance(y, x, correspondingKeypoint.y, correspondingKeypoint.x) <= squaredNmsRadius;\n });\n}\n\nfunction getInstanceScore(existingPoses, keypoints) {\n const notOverlappedKeypointScores = keypoints.reduce((result, { position, score }, keypointId) => {\n if (!withinRadius(existingPoses, position, keypointId)) result += score;\n return result;\n }, 0.0);\n return notOverlappedKeypointScores / keypoints.length;\n}\n\nexport function decode(offsets, scores, displacementsFwd, displacementsBwd, maxDetected, minConfidence) {\n const poses: Array<{ keypoints, box: Box, score: number }> = [];\n const queue = buildPartWithScoreQueue(minConfidence, scores);\n // Generate at most maxDetected object instances per image in decreasing root part score order.\n while (poses.length < maxDetected && !queue.empty()) {\n // The top element in the queue is the next root candidate.\n const root = queue.dequeue();\n // Part-based non-maximum suppression: We reject a root candidate if it is within a disk of `nmsRadius` pixels from the corresponding part of a previously detected instance.\n // @ts-ignore this one is tree walk\n const rootImageCoords = utils.getImageCoords(root.part, outputStride, offsets);\n // @ts-ignore this one is tree walk\n if (withinRadius(poses, rootImageCoords, root.part.id)) continue;\n // Else start a new detection instance at the position of the root.\n let keypoints = decodePose(root, scores, offsets, displacementsFwd, displacementsBwd);\n keypoints = keypoints.filter((a) => a.score > minConfidence);\n const score = getInstanceScore(poses, keypoints);\n const box = utils.getBoundingBox(keypoints);\n if (score > minConfidence) poses.push({ keypoints, box, score: Math.round(100 * score) / 100 });\n }\n return poses;\n}\n\nexport async function predict(input: Tensor, config: Config): Promise {\n /** posenet is mostly obsolete\n * caching is not implemented\n */\n const res = tf.tidy(() => {\n if (!model.inputs[0].shape) return [];\n const resized = tf.image.resizeBilinear(input, [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n const normalized = tf.sub(tf.div(tf.cast(resized, 'float32'), 127.5), 1.0);\n const results: Array = model.execute(normalized, poseNetOutputs) as Array;\n const results3d = results.map((y) => tf.squeeze(y, [0]));\n results3d[1] = tf.sigmoid(results3d[1]); // apply sigmoid on scores\n return results3d;\n });\n\n const buffers = await Promise.all(res.map((tensor: Tensor) => tensor.buffer()));\n for (const t of res) tf.dispose(t);\n\n const decoded = await decode(buffers[0], buffers[1], buffers[2], buffers[3], config.body.maxDetected, config.body.minConfidence);\n if (!model.inputs[0].shape) return [];\n const scaled = utils.scalePoses(decoded, [input.shape[1], input.shape[2]], [model.inputs[0].shape[2], model.inputs[0].shape[1]]) as BodyResult[];\n return scaled;\n}\n\nexport async function load(config: Config): Promise {\n if (!model || env.initial) model = await loadModel(config.body.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n", "/**\n * Image segmentation for body detection model\n *\n * Based on:\n * - [**MediaPipe Meet**](https://drive.google.com/file/d/1lnP1bRi9CSqQQXUHa13159vLELYDgDu0/preview)\n * - [**MediaPipe Selfie**](https://drive.google.com/file/d/1dCfozqknMa068vVsO2j_1FgZkW_e3VWv/preview)\n */\n\nimport { log } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport * as image from '../image/image';\nimport { constants } from '../tfjs/constants';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\nimport type { Input, AnyCanvas } from '../exports';\n\nlet model: GraphModel;\nlet busy = false;\n\nexport async function load(config: Config): Promise {\n if (!model || env.initial) model = await loadModel(config.segmentation.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function process(input: Input, background: Input | undefined, config: Config)\n: Promise<{ data: Array | Tensor, canvas: AnyCanvas | null, alpha: AnyCanvas | null }> {\n if (busy) return { data: [], canvas: null, alpha: null };\n busy = true;\n if (!model) await load(config);\n const inputImage = await image.process(input, config);\n const width = inputImage.tensor?.shape[2] || 0;\n const height = inputImage.tensor?.shape[1] || 0;\n if (!inputImage.tensor) return { data: [], canvas: null, alpha: null };\n const t: Record = {};\n\n t.resize = tf.image.resizeBilinear(inputImage.tensor, [model.inputs[0].shape ? model.inputs[0].shape[1] : 0, model.inputs[0].shape ? model.inputs[0].shape[2] : 0], false);\n tf.dispose(inputImage.tensor);\n t.norm = tf.div(t.resize, constants.tf255);\n t.res = model.execute(t.norm) as Tensor;\n\n t.squeeze = tf.squeeze(t.res, 0); // meet.shape:[1,256,256,1], selfie.shape:[1,144,256,2]\n if (t.squeeze.shape[2] === 2) {\n t.softmax = tf.softmax(t.squeeze); // model meet has two channels for fg and bg\n [t.bg, t.fg] = tf.unstack(t.softmax, 2);\n t.expand = tf.expandDims(t.fg, 2);\n t.pad = tf.expandDims(t.expand, 0);\n t.crop = tf.image.cropAndResize(t.pad, [[0, 0, 0.5, 0.5]], [0], [width, height]);\n // running sofmax before unstack creates 2x2 matrix so we only take upper-left quadrant\n // otherwise run softmax after unstack and use standard resize\n // resizeOutput = tf.image.resizeBilinear(expand, [input.tensor?.shape[1], input.tensor?.shape[2]]);\n t.data = tf.squeeze(t.crop, 0);\n } else {\n t.data = tf.image.resizeBilinear(t.squeeze, [height, width]); // model selfie has a single channel that we can use directly\n }\n const data = Array.from(await t.data.data()) as number[];\n\n if (env.node && !env.Canvas && (typeof ImageData === 'undefined')) {\n if (config.debug) log('canvas support missing');\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return { data, canvas: null, alpha: null }; // running in nodejs so return alpha array as-is\n }\n\n const alphaCanvas = image.canvas(width, height);\n // @ts-ignore browser is not defined in tfjs-node\n if (tf.browser) await tf.browser.toPixels(t.data, alphaCanvas);\n const alphaCtx = alphaCanvas.getContext('2d') as CanvasRenderingContext2D;\n if (config.segmentation.blur && config.segmentation.blur > 0) alphaCtx.filter = `blur(${config.segmentation.blur}px)`; // use css filter for bluring, can be done with gaussian blur manually instead\n const alphaData = alphaCtx.getImageData(0, 0, width, height);\n\n const compositeCanvas = image.canvas(width, height);\n const compositeCtx = compositeCanvas.getContext('2d') as CanvasRenderingContext2D;\n if (inputImage.canvas) compositeCtx.drawImage(inputImage.canvas, 0, 0);\n compositeCtx.globalCompositeOperation = 'darken'; // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation // best options are: darken, color-burn, multiply\n if (config.segmentation.blur && config.segmentation.blur > 0) compositeCtx.filter = `blur(${config.segmentation.blur}px)`; // use css filter for bluring, can be done with gaussian blur manually instead\n compositeCtx.drawImage(alphaCanvas, 0, 0);\n compositeCtx.globalCompositeOperation = 'source-over'; // reset composite operation\n compositeCtx.filter = 'none'; // reset css filter\n const compositeData = compositeCtx.getImageData(0, 0, width, height);\n for (let i = 0; i < width * height; i++) compositeData.data[4 * i + 3] = alphaData.data[4 * i + 0]; // copy original alpha value to new composite canvas\n compositeCtx.putImageData(compositeData, 0, 0);\n\n let mergedCanvas: AnyCanvas | null = null;\n if (background && compositeCanvas) { // draw background with segmentation as overlay if background is present\n mergedCanvas = image.canvas(width, height);\n const bgImage = await image.process(background, config);\n tf.dispose(bgImage.tensor);\n const ctxMerge = mergedCanvas.getContext('2d') as CanvasRenderingContext2D;\n ctxMerge.drawImage(bgImage.canvas as HTMLCanvasElement, 0, 0, mergedCanvas.width, mergedCanvas.height);\n ctxMerge.drawImage(compositeCanvas, 0, 0);\n }\n\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n busy = false;\n // return { data, canvas: mergedCanvas || compositeCanvas, alpha: alphaCanvas };\n return { data, canvas: compositeCanvas, alpha: alphaCanvas };\n}\n", "/**\n * Loader and Validator for all models used by Human\n */\n\nimport { env } from './util/env';\nimport { log } from './util/util';\nimport * as gear from './gear/gear';\nimport * as ssrnetAge from './gear/ssrnet-age';\nimport * as ssrnetGender from './gear/ssrnet-gender';\nimport * as antispoof from './face/antispoof';\nimport * as blazeface from './face/blazeface';\nimport * as blazepose from './body/blazepose';\nimport * as centernet from './object/centernet';\nimport * as efficientpose from './body/efficientpose';\nimport * as emotion from './gear/emotion';\nimport * as mobilefacenet from './face/mobilefacenet';\nimport * as facemesh from './face/facemesh';\nimport * as faceres from './face/faceres';\nimport * as handpose from './hand/handpose';\nimport * as handtrack from './hand/handtrack';\nimport * as iris from './face/iris';\nimport * as liveness from './face/liveness';\nimport * as movenet from './body/movenet';\nimport * as nanodet from './object/nanodet';\nimport * as posenet from './body/posenet';\nimport * as segmentation from './segmentation/segmentation';\nimport type { GraphModel } from './tfjs/types';\nimport type { Human } from './human';\n\n/** Instances of all possible TFJS Graph Models used by Human\n * - loaded as needed based on configuration\n * - initialized explictly with `human.load()` method\n * - initialized implicity on first call to `human.detect()`\n * - each model can be `null` if not loaded, instance of `GraphModel` if loaded or `Promise` if loading\n */\nexport class Models {\n ssrnetage: null | GraphModel | Promise = null;\n gear: null | GraphModel | Promise = null;\n blazeposedetect: null | GraphModel | Promise = null;\n blazepose: null | GraphModel | Promise = null;\n centernet: null | GraphModel | Promise = null;\n efficientpose: null | GraphModel | Promise = null;\n mobilefacenet: null | GraphModel | Promise = null;\n emotion: null | GraphModel | Promise = null;\n facedetect: null | GraphModel | Promise = null;\n faceiris: null | GraphModel | Promise = null;\n facemesh: null | GraphModel | Promise = null;\n faceres: null | GraphModel | Promise = null;\n ssrnetgender: null | GraphModel | Promise = null;\n handpose: null | GraphModel | Promise = null;\n handskeleton: null | GraphModel | Promise = null;\n handtrack: null | GraphModel | Promise = null;\n liveness: null | GraphModel | Promise = null;\n movenet: null | GraphModel | Promise = null;\n nanodet: null | GraphModel | Promise = null;\n posenet: null | GraphModel | Promise = null;\n segmentation: null | GraphModel | Promise = null;\n antispoof: null | GraphModel | Promise = null;\n}\n\nexport function reset(instance: Human): void {\n // if (instance.config.debug) log('resetting loaded models');\n for (const model of Object.keys(instance.models)) instance.models[model as keyof Models] = null;\n}\n\n/** Load method preloads all instance.configured models on-demand */\nexport async function load(instance: Human): Promise {\n if (env.initial) reset(instance);\n if (instance.config.hand.enabled) { // handpose model is a combo that must be loaded as a whole\n if (!instance.models.handpose && instance.config.hand.detector?.modelPath?.includes('handdetect')) [instance.models.handpose, instance.models.handskeleton] = await handpose.load(instance.config);\n if (!instance.models.handskeleton && instance.config.hand.landmarks && instance.config.hand.detector?.modelPath?.includes('handdetect')) [instance.models.handpose, instance.models.handskeleton] = await handpose.load(instance.config);\n }\n if (instance.config.body.enabled && !instance.models.blazepose && instance.config.body?.modelPath?.includes('blazepose')) instance.models.blazepose = blazepose.loadPose(instance.config);\n // @ts-ignore optional model\n if (instance.config.body.enabled && !instance.models.blazeposedetect && instance.config.body['detector'] && instance.config.body['detector']['modelPath']) instance.models.blazeposedetect = blazepose.loadDetect(instance.config);\n if (instance.config.body.enabled && !instance.models.efficientpose && instance.config.body?.modelPath?.includes('efficientpose')) instance.models.efficientpose = efficientpose.load(instance.config);\n if (instance.config.body.enabled && !instance.models.movenet && instance.config.body?.modelPath?.includes('movenet')) instance.models.movenet = movenet.load(instance.config);\n if (instance.config.body.enabled && !instance.models.posenet && instance.config.body?.modelPath?.includes('posenet')) instance.models.posenet = posenet.load(instance.config);\n if (instance.config.face.enabled && !instance.models.facedetect) instance.models.facedetect = blazeface.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.antispoof?.enabled && !instance.models.antispoof) instance.models.antispoof = antispoof.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.liveness?.enabled && !instance.models.liveness) instance.models.liveness = liveness.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.description?.enabled && !instance.models.faceres) instance.models.faceres = faceres.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.emotion?.enabled && !instance.models.emotion) instance.models.emotion = emotion.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.iris?.enabled && !instance.models.faceiris) instance.models.faceiris = iris.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.mesh?.enabled && !instance.models.facemesh) instance.models.facemesh = facemesh.load(instance.config);\n // @ts-ignore optional model\n if (instance.config.face.enabled && instance.config.face['gear']?.enabled && !instance.models.gear) instance.models.gear = gear.load(instance.config);\n // @ts-ignore optional model\n if (instance.config.face.enabled && instance.config.face['ssrnet']?.enabled && !instance.models.ssrnetage) instance.models.ssrnetage = ssrnetAge.load(instance.config);\n // @ts-ignore optional model\n if (instance.config.face.enabled && instance.config.face['ssrnet']?.enabled && !instance.models.ssrnetgender) instance.models.ssrnetgender = ssrnetGender.load(instance.config);\n // @ts-ignore optional model\n if (instance.config.face.enabled && instance.config.face['mobilefacenet']?.enabled && !instance.models.mobilefacenet) instance.models.mobilefacenet = mobilefacenet.load(instance.config);\n if (instance.config.hand.enabled && !instance.models.handtrack && instance.config.hand.detector?.modelPath?.includes('handtrack')) instance.models.handtrack = handtrack.loadDetect(instance.config);\n if (instance.config.hand.enabled && instance.config.hand.landmarks && !instance.models.handskeleton && instance.config.hand.detector?.modelPath?.includes('handtrack')) instance.models.handskeleton = handtrack.loadSkeleton(instance.config);\n if (instance.config.object.enabled && !instance.models.centernet && instance.config.object?.modelPath?.includes('centernet')) instance.models.centernet = centernet.load(instance.config);\n if (instance.config.object.enabled && !instance.models.nanodet && instance.config.object?.modelPath?.includes('nanodet')) instance.models.nanodet = nanodet.load(instance.config);\n if (instance.config.segmentation.enabled && !instance.models.segmentation) instance.models.segmentation = segmentation.load(instance.config);\n\n // models are loaded in parallel asynchronously so lets wait until they are actually loaded\n for await (const model of Object.keys(instance.models)) {\n if (instance.models[model as keyof Models] && typeof instance.models[model as keyof Models] !== 'undefined') instance.models[model as keyof Models] = await instance.models[model as keyof Models];\n }\n}\n\nexport async function validate(instance: Human): Promise {\n interface Op { name: string, category: string, op: string }\n const simpleOps = ['const', 'placeholder', 'noop', 'pad', 'squeeze', 'add', 'sub', 'mul', 'div'];\n for (const defined of Object.keys(instance.models)) {\n const model: GraphModel | null = instance.models[defined as keyof Models] as GraphModel | null;\n if (!model) continue;\n const ops: string[] = [];\n // @ts-ignore // executor is a private method\n const executor = model?.executor;\n if (executor && executor.graph.nodes) {\n for (const kernel of Object.values(executor.graph.nodes)) {\n const op = (kernel as Op).op.toLowerCase();\n if (!ops.includes(op)) ops.push(op);\n }\n } else {\n if (!executor && instance.config.debug) log('model signature not determined:', defined);\n }\n const missing: string[] = [];\n for (const op of ops) {\n if (!simpleOps.includes(op) // exclude simple ops\n && !instance.env.kernels.includes(op) // check actual kernel ops\n && !instance.env.kernels.includes(op.replace('_', '')) // check variation without _\n && !instance.env.kernels.includes(op.replace('native', '')) // check standard variation\n && !instance.env.kernels.includes(op.replace('v2', ''))) { // check non-versioned variation\n missing.push(op);\n }\n }\n // log('model validation ops:', defined, ops);\n if (instance.config.debug && missing.length > 0) log('model validation failed:', defined, missing);\n }\n}\n", "/** TFJS custom backend registration */\n\nimport type { Human } from '../human';\nimport { log } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as image from '../image/image';\nimport * as models from '../models';\nimport type { AnyCanvas } from '../exports';\n// import { env } from '../env';\n\nexport const config = {\n name: 'humangl',\n priority: 999,\n canvas: null,\n gl: null,\n extensions: [],\n webGLattr: { // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.2\n alpha: false,\n antialias: false,\n premultipliedAlpha: false,\n preserveDrawingBuffer: false,\n depth: false,\n stencil: false,\n failIfMajorPerformanceCaveat: false,\n desynchronized: true,\n },\n};\n\nfunction extensions(): void {\n /*\n https://www.khronos.org/registry/webgl/extensions/\n https://webglreport.com/?v=2\n */\n const gl = config.gl;\n if (!gl) return;\n config.extensions = gl.getSupportedExtensions() as string[];\n // gl.getExtension('KHR_parallel_shader_compile');\n}\n\n/**\n * Registers custom WebGL2 backend to be used by Human library\n *\n * @returns void\n */\nexport async function register(instance: Human): Promise {\n // force backend reload if gl context is not valid\n if (instance.config.backend !== 'humangl') return;\n if ((config.name in tf.engine().registry) && (!config.gl || !config.gl.getParameter(config.gl.VERSION))) {\n log('error: humangl backend invalid context');\n models.reset(instance);\n /*\n log('resetting humangl backend');\n await tf.removeBackend(config.name);\n await register(instance); // re-register\n */\n }\n if (!tf.findBackend(config.name)) {\n try {\n config.canvas = await image.canvas(100, 100);\n } catch (err) {\n log('error: cannot create canvas:', err);\n return;\n }\n try {\n config.gl = config.canvas?.getContext('webgl2', config.webGLattr) as WebGL2RenderingContext;\n const glv2 = config.gl.getParameter(config.gl.VERSION).includes('2.0');\n if (!glv2) {\n log('override: using fallback webgl backend as webgl 2.0 is not detected');\n instance.config.backend = 'webgl';\n return;\n }\n if (config.canvas) {\n config.canvas.addEventListener('webglcontextlost', async (e) => {\n log('error: humangl:', e.type);\n log('possible browser memory leak using webgl or conflict with multiple backend registrations');\n instance.emit('error');\n throw new Error('backend error: webgl context lost');\n // log('resetting humangl backend');\n // env.initial = true;\n // models.reset(instance);\n // await tf.removeBackend(config.name);\n // await register(instance); // re-register\n });\n config.canvas.addEventListener('webglcontextrestored', (e) => {\n log('error: humangl context restored:', e);\n });\n config.canvas.addEventListener('webglcontextcreationerror', (e) => {\n log('error: humangl context create:', e);\n });\n }\n } catch (err) {\n log('error: cannot get WebGL context:', err);\n return;\n }\n try {\n tf.setWebGLContext(2, config.gl);\n } catch (err) {\n log('error: cannot set WebGL context:', err);\n return;\n }\n try {\n const ctx = new tf.GPGPUContext(config.gl);\n tf.registerBackend(config.name, () => new tf.MathBackendWebGL(ctx), config.priority);\n } catch (err) {\n log('error: cannot register WebGL backend:', err);\n return;\n }\n try {\n const kernels = tf.getKernelsForBackend('webgl');\n kernels.forEach((kernelConfig) => {\n const newKernelConfig = { ...kernelConfig, backendName: config.name };\n tf.registerKernel(newKernelConfig);\n });\n } catch (err) {\n log('error: cannot update WebGL backend registration:', err);\n return;\n }\n const current = tf.backend().getGPGPUContext ? tf.backend().getGPGPUContext().gl : null;\n if (current) {\n log(`humangl webgl version:${current.getParameter(current.VERSION)} renderer:${current.getParameter(current.RENDERER)}`);\n } else {\n log('error: no current gl context:', current, config.gl);\n return;\n }\n try {\n tf.ENV.set('WEBGL_VERSION', 2);\n } catch (err) {\n log('error: cannot set WebGL backend flags:', err);\n return;\n }\n extensions();\n log('backend registered:', config.name);\n }\n}\n", "/** TFJS backend initialization and customization */\n\nimport type { Human } from '../human';\nimport { log, now } from '../util/util';\nimport { env } from '../util/env';\nimport * as humangl from './humangl';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as constants from './constants';\n\nfunction registerCustomOps() {\n if (!env.kernels.includes('mod')) {\n const kernelMod = {\n kernelName: 'Mod',\n backendName: tf.getBackend(),\n kernelFunc: (op) => tf.tidy(() => tf.sub(op.inputs.a, tf.mul(tf.div(op.inputs.a, op.inputs.b), op.inputs.b))),\n };\n tf.registerKernel(kernelMod);\n env.kernels.push('mod');\n }\n if (!env.kernels.includes('floormod')) {\n const kernelMod = {\n kernelName: 'FloorMod',\n backendName: tf.getBackend(),\n kernelFunc: (op) => tf.tidy(() => tf.floorDiv(op.inputs.a / op.inputs.b) * op.inputs.b + tf.mod(op.inputs.a, op.inputs.b)),\n };\n tf.registerKernel(kernelMod);\n env.kernels.push('floormod');\n }\n}\n\nexport async function check(instance: Human, force = false) {\n instance.state = 'backend';\n if (force || env.initial || (instance.config.backend && (instance.config.backend.length > 0) && (tf.getBackend() !== instance.config.backend))) {\n const timeStamp = now();\n\n if (instance.config.backend && instance.config.backend.length > 0) {\n // detect web worker\n // @ts-ignore ignore missing type for WorkerGlobalScope as that is the point\n if (typeof window === 'undefined' && typeof WorkerGlobalScope !== 'undefined' && instance.config.debug) {\n if (instance.config.debug) log('running inside web worker');\n }\n\n // force browser vs node backend\n if (env.browser && instance.config.backend === 'tensorflow') {\n if (instance.config.debug) log('override: backend set to tensorflow while running in browser');\n instance.config.backend = 'humangl';\n }\n if (env.node && (instance.config.backend === 'webgl' || instance.config.backend === 'humangl')) {\n if (instance.config.debug) log(`override: backend set to ${instance.config.backend} while running in nodejs`);\n instance.config.backend = 'tensorflow';\n }\n\n // handle webgpu\n if (env.browser && instance.config.backend === 'webgpu') {\n if (typeof navigator === 'undefined' || typeof navigator['gpu'] === 'undefined') {\n log('override: backend set to webgpu but browser does not support webgpu');\n instance.config.backend = 'humangl';\n } else {\n const adapter = await navigator['gpu'].requestAdapter();\n if (instance.config.debug) log('enumerated webgpu adapter:', adapter);\n }\n }\n\n // check available backends\n if (instance.config.backend === 'humangl') await humangl.register(instance);\n const available = Object.keys(tf.engine().registryFactory);\n if (instance.config.debug) log('available backends:', available);\n\n if (!available.includes(instance.config.backend)) {\n log(`error: backend ${instance.config.backend} not found in registry`);\n instance.config.backend = env.node ? 'tensorflow' : 'webgl';\n if (instance.config.debug) log(`override: setting backend ${instance.config.backend}`);\n }\n\n if (instance.config.debug) log('setting backend:', instance.config.backend);\n\n // customize wasm\n if (instance.config.backend === 'wasm') {\n if (instance.config.debug) log('wasm path:', instance.config.wasmPath);\n if (typeof tf?.setWasmPaths !== 'undefined') await tf.setWasmPaths(instance.config.wasmPath, instance.config.wasmPlatformFetch);\n else throw new Error('backend error: attempting to use wasm backend but wasm path is not set');\n const simd = await tf.env().getAsync('WASM_HAS_SIMD_SUPPORT');\n const mt = await tf.env().getAsync('WASM_HAS_MULTITHREAD_SUPPORT');\n if (instance.config.debug) log(`wasm execution: ${simd ? 'SIMD' : 'no SIMD'} ${mt ? 'multithreaded' : 'singlethreaded'}`);\n if (instance.config.debug && !simd) log('warning: wasm simd support is not enabled');\n }\n\n try {\n await tf.setBackend(instance.config.backend);\n await tf.ready();\n constants.init();\n } catch (err) {\n log('error: cannot set backend:', instance.config.backend, err);\n return false;\n }\n }\n\n // customize humangl\n if (tf.getBackend() === 'humangl') {\n tf.ENV.set('CHECK_COMPUTATION_FOR_ERRORS', false);\n tf.ENV.set('WEBGL_CPU_FORWARD', true);\n // tf.ENV.set('WEBGL_PACK_DEPTHWISECONV', false);\n tf.ENV.set('WEBGL_USE_SHAPES_UNIFORMS', true);\n tf.ENV.set('CPU_HANDOFF_SIZE_THRESHOLD', 256);\n // if (!instance.config.object.enabled) tf.ENV.set('WEBGL_FORCE_F16_TEXTURES', true); // safe to use 16bit precision\n if (typeof instance.config['deallocate'] !== 'undefined' && instance.config['deallocate']) { // hidden param\n log('changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:', true);\n tf.ENV.set('WEBGL_DELETE_TEXTURE_THRESHOLD', 0);\n }\n if (tf.backend().getGPGPUContext) {\n const gl = await tf.backend().getGPGPUContext().gl;\n if (instance.config.debug) log(`gl version:${gl.getParameter(gl.VERSION)} renderer:${gl.getParameter(gl.RENDERER)}`);\n }\n }\n\n // customize webgpu\n if (tf.getBackend() === 'webgpu') {\n // tf.ENV.set('WEBGPU_CPU_HANDOFF_SIZE_THRESHOLD', 512);\n // tf.ENV.set('WEBGPU_DEFERRED_SUBMIT_BATCH_SIZE', 0);\n // tf.ENV.set('WEBGPU_CPU_FORWARD', true);\n }\n\n // wait for ready\n tf.enableProdMode();\n await tf.ready();\n\n instance.performance.initBackend = Math.trunc(now() - timeStamp);\n instance.config.backend = tf.getBackend();\n\n await env.updateBackend(); // update env on backend init\n registerCustomOps();\n // await env.updateBackend(); // update env on backend init\n }\n return true;\n}\n\n// register fake missing tfjs ops\nexport function fakeOps(kernelNames: Array, config) {\n // if (config.debug) log('registerKernel:', kernelNames);\n for (const kernelName of kernelNames) {\n const kernelConfig = {\n kernelName,\n backendName: config.backend,\n kernelFunc: () => { if (config.debug) log('kernelFunc', kernelName, config.backend); },\n // setupFunc: () => { if (config.debug) log('kernelFunc', kernelName, config.backend); },\n // disposeFunc: () => { if (config.debug) log('kernelFunc', kernelName, config.backend); },\n };\n tf.registerKernel(kernelConfig);\n }\n env.kernels = tf.getKernelsForBackend(tf.getBackend()).map((kernel) => kernel.kernelName.toLowerCase()); // re-scan registered ops\n}\n", "/**\n * Module that implements helper draw functions, exposed as human.draw\n */\n\nimport { TRI468 as triangulation } from '../face/facemeshcoords';\nimport { mergeDeep, now, log } from './util';\nimport { env } from './env';\nimport type { Result, FaceResult, BodyResult, HandResult, ObjectResult, GestureResult, PersonResult, Point } from '../result';\nimport type { AnyCanvas } from '../exports';\n\n/** Draw Options\n * - Accessed via `human.draw.options` or provided per each draw method as the drawOptions optional parameter\n */\nexport type DrawOptions = {\n /** draw line color */\n color: string,\n /** label color */\n labelColor: string,\n /** label shadow color */\n shadowColor: string,\n /** label font */\n font: string,\n /** line spacing between labels */\n lineHeight: number,\n /** line width for drawn lines */\n lineWidth: number,\n /** size of drawn points */\n pointSize: number,\n /** draw rounded boxes by n pixels */\n roundRect: number,\n /** should points be drawn? */\n drawPoints: boolean,\n /** should labels be drawn? */\n drawLabels: boolean,\n /** should detected gestures be drawn? */\n drawGestures: boolean,\n /** should draw boxes around detection results? */\n drawBoxes: boolean,\n /** should draw polygons from detection points? */\n drawPolygons: boolean,\n /** should draw gaze arrows? */\n drawGaze: boolean,\n /** should fill polygons? */\n fillPolygons: boolean,\n /** use z-coordinate when available */\n useDepth: boolean,\n /** should lines be curved? */\n useCurves: boolean,\n}\n\n/** currently set draw options {@link DrawOptions} */\nexport const options: DrawOptions = {\n color: 'rgba(173, 216, 230, 0.6)', // 'lightblue' with light alpha channel\n labelColor: 'rgba(173, 216, 230, 1)', // 'lightblue' with dark alpha channel\n shadowColor: 'black',\n font: 'small-caps 16px \"Segoe UI\"',\n lineHeight: 18,\n lineWidth: 4,\n pointSize: 2,\n roundRect: 8,\n drawPoints: false,\n drawLabels: true,\n drawBoxes: true,\n drawGestures: true,\n drawPolygons: true,\n drawGaze: true,\n fillPolygons: false,\n useDepth: true,\n useCurves: false,\n};\n\nlet drawTime = 0;\n\nconst getCanvasContext = (input: AnyCanvas) => {\n if (!input) log('draw error: invalid canvas');\n else if (!input.getContext) log('draw error: canvas context not defined');\n else {\n const ctx = input.getContext('2d');\n if (!ctx) log('draw error: cannot get canvas context');\n else return ctx;\n }\n return null;\n};\n\nconst rad2deg = (theta: number) => Math.round((theta * 180) / Math.PI);\n\nfunction point(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, x: number, y: number, z: number | undefined, localOptions: DrawOptions) {\n z = z || 0;\n ctx.fillStyle = localOptions.useDepth && z ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.3)` : localOptions.color;\n ctx.beginPath();\n ctx.arc(x, y, localOptions.pointSize, 0, 2 * Math.PI);\n ctx.fill();\n}\n\nfunction rect(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, x: number, y: number, width: number, height: number, localOptions: DrawOptions) {\n ctx.beginPath();\n ctx.lineWidth = localOptions.lineWidth;\n if (localOptions.useCurves) {\n const cx = (x + x + width) / 2;\n const cy = (y + y + height) / 2;\n ctx.ellipse(cx, cy, width / 2, height / 2, 0, 0, 2 * Math.PI);\n } else {\n ctx.moveTo(x + localOptions.roundRect, y);\n ctx.lineTo(x + width - localOptions.roundRect, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + localOptions.roundRect);\n ctx.lineTo(x + width, y + height - localOptions.roundRect);\n ctx.quadraticCurveTo(x + width, y + height, x + width - localOptions.roundRect, y + height);\n ctx.lineTo(x + localOptions.roundRect, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - localOptions.roundRect);\n ctx.lineTo(x, y + localOptions.roundRect);\n ctx.quadraticCurveTo(x, y, x + localOptions.roundRect, y);\n ctx.closePath();\n }\n ctx.stroke();\n}\n\nfunction lines(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, points: Point[], localOptions: DrawOptions) {\n if (points.length < 2) return;\n ctx.beginPath();\n ctx.moveTo(points[0][0], points[0][1]);\n for (const pt of points) {\n const z = pt[2] || 0;\n ctx.strokeStyle = localOptions.useDepth && z !== 0 ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.3)` : localOptions.color;\n ctx.fillStyle = localOptions.useDepth && z !== 0 ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.3)` : localOptions.color;\n ctx.lineTo(pt[0], Math.round(pt[1]));\n }\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.closePath();\n ctx.fill();\n }\n}\n\nfunction curves(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, points: Point[], localOptions: DrawOptions) {\n if (points.length < 2) return;\n ctx.lineWidth = localOptions.lineWidth;\n if (!localOptions.useCurves || points.length <= 2) {\n lines(ctx, points, localOptions);\n return;\n }\n ctx.moveTo(points[0][0], points[0][1]);\n for (let i = 0; i < points.length - 2; i++) {\n const xc = (points[i][0] + points[i + 1][0]) / 2;\n const yc = (points[i][1] + points[i + 1][1]) / 2;\n ctx.quadraticCurveTo(points[i][0], points[i][1], xc, yc);\n }\n ctx.quadraticCurveTo(points[points.length - 2][0], points[points.length - 2][1], points[points.length - 1][0], points[points.length - 1][1]);\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.closePath();\n ctx.fill();\n }\n}\n\nfunction arrow(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, from: Point, to: Point, radius = 5) {\n let angle;\n let x;\n let y;\n ctx.beginPath();\n ctx.moveTo(from[0], from[1]);\n ctx.lineTo(to[0], to[1]);\n angle = Math.atan2(to[1] - from[1], to[0] - from[0]);\n x = radius * Math.cos(angle) + to[0];\n y = radius * Math.sin(angle) + to[1];\n ctx.moveTo(x, y);\n angle += (1.0 / 3.0) * (2 * Math.PI);\n x = radius * Math.cos(angle) + to[0];\n y = radius * Math.sin(angle) + to[1];\n ctx.lineTo(x, y);\n angle += (1.0 / 3.0) * (2 * Math.PI);\n x = radius * Math.cos(angle) + to[0];\n y = radius * Math.sin(angle) + to[1];\n ctx.lineTo(x, y);\n ctx.closePath();\n ctx.stroke();\n ctx.fill();\n}\n\n/** draw detected gestures */\nexport async function gesture(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (localOptions.drawGestures) {\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n ctx.font = localOptions.font;\n ctx.fillStyle = localOptions.color;\n let i = 1;\n for (let j = 0; j < result.length; j++) {\n let where: unknown[] = []; // what&where is a record\n let what: unknown[] = []; // what&where is a record\n [where, what] = Object.entries(result[j]);\n if ((what.length > 1) && ((what[1] as string).length > 0)) {\n const who = where[1] as number > 0 ? `#${where[1]}` : '';\n const label = `${where[0]} ${who}: ${what[1]}`;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(label, 8, 2 + (i * localOptions.lineHeight));\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(label, 6, 0 + (i * localOptions.lineHeight));\n i += 1;\n }\n }\n }\n}\n\n/** draw detected faces */\nexport async function face(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n for (const f of result) {\n ctx.font = localOptions.font;\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n if (localOptions.drawBoxes) rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], localOptions);\n if (localOptions.drawLabels) {\n // silly hack since fillText does not suport new line\n const labels:string[] = [];\n labels.push(`face: ${Math.trunc(100 * f.score)}%`);\n if (f.genderScore) labels.push(`${f.gender || ''} ${Math.trunc(100 * f.genderScore)}%`);\n if (f.age) labels.push(`age: ${f.age || ''}`);\n if (f.iris) labels.push(`distance: ${f.iris}`);\n if (f.real) labels.push(`real: ${Math.trunc(100 * f.real)}%`);\n if (f.live) labels.push(`live: ${Math.trunc(100 * f.live)}%`);\n if (f.emotion && f.emotion.length > 0) {\n const emotion = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);\n if (emotion.length > 3) emotion.length = 3;\n labels.push(emotion.join(' '));\n }\n if (f.rotation && f.rotation.angle && f.rotation.gaze) {\n if (f.rotation.angle.roll) labels.push(`roll: ${rad2deg(f.rotation.angle.roll)}\u00B0 yaw:${rad2deg(f.rotation.angle.yaw)}\u00B0 pitch:${rad2deg(f.rotation.angle.pitch)}\u00B0`);\n if (f.rotation.gaze.bearing) labels.push(`gaze: ${rad2deg(f.rotation.gaze.bearing)}\u00B0`);\n }\n if (labels.length === 0) labels.push('face');\n ctx.fillStyle = localOptions.color;\n for (let i = labels.length - 1; i >= 0; i--) {\n const x = Math.max(f.box[0], 0);\n const y = i * localOptions.lineHeight + f.box[1];\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(labels[i], x + 5, y + 16);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(labels[i], x + 4, y + 15);\n }\n }\n // ctx.lineWidth = localOptions.lineWidth;\n ctx.lineWidth = 2;\n if (f.mesh && f.mesh.length > 0) {\n if (localOptions.drawPoints) {\n for (const pt of f.mesh) point(ctx, pt[0], pt[1], pt[2], localOptions);\n }\n if (localOptions.drawPolygons) {\n if (f.mesh.length > 450) {\n for (let i = 0; i < triangulation.length / 3; i++) {\n const points = [\n triangulation[i * 3 + 0],\n triangulation[i * 3 + 1],\n triangulation[i * 3 + 2],\n ].map((index) => f.mesh[index]);\n lines(ctx, points, localOptions);\n }\n }\n // iris: array[center, left, top, right, bottom]\n if (f.annotations && f.annotations['leftEyeIris'] && f.annotations['leftEyeIris'][0]) {\n ctx.strokeStyle = localOptions.useDepth ? 'rgba(255, 200, 255, 0.3)' : localOptions.color;\n ctx.beginPath();\n const sizeX = Math.abs(f.annotations['leftEyeIris'][3][0] - f.annotations['leftEyeIris'][1][0]) / 2;\n const sizeY = Math.abs(f.annotations['leftEyeIris'][4][1] - f.annotations['leftEyeIris'][2][1]) / 2;\n ctx.ellipse(f.annotations['leftEyeIris'][0][0], f.annotations['leftEyeIris'][0][1], sizeX, sizeY, 0, 0, 2 * Math.PI);\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.fillStyle = localOptions.useDepth ? 'rgba(255, 255, 200, 0.3)' : localOptions.color;\n ctx.fill();\n }\n }\n if (f.annotations && f.annotations['rightEyeIris'] && f.annotations['rightEyeIris'][0]) {\n ctx.strokeStyle = localOptions.useDepth ? 'rgba(255, 200, 255, 0.3)' : localOptions.color;\n ctx.beginPath();\n const sizeX = Math.abs(f.annotations['rightEyeIris'][3][0] - f.annotations['rightEyeIris'][1][0]) / 2;\n const sizeY = Math.abs(f.annotations['rightEyeIris'][4][1] - f.annotations['rightEyeIris'][2][1]) / 2;\n ctx.ellipse(f.annotations['rightEyeIris'][0][0], f.annotations['rightEyeIris'][0][1], sizeX, sizeY, 0, 0, 2 * Math.PI);\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.fillStyle = localOptions.useDepth ? 'rgba(255, 255, 200, 0.3)' : localOptions.color;\n ctx.fill();\n }\n }\n if (localOptions.drawGaze && f.rotation?.angle && typeof Path2D !== 'undefined') {\n ctx.strokeStyle = 'pink';\n const valX = (f.box[0] + f.box[2] / 2) - (f.box[3] * rad2deg(f.rotation.angle.yaw) / 90);\n const valY = (f.box[1] + f.box[3] / 2) + (f.box[2] * rad2deg(f.rotation.angle.pitch) / 90);\n const pathV = new Path2D(`\n M ${f.box[0] + f.box[2] / 2} ${f.box[1]}\n C\n ${valX} ${f.box[1]},\n ${valX} ${f.box[1] + f.box[3]},\n ${f.box[0] + f.box[2] / 2} ${f.box[1] + f.box[3]}\n `);\n const pathH = new Path2D(`\n M ${f.box[0]} ${f.box[1] + f.box[3] / 2}\n C \n ${f.box[0]} ${valY},\n ${f.box[0] + f.box[2]} ${valY},\n ${f.box[0] + f.box[2]} ${f.box[1] + f.box[3] / 2}\n `);\n ctx.stroke(pathH);\n ctx.stroke(pathV);\n }\n if (localOptions.drawGaze && f.rotation?.gaze?.strength && f.rotation?.gaze?.bearing && f.annotations['leftEyeIris'] && f.annotations['rightEyeIris'] && f.annotations['leftEyeIris'][0] && f.annotations['rightEyeIris'][0]) {\n ctx.strokeStyle = 'pink';\n ctx.fillStyle = 'pink';\n const leftGaze = [\n f.annotations['leftEyeIris'][0][0] + (Math.sin(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[3]),\n f.annotations['leftEyeIris'][0][1] + (Math.cos(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[2]),\n ];\n arrow(ctx, [f.annotations['leftEyeIris'][0][0], f.annotations['leftEyeIris'][0][1]], [leftGaze[0], leftGaze[1]], 4);\n const rightGaze = [\n f.annotations['rightEyeIris'][0][0] + (Math.sin(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[3]),\n f.annotations['rightEyeIris'][0][1] + (Math.cos(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[2]),\n ];\n arrow(ctx, [f.annotations['rightEyeIris'][0][0], f.annotations['rightEyeIris'][0][1]], [rightGaze[0], rightGaze[1]], 4);\n }\n }\n }\n }\n}\n\n/** draw detected bodies */\nexport async function body(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n ctx.lineJoin = 'round';\n for (let i = 0; i < result.length; i++) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n ctx.lineWidth = localOptions.lineWidth;\n ctx.font = localOptions.font;\n if (localOptions.drawBoxes && result[i].box && result[i].box?.length === 4) {\n rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions);\n if (localOptions.drawLabels) {\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 3, 1 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n }\n if (localOptions.drawPoints && result[i].keypoints) {\n for (let pt = 0; pt < result[i].keypoints.length; pt++) {\n if (!result[i].keypoints[pt].score || (result[i].keypoints[pt].score === 0)) continue;\n ctx.fillStyle = localOptions.useDepth && result[i].keypoints[pt].position[2] ? `rgba(${127.5 + (2 * (result[i].keypoints[pt].position[2] || 0))}, ${127.5 - (2 * (result[i].keypoints[pt].position[2] || 0))}, 255, 0.5)` : localOptions.color;\n point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions);\n }\n }\n if (localOptions.drawLabels && result[i].keypoints) {\n ctx.font = localOptions.font;\n for (const pt of result[i].keypoints) {\n if (!pt.score || (pt.score === 0)) continue;\n ctx.fillStyle = localOptions.useDepth && pt.position[2] ? `rgba(${127.5 + (2 * pt.position[2])}, ${127.5 - (2 * pt.position[2])}, 255, 0.5)` : localOptions.color;\n ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position[0] + 4, pt.position[1] + 4);\n }\n }\n if (localOptions.drawPolygons && result[i].keypoints && result[i].annotations) {\n for (const part of Object.values(result[i].annotations)) {\n for (const connected of part) curves(ctx, connected, localOptions);\n }\n }\n }\n}\n\n/** draw detected hands */\nexport async function hand(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n ctx.lineJoin = 'round';\n ctx.font = localOptions.font;\n for (const h of result) {\n if (localOptions.drawBoxes) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions);\n if (localOptions.drawLabels) {\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(`hand:${Math.trunc(100 * h.score)}%`, h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]); // can use h.label\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(`hand:${Math.trunc(100 * h.score)}%`, h.box[0] + 2, 0 + h.box[1] + localOptions.lineHeight, h.box[2]); // can use h.label\n }\n ctx.stroke();\n }\n if (localOptions.drawPoints) {\n if (h.keypoints && h.keypoints.length > 0) {\n for (const pt of h.keypoints) {\n ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * (pt[2] || 0))}, ${127.5 - (2 * (pt[2] || 0))}, 255, 0.5)` : localOptions.color;\n point(ctx, pt[0], pt[1], 0, localOptions);\n }\n }\n }\n if (localOptions.drawLabels && h.annotations) {\n const addHandLabel = (part: Array, title: string) => {\n if (!part || part.length === 0 || !part[0]) return;\n const z = part[part.length - 1][2] || 0;\n ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.5)` : localOptions.color;\n ctx.fillText(title, part[part.length - 1][0] + 4, part[part.length - 1][1] + 4);\n };\n ctx.font = localOptions.font;\n addHandLabel(h.annotations['index'], 'index');\n addHandLabel(h.annotations['middle'], 'middle');\n addHandLabel(h.annotations['ring'], 'ring');\n addHandLabel(h.annotations['pinky'], 'pinky');\n addHandLabel(h.annotations['thumb'], 'thumb');\n addHandLabel(h.annotations['palm'], 'palm');\n }\n if (localOptions.drawPolygons && h.annotations) {\n const addHandLine = (part: Array) => {\n if (!part || part.length === 0 || !part[0]) return;\n for (let i = 0; i < part.length; i++) {\n ctx.beginPath();\n const z = part[i][2] || 0;\n ctx.strokeStyle = localOptions.useDepth ? `rgba(${127.5 + (i * z)}, ${127.5 - (i * z)}, 255, 0.5)` : localOptions.color;\n ctx.moveTo(part[i > 0 ? i - 1 : 0][0], part[i > 0 ? i - 1 : 0][1]);\n ctx.lineTo(part[i][0], part[i][1]);\n ctx.stroke();\n }\n };\n ctx.lineWidth = localOptions.lineWidth;\n addHandLine(h.annotations['index']);\n addHandLine(h.annotations['middle']);\n addHandLine(h.annotations['ring']);\n addHandLine(h.annotations['pinky']);\n addHandLine(h.annotations['thumb']);\n // addPart(h.annotations.palm);\n }\n }\n}\n\n/** draw detected objects */\nexport async function object(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n ctx.lineJoin = 'round';\n ctx.font = localOptions.font;\n for (const h of result) {\n if (localOptions.drawBoxes) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions);\n if (localOptions.drawLabels) {\n const label = `${h.label} ${Math.round(100 * h.score)}%`;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(label, h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(label, h.box[0] + 2, 0 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.stroke();\n }\n }\n}\n\n/** draw combined person results instead of individual detection result objects */\nexport async function person(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n ctx.lineJoin = 'round';\n ctx.font = localOptions.font;\n\n for (let i = 0; i < result.length; i++) {\n if (localOptions.drawBoxes) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions);\n if (localOptions.drawLabels) {\n const label = `person #${i}`;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(label, result[i].box[0] + 3, 1 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(label, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n ctx.stroke();\n }\n }\n}\n\n/** draw processed canvas */\nexport async function canvas(input: AnyCanvas | HTMLImageElement | HTMLVideoElement, output: AnyCanvas) {\n if (!input || !output) return;\n const ctx = getCanvasContext(output);\n if (!ctx) return;\n ctx.drawImage(input, 0, 0);\n}\n\n/** meta-function that performs draw for: canvas, face, body, hand */\nexport async function all(inCanvas: AnyCanvas, result: Result, drawOptions?: Partial) {\n if (!result || !result.performance || !result || !inCanvas) return null;\n const timeStamp = now();\n const localOptions = mergeDeep(options, drawOptions);\n const promise = Promise.all([\n face(inCanvas, result.face, localOptions),\n body(inCanvas, result.body, localOptions),\n hand(inCanvas, result.hand, localOptions),\n object(inCanvas, result.object, localOptions),\n gesture(inCanvas, result.gesture, localOptions), // gestures do not have buffering\n // person(inCanvas, result.persons, localOptions); // already included above\n ]);\n drawTime = env.perfadd ? drawTime + Math.round(now() - timeStamp) : Math.round(now() - timeStamp);\n result.performance.draw = drawTime;\n return promise;\n}\n", "import type { Tensor } from '../tfjs/types';\nimport type { FaceResult } from '../result';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { meshAnnotations } from './facemeshcoords';\n\nconst expandFact = 0.1;\nconst alpha = 0.5;\n\n// point inclusion in polygon based on https://wrf.ecse.rpi.edu/Research/Short_Notes/pnpoly.html\nfunction insidePoly(x: number, y: number, polygon: Array<{ x: number, y: number }>): boolean {\n let inside = false;\n let j = polygon.length - 1;\n for (let i = 0; i < polygon.length; j = i++) {\n if (((polygon[i].y > y) !== (polygon[j].y > y)) && (x < (polygon[j].x - polygon[i].x) * (y - polygon[i].y) / (polygon[j].y - polygon[i].y) + polygon[i].x)) inside = !inside;\n }\n return inside;\n}\n\nexport async function mask(face: FaceResult): Promise {\n if (!face.tensor) return face.tensor;\n if (!face.mesh || face.mesh.length < 100) return face.tensor;\n const width = face.tensor.shape[2] || 0;\n const height = face.tensor.shape[1] || 0;\n const buffer = await face.tensor.buffer();\n let silhouette: Array<{ x: number, y: number }> = [];\n for (const pt of meshAnnotations.silhouette) silhouette.push({ x: (face.mesh[pt][0] - face.box[0]) / face.box[2], y: (face.mesh[pt][1] - face.box[1]) / face.box[3] }); // add all silhouette points scaled to local box\n if (expandFact && expandFact > 0) silhouette = silhouette.map((pt) => ({ x: pt.x > 0.5 ? pt.x + expandFact : pt.x - expandFact, y: pt.y > 0.5 ? pt.y + expandFact : pt.y - expandFact })); // expand silhouette\n for (let x = 0; x < width; x++) {\n for (let y = 0; y < height; y++) {\n const inside = insidePoly(x / width, y / width, silhouette);\n if (!inside) {\n buffer.set(alpha * buffer.get(0, y, x, 0), 0, y, x, 0);\n buffer.set(alpha * buffer.get(0, y, x, 1), 0, y, x, 1);\n buffer.set(alpha * buffer.get(0, y, x, 2), 0, y, x, 2);\n }\n }\n }\n const output = buffer.toTensor();\n tf.dispose(buffer);\n return output;\n}\n", "import type { Point, FaceResult } from '../result';\n\ntype Vector = [number, number, number];\n\nconst calculateGaze = (face: FaceResult): { bearing: number, strength: number } => {\n const radians = (pt1: Point, pt2: Point) => Math.atan2(pt1[1] - pt2[1], pt1[0] - pt2[0]); // function to calculate angle between any two points\n if (!face.annotations['rightEyeIris'] || !face.annotations['leftEyeIris']) return { bearing: 0, strength: 0 };\n\n const offsetIris = [0, -0.1]; // iris center may not align with average of eye extremes\n const eyeRatio = 1; // factor to normalize changes x vs y\n\n const left = (face.mesh[33][2] || 0) > (face.mesh[263][2] || 0); // pick left or right eye depending which one is closer bazed on outsize point z axis\n const irisCenter = left ? face.mesh[473] : face.mesh[468];\n const eyeCenter = left // eye center is average of extreme points on x axis for both x and y, ignoring y extreme points as eyelids naturally open/close more when gazing up/down so relative point is less precise\n ? [(face.mesh[133][0] + face.mesh[33][0]) / 2, (face.mesh[133][1] + face.mesh[33][1]) / 2]\n : [(face.mesh[263][0] + face.mesh[362][0]) / 2, (face.mesh[263][1] + face.mesh[362][1]) / 2];\n const eyeSize = left // eye size is difference between extreme points for both x and y, used to normalize & squarify eye dimensions\n ? [face.mesh[133][0] - face.mesh[33][0], face.mesh[23][1] - face.mesh[27][1]]\n : [face.mesh[263][0] - face.mesh[362][0], face.mesh[253][1] - face.mesh[257][1]];\n const eyeDiff: Point = [ // x distance between extreme point and center point normalized with eye size\n (eyeCenter[0] - irisCenter[0]) / eyeSize[0] - offsetIris[0],\n eyeRatio * (irisCenter[1] - eyeCenter[1]) / eyeSize[1] - offsetIris[1],\n ];\n let strength = Math.sqrt((eyeDiff[0] * eyeDiff[0]) + (eyeDiff[1] * eyeDiff[1])); // vector length is a diagonal between two differences\n strength = Math.min(strength, face.boxRaw[2] / 2, face.boxRaw[3] / 2); // limit strength to half of box size to avoid clipping due to low precision\n const bearing = (radians([0, 0], eyeDiff) + (Math.PI / 2)) % Math.PI; // using eyeDiff instead eyeCenter/irisCenter combo due to manual adjustments and rotate clockwise 90degrees\n return { bearing, strength };\n};\n\nexport const calculateFaceAngle = (face: FaceResult, imageSize: [number, number]): {\n angle: { pitch: number, yaw: number, roll: number },\n matrix: [number, number, number, number, number, number, number, number, number],\n gaze: { bearing: number, strength: number },\n} => {\n // const degrees = (theta) => Math.abs(((theta * 180) / Math.PI) % 360);\n const normalize = (v: Vector): Vector => { // normalize vector\n const length = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);\n v[0] /= length;\n v[1] /= length;\n v[2] /= length;\n return v;\n };\n const subVectors = (a: Vector, b: Vector): Vector => { // vector subtraction (a - b)\n const x = a[0] - b[0];\n const y = a[1] - b[1];\n const z = a[2] - b[2];\n return [x, y, z];\n };\n const crossVectors = (a: Vector, b: Vector): Vector => { // vector cross product (a x b)\n const x = a[1] * b[2] - a[2] * b[1];\n const y = a[2] * b[0] - a[0] * b[2];\n const z = a[0] * b[1] - a[1] * b[0];\n return [x, y, z];\n };\n // 3x3 rotation matrix to Euler angles based on https://www.geometrictools.com/Documentation/EulerAngles.pdf\n const rotationMatrixToEulerAngle = (r: number[]): { pitch: number, yaw: number, roll: number } => {\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const [r00, _r01, _r02, r10, r11, r12, r20, r21, r22] = r;\n let thetaX: number;\n let thetaY: number;\n let thetaZ: number;\n if (r10 < 1) { // YZX calculation\n if (r10 > -1) {\n thetaZ = Math.asin(r10);\n thetaY = Math.atan2(-r20, r00);\n thetaX = Math.atan2(-r12, r11);\n } else {\n thetaZ = -Math.PI / 2;\n thetaY = -Math.atan2(r21, r22);\n thetaX = 0;\n }\n } else {\n thetaZ = Math.PI / 2;\n thetaY = Math.atan2(r21, r22);\n thetaX = 0;\n }\n if (isNaN(thetaX)) thetaX = 0;\n if (isNaN(thetaY)) thetaY = 0;\n if (isNaN(thetaZ)) thetaZ = 0;\n return { pitch: 2 * -thetaX, yaw: 2 * -thetaY, roll: 2 * -thetaZ };\n };\n\n /*\n const meshToEulerAngle = (mesh) => { // simple Euler angle calculation based existing 3D mesh\n const radians = (a1, a2, b1, b2) => Math.atan2(b2 - a2, b1 - a1);\n return { // values are in radians in range of -pi/2 to pi/2 which is -90 to +90 degrees, value of 0 means center\n pitch: radians(mesh[10][1], mesh[10][2], mesh[152][1], mesh[152][2]), // looking at y,z of top and bottom points of the face // pitch is face move up/down\n yaw: radians(mesh[33][0], mesh[33][2], mesh[263][0], mesh[263][2]), // looking at x,z of outside corners of leftEye and rightEye // yaw is face turn left/right\n roll: radians(mesh[33][0], mesh[33][1], mesh[263][0], mesh[263][1]), // looking at x,y of outside corners of leftEye and rightEye // roll is face lean left/right\n };\n };\n */\n\n // initialize gaze and mesh\n const mesh = face.meshRaw;\n if (!mesh || mesh.length < 300) return { angle: { pitch: 0, yaw: 0, roll: 0 }, matrix: [1, 0, 0, 0, 1, 0, 0, 0, 1], gaze: { bearing: 0, strength: 0 } };\n\n const size = Math.max(face.boxRaw[2] * imageSize[0], face.boxRaw[3] * imageSize[1]) / 1.5;\n // top, bottom, left, right\n const pts: Point[] = [mesh[10], mesh[152], mesh[234], mesh[454]].map((pt) => [pt[0] * imageSize[0] / size, pt[1] * imageSize[1] / size, pt[2]] as Point); // make the xyz coordinates proportional, independent of the image/box size\n\n const y_axis = normalize(subVectors(pts[1] as Vector, pts[0] as Vector));\n let x_axis = normalize(subVectors(pts[3] as Vector, pts[2] as Vector));\n const z_axis = normalize(crossVectors(x_axis, y_axis));\n // adjust x_axis to make sure that all axes are perpendicular to each other\n x_axis = crossVectors(y_axis, z_axis);\n\n // Rotation Matrix from Axis Vectors - http://renderdan.blogspot.com/2006/05/rotation-matrix-from-axis-vectors.html\n // 3x3 rotation matrix is flatten to array in row-major order. Note that the rotation represented by this matrix is inverted.\n const matrix: [number, number, number, number, number, number, number, number, number] = [\n x_axis[0], x_axis[1], x_axis[2],\n y_axis[0], y_axis[1], y_axis[2],\n z_axis[0], z_axis[1], z_axis[2],\n ];\n const angle = rotationMatrixToEulerAngle(matrix);\n // const angle = meshToEulerAngle(mesh);\n\n // we have iris keypoints so we can calculate gaze direction\n const gaze = mesh.length === 478 ? calculateGaze(face) : { bearing: 0, strength: 0 };\n\n return { angle, matrix, gaze };\n};\n", "/**\n * Face algorithm implementation\n * Uses FaceMesh, Emotion and FaceRes models to create a unified pipeline\n */\n\nimport { log, now } from '../util/util';\nimport { env } from '../util/env';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as facemesh from './facemesh';\nimport * as emotion from '../gear/emotion';\nimport * as faceres from './faceres';\nimport * as mask from './mask';\nimport * as antispoof from './antispoof';\nimport * as liveness from './liveness';\nimport * as gear from '../gear/gear';\nimport * as ssrnetAge from '../gear/ssrnet-age';\nimport * as ssrnetGender from '../gear/ssrnet-gender';\nimport * as mobilefacenet from './mobilefacenet';\nimport type { FaceResult, Emotion, Gender, Race } from '../result';\nimport type { Tensor } from '../tfjs/types';\nimport type { Human } from '../human';\nimport { calculateFaceAngle } from './angles';\n\ntype DescRes = { age: number, gender: Gender, genderScore: number, descriptor: number[], race?: { score: number, race: Race }[] };\n\nexport const detectFace = async (instance: Human /* instance of human */, input: Tensor): Promise => {\n // run facemesh, includes blazeface and iris\n // eslint-disable-next-line no-async-promise-executor\n let timeStamp: number = now();\n let ageRes: { age: number } | Promise<{ age: number }> | null;\n let gearRes: gear.GearType | Promise | null;\n let genderRes: { gender: string, genderScore: number } | Promise<{ gender: string, genderScore: number }> | null;\n let emotionRes: { score: number, emotion: Emotion }[] | Promise<{ score: number, emotion: Emotion }[]>;\n let mobilefacenetRes: number[] | Promise | null;\n let antispoofRes: number | Promise | null;\n let livenessRes: number | Promise | null;\n let descRes: DescRes | Promise | null;\n\n const faceRes: Array = [];\n instance.state = 'run:face';\n\n const faces = await facemesh.predict(input, instance.config);\n instance.performance.face = env.perfadd ? (instance.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n if (!input.shape || input.shape.length !== 4) return [];\n if (!faces) return [];\n // for (const face of faces) {\n for (let i = 0; i < faces.length; i++) {\n instance.analyze('Get Face');\n\n // is something went wrong, skip the face\n // @ts-ignore possibly undefied\n if (!faces[i].tensor || faces[i].tensor['isDisposedInternal']) {\n log('Face object is disposed:', faces[i].tensor);\n continue;\n }\n\n // optional face mask\n if (instance.config.face.detector?.mask) {\n const masked = await mask.mask(faces[i]);\n tf.dispose(faces[i].tensor);\n faces[i].tensor = masked as Tensor;\n }\n\n // calculate face angles\n const rotation = faces[i].mesh && (faces[i].mesh.length > 200) ? calculateFaceAngle(faces[i], [input.shape[2], input.shape[1]]) : null;\n\n // run emotion, inherits face from blazeface\n instance.analyze('Start Emotion:');\n if (instance.config.async) {\n emotionRes = instance.config.face.emotion?.enabled ? emotion.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : [];\n } else {\n instance.state = 'run:emotion';\n timeStamp = now();\n emotionRes = instance.config.face.emotion?.enabled ? await emotion.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : [];\n instance.performance.emotion = env.perfadd ? (instance.performance.emotion || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n instance.analyze('End Emotion:');\n\n // run antispoof, inherits face from blazeface\n instance.analyze('Start AntiSpoof:');\n if (instance.config.async) {\n antispoofRes = instance.config.face.antispoof?.enabled ? antispoof.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : 0;\n } else {\n instance.state = 'run:antispoof';\n timeStamp = now();\n antispoofRes = instance.config.face.antispoof?.enabled ? await antispoof.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : 0;\n instance.performance.antispoof = env.perfadd ? (instance.performance.antispoof || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n instance.analyze('End AntiSpoof:');\n\n // run liveness, inherits face from blazeface\n instance.analyze('Start Liveness:');\n if (instance.config.async) {\n livenessRes = instance.config.face.liveness?.enabled ? liveness.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : 0;\n } else {\n instance.state = 'run:liveness';\n timeStamp = now();\n livenessRes = instance.config.face.liveness?.enabled ? await liveness.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : 0;\n instance.performance.liveness = env.perfadd ? (instance.performance.antispoof || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n instance.analyze('End Liveness:');\n\n // run gear, inherits face from blazeface\n instance.analyze('Start GEAR:');\n if (instance.config.async) {\n gearRes = instance.config.face['gear']?.enabled ? gear.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n } else {\n instance.state = 'run:gear';\n timeStamp = now();\n gearRes = instance.config.face['gear']?.enabled ? await gear.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n instance.performance.gear = Math.trunc(now() - timeStamp);\n }\n instance.analyze('End GEAR:');\n\n // run gear, inherits face from blazeface\n instance.analyze('Start SSRNet:');\n if (instance.config.async) {\n ageRes = instance.config.face['ssrnet']?.enabled ? ssrnetAge.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n genderRes = instance.config.face['ssrnet']?.enabled ? ssrnetGender.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n } else {\n instance.state = 'run:ssrnet';\n timeStamp = now();\n ageRes = instance.config.face['ssrnet']?.enabled ? await ssrnetAge.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n genderRes = instance.config.face['ssrnet']?.enabled ? await ssrnetGender.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n instance.performance.ssrnet = Math.trunc(now() - timeStamp);\n }\n instance.analyze('End SSRNet:');\n\n // run gear, inherits face from blazeface\n instance.analyze('Start MobileFaceNet:');\n if (instance.config.async) {\n mobilefacenetRes = instance.config.face['mobilefacenet']?.enabled ? mobilefacenet.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n } else {\n instance.state = 'run:mobilefacenet';\n timeStamp = now();\n mobilefacenetRes = instance.config.face['mobilefacenet']?.enabled ? await mobilefacenet.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n instance.performance.mobilefacenet = Math.trunc(now() - timeStamp);\n }\n instance.analyze('End MobileFaceNet:');\n\n // run emotion, inherits face from blazeface\n instance.analyze('Start Description:');\n if (instance.config.async) {\n descRes = instance.config.face.description?.enabled ? faceres.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n } else {\n instance.state = 'run:description';\n timeStamp = now();\n descRes = instance.config.face.description?.enabled ? await faceres.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n instance.performance.description = env.perfadd ? (instance.performance.description || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n instance.analyze('End Description:');\n\n // if async wait for results\n if (instance.config.async) {\n [ageRes, genderRes, emotionRes, mobilefacenetRes, descRes, gearRes, antispoofRes, livenessRes] = await Promise.all([ageRes, genderRes, emotionRes, mobilefacenetRes, descRes, gearRes, antispoofRes, livenessRes]);\n }\n instance.analyze('Finish Face:');\n\n if (instance.config.face['ssrnet']?.enabled && ageRes && genderRes) { // override age/gender if ssrnet model is used\n descRes = {\n ...(descRes as DescRes),\n age: (ageRes as { age: number}).age,\n gender: (genderRes as { gender: Gender, genderScore: number }).gender,\n genderScore: (genderRes as { gender: Gender, genderScore: number }).genderScore,\n };\n }\n if (instance.config.face['gear']?.enabled && gearRes) { // override age/gender/race if gear model is used\n descRes = {\n ...(descRes as DescRes),\n age: (gearRes as gear.GearType).age,\n gender: (gearRes as gear.GearType).gender,\n genderScore: (gearRes as gear.GearType).genderScore,\n race: (gearRes as gear.GearType).race,\n };\n }\n if (instance.config.face['mobilefacenet']?.enabled && mobilefacenetRes) { // override descriptor if embedding model is used\n (descRes as DescRes).descriptor = mobilefacenetRes as number[];\n }\n\n // calculate iris distance\n // iris: array[ center, left, top, right, bottom]\n if (!instance.config.face.iris?.enabled) {\n // if (faces[i]?.annotations?.leftEyeIris) delete faces[i].annotations.leftEyeIris;\n // if (faces[i]?.annotations?.rightEyeIris) delete faces[i].annotations.rightEyeIris;\n }\n const irisSize = (faces[i].annotations && faces[i].annotations.leftEyeIris && faces[i].annotations.leftEyeIris[0] && faces[i].annotations.rightEyeIris && faces[i].annotations.rightEyeIris[0]\n && (faces[i].annotations.leftEyeIris.length > 0) && (faces[i].annotations.rightEyeIris.length > 0)\n && (faces[i].annotations.leftEyeIris[0] !== null) && (faces[i].annotations.rightEyeIris[0] !== null))\n ? Math.max(Math.abs(faces[i].annotations.leftEyeIris[3][0] - faces[i].annotations.leftEyeIris[1][0]), Math.abs(faces[i].annotations.rightEyeIris[4][1] - faces[i].annotations.rightEyeIris[2][1])) / input.shape[2]\n : 0; // note: average human iris size is 11.7mm\n\n // optionally return tensor\n const tensor = instance.config.face.detector?.return ? tf.squeeze(faces[i].tensor) : null;\n // dispose original face tensor\n tf.dispose(faces[i].tensor);\n // delete temp face image\n if (faces[i].tensor) delete faces[i].tensor;\n // combine results\n const res: FaceResult = {\n ...faces[i],\n id: i,\n };\n if ((descRes as DescRes)?.age) res.age = (descRes as DescRes).age as number;\n if ((descRes as DescRes)?.gender) res.gender = (descRes as DescRes).gender as Gender;\n if ((descRes as DescRes)?.genderScore) res.genderScore = (descRes as DescRes)?.genderScore as number;\n if ((descRes as DescRes)?.descriptor) res.embedding = (descRes as DescRes)?.descriptor as Array;\n if ((descRes as DescRes)?.race) res.race = (descRes as DescRes)?.race as { score: number, race: Race }[];\n if (emotionRes) res.emotion = emotionRes as Array<{ score: number, emotion: Emotion }>;\n if (antispoofRes) res.real = antispoofRes as number;\n if (livenessRes) res.live = livenessRes as number;\n if (irisSize && irisSize !== 0) res.iris = Math.trunc(500 / irisSize / 11.7) / 100;\n if (rotation) res.rotation = rotation;\n if (tensor) res.tensor = tensor;\n faceRes.push(res);\n instance.analyze('End Face');\n }\n instance.analyze('End FaceMesh:');\n if (instance.config.async) {\n if (instance.performance.face) delete instance.performance.face;\n if (instance.performance.age) delete instance.performance.age;\n if (instance.performance.gender) delete instance.performance.gender;\n if (instance.performance.emotion) delete instance.performance.emotion;\n }\n return faceRes;\n};\n", "/**\n * Gesture detection algorithm\n */\n\nimport type { GestureResult, BodyResult, FaceResult, HandResult, Point } from '../result';\nimport * as fingerPose from '../hand/fingerpose';\n\n/** face gesture type */\nexport type FaceGesture =\n `facing ${'left' | 'center' | 'right'}`\n | `blink ${'left' | 'right'} eye`\n | `mouth ${number}% open`\n | `head ${'up' | 'down'}`;\n\n/** iris gesture type */\nexport type IrisGesture =\n 'facing center'\n | `looking ${'left' | 'right' | 'up' | 'down'}`\n | 'looking center';\n\n/** body gesture type */\nexport type BodyGesture =\n `leaning ${'left' | 'right'}`\n | `raise ${'left' | 'right'} hand`\n | 'i give up';\n\n/** hand gesture type */\nexport type HandGesture =\n `${'thumb' | 'index' | 'middle' | 'ring' | 'pinky'} forward`\n | `${'thumb' | 'index' | 'middle' | 'ring' | 'pinky'} up`\n | 'victory'\n | 'thumbs up';\n\nexport const body = (res: BodyResult[]): GestureResult[] => {\n if (!res) return [];\n const gestures: Array<{ body: number, gesture: BodyGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n // raising hands\n const leftWrist = res[i].keypoints.find((a) => (a.part === 'leftWrist'));\n const rightWrist = res[i].keypoints.find((a) => (a.part === 'rightWrist'));\n const nose = res[i].keypoints.find((a) => (a.part === 'nose'));\n if (nose && leftWrist && rightWrist && (leftWrist.position[1] < nose.position[1]) && (rightWrist.position[1] < nose.position[1])) gestures.push({ body: i, gesture: 'i give up' });\n else if (nose && leftWrist && (leftWrist.position[1] < nose.position[1])) gestures.push({ body: i, gesture: 'raise left hand' });\n else if (nose && rightWrist && (rightWrist.position[1] < nose.position[1])) gestures.push({ body: i, gesture: 'raise right hand' });\n\n // leaning\n const leftShoulder = res[i].keypoints.find((a) => (a.part === 'leftShoulder'));\n const rightShoulder = res[i].keypoints.find((a) => (a.part === 'rightShoulder'));\n if (leftShoulder && rightShoulder && Math.abs(leftShoulder.positionRaw[1] - rightShoulder.positionRaw[1]) > 0.1) {\n gestures.push({ body: i, gesture: `leaning ${(leftShoulder.position[1] > rightShoulder.position[1]) ? 'left' : 'right'}` });\n }\n }\n return gestures;\n};\n\nexport const face = (res: FaceResult[]): GestureResult[] => {\n if (!res) return [];\n const gestures: Array<{ face: number, gesture: FaceGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n if (res[i].mesh && res[i].mesh.length > 450) {\n const zDiff = (res[i].mesh[33][2] || 0) - (res[i].mesh[263][2] || 0);\n const xDiff = res[i].mesh[33][0] - res[i].mesh[263][0];\n if (Math.abs(zDiff / xDiff) <= 0.15) gestures.push({ face: i, gesture: 'facing center' });\n else gestures.push({ face: i, gesture: `facing ${zDiff < 0 ? 'left' : 'right'}` });\n const openLeft = Math.abs(res[i].mesh[374][1] - res[i].mesh[386][1]) / Math.abs(res[i].mesh[443][1] - res[i].mesh[450][1]); // center of eye inner lid y coord div center of wider eye border y coord\n if (openLeft < 0.2) gestures.push({ face: i, gesture: 'blink left eye' });\n const openRight = Math.abs(res[i].mesh[145][1] - res[i].mesh[159][1]) / Math.abs(res[i].mesh[223][1] - res[i].mesh[230][1]); // center of eye inner lid y coord div center of wider eye border y coord\n if (openRight < 0.2) gestures.push({ face: i, gesture: 'blink right eye' });\n const mouthOpen = Math.min(100, 500 * Math.abs(res[i].mesh[13][1] - res[i].mesh[14][1]) / Math.abs(res[i].mesh[10][1] - res[i].mesh[152][1]));\n if (mouthOpen > 10) gestures.push({ face: i, gesture: `mouth ${Math.trunc(mouthOpen)}% open` });\n const chinDepth = res[i].mesh[152][2] || 0;\n if (Math.abs(chinDepth) > 10) gestures.push({ face: i, gesture: `head ${chinDepth < 0 ? 'up' : 'down'}` });\n }\n }\n return gestures;\n};\n\nexport const iris = (res: FaceResult[]): GestureResult[] => {\n if (!res) return [];\n const gestures: Array<{ iris: number, gesture: IrisGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n if (!res[i].annotations || !res[i].annotations.leftEyeIris || !res[i].annotations.leftEyeIris[0] || !res[i].annotations.rightEyeIris || !res[i].annotations.rightEyeIris[0]) continue;\n const sizeXLeft = res[i].annotations.leftEyeIris[3][0] - res[i].annotations.leftEyeIris[1][0];\n const sizeYLeft = res[i].annotations.leftEyeIris[4][1] - res[i].annotations.leftEyeIris[2][1];\n const areaLeft = Math.abs(sizeXLeft * sizeYLeft);\n\n const sizeXRight = res[i].annotations.rightEyeIris[3][0] - res[i].annotations.rightEyeIris[1][0];\n const sizeYRight = res[i].annotations.rightEyeIris[4][1] - res[i].annotations.rightEyeIris[2][1];\n const areaRight = Math.abs(sizeXRight * sizeYRight);\n\n let center = false;\n const difference = Math.abs(areaLeft - areaRight) / Math.max(areaLeft, areaRight);\n if (difference < 0.25) {\n center = true;\n gestures.push({ iris: i, gesture: 'facing center' });\n }\n\n const leftIrisCenterX = Math.abs(res[i].mesh[263][0] - res[i].annotations.leftEyeIris[0][0]) / res[i].box[2];\n const rightIrisCenterX = Math.abs(res[i].mesh[33][0] - res[i].annotations.rightEyeIris[0][0]) / res[i].box[2];\n if (leftIrisCenterX > 0.06 || rightIrisCenterX > 0.06) center = false;\n if (leftIrisCenterX > rightIrisCenterX) { // check eye with bigger offset\n if (leftIrisCenterX > 0.05) gestures.push({ iris: i, gesture: 'looking right' });\n } else {\n if (rightIrisCenterX > 0.05) gestures.push({ iris: i, gesture: 'looking left' });\n }\n\n const rightIrisCenterY = Math.abs(res[i].mesh[145][1] - res[i].annotations.rightEyeIris[0][1]) / res[i].box[3];\n const leftIrisCenterY = Math.abs(res[i].mesh[374][1] - res[i].annotations.leftEyeIris[0][1]) / res[i].box[3];\n if (leftIrisCenterY < 0.01 || rightIrisCenterY < 0.01 || leftIrisCenterY > 0.022 || rightIrisCenterY > 0.022) center = false;\n if (leftIrisCenterY < 0.01 || rightIrisCenterY < 0.01) gestures.push({ iris: i, gesture: 'looking down' });\n if (leftIrisCenterY > 0.022 || rightIrisCenterY > 0.022) gestures.push({ iris: i, gesture: 'looking up' });\n\n // still center;\n if (center) gestures.push({ iris: i, gesture: 'looking center' });\n }\n return gestures;\n};\n\nexport const hand = (res: HandResult[]): GestureResult[] => {\n if (!res) return [];\n const gestures: Array<{ hand: number, gesture: HandGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n const fingers: Array<{ name: string, position: Point }> = [];\n if (res[i]['annotations']) {\n for (const [finger, pos] of Object.entries(res[i]['annotations'])) {\n if (finger !== 'palmBase' && Array.isArray(pos) && pos[0]) fingers.push({ name: finger.toLowerCase(), position: pos[0] }); // get tip of each finger\n }\n }\n if (fingers && fingers.length > 0) {\n const closest = fingers.reduce((best, a) => ((best.position[2] || 0) < (a.position[2] || 0) ? best : a));\n gestures.push({ hand: i, gesture: `${closest.name} forward` as HandGesture });\n const highest = fingers.reduce((best, a) => (best.position[1] < a.position[1] ? best : a));\n gestures.push({ hand: i, gesture: `${highest.name} up` as HandGesture });\n }\n if (res[i]['keypoints']) {\n const poses = fingerPose.match(res[i]['keypoints']);\n for (const pose of poses) gestures.push({ hand: i, gesture: pose.name as HandGesture });\n }\n }\n return gestures;\n};\n", "/**\n * Results interpolation for smoothening of video detection results inbetween detected frames\n */\n\nimport type { Result, FaceResult, BodyResult, HandResult, ObjectResult, GestureResult, PersonResult, Box, Point, BodyLandmark, BodyAnnotation } from '../result';\nimport type { Config } from '../config';\n\nimport * as moveNetCoords from '../body/movenetcoords';\nimport * as blazePoseCoords from '../body/blazeposecoords';\nimport * as efficientPoseCoords from '../body/efficientposecoords';\nimport { now } from './util';\nimport { env } from './env';\n\nconst bufferedResult: Result = { face: [], body: [], hand: [], gesture: [], object: [], persons: [], performance: {}, timestamp: 0, error: null };\nlet interpolateTime = 0;\n\nexport function calc(newResult: Result, config: Config): Result {\n const t0 = now();\n if (!newResult) return { face: [], body: [], hand: [], gesture: [], object: [], persons: [], performance: {}, timestamp: 0, error: null };\n // each record is only updated using deep clone when number of detected record changes, otherwise it will converge by itself\n // otherwise bufferedResult is a shallow clone of result plus updated local calculated values\n // thus mixing by-reference and by-value assignments to minimize memory operations\n\n const elapsed = Date.now() - newResult.timestamp;\n // curve fitted: buffer = 8 - ln(delay)\n // interpolation formula: current = ((buffer - 1) * previous + live) / buffer\n // - at 50ms delay buffer = ~4.1 => 28% towards live data\n // - at 250ms delay buffer = ~2.5 => 40% towards live data\n // - at 500ms delay buffer = ~1.8 => 55% towards live data\n // - at 750ms delay buffer = ~1.4 => 71% towards live data\n // - at 1sec delay buffer = 1 which means live data is used\n const bufferedFactor = elapsed < 1000 ? 8 - Math.log(elapsed + 1) : 1;\n\n if (newResult.canvas) bufferedResult.canvas = newResult.canvas;\n if (newResult.error) bufferedResult.error = newResult.error;\n\n // interpolate body results\n if (!bufferedResult.body || (newResult.body.length !== bufferedResult.body.length)) {\n bufferedResult.body = JSON.parse(JSON.stringify(newResult.body as BodyResult[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.body.length; i++) {\n const box = newResult.body[i].box // update box\n .map((newBoxCoord, j) => ((bufferedFactor - 1) * bufferedResult.body[i].box[j] + newBoxCoord) / bufferedFactor) as Box;\n const boxRaw = newResult.body[i].boxRaw // update boxRaw\n .map((newBoxCoord, j) => ((bufferedFactor - 1) * bufferedResult.body[i].boxRaw[j] + newBoxCoord) / bufferedFactor) as Box;\n const keypoints = (newResult.body[i].keypoints // update keypoints\n .map((newKpt, j) => ({\n score: newKpt.score,\n part: newKpt.part as BodyLandmark,\n position: [\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[0] || 0) + (newKpt.position[0] || 0)) / bufferedFactor : newKpt.position[0],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[1] || 0) + (newKpt.position[1] || 0)) / bufferedFactor : newKpt.position[1],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[2] || 0) + (newKpt.position[2] || 0)) / bufferedFactor : newKpt.position[2],\n ],\n positionRaw: [\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[0] || 0) + (newKpt.positionRaw[0] || 0)) / bufferedFactor : newKpt.positionRaw[0],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[1] || 0) + (newKpt.positionRaw[1] || 0)) / bufferedFactor : newKpt.positionRaw[1],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[2] || 0) + (newKpt.positionRaw[2] || 0)) / bufferedFactor : newKpt.positionRaw[2],\n ],\n distance: [\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].distance?.[0] || 0) + (newKpt.distance?.[0] || 0)) / bufferedFactor : newKpt.distance?.[0],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].distance?.[1] || 0) + (newKpt.distance?.[1] || 0)) / bufferedFactor : newKpt.distance?.[1],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].distance?.[2] || 0) + (newKpt.distance?.[2] || 0)) / bufferedFactor : newKpt.distance?.[2],\n ],\n }))) as Array<{ score: number, part: BodyLandmark, position: [number, number, number?], positionRaw: [number, number, number?] }>;\n\n const annotations: Record = {} as Record; // recreate annotations\n let coords = { connected: {} };\n if (config.body?.modelPath?.includes('efficientpose')) coords = efficientPoseCoords;\n else if (config.body?.modelPath?.includes('blazepose')) coords = blazePoseCoords;\n else if (config.body?.modelPath?.includes('movenet')) coords = moveNetCoords;\n for (const [name, indexes] of Object.entries(coords.connected as Record)) {\n const pt: Array = [];\n for (let j = 0; j < indexes.length - 1; j++) {\n const pt0 = keypoints.find((kp) => kp.part === indexes[j]);\n const pt1 = keypoints.find((kp) => kp.part === indexes[j + 1]);\n // if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);\n if (pt0 && pt1) pt.push([pt0.position, pt1.position]);\n }\n annotations[name] = pt;\n }\n bufferedResult.body[i] = { ...newResult.body[i], box, boxRaw, keypoints, annotations: annotations as BodyResult['annotations'] }; // shallow clone plus updated values\n }\n }\n\n // interpolate hand results\n if (!bufferedResult.hand || (newResult.hand.length !== bufferedResult.hand.length)) {\n bufferedResult.hand = JSON.parse(JSON.stringify(newResult.hand as HandResult[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.hand.length; i++) {\n const box = (newResult.hand[i].box// update box\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].box[j] + b) / bufferedFactor)) as Box;\n const boxRaw = (newResult.hand[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].boxRaw[j] + b) / bufferedFactor)) as Box;\n if (bufferedResult.hand[i].keypoints.length !== newResult.hand[i].keypoints.length) bufferedResult.hand[i].keypoints = newResult.hand[i].keypoints; // reset keypoints as previous frame did not have them\n const keypoints = newResult.hand[i].keypoints && newResult.hand[i].keypoints.length > 0 ? newResult.hand[i].keypoints // update landmarks\n .map((landmark, j) => landmark\n .map((coord, k) => (((bufferedFactor - 1) * (bufferedResult.hand[i].keypoints[j][k] || 1) + (coord || 0)) / bufferedFactor)) as Point)\n : [];\n let annotations = {};\n if (Object.keys(bufferedResult.hand[i].annotations).length !== Object.keys(newResult.hand[i].annotations).length) {\n bufferedResult.hand[i].annotations = newResult.hand[i].annotations; // reset annotations as previous frame did not have them\n annotations = bufferedResult.hand[i].annotations;\n } else if (newResult.hand[i].annotations) {\n for (const key of Object.keys(newResult.hand[i].annotations)) { // update annotations\n annotations[key] = newResult.hand[i].annotations[key] && newResult.hand[i].annotations[key][0]\n ? newResult.hand[i].annotations[key]\n .map((val, j: number) => val\n .map((coord: number, k: number) => ((bufferedFactor - 1) * bufferedResult.hand[i].annotations[key][j][k] + coord) / bufferedFactor))\n : null;\n }\n }\n bufferedResult.hand[i] = { ...newResult.hand[i], box, boxRaw, keypoints, annotations: annotations as HandResult['annotations'] }; // shallow clone plus updated values\n }\n }\n\n // interpolate face results\n if (!bufferedResult.face || (newResult.face.length !== bufferedResult.face.length)) {\n bufferedResult.face = JSON.parse(JSON.stringify(newResult.face as FaceResult[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.face.length; i++) {\n const box = (newResult.face[i].box // update box\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].box[j] + b) / bufferedFactor)) as Box;\n const boxRaw = (newResult.face[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].boxRaw[j] + b) / bufferedFactor)) as Box;\n if (newResult.face[i].rotation) {\n const rotation: {\n matrix: [number, number, number, number, number, number, number, number, number],\n angle: { roll: number, yaw: number, pitch: number },\n gaze: { bearing: number, strength: number }\n } = { matrix: [0, 0, 0, 0, 0, 0, 0, 0, 0], angle: { roll: 0, yaw: 0, pitch: 0 }, gaze: { bearing: 0, strength: 0 } };\n rotation.matrix = newResult.face[i].rotation?.matrix as [number, number, number, number, number, number, number, number, number];\n rotation.angle = {\n roll: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.roll || 0) + (newResult.face[i].rotation?.angle?.roll || 0)) / bufferedFactor,\n yaw: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.yaw || 0) + (newResult.face[i].rotation?.angle?.yaw || 0)) / bufferedFactor,\n pitch: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.pitch || 0) + (newResult.face[i].rotation?.angle?.pitch || 0)) / bufferedFactor,\n };\n rotation.gaze = {\n // not fully correct due projection on circle, also causes wrap-around draw on jump from negative to positive\n bearing: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.gaze?.bearing || 0) + (newResult.face[i].rotation?.gaze?.bearing || 0)) / bufferedFactor,\n strength: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.gaze?.strength || 0) + (newResult.face[i].rotation?.gaze?.strength || 0)) / bufferedFactor,\n };\n bufferedResult.face[i] = { ...newResult.face[i], rotation, box, boxRaw }; // shallow clone plus updated values\n }\n bufferedResult.face[i] = { ...newResult.face[i], box, boxRaw }; // shallow clone plus updated values\n }\n }\n\n // interpolate object detection results\n if (!bufferedResult.object || (newResult.object.length !== bufferedResult.object.length)) {\n bufferedResult.object = JSON.parse(JSON.stringify(newResult.object as ObjectResult[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.object.length; i++) {\n const box = (newResult.object[i].box // update box\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].box[j] + b) / bufferedFactor)) as Box;\n const boxRaw = (newResult.object[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].boxRaw[j] + b) / bufferedFactor)) as Box;\n bufferedResult.object[i] = { ...newResult.object[i], box, boxRaw }; // shallow clone plus updated values\n }\n }\n\n // interpolate person results\n if (newResult.persons) {\n const newPersons = newResult.persons; // trigger getter function\n if (!bufferedResult.persons || (newPersons.length !== bufferedResult.persons.length)) {\n bufferedResult.persons = JSON.parse(JSON.stringify(newPersons as PersonResult[]));\n } else {\n for (let i = 0; i < newPersons.length; i++) { // update person box, we don't update the rest as it's updated as reference anyhow\n bufferedResult.persons[i].box = (newPersons[i].box\n .map((box, j) => ((bufferedFactor - 1) * bufferedResult.persons[i].box[j] + box) / bufferedFactor)) as Box;\n }\n }\n }\n\n // just copy latest gestures without interpolation\n if (newResult.gesture) bufferedResult.gesture = newResult.gesture as GestureResult[];\n\n // append interpolation performance data\n const t1 = now();\n interpolateTime = env.perfadd ? interpolateTime + Math.round(t1 - t0) : Math.round(t1 - t0);\n if (newResult.performance) bufferedResult.performance = { ...newResult.performance, interpolate: interpolateTime };\n\n return bufferedResult;\n}\n", "/** Face descriptor type as number array */\nexport type Descriptor = Array\nexport type MatchOptions = { order?: number, threshold?: number, multiplier?: number, min?: number, max?: number } | undefined;\n\n/** Calculates distance between two descriptors\n * @param options - calculation options\n * - order - algorithm to use\n * Euclidean distance if `order` is 2 (default), Minkowski distance algorithm of nth order if `order` is higher than 2\n * - multiplier - by how much to enhance difference analysis in range of 1..100\n * default is 20 which normalizes results to similarity above 0.5 can be considered a match\n */\nexport function distance(descriptor1: Descriptor, descriptor2: Descriptor, options: MatchOptions = { order: 2, multiplier: 25 }) {\n // general minkowski distance, euclidean distance is limited case where order is 2\n let sum = 0;\n for (let i = 0; i < descriptor1.length; i++) {\n const diff = (!options.order || options.order === 2) ? (descriptor1[i] - descriptor2[i]) : (Math.abs(descriptor1[i] - descriptor2[i]));\n sum += (!options.order || options.order === 2) ? (diff * diff) : (diff ** options.order);\n }\n return (options.multiplier || 20) * sum;\n}\n\n// invert distance to similarity, normalize to given range and clamp\nconst normalizeDistance = (dist, order, min, max) => {\n if (dist === 0) return 1; // short circuit for identical inputs\n const root = order === 2 ? Math.sqrt(dist) : dist ** (1 / order); // take root of distance\n const norm = (1 - (root / 100) - min) / (max - min); // normalize to range\n const clamp = Math.max(Math.min(norm, 1), 0); // clamp to 0..1\n return clamp;\n};\n\n/** Calculates normalized similarity between two face descriptors based on their `distance`\n * @param options - calculation options\n * - order - algorithm to use\n * Euclidean distance if `order` is 2 (default), Minkowski distance algorithm of nth order if `order` is higher than 2\n * - multiplier - by how much to enhance difference analysis in range of 1..100\n * default is 20 which normalizes results to similarity above 0.5 can be considered a match\n * - min - normalize similarity result to a given range\n * - max - normalzie similarity resutl to a given range\n * default is 0.2...0.8\n * Returns similarity between two face descriptors normalized to 0..1 range where 0 is no similarity and 1 is perfect similarity\n */\nexport function similarity(descriptor1: Descriptor, descriptor2: Descriptor, options: MatchOptions = { order: 2, multiplier: 25, min: 0.2, max: 0.8 }) {\n const dist = distance(descriptor1, descriptor2, options);\n return normalizeDistance(dist, options.order || 2, options.min || 0, options.max || 1);\n}\n\n/** Matches given descriptor to a closest entry in array of descriptors\n * @param descriptor - face descriptor\n * @param descriptors - array of face descriptors to commpare given descriptor to\n * @param options - see {@link similarity}\n * Returns\n * - `index` index array index where best match was found or -1 if no matches\n * - {@link distance} calculated `distance` of given descriptor to the best match\n * - {@link similarity} calculated normalized `similarity` of given descriptor to the best match\n*/\nexport function match(descriptor: Descriptor, descriptors: Array, options: MatchOptions = { order: 2, multiplier: 25, threshold: 0, min: 0.2, max: 0.8 }) {\n if (!Array.isArray(descriptor) || !Array.isArray(descriptors) || descriptor.length < 64 || descriptors.length === 0 || descriptor.length !== descriptors[0].length) { // validate input\n return { index: -1, distance: Number.POSITIVE_INFINITY, similarity: 0 };\n }\n let lowestDistance = Number.MAX_SAFE_INTEGER;\n let index = -1;\n for (let i = 0; i < descriptors.length; i++) {\n const res = distance(descriptor, descriptors[i], options);\n if (res < lowestDistance) {\n lowestDistance = res;\n index = i;\n }\n if (lowestDistance < (options.threshold || 0)) break;\n }\n const normalizedSimilarity = normalizeDistance(lowestDistance, options.order || 2, options.min || 0, options.max || 1);\n return { index, distance: lowestDistance, similarity: normalizedSimilarity };\n}\n", "/**\n * Analyze detection Results and sort&combine them into per-person view\n */\n\nimport type { FaceResult, BodyResult, HandResult, GestureResult, PersonResult, Box } from '../result';\n\nexport function join(faces: Array, bodies: Array, hands: Array, gestures: Array, shape: Array | undefined): Array {\n let id = 0;\n const persons: Array = [];\n for (const face of faces) { // person is defined primarily by face and then we append other objects as found\n const person: PersonResult = { id: id++, face, body: null, hands: { left: null, right: null }, gestures: [], box: [0, 0, 0, 0] };\n for (const body of bodies) {\n if (face.box[0] > body.box[0] // x within body\n && face.box[0] < body.box[0] + body.box[2]\n && face.box[1] + face.box[3] > body.box[1] // y within body\n && face.box[1] + face.box[3] < body.box[1] + body.box[3]) {\n person.body = body;\n }\n }\n if (person.body) { // only try to join hands if body is found\n for (const hand of hands) {\n if (hand.box[0] + hand.box[2] > person.body.box[0] // x within body for left hand\n && hand.box[0] + hand.box[2] < person.body.box[0] + person.body.box[2]\n && hand.box[1] + hand.box[3] > person.body.box[1] // x within body for left hand\n && hand.box[1] + hand.box[3] < person.body.box[1] + person.body.box[3]) {\n if (person.hands) person.hands.left = hand;\n }\n if (hand.box[0] < person.body.box[0] + person.body.box[2] // x within body for right hand\n && hand.box[0] > person.body.box[0]\n && hand.box[1] + hand.box[3] > person.body.box[1] // x within body for right hand\n && hand.box[1] + hand.box[3] < person.body.box[1] + person.body.box[3]) {\n if (person.hands) person.hands.right = hand;\n }\n }\n }\n for (const gesture of gestures) { // append all gestures according to ids\n if (gesture['face'] !== undefined && gesture['face'] === face.id) person.gestures?.push(gesture);\n else if (gesture['iris'] !== undefined && gesture['iris'] === face.id) person.gestures?.push(gesture);\n else if (gesture['body'] !== undefined && gesture['body'] === person.body?.id) person.gestures?.push(gesture);\n else if (gesture['hand'] !== undefined && gesture['hand'] === person.hands?.left?.id) person.gestures?.push(gesture);\n else if (gesture['hand'] !== undefined && gesture['hand'] === person.hands?.right?.id) person.gestures?.push(gesture);\n }\n\n // create new overarching box from all boxes belonging to person\n const x: number[] = [];\n const y: number[] = [];\n const extractXY = (box: Box | undefined) => { // extract all [x, y] coordinates from boxes [x, y, width, height]\n if (box && box.length === 4) {\n x.push(box[0], box[0] + box[2]);\n y.push(box[1], box[1] + box[3]);\n }\n };\n extractXY(person.face?.box);\n extractXY(person.body?.box);\n extractXY(person.hands?.left?.box);\n extractXY(person.hands?.right?.box);\n const minX = Math.min(...x);\n const minY = Math.min(...y);\n person.box = [minX, minY, Math.max(...x) - minX, Math.max(...y) - minY]; // create new overarching box\n\n // shape is known so we calculate boxRaw as well\n if (shape && shape[1] && shape[2]) person.boxRaw = [person.box[0] / shape[2], person.box[1] / shape[1], person.box[2] / shape[2], person.box[3] / shape[1]];\n\n persons.push(person);\n }\n return persons;\n}\n", "/**\n * Embedded sample images used during warmup in dataURL format\n */\n\n// data:image/jpeg;base64,\nexport const face = `\n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`;\n\n// data:image/jpeg;base64,\nexport const body = `\n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\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAa2p1UYo5adbz+xbxMlvqJ1OqjDHLXree0ejmzNrWm953tPmTPWbWneZ7yoy5YhjrXXTjH8s75N\nmtkyxt0VZM2/m175N1V03yTKubMLXVXybeYLLX2VXy7eam+b0bOg4VquJW+rry4/O9uyZOq3UjVm\n9r25axMzPaIdvhns1kzbZddM0p5Y47z8/R2+HcF03Doi1a8+Xzvbv+TotJnjDXkt+K8ODHp8cY8N\nIpSO0RCwF2YAAAAAAAAACvUZYw6fJkntWN3k8dfHz2vLucdz8mkjFE9bz1+UOZosX1UzPm0nqI/W\nMYo9FlcPNklfFGeH/NshLGun+Cz6PtHZtVZWlRLS+jxPkRpIn7rdoupHTdA5s6SI+7H6Mfo+32Y2\n+To3neSIiZ7A0IjPXpXLePlMotGW3272t85datKzHZjbTVnsDj+FG/2Y/RlGP4R+jo20u7H6N1Ql\no+H8I/REY957R+jpfReiK6eOYHLtj2tttH6KrY/6Y/R2c+kjeJiFVtLG24hxpw7/AHY/RRkw9O37\nO99Hrt1YX0tfOBLjcGp4XF8c+u8fs9c4dcVcGemSI61nd3IneN1orQAAAAAAAAAAAAABFqxes1tE\nTE9JiUgPKcX4RbRXnNgiZwWnrH4XPi28PdXpW9JraImsxtMS8pxXhF9DecuGJtgmf+1TWW2N/la1\nL7N7T5e3Vy6W3hsYcvLbqzbO9jvvCzvDR0+XeO7crO6FmGSvRThy/RtVXJ92elvk2rRvDUzU7pl4\nizsd2J3jeBpcNz+Lg5LT7+Pp+Xk3W7js5eAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs0NTrN96Yp6edkW8Wzm6+LNTq4pvTHO9vOfRoWtt\n1mes95YWvs1s2fZldddOczLPLn2ju0MmebT3YZc2/mpm3qqllN1drsbZIhr3yzvtHf4AsvlYYseb\nV5Yx4KTe0+UQ6nDvZ3UazbJqd8OKeu33peq0eh0+hxcmnxxWPOfOfm0mP+steT/ji8N9mKY9suum\nL37+HHaPm9DSlaVitKxWsdohI0Y22gAgAAAAAAAAAABXnyRhw3yT92Nwef4xm8bVzET0rPJH5d12\n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\nAOZE/OsPS29nuH27YrV+VpeV9pdPXhOtw49NG9Mld55+vXcTPd42I47qo7xSfyWV9oM8d8VJ/VxM\nd8l46xWF9cV7en6o/qLfxp2I9ob+eCv/AHMo9op89P8A/wBORGmyT5R+qfo2X8P7n9Q/jTsx7RR5\n6ef+4/8AuHftg/8A6cWcOSO9J/WEbWr3pY7Efzp2Lcfv5YK/9zWy8d1E/ZpSv5Oba1/+Hb9lc+LP\nbFt87I7E/wAabWbiurvEx4nL/pjZzc2bJkn372t85ZXx55/BX85lucC0vPxnTxlnnjm32mOiZqUu\nLJ2p4TwnVavNWaYbRTfre0bQ99pcH0bT0xb78vmtiIiNojaErMwAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAHnfarF7umzRHaZrLjYrdIen9ocPi8JyTt1xzF4eUw23rCm3R4r6bMy\nwt6kdTaWLdjswmNoZontsCm0K5XWjopnuDC0dGpqG5bs08/daKV672MjbSaif6oh6Z5f2LtvptRX\n0tEvUN3Jfo8f7cYve0eX4zV7B5z20xc/C8eSPuZIRficfXlcPaG7ino08HWIbePpLF2NuiyOyrHK\n3fZFSwuovHVfaVF4QK5YWTM9UT0EKry6Ps1Tn4zjn8NZn9nOtLseydObiWW34cf918fWfk+PYANn\nKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq1WKM+ly4p+/WYeBxTNd6zG0xO0\nvobw3FcP0bi2em20Tbmj5Srr418V9sa2Z7qKyzi07MXUylhaU7yjqhLCeiq3ddaFNxFYW7NLNG8t\nzya+WO6Va9J7FW66mvwidnrXiPY3Ny8RyUn71Jj9Ht3RPjk19HK9pMHj8D1ER3rHN+jqqtTjjNps\nuOe16zAifXzfTz7kNyndpYazS9qT0mszDdoxrsi6m8LazMq6zDOsq1ZEyrt1WWlXaUCqyq0rbKbi\nFdp6PReyFd8uqv8ACsfy83aXrPZHHto89/xX2/SP/dpj6y8vx6EBq5gAAAAAAAAAAAAAAAAAAAAA\n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\nNO67NbkhzNVnmInqzaOZrL93JyZeV0M1++7S02jvxDWxhxx033tPpC8Z6rrezWjmZyazJG2/u03h\n2vFibTHoqvamiwVwY+nLGzV0+SZ1Mx8G0/45tOhzJ5lXMc3UVXRdlF1HP+iYsDPLPPy49/tz1+Te\npSIr0ho6ak5Ms5J8o2q6NImOrHV7XX488ypzTtHXo0s9t6zG7c1G1qz6ubeZiZ3UatXJG3yauSO7\ncvMTEx5tPLb3prPRMVr0HB8vicNxf0+7+kt+LOJwTJyY/Bnz3tH93X36N58cWvq6LSyiyndMSlC7\nmZcymLJiwLosmJVRLKLAtiU7q4lMSCzc3YxJuDMRuAlKAEgAAAlAkAAAAAABKAEgAAAAAJAAAAAA\nAAAAAAAEgAAAAAAAAAAAAAkAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAhIAAACAAAASgAAAAAAEAAAA\nhGzJAImGMwzQDDZjNVuyNgUTVhNGxysZqDVmiu1G5NN2M4waM0+DCaN2cbGcQNGaMZq3JxMJxA1J\nqx2bU4kU09slorWNwa20z02RXHbJbl26QvtFovbHWkxEdJt5y2MOHlr2U1W3jx+1hiw8vSO63lmI\nXRTaEWmtY6snRHO1VpmJ+DjavpSZl2s8b7y4HFcnh0n0gha5ebJN55KRM2mdoiPN6fh+kpwXh0Wy\nRHj5Otp/s5Ps1p62y31+em9aTMYt/OfVfxTiPjZ52naI7fBrI5t66xz5+a1rW7yx0eSL6iZjtEOX\nqNbSletom3lENjh2fbHzbbWt3iVozruc+5ztWubf4M4ybpQ2Oboyrva0Vjza8WdDR4OkXt3n9ldX\nkaePP9VtYqctYhdvt5oivTeCZ2YOxXk6ubqMfV0b9mrljfqlFcq88k7z2U5axeItDa1OPessuC8P\nya7XRWYnwqdbT/ZMilvIu4dpslNdixXja8Y5tt85djZdbDWnGOesRtXFtuw6T27No5Kx2OrKYQlC\nExKJgBnEpiyvdlEgsizKLKollFgWxLKJVRLKJBbEp3VxLKJBnuMWQJEbpBIAAAJAAAABIAAAAAAA\nlAJAAAAAAAAAAAAAASAAAAAAAAAAAAAJAAAABAJABAlAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAA\nAAABAJQAAAAgAABAAI2EoBGyJhkgGPKxmqxAKpownHC+YRMdN5BrTj67R3bOn01o7p01Iv71u89o\n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\n2Q==`;\n", "/**\n * Warmup algorithm that uses embedded images to exercise loaded models for faster future inference\n */\n\nimport { log, now, mergeDeep } from './util/util';\nimport * as sample from './sample';\nimport * as tf from '../dist/tfjs.esm.js';\nimport * as image from './image/image';\nimport type { Config } from './config';\nimport type { Result } from './result';\nimport type { Human } from './human';\nimport type { Tensor } from './tfjs/types';\nimport { env } from './util/env';\n\nasync function warmupBitmap(instance: Human) {\n const b64toBlob = (base64: string, type = 'application/octet-stream') => fetch(`data:${type};base64,${base64}`).then((res) => res.blob());\n let blob;\n let res;\n switch (instance.config.warmup) {\n case 'face': blob = await b64toBlob(sample.face); break;\n case 'body':\n case 'full': blob = await b64toBlob(sample.body); break;\n default: blob = null;\n }\n if (blob) {\n const bitmap = await createImageBitmap(blob);\n res = await instance.detect(bitmap, instance.config);\n bitmap.close();\n }\n return res;\n}\n\nasync function warmupCanvas(instance: Human): Promise {\n return new Promise((resolve) => {\n let src;\n // let size = 0;\n switch (instance.config.warmup) {\n case 'face':\n // size = 256;\n src = 'data:image/jpeg;base64,' + sample.face;\n break;\n case 'full':\n case 'body':\n // size = 1200;\n src = 'data:image/jpeg;base64,' + sample.body;\n break;\n default:\n src = null;\n }\n // src = encodeURI('../assets/human-sample-upper.jpg');\n let img: HTMLImageElement;\n if (typeof Image !== 'undefined') img = new Image();\n // @ts-ignore env.image is an external monkey-patch\n else if (env.Image) img = new env.Image();\n else return;\n img.onload = async () => {\n const canvas = image.canvas(img.naturalWidth, img.naturalHeight);\n if (!canvas) {\n log('Warmup: Canvas not found');\n resolve(undefined);\n } else {\n const ctx = canvas.getContext('2d');\n if (ctx) ctx.drawImage(img, 0, 0);\n // const data = ctx?.getImageData(0, 0, canvas.height, canvas.width);\n const tensor = await instance.image(canvas);\n const res = await instance.detect(tensor.tensor as Tensor, instance.config);\n resolve(res);\n }\n };\n if (src) img.src = src;\n else resolve(undefined);\n });\n}\n\nasync function warmupNode(instance: Human): Promise {\n const atob = (str: string) => Buffer.from(str, 'base64');\n let img;\n if (instance.config.warmup === 'face') img = atob(sample.face);\n else img = atob(sample.body);\n let res;\n if ('node' in tf) {\n // @ts-ignore tf.node may be undefined\n const data = tf['node'].decodeJpeg(img);\n const expanded = data.expandDims(0);\n instance.tf.dispose(data);\n // log('Input:', expanded);\n res = await instance.detect(expanded, instance.config);\n instance.tf.dispose(expanded);\n } else {\n if (instance.config.debug) log('Warmup tfjs-node not loaded');\n /*\n const input = await canvasJS.loadImage(img);\n const canvas = canvasJS.createCanvas(input.width, input.height);\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, input.width, input.height);\n res = await instance.detect(input, instance.config);\n */\n }\n return res;\n}\n\n/** Warmup method pre-initializes all configured models for faster inference\n * - can take significant time on startup\n * - only used for `webgl` and `humangl` backends\n * @param userConfig?: Config\n*/\nexport async function warmup(instance: Human, userConfig?: Partial): Promise {\n const t0 = now();\n instance.state = 'warmup';\n if (userConfig) instance.config = mergeDeep(instance.config, userConfig) as Config;\n if (!instance.config.warmup || instance.config.warmup.length === 0 || instance.config.warmup === 'none') {\n return { face: [], body: [], hand: [], gesture: [], object: [], performance: instance.performance, timestamp: now(), persons: [], error: null };\n }\n let res;\n return new Promise(async (resolve) => {\n if (typeof createImageBitmap === 'function') res = await warmupBitmap(instance);\n else if (typeof Image !== 'undefined' || env.Canvas !== undefined) res = await warmupCanvas(instance);\n else res = await warmupNode(instance);\n const t1 = now();\n if (instance.config.debug) log('Warmup', instance.config.warmup, Math.round(t1 - t0), 'ms');\n instance.emit('warmup');\n resolve(res);\n });\n}\n", "/**\n * Human main module\n * @default Human Library\n * @summary \n * @author \n * @copyright \n * @license MIT\n */\n\n// module imports\nimport { log, now, mergeDeep, validate } from './util/util';\nimport { defaults } from './config';\nimport { env, Env } from './util/env';\nimport { setModelLoadOptions } from './tfjs/load';\nimport * as tf from '../dist/tfjs.esm.js';\nimport * as app from '../package.json';\nimport * as backend from './tfjs/backend';\nimport * as blazepose from './body/blazepose';\nimport * as centernet from './object/centernet';\nimport * as draw from './util/draw';\nimport * as efficientpose from './body/efficientpose';\nimport * as face from './face/face';\nimport * as facemesh from './face/facemesh';\nimport * as faceres from './face/faceres';\nimport * as gesture from './gesture/gesture';\nimport * as handpose from './hand/handpose';\nimport * as handtrack from './hand/handtrack';\nimport * as humangl from './tfjs/humangl';\nimport * as image from './image/image';\nimport * as interpolate from './util/interpolate';\nimport * as match from './face/match';\nimport * as models from './models';\nimport * as movenet from './body/movenet';\nimport * as nanodet from './object/nanodet';\nimport * as persons from './util/persons';\nimport * as posenet from './body/posenet';\nimport * as segmentation from './segmentation/segmentation';\nimport * as warmups from './warmup';\n// type definitions\nimport type { Input, Tensor, DrawOptions, Config, Result, FaceResult, HandResult, BodyResult, ObjectResult, GestureResult, PersonResult, AnyCanvas } from './exports';\n// type exports\nexport * from './exports';\n\n/** **Human** library main class\n *\n * All methods and properties are available only as members of Human class\n *\n * - Configuration object definition: {@link Config}\n * - Results object definition: {@link Result}\n * - Possible inputs: {@link Input}\n *\n * @param userConfig - {@link Config}\n * @returns instance of {@link Human}\n */\nexport class Human {\n /** Current version of Human library in *semver* format */\n version: string;\n\n /** Current configuration\n * - Defaults: [config](https://github.com/vladmandic/human/blob/main/src/config.ts#L262)\n */\n config: Config;\n\n /** Last known result of detect run\n * - Can be accessed anytime after initial detection\n */\n result: Result;\n\n /** Current state of Human library\n * - Can be polled to determine operations that are currently executed\n * - Progresses through: 'config', 'check', 'backend', 'load', 'run:', 'idle'\n */\n state: string;\n\n /** currenty processed image tensor and canvas */\n process: { tensor: Tensor | null, canvas: AnyCanvas | null };\n\n /** Instance of TensorFlow/JS used by Human\n * - Can be embedded or externally provided\n * [TFJS API]: {@link https://js.tensorflow.org/api/latest/}\n */\n tf;\n\n /** Object containing environment information used for diagnostics */\n env: Env;\n\n /** Draw helper classes that can draw detected objects on canvas using specified draw\n * - canvas: draws input to canvas\n * - options: are global settings for all draw operations, can be overriden for each draw method {@link DrawOptions}\n * - face, body, hand, gesture, object, person: draws detected results as overlays on canvas\n */\n draw: { canvas: typeof draw.canvas, face: typeof draw.face, body: typeof draw.body, hand: typeof draw.hand, gesture: typeof draw.gesture, object: typeof draw.object, person: typeof draw.person, all: typeof draw.all, options: DrawOptions };\n\n /** Currently loaded models\n * @internal\n * {@link Models}\n */\n models: models.Models;\n\n /** Container for events dispatched by Human\n * Possible events:\n * - `create`: triggered when Human object is instantiated\n * - `load`: triggered when models are loaded (explicitly or on-demand)\n * - `image`: triggered when input image is processed\n * - `result`: triggered when detection is complete\n * - `warmup`: triggered when warmup is complete\n * - `error`: triggered on some errors\n */\n events: EventTarget | undefined;\n /** Reference face triangualtion array of 468 points, used for triangle references between points */\n faceTriangulation: number[];\n /** Refernce UV map of 468 values, used for 3D mapping of the face mesh */\n faceUVMap: [number, number][];\n /** Performance object that contains values for all recently performed operations */\n performance: Record; // perf members are dynamically defined as needed\n #numTensors: number;\n #analyzeMemoryLeaks: boolean;\n #checkSanity: boolean;\n /** WebGL debug info */\n gl: Record;\n // definition end\n\n /** Constructor for **Human** library that is futher used for all operations\n * @param userConfig - user configuration object {@link Config}\n */\n constructor(userConfig?: Partial) {\n this.env = env;\n defaults.wasmPath = tf.version['tfjs-core'].includes('-') // custom build or official build\n ? 'https://vladmandic.github.io/tfjs/dist/'\n : `https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${tf.version_core}/dist/`;\n defaults.modelBasePath = env.browser ? '../models/' : 'file://models/';\n defaults.backend = env.browser ? 'humangl' : 'tensorflow';\n this.version = app.version; // expose version property on instance of class\n Object.defineProperty(this, 'version', { value: app.version }); // expose version property directly on class itself\n this.config = JSON.parse(JSON.stringify(defaults));\n Object.seal(this.config);\n if (userConfig) this.config = mergeDeep(this.config, userConfig);\n this.config.cacheModels = typeof indexedDB !== 'undefined';\n setModelLoadOptions(this.config);\n this.tf = tf;\n this.state = 'idle';\n this.#numTensors = 0;\n this.#analyzeMemoryLeaks = false;\n this.#checkSanity = false;\n this.performance = {};\n this.events = (typeof EventTarget !== 'undefined') ? new EventTarget() : undefined;\n // object that contains all initialized models\n this.models = new models.Models();\n // reexport draw methods\n this.draw = {\n options: draw.options as DrawOptions,\n canvas: (input: AnyCanvas | HTMLImageElement | HTMLVideoElement, output: AnyCanvas) => draw.canvas(input, output),\n face: (output: AnyCanvas, result: FaceResult[], options?: Partial) => draw.face(output, result, options),\n body: (output: AnyCanvas, result: BodyResult[], options?: Partial) => draw.body(output, result, options),\n hand: (output: AnyCanvas, result: HandResult[], options?: Partial) => draw.hand(output, result, options),\n gesture: (output: AnyCanvas, result: GestureResult[], options?: Partial) => draw.gesture(output, result, options),\n object: (output: AnyCanvas, result: ObjectResult[], options?: Partial) => draw.object(output, result, options),\n person: (output: AnyCanvas, result: PersonResult[], options?: Partial) => draw.person(output, result, options),\n all: (output: AnyCanvas, result: Result, options?: Partial) => draw.all(output, result, options),\n };\n this.result = { face: [], body: [], hand: [], gesture: [], object: [], performance: {}, timestamp: 0, persons: [], error: null };\n // export access to image processing\n // @ts-ignore eslint-typescript cannot correctly infer type in anonymous function\n this.process = { tensor: null, canvas: null };\n // export raw access to underlying models\n this.faceTriangulation = facemesh.triangulation;\n this.faceUVMap = facemesh.uvmap;\n // set gl info\n this.gl = humangl.config;\n // include platform info\n this.emit('create');\n }\n\n /** internal function to measure tensor leaks */\n analyze = (...msg: string[]) => {\n if (!this.#analyzeMemoryLeaks) return;\n const currentTensors = this.tf.engine().state.numTensors;\n const previousTensors = this.#numTensors;\n this.#numTensors = currentTensors;\n const leaked = currentTensors - previousTensors;\n if (leaked !== 0) log(...msg, leaked);\n };\n\n /** internal function for quick sanity check on inputs @hidden */\n #sanity = (input: Input): null | string => {\n if (!this.#checkSanity) return null;\n if (!input) return 'input is not defined';\n if (this.env.node && !(input instanceof tf.Tensor)) return 'input must be a tensor';\n try {\n this.tf.getBackend();\n } catch {\n return 'backend not loaded';\n }\n return null;\n };\n\n /** Reset configuration to default values */\n reset(): void {\n const currentBackend = this.config.backend; // save backend;\n this.config = JSON.parse(JSON.stringify(defaults));\n this.config.backend = currentBackend;\n }\n\n /** Validate current configuration schema */\n validate(userConfig?: Partial) {\n return validate(defaults, userConfig || this.config);\n }\n\n /** Exports face matching methods {@link match#similarity} */\n public similarity = match.similarity;\n /** Exports face matching methods {@link match#distance} */\n public distance = match.distance;\n /** Exports face matching methods {@link match#match} */\n public match = match.match;\n\n /** Utility wrapper for performance.now() */\n now(): number {\n return now();\n }\n\n /** Process input as return canvas and tensor\n *\n * @param input - any input {@link Input}\n * @param getTensor - should image processing also return tensor or just canvas\n * Returns object with `tensor` and `canvas`\n */\n image(input: Input, getTensor: boolean = true) {\n return image.process(input, this.config, getTensor);\n }\n\n /** Segmentation method takes any input and returns processed canvas with body segmentation\n * - Segmentation is not triggered as part of detect process\n * @param input - {@link Input}\n * @param background - {@link Input}\n * - Optional parameter background is used to fill the background with specific input\n * Returns:\n * - `data` as raw data array with per-pixel segmentation values\n * - `canvas` as canvas which is input image filtered with segementation data and optionally merged with background image. canvas alpha values are set to segmentation values for easy merging\n * - `alpha` as grayscale canvas that represents segmentation alpha values\n */\n async segmentation(input: Input, background?: Input): Promise<{ data: number[] | Tensor, canvas: AnyCanvas | null, alpha: AnyCanvas | null }> {\n return segmentation.process(input, background, this.config);\n }\n\n /** Enhance method performs additional enhacements to face image previously detected for futher processing\n *\n * @param input - Tensor as provided in human.result.face[n].tensor\n * @returns Tensor\n */\n // eslint-disable-next-line class-methods-use-this\n enhance(input: Tensor): Tensor | null {\n return faceres.enhance(input);\n }\n\n /** Compare two input tensors for pixel simmilarity\n * - use `human.image` to process any valid input and get a tensor that can be used for compare\n * - when passing manually generated tensors:\n * - both input tensors must be in format [1, height, width, 3]\n * - if resolution of tensors does not match, second tensor will be resized to match resolution of the first tensor\n * - return value is pixel similarity score normalized by input resolution and rgb channels\n */\n compare(firstImageTensor: Tensor, secondImageTensor: Tensor): Promise {\n return image.compare(this.config, firstImageTensor, secondImageTensor);\n }\n\n /** Explicit backend initialization\n * - Normally done implicitly during initial load phase\n * - Call to explictly register and initialize TFJS backend without any other operations\n * - Use when changing backend during runtime\n */\n async init(): Promise {\n await backend.check(this, true);\n await this.tf.ready();\n }\n\n /** Load method preloads all configured models on-demand\n * - Not explicitly required as any required model is load implicitly on it's first run\n *\n * @param userConfig - {@link Config}\n */\n async load(userConfig?: Partial): Promise {\n this.state = 'load';\n const timeStamp = now();\n const count = Object.values(this.models).filter((model) => model).length;\n if (userConfig) this.config = mergeDeep(this.config, userConfig) as Config;\n\n if (this.env.initial) { // print version info on first run and check for correct backend setup\n if (this.config.debug) log(`version: ${this.version}`);\n if (this.config.debug) log(`tfjs version: ${this.tf.version['tfjs-core']}`);\n if (!await backend.check(this)) log('error: backend check failed');\n await tf.ready();\n if (this.env.browser) {\n if (this.config.debug) log('configuration:', this.config);\n if (this.config.debug) log('environment:', this.env);\n if (this.config.debug) log('tf flags:', this.tf.ENV['flags']);\n }\n }\n\n await models.load(this); // actually loads models\n if (this.env.initial && this.config.debug) log('tf engine state:', this.tf.engine().state.numBytes, 'bytes', this.tf.engine().state.numTensors, 'tensors'); // print memory stats on first run\n this.env.initial = false;\n\n const loaded = Object.values(this.models).filter((model) => model).length;\n if (loaded !== count) { // number of loaded models changed\n await models.validate(this); // validate kernel ops used by model against current backend\n this.emit('load');\n }\n\n const current = Math.trunc(now() - timeStamp);\n if (current > (this.performance.loadModels as number || 0)) this.performance.loadModels = this.env.perfadd ? (this.performance.loadModels || 0) + current : current;\n }\n\n /** emit event */\n emit = (event: string) => {\n if (this.events && this.events.dispatchEvent) this.events?.dispatchEvent(new Event(event));\n };\n\n /** Runs interpolation using last known result and returns smoothened result\n * Interpolation is based on time since last known result so can be called independently\n *\n * @param result - {@link Result} optional use specific result set to run interpolation on\n * @returns result - {@link Result}\n */\n next(result: Result = this.result): Result {\n return interpolate.calc(result, this.config) as Result;\n }\n\n /** Warmup method pre-initializes all configured models for faster inference\n * - can take significant time on startup\n * - only used for `webgl` and `humangl` backends\n * @param userConfig - {@link Config}\n * @returns result - {@link Result}\n */\n async warmup(userConfig?: Partial) {\n const t0 = now();\n const res = await warmups.warmup(this, userConfig);\n const t1 = now();\n this.performance.warmup = Math.trunc(t1 - t0);\n return res;\n }\n\n /** Run detect with tensorflow profiling\n * - result object will contain total exeuction time information for top-20 kernels\n * - actual detection object can be accessed via `human.result`\n */\n async profile(input: Input, userConfig?: Partial): Promise> {\n const profile = await this.tf.profile(() => this.detect(input, userConfig));\n const kernels: Record = {};\n for (const kernel of profile.kernels) { // sum kernel time values per kernel\n if (kernels[kernel.name]) kernels[kernel.name] += kernel.kernelTimeMs;\n else kernels[kernel.name] = kernel.kernelTimeMs;\n }\n const kernelArr: Array<{ name: string, ms: number }> = [];\n Object.entries(kernels).forEach((key) => kernelArr.push({ name: key[0], ms: key[1] as unknown as number })); // convert to array\n kernelArr.sort((a, b) => b.ms - a.ms); // sort\n kernelArr.length = 20; // crop\n const res: Record = {};\n for (const kernel of kernelArr) res[kernel.name] = kernel.ms; // create perf objects\n return res;\n }\n\n /** Main detection method\n * - Analyze configuration: {@link Config}\n * - Pre-process input: {@link Input}\n * - Run inference for all configured models\n * - Process and return result: {@link Result}\n *\n * @param input - {@link Input}\n * @param userConfig - {@link Config}\n * @returns result - {@link Result}\n */\n async detect(input: Input, userConfig?: Partial): Promise {\n // detection happens inside a promise\n this.state = 'detect';\n return new Promise(async (resolve) => {\n this.state = 'config';\n let timeStamp;\n\n // update configuration\n this.config = mergeDeep(this.config, userConfig) as Config;\n\n // sanity checks\n this.state = 'check';\n const error = this.#sanity(input);\n if (error) {\n log(error, input);\n this.emit('error');\n resolve({ face: [], body: [], hand: [], gesture: [], object: [], performance: this.performance, timestamp: now(), persons: [], error });\n }\n\n const timeStart = now();\n\n // configure backend if needed\n await backend.check(this);\n\n // load models if enabled\n await this.load();\n\n timeStamp = now();\n this.state = 'image';\n const img = await image.process(input, this.config) as { canvas: AnyCanvas, tensor: Tensor };\n this.process = img;\n this.performance.inputProcess = this.env.perfadd ? (this.performance.inputProcess || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n this.analyze('Get Image:');\n\n if (!img.tensor) {\n if (this.config.debug) log('could not convert input to tensor');\n this.emit('error');\n resolve({ face: [], body: [], hand: [], gesture: [], object: [], performance: this.performance, timestamp: now(), persons: [], error: 'could not convert input to tensor' });\n return;\n }\n this.emit('image');\n\n timeStamp = now();\n this.config.skipAllowed = await image.skip(this.config, img.tensor);\n if (!this.performance.totalFrames) this.performance.totalFrames = 0;\n if (!this.performance.cachedFrames) this.performance.cachedFrames = 0;\n (this.performance.totalFrames as number)++;\n if (this.config.skipAllowed) this.performance.cachedFrames++;\n this.performance.cacheCheck = this.env.perfadd ? (this.performance.cacheCheck || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n this.analyze('Check Changed:');\n\n // prepare where to store model results\n // keep them with weak typing as it can be promise or not\n let faceRes: FaceResult[] | Promise | never[] = [];\n let bodyRes: BodyResult[] | Promise | never[] = [];\n let handRes: HandResult[] | Promise | never[] = [];\n let objectRes: ObjectResult[] | Promise | never[] = [];\n\n // run face detection followed by all models that rely on face bounding box: face mesh, age, gender, emotion\n this.state = 'detect:face';\n if (this.config.async) {\n faceRes = this.config.face.enabled ? face.detectFace(this, img.tensor) : [];\n if (this.performance.face) delete this.performance.face;\n } else {\n timeStamp = now();\n faceRes = this.config.face.enabled ? await face.detectFace(this, img.tensor) : [];\n this.performance.face = this.env.perfadd ? (this.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n\n if (this.config.async && (this.config.body.maxDetected === -1 || this.config.hand.maxDetected === -1)) faceRes = await faceRes; // need face result for auto-detect number of hands or bodies\n\n // run body: can be posenet, blazepose, efficientpose, movenet\n this.analyze('Start Body:');\n this.state = 'detect:body';\n const bodyConfig = this.config.body.maxDetected === -1 ? mergeDeep(this.config, { body: { maxDetected: this.config.face.enabled ? 1 * (faceRes as FaceResult[]).length : 1 } }) : this.config; // autodetect number of bodies\n if (this.config.async) {\n if (this.config.body.modelPath?.includes('posenet')) bodyRes = this.config.body.enabled ? posenet.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('blazepose')) bodyRes = this.config.body.enabled ? blazepose.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('efficientpose')) bodyRes = this.config.body.enabled ? efficientpose.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('movenet')) bodyRes = this.config.body.enabled ? movenet.predict(img.tensor, bodyConfig) : [];\n if (this.performance.body) delete this.performance.body;\n } else {\n timeStamp = now();\n if (this.config.body.modelPath?.includes('posenet')) bodyRes = this.config.body.enabled ? await posenet.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('blazepose')) bodyRes = this.config.body.enabled ? await blazepose.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('efficientpose')) bodyRes = this.config.body.enabled ? await efficientpose.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('movenet')) bodyRes = this.config.body.enabled ? await movenet.predict(img.tensor, bodyConfig) : [];\n this.performance.body = this.env.perfadd ? (this.performance.body || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n this.analyze('End Body:');\n\n // run handpose\n this.analyze('Start Hand:');\n this.state = 'detect:hand';\n const handConfig = this.config.hand.maxDetected === -1 ? mergeDeep(this.config, { hand: { maxDetected: this.config.face.enabled ? 2 * (faceRes as FaceResult[]).length : 1 } }) : this.config; // autodetect number of hands\n if (this.config.async) {\n if (this.config.hand.detector?.modelPath?.includes('handdetect')) handRes = this.config.hand.enabled ? handpose.predict(img.tensor, handConfig) : [];\n else if (this.config.hand.detector?.modelPath?.includes('handtrack')) handRes = this.config.hand.enabled ? handtrack.predict(img.tensor, handConfig) : [];\n if (this.performance.hand) delete this.performance.hand;\n } else {\n timeStamp = now();\n if (this.config.hand.detector?.modelPath?.includes('handdetect')) handRes = this.config.hand.enabled ? await handpose.predict(img.tensor, handConfig) : [];\n else if (this.config.hand.detector?.modelPath?.includes('handtrack')) handRes = this.config.hand.enabled ? await handtrack.predict(img.tensor, handConfig) : [];\n this.performance.hand = this.env.perfadd ? (this.performance.hand || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n this.analyze('End Hand:');\n\n // run object detection\n this.analyze('Start Object:');\n this.state = 'detect:object';\n if (this.config.async) {\n if (this.config.object.modelPath?.includes('nanodet')) objectRes = this.config.object.enabled ? nanodet.predict(img.tensor, this.config) : [];\n else if (this.config.object.modelPath?.includes('centernet')) objectRes = this.config.object.enabled ? centernet.predict(img.tensor, this.config) : [];\n if (this.performance.object) delete this.performance.object;\n } else {\n timeStamp = now();\n if (this.config.object.modelPath?.includes('nanodet')) objectRes = this.config.object.enabled ? await nanodet.predict(img.tensor, this.config) : [];\n else if (this.config.object.modelPath?.includes('centernet')) objectRes = this.config.object.enabled ? await centernet.predict(img.tensor, this.config) : [];\n this.performance.object = this.env.perfadd ? (this.performance.object || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n this.analyze('End Object:');\n\n // if async wait for results\n this.state = 'detect:await';\n if (this.config.async) [faceRes, bodyRes, handRes, objectRes] = await Promise.all([faceRes, bodyRes, handRes, objectRes]);\n\n // run gesture analysis last\n this.state = 'detect:gesture';\n let gestureRes: GestureResult[] = [];\n if (this.config.gesture.enabled) {\n timeStamp = now();\n gestureRes = [...gesture.face(faceRes as FaceResult[]), ...gesture.body(bodyRes as BodyResult[]), ...gesture.hand(handRes as HandResult[]), ...gesture.iris(faceRes as FaceResult[])];\n if (!this.config.async) this.performance.gesture = this.env.perfadd ? (this.performance.gesture || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n else if (this.performance.gesture) delete this.performance.gesture;\n }\n\n this.performance.total = this.env.perfadd ? (this.performance.total || 0) + Math.trunc(now() - timeStart) : Math.trunc(now() - timeStart);\n const shape = this.process?.tensor?.shape || [];\n this.result = {\n face: faceRes as FaceResult[],\n body: bodyRes as BodyResult[],\n hand: handRes as HandResult[],\n gesture: gestureRes,\n object: objectRes as ObjectResult[],\n performance: this.performance,\n canvas: this.process.canvas,\n timestamp: Date.now(),\n error: null,\n get persons() { return persons.join(faceRes as FaceResult[], bodyRes as BodyResult[], handRes as HandResult[], gestureRes, shape); },\n };\n\n // finally dispose input tensor\n tf.dispose(img.tensor);\n\n // log('Result:', result);\n this.emit('detect');\n this.state = 'idle';\n resolve(this.result);\n });\n }\n}\n\n/** Class Human as default export */\n/* eslint no-restricted-exports: [\"off\", { \"restrictedNamedExports\": [\"default\"] }] */\nexport { Human as default };\n"], - "mappings": ";;;;;;22BAOO,cAAgB,EAAW,CAChC,GAAM,GAAK,GAAI,MACT,EAAK,GAAG,EAAG,SAAS,EAAE,SAAS,EAAE,SAAS,EAAG,GAAG,KAAK,EAAG,WAAW,EAAE,SAAS,EAAE,SAAS,EAAG,GAAG,KAAK,EAAG,WAAW,EAAE,SAAS,EAAE,SAAS,EAAG,GAAG,KAAK,EAAG,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAG,GAAG,IAExM,AAAI,GAAK,QAAQ,IAAI,EAAI,SAAU,GAAG,CAAG,CAC3C,CAGO,YAAc,EAAgB,EAAsB,CACzD,GAAM,GAAY,EAAO,SAAS,GAAG,EAAI,GAAK,IAExC,EAAO,AADI,EAAK,WAAW,GAAG,GAAK,EAAK,WAAW,GAAG,GAAK,EAAK,WAAW,OAAO,GAAK,EAAK,WAAW,QAAQ,GAAK,EAAK,WAAW,OAAO,EACzH,GAAG,IAAS,GAAG,IAAS,IAAY,IAC5D,GAAI,CAAC,EAAK,kBAAkB,EAAE,SAAS,OAAO,EAAG,KAAM,IAAI,OAAM,yCAAyC,GAAM,EAChH,MAAO,EACT,CAGO,GAAM,GAAM,IACb,MAAO,cAAgB,YAAoB,YAAY,IAAI,EACxD,SAAU,QAAO,QAAQ,OAAO,OAAO,CAAC,EAAI,IAAO,KAAM,SAAS,CAAC,EAIrE,YAAkB,EAA2B,EAAyB,EAAS,SAAU,EAAoE,CAAC,EAAG,CACtK,OAAW,KAAO,QAAO,KAAK,CAAM,EAClC,GAAI,MAAO,GAAO,IAAS,SACzB,GAAS,EAAS,GAAM,EAAO,GAAM,EAAK,CAAI,MACzC,CACL,GAAM,GAAU,GAAa,MAAO,GAAS,IAAS,YACtD,AAAK,GAAS,EAAK,KAAK,CAAE,OAAQ,mBAAoB,MAAO,GAAG,KAAU,OAAS,EAAO,IAAO,CAAC,EAClG,GAAM,GAAO,GAAY,MAAO,GAAS,IAAS,MAAO,GAAO,GAChE,AAAI,GAAW,CAAC,GAAM,EAAK,KAAK,CAAE,OAAQ,yBAA0B,MAAO,GAAG,KAAU,OAAS,EAAO,KAAQ,SAAU,MAAO,GAAS,EAAK,CAAC,CAClJ,CAGF,MAAI,GAAO,OAAS,IAAW,UAAY,EAAK,OAAS,GAAG,EAAI,wBAAyB,CAAI,EACtF,CACT,CAGO,eAAsB,EAAS,CACpC,GAAM,GAAW,AAAC,GAAQ,GAAO,MAAO,IAAQ,SAChD,MAAO,GAAQ,OAAO,CAAC,EAAM,IAC3B,QAAO,KAAK,GAAO,CAAC,CAAC,EAAE,QAAQ,AAAC,GAAQ,CACtC,GAAM,GAAO,EAAK,GACZ,EAAO,EAAI,GACjB,AAAI,MAAM,QAAQ,CAAI,GAAK,MAAM,QAAQ,CAAI,EAAG,EAAK,GAAO,EAAK,OAAO,GAAG,CAAI,EAC1E,AAAI,EAAS,CAAI,GAAK,EAAS,CAAI,EAAG,EAAK,GAAO,GAAU,EAAM,CAAI,EACtE,EAAK,GAAO,CACnB,CAAC,EACM,GACN,CAAC,CAAC,CACP,CC+OA,GAAM,IAAiB,CACrB,QAAS,GACT,cAAe,GACf,YAAa,GACb,SAAU,GACV,kBAAmB,GACnB,MAAO,GACP,MAAO,GACP,OAAQ,OACR,iBAAkB,GAClB,YAAa,GACb,WAAY,GACZ,OAAQ,CACN,QAAS,GACT,aAAc,GACd,MAAO,EACP,OAAQ,EACR,KAAM,GACN,OAAQ,GACR,WAAY,EACZ,SAAU,EACV,UAAW,EACX,KAAM,EACN,WAAY,EACZ,IAAK,EACL,SAAU,GACV,MAAO,GACP,QAAS,GACT,WAAY,GACZ,YAAa,GACb,SAAU,GACV,SAAU,CACZ,EACA,QAAS,CACP,QAAS,EACX,EACA,KAAM,CACJ,QAAS,GACT,SAAU,CACR,UAAW,iBACX,SAAU,GACV,YAAa,EACb,WAAY,GACZ,SAAU,KACV,cAAe,GACf,aAAc,GACd,KAAM,GACN,OAAQ,EACV,EACA,KAAM,CACJ,QAAS,GACT,UAAW,eACb,EACA,KAAM,CACJ,QAAS,GACT,UAAW,WACb,EACA,QAAS,CACP,QAAS,GACT,cAAe,GACf,WAAY,GACZ,SAAU,KACV,UAAW,cACb,EACA,YAAa,CACX,QAAS,GACT,UAAW,eACX,WAAY,GACZ,SAAU,IACV,cAAe,EACjB,EACA,UAAW,CACT,QAAS,GACT,WAAY,GACZ,SAAU,IACV,UAAW,gBACb,EACA,SAAU,CACR,QAAS,GACT,WAAY,GACZ,SAAU,IACV,UAAW,eACb,CACF,EACA,KAAM,CACJ,QAAS,GACT,UAAW,yBACX,YAAa,GACb,cAAe,GACf,WAAY,EACZ,SAAU,GACZ,EACA,KAAM,CACJ,QAAS,GACT,SAAU,GACV,WAAY,GACZ,SAAU,IACV,cAAe,GACf,aAAc,GACd,YAAa,GACb,UAAW,GACX,SAAU,CACR,UAAW,gBACb,EACA,SAAU,CACR,UAAW,wBACb,CACF,EACA,OAAQ,CACN,QAAS,GACT,UAAW,qBACX,cAAe,GACf,aAAc,GACd,YAAa,GACb,WAAY,GACZ,SAAU,GACZ,EACA,aAAc,CACZ,QAAS,GACT,UAAW,cACX,KAAM,CACR,CACF,ECpaA,gEAMA,QAA4C,QAA5C,kDAA4C,gEAAkS,yDAAwD,oEAAhS,GAAI,IAAE,SAAS,GAAE,SAAS,GAAE,SAAS,GAAE,SAAS,GAAE,SAAS,GAAE,SAAS,GAAE,SAAS,GAAE,SAAS,GAAE,CAAC,KAAK,GAAE,YAAY,GAAE,YAAY,GAAE,cAAc,GAAE,iBAAiB,GAAE,mBAAmB,GAAE,qBAAqB,GAAE,oBAAoB,EAAC,ECNrU,GAAM,IAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAqBvB,GAAM,IAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcvB,GAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAc1B,GAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeX,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBP,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EChF3B,GAAM,IAAU,CAAC,EAAQ,EAAQ,IAAe,CAC9C,GAAM,GAAI,GAAI,QAAO,MAAQ,EAAS,eAAgB,IAAI,EAC1D,EAAO,QAAQ,EAAG,CAAC,EAAO,IACxB,GAAW,GAAQ,EACZ,EACR,CACH,EAEA,QAAgB,CAMd,YAAY,EAAI,EAAc,EAAgB,CAL9C,iBAAU,CAAC,GACX,mBAAY,CAAC,GACb,aACA,aA2BA,iBAAU,CAAC,EAAQ,IAA6B,CAC9C,GAAM,GAAS,KAAK,GAAG,aAAa,CAAI,EACxC,MAAK,GAIL,MAAK,GAAG,aAAa,EAAQ,CAAM,EACnC,KAAK,GAAG,cAAc,CAAM,EACxB,AAAC,KAAK,GAAG,mBAAmB,EAAQ,KAAK,GAAG,cAAc,EAIvD,EAHL,GAAI,8BAA8B,KAAK,GAAG,iBAAiB,CAAM,GAAG,EAC7D,OAPP,GAAI,iCAAiC,EAC9B,KASX,GArCE,KAAK,GAAK,EACV,GAAM,GAAe,KAAK,QAAQ,EAAc,KAAK,GAAG,aAAa,EAC/D,EAAiB,KAAK,QAAQ,EAAgB,KAAK,GAAG,eAAe,EAE3E,GADA,KAAK,GAAK,KAAK,GAAG,cAAc,EAC5B,GAAC,GAAgB,CAAC,GACtB,IAAI,CAAC,KAAK,GAAI,CACZ,EAAI,wCAAwC,EAC5C,MACF,CAIA,GAHA,KAAK,GAAG,aAAa,KAAK,GAAI,CAAY,EAC1C,KAAK,GAAG,aAAa,KAAK,GAAI,CAAc,EAC5C,KAAK,GAAG,YAAY,KAAK,EAAE,EACvB,CAAC,KAAK,GAAG,oBAAoB,KAAK,GAAI,KAAK,GAAG,WAAW,EAAG,CAC9D,EAAI,2BAA2B,KAAK,GAAG,kBAAkB,KAAK,EAAE,GAAG,EACnE,MACF,CACA,KAAK,GAAG,WAAW,KAAK,EAAE,EAC1B,GAAQ,EAAc,YAAa,KAAK,SAAS,EACjD,OAAW,KAAK,MAAK,UAAW,KAAK,UAAU,GAAK,KAAK,GAAG,kBAAkB,KAAK,GAAI,CAAC,EACxF,GAAQ,EAAc,UAAW,KAAK,OAAO,EAC7C,GAAQ,EAAgB,UAAW,KAAK,OAAO,EAC/C,OAAW,KAAK,MAAK,QAAS,KAAK,QAAQ,GAAK,KAAK,GAAG,mBAAmB,KAAK,GAAI,CAAC,EACvF,CAgBF,EAWO,aAAyB,CAC9B,GAAI,GAAY,EACZ,EAAqC,KACrC,EAAc,GACd,EAA0B,GAC1B,EAAoG,CAAC,KAAM,IAAI,EAC/G,EAAyC,CAAC,EAC1C,EAAmC,KACnC,EAAmC,KACjC,EAAW,GAAO,IAAK,GAAG,EAC1B,EAAqB,CAAE,EACvB,EAAO,CAAE,aAAc,CAAE,EACzB,EAAK,EAAS,WAAW,OAAO,EAGtC,GADA,KAAK,GAAK,EACN,CAAC,EAAI,CACP,EAAI,kCAAkC,EACtC,MACF,CAEA,WAAgB,EAAO,EAAQ,CAC7B,GAAI,MAAU,EAAS,OAAS,IAAW,EAAS,QAGpD,IAFA,EAAS,MAAQ,EACjB,EAAS,OAAS,EACd,CAAC,EAAc,CACjB,GAAM,GAAW,GAAI,cAAa,CAAC,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,CAAC,EAChH,EAAe,EAAG,aAAa,EAC/B,EAAG,WAAW,EAAG,aAAc,CAAY,EAC3C,EAAG,WAAW,EAAG,aAAc,EAAU,EAAG,WAAW,EACvD,EAAG,YAAY,EAAG,+BAAgC,EAAI,CACxD,CACA,EAAG,SAAS,EAAG,EAAG,EAAS,MAAO,EAAS,MAAM,EACjD,EAAmB,CAAC,KAAM,IAAI,EAChC,CAEA,WAAkC,EAAO,EAAQ,CAC/C,GAAM,GAAM,EAAG,kBAAkB,EACjC,EAAG,gBAAgB,EAAG,YAAa,CAAG,EACtC,GAAM,GAAe,EAAG,mBAAmB,EAC3C,EAAG,iBAAiB,EAAG,aAAc,CAAY,EACjD,GAAM,GAAU,EAAG,cAAc,EACjC,SAAG,YAAY,EAAG,WAAY,CAAO,EACrC,EAAG,WAAW,EAAG,WAAY,EAAG,EAAG,KAAM,EAAO,EAAQ,EAAG,EAAG,KAAM,EAAG,cAAe,IAAI,EAC1F,EAAG,cAAc,EAAG,WAAY,EAAG,mBAAoB,EAAG,MAAM,EAChE,EAAG,cAAc,EAAG,WAAY,EAAG,mBAAoB,EAAG,MAAM,EAChE,EAAG,cAAc,EAAG,WAAY,EAAG,eAAgB,EAAG,aAAa,EACnE,EAAG,cAAc,EAAG,WAAY,EAAG,eAAgB,EAAG,aAAa,EACnE,EAAG,qBAAqB,EAAG,YAAa,EAAG,kBAAmB,EAAG,WAAY,EAAS,CAAC,EACvF,EAAG,YAAY,EAAG,WAAY,IAAI,EAClC,EAAG,gBAAgB,EAAG,YAAa,IAAI,EAChC,CAAE,MAAK,SAAQ,CACxB,CAEA,WAA4B,EAAuE,CACjG,SAAiB,GAAS,EAAiB,IAAU,EAAyB,EAAS,MAAO,EAAS,MAAM,EACtG,EAAiB,EAC1B,CAEA,WAAc,EAAQ,EAAG,CACvB,GAAI,CAAC,EAAgB,OACrB,GAAI,GAA8B,KAC9B,EAAkC,KAClC,EAAQ,GACZ,AAAI,IAAc,EAAG,EAAS,EACzB,EAAS,EAAmB,CAAuB,EAAE,SAAW,KACrE,IACA,AAAI,GAAe,CAAE,GAAQ,EAAK,cAChC,GAAS,KACT,EAAQ,EAAY,IAAM,GAE1B,GAA2B,GAA0B,GAAK,EAC1D,EAAS,EAAmB,CAAuB,EAAE,KAAO,MAE9D,EAAG,YAAY,EAAG,WAAY,CAAM,EACpC,EAAG,gBAAgB,EAAG,YAAa,CAAM,EACzC,EAAG,UAAU,EAAe,QAAQ,MAAW,EAAQ,GAAK,CAAE,EAC9D,EAAG,WAAW,EAAG,UAAW,EAAG,CAAC,CAClC,CAEA,WAAuB,EAAkC,CACvD,GAAI,EAAmB,GACrB,SAAiB,EAAmB,GACpC,EAAG,WAAY,GAAiB,EAAe,GAAK,OAAS,IAAI,EAC1D,EAGT,GADA,EAAiB,GAAI,IAAU,EAAY,GAAgB,CAAc,EACrE,CAAC,EACH,SAAI,qCAAqC,EAClC,KAET,GAAM,GAAY,aAAa,kBACzB,EAAW,EAAI,EACrB,SAAG,wBAAwB,EAAe,UAAU,GAAM,EAC1D,EAAG,oBAAoB,EAAe,UAAU,IAAQ,EAAG,EAAG,MAAO,GAAO,EAAU,EAAI,CAAS,EACnG,EAAG,wBAAwB,EAAe,UAAU,EAAK,EACzD,EAAG,oBAAoB,EAAe,UAAU,GAAO,EAAG,EAAG,MAAO,GAAO,EAAU,EAAI,CAAS,EAClG,EAAmB,GAAkB,EAC9B,CACT,CAEA,GAAM,GAAS,CACb,YAAa,AAAC,GAAW,CACvB,GAAM,GAAI,GAAI,cAAa,CAAM,EACjC,EAAE,IAAM,IACR,EAAE,IAAM,IACR,EAAE,KAAO,IACT,EAAE,KAAO,IACT,GAAM,GAAU,EAAE,MAAQ,GAAK,EAAE,KAAO,GAAK,EAAE,KAAO,GAAK,EAAE,MAAQ,GAAK,EAAE,MAAQ,GAAK,EAAE,MAAQ,GAAK,EAAE,MAAQ,GAAK,EAAE,MAAQ,EACrH,GACA,GACN,EAAU,EAAc,CAAM,EACpC,AAAI,CAAC,GACL,GAAG,WAAW,EAAQ,QAAQ,EAAM,CAAC,EACrC,EAAK,EACP,EAEA,WAAY,AAAC,GAAe,CAC1B,GAAM,GAAK,IAAc,GAAK,EAC9B,EAAO,YAAY,CACjB,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,CACd,CAAC,CACH,EAEA,WAAY,AAAC,GAAW,CACtB,GAAM,GAAK,IAAU,GAAK,EAAI,EAAI,EAC5B,EAAM,GAAI,GAAK,IACrB,EAAO,YAAY,CACjB,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,CACd,CAAC,CACH,EAEA,WAAY,IAAM,CAChB,EAAO,WAAW,EAAE,CACtB,EAEA,SAAU,AAAC,GAAW,CACpB,GAAM,GAAK,IAAU,GAAK,EACpB,EAAI,KAAQ,GAAI,GACtB,EAAO,YAAY,CACjB,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,CACd,CAAC,CACH,EAEA,SAAU,IAAM,CACd,EAAO,SAAS,EAAE,CACpB,EAEA,IAAK,AAAC,GAAa,CACjB,EAAY,IAAY,GAAK,IAAM,KAAK,GACxC,GAAM,GAAM,KAAK,IAAI,CAAQ,EACvB,EAAM,KAAK,IAAI,CAAQ,EACvB,EAAO,KACP,EAAO,KACP,EAAO,KACb,EAAO,YAAY,CACjB,EAAO,EAAO,GAAI,GAAQ,EAAO,CAAC,EAAO,EAAO,EAAO,CAAC,EAAQ,EAAO,CAAC,EAAO,EAAO,EAAO,CAAC,EAAQ,EAAO,GAAI,GAAO,EAAG,EAC3H,EAAO,EAAO,CAAC,EAAQ,EAAO,KAAQ,EAAO,EAAO,GAAI,GAAQ,EAAO,IAAQ,EAAO,EAAO,CAAC,EAAQ,EAAO,MAAS,EAAG,EACzH,EAAO,EAAO,CAAC,EAAQ,EAAO,CAAE,GAAI,GAAQ,EAAO,EAAO,CAAC,EAAQ,EAAO,EAAO,EAAO,EAAO,GAAI,GAAQ,EAAO,EAAO,EAAG,EAC5H,EAAG,EAAG,EAAG,EAAG,CACd,CAAC,CACH,EAEA,oBAAqB,IAAM,CACzB,EAAO,YAAY,CACjB,SAAW,QAAW,SAAW,EAAG,MACpC,SAAW,QAAW,SAAW,EAAG,MACpC,SAAW,QAAW,SAAW,EAAG,MACpC,EAAG,EAAG,EAAG,EAAG,CACd,CAAC,CACH,EAEA,MAAO,IAAM,CACX,EAAO,YAAY,CACjB,KAAO,SAAW,UAAY,EAAG,EACjC,KAAO,SAAW,UAAY,EAAG,EACjC,KAAO,SAAW,UAAY,EAAG,EACjC,EAAG,EAAG,EAAG,EAAG,CACd,CAAC,CACH,EAEA,QAAS,IAAM,CACb,EAAO,YAAY,CACjB,kBAAoB,mBAAqB,mBAAqB,EAAG,kBACjE,qBAAuB,kBAAoB,mBAAqB,EAAG,mBACnE,mBAAqB,oBAAsB,mBAAqB,EAAG,mBACnE,EAAG,EAAG,EAAG,EAAG,CACd,CAAC,CACH,EAEA,eAAgB,IAAM,CACpB,EAAO,YAAY,CACjB,kBAAoB,kBAAoB,oBAAsB,EAAG,kBACjE,mBAAqB,kBAAoB,mBAAqB,EAAG,kBACjE,kBAAoB,mBAAqB,kBAAoB,EAAG,kBAChE,EAAG,EAAG,EAAG,EAAG,CACd,CAAC,CACH,EAEA,WAAY,IAAM,CAChB,EAAO,YAAY,CACjB,mBAAoB,mBAAqB,oBAAsB,EAAG,kBAClE,oBAAsB,mBAAoB,oBAAsB,EAAG,mBACnE,oBAAsB,mBAAqB,mBAAoB,EAAG,kBAClE,EAAG,EAAG,EAAG,EAAG,CACd,CAAC,CACH,EAEA,YAAa,IAAM,CACjB,EAAO,YAAY,CACjB,mBAAoB,mBAAqB,oBAAsB,EAAG,mBAClE,mBAAqB,mBAAoB,oBAAsB,EAAG,mBAClE,kBAAoB,mBAAqB,kBAAmB,EAAG,mBAC/D,EAAG,EAAG,EAAG,EAAG,CACd,CAAC,CACH,EAEA,SAAU,IAAM,CACd,EAAO,YAAY,CACjB,MAAO,MAAQ,MAAQ,EAAG,EAC1B,MAAQ,MAAO,MAAQ,EAAG,EAC1B,MAAQ,MAAQ,MAAO,EAAG,EAC1B,EAAG,EAAG,EAAG,EAAG,CACd,CAAC,CACH,EAEA,WAAY,IAAM,CAChB,EAAO,YAAY,CACjB,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,CACd,CAAC,CACH,EAEA,YAAa,AAAC,GAAW,CACvB,GAAM,GAAI,GAAI,cAAa,CAAM,EAC3B,EAAa,EAAI,EAAS,MAC1B,EAAa,EAAI,EAAS,OAC1B,EAAU,EAAsB,EAAW,EACjD,AAAI,CAAC,GACL,GAAG,WAAW,EAAQ,QAAQ,EAAM,CAAC,EACrC,EAAG,UAAU,EAAQ,QAAQ,GAAO,EAAY,CAAU,EAC1D,EAAK,EACP,EAEA,YAAa,IAAM,CAEjB,EAAO,YAAY,KAAK,KAAM,CAC5B,EAAG,EAAG,EACN,EAAG,GAAI,EACP,EAAG,EAAG,CACR,CAAC,CACH,EAEA,OAAQ,IAAM,CAEZ,EAAO,YAAY,KAAK,KAAM,CAC5B,GAAI,EAAG,EACP,GAAI,EAAG,EACP,GAAI,EAAG,CACT,CAAC,CACH,EAEA,OAAQ,IAAM,CAEZ,EAAO,YAAY,KAAK,KAAM,CAC5B,GAAI,GAAI,GACR,EAAG,EAAG,EACN,EAAG,EAAG,CACR,CAAC,CACH,EAEA,QAAS,AAAC,GAAW,CACnB,GAAM,GAAI,GAAU,EAEpB,EAAO,YAAY,KAAK,KAAM,CAC5B,EAAG,GAAK,EAAG,EACX,GAAK,EAAG,EAAI,EAAI,EAAG,GAAK,EACxB,EAAG,GAAK,EAAG,CACb,CAAC,CACH,EAEA,OAAQ,AAAC,GAAS,CAChB,GAAM,GAAI,GAAQ,EAElB,EAAO,YAAY,KAAK,KAAM,CAC5B,GAAK,EAAG,GAAK,EAAG,EAChB,GAAK,EAAG,EAAG,EAAI,EACf,EAAG,EAAI,EAAG,EAAI,CAChB,CAAC,CACH,EAEA,KAAM,AAAC,GAAS,CACd,GAAM,GAAa,EAAO,EAAK,EAAS,MAClC,EAAa,EAAO,EAAK,EAAS,OAClC,EAAU,EAAsB,EAAI,EAC1C,AAAI,CAAC,GAEL,GAAG,UAAU,EAAQ,QAAQ,GAAO,EAAG,CAAS,EAChD,EAAK,EAAK,YAAY,EAEtB,EAAG,UAAU,EAAQ,QAAQ,GAAO,EAAW,CAAC,EAChD,EAAK,EACP,EAEA,SAAU,AAAC,GAAS,CAClB,GAAM,GAAa,EAAQ,EAAS,MAC9B,EAAa,EAAQ,EAAS,OAC9B,EAAU,EAAsB,EAAQ,EAC9C,AAAI,CAAC,GACL,GAAG,UAAU,EAAQ,QAAQ,KAAS,EAAW,CAAS,EAC1D,EAAK,EACP,CACF,EAGA,KAAK,IAAM,SAAU,EAAM,CAEzB,GAAM,GAAO,MAAM,UAAU,MAAM,KAAK,UAAW,CAAC,EAC9C,EAAO,EAAO,GACpB,EAAY,KAAK,CAAE,OAAM,MAAK,CAAC,CACjC,EAGA,KAAK,MAAQ,UAAY,CACvB,EAAc,CAAC,CACjB,EAGA,KAAK,IAAM,UAAY,CACrB,MAAO,EACT,EAGA,KAAK,MAAQ,SAAU,EAAO,CAC5B,EAAO,EAAM,MAAO,EAAM,MAAM,EAChC,EAAY,EACP,GAAe,GAAgB,EAAG,cAAc,GACrD,EAAG,YAAY,EAAG,WAAY,CAAa,EAC3C,EAAG,cAAc,EAAG,WAAY,EAAG,eAAgB,EAAG,aAAa,EACnE,EAAG,cAAc,EAAG,WAAY,EAAG,eAAgB,EAAG,aAAa,EACnE,EAAG,cAAc,EAAG,WAAY,EAAG,mBAAoB,EAAG,OAAO,EACjE,EAAG,cAAc,EAAG,WAAY,EAAG,mBAAoB,EAAG,OAAO,EACjE,EAAG,WAAW,EAAG,WAAY,EAAG,EAAG,KAAM,EAAG,KAAM,EAAG,cAAe,CAAK,EACzE,OAAS,GAAI,EAAG,EAAI,EAAY,OAAQ,IAAK,CAC3C,EAAe,IAAM,EAAY,OAAS,EAC1C,GAAM,GAAI,EAAY,GAEtB,EAAE,KAAK,MAAM,KAAM,EAAE,MAAQ,CAAC,CAAC,CACjC,CACA,MAAO,EACT,EAGA,KAAK,KAAO,SAAU,EAAO,CAC3B,YAAK,IAAI,aAAc,CAAC,EACjB,KAAK,MAAM,CAAK,CACzB,CACF,CCjbA,kBAA4C,EAAqC,CAE/E,GAAM,GAAU,EAAW,MAAM,SAAW,EAAI,AAAG,UAAQ,CAAU,EAAI,EACnE,EAAW,AAAG,QAAM,EAAS,EAAG,CAAC,EACjC,EAAgB,CAAC,AAAG,MAAI,EAAS,EAAE,EAAG,AAAG,MAAI,EAAS,EAAE,EAAG,AAAG,MAAI,EAAS,EAAE,CAAC,EAC9E,EAAgB,CAAC,AAAG,MAAI,EAAS,EAAE,EAAG,AAAG,MAAI,EAAS,EAAE,EAAG,AAAG,MAAI,EAAS,EAAE,CAAC,EAC9E,EAAS,KAAM,SAAQ,IAAI,EAAI,IAAI,AAAC,GAAY,EAAQ,KAAK,CAAC,CAAC,EAC/D,EAAW,IAAO,KAAK,IAAI,EAAO,GAAG,GAAI,EAAO,GAAG,GAAI,EAAO,GAAG,EAAE,EACnE,EAAM,CAAC,AAAG,MAAI,EAAS,GAAI,EAAI,EAAE,EAAG,AAAG,MAAI,EAAS,GAAI,EAAI,EAAE,EAAG,AAAG,MAAI,EAAS,GAAI,EAAI,EAAE,CAAC,EAC5F,EAAQ,CAAC,AAAG,MAAI,EAAI,GAAI,EAAI,EAAE,EAAG,AAAG,MAAI,EAAI,GAAI,EAAI,EAAE,EAAG,AAAG,MAAI,EAAI,GAAI,EAAI,EAAE,CAAC,EAC/E,EAAO,CAAC,AAAG,MAAI,EAAU,EAAM,EAAE,EAAG,AAAG,MAAI,EAAU,EAAM,EAAE,EAAG,AAAG,MAAI,EAAU,EAAM,EAAE,CAAC,EAC1F,EAAM,CAAC,AAAG,MAAI,EAAI,GAAI,EAAK,EAAE,EAAG,AAAG,MAAI,EAAI,GAAI,EAAK,EAAE,EAAG,AAAG,MAAI,EAAI,GAAI,EAAK,EAAE,CAAC,EAChF,EAAM,AAAG,QAAM,CAAC,EAAI,GAAI,EAAI,GAAI,EAAI,EAAE,EAAG,CAAC,EAC1C,EAAU,AAAG,UAAQ,EAAK,CAAC,EAAG,EAAQ,MAAM,GAAI,EAAQ,MAAM,GAAI,CAAC,CAAC,EAC1E,MAAG,WAAQ,CAAC,GAAG,EAAU,GAAG,EAAK,GAAG,EAAK,GAAG,EAAK,GAAG,EAAO,GAAG,EAAM,GAAG,EAAK,EAAK,CAAO,CAAC,EAClF,CACT,CCZA,GAAM,IAAU,KAEZ,EAA6B,KAC7B,EAA8B,KAC9B,GAA8B,KAE9B,EAEE,GAAoG,CACxG,SAAU,EACV,UAAW,EACX,UAAW,EACX,YAAa,MACf,EAEO,YAAgB,EAAe,EAA2B,CAC/D,GAAI,GACJ,GAAI,EAAI,QACN,GAAI,EAAI,OAAQ,CACd,GAAI,MAAO,kBAAoB,YAAa,KAAM,IAAI,OAAM,mFAAmF,EAC/I,EAAI,GAAI,iBAAgB,EAAO,CAAM,CACvC,KAAO,CACL,GAAI,MAAO,WAAa,YAAa,KAAM,IAAI,OAAM,kEAAkE,EACvH,EAAI,SAAS,cAAc,QAAQ,EACnC,EAAE,MAAQ,EACV,EAAE,OAAS,CACb,KAGA,AAAI,OAAO,GAAI,QAAW,YAAa,EAAI,GAAI,GAAI,OAAO,EAAO,CAAM,EAC9D,MAAO,YAAW,QAAW,aAAa,GAAI,GAAI,YAAW,OAAO,EAAO,CAAM,GAG5F,MAAO,EACT,CAGO,YAAc,EAAkB,EAAoB,CACzD,GAAM,GAAe,GAAU,GAAO,EAAM,MAAO,EAAM,MAAM,EAE/D,MADY,GAAa,WAAW,IAAI,EACpC,UAAU,EAAO,EAAG,CAAC,EAClB,CACT,CAKA,kBAA8B,EAAc,EAAgB,EAAqB,GAAoE,CACnJ,GAAI,CAAC,EAEH,MAAI,GAAO,OAAO,EAAI,+BAA+B,EAC9C,CAAE,OAAQ,KAAM,OAAQ,IAAK,EAGtC,GACE,CAAE,aAAoB,MACnB,CAAE,OAAO,QAAU,aAAe,YAAiB,SACnD,CAAE,OAAO,GAAI,QAAW,aAAe,YAAiB,GAAI,SAC5D,CAAE,OAAO,YAAW,QAAW,aAAe,YAAiB,YAAW,SAC1E,CAAE,OAAO,YAAc,aAAe,YAAiB,aACvD,CAAE,OAAO,cAAgB,aAAe,YAAiB,eACzD,CAAE,OAAO,mBAAqB,aAAe,YAAiB,oBAC9D,CAAE,OAAO,mBAAqB,aAAe,YAAiB,oBAC9D,CAAE,OAAO,mBAAqB,aAAe,YAAiB,oBAC9D,CAAE,OAAO,oBAAsB,aAAe,YAAiB,qBAC/D,CAAE,OAAO,kBAAoB,aAAe,YAAiB,kBAEhE,KAAM,IAAI,OAAM,qCAAqC,EAEvD,GAAI,YAAoB,IAAQ,CAC9B,GAAI,GAAwB,KAC5B,GAAK,EAAiB,mBAAuB,KAAM,IAAI,OAAM,yDAAyD,EACtH,GAAI,CAAE,EAAiB,MAAU,KAAM,IAAI,OAAM,sDAAsD,EACvG,GAAK,EAAiB,MAAM,SAAW,GACrC,GAAK,EAAiB,MAAM,KAAO,EACjC,EAAS,AAAG,aAAW,EAAO,CAAC,UACrB,EAAiB,MAAM,KAAO,EAAG,CAC3C,GAAM,GAAM,AAAG,UAAQ,EAAO,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,GAAI,GAAI,CAAC,CAAC,EACpD,EAAS,AAAG,aAAW,EAAK,CAAC,EAC7B,AAAG,UAAQ,CAAG,CAChB,MACK,AAAK,GAAiB,MAAM,SAAW,GAC5C,CAAK,EAAiB,MAAM,KAAO,EACjC,EAAS,AAAG,QAAM,CAAK,EACb,EAAiB,MAAM,KAAO,GACxC,GAAS,AAAG,UAAQ,EAAO,CAAC,EAAG,EAAG,EAAG,CAAC,EAAG,CAAC,GAAI,GAAI,GAAI,CAAC,CAAC,IAI5D,GAAI,GAAU,MAAQ,EAAO,MAAM,SAAW,GAAK,EAAO,MAAM,KAAO,GAAK,EAAO,MAAM,KAAO,EAAG,KAAM,IAAI,OAAM,iEAAiE,EAAM,OAAU,EACpM,GAAK,EAAkB,QAAU,QAAS,CACxC,GAAM,GAAO,AAAG,OAAK,EAAQ,SAAS,EACtC,AAAG,UAAQ,CAAM,EACjB,EAAS,CACX,CACA,MAAO,CAAE,SAAQ,OAAS,EAAO,OAAO,OAAS,EAAY,IAAM,CACrE,KAAO,CAEL,GAAI,MAAO,GAAM,YAAkB,aAAe,EAAM,YAAiB,EACvE,MAAI,GAAO,OAAO,EAAI,2BAA2B,EAC1C,CAAE,OAAQ,KAAM,OAAQ,CAAS,EAE1C,GAAM,GAAgB,EAAM,cAAmB,EAAM,YAAiB,EAAM,OAAa,EAAM,OAAa,EAAM,MAAS,GAAK,EAC1H,EAAiB,EAAM,eAAoB,EAAM,aAAkB,EAAM,QAAc,EAAM,OAAa,EAAM,MAAS,GAAK,EACpI,GAAI,CAAC,GAAiB,CAAC,EACrB,MAAI,GAAO,OAAO,EAAI,mCAAmC,EAClD,CAAE,OAAQ,KAAM,OAAQ,CAAS,EAE1C,GAAI,GAAc,EACd,EAAe,EAenB,GAdI,EAAc,IAChB,GAAc,GACd,EAAe,KAAK,MAAM,EAAc,EAAiB,CAAa,GAEpE,EAAe,IACjB,GAAe,GACf,EAAc,KAAK,MAAM,EAAe,EAAgB,CAAc,GAIxE,AAAK,GAAO,OAAO,OAAS,GAAK,EAAG,EAAc,EAAO,OAAO,MACtD,GAAO,OAAO,QAAU,GAAK,GAAG,GAAc,EAAkB,IAAO,OAAO,QAAU,GAAK,IACvG,AAAK,GAAO,OAAO,QAAU,GAAK,EAAG,EAAe,EAAO,OAAO,OACxD,GAAO,OAAO,OAAS,GAAK,GAAG,GAAe,EAAmB,IAAO,OAAO,OAAS,GAAK,IACnG,CAAC,GAAe,CAAC,EAAc,KAAM,IAAI,OAAM,yCAAyC,EAC5F,AAAI,EAAC,GAAa,kBAAU,SAAU,GAAiB,kBAAU,UAAW,IAAe,GAAW,GAAO,EAAa,CAAY,GAGtI,GAAM,GAAQ,EAAS,WAAW,IAAI,EAiBtC,GAhBA,AAAK,MAAO,YAAc,aAAiB,YAAiB,WAC1D,EAAM,aAAa,EAAO,EAAG,CAAC,EAE9B,AAAI,EAAO,OAAO,MAAQ,MAAO,GAAM,WAAc,YACnD,GAAM,UAAU,EAAe,CAAC,EAChC,EAAM,MAAM,GAAI,CAAC,EACjB,EAAM,UAAU,EAAoB,EAAG,EAAG,EAAe,EAAgB,EAAG,EAAG,iBAAU,MAAO,iBAAU,MAAM,EAChH,EAAM,aAAa,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,GAEnC,EAAM,UAAU,EAAoB,EAAG,EAAG,EAAe,EAAgB,EAAG,EAAG,iBAAU,MAAO,iBAAU,MAAM,EAIhH,EAAC,GAAc,EAAS,QAAU,EAAU,OAAW,kBAAU,UAAW,kBAAW,UAAS,GAAY,GAAO,EAAS,MAAO,EAAS,MAAM,GAGlJ,EAAO,OAAO,SAAW,EAAI,MAAM,UAAW,CAGhD,GAFK,GAAI,GAAK,EAAI,QAAU,GAAY,IAAkB,MAC1D,EAAI,OAAS,CAAC,CAAC,EACX,CAAC,GAAM,CAAC,EAAG,IACb,MAAI,GAAO,OAAO,EAAI,gDAAgD,EAC/D,CAAE,OAAQ,KAAM,OAAQ,CAAS,EAE1C,EAAG,MAAM,EACL,EAAO,OAAO,aAAe,GAAG,EAAG,IAAI,aAAc,EAAO,OAAO,UAAU,EAC7E,EAAO,OAAO,WAAa,GAAG,EAAG,IAAI,WAAY,EAAO,OAAO,QAAQ,EACvE,EAAO,OAAO,YAAc,GAAG,EAAG,IAAI,UAAW,EAAO,OAAO,SAAS,EACxE,EAAO,OAAO,OAAS,GAAG,EAAG,IAAI,OAAQ,EAAO,OAAO,IAAI,EAC3D,EAAO,OAAO,aAAe,GAAG,EAAG,IAAI,aAAc,EAAO,OAAO,UAAU,EAC7E,EAAO,OAAO,MAAQ,GAAG,EAAG,IAAI,MAAO,EAAO,OAAO,GAAG,EACxD,EAAO,OAAO,UAAU,EAAG,IAAI,UAAU,EACzC,EAAO,OAAO,OAAO,EAAG,IAAI,OAAO,EACnC,EAAO,OAAO,SAAS,EAAG,IAAI,SAAS,EACvC,EAAO,OAAO,OAAO,EAAG,IAAI,OAAO,EACnC,EAAO,OAAO,YAAY,EAAG,IAAI,YAAY,EAC7C,EAAO,OAAO,aAAa,EAAG,IAAI,aAAa,EAC/C,EAAO,OAAO,UAAU,EAAG,IAAI,UAAU,EACzC,EAAO,OAAO,WAAa,GAAG,EAAG,IAAI,WAAY,EAAO,OAAO,QAAQ,EAC3E,AAAI,EAAG,IAAI,EAAI,EAAG,EAAY,EAAG,MAAM,CAAQ,EAC1C,EAAY,EAAG,KAAK,CAAQ,CACnC,KACE,IAAK,EAAU,CAAS,EACpB,GAAI,GAAK,MACb,EAAI,OAAS,CAAC,CAAC,EAGjB,GAAI,CAAC,EAAW,MAAO,CAAE,OAAQ,KAAM,OAAQ,CAAU,EACzD,GAAI,CAAC,EAAW,KAAM,IAAI,OAAM,oCAAoC,EAGpE,GAAI,GACA,EAAQ,EACZ,GAAK,MAAO,YAAc,aAAe,YAAiB,YAAe,EAAM,MAAW,EAAM,OAAY,EAAM,OAChH,GAAI,EAAI,SAAc,UACpB,EAAS,AAAG,UAAU,AAAG,UAAQ,WAAW,CAAK,EAAI,SAChD,CACL,EAAQ,EAAM,KAAQ,OAAS,EAAM,OAAY,EAAM,MAEvD,GAAM,GAAM,GAAI,YAAW,EAAM,KAAQ,MAAS,EAClD,EAAS,AAAG,SAAO,EAAK,CAAC,EAAM,OAAW,EAAM,MAAU,CAAK,EAAG,OAAO,CAC3E,SAEI,EAAC,IAAc,EAAU,QAAU,GAAU,OAAW,EAAU,SAAW,GAAU,SAAS,IAAY,GAAO,EAAU,MAAO,EAAU,MAAM,GACpJ,AAAG,WAAW,EAAI,QACpB,AAAI,EAAO,UAAY,SAAW,EAAO,UAAY,WAAa,EAAO,UAAY,SACnF,EAAS,AAAG,UAAQ,WAAW,CAAS,EAExC,IAAY,GAAK,CAAS,EAC1B,EAAS,AAAG,UAAQ,WAAW,EAAS,OAErC,CAGL,GAAM,GAAW,AADD,AADG,GAAK,CAAS,EACN,WAAW,IAAI,EACjB,aAAa,EAAG,EAAG,EAAa,CAAY,EACrE,EAAQ,EAAS,KAAK,OAAS,EAAc,EAC7C,GAAM,GAAM,GAAI,YAAW,EAAS,KAAK,MAAM,EAC/C,EAAS,AAAG,SAAO,EAAK,CAAC,EAAa,EAAc,CAAK,CAAC,CAC5D,CAEF,GAAI,IAAU,EAAG,CACf,GAAM,GAAM,AAAG,UAAQ,EAAQ,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,GAAI,GAAI,CAAC,CAAC,EACrD,AAAG,UAAQ,CAAM,EACjB,EAAS,CACX,CACA,GAAI,CAAC,EAAQ,KAAM,IAAI,OAAM,mCAAmC,EAChE,GAAM,GAAS,AAAG,OAAK,EAAQ,SAAS,EAClC,EAAS,EAAO,OAAO,aAAe,KAAM,AAAQ,IAAsB,CAAM,EAAI,AAAG,aAAW,EAAQ,CAAC,EACjH,MAAG,WAAQ,CAAC,EAAQ,CAAM,CAAC,EACpB,CAAE,SAAQ,OAAS,EAAO,OAAO,OAAS,EAAY,IAAM,CACrE,CACF,CAgCA,kBAA2B,EAAyB,EAAe,CACjE,GAAI,GAAY,GAChB,GAAI,EAAO,mBAAqB,GAAK,CAAC,EAAM,OAAS,EAAM,MAAM,SAAW,GAAK,EAAM,MAAM,GAAK,MAAQ,EAAM,MAAM,GAAK,KAAM,MAAO,GAcxI,GAAI,CAAC,GAAK,YACR,GAAK,YAAc,AAAG,QAAM,CAAK,UACxB,GAAK,YAAY,MAAM,KAAO,EAAM,MAAM,IAAM,GAAK,YAAY,MAAM,KAAO,EAAM,MAAM,GACnG,AAAG,UAAQ,GAAK,WAAW,EAC3B,GAAK,YAAc,AAAG,QAAM,CAAK,MAC5B,CACL,GAAM,GAA4B,CAAC,EACnC,EAAE,KAAO,AAAG,MAAI,EAAO,GAAK,WAAW,EACvC,EAAE,QAAU,AAAG,MAAI,EAAE,KAAM,EAAE,IAAI,EACjC,EAAE,IAAM,AAAG,MAAI,EAAE,OAAO,EAExB,GAAM,GAAe,AADL,MAAM,GAAE,IAAI,KAAK,GACJ,GAAM,GAAM,MAAM,IAAM,GAAM,GAAM,MAAM,IAAM,GAAK,IAAM,EACxF,AAAG,UAAQ,CAAC,GAAK,YAAa,EAAE,KAAM,EAAE,QAAS,EAAE,GAAG,CAAC,EACvD,GAAK,YAAc,AAAG,QAAM,CAAK,EACjC,EAAY,GAAiB,GAAO,kBAAoB,EAC1D,CACA,MAAO,EACT,CAEA,kBAA8B,EAAyB,EAAgB,EAAiC,CACtG,GAAM,GAA4B,CAAC,EACnC,GAAI,CAAC,GAAU,CAAC,GAAU,EAAO,MAAM,SAAW,GAAK,EAAO,MAAM,SAAW,EAAO,MAAM,OAC1F,MAAK,GAAO,OAAO,EAAI,sDAAuD,EAAO,MAAO,EAAO,KAAK,EACjG,EAET,GAAI,EAAO,MAAM,KAAO,GAAK,EAAO,MAAM,KAAO,GAAK,EAAO,MAAM,KAAO,GAAK,EAAO,MAAM,KAAO,EACjG,MAAK,GAAO,OAAO,EAAI,wDAAyD,EAAO,MAAO,EAAO,KAAK,EACnG,EAET,EAAE,OAAS,AAAG,QAAM,CAAM,EAC1B,EAAE,OAAU,EAAO,MAAM,KAAO,EAAO,MAAM,IAAM,EAAO,MAAM,KAAO,EAAO,MAAM,GAAM,AAAG,QAAM,eAAe,EAAQ,CAAC,EAAO,MAAM,GAAI,EAAO,MAAM,EAAE,CAAC,EAAI,AAAG,QAAM,CAAM,EAC/K,EAAE,KAAO,AAAG,MAAI,EAAE,OAAQ,EAAE,MAAM,EAClC,EAAE,QAAU,AAAG,MAAI,EAAE,KAAM,EAAE,IAAI,EACjC,EAAE,IAAM,AAAG,MAAI,EAAE,OAAO,EAExB,GAAM,GAAe,AADL,MAAM,GAAE,IAAI,KAAK,GACJ,GAAM,GAAO,MAAM,IAAM,GAAM,GAAO,MAAM,IAAM,GAAK,IAAM,EAC1F,MAAG,WAAQ,CAAC,EAAE,OAAQ,EAAE,OAAQ,EAAE,KAAM,EAAE,QAAS,EAAE,GAAG,CAAC,EAClD,CACT,CCxTO,YAAU,CA4Ef,aAAc,CA1Ed,kBAEA,eAEA,iBAEA,kBAAmB,IAEnB,eAAgB,IAEhB,kBAAqB,CAAC,GAEtB,kBAEA,iBAEA,eAIA,oBAEA,iBAAmB,IAEnB,cAKI,CACA,UAAW,OACX,QAAS,OACT,KAAM,OACN,YAAa,MACf,GAEF,eAKI,CACA,UAAW,OACX,QAAS,OACT,QAAS,OACT,SAAU,MACZ,GAEF,gBAII,CACA,UAAW,OACX,QAAS,OACT,QAAS,MACX,GAEF,aAGI,CACA,MAAO,OACP,MAAO,CAAC,CACV,GAEF,iBAAoB,CAAC,GAErB,iBAEA,gBAEA,oBAUE,GAPA,KAAK,QAAU,MAAO,YAAc,YACpC,KAAK,KAAQ,MAAO,UAAY,aAAiB,MAAO,SAAQ,UAAa,aAAiB,MAAO,SAAQ,SAAS,MAAS,YAC/H,KAAK,KAAO,CAAE,QAAS,AAAG,GAAQ,YAAa,EAC/C,KAAK,UAAY,MAAO,kBAAoB,YAC5C,KAAK,QAAU,GAEf,KAAK,OAAS,KAAK,SAAW,KAAK,UAAa,MAAO,oBAAsB,YAAe,OACxF,MAAO,YAAc,YAAa,CACpC,GAAM,GAAM,UAAU,UAAU,MAAM,eAAe,EACrD,GAAI,GAAO,EAAI,GAAI,CACjB,GAAM,GAAgB,EAAI,GAAG,MAAM,eAAe,EAClD,KAAK,SAAY,GAAiB,EAAc,GAAM,EAAc,GAAG,QAAQ,SAAU,EAAE,EAAI,GAC/F,KAAK,MAAQ,UAAU,UAAU,QAAQ,EAAI,GAAI,EAAE,EAC/C,KAAK,SAAS,IAAI,MAAK,MAAQ,KAAK,MAAM,QAAQ,EAAI,GAAI,EAAE,GAChE,KAAK,MAAQ,KAAK,MAAM,QAAQ,MAAO,GAAG,CAU5C,CACF,KAAO,AAAI,OAAO,UAAY,aAC5B,MAAK,SAAW,GAAG,QAAQ,YAAY,QAAQ,OAC/C,KAAK,MAAQ,UAAU,QAAQ,UAEnC,MAGM,gBAAgB,CAEpB,KAAK,SAAW,OAAO,KAAK,AAAG,SAAO,EAAE,eAAe,EACvD,KAAK,KAAK,UAAY,MAAO,cAAgB,YAC7C,KAAK,KAAK,QAAU,KAAK,SAAS,SAAS,MAAM,EAC7C,KAAK,KAAK,WAAa,KAAK,KAAK,SAAW,AAAG,aAAW,IAAM,QAClE,MAAK,KAAK,KAAO,KAAM,AAAG,OAAI,EAAE,SAAS,uBAAuB,EAChE,KAAK,KAAK,YAAc,KAAM,AAAG,OAAI,EAAE,SAAS,8BAA8B,GAEhF,GAAM,GAAI,AAAM,GAAO,IAAK,GAAG,EACzB,EAAM,EAAI,EAAE,WAAW,QAAQ,EAAI,OAIzC,GAFA,KAAK,MAAM,UAAY,MAAO,IAAQ,YACtC,KAAK,MAAM,QAAU,KAAK,SAAS,SAAS,OAAO,EAC/C,KAAK,MAAM,WAAa,KAAK,MAAM,SAAY,CAAG,aAAW,IAAM,SAAW,AAAG,aAAW,IAAM,WAAY,CAEhH,GAAM,GAAK,AAAG,UAAQ,EAAE,QAAU,YAAc,KAAM,AAAG,WAAQ,EAAE,gBAAgB,EAAE,GAAK,KAC1F,AAAI,GACF,MAAK,MAAM,QAAU,EAAG,aAAa,EAAG,OAAO,EAC/C,KAAK,MAAM,SAAW,EAAG,aAAa,EAAG,QAAQ,EAErD,CAEA,KAAK,OAAO,UAAY,KAAK,SAAW,MAAO,WAAU,KAAW,YACpE,KAAK,OAAO,QAAU,KAAK,SAAS,SAAS,QAAQ,EACrD,GAAI,CAEF,AAAI,KAAK,OAAO,WAAW,MAAK,OAAO,QAAW,MAAM,WAAU,IAAO,eAAe,GAAG,KAC7F,OAAQ,EAAN,CACA,KAAK,OAAO,UAAY,EAC1B,CACA,GAAI,CACF,KAAK,QAAU,AAAG,uBAAqB,AAAG,aAAW,CAAC,EAAE,IAAI,AAAC,GAAW,EAAO,WAAW,YAAY,CAAC,CACzG,OAAQ,EAAN,CAAa,CACjB,MAGM,YAAY,CAChB,GAAM,GAAM,CAAE,MAAO,GAAI,MAAO,CAAC,CAAE,EACnC,AAAI,KAAK,MAAQ,KAAK,SAAS,WAAW,OAAO,EAiBjD,AAAK,KAAK,IACL,KAAK,IAAS,EADD,OAAO,eAAe,KAAM,MAAO,CAAE,MAAO,CAAI,CAAC,CAErE,CACF,EAEa,EAAM,GAAI,ICzKvB,GAAM,IAAU,CACd,YAAa,GACb,QAAS,GACT,MAAO,GACP,cAAe,EACjB,EAEA,kBAA2B,EAAK,EAAiC,CAC/D,MAAI,IAAQ,OAAO,EAAI,oBAAqB,EAAK,CAAI,EAC9C,MAAM,EAAK,CAAI,CACxB,CAEO,YAA6B,EAAgB,CAClD,GAAQ,YAAc,EAAO,YAC7B,GAAQ,QAAU,EAAO,MACzB,GAAQ,cAAgB,EAAO,aACjC,CAEA,iBAAgC,EAAoD,CAClF,GAAM,GAAW,GAAK,GAAQ,cAAe,GAAa,EAAE,EACtD,EAAoB,EAAS,MAAM,GAAG,EACtC,EAAkB,eAAiB,EAAkB,EAAkB,OAAS,GAAG,QAAQ,QAAS,EAAE,EACtG,EAAe,KAAM,AAAG,MAAG,WAAW,EACtC,EAAc,GAAQ,aAAe,OAAO,KAAK,CAAY,EAAE,SAAS,CAAe,EACvF,EAAgB,MAAO,QAAU,YAAc,CAAC,EAAI,CAAE,UAAW,CAAC,EAAK,IAAU,GAAY,EAAK,CAAI,CAAE,EACxG,EAAoB,GAAO,IAAW,EAAc,EAAkB,EAAU,CAAa,EACnG,GAAI,CAEF,EAAM,cAAc,EAEhB,GAAQ,OAAO,EAAI,sBAAuB,EAAM,OAAO,EAE3D,GAAM,GAAY,KAAM,GAAM,QAAQ,KAAK,EAC3C,EAAM,SAAS,CAAS,EACpB,GAAQ,SAAS,EAAI,cAAe,EAAM,QAAW,CAC3D,OAAS,EAAP,CACA,EAAI,uBAAwB,EAAU,CAAG,CAC3C,CACA,GAAI,GAAQ,aAAe,CAAC,EAC1B,GAAI,CACF,GAAM,GAAa,KAAM,GAAM,KAAK,CAAe,EACnD,EAAI,eAAgB,EAAiB,CAAU,CACjD,OAAS,EAAP,CACA,EAAI,sBAAuB,EAAU,CAAG,CAC1C,CAEF,MAAO,EACT,gBCrCA,GAAI,IACE,GAAwB,CAAC,EACzB,GAAY,CAAC,QAAS,QAAS,QAAS,SAAU,OAAO,EACzD,GAAa,CAAC,GAAI,GAAI,GAAI,KAAM,KAAM,KAAM,EAAE,EAChD,GAAY,EACZ,GAAW,EACX,GAAU,OAAO,iBAGrB,kBAA2B,EAAgB,CACzC,MAAI,GAAI,SAAS,IAAQ,MACzB,AAAK,GACI,EAAO,OAAO,EAAI,gBAAiB,GAAM,QAAW,EADjD,GAAQ,KAAM,GAAU,EAAO,KAAK,IAAO,EAEhD,EACT,CAGA,kBAA8B,EAAe,EAAgB,EAAa,EAAkC,CAhC5G,QAiCE,GAAI,CAAC,GAAO,MAAO,CAAE,IAAK,EAAG,OAAQ,UAAW,YAAa,EAAG,KAAM,CAAC,CAAE,EACzE,GAAM,GAAY,GAAW,OAAO,KAAK,OAAZ,cAAqB,aAAc,GAC1D,EAAY,OAAO,KAAK,OAAZ,cAAqB,WAAY,GAAM,EAAI,EAAI,GACjE,MAAI,GAAO,aAAe,GAAY,GAAc,KAAc,GAAU,GAAK,GAC/E,MACO,GAAK,IAEd,IAAU,EACH,GAAI,SAAQ,KAAO,IAAY,CAzCxC,QA0CI,GAAI,CAAC,cAAO,OAAO,GAAG,OAAO,OAC7B,GAAM,GAA4B,CAAC,EAE7B,EAAM,CAAC,CAAC,EAAK,GAAM,GAAM,EAAI,CAAC,EACpC,EAAE,OAAS,AAAG,QAAM,cAAc,EAAO,EAAK,CAAC,CAAC,EAAG,CAAC,GAAM,OAAO,GAAG,MAAM,GAAI,GAAM,OAAO,GAAG,MAAM,EAAE,CAAC,EACvG,GAAM,GAAgB,CAAE,IAAK,EAAG,OAAQ,UAAW,YAAa,EAAG,KAAM,CAAC,CAAE,EAC5E,AAAI,KAAO,KAAK,OAAZ,QAAqB,SAAS,EAAC,EAAE,IAAK,EAAE,OAAQ,EAAE,IAAI,EAAI,GAAM,QAAQ,EAAE,OAAQ,CAAC,aAAc,gBAAiB,aAAa,CAAC,GACpI,GAAM,GAAS,KAAM,GAAE,OAAO,KAAK,EACnC,EAAI,OAAS,EAAO,GAAK,EAAO,GAAK,OAAS,SAC9C,EAAI,YAAc,KAAK,MAAM,IAAO,GAAO,GAAK,EAAO,GAAK,EAAO,GAAK,EAAO,GAAG,EAAI,IACtF,GAAM,GAAO,KAAM,GAAE,KAAK,KAAK,EAC/B,OAAS,GAAI,EAAG,EAAI,EAAK,OAAQ,IAC/B,AAAI,EAAK,GAAM,OAAO,KAAK,OAAZ,cAAqB,gBAAiB,KAAM,EAAI,KAAK,KAAK,CAAE,MAAO,KAAK,MAAM,IAAM,EAAK,EAAE,EAAI,IAAK,KAAM,GAAU,EAAW,CAAC,EAEjJ,EAAI,KAAK,KAAK,CAAC,EAAG,IAAM,EAAE,MAAQ,EAAE,KAAK,EAGzC,GAAM,GAAY,AADM,MAAM,KAAK,KAAM,GAAE,IAAI,KAAK,CAAC,EACnB,IAAI,CAAC,EAAG,IAAM,CAAC,GAAW,GAAI,CAAC,CAAC,EAAE,KAAK,CAAC,EAAG,IAAM,EAAE,GAAK,EAAE,EAAE,EAC1F,EAAM,EAAU,GAAG,GACvB,OAAS,GAAI,EAAG,EAAI,EAAU,OAAQ,IAAK,GAAO,EAAU,GAAG,GAAM,GAAU,GAAG,GAAK,GACvF,EAAI,IAAM,KAAK,MAAM,GAAK,CAAG,EAAI,GACjC,OAAO,KAAK,CAAC,EAAE,QAAQ,AAAC,GAAW,AAAG,UAAQ,EAAE,EAAO,CAAC,EACxD,GAAK,GAAO,EACZ,GAAY,EACZ,GAAW,EAAI,EACf,EAAQ,CAAG,CACb,CAAC,EACH,CClEO,GAAM,GAAwD,CACnE,MAAO,IACP,IAAK,EACL,IAAK,EACL,KAAM,GACN,MAAO,MACP,IAAK,CAAC,MAAQ,KAAQ,IAAM,CAC9B,EAEO,aAAgB,CACrB,EAAU,MAAQ,AAAG,SAAO,IAAK,SAAS,EAC1C,EAAU,IAAM,AAAG,SAAO,EAAG,SAAS,EACtC,EAAU,IAAM,AAAG,SAAO,EAAG,SAAS,EACtC,EAAU,KAAO,AAAG,SAAO,GAAK,SAAS,EACzC,EAAU,MAAQ,AAAG,SAAO,MAAO,SAAS,EAC5C,EAAU,IAAM,AAAG,WAAS,CAAC,MAAQ,KAAQ,IAAM,EAAG,SAAS,CACjE,CCLA,GAAI,IACE,GAA+B,CAAC,EAClC,GAAY,EACZ,GAAW,EACX,GAAU,OAAO,iBAGrB,kBAA2B,EAAgB,CACzC,MAAI,GAAI,SAAS,IAAQ,MACzB,AAAK,GACI,EAAO,OAAO,EAAI,gBAAiB,GAAM,QAAW,EADjD,GAAQ,KAAM,GAAU,EAAO,KAAK,OAAU,YAAY,EAE/D,EACT,CAGA,kBAA8B,EAAe,EAAgB,EAAa,EAAyC,CA7BnH,YA8BE,GAAI,CAAC,GAAO,MAAO,CAAE,IAAK,CAAE,EAC5B,GAAM,GAAY,GAAW,OAAO,KAAK,SAAZ,cAAuB,aAAc,GAC5D,EAAY,OAAO,KAAK,SAAZ,cAAuB,WAAY,GAAM,EAAI,EAAI,GACnE,MAAI,GAAO,aAAe,GAAa,GAAa,KAAc,GAAU,OAAK,KAAL,cAAW,MAAQ,OAAK,KAAL,cAAW,KAAM,EAC9G,MACO,GAAK,IAEd,IAAU,EACH,GAAI,SAAQ,KAAO,IAAY,CACpC,GAAI,CAAC,cAAO,SAAU,CAAC,GAAM,OAAO,IAAM,CAAC,GAAM,OAAO,GAAG,MAAO,OAClE,GAAM,GAA4B,CAAC,EACnC,EAAE,OAAS,AAAG,QAAM,eAAe,EAAO,CAAC,GAAM,OAAO,GAAG,MAAM,GAAI,GAAM,OAAO,GAAG,MAAM,EAAE,EAAG,EAAK,EACrG,EAAE,QAAU,AAAG,MAAI,EAAE,OAAQ,EAAU,KAAK,EAC5C,GAAM,GAAM,CAAE,IAAK,CAAE,EAErB,GADI,EAAO,KAAK,OAAU,SAAS,GAAE,IAAM,GAAM,QAAQ,EAAE,OAAO,GAC9D,EAAE,IAAK,CACT,GAAM,GAAO,KAAM,GAAE,IAAI,KAAK,EAC9B,EAAI,IAAM,KAAK,MAAM,GAAK,EAAK,EAAE,EAAI,EACvC,CACA,OAAO,KAAK,CAAC,EAAE,QAAQ,AAAC,GAAW,AAAG,UAAQ,EAAE,EAAO,CAAC,EACxD,GAAK,GAAO,EACZ,GAAY,EACZ,GAAW,EAAI,EACf,EAAQ,CAAG,CACb,CAAC,EACH,CCxCA,GAAI,IACE,GAAuD,CAAC,EAC1D,GAAY,EACZ,GAAW,EACX,GAAU,OAAO,iBAGf,GAAM,CAAC,MAAQ,KAAQ,IAAM,EAGnC,kBAA2B,EAAsB,CAC/C,MAAI,GAAI,SAAS,IAAQ,MACzB,AAAK,GACI,EAAO,OAAO,EAAI,gBAAiB,GAAM,QAAW,EADjD,GAAQ,KAAM,GAAU,EAAO,KAAK,OAAU,eAAe,EAElE,EACT,CAGA,kBAA8B,EAAe,EAAgB,EAAK,EAAyD,CAjC3H,YAkCE,GAAI,CAAC,GAAO,MAAO,CAAE,OAAQ,UAAW,YAAa,CAAE,EACvD,GAAM,GAAY,GAAW,OAAO,KAAK,SAAZ,cAAuB,aAAc,GAC5D,EAAY,OAAO,KAAK,SAAZ,cAAuB,WAAY,GAAM,EAAI,EAAI,GACnE,MAAI,GAAO,aAAe,GAAa,GAAa,KAAc,GAAU,OAAK,KAAL,cAAW,SAAW,OAAK,KAAL,cAAW,aAAc,EACzH,MACO,GAAK,IAEd,IAAU,EACH,GAAI,SAAQ,KAAO,IAAY,CACpC,GAAI,CAAC,cAAO,OAAO,GAAG,OAAO,OAC7B,GAAM,GAA4B,CAAC,EACnC,EAAE,OAAS,AAAG,QAAM,eAAe,EAAO,CAAC,GAAM,OAAO,GAAG,MAAM,GAAI,GAAM,OAAO,GAAG,MAAM,EAAE,EAAG,EAAK,EACrG,EAAE,QAAU,AAAG,OAAK,IAAM,CACxB,GAAM,CAAC,EAAK,EAAO,GAAQ,AAAG,QAAM,EAAE,OAAQ,EAAG,CAAC,EAC5C,EAAU,AAAG,MAAI,EAAK,GAAI,EAAE,EAC5B,EAAY,AAAG,MAAI,EAAO,GAAI,EAAE,EAChC,EAAW,AAAG,MAAI,EAAM,GAAI,EAAE,EAC9B,EAAY,AAAG,OAAK,CAAC,EAAS,EAAW,CAAQ,CAAC,EAExD,MADkB,AAAG,OAAI,AAAG,MAAI,EAAW,EAAU,IAAI,EAAG,CAAC,CAE/D,CAAC,EACD,GAAM,GAA+C,CAAE,OAAQ,UAAW,YAAa,CAAE,EACzF,AAAI,EAAO,KAAK,OAAU,SAAS,GAAE,OAAS,GAAM,QAAQ,EAAE,OAAO,GACrE,GAAM,GAAO,KAAM,GAAE,OAAO,KAAK,EACjC,EAAI,OAAS,EAAK,GAAK,EAAK,GAAK,SAAW,OAC5C,EAAI,YAAc,EAAK,GAAK,EAAK,GAAM,KAAK,MAAM,IAAM,EAAK,EAAE,EAAI,IAAQ,KAAK,MAAM,IAAM,EAAK,EAAE,EAAI,IACvG,OAAO,KAAK,CAAC,EAAE,QAAQ,AAAC,GAAW,AAAG,UAAQ,EAAE,EAAO,CAAC,EACxD,GAAK,GAAO,EACZ,GAAY,EACZ,GAAW,EAAI,EACf,EAAQ,CAAG,CACb,CAAC,EACH,CCvDA,GAAI,IACE,GAAwB,CAAC,EAC3B,GAAU,OAAO,iBACjB,GAAY,EACZ,GAAW,EAEf,kBAA2B,EAAqC,CAjBhE,MAkBE,MAAI,GAAI,SAAS,IAAQ,MACzB,AAAK,GACI,EAAO,OAAO,EAAI,gBAAiB,GAAM,QAAW,EADjD,GAAQ,KAAM,GAAU,KAAO,KAAK,YAAZ,cAAuB,SAAS,EAE7D,EACT,CAEA,kBAA8B,EAAe,EAAgB,EAAa,EAAgC,CAxB1G,QAyBE,GAAI,CAAC,GAAO,MAAO,GACnB,GAAM,GAAY,OAAO,KAAK,YAAZ,cAAuB,WAAY,GAAM,EAAI,EAAI,GAC7D,EAAY,GAAW,OAAO,KAAK,YAAZ,cAAuB,aAAc,GAClE,MAAI,GAAO,aAAe,GAAY,GAAc,KAAc,GAAU,GAAO,GACjF,MACO,GAAO,IAEhB,IAAU,EACH,GAAI,SAAQ,KAAO,IAAY,CACpC,GAAM,GAAS,AAAG,QAAM,eAAe,EAAO,CAAC,aAAO,OAAO,GAAG,MAAQ,GAAM,OAAO,GAAG,MAAM,GAAK,EAAG,aAAO,OAAO,GAAG,MAAQ,GAAM,OAAO,GAAG,MAAM,GAAK,CAAC,EAAG,EAAK,EAC7J,EAAM,mBAAO,QAAQ,GACrB,EAAO,MAAM,GAAI,KAAK,GAAG,GAC/B,GAAO,GAAO,KAAK,MAAM,IAAM,CAAG,EAAI,IACtC,GAAY,EACZ,GAAW,EAAI,EACf,AAAG,UAAQ,CAAC,EAAQ,CAAG,CAAC,EACxB,EAAQ,GAAO,EAAI,CACrB,CAAC,EACH,CCtCO,GAAM,IAA4C,CACvD,WAAY,CACV,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtD,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACvD,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GACpD,EACA,eAAgB,CAAC,GAAI,IAAK,GAAI,GAAI,GAAI,EAAG,IAAK,IAAK,IAAK,IAAK,GAAG,EAChE,eAAgB,CAAC,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAG,EAC9D,eAAgB,CAAC,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAG,EACjE,eAAgB,CAAC,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAG,EACjE,eAAgB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EAClD,eAAgB,CAAC,GAAI,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EACzD,eAAgB,CAAC,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAG,EAC7C,eAAgB,CAAC,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,GAAG,EACvD,eAAgB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EAClD,eAAgB,CAAC,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EAC3D,eAAgB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EAC5D,kBAAmB,CAAC,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,GAAG,EACtD,kBAAmB,CAAC,GAAI,IAAK,GAAI,GAAI,GAAI,EAAE,EAC3C,aAAc,CAAC,IAAK,IAAK,IAAK,IAAK,GAAG,EACtC,cAAe,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EACjD,cAAe,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EAC3D,cAAe,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EACjD,cAAe,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EAC3D,cAAe,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EACjD,cAAe,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EAC3D,cAAe,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EAC3D,iBAAkB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EACzD,iBAAkB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EAC/C,YAAa,CAAC,IAAK,IAAK,IAAK,IAAK,GAAG,EACrC,kBAAmB,CAAC,GAAG,EACvB,QAAS,CAAC,CAAC,EACX,WAAY,CAAC,CAAC,EACd,gBAAiB,CAAC,EAAE,EACpB,eAAgB,CAAC,GAAG,EACpB,WAAY,CAAC,GAAG,EAChB,UAAW,CAAC,GAAG,CACjB,EAEa,GAAmD,CAC9D,MAAO,IACP,MAAO,GACP,aAAc,CAAC,GAAI,GAAgB,kBAAqB,EAAE,CAC5D,EAEa,GAAwD,CACnE,QAAS,EACT,SAAU,EACV,KAAM,EACN,MAAO,EACP,QAAS,EACT,SAAU,EACV,aAAc,CAAC,EAAG,CAAC,CACrB,EAEa,GAAsE,CACjF,CAAE,IAAK,YAAa,QAAS,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAE,CAAE,EACzD,CAAE,IAAK,YAAa,QAAS,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAE,CAAE,EAC1D,CAAE,IAAK,YAAa,QAAS,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAE,CAAE,EAC1D,CAAE,IAAK,YAAa,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,CAAE,EACzD,CAAE,IAAK,YAAa,QAAS,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAE,CAAE,EAClE,CAAE,IAAK,YAAa,QAAS,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAE,CAAE,EAClE,CAAE,IAAK,YAAa,QAAS,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAE,CAAE,CAGpE,EAEa,GAA4B,CACvC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,eAAiB,gBAAiB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,eAAiB,gBAAiB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,eAAiB,gBAAiB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,eAAgB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,eAAiB,gBAAiB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,eAAiB,gBAAiB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,eAAiB,gBAAiB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,eAAiB,eAAgB,EAClC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,eAAiB,gBAAiB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,cAAgB,gBAAiB,EAClC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,eAAiB,gBAAiB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,CACvC,EAEa,GAAwB,CACnC,IAAK,GAAI,IAAK,GAAI,EAAG,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,EACtJ,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAClJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GACrJ,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAC7I,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAClJ,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GACrJ,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GACpJ,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GACjJ,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,EAAG,IAC/I,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,EAAG,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IACnJ,IAAK,GAAI,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IACnJ,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,EAAG,IAAK,IAAK,GAAI,EAAG,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAC9I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GACtJ,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAClJ,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,EAAG,EAAG,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GACnJ,IAAK,IAAK,IAAK,GAAI,GAAI,EAAG,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GACrJ,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IACpJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,EAAG,IAClJ,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,GAAI,IAAK,IAAK,IAAK,IACnJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IACnJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,EAAG,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAC7I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAClJ,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAC7I,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,EAAG,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GACnJ,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GACpJ,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,GAAI,IAAK,GAAI,IAAK,EAAG,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAClJ,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAClJ,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,GAAI,GAAI,EAAG,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAChJ,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IACpJ,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GACrJ,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,GACpJ,IAAK,GAAI,IAAK,IAAK,EAAG,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,EAAG,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAC/I,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAC9I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GACpJ,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GACrJ,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IACpJ,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,EAAG,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,EACpJ,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAC9I,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,EAAG,GAAI,IAClJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAC9I,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAC9I,IAAK,GAAI,IAAK,EAAG,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAClJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,EAAG,IAAK,IAAK,IAAK,IAAK,IACpJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAA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AAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAA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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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", + "sourcesContent": ["import type { Config } from '../exports';\n\n/**\n * Simple helper functions used accross codebase\n */\n\n// helper function: wrapper around console output\nexport function log(...msg): void {\n const dt = new Date();\n const ts = `${dt.getHours().toString().padStart(2, '0')}:${dt.getMinutes().toString().padStart(2, '0')}:${dt.getSeconds().toString().padStart(2, '0')}.${dt.getMilliseconds().toString().padStart(3, '0')}`;\n // eslint-disable-next-line no-console\n if (msg) console.log(ts, 'Human:', ...msg);\n}\n\n// helper function: join two paths\nexport function join(folder: string, file: string): string {\n const separator = folder.endsWith('/') ? '' : '/';\n const skipJoin = file.startsWith('.') || file.startsWith('/') || file.startsWith('http:') || file.startsWith('https:') || file.startsWith('file:');\n const path = skipJoin ? `${file}` : `${folder}${separator}${file}`;\n if (!path.toLocaleLowerCase().includes('.json')) throw new Error(`modelpath error: expecting json file: ${path}`);\n return path;\n}\n\n// helper function: gets elapsed time on both browser and nodejs\nexport const now = () => {\n if (typeof performance !== 'undefined') return performance.now();\n return parseInt((Number(process.hrtime.bigint()) / 1000 / 1000).toString());\n};\n\n// helper function: checks current config validity\nexport function validate(defaults: Partial, config: Partial, parent = 'config', msgs: Array<{ reason: string, where: string, expected?: string }> = []) {\n for (const key of Object.keys(config)) {\n if (typeof config[key] === 'object') {\n validate(defaults[key], config[key], key, msgs);\n } else {\n const defined = defaults && (typeof defaults[key] !== 'undefined');\n if (!defined) msgs.push({ reason: 'unknown property', where: `${parent}.${key} = ${config[key]}` });\n const same = defaults && typeof defaults[key] === typeof config[key];\n if (defined && !same) msgs.push({ reason: 'property type mismatch', where: `${parent}.${key} = ${config[key]}`, expected: typeof defaults[key] });\n }\n // ok = ok && defined && same;\n }\n if (config.debug && parent === 'config' && msgs.length > 0) log('invalid configuration', msgs);\n return msgs;\n}\n\n// helper function: perform deep merge of multiple objects so it allows full inheritance with overrides\nexport function mergeDeep(...objects) {\n const isObject = (obj) => obj && typeof obj === 'object';\n return objects.reduce((prev, obj) => {\n Object.keys(obj || {}).forEach((key) => {\n const pVal = prev[key];\n const oVal = obj[key];\n if (Array.isArray(pVal) && Array.isArray(oVal)) prev[key] = pVal.concat(...oVal);\n else if (isObject(pVal) && isObject(oVal)) prev[key] = mergeDeep(pVal, oVal);\n else prev[key] = oVal;\n });\n return prev;\n }, {});\n}\n\n// helper function: return min and max from input array\nexport const minmax = (data: Array) => data.reduce((acc: Array, val) => {\n acc[0] = (acc[0] === undefined || val < acc[0]) ? val : acc[0];\n acc[1] = (acc[1] === undefined || val > acc[1]) ? val : acc[1];\n return acc;\n}, []);\n\n// helper function: async wait\nexport async function wait(time: number) {\n const waiting = new Promise((resolve) => { setTimeout(() => resolve(true), time); });\n await waiting;\n}\n", "/* eslint-disable indent */\n/* eslint-disable no-multi-spaces */\n\n/** Generic config type inherited by all module types */\nexport interface GenericConfig {\n /** is module enabled? */\n enabled: boolean,\n /** path to model json file (relative to `modelBasePath` */\n modelPath: string,\n /** how many max frames to go without re-running model if cached results are acceptable\n * for two-phase models such as face and hand caching applies to bounding boxes detection only */\n skipFrames: number,\n /** how many max milliseconds to go without re-running model if cached results are acceptable\n * for two-phase models such as face and hand caching applies to bounding boxes detection only */\n skipTime: number,\n}\n\n/** Detector part of face configuration */\nexport interface FaceDetectorConfig extends GenericConfig {\n /** is face rotation correction performed after detecting face?\n * used to correctly analyze faces under high angles\n */\n rotation: boolean,\n /** maximum number of detected faces */\n maxDetected: number,\n /** minimum confidence for a detected face before results are discarded */\n minConfidence: number,\n /** minimum overlap between two detected faces before one is discarded */\n iouThreshold: number,\n /** should child models perform on masked image of a face */\n mask: boolean,\n /** should face detection return processed and cropped face tensor that can with an external model for addtional processing?\n * if enabled it must be manually deallocated to avoid memory leak */\n return: boolean,\n}\n\n/** Mesh part of face configuration */\nexport interface FaceMeshConfig extends GenericConfig {}\n\n/** Iris part of face configuration */\nexport interface FaceIrisConfig extends GenericConfig {}\n\n/** Description or face embedding part of face configuration\n * - also used by age and gender detection\n */\nexport interface FaceDescriptionConfig extends GenericConfig {\n /** minimum confidence for a detected face before results are discarded */\n minConfidence: number,\n}\n\n/** Emotion part of face configuration */\nexport interface FaceEmotionConfig extends GenericConfig {\n /** minimum confidence for a detected face before results are discarded */\n minConfidence: number,\n}\n\n/** Anti-spoofing part of face configuration */\nexport interface FaceAntiSpoofConfig extends GenericConfig {}\n\n/** Liveness part of face configuration */\nexport interface FaceLivenessConfig extends GenericConfig {}\n\n/** Configures all face-specific options: face detection, mesh analysis, age, gender, emotion detection and face description */\nexport interface FaceConfig extends GenericConfig {\n detector: Partial,\n mesh: Partial,\n iris: Partial,\n description: Partial,\n emotion: Partial,\n antispoof: Partial,\n liveness: Partial,\n}\n\n/** Configures all body detection specific options */\nexport interface BodyConfig extends GenericConfig {\n /** maximum number of detected bodies */\n maxDetected: number,\n /** minimum confidence for a detected body before results are discarded */\n minConfidence: number,\n /* experimental\n /** experimental: detector used for body model before actual analysis\n detector?: {\n /** experimental: enable body detector before body landmarks\n enabled: boolean,\n /** experimental: path to optional body detector model json file\n modelPath: string,\n /** experimental: minimum confidence for a detected body before results are discarded\n minConfidence: number,\n /** experimental: minimum overlap between two detected bodies before one is discarded\n iouThreshold: number\n },\n */\n}\n\n/** Configures all hand detection specific options */\nexport interface HandConfig extends GenericConfig {\n /** should hand rotation correction be performed after hand detection? */\n rotation: boolean,\n /** minimum confidence for a detected hand before results are discarded */\n minConfidence: number,\n /** minimum overlap between two detected hands before one is discarded */\n iouThreshold: number,\n /** maximum number of detected hands */\n maxDetected: number,\n /** should hand landmarks be detected or just return detected hand box */\n landmarks: boolean,\n detector: {\n /** path to hand detector model json */\n modelPath?: string,\n },\n skeleton: {\n /** path to hand skeleton model json */\n modelPath?: string,\n },\n}\n\n/** Configures all object detection specific options */\nexport interface ObjectConfig extends GenericConfig {\n /** minimum confidence for a detected objects before results are discarded */\n minConfidence: number,\n /** minimum overlap between two detected objects before one is discarded */\n iouThreshold: number,\n /** maximum number of detected objects */\n maxDetected: number,\n}\n\n/** Configures all body segmentation module\n * removes background from input containing person\n * if segmentation is enabled it will run as preprocessing task before any other model\n * alternatively leave it disabled and use it on-demand using human.segmentation method which can\n * remove background or replace it with user-provided background\n*/\nexport interface SegmentationConfig extends GenericConfig {\n /** blur segmentation output by pixels for more realistic image */\n blur: number,\n}\n\n/** Run input through image filters before inference\n * - available only in Browser environments\n * - image filters run with near-zero latency as they are executed on the GPU using WebGL\n*/\nexport interface FilterConfig {\n /** are image filters enabled? */\n enabled: boolean,\n /** perform image histogram equalization\n * - equalization is performed on input as a whole and detected face before its passed for further analysis\n */\n equalization: boolean,\n /** resize input width\n * - if both width and height are set to 0, there is no resizing\n * - if just one is set, second one is scaled automatically\n * - if both are set, values are used as-is\n */\n width: number,\n /** resize input height\n * - if both width and height are set to 0, there is no resizing\n * - if just one is set, second one is scaled automatically\n * - if both are set, values are used as-is\n */\n height: number,\n /** return processed canvas imagedata in result */\n return: boolean,\n /** flip input as mirror image */\n flip: boolean,\n /** range: -1 (darken) to 1 (lighten) */\n brightness: number,\n /** range: -1 (reduce contrast) to 1 (increase contrast) */\n contrast: number,\n /** range: 0 (no sharpening) to 1 (maximum sharpening) */\n sharpness: number,\n /** range: 0 (no blur) to N (blur radius in pixels) */\n blur: number\n /** range: -1 (reduce saturation) to 1 (increase saturation) */\n saturation: number,\n /** range: 0 (no change) to 360 (hue rotation in degrees) */\n hue: number,\n /** image negative */\n negative: boolean,\n /** image sepia colors */\n sepia: boolean,\n /** image vintage colors */\n vintage: boolean,\n /** image kodachrome colors */\n kodachrome: boolean,\n /** image technicolor colors */\n technicolor: boolean,\n /** image polaroid camera effect */\n polaroid: boolean,\n /** range: 0 (no pixelate) to N (number of pixels to pixelate) */\n pixelate: number,\n}\n\n/** Controlls gesture detection */\nexport interface GestureConfig {\n /** is gesture detection enabled? */\n enabled: boolean,\n}\n/** Possible TensorFlow backends */\nexport type BackendType = ['cpu', 'wasm', 'webgl', 'humangl', 'tensorflow', 'webgpu'];\n\n/** Possible values for `human.warmup` */\nexport type WarmupType = ['' | 'none' | 'face' | 'full' | 'body'];\n\n/**\n * Configuration interface definition for **Human** library\n * Contains all configurable parameters\n * Defaults: [config](https://github.com/vladmandic/human/blob/main/src/config.ts#L262)\n */\nexport interface Config {\n /** Backend used for TFJS operations\n * valid build-in backends are:\n * - Browser: `cpu`, `wasm`, `webgl`, `humangl`, `webgpu`\n * - NodeJS: `cpu`, `wasm`, `tensorflow`\n * default: `humangl` for browser and `tensorflow` for nodejs\n */\n backend: '' | 'cpu' | 'wasm' | 'webgl' | 'humangl' | 'tensorflow' | 'webgpu',\n\n /** Path to *.wasm files if backend is set to `wasm`\n *\n * default: auto-detects to link to CDN `jsdelivr` when running in browser\n */\n wasmPath: string,\n\n /** Force WASM loader to use platform fetch\n *\n * default: auto-detects to link to CDN `jsdelivr` when running in browser\n */\n wasmPlatformFetch: boolean,\n\n /** Print debug statements to console\n *\n * default: `true`\n */\n debug: boolean,\n\n /** Perform model loading and inference concurrently or sequentially\n *\n * default: `true`\n */\n async: boolean,\n\n /** What to use for `human.warmup()`\n * - warmup pre-initializes all models for faster inference but can take significant time on startup\n * - used by `webgl`, `humangl` and `webgpu` backends\n *\n * default: `full`\n */\n warmup: '' | 'none' | 'face' | 'full' | 'body',\n\n /** Base model path (typically starting with file://, http:// or https://) for all models\n * - individual modelPath values are relative to this path\n *\n * default: `../models/` for browsers and `file://models/` for nodejs\n */\n modelBasePath: string,\n\n /** Cache models in IndexDB on first sucessfull load\n * default: true if indexdb is available (browsers), false if its not (nodejs)\n */\n cacheModels: boolean,\n\n /** Cache sensitivity\n * - values 0..1 where 0.01 means reset cache if input changed more than 1%\n * - set to 0 to disable caching\n *\n * default: 0.7\n */\n cacheSensitivity: number;\n\n /** Perform immediate garbage collection on deallocated tensors instead of caching them */\n deallocate: boolean;\n\n /** Internal Variable */\n skipAllowed: boolean;\n\n /** Filter config {@link FilterConfig} */\n filter: Partial,\n\n /** Gesture config {@link GestureConfig} */\n gesture: Partial;\n\n /** Face config {@link FaceConfig} */\n face: Partial,\n\n /** Body config {@link BodyConfig} */\n body: Partial,\n\n /** Hand config {@link HandConfig} */\n hand: Partial,\n\n /** Object config {@link ObjectConfig} */\n object: Partial,\n\n /** Segmentation config {@link SegmentationConfig} */\n segmentation: Partial,\n}\n\n/** - [See all default Config values...](https://github.com/vladmandic/human/blob/main/src/config.ts#L262) */\nconst config: Config = {\n backend: '',\n modelBasePath: '',\n cacheModels: true,\n wasmPath: '',\n wasmPlatformFetch: false,\n debug: true,\n async: true,\n warmup: 'full',\n cacheSensitivity: 0.70,\n skipAllowed: false,\n deallocate: false,\n filter: {\n enabled: true,\n equalization: false,\n width: 0,\n height: 0,\n flip: false,\n return: true,\n brightness: 0,\n contrast: 0,\n sharpness: 0,\n blur: 0,\n saturation: 0,\n hue: 0,\n negative: false,\n sepia: false,\n vintage: false,\n kodachrome: false,\n technicolor: false,\n polaroid: false,\n pixelate: 0,\n },\n gesture: {\n enabled: true,\n },\n face: {\n enabled: true,\n detector: {\n modelPath: 'blazeface.json',\n rotation: true,\n maxDetected: 1,\n skipFrames: 99,\n skipTime: 2500,\n minConfidence: 0.2,\n iouThreshold: 0.1,\n mask: false,\n return: false,\n },\n mesh: {\n enabled: true,\n modelPath: 'facemesh.json',\n },\n iris: {\n enabled: true,\n modelPath: 'iris.json',\n },\n emotion: {\n enabled: true,\n minConfidence: 0.1,\n skipFrames: 99,\n skipTime: 1500,\n modelPath: 'emotion.json',\n },\n description: {\n enabled: true,\n modelPath: 'faceres.json',\n skipFrames: 99,\n skipTime: 3000,\n minConfidence: 0.1,\n },\n antispoof: {\n enabled: false,\n skipFrames: 99,\n skipTime: 4000,\n modelPath: 'antispoof.json',\n },\n liveness: {\n enabled: false,\n skipFrames: 99,\n skipTime: 4000,\n modelPath: 'liveness.json',\n },\n },\n body: {\n enabled: true,\n modelPath: 'movenet-lightning.json',\n maxDetected: -1,\n minConfidence: 0.3,\n skipFrames: 1,\n skipTime: 200,\n },\n hand: {\n enabled: true,\n rotation: true,\n skipFrames: 99,\n skipTime: 1000,\n minConfidence: 0.50,\n iouThreshold: 0.2,\n maxDetected: -1,\n landmarks: true,\n detector: {\n modelPath: 'handtrack.json',\n },\n skeleton: {\n modelPath: 'handlandmark-full.json',\n },\n },\n object: {\n enabled: false,\n modelPath: 'mb3-centernet.json',\n minConfidence: 0.2,\n iouThreshold: 0.4,\n maxDetected: 10,\n skipFrames: 99,\n skipTime: 2000,\n },\n segmentation: {\n enabled: false,\n modelPath: 'selfie.json',\n blur: 8,\n },\n};\n\nexport { config as defaults };\n", "/*\n Human\n homepage: \n author: '\n*/\n\nexport*from\"@tensorflow/tfjs/dist/index.js\";export*from\"@tensorflow/tfjs-backend-webgl/dist/index.js\";var r=\"3.14.0\",a=\"3.14.0\",e=\"3.14.0\",o=\"3.14.0\",t=\"3.14.0\",s=\"3.14.0\",f=\"3.14.0\",v=\"3.14.0\",j={tfjs:r,\"tfjs-core\":a,\"tfjs-data\":e,\"tfjs-layers\":o,\"tfjs-converter\":t,\"tfjs-backend-cpu\":s,\"tfjs-backend-webgl\":f,\"tfjs-backend-wasm\":v};import{Tensor as b}from\"@tensorflow/tfjs/dist/index.js\";import{GraphModel as i}from\"@tensorflow/tfjs-converter/dist/index\";export{i as GraphModel,b as Tensor,j as version};\n", "export const vertexIdentity = `\n precision highp float;\n attribute vec2 pos;\n attribute vec2 uv;\n varying vec2 vUv;\n uniform float flipY;\n void main(void) {\n vUv = uv;\n gl_Position = vec4(pos.x, pos.y*flipY, 0.0, 1.);\n }\n`;\n\nexport const fragmentIdentity = `\n precision highp float;\n varying vec2 vUv;\n uniform sampler2D texture;\n void main(void) {\n gl_FragColor = texture2D(texture, vUv);\n }\n`;\n\nexport const colorMatrixWithAlpha = `\n precision highp float;\n varying vec2 vUv;\n uniform sampler2D texture;\n uniform float m[20];\n void main(void) {\n vec4 c = texture2D(texture, vUv);\n gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[3] * c.a + m[4];\n gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[8] * c.a + m[9];\n gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[13] * c.a + m[14];\n gl_FragColor.a = m[15] * c.r + m[16] * c.g + m[17] * c.b + m[18] * c.a + m[19];\n }\n`;\n\nexport const colorMatrixWithoutAlpha = `\n precision highp float;\n varying vec2 vUv;\n uniform sampler2D texture;\n uniform float m[20];\n void main(void) {\n vec4 c = texture2D(texture, vUv);\n gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[4];\n gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[9];\n gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[14];\n gl_FragColor.a = c.a;\n }\n`;\n\nexport const pixelate = `\n precision highp float;\n varying vec2 vUv;\n uniform vec2 size;\n uniform sampler2D texture;\n vec2 pixelate(vec2 coord, vec2 size) {\n return floor( coord / size ) * size;\n }\n void main(void) {\n gl_FragColor = vec4(0.0);\n vec2 coord = pixelate(vUv, size);\n gl_FragColor += texture2D(texture, coord);\n }\n`;\n\nexport const blur = `\n precision highp float;\n varying vec2 vUv;\n uniform sampler2D texture;\n uniform vec2 px;\n void main(void) {\n gl_FragColor = vec4(0.0);\n gl_FragColor += texture2D(texture, vUv + vec2(-7.0*px.x, -7.0*px.y))*0.0044299121055113265;\n gl_FragColor += texture2D(texture, vUv + vec2(-6.0*px.x, -6.0*px.y))*0.00895781211794;\n gl_FragColor += texture2D(texture, vUv + vec2(-5.0*px.x, -5.0*px.y))*0.0215963866053;\n gl_FragColor += texture2D(texture, vUv + vec2(-4.0*px.x, -4.0*px.y))*0.0443683338718;\n gl_FragColor += texture2D(texture, vUv + vec2(-3.0*px.x, -3.0*px.y))*0.0776744219933;\n gl_FragColor += texture2D(texture, vUv + vec2(-2.0*px.x, -2.0*px.y))*0.115876621105;\n gl_FragColor += texture2D(texture, vUv + vec2(-1.0*px.x, -1.0*px.y))*0.147308056121;\n gl_FragColor += texture2D(texture, vUv )*0.159576912161;\n gl_FragColor += texture2D(texture, vUv + vec2( 1.0*px.x, 1.0*px.y))*0.147308056121;\n gl_FragColor += texture2D(texture, vUv + vec2( 2.0*px.x, 2.0*px.y))*0.115876621105;\n gl_FragColor += texture2D(texture, vUv + vec2( 3.0*px.x, 3.0*px.y))*0.0776744219933;\n gl_FragColor += texture2D(texture, vUv + vec2( 4.0*px.x, 4.0*px.y))*0.0443683338718;\n gl_FragColor += texture2D(texture, vUv + vec2( 5.0*px.x, 5.0*px.y))*0.0215963866053;\n gl_FragColor += texture2D(texture, vUv + vec2( 6.0*px.x, 6.0*px.y))*0.00895781211794;\n gl_FragColor += texture2D(texture, vUv + vec2( 7.0*px.x, 7.0*px.y))*0.0044299121055113265;\n }\n`;\n\nexport const convolution = `\n precision highp float;\n varying vec2 vUv;\n uniform sampler2D texture;\n uniform vec2 px;\n uniform float m[9];\n void main(void) {\n vec4 c11 = texture2D(texture, vUv - px); // top left\n vec4 c12 = texture2D(texture, vec2(vUv.x, vUv.y - px.y)); // top center\n vec4 c13 = texture2D(texture, vec2(vUv.x + px.x, vUv.y - px.y)); // top right\n vec4 c21 = texture2D(texture, vec2(vUv.x - px.x, vUv.y) ); // mid left\n vec4 c22 = texture2D(texture, vUv); // mid center\n vec4 c23 = texture2D(texture, vec2(vUv.x + px.x, vUv.y) ); // mid right\n vec4 c31 = texture2D(texture, vec2(vUv.x - px.x, vUv.y + px.y) ); // bottom left\n vec4 c32 = texture2D(texture, vec2(vUv.x, vUv.y + px.y) ); // bottom center\n vec4 c33 = texture2D(texture, vUv + px ); // bottom right\n gl_FragColor = \n c11 * m[0] + c12 * m[1] + c22 * m[2] +\n c21 * m[3] + c22 * m[4] + c23 * m[5] +\n c31 * m[6] + c32 * m[7] + c33 * m[8];\n gl_FragColor.a = c22.a;\n }\n`;\n", "/**\n * Image Filters in WebGL algoritm implementation\n * Based on: [WebGLImageFilter](https://github.com/phoboslab/WebGLImageFilter)\n */\n\nimport * as shaders from './imagefxshaders';\nimport { canvas } from './image';\nimport { log } from '../util/util';\n\nconst collect = (source, prefix, collection) => {\n const r = new RegExp('\\\\b' + prefix + ' \\\\w+ (\\\\w+)', 'ig');\n source.replace(r, (match, name) => {\n collection[name] = 0;\n return match;\n });\n};\n\nclass GLProgram {\n uniform = {};\n attribute = {};\n gl: WebGLRenderingContext;\n id: WebGLProgram;\n\n constructor(gl, vertexSource, fragmentSource) {\n this.gl = gl;\n const vertexShader = this.compile(vertexSource, this.gl.VERTEX_SHADER);\n const fragmentShader = this.compile(fragmentSource, this.gl.FRAGMENT_SHADER);\n this.id = this.gl.createProgram() as WebGLProgram;\n if (!vertexShader || !fragmentShader) return;\n if (!this.id) {\n log('filter: could not create webgl program');\n return;\n }\n this.gl.attachShader(this.id, vertexShader);\n this.gl.attachShader(this.id, fragmentShader);\n this.gl.linkProgram(this.id);\n if (!this.gl.getProgramParameter(this.id, this.gl.LINK_STATUS)) {\n log(`filter: gl link failed: ${this.gl.getProgramInfoLog(this.id)}`);\n return;\n }\n this.gl.useProgram(this.id);\n collect(vertexSource, 'attribute', this.attribute); // Collect attributes\n for (const a in this.attribute) this.attribute[a] = this.gl.getAttribLocation(this.id, a);\n collect(vertexSource, 'uniform', this.uniform); // Collect uniforms\n collect(fragmentSource, 'uniform', this.uniform);\n for (const u in this.uniform) this.uniform[u] = this.gl.getUniformLocation(this.id, u);\n }\n\n compile = (source, type): WebGLShader | null => {\n const shader = this.gl.createShader(type) as WebGLShader;\n if (!shader) {\n log('filter: could not create shader');\n return null;\n }\n this.gl.shaderSource(shader, source);\n this.gl.compileShader(shader);\n if (!this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS)) {\n log(`filter: gl compile failed: ${this.gl.getShaderInfoLog(shader)}`);\n return null;\n }\n return shader;\n };\n}\n\n// function that is instantiated as class so it has private this members\n/**\n * @class GLImageFilter\n * @property {function} reset reset current filter chain\n * @property {function} add add specified filter to filter chain\n * @property {function} apply execute filter chain and draw result\n * @property {function} draw just draw input to result\n */\n\nexport function GLImageFilter() {\n let drawCount = 0;\n let sourceTexture: WebGLTexture | null = null;\n let lastInChain = false;\n let currentFramebufferIndex = -1;\n let tempFramebuffers: [null, null] | [{ fbo: WebGLFramebuffer | null, texture: WebGLTexture | null }] = [null, null];\n let filterChain: Record[] = [];\n let vertexBuffer: WebGLBuffer | null = null;\n let currentProgram: GLProgram | null = null;\n const fxcanvas = canvas(100, 100);\n const shaderProgramCache = { }; // key is the shader program source, value is the compiled program\n const DRAW = { INTERMEDIATE: 1 };\n const gl = fxcanvas.getContext('webgl') as WebGLRenderingContext;\n // @ts-ignore used for sanity checks outside of imagefx\n this.gl = gl;\n if (!gl) {\n log('filter: cannot get webgl context');\n return;\n }\n\n function resize(width, height) {\n if (width === fxcanvas.width && height === fxcanvas.height) return; // Same width/height? Nothing to do here\n fxcanvas.width = width;\n fxcanvas.height = height;\n if (!vertexBuffer) { // Create the context if we don't have it yet\n const vertices = new Float32Array([-1, -1, 0, 1, 1, -1, 1, 1, -1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 1, 1, 1, 1, 1, 0]); // Create the vertex buffer for the two triangles [x, y, u, v] * 6\n vertexBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n }\n gl.viewport(0, 0, fxcanvas.width, fxcanvas.height);\n tempFramebuffers = [null, null]; // Delete old temp framebuffers\n }\n\n function createFramebufferTexture(width, height) {\n const fbo = gl.createFramebuffer() as WebGLFramebuffer;\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n const renderbuffer = gl.createRenderbuffer();\n gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);\n const texture = gl.createTexture() as WebGLTexture;\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n return { fbo, texture };\n }\n\n function getTempFramebuffer(index): { fbo: WebGLFramebuffer | null, texture: WebGLTexture | null } {\n tempFramebuffers[index] = tempFramebuffers[index] || createFramebufferTexture(fxcanvas.width, fxcanvas.height);\n return tempFramebuffers[index] as { fbo: WebGLFramebuffer, texture: WebGLTexture };\n }\n\n function draw(flags = 0) {\n if (!currentProgram) return;\n let source: WebGLTexture | null = null;\n let target: WebGLFramebuffer | null = null;\n let flipY = false;\n if (drawCount === 0) source = sourceTexture; // First draw call - use the source texture\n else source = getTempFramebuffer(currentFramebufferIndex).texture || null; // All following draw calls use the temp buffer last drawn to\n drawCount++;\n if (lastInChain && !(flags & DRAW.INTERMEDIATE)) { // Last filter in our chain - draw directly to the WebGL Canvas. We may also have to flip the image vertically now\n target = null;\n flipY = drawCount % 2 === 0;\n } else {\n currentFramebufferIndex = (currentFramebufferIndex + 1) % 2;\n target = getTempFramebuffer(currentFramebufferIndex).fbo || null; // Intermediate draw call - get a temp buffer to draw to\n }\n gl.bindTexture(gl.TEXTURE_2D, source); // Bind the source and target and draw the two triangles\n gl.bindFramebuffer(gl.FRAMEBUFFER, target);\n gl.uniform1f(currentProgram.uniform['flipY'], (flipY ? -1 : 1));\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n\n function compileShader(fragmentSource): GLProgram | null {\n if (shaderProgramCache[fragmentSource]) {\n currentProgram = shaderProgramCache[fragmentSource];\n gl.useProgram((currentProgram ? currentProgram.id : null) || null);\n return currentProgram as GLProgram;\n }\n currentProgram = new GLProgram(gl, shaders.vertexIdentity, fragmentSource);\n if (!currentProgram) {\n log('filter: could not get webgl program');\n return null;\n }\n const floatSize = Float32Array.BYTES_PER_ELEMENT;\n const vertSize = 4 * floatSize;\n gl.enableVertexAttribArray(currentProgram.attribute['pos']);\n gl.vertexAttribPointer(currentProgram.attribute['pos'], 2, gl.FLOAT, false, vertSize, 0 * floatSize);\n gl.enableVertexAttribArray(currentProgram.attribute['uv']);\n gl.vertexAttribPointer(currentProgram.attribute['uv'], 2, gl.FLOAT, false, vertSize, 2 * floatSize);\n shaderProgramCache[fragmentSource] = currentProgram;\n return currentProgram as GLProgram;\n }\n\n const filter = {\n colorMatrix: (matrix) => { // general color matrix filter\n const m = new Float32Array(matrix);\n m[4] /= 255;\n m[9] /= 255;\n m[14] /= 255;\n m[19] /= 255;\n const shader = (m[18] === 1 && m[3] === 0 && m[8] === 0 && m[13] === 0 && m[15] === 0 && m[16] === 0 && m[17] === 0 && m[19] === 0) // Can we ignore the alpha value? Makes things a bit faster.\n ? shaders.colorMatrixWithoutAlpha\n : shaders.colorMatrixWithAlpha;\n const program = compileShader(shader);\n if (!program) return;\n gl.uniform1fv(program.uniform['m'], m);\n draw();\n },\n\n brightness: (brightness) => {\n const b = (brightness || 0) + 1;\n filter.colorMatrix([\n b, 0, 0, 0, 0,\n 0, b, 0, 0, 0,\n 0, 0, b, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n saturation: (amount) => {\n const x = (amount || 0) * 2 / 3 + 1;\n const y = ((x - 1) * -0.5);\n filter.colorMatrix([\n x, y, y, 0, 0,\n y, x, y, 0, 0,\n y, y, x, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n desaturate: () => {\n filter.saturation(-1);\n },\n\n contrast: (amount) => {\n const v = (amount || 0) + 1;\n const o = -128 * (v - 1);\n filter.colorMatrix([\n v, 0, 0, 0, o,\n 0, v, 0, 0, o,\n 0, 0, v, 0, o,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n negative: () => {\n filter.contrast(-2);\n },\n\n hue: (rotation) => {\n rotation = (rotation || 0) / 180 * Math.PI;\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n const lumR = 0.213;\n const lumG = 0.715;\n const lumB = 0.072;\n filter.colorMatrix([\n lumR + cos * (1 - lumR) + sin * (-lumR), lumG + cos * (-lumG) + sin * (-lumG), lumB + cos * (-lumB) + sin * (1 - lumB), 0, 0,\n lumR + cos * (-lumR) + sin * (0.143), lumG + cos * (1 - lumG) + sin * (0.140), lumB + cos * (-lumB) + sin * (-0.283), 0, 0,\n lumR + cos * (-lumR) + sin * (-(1 - lumR)), lumG + cos * (-lumG) + sin * (lumG), lumB + cos * (1 - lumB) + sin * (lumB), 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n desaturateLuminance: () => {\n filter.colorMatrix([\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n sepia: () => {\n filter.colorMatrix([\n 0.393, 0.7689999, 0.18899999, 0, 0,\n 0.349, 0.6859999, 0.16799999, 0, 0,\n 0.272, 0.5339999, 0.13099999, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n brownie: () => {\n filter.colorMatrix([\n 0.5997023498159715, 0.34553243048391263, -0.2708298674538042, 0, 47.43192855600873,\n -0.037703249837783157, 0.8609577587992641, 0.15059552388459913, 0, -36.96841498319127,\n 0.24113635128153335, -0.07441037908422492, 0.44972182064877153, 0, -7.562075277591283,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n vintagePinhole: () => {\n filter.colorMatrix([\n 0.6279345635605994, 0.3202183420819367, -0.03965408211312453, 0, 9.651285835294123,\n 0.02578397704808868, 0.6441188644374771, 0.03259127616149294, 0, 7.462829176470591,\n 0.0466055556782719, -0.0851232987247891, 0.5241648018700465, 0, 5.159190588235296,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n kodachrome: () => {\n filter.colorMatrix([\n 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n technicolor: () => {\n filter.colorMatrix([\n 1.9125277891456083, -0.8545344976951645, -0.09155508482755585, 0, 11.793603434377337,\n -0.3087833385928097, 1.7658908555458428, -0.10601743074722245, 0, -70.35205161461398,\n -0.231103377548616, -0.7501899197440212, 1.847597816108189, 0, 30.950940869491138,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n polaroid: () => {\n filter.colorMatrix([\n 1.438, -0.062, -0.062, 0, 0,\n -0.122, 1.378, -0.122, 0, 0,\n -0.016, -0.016, 1.483, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n shiftToBGR: () => {\n filter.colorMatrix([\n 0, 0, 1, 0, 0,\n 0, 1, 0, 0, 0,\n 1, 0, 0, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n convolution: (matrix) => { // general convolution Filter\n const m = new Float32Array(matrix);\n const pixelSizeX = 1 / fxcanvas.width;\n const pixelSizeY = 1 / fxcanvas.height;\n const program = compileShader(shaders.convolution);\n if (!program) return;\n gl.uniform1fv(program.uniform['m'], m);\n gl.uniform2f(program.uniform['px'], pixelSizeX, pixelSizeY);\n draw();\n },\n\n detectEdges: () => {\n // @ts-ignore this\n filter.convolution.call(this, [\n 0, 1, 0,\n 1, -4, 1,\n 0, 1, 0,\n ]);\n },\n\n sobelX: () => {\n // @ts-ignore this\n filter.convolution.call(this, [\n -1, 0, 1,\n -2, 0, 2,\n -1, 0, 1,\n ]);\n },\n\n sobelY: () => {\n // @ts-ignore this\n filter.convolution.call(this, [\n -1, -2, -1,\n 0, 0, 0,\n 1, 2, 1,\n ]);\n },\n\n sharpen: (amount) => {\n const a = amount || 1;\n // @ts-ignore this\n filter.convolution.call(this, [\n 0, -1 * a, 0,\n -1 * a, 1 + 4 * a, -1 * a,\n 0, -1 * a, 0,\n ]);\n },\n\n emboss: (size) => {\n const s = size || 1;\n // @ts-ignore this\n filter.convolution.call(this, [\n -2 * s, -1 * s, 0,\n -1 * s, 1, 1 * s,\n 0, 1 * s, 2 * s,\n ]);\n },\n\n blur: (size) => {\n const blurSizeX = (size / 7) / fxcanvas.width;\n const blurSizeY = (size / 7) / fxcanvas.height;\n const program = compileShader(shaders.blur);\n if (!program) return;\n // Vertical\n gl.uniform2f(program.uniform['px'], 0, blurSizeY);\n draw(DRAW.INTERMEDIATE);\n // Horizontal\n gl.uniform2f(program.uniform['px'], blurSizeX, 0);\n draw();\n },\n\n pixelate: (size) => {\n const blurSizeX = (size) / fxcanvas.width;\n const blurSizeY = (size) / fxcanvas.height;\n const program = compileShader(shaders.pixelate);\n if (!program) return;\n gl.uniform2f(program.uniform['size'], blurSizeX, blurSizeY);\n draw();\n },\n };\n\n // @ts-ignore this\n this.add = function (name) {\n // eslint-disable-next-line prefer-rest-params\n const args = Array.prototype.slice.call(arguments, 1);\n const func = filter[name];\n filterChain.push({ func, args });\n };\n\n // @ts-ignore this\n this.reset = function () {\n filterChain = [];\n };\n\n // @ts-ignore this\n this.get = function () {\n return filterChain;\n };\n\n // @ts-ignore this\n this.apply = function (image) {\n resize(image.width, image.height);\n drawCount = 0;\n if (!sourceTexture) sourceTexture = gl.createTexture(); // Create the texture for the input image if we haven't yet\n gl.bindTexture(gl.TEXTURE_2D, sourceTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n for (let i = 0; i < filterChain.length; i++) {\n lastInChain = (i === filterChain.length - 1);\n const f = filterChain[i];\n // @ts-ignore function assigment\n f.func.apply(this, f.args || []);\n }\n return fxcanvas;\n };\n\n // @ts-ignore this\n this.draw = function (image) {\n this.add('brightness', 0);\n return this.apply(image);\n };\n}\n", "/**\n * Image enhancements\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport type { Tensor } from '../exports';\n\nexport async function histogramEqualization(inputImage: Tensor): Promise {\n // const maxValue = 254; // using 255 results in values slightly larger than 1 due to math rounding errors\n const squeeze = inputImage.shape.length === 4 ? tf.squeeze(inputImage) : inputImage;\n const channels = tf.split(squeeze, 3, 2);\n const min: Tensor[] = [tf.min(channels[0]), tf.min(channels[1]), tf.min(channels[2])];\n const max: Tensor[] = [tf.max(channels[0]), tf.max(channels[1]), tf.max(channels[2])];\n const absMax = await Promise.all(max.map((channel) => channel.data()));\n const maxValue = 0.99 * Math.max(absMax[0][0], absMax[1][0], absMax[2][0]);\n const sub = [tf.sub(channels[0], min[0]), tf.sub(channels[1], min[1]), tf.sub(channels[2], min[2])];\n const range = [tf.sub(max[0], min[0]), tf.sub(max[1], min[1]), tf.sub(max[2], min[2])];\n const fact = [tf.div(maxValue, range[0]), tf.div(maxValue, range[1]), tf.div(maxValue, range[2])];\n const enh = [tf.mul(sub[0], fact[0]), tf.mul(sub[1], fact[1]), tf.mul(sub[2], fact[2])];\n const rgb = tf.stack([enh[0], enh[1], enh[2]], 2);\n const reshape = tf.reshape(rgb, [1, squeeze.shape[0], squeeze.shape[1], 3]);\n tf.dispose([...channels, ...min, ...max, ...sub, ...range, ...fact, ...enh, rgb, squeeze]);\n return reshape; // output shape is [1, height, width, 3]\n}\n", "/**\n * Image Processing algorithm implementation\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as fxImage from './imagefx';\nimport type { Input, AnyCanvas, Tensor, Config } from '../exports';\nimport { env } from '../util/env';\nimport { log } from '../util/util';\nimport * as enhance from './enhance';\n\nconst maxSize = 2048;\n// internal temp canvases\nlet inCanvas: AnyCanvas | null = null; // use global variable to avoid recreating canvas on each frame\nlet outCanvas: AnyCanvas | null = null; // use global variable to avoid recreating canvas on each frame\nlet tmpCanvas: AnyCanvas | null = null; // use global variable to avoid recreating canvas on each frame\n// @ts-ignore // imagefx is js module that should be converted to a class\nlet fx: fxImage.GLImageFilter | null; // instance of imagefx\n\nconst last: { inputSum: number, cacheDiff: number, sumMethod: number, inputTensor: undefined | Tensor } = {\n inputSum: 0,\n cacheDiff: 1,\n sumMethod: 0,\n inputTensor: undefined,\n};\n\nexport function canvas(width: number, height: number): AnyCanvas {\n let c;\n if (env.browser) { // browser defines canvas object\n if (env.worker) { // if runing in web worker use OffscreenCanvas\n if (typeof OffscreenCanvas === 'undefined') throw new Error('canvas error: attempted to run in web worker but OffscreenCanvas is not supported');\n c = new OffscreenCanvas(width, height);\n } else { // otherwise use DOM canvas\n if (typeof document === 'undefined') throw new Error('canvas error: attempted to run in browser but DOM is not defined');\n c = document.createElement('canvas');\n c.width = width;\n c.height = height;\n }\n } else { // if not running in browser, there is no \"default\" canvas object, so we need monkey patch or fail\n // @ts-ignore // env.canvas is an external monkey-patch\n if (typeof env.Canvas !== 'undefined') c = new env.Canvas(width, height);\n else if (typeof globalThis.Canvas !== 'undefined') c = new globalThis.Canvas(width, height);\n // else throw new Error('canvas error: attempted to use canvas in nodejs without canvas support installed');\n }\n return c;\n}\n\n// helper function to copy canvas from input to output\nexport function copy(input: AnyCanvas, output?: AnyCanvas) {\n const outputCanvas = output || canvas(input.width, input.height);\n const ctx = outputCanvas.getContext('2d') as CanvasRenderingContext2D;\n ctx.drawImage(input, 0, 0);\n return outputCanvas;\n}\n\n// process input image and return tensor\n// input can be tensor, imagedata, htmlimageelement, htmlvideoelement\n// input is resized and run through imagefx filter\nexport async function process(input: Input, config: Config, getTensor: boolean = true): Promise<{ tensor: Tensor | null, canvas: AnyCanvas | null }> {\n if (!input) {\n // throw new Error('input is missing');\n if (config.debug) log('input error: input is missing');\n return { tensor: null, canvas: null }; // video may become temporarily unavailable due to onresize\n }\n // sanity checks since different browsers do not implement all dom elements\n if (\n !(input instanceof tf.Tensor)\n && !(typeof Image !== 'undefined' && input instanceof Image)\n && !(typeof env.Canvas !== 'undefined' && input instanceof env.Canvas)\n && !(typeof globalThis.Canvas !== 'undefined' && input instanceof globalThis.Canvas)\n && !(typeof ImageData !== 'undefined' && input instanceof ImageData)\n && !(typeof ImageBitmap !== 'undefined' && input instanceof ImageBitmap)\n && !(typeof HTMLImageElement !== 'undefined' && input instanceof HTMLImageElement)\n && !(typeof HTMLMediaElement !== 'undefined' && input instanceof HTMLMediaElement)\n && !(typeof HTMLVideoElement !== 'undefined' && input instanceof HTMLVideoElement)\n && !(typeof HTMLCanvasElement !== 'undefined' && input instanceof HTMLCanvasElement)\n && !(typeof OffscreenCanvas !== 'undefined' && input instanceof OffscreenCanvas)\n ) {\n throw new Error('input error: type is not recognized');\n }\n if (input instanceof tf.Tensor) { // if input is tensor use as-is without filters but correct shape as needed\n let tensor: Tensor | null = null;\n if ((input as Tensor)['isDisposedInternal']) throw new Error('input error: attempted to use tensor but it is disposed');\n if (!(input as Tensor)['shape']) throw new Error('input error: attempted to use tensor without a shape');\n if ((input as Tensor).shape.length === 3) { // [height, width, 3 || 4]\n if ((input as Tensor).shape[2] === 3) { // [height, width, 3] so add batch\n tensor = tf.expandDims(input, 0);\n } else if ((input as Tensor).shape[2] === 4) { // [height, width, 4] so strip alpha and add batch\n const rgb = tf.slice3d(input, [0, 0, 0], [-1, -1, 3]);\n tensor = tf.expandDims(rgb, 0);\n tf.dispose(rgb);\n }\n } else if ((input as Tensor).shape.length === 4) { // [1, width, height, 3 || 4]\n if ((input as Tensor).shape[3] === 3) { // [1, width, height, 3] just clone\n tensor = tf.clone(input);\n } else if ((input as Tensor).shape[3] === 4) { // [1, width, height, 4] so strip alpha\n tensor = tf.slice4d(input, [0, 0, 0, 0], [-1, -1, -1, 3]);\n }\n }\n // at the end shape must be [1, height, width, 3]\n if (tensor == null || tensor.shape.length !== 4 || tensor.shape[0] !== 1 || tensor.shape[3] !== 3) throw new Error(`input error: attempted to use tensor with unrecognized shape: ${input['shape']}`);\n if ((tensor as Tensor).dtype === 'int32') {\n const cast = tf.cast(tensor, 'float32');\n tf.dispose(tensor);\n tensor = cast;\n }\n return { tensor, canvas: (config.filter.return ? outCanvas : null) };\n } else {\n // check if resizing will be needed\n if (typeof input['readyState'] !== 'undefined' && input['readyState'] <= 2) {\n if (config.debug) log('input stream is not ready');\n return { tensor: null, canvas: inCanvas }; // video may become temporarily unavailable due to onresize\n }\n const originalWidth = input['naturalWidth'] || input['videoWidth'] || input['width'] || (input['shape'] && (input['shape'][1] > 0));\n const originalHeight = input['naturalHeight'] || input['videoHeight'] || input['height'] || (input['shape'] && (input['shape'][2] > 0));\n if (!originalWidth || !originalHeight) {\n if (config.debug) log('cannot determine input dimensions');\n return { tensor: null, canvas: inCanvas }; // video may become temporarily unavailable due to onresize\n }\n let targetWidth = originalWidth;\n let targetHeight = originalHeight;\n if (targetWidth > maxSize) {\n targetWidth = maxSize;\n targetHeight = Math.trunc(targetWidth * originalHeight / originalWidth);\n }\n if (targetHeight > maxSize) {\n targetHeight = maxSize;\n targetWidth = Math.trunc(targetHeight * originalWidth / originalHeight);\n }\n\n // create our canvas and resize it if needed\n if ((config.filter.width || 0) > 0) targetWidth = config.filter.width;\n else if ((config.filter.height || 0) > 0) targetWidth = originalWidth * ((config.filter.height || 0) / originalHeight);\n if ((config.filter.height || 0) > 0) targetHeight = config.filter.height;\n else if ((config.filter.width || 0) > 0) targetHeight = originalHeight * ((config.filter.width || 0) / originalWidth);\n if (!targetWidth || !targetHeight) throw new Error('input error: cannot determine dimension');\n if (!inCanvas || (inCanvas?.width !== targetWidth) || (inCanvas?.height !== targetHeight)) inCanvas = canvas(targetWidth, targetHeight);\n\n // draw input to our canvas\n const inCtx = inCanvas.getContext('2d') as CanvasRenderingContext2D;\n if ((typeof ImageData !== 'undefined') && (input instanceof ImageData)) {\n inCtx.putImageData(input, 0, 0);\n } else {\n if (config.filter.flip && typeof inCtx.translate !== 'undefined') {\n inCtx.translate(originalWidth, 0);\n inCtx.scale(-1, 1);\n inCtx.drawImage(input as AnyCanvas, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas?.width, inCanvas?.height);\n inCtx.setTransform(1, 0, 0, 1, 0, 0); // resets transforms to defaults\n } else {\n inCtx.drawImage(input as AnyCanvas, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas?.width, inCanvas?.height);\n }\n }\n\n if (!outCanvas || (inCanvas.width !== outCanvas.width) || (inCanvas?.height !== outCanvas?.height)) outCanvas = canvas(inCanvas.width, inCanvas.height); // init output canvas\n\n // imagefx transforms using gl from input canvas to output canvas\n if (config.filter.enabled && env.webgl.supported) {\n if (!fx) fx = env.browser ? new fxImage.GLImageFilter() : null; // && (typeof document !== 'undefined')\n env.filter = !!fx;\n if (!fx || !fx.add) {\n if (config.debug) log('input process error: cannot initialize filters');\n return { tensor: null, canvas: inCanvas };\n }\n fx.reset();\n if (config.filter.brightness !== 0) fx.add('brightness', config.filter.brightness);\n if (config.filter.contrast !== 0) fx.add('contrast', config.filter.contrast);\n if (config.filter.sharpness !== 0) fx.add('sharpen', config.filter.sharpness);\n if (config.filter.blur !== 0) fx.add('blur', config.filter.blur);\n if (config.filter.saturation !== 0) fx.add('saturation', config.filter.saturation);\n if (config.filter.hue !== 0) fx.add('hue', config.filter.hue);\n if (config.filter.negative) fx.add('negative');\n if (config.filter.sepia) fx.add('sepia');\n if (config.filter.vintage) fx.add('brownie');\n if (config.filter.sepia) fx.add('sepia');\n if (config.filter.kodachrome) fx.add('kodachrome');\n if (config.filter.technicolor) fx.add('technicolor');\n if (config.filter.polaroid) fx.add('polaroid');\n if (config.filter.pixelate !== 0) fx.add('pixelate', config.filter.pixelate);\n if (fx.get() > 0) outCanvas = fx.apply(inCanvas);\n else outCanvas = fx.draw(inCanvas);\n } else {\n copy(inCanvas, outCanvas); // if no filters applied, output canvas is input canvas\n if (fx) fx = null;\n env.filter = !!fx;\n }\n\n if (!getTensor) return { tensor: null, canvas: outCanvas }; // just canvas was requested\n if (!outCanvas) throw new Error('canvas error: cannot create output');\n\n // create tensor from image unless input was a tensor already\n let pixels;\n let depth = 3;\n if ((typeof ImageData !== 'undefined' && input instanceof ImageData) || (input['data'] && input['width'] && input['height'])) { // if input is imagedata, just use it\n if (env.browser && tf.browser) {\n pixels = tf.browser ? tf.browser.fromPixels(input) : null;\n } else {\n depth = input['data'].length / input['height'] / input['width'];\n // const arr = Uint8Array.from(input['data']);\n const arr = new Uint8Array(input['data']['buffer']);\n pixels = tf.tensor(arr, [input['height'], input['width'], depth], 'int32');\n }\n } else {\n if (!tmpCanvas || (outCanvas.width !== tmpCanvas.width) || (outCanvas.height !== tmpCanvas.height)) tmpCanvas = canvas(outCanvas.width, outCanvas.height); // init output canvas\n if (tf.browser && env.browser) {\n if (config.backend === 'webgl' || config.backend === 'humangl' || config.backend === 'webgpu') {\n pixels = tf.browser.fromPixels(outCanvas); // safe to reuse since both backend and context are gl based\n } else {\n tmpCanvas = copy(outCanvas); // cannot use output canvas as it already has gl context so we do a silly one more canvas\n pixels = tf.browser.fromPixels(tmpCanvas);\n }\n } else {\n const tempCanvas = copy(outCanvas); // cannot use output canvas as it already has gl context so we do a silly one more canvas\n const tempCtx = tempCanvas.getContext('2d') as CanvasRenderingContext2D;\n const tempData = tempCtx.getImageData(0, 0, targetWidth, targetHeight);\n depth = tempData.data.length / targetWidth / targetHeight;\n const arr = new Uint8Array(tempData.data.buffer);\n pixels = tf.tensor(arr, [targetWidth, targetHeight, depth]);\n }\n }\n if (depth === 4) { // rgba to rgb\n const rgb = tf.slice3d(pixels, [0, 0, 0], [-1, -1, 3]); // strip alpha channel\n tf.dispose(pixels);\n pixels = rgb;\n }\n if (!pixels) throw new Error('input error: cannot create tensor');\n const casted = tf.cast(pixels, 'float32');\n const tensor = config.filter.equalization ? await enhance.histogramEqualization(casted) : tf.expandDims(casted, 0);\n tf.dispose([pixels, casted]);\n return { tensor, canvas: (config.filter.return ? outCanvas : null) };\n }\n}\n\n/*\nconst checksum = async (input: Tensor): Promise => { // use tf sum or js based sum loop depending on which is faster\n const resizeFact = 48;\n const reduced: Tensor = tf.image.resizeBilinear(input, [Math.trunc((input.shape[1] || 1) / resizeFact), Math.trunc((input.shape[2] || 1) / resizeFact)]);\n const tfSum = async (): Promise => {\n const sumT = tf.sum(reduced);\n const sum0 = await sumT.data();\n tf.dispose(sumT);\n return sum0[0];\n };\n const jsSum = async (): Promise => {\n const reducedData = await reduced.data(); // raw image rgb array\n let sum0 = 0;\n for (let i = 0; i < reducedData.length / 3; i++) sum0 += reducedData[3 * i + 2]; // look only at green value of each pixel\n return sum0;\n };\n if (last.sumMethod === 0) {\n const t0 = now();\n await jsSum();\n const t1 = now();\n await tfSum();\n const t2 = now();\n last.sumMethod = t1 - t0 < t2 - t1 ? 1 : 2;\n }\n const res = last.sumMethod === 1 ? await jsSum() : await tfSum();\n tf.dispose(reduced);\n return res;\n};\n*/\n\nexport async function skip(config: Partial, input: Tensor) {\n let skipFrame = false;\n if (config.cacheSensitivity === 0 || !input.shape || input.shape.length !== 4 || input.shape[1] > 2048 || input.shape[2] > 2048) return skipFrame; // cache disabled or input is invalid or too large for cache analysis\n\n /*\n const checkSum = await checksum(input);\n const diff = 100 * (Math.max(checkSum, last.inputSum) / Math.min(checkSum, last.inputSum) - 1);\n last.inputSum = checkSum;\n // if previous frame was skipped, skip this frame if changed more than cacheSensitivity\n // if previous frame was not skipped, then look for cacheSensitivity or difference larger than one in previous frame to avoid resetting cache in subsequent frames unnecessarily\n let skipFrame = diff < Math.max(config.cacheSensitivity, last.cacheDiff);\n // if difference is above 10x threshold, don't use last value to force reset cache for significant change of scenes or images\n last.cacheDiff = diff > 10 * config.cacheSensitivity ? 0 : diff;\n skipFrame = skipFrame && (last.cacheDiff > 0); // if no cached diff value then force no skip\n */\n\n if (!last.inputTensor) {\n last.inputTensor = tf.clone(input);\n } else if (last.inputTensor.shape[1] !== input.shape[1] || last.inputTensor.shape[2] !== input.shape[2]) { // input resolution changed\n tf.dispose(last.inputTensor);\n last.inputTensor = tf.clone(input);\n } else {\n const t: Record = {};\n t.diff = tf.sub(input, last.inputTensor);\n t.squared = tf.mul(t.diff, t.diff);\n t.sum = tf.sum(t.squared);\n const diffSum = await t.sum.data();\n const diffRelative = diffSum[0] / (input.shape[1] || 1) / (input.shape[2] || 1) / 255 / 3; // squared difference relative to input resolution and averaged per channel\n tf.dispose([last.inputTensor, t.diff, t.squared, t.sum]);\n last.inputTensor = tf.clone(input);\n skipFrame = diffRelative <= (config.cacheSensitivity || 0);\n }\n return skipFrame;\n}\n\nexport async function compare(config: Partial, input1: Tensor, input2: Tensor): Promise {\n const t: Record = {};\n if (!input1 || !input2 || input1.shape.length !== 4 || input1.shape.length !== input2.shape.length) {\n if (!config.debug) log('invalid input tensor or tensor shapes do not match:', input1.shape, input2.shape);\n return 0;\n }\n if (input1.shape[0] !== 1 || input2.shape[0] !== 1 || input1.shape[3] !== 3 || input2.shape[3] !== 3) {\n if (!config.debug) log('input tensors must be of shape [1, height, width, 3]:', input1.shape, input2.shape);\n return 0;\n }\n t.input1 = tf.clone(input1);\n t.input2 = (input1.shape[1] !== input2.shape[1] || input1.shape[2] !== input2.shape[2]) ? tf.image.resizeBilinear(input2, [input1.shape[1], input1.shape[2]]) : tf.clone(input2);\n t.diff = tf.sub(t.input1, t.input2);\n t.squared = tf.mul(t.diff, t.diff);\n t.sum = tf.sum(t.squared);\n const diffSum = await t.sum.data();\n const diffRelative = diffSum[0] / (input1.shape[1] || 1) / (input1.shape[2] || 1) / 255 / 3;\n tf.dispose([t.input1, t.input2, t.diff, t.squared, t.sum]);\n return diffRelative;\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as image from '../image/image';\n\n/** Env class that holds detected capabilities */\nexport class Env {\n /** Running in Browser */\n browser: boolean;\n /** Running in NodeJS */\n node: boolean;\n /** Running in WebWorker thread */\n worker: boolean;\n /** Detected platform */\n platform: string = '';\n /** Detected agent */\n agent: string = '';\n /** List of supported backends */\n backends: string[] = [];\n /** Has any work been performed so far */\n initial: boolean;\n /** Are image filters supported? */\n filter: boolean | undefined;\n /** TFJS instance details */\n tfjs: {\n version: undefined | string,\n };\n /** Is offscreenCanvas supported? */\n offscreen: undefined | boolean;\n /** Are performance counter instant values or additive */\n perfadd: boolean = false;\n /** WASM detected capabilities */\n wasm: {\n supported: undefined | boolean,\n backend: undefined | boolean,\n simd: undefined | boolean,\n multithread: undefined | boolean,\n } = {\n supported: undefined,\n backend: undefined,\n simd: undefined,\n multithread: undefined,\n };\n /** WebGL detected capabilities */\n webgl: {\n supported: undefined | boolean,\n backend: undefined | boolean,\n version: undefined | string,\n renderer: undefined | string,\n } = {\n supported: undefined,\n backend: undefined,\n version: undefined,\n renderer: undefined,\n };\n /** WebGPU detected capabilities */\n webgpu: {\n supported: undefined | boolean,\n backend: undefined | boolean,\n adapter: undefined | string,\n } = {\n supported: undefined,\n backend: undefined,\n adapter: undefined,\n };\n /** CPU info */\n cpu: {\n model: undefined | string,\n flags: string[],\n } = {\n model: undefined,\n flags: [],\n };\n /** List of supported kernels for current backend */\n kernels: string[] = [];\n /** MonkeyPatch for Canvas */\n Canvas: undefined;\n /** MonkeyPatch for Image */\n Image: undefined;\n /** MonkeyPatch for ImageData */\n ImageData: undefined;\n\n constructor() {\n this.browser = typeof navigator !== 'undefined';\n this.node = (typeof process !== 'undefined') && (typeof process.versions !== 'undefined') && (typeof process.versions.node !== 'undefined');\n this.tfjs = { version: tf.version['tfjs-core'] };\n this.offscreen = typeof OffscreenCanvas !== 'undefined';\n this.initial = true;\n // @ts-ignore WorkerGlobalScope evaluated in browser only\n this.worker = this.browser && this.offscreen ? (typeof WorkerGlobalScope !== 'undefined') : undefined;\n if (typeof navigator !== 'undefined') {\n const raw = navigator.userAgent.match(/\\(([^()]+)\\)/g);\n if (raw && raw[0]) {\n const platformMatch = raw[0].match(/\\(([^()]+)\\)/g);\n this.platform = (platformMatch && platformMatch[0]) ? platformMatch[0].replace(/\\(|\\)/g, '') : '';\n this.agent = navigator.userAgent.replace(raw[0], '');\n if (this.platform[1]) this.agent = this.agent.replace(raw[1], '');\n this.agent = this.agent.replace(/ /g, ' ');\n // chrome offscreencanvas gpu memory leak\n /*\n const isChrome = env.agent.match(/Chrome\\/.[0-9]/g);\n const verChrome = isChrome && isChrome[0] ? isChrome[0].split('/')[1] : 0;\n if (verChrome > 92 && verChrome < 96) {\n log('disabling offscreenCanvas due to browser error:', isChrome ? isChrome[0] : 'unknown');\n this.offscreen = false;\n }\n */\n }\n } else if (typeof process !== 'undefined') {\n this.platform = `${process.platform} ${process.arch}`;\n this.agent = `NodeJS ${process.version}`;\n }\n }\n\n /** update backend information */\n async updateBackend() {\n // analyze backends\n this.backends = Object.keys(tf.engine().registryFactory);\n this.wasm.supported = typeof WebAssembly !== 'undefined';\n this.wasm.backend = this.backends.includes('wasm');\n if (this.wasm.supported && this.wasm.backend && tf.getBackend() === 'wasm') {\n this.wasm.simd = await tf.env().getAsync('WASM_HAS_SIMD_SUPPORT');\n this.wasm.multithread = await tf.env().getAsync('WASM_HAS_MULTITHREAD_SUPPORT');\n }\n const c = image.canvas(100, 100);\n const ctx = c ? c.getContext('webgl2') : undefined; // causes too many gl contexts\n // const ctx = typeof tf.backend().getGPGPUContext !== undefined ? tf.backend().getGPGPUContext : null;\n this.webgl.supported = typeof ctx !== 'undefined';\n this.webgl.backend = this.backends.includes('webgl');\n if (this.webgl.supported && this.webgl.backend && (tf.getBackend() === 'webgl' || tf.getBackend() === 'humangl')) {\n // @ts-ignore getGPGPUContext only exists on WebGL backend\n const gl = tf.backend().gpgpu !== 'undefined' ? await tf.backend().getGPGPUContext().gl : null;\n if (gl) {\n this.webgl.version = gl.getParameter(gl.VERSION);\n this.webgl.renderer = gl.getParameter(gl.RENDERER);\n }\n }\n // @ts-ignore navigator.gpu is only defined when webgpu is available in browser\n this.webgpu.supported = this.browser && typeof navigator['gpu'] !== 'undefined';\n this.webgpu.backend = this.backends.includes('webgpu');\n try {\n // @ts-ignore navigator.gpu is only defined when webgpu is available in browser\n if (this.webgpu.supported) this.webgpu.adapter = (await navigator['gpu'].requestAdapter()).name;\n } catch {\n this.webgpu.supported = false;\n }\n try {\n this.kernels = tf.getKernelsForBackend(tf.getBackend()).map((kernel) => kernel.kernelName.toLowerCase());\n } catch { /**/ }\n }\n\n /** update cpu information */\n async updateCPU() {\n const cpu = { model: '', flags: [] };\n if (this.node && this.platform.startsWith('linux')) {\n /*\n // eslint-disable-next-line global-require\n const fs = require('fs');\n try {\n const data = fs.readFileSync('/proc/cpuinfo').toString();\n for (const line of data.split('\\n')) {\n if (line.startsWith('model name')) {\n cpu.model = line.match(/:(.*)/g)[0].replace(':', '').trim();\n }\n if (line.startsWith('flags')) {\n cpu.flags = line.match(/:(.*)/g)[0].replace(':', '').trim().split(' ').sort();\n }\n }\n } catch { }\n */\n }\n if (!this['cpu']) Object.defineProperty(this, 'cpu', { value: cpu });\n else this['cpu'] = cpu;\n }\n}\n\nexport const env = new Env();\n", "import { log, join } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport type { GraphModel } from './types';\nimport type { Config } from '../config';\n\nconst options = {\n cacheModels: false,\n verbose: true,\n debug: false,\n modelBasePath: '',\n};\n\nasync function httpHandler(url, init?): Promise {\n if (options.debug) log('load model fetch:', url, init);\n return fetch(url, init);\n}\n\nexport function setModelLoadOptions(config: Config) {\n options.cacheModels = config.cacheModels;\n options.verbose = config.debug;\n options.modelBasePath = config.modelBasePath;\n}\n\nexport async function loadModel(modelPath: string | undefined): Promise {\n const modelUrl = join(options.modelBasePath, modelPath || '');\n const modelPathSegments = modelUrl.split('/');\n const cachedModelName = 'indexeddb://' + modelPathSegments[modelPathSegments.length - 1].replace('.json', ''); // generate short model name for cache\n const cachedModels = await tf.io.listModels(); // list all models already in cache\n const modelCached = options.cacheModels && Object.keys(cachedModels).includes(cachedModelName); // is model found in cache\n const tfLoadOptions = typeof fetch === 'undefined' ? {} : { fetchFunc: (url, init?) => httpHandler(url, init) };\n const model: GraphModel = new tf.GraphModel(modelCached ? cachedModelName : modelUrl, tfLoadOptions) as unknown as GraphModel; // create model prototype and decide if load from cache or from original modelurl\n try {\n // @ts-ignore private function\n model.findIOHandler(); // decide how to actually load a model\n // @ts-ignore private property\n if (options.debug) log('model load handler:', model.handler);\n // @ts-ignore private property\n const artifacts = await model.handler.load(); // load manifest\n model.loadSync(artifacts); // load weights\n if (options.verbose) log('load model:', model['modelUrl']);\n } catch (err) {\n log('error loading model:', modelUrl, err);\n }\n if (options.cacheModels && !modelCached) { // save model to cache\n try {\n const saveResult = await model.save(cachedModelName);\n log('model saved:', cachedModelName, saveResult);\n } catch (err) {\n log('error saving model:', modelUrl, err);\n }\n }\n return model;\n}\n", "/**\n * GEAR [gender/emotion/age/race] model implementation\n *\n * Based on: [**GEAR Predictor**](https://github.com/Udolf15/GEAR-Predictor)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport type { Gender, Race } from '../result';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport { env } from '../util/env';\n\nexport type GearType = { age: number, gender: Gender, genderScore: number, race: Array<{ score: number, race: Race }> }\nlet model: GraphModel | null;\nconst last: Array = [];\nconst raceNames = ['white', 'black', 'asian', 'indian', 'other'];\nconst ageWeights = [15, 23, 28, 35.5, 45.5, 55.5, 65];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function load(config: Config) {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face['gear']);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise {\n if (!model) return { age: 0, gender: 'unknown', genderScore: 0, race: [] };\n const skipFrame = skipped < (config.face['gear']?.skipFrames || 0);\n const skipTime = (config.face['gear']?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && last[idx]) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n if (!model?.inputs[0].shape) return;\n const t: Record = {};\n // t.resize = tf.image.resizeBilinear(image, [model?.inputs[0].shape[2], model?.inputs[0].shape[1]], false);\n const box = [[0.0, 0.10, 0.90, 0.90]]; // empyrical values for top, left, bottom, right\n t.resize = tf.image.cropAndResize(image, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n const obj: GearType = { age: 0, gender: 'unknown', genderScore: 0, race: [] };\n if (config.face['gear']?.enabled) [t.age, t.gender, t.race] = model.execute(t.resize, ['age_output', 'gender_output', 'race_output']) as Tensor[];\n const gender = await t.gender.data();\n obj.gender = gender[0] > gender[1] ? 'male' : 'female';\n obj.genderScore = Math.round(100 * (gender[0] > gender[1] ? gender[0] : gender[1])) / 100;\n const race = await t.race.data();\n for (let i = 0; i < race.length; i++) {\n if (race[i] > (config.face['gear']?.minConfidence || 0.2)) obj.race.push({ score: Math.round(100 * race[i]) / 100, race: raceNames[i] as Race });\n }\n obj.race.sort((a, b) => b.score - a.score);\n // {0: 'Below20', 1: '21-25', 2: '26-30', 3: '31-40',4: '41-50', 5: '51-60', 6: 'Above60'}\n const ageDistribution = Array.from(await t.age.data());\n const ageSorted = ageDistribution.map((a, i) => [ageWeights[i], a]).sort((a, b) => b[1] - a[1]);\n let age = ageSorted[0][0]; // pick best starting point\n for (let i = 1; i < ageSorted.length; i++) age += ageSorted[i][1] * (ageSorted[i][0] - age); // adjust with each other choice by weight\n obj.age = Math.round(10 * age) / 10;\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n last[idx] = obj;\n lastCount = count;\n lastTime = now();\n resolve(obj);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport type { Tensor } from './types';\n\nexport const constants: Record = {\n tf255: 255,\n tf1: 1,\n tf2: 2,\n tf05: 0.5,\n tf127: 127.5,\n rgb: [0.2989, 0.5870, 0.1140],\n};\n\nexport function init() {\n constants.tf255 = tf.scalar(255, 'float32');\n constants.tf1 = tf.scalar(1, 'float32');\n constants.tf2 = tf.scalar(2, 'float32');\n constants.tf05 = tf.scalar(0.5, 'float32');\n constants.tf127 = tf.scalar(127.5, 'float32');\n constants.rgb = tf.tensor1d([0.2989, 0.5870, 0.1140], 'float32'); // factors for red/green/blue colors when converting to grayscale\n}\n", "/**\n * Age model implementation\n *\n * Based on: [**SSR-Net**](https://github.com/shamangary/SSR-Net)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { env } from '../util/env';\nimport { constants } from '../tfjs/constants';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\n\nlet model: GraphModel | null;\nconst last: Array<{ age: number }> = [];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function load(config: Config) {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face['ssrnet'].modelPathAge);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise<{ age: number }> {\n if (!model) return { age: 0 };\n const skipFrame = skipped < (config.face['ssrnet']?.skipFrames || 0);\n const skipTime = (config.face['ssrnet']?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipFrame && skipTime && (lastCount === count) && last[idx]?.age && (last[idx]?.age > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n if (!model?.inputs || !model.inputs[0] || !model.inputs[0].shape) return;\n const t: Record = {};\n t.resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n t.enhance = tf.mul(t.resize, constants.tf255);\n const obj = { age: 0 };\n if (config.face['ssrnet'].enabled) t.age = model.execute(t.enhance) as Tensor;\n if (t.age) {\n const data = await t.age.data();\n obj.age = Math.trunc(10 * data[0]) / 10;\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n last[idx] = obj;\n lastCount = count;\n lastTime = now();\n resolve(obj);\n });\n}\n", "/**\n * Gender model implementation\n *\n * Based on: [**SSR-Net**](https://github.com/shamangary/SSR-Net)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport type { Gender } from '../result';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nconst last: Array<{ gender: Gender, genderScore: number }> = [];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\n// tuning values\nconst rgb = [0.2989, 0.5870, 0.1140]; // factors for red/green/blue colors when converting to grayscale\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function load(config: Config | any) {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face['ssrnet'].modelPathGender);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function predict(image: Tensor, config: Config, idx, count): Promise<{ gender: Gender, genderScore: number }> {\n if (!model) return { gender: 'unknown', genderScore: 0 };\n const skipFrame = skipped < (config.face['ssrnet']?.skipFrames || 0);\n const skipTime = (config.face['ssrnet']?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipFrame && skipTime && (lastCount === count) && last[idx]?.gender && (last[idx]?.genderScore > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n if (!model?.inputs[0].shape) return;\n const t: Record = {};\n t.resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n t.enhance = tf.tidy(() => {\n const [red, green, blue] = tf.split(t.resize, 3, 3);\n const redNorm = tf.mul(red, rgb[0]);\n const greenNorm = tf.mul(green, rgb[1]);\n const blueNorm = tf.mul(blue, rgb[2]);\n const grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\n const normalize = tf.mul(tf.sub(grayscale, constants.tf05), 2); // range grayscale:-1..1\n return normalize;\n });\n const obj: { gender: Gender, genderScore: number } = { gender: 'unknown', genderScore: 0 };\n if (config.face['ssrnet'].enabled) t.gender = model.execute(t.enhance) as Tensor;\n const data = await t.gender.data();\n obj.gender = data[0] > data[1] ? 'female' : 'male'; // returns two values 0..1, bigger one is prediction\n obj.genderScore = data[0] > data[1] ? (Math.trunc(100 * data[0]) / 100) : (Math.trunc(100 * data[1]) / 100);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n last[idx] = obj;\n lastCount = count;\n lastTime = now();\n resolve(obj);\n });\n}\n", "/**\n * Anti-spoofing model implementation\n */\n\nimport { log, now } from '../util/util';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nconst cached: Array = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\nlet lastCount = 0;\nlet lastTime = 0;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.antispoof?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise {\n if (!model) return 0;\n const skipTime = (config.face.antispoof?.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.face.antispoof?.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && cached[idx]) {\n skipped++;\n return cached[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const resize = tf.image.resizeBilinear(image, [model?.inputs[0].shape ? model.inputs[0].shape[2] : 0, model?.inputs[0].shape ? model.inputs[0].shape[1] : 0], false);\n const res = model?.execute(resize) as Tensor;\n const num = (await res.data())[0];\n cached[idx] = Math.round(100 * num) / 100;\n lastCount = count;\n lastTime = now();\n tf.dispose([resize, res]);\n resolve(cached[idx]);\n });\n}\n", "/**\n * BlazeFace, FaceMesh & Iris model implementation\n * See `facemesh.ts` for entry point\n */\n\nexport const meshAnnotations: Record = {\n silhouette: [\n 10, 338, 297, 332, 284, 251, 389, 356, 454, 323, 361, 288,\n 397, 365, 379, 378, 400, 377, 152, 148, 176, 149, 150, 136,\n 172, 58, 132, 93, 234, 127, 162, 21, 54, 103, 67, 109,\n ],\n lipsUpperOuter: [61, 185, 40, 39, 37, 0, 267, 269, 270, 409, 291],\n lipsLowerOuter: [146, 91, 181, 84, 17, 314, 405, 321, 375, 291],\n lipsUpperInner: [78, 191, 80, 81, 82, 13, 312, 311, 310, 415, 308],\n lipsLowerInner: [78, 95, 88, 178, 87, 14, 317, 402, 318, 324, 308],\n rightEyeUpper0: [246, 161, 160, 159, 158, 157, 173],\n rightEyeLower0: [33, 7, 163, 144, 145, 153, 154, 155, 133],\n rightEyeUpper1: [247, 30, 29, 27, 28, 56, 190],\n rightEyeLower1: [130, 25, 110, 24, 23, 22, 26, 112, 243],\n rightEyeUpper2: [113, 225, 224, 223, 222, 221, 189],\n rightEyeLower2: [226, 31, 228, 229, 230, 231, 232, 233, 244],\n rightEyeLower3: [143, 111, 117, 118, 119, 120, 121, 128, 245],\n rightEyebrowUpper: [156, 70, 63, 105, 66, 107, 55, 193],\n rightEyebrowLower: [35, 124, 46, 53, 52, 65],\n rightEyeIris: [473, 474, 475, 476, 477],\n leftEyeUpper0: [466, 388, 387, 386, 385, 384, 398],\n leftEyeLower0: [263, 249, 390, 373, 374, 380, 381, 382, 362],\n leftEyeUpper1: [467, 260, 259, 257, 258, 286, 414],\n leftEyeLower1: [359, 255, 339, 254, 253, 252, 256, 341, 463],\n leftEyeUpper2: [342, 445, 444, 443, 442, 441, 413],\n leftEyeLower2: [446, 261, 448, 449, 450, 451, 452, 453, 464],\n leftEyeLower3: [372, 340, 346, 347, 348, 349, 350, 357, 465],\n leftEyebrowUpper: [383, 300, 293, 334, 296, 336, 285, 417],\n leftEyebrowLower: [265, 353, 276, 283, 282, 295],\n leftEyeIris: [468, 469, 470, 471, 472],\n midwayBetweenEyes: [168],\n noseTip: [1],\n noseBottom: [2],\n noseRightCorner: [98],\n noseLeftCorner: [327],\n rightCheek: [205],\n leftCheek: [425],\n};\n\nexport const meshLandmarks: Record = {\n count: 468,\n mouth: 13,\n symmetryLine: [13, meshAnnotations['midwayBetweenEyes'][0]],\n};\n\nexport const blazeFaceLandmarks: Record = {\n leftEye: 0,\n rightEye: 1,\n nose: 2,\n mouth: 3,\n leftEar: 4,\n rightEar: 5,\n symmetryLine: [3, 2],\n};\n\nexport const MESH_TO_IRIS_INDICES_MAP: Array<{ key: string, indices: number[] }> = [ // A mapping from facemesh model keypoints to iris model keypoints.\n { key: 'EyeUpper0', indices: [9, 10, 11, 12, 13, 14, 15] },\n { key: 'EyeUpper1', indices: [25, 26, 27, 28, 29, 30, 31] },\n { key: 'EyeUpper2', indices: [41, 42, 43, 44, 45, 46, 47] },\n { key: 'EyeLower0', indices: [0, 1, 2, 3, 4, 5, 6, 7, 8] },\n { key: 'EyeLower1', indices: [16, 17, 18, 19, 20, 21, 22, 23, 24] },\n { key: 'EyeLower2', indices: [32, 33, 34, 35, 36, 37, 38, 39, 40] },\n { key: 'EyeLower3', indices: [54, 55, 56, 57, 58, 59, 60, 61, 62] },\n // { key: 'EyebrowUpper', indices: [63, 64, 65, 66, 67, 68, 69, 70] },\n // { key: 'EyebrowLower', indices: [48, 49, 50, 51, 52, 53] },\n];\n\nexport const UV468: [number, number][] = [\n [0.499976992607117, 0.652534008026123],\n [0.500025987625122, 0.547487020492554],\n [0.499974012374878, 0.602371990680695],\n [0.482113003730774, 0.471979022026062],\n [0.500150978565216, 0.527155995368958],\n [0.499909996986389, 0.498252987861633],\n [0.499523013830185, 0.40106201171875],\n [0.289712011814117, 0.380764007568359],\n [0.499954998493195, 0.312398016452789],\n [0.499987006187439, 0.269918978214264],\n [0.500023007392883, 0.107050001621246],\n [0.500023007392883, 0.666234016418457],\n [0.5000159740448, 0.679224014282227],\n [0.500023007392883, 0.692348003387451],\n [0.499976992607117, 0.695277988910675],\n [0.499976992607117, 0.70593398809433],\n [0.499976992607117, 0.719385027885437],\n [0.499976992607117, 0.737019002437592],\n [0.499967992305756, 0.781370997428894],\n [0.499816000461578, 0.562981009483337],\n [0.473773002624512, 0.573909997940063],\n [0.104906998574734, 0.254140973091125],\n [0.365929991006851, 0.409575998783112],\n [0.338757991790771, 0.41302502155304],\n [0.311120003461838, 0.409460008144379],\n [0.274657994508743, 0.389131009578705],\n [0.393361985683441, 0.403706014156342],\n [0.345234006643295, 0.344011008739471],\n [0.370094001293182, 0.346076011657715],\n [0.319321990013123, 0.347265005111694],\n [0.297903001308441, 0.353591024875641],\n [0.24779200553894, 0.410809993743896],\n [0.396889001131058, 0.842755019664764],\n [0.280097991228104, 0.375599980354309],\n [0.106310002505779, 0.399955987930298],\n [0.2099249958992, 0.391353011131287],\n [0.355807989835739, 0.534406006336212],\n [0.471751004457474, 0.65040397644043],\n [0.474155008792877, 0.680191993713379],\n [0.439785003662109, 0.657229006290436],\n [0.414617002010345, 0.66654098033905],\n [0.450374007225037, 0.680860996246338],\n [0.428770989179611, 0.682690978050232],\n [0.374971002340317, 0.727805018424988],\n [0.486716985702515, 0.547628998756409],\n [0.485300987958908, 0.527395009994507],\n [0.257764995098114, 0.314490020275116],\n [0.401223003864288, 0.455172002315521],\n [0.429818987846375, 0.548614978790283],\n [0.421351999044418, 0.533740997314453],\n [0.276895999908447, 0.532056987285614],\n [0.483370006084442, 0.499586999416351],\n [0.33721199631691, 0.282882988452911],\n [0.296391993761063, 0.293242990970612],\n [0.169294998049736, 0.193813979625702],\n [0.447580009698868, 0.302609980106354],\n [0.392390012741089, 0.353887975215912],\n [0.354490011930466, 0.696784019470215],\n [0.067304998636246, 0.730105042457581],\n [0.442739009857178, 0.572826027870178],\n [0.457098007202148, 0.584792017936707],\n [0.381974011659622, 0.694710969924927],\n [0.392388999462128, 0.694203019142151],\n [0.277076005935669, 0.271932005882263],\n [0.422551989555359, 0.563233017921448],\n [0.385919004678726, 0.281364023685455],\n [0.383103013038635, 0.255840003490448],\n [0.331431001424789, 0.119714021682739],\n [0.229923993349075, 0.232002973556519],\n [0.364500999450684, 0.189113974571228],\n [0.229622006416321, 0.299540996551514],\n [0.173287004232407, 0.278747975826263],\n [0.472878992557526, 0.666198015213013],\n [0.446828007698059, 0.668527007102966],\n [0.422762006521225, 0.673889994621277],\n [0.445307999849319, 0.580065965652466],\n [0.388103008270264, 0.693961024284363],\n [0.403039008378983, 0.706539988517761],\n [0.403629004955292, 0.693953037261963],\n [0.460041999816895, 0.557139039039612],\n [0.431158006191254, 0.692366003990173],\n [0.452181994915009, 0.692366003990173],\n [0.475387006998062, 0.692366003990173],\n [0.465828001499176, 0.779190003871918],\n [0.472328990697861, 0.736225962638855],\n [0.473087012767792, 0.717857003211975],\n [0.473122000694275, 0.704625964164734],\n [0.473033010959625, 0.695277988910675],\n [0.427942007780075, 0.695277988910675],\n [0.426479011774063, 0.703539967536926],\n [0.423162013292313, 0.711845993995667],\n [0.4183090031147, 0.720062971115112],\n [0.390094995498657, 0.639572978019714],\n [0.013953999616206, 0.560034036636353],\n [0.499913990497589, 0.58014702796936],\n [0.413199990987778, 0.69539999961853],\n [0.409626007080078, 0.701822996139526],\n [0.468080013990402, 0.601534962654114],\n [0.422728985548019, 0.585985004901886],\n [0.463079988956451, 0.593783974647522],\n [0.37211999297142, 0.47341400384903],\n [0.334562003612518, 0.496073007583618],\n [0.411671012639999, 0.546965003013611],\n [0.242175996303558, 0.14767599105835],\n [0.290776997804642, 0.201445996761322],\n [0.327338010072708, 0.256527006626129],\n [0.399509996175766, 0.748921036720276],\n [0.441727995872498, 0.261676013469696],\n [0.429764986038208, 0.187834024429321],\n [0.412198007106781, 0.108901023864746],\n [0.288955003023148, 0.398952007293701],\n [0.218936994671822, 0.435410976409912],\n [0.41278201341629, 0.398970007896423],\n [0.257135003805161, 0.355440020561218],\n [0.427684992551804, 0.437960982322693],\n [0.448339998722076, 0.536936044692993],\n [0.178560003638268, 0.45755398273468],\n [0.247308000922203, 0.457193970680237],\n [0.286267012357712, 0.467674970626831],\n [0.332827985286713, 0.460712015628815],\n [0.368755996227264, 0.447206974029541],\n [0.398963987827301, 0.432654976844788],\n [0.476410001516342, 0.405806005001068],\n [0.189241006970406, 0.523923993110657],\n [0.228962004184723, 0.348950982093811],\n [0.490725994110107, 0.562400996685028],\n [0.404670000076294, 0.485132992267609],\n [0.019469000399113, 0.401564002037048],\n [0.426243007183075, 0.420431017875671],\n [0.396993011236191, 0.548797011375427],\n [0.266469985246658, 0.376977026462555],\n [0.439121007919312, 0.51895797252655],\n [0.032313998788595, 0.644356966018677],\n [0.419054001569748, 0.387154996395111],\n [0.462783008813858, 0.505746960639954],\n [0.238978996872902, 0.779744982719421],\n [0.198220998048782, 0.831938028335571],\n [0.107550002634525, 0.540755033493042],\n [0.183610007166862, 0.740257024765015],\n [0.134409993886948, 0.333683013916016],\n [0.385764002799988, 0.883153975009918],\n [0.490967005491257, 0.579378008842468],\n [0.382384985685349, 0.508572995662689],\n [0.174399003386497, 0.397670984268188],\n [0.318785011768341, 0.39623498916626],\n [0.343364000320435, 0.400596976280212],\n [0.396100014448166, 0.710216999053955],\n [0.187885001301765, 0.588537991046906],\n [0.430987000465393, 0.944064974784851],\n [0.318993002176285, 0.898285031318665],\n [0.266247987747192, 0.869701027870178],\n [0.500023007392883, 0.190576016902924],\n [0.499976992607117, 0.954452991485596],\n [0.366169989109039, 0.398822009563446],\n [0.393207013607025, 0.39553701877594],\n [0.410373002290726, 0.391080021858215],\n [0.194993004202843, 0.342101991176605],\n [0.388664990663528, 0.362284004688263],\n [0.365961998701096, 0.355970978736877],\n [0.343364000320435, 0.355356991291046],\n [0.318785011768341, 0.35834002494812],\n [0.301414996385574, 0.363156020641327],\n [0.058132998645306, 0.319076001644135],\n [0.301414996385574, 0.387449026107788],\n [0.499987989664078, 0.618434011936188],\n [0.415838003158569, 0.624195992946625],\n [0.445681989192963, 0.566076993942261],\n [0.465844005346298, 0.620640993118286],\n [0.49992299079895, 0.351523995399475],\n [0.288718998432159, 0.819945991039276],\n [0.335278987884521, 0.852819979190826],\n [0.440512001514435, 0.902418971061707],\n [0.128294005990028, 0.791940987110138],\n [0.408771991729736, 0.373893976211548],\n [0.455606997013092, 0.451801002025604],\n [0.499877005815506, 0.908990025520325],\n [0.375436991453171, 0.924192011356354],\n [0.11421000212431, 0.615022003650665],\n [0.448662012815475, 0.695277988910675],\n [0.4480200111866, 0.704632043838501],\n [0.447111994028091, 0.715808033943176],\n [0.444831997156143, 0.730794012546539],\n [0.430011987686157, 0.766808986663818],\n [0.406787008047104, 0.685672998428345],\n [0.400738000869751, 0.681069016456604],\n [0.392399996519089, 0.677703022956848],\n [0.367855995893478, 0.663918972015381],\n [0.247923001646996, 0.601333022117615],\n [0.452769994735718, 0.420849978923798],\n [0.43639200925827, 0.359887003898621],\n [0.416164010763168, 0.368713974952698],\n [0.413385987281799, 0.692366003990173],\n [0.228018000721931, 0.683571994304657],\n [0.468268007040024, 0.352671027183533],\n [0.411361992359161, 0.804327011108398],\n [0.499989002943039, 0.469825029373169],\n [0.479153990745544, 0.442654013633728],\n [0.499974012374878, 0.439637005329132],\n [0.432112008333206, 0.493588984012604],\n [0.499886006116867, 0.866917014122009],\n [0.49991300702095, 0.821729004383087],\n [0.456548988819122, 0.819200992584229],\n [0.344549000263214, 0.745438992977142],\n [0.37890899181366, 0.574010014533997],\n [0.374292999505997, 0.780184984207153],\n [0.319687992334366, 0.570737957954407],\n [0.357154995203018, 0.604269981384277],\n [0.295284003019333, 0.621580958366394],\n [0.447750002145767, 0.862477004528046],\n [0.410986006259918, 0.508723020553589],\n [0.31395098567009, 0.775308012962341],\n [0.354128003120422, 0.812552988529205],\n [0.324548006057739, 0.703992962837219],\n [0.189096003770828, 0.646299958229065],\n [0.279776990413666, 0.71465802192688],\n [0.1338230073452, 0.682700991630554],\n [0.336768001317978, 0.644733011722565],\n [0.429883986711502, 0.466521978378296],\n [0.455527991056442, 0.548622965812683],\n [0.437114000320435, 0.558896005153656],\n [0.467287987470627, 0.529924988746643],\n [0.414712011814117, 0.335219979286194],\n [0.37704598903656, 0.322777986526489],\n [0.344107985496521, 0.320150971412659],\n [0.312875986099243, 0.32233202457428],\n [0.283526003360748, 0.333190023899078],\n [0.241245999932289, 0.382785975933075],\n [0.102986000478268, 0.468762993812561],\n [0.267612010240555, 0.424560010433197],\n [0.297879010438919, 0.433175981044769],\n [0.333433985710144, 0.433878004550934],\n [0.366427004337311, 0.426115989685059],\n [0.396012008190155, 0.416696012020111],\n [0.420121014118195, 0.41022801399231],\n [0.007561000064015, 0.480777025222778],\n [0.432949006557465, 0.569517970085144],\n [0.458638995885849, 0.479089021682739],\n [0.473466008901596, 0.545744001865387],\n [0.476087987422943, 0.563830018043518],\n [0.468472003936768, 0.555056989192963],\n [0.433990985155106, 0.582361996173859],\n [0.483518004417419, 0.562983989715576],\n [0.482482999563217, 0.57784903049469],\n [0.42645001411438, 0.389798998832703],\n [0.438998997211456, 0.39649498462677],\n [0.450067013502121, 0.400434017181396],\n [0.289712011814117, 0.368252992630005],\n [0.276670008897781, 0.363372981548309],\n [0.517862021923065, 0.471948027610779],\n [0.710287988185883, 0.380764007568359],\n [0.526226997375488, 0.573909997940063],\n [0.895093023777008, 0.254140973091125],\n [0.634069979190826, 0.409575998783112],\n [0.661242008209229, 0.41302502155304],\n [0.688880026340485, 0.409460008144379],\n [0.725341975688934, 0.389131009578705],\n [0.606630027294159, 0.40370500087738],\n [0.654766023159027, 0.344011008739471],\n [0.629905998706818, 0.346076011657715],\n [0.680678009986877, 0.347265005111694],\n [0.702096998691559, 0.353591024875641],\n [0.75221198797226, 0.410804986953735],\n [0.602918028831482, 0.842862963676453],\n [0.719901978969574, 0.375599980354309],\n [0.893692970275879, 0.399959981441498],\n [0.790081977844238, 0.391354024410248],\n [0.643998026847839, 0.534487962722778],\n [0.528249025344849, 0.65040397644043],\n [0.525849997997284, 0.680191040039062],\n [0.560214996337891, 0.657229006290436],\n [0.585384011268616, 0.66654098033905],\n [0.549625992774963, 0.680860996246338],\n [0.57122802734375, 0.682691991329193],\n [0.624852001667023, 0.72809898853302],\n [0.513050019741058, 0.547281980514526],\n [0.51509702205658, 0.527251958847046],\n [0.742246985435486, 0.314507007598877],\n [0.598631024360657, 0.454979002475739],\n [0.570338010787964, 0.548575043678284],\n [0.578631997108459, 0.533622980117798],\n [0.723087012767792, 0.532054007053375],\n [0.516445994377136, 0.499638974666595],\n [0.662801027297974, 0.282917976379395],\n [0.70362401008606, 0.293271005153656],\n [0.830704987049103, 0.193813979625702],\n [0.552385985851288, 0.302568018436432],\n [0.607609987258911, 0.353887975215912],\n [0.645429015159607, 0.696707010269165],\n [0.932694971561432, 0.730105042457581],\n [0.557260990142822, 0.572826027870178],\n [0.542901992797852, 0.584792017936707],\n [0.6180260181427, 0.694710969924927],\n [0.607590973377228, 0.694203019142151],\n [0.722943007946014, 0.271963000297546],\n [0.577413976192474, 0.563166975975037],\n [0.614082992076874, 0.281386971473694],\n [0.616907000541687, 0.255886018276215],\n [0.668509006500244, 0.119913995265961],\n [0.770092010498047, 0.232020974159241],\n [0.635536015033722, 0.189248979091644],\n [0.77039098739624, 0.299556016921997],\n [0.826722025871277, 0.278755009174347],\n [0.527121007442474, 0.666198015213013],\n [0.553171992301941, 0.668527007102966],\n [0.577238023281097, 0.673889994621277],\n [0.554691970348358, 0.580065965652466],\n [0.611896991729736, 0.693961024284363],\n [0.59696102142334, 0.706539988517761],\n [0.596370995044708, 0.693953037261963],\n [0.539958000183105, 0.557139039039612],\n [0.568841993808746, 0.692366003990173],\n [0.547818005084991, 0.692366003990173],\n [0.52461302280426, 0.692366003990173],\n [0.534089982509613, 0.779141008853912],\n [0.527670979499817, 0.736225962638855],\n [0.526912987232208, 0.717857003211975],\n [0.526877999305725, 0.704625964164734],\n [0.526966989040375, 0.695277988910675],\n [0.572058022022247, 0.695277988910675],\n [0.573521018028259, 0.703539967536926],\n [0.57683801651001, 0.711845993995667],\n [0.581691026687622, 0.720062971115112],\n [0.609944999217987, 0.639909982681274],\n [0.986046016216278, 0.560034036636353],\n [0.5867999792099, 0.69539999961853],\n [0.590372025966644, 0.701822996139526],\n [0.531915009021759, 0.601536989212036],\n [0.577268004417419, 0.585934996604919],\n [0.536915004253387, 0.593786001205444],\n [0.627542972564697, 0.473352015018463],\n [0.665585994720459, 0.495950996875763],\n [0.588353991508484, 0.546862006187439],\n [0.757824003696442, 0.14767599105835],\n [0.709249973297119, 0.201507985591888],\n [0.672684013843536, 0.256581008434296],\n [0.600408971309662, 0.74900496006012],\n [0.55826598405838, 0.261672019958496],\n [0.570303976535797, 0.187870979309082],\n [0.588165998458862, 0.109044015407562],\n [0.711045026779175, 0.398952007293701],\n [0.781069993972778, 0.435405015945435],\n [0.587247014045715, 0.398931980133057],\n [0.742869973182678, 0.355445981025696],\n [0.572156012058258, 0.437651991844177],\n [0.55186802148819, 0.536570012569427],\n [0.821442008018494, 0.457556009292603],\n [0.752701997756958, 0.457181990146637],\n [0.71375697851181, 0.467626988887787],\n [0.66711300611496, 0.460672974586487],\n [0.631101012229919, 0.447153985500336],\n [0.6008620262146, 0.432473003864288],\n [0.523481011390686, 0.405627012252808],\n [0.810747981071472, 0.523926019668579],\n [0.771045982837677, 0.348959028720856],\n [0.509127020835876, 0.562718033790588],\n [0.595292985439301, 0.485023975372314],\n [0.980530977249146, 0.401564002037048],\n [0.573499977588654, 0.420000016689301],\n [0.602994978427887, 0.548687994480133],\n [0.733529984951019, 0.376977026462555],\n [0.560611009597778, 0.519016981124878],\n [0.967685997486115, 0.644356966018677],\n [0.580985009670258, 0.387160003185272],\n [0.537728011608124, 0.505385041236877],\n [0.760966002941132, 0.779752969741821],\n [0.801778972148895, 0.831938028335571],\n [0.892440974712372, 0.54076099395752],\n [0.816350996494293, 0.740260004997253],\n [0.865594983100891, 0.333687007427216],\n [0.614073991775513, 0.883246004581451],\n [0.508952975273132, 0.579437971115112],\n [0.617941975593567, 0.508316040039062],\n [0.825608015060425, 0.397674977779388],\n [0.681214988231659, 0.39623498916626],\n [0.656635999679565, 0.400596976280212],\n [0.603900015354156, 0.710216999053955],\n [0.81208598613739, 0.588539004325867],\n [0.56801301240921, 0.944564998149872],\n [0.681007981300354, 0.898285031318665],\n [0.733752012252808, 0.869701027870178],\n [0.633830010890961, 0.398822009563446],\n [0.606792986392975, 0.39553701877594],\n [0.589659988880157, 0.391062021255493],\n [0.805015981197357, 0.342108011245728],\n [0.611334979534149, 0.362284004688263],\n [0.634037971496582, 0.355970978736877],\n [0.656635999679565, 0.355356991291046],\n [0.681214988231659, 0.35834002494812],\n [0.698584973812103, 0.363156020641327],\n [0.941866993904114, 0.319076001644135],\n [0.698584973812103, 0.387449026107788],\n [0.584177017211914, 0.624107003211975],\n [0.554318010807037, 0.566076993942261],\n [0.534153997898102, 0.62064003944397],\n [0.711217999458313, 0.819975018501282],\n [0.664629995822906, 0.852871000766754],\n [0.559099972248077, 0.902631998062134],\n [0.871706008911133, 0.791940987110138],\n [0.591234028339386, 0.373893976211548],\n [0.544341027736664, 0.451583981513977],\n [0.624562978744507, 0.924192011356354],\n [0.88577002286911, 0.615028977394104],\n [0.551338016986847, 0.695277988910675],\n [0.551980018615723, 0.704632043838501],\n [0.552887976169586, 0.715808033943176],\n [0.555167973041534, 0.730794012546539],\n [0.569944024085999, 0.767035007476807],\n [0.593203008174896, 0.685675978660583],\n [0.599261999130249, 0.681069016456604],\n [0.607599973678589, 0.677703022956848],\n [0.631937980651855, 0.663500010967255],\n [0.752032995223999, 0.601315021514893],\n [0.547226011753082, 0.420395016670227],\n [0.563543975353241, 0.359827995300293],\n [0.583841025829315, 0.368713974952698],\n [0.586614012718201, 0.692366003990173],\n [0.771915018558502, 0.683578014373779],\n [0.531597018241882, 0.352482974529266],\n [0.588370978832245, 0.804440975189209],\n [0.52079701423645, 0.442565023899078],\n [0.567984998226166, 0.493479013442993],\n [0.543282985687256, 0.819254994392395],\n [0.655317008495331, 0.745514988899231],\n [0.621008992195129, 0.574018001556396],\n [0.625559985637665, 0.78031200170517],\n [0.680198013782501, 0.570719003677368],\n [0.64276397228241, 0.604337990283966],\n [0.704662978649139, 0.621529996395111],\n [0.552012026309967, 0.862591981887817],\n [0.589071989059448, 0.508637011051178],\n [0.685944974422455, 0.775357007980347],\n [0.645735025405884, 0.812640011310577],\n [0.675342977046967, 0.703978002071381],\n [0.810858011245728, 0.646304965019226],\n [0.72012197971344, 0.714666962623596],\n [0.866151988506317, 0.682704985141754],\n [0.663187026977539, 0.644596993923187],\n [0.570082008838654, 0.466325998306274],\n [0.544561982154846, 0.548375964164734],\n [0.562758982181549, 0.558784961700439],\n [0.531987011432648, 0.530140042304993],\n [0.585271000862122, 0.335177004337311],\n [0.622952997684479, 0.32277899980545],\n [0.655896008014679, 0.320163011550903],\n [0.687132000923157, 0.322345972061157],\n [0.716481983661652, 0.333200991153717],\n [0.758756995201111, 0.382786989212036],\n [0.897013008594513, 0.468769013881683],\n [0.732392013072968, 0.424547016620636],\n [0.70211398601532, 0.433162987232208],\n [0.66652500629425, 0.433866024017334],\n [0.633504986763, 0.426087975502014],\n [0.603875994682312, 0.416586995124817],\n [0.579657971858978, 0.409945011138916],\n [0.992439985275269, 0.480777025222778],\n [0.567192018032074, 0.569419980049133],\n [0.54136598110199, 0.478899002075195],\n [0.526564002037048, 0.546118021011353],\n [0.523913025856018, 0.563830018043518],\n [0.531529009342194, 0.555056989192963],\n [0.566035985946655, 0.582329034805298],\n [0.51631098985672, 0.563053965568542],\n [0.5174720287323, 0.577877044677734],\n [0.573594987392426, 0.389806985855103],\n [0.560697972774506, 0.395331978797913],\n [0.549755990505219, 0.399751007556915],\n [0.710287988185883, 0.368252992630005],\n [0.723330020904541, 0.363372981548309],\n];\n\nexport const TRI468: Array = [\n 127, 34, 139, 11, 0, 37, 232, 231, 120, 72, 37, 39, 128, 121, 47, 232, 121, 128, 104, 69, 67, 175, 171, 148, 157, 154, 155, 118, 50, 101, 73, 39, 40, 9,\n 151, 108, 48, 115, 131, 194, 204, 211, 74, 40, 185, 80, 42, 183, 40, 92, 186, 230, 229, 118, 202, 212, 214, 83, 18, 17, 76, 61, 146, 160, 29, 30, 56,\n 157, 173, 106, 204, 194, 135, 214, 192, 203, 165, 98, 21, 71, 68, 51, 45, 4, 144, 24, 23, 77, 146, 91, 205, 50, 187, 201, 200, 18, 91, 106, 182, 90, 91,\n 181, 85, 84, 17, 206, 203, 36, 148, 171, 140, 92, 40, 39, 193, 189, 244, 159, 158, 28, 247, 246, 161, 236, 3, 196, 54, 68, 104, 193, 168, 8, 117,\n 228, 31, 189, 193, 55, 98, 97, 99, 126, 47, 100, 166, 79, 218, 155, 154, 26, 209, 49, 131, 135, 136, 150, 47, 126, 217, 223, 52, 53, 45, 51, 134, 211,\n 170, 140, 67, 69, 108, 43, 106, 91, 230, 119, 120, 226, 130, 247, 63, 53, 52, 238, 20, 242, 46, 70, 156, 78, 62, 96, 46, 53, 63, 143, 34, 227, 173,\n 155, 133, 123, 117, 111, 44, 125, 19, 236, 134, 51, 216, 206, 205, 154, 153, 22, 39, 37, 167, 200, 201, 208, 36, 142, 100, 57, 212, 202, 20, 60, 99, 28,\n 158, 157, 35, 226, 113, 160, 159, 27, 204, 202, 210, 113, 225, 46, 43, 202, 204, 62, 76, 77, 137, 123, 116, 41, 38, 72, 203, 129, 142, 64, 98, 240, 49,\n 102, 64, 41, 73, 74, 212, 216, 207, 42, 74, 184, 169, 170, 211, 170, 149, 176, 105, 66, 69, 122, 6, 168, 123, 147, 187, 96, 77, 90, 65, 55, 107, 89,\n 90, 180, 101, 100, 120, 63, 105, 104, 93, 137, 227, 15, 86, 85, 129, 102, 49, 14, 87, 86, 55, 8, 9, 100, 47, 121, 145, 23, 22, 88, 89, 179, 6, 122,\n 196, 88, 95, 96, 138, 172, 136, 215, 58, 172, 115, 48, 219, 42, 80, 81, 195, 3, 51, 43, 146, 61, 171, 175, 199, 81, 82, 38, 53, 46, 225, 144, 163, 110,\n 246, 33, 7, 52, 65, 66, 229, 228, 117, 34, 127, 234, 107, 108, 69, 109, 108, 151, 48, 64, 235, 62, 78, 191, 129, 209, 126, 111, 35, 143, 163, 161, 246,\n 117, 123, 50, 222, 65, 52, 19, 125, 141, 221, 55, 65, 3, 195, 197, 25, 7, 33, 220, 237, 44, 70, 71, 139, 122, 193, 245, 247, 130, 33, 71, 21, 162,\n 153, 158, 159, 170, 169, 150, 188, 174, 196, 216, 186, 92, 144, 160, 161, 2, 97, 167, 141, 125, 241, 164, 167, 37, 72, 38, 12, 145, 159, 160, 38, 82, 13,\n 63, 68, 71, 226, 35, 111, 158, 153, 154, 101, 50, 205, 206, 92, 165, 209, 198, 217, 165, 167, 97, 220, 115, 218, 133, 112, 243, 239, 238, 241, 214,\n 135, 169, 190, 173, 133, 171, 208, 32, 125, 44, 237, 86, 87, 178, 85, 86, 179, 84, 85, 180, 83, 84, 181, 201, 83, 182, 137, 93, 132, 76, 62, 183, 61,\n 76, 184, 57, 61, 185, 212, 57, 186, 214, 207, 187, 34, 143, 156, 79, 239, 237, 123, 137, 177, 44, 1, 4, 201, 194, 32, 64, 102, 129, 213, 215, 138, 59,\n 166, 219, 242, 99, 97, 2, 94, 141, 75, 59, 235, 24, 110, 228, 25, 130, 226, 23, 24, 229, 22, 23, 230, 26, 22, 231, 112, 26, 232, 189, 190, 243, 221, 56,\n 190, 28, 56, 221, 27, 28, 222, 29, 27, 223, 30, 29, 224, 247, 30, 225, 238, 79, 20, 166, 59, 75, 60, 75, 240, 147, 177, 215, 20, 79, 166, 187, 147, 213,\n 112, 233, 244, 233, 128, 245, 128, 114, 188, 114, 217, 174, 131, 115, 220, 217, 198, 236, 198, 131, 134, 177, 132, 58, 143, 35, 124, 110, 163, 7, 228,\n 110, 25, 356, 389, 368, 11, 302, 267, 452, 350, 349, 302, 303, 269, 357, 343, 277, 452, 453, 357, 333, 332, 297, 175, 152, 377, 384, 398, 382, 347,\n 348, 330, 303, 304, 270, 9, 336, 337, 278, 279, 360, 418, 262, 431, 304, 408, 409, 310, 415, 407, 270, 409, 410, 450, 348, 347, 422, 430, 434, 313,\n 314, 17, 306, 307, 375, 387, 388, 260, 286, 414, 398, 335, 406, 418, 364, 367, 416, 423, 358, 327, 251, 284, 298, 281, 5, 4, 373, 374, 253, 307, 320,\n 321, 425, 427, 411, 421, 313, 18, 321, 405, 406, 320, 404, 405, 315, 16, 17, 426, 425, 266, 377, 400, 369, 322, 391, 269, 417, 465, 464, 386, 257, 258,\n 466, 260, 388, 456, 399, 419, 284, 332, 333, 417, 285, 8, 346, 340, 261, 413, 441, 285, 327, 460, 328, 355, 371, 329, 392, 439, 438, 382, 341, 256,\n 429, 420, 360, 364, 394, 379, 277, 343, 437, 443, 444, 283, 275, 440, 363, 431, 262, 369, 297, 338, 337, 273, 375, 321, 450, 451, 349, 446, 342, 467,\n 293, 334, 282, 458, 461, 462, 276, 353, 383, 308, 324, 325, 276, 300, 293, 372, 345, 447, 382, 398, 362, 352, 345, 340, 274, 1, 19, 456, 248, 281, 436,\n 427, 425, 381, 256, 252, 269, 391, 393, 200, 199, 428, 266, 330, 329, 287, 273, 422, 250, 462, 328, 258, 286, 384, 265, 353, 342, 387, 259, 257, 424,\n 431, 430, 342, 353, 276, 273, 335, 424, 292, 325, 307, 366, 447, 345, 271, 303, 302, 423, 266, 371, 294, 455, 460, 279, 278, 294, 271, 272, 304, 432,\n 434, 427, 272, 407, 408, 394, 430, 431, 395, 369, 400, 334, 333, 299, 351, 417, 168, 352, 280, 411, 325, 319, 320, 295, 296, 336, 319, 403, 404, 330,\n 348, 349, 293, 298, 333, 323, 454, 447, 15, 16, 315, 358, 429, 279, 14, 15, 316, 285, 336, 9, 329, 349, 350, 374, 380, 252, 318, 402, 403, 6, 197, 419,\n 318, 319, 325, 367, 364, 365, 435, 367, 397, 344, 438, 439, 272, 271, 311, 195, 5, 281, 273, 287, 291, 396, 428, 199, 311, 271, 268, 283, 444, 445,\n 373, 254, 339, 263, 466, 249, 282, 334, 296, 449, 347, 346, 264, 447, 454, 336, 296, 299, 338, 10, 151, 278, 439, 455, 292, 407, 415, 358, 371, 355,\n 340, 345, 372, 390, 249, 466, 346, 347, 280, 442, 443, 282, 19, 94, 370, 441, 442, 295, 248, 419, 197, 263, 255, 359, 440, 275, 274, 300, 383, 368,\n 351, 412, 465, 263, 467, 466, 301, 368, 389, 380, 374, 386, 395, 378, 379, 412, 351, 419, 436, 426, 322, 373, 390, 388, 2, 164, 393, 370, 462, 461,\n 164, 0, 267, 302, 11, 12, 374, 373, 387, 268, 12, 13, 293, 300, 301, 446, 261, 340, 385, 384, 381, 330, 266, 425, 426, 423, 391, 429, 355, 437, 391,\n 327, 326, 440, 457, 438, 341, 382, 362, 459, 457, 461, 434, 430, 394, 414, 463, 362, 396, 369, 262, 354, 461, 457, 316, 403, 402, 315, 404, 403, 314,\n 405, 404, 313, 406, 405, 421, 418, 406, 366, 401, 361, 306, 408, 407, 291, 409, 408, 287, 410, 409, 432, 436, 410, 434, 416, 411, 264, 368, 383, 309,\n 438, 457, 352, 376, 401, 274, 275, 4, 421, 428, 262, 294, 327, 358, 433, 416, 367, 289, 455, 439, 462, 370, 326, 2, 326, 370, 305, 460, 455, 254,\n 449, 448, 255, 261, 446, 253, 450, 449, 252, 451, 450, 256, 452, 451, 341, 453, 452, 413, 464, 463, 441, 413, 414, 258, 442, 441, 257, 443, 442, 259,\n 444, 443, 260, 445, 444, 467, 342, 445, 459, 458, 250, 289, 392, 290, 290, 328, 460, 376, 433, 435, 250, 290, 392, 411, 416, 433, 341, 463, 464, 453,\n 464, 465, 357, 465, 412, 343, 412, 399, 360, 363, 440, 437, 399, 456, 420, 456, 363, 401, 435, 288, 372, 383, 353, 339, 255, 249, 448, 261, 255, 133,\n 243, 190, 133, 155, 112, 33, 246, 247, 33, 130, 25, 398, 384, 286, 362, 398, 414, 362, 463, 341, 263, 359, 467, 263, 249, 255, 466, 467, 260, 75, 60,\n 166, 238, 239, 79, 162, 127, 139, 72, 11, 37, 121, 232, 120, 73, 72, 39, 114, 128, 47, 233, 232, 128, 103, 104, 67, 152, 175, 148, 173, 157, 155,\n 119, 118, 101, 74, 73, 40, 107, 9, 108, 49, 48, 131, 32, 194, 211, 184, 74, 185, 191, 80, 183, 185, 40, 186, 119, 230, 118, 210, 202, 214, 84, 83, 17,\n 77, 76, 146, 161, 160, 30, 190, 56, 173, 182, 106, 194, 138, 135, 192, 129, 203, 98, 54, 21, 68, 5, 51, 4, 145, 144, 23, 90, 77, 91, 207, 205, 187, 83,\n 201, 18, 181, 91, 182, 180, 90, 181, 16, 85, 17, 205, 206, 36, 176, 148, 140, 165, 92, 39, 245, 193, 244, 27, 159, 28, 30, 247, 161, 174, 236, 196,\n 103, 54, 104, 55, 193, 8, 111, 117, 31, 221, 189, 55, 240, 98, 99, 142, 126, 100, 219, 166, 218, 112, 155, 26, 198, 209, 131, 169, 135, 150, 114, 47,\n 217, 224, 223, 53, 220, 45, 134, 32, 211, 140, 109, 67, 108, 146, 43, 91, 231, 230, 120, 113, 226, 247, 105, 63, 52, 241, 238, 242, 124, 46, 156, 95,\n 78, 96, 70, 46, 63, 116, 143, 227, 116, 123, 111, 1, 44, 19, 3, 236, 51, 207, 216, 205, 26, 154, 22, 165, 39, 167, 199, 200, 208, 101, 36, 100, 43,\n 57, 202, 242, 20, 99, 56, 28, 157, 124, 35, 113, 29, 160, 27, 211, 204, 210, 124, 113, 46, 106, 43, 204, 96, 62, 77, 227, 137, 116, 73, 41, 72, 36, 203,\n 142, 235, 64, 240, 48, 49, 64, 42, 41, 74, 214, 212, 207, 183, 42, 184, 210, 169, 211, 140, 170, 176, 104, 105, 69, 193, 122, 168, 50, 123, 187, 89, 96,\n 90, 66, 65, 107, 179, 89, 180, 119, 101, 120, 68, 63, 104, 234, 93, 227, 16, 15, 85, 209, 129, 49, 15, 14, 86, 107, 55, 9, 120, 100, 121, 153, 145, 22,\n 178, 88, 179, 197, 6, 196, 89, 88, 96, 135, 138, 136, 138, 215, 172, 218, 115, 219, 41, 42, 81, 5, 195, 51, 57, 43, 61, 208, 171, 199, 41, 81, 38,\n 224, 53, 225, 24, 144, 110, 105, 52, 66, 118, 229, 117, 227, 34, 234, 66, 107, 69, 10, 109, 151, 219, 48, 235, 183, 62, 191, 142, 129, 126, 116, 111,\n 143, 7, 163, 246, 118, 117, 50, 223, 222, 52, 94, 19, 141, 222, 221, 65, 196, 3, 197, 45, 220, 44, 156, 70, 139, 188, 122, 245, 139, 71, 162, 145,\n 153, 159, 149, 170, 150, 122, 188, 196, 206, 216, 92, 163, 144, 161, 164, 2, 167, 242, 141, 241, 0, 164, 37, 11, 72, 12, 144, 145, 160, 12, 38, 13, 70,\n 63, 71, 31, 226, 111, 157, 158, 154, 36, 101, 205, 203, 206, 165, 126, 209, 217, 98, 165, 97, 237, 220, 218, 237, 239, 241, 210, 214, 169, 140, 171, 32,\n 241, 125, 237, 179, 86, 178, 180, 85, 179, 181, 84, 180, 182, 83, 181, 194, 201, 182, 177, 137, 132, 184, 76, 183, 185, 61, 184, 186, 57, 185, 216, 212,\n 186, 192, 214, 187, 139, 34, 156, 218, 79, 237, 147, 123, 177, 45, 44, 4, 208, 201, 32, 98, 64, 129, 192, 213, 138, 235, 59, 219, 141, 242, 97, 97, 2,\n 141, 240, 75, 235, 229, 24, 228, 31, 25, 226, 230, 23, 229, 231, 22, 230, 232, 26, 231, 233, 112, 232, 244, 189, 243, 189, 221, 190, 222, 28, 221,\n 223, 27, 222, 224, 29, 223, 225, 30, 224, 113, 247, 225, 99, 60, 240, 213, 147, 215, 60, 20, 166, 192, 187, 213, 243, 112, 244, 244, 233, 245, 245,\n 128, 188, 188, 114, 174, 134, 131, 220, 174, 217, 236, 236, 198, 134, 215, 177, 58, 156, 143, 124, 25, 110, 7, 31, 228, 25, 264, 356, 368, 0, 11, 267,\n 451, 452, 349, 267, 302, 269, 350, 357, 277, 350, 452, 357, 299, 333, 297, 396, 175, 377, 381, 384, 382, 280, 347, 330, 269, 303, 270, 151, 9, 337,\n 344, 278, 360, 424, 418, 431, 270, 304, 409, 272, 310, 407, 322, 270, 410, 449, 450, 347, 432, 422, 434, 18, 313, 17, 291, 306, 375, 259, 387, 260,\n 424, 335, 418, 434, 364, 416, 391, 423, 327, 301, 251, 298, 275, 281, 4, 254, 373, 253, 375, 307, 321, 280, 425, 411, 200, 421, 18, 335, 321, 406,\n 321, 320, 405, 314, 315, 17, 423, 426, 266, 396, 377, 369, 270, 322, 269, 413, 417, 464, 385, 386, 258, 248, 456, 419, 298, 284, 333, 168, 417, 8,\n 448, 346, 261, 417, 413, 285, 326, 327, 328, 277, 355, 329, 309, 392, 438, 381, 382, 256, 279, 429, 360, 365, 364, 379, 355, 277, 437, 282, 443, 283,\n 281, 275, 363, 395, 431, 369, 299, 297, 337, 335, 273, 321, 348, 450, 349, 359, 446, 467, 283, 293, 282, 250, 458, 462, 300, 276, 383, 292, 308, 325,\n 283, 276, 293, 264, 372, 447, 346, 352, 340, 354, 274, 19, 363, 456, 281, 426, 436, 425, 380, 381, 252, 267, 269, 393, 421, 200, 428, 371, 266, 329,\n 432, 287, 422, 290, 250, 328, 385, 258, 384, 446, 265, 342, 386, 387, 257, 422, 424, 430, 445, 342, 276, 422, 273, 424, 306, 292, 307, 352, 366, 345,\n 268, 271, 302, 358, 423, 371, 327, 294, 460, 331, 279, 294, 303, 271, 304, 436, 432, 427, 304, 272, 408, 395, 394, 431, 378, 395, 400, 296, 334, 299,\n 6, 351, 168, 376, 352, 411, 307, 325, 320, 285, 295, 336, 320, 319, 404, 329, 330, 349, 334, 293, 333, 366, 323, 447, 316, 15, 315, 331, 358, 279,\n 317, 14, 316, 8, 285, 9, 277, 329, 350, 253, 374, 252, 319, 318, 403, 351, 6, 419, 324, 318, 325, 397, 367, 365, 288, 435, 397, 278, 344, 439, 310,\n 272, 311, 248, 195, 281, 375, 273, 291, 175, 396, 199, 312, 311, 268, 276, 283, 445, 390, 373, 339, 295, 282, 296, 448, 449, 346, 356, 264, 454, 337,\n 336, 299, 337, 338, 151, 294, 278, 455, 308, 292, 415, 429, 358, 355, 265, 340, 372, 388, 390, 466, 352, 346, 280, 295, 442, 282, 354, 19, 370, 285,\n 441, 295, 195, 248, 197, 457, 440, 274, 301, 300, 368, 417, 351, 465, 251, 301, 389, 385, 380, 386, 394, 395, 379, 399, 412, 419, 410, 436, 322, 387,\n 373, 388, 326, 2, 393, 354, 370, 461, 393, 164, 267, 268, 302, 12, 386, 374, 387, 312, 268, 13, 298, 293, 301, 265, 446, 340, 380, 385, 381, 280, 330,\n 425, 322, 426, 391, 420, 429, 437, 393, 391, 326, 344, 440, 438, 458, 459, 461, 364, 434, 394, 428, 396, 262, 274, 354, 457, 317, 316, 402, 316, 315,\n 403, 315, 314, 404, 314, 313, 405, 313, 421, 406, 323, 366, 361, 292, 306, 407, 306, 291, 408, 291, 287, 409, 287, 432, 410, 427, 434, 411, 372, 264,\n 383, 459, 309, 457, 366, 352, 401, 1, 274, 4, 418, 421, 262, 331, 294, 358, 435, 433, 367, 392, 289, 439, 328, 462, 326, 94, 2, 370, 289, 305, 455, 339,\n 254, 448, 359, 255, 446, 254, 253, 449, 253, 252, 450, 252, 256, 451, 256, 341, 452, 414, 413, 463, 286, 441, 414, 286, 258, 441, 258, 257, 442, 257,\n 259, 443, 259, 260, 444, 260, 467, 445, 309, 459, 250, 305, 289, 290, 305, 290, 460, 401, 376, 435, 309, 250, 392, 376, 411, 433, 453, 341, 464, 357,\n 453, 465, 343, 357, 412, 437, 343, 399, 344, 360, 440, 420, 437, 456, 360, 420, 363, 361, 401, 288, 265, 372, 353, 390, 339, 249, 339, 448, 255];\n\nexport const TRI68: Array = [0, 1, 36, 0, 36, 17, 1, 2, 41, 1, 41, 36, 2, 3, 31, 2, 31, 41, 3, 4, 48, 3, 48, 31, 4, 5, 48, 5, 6, 48, 6, 7, 59, 6, 59, 48, 7, 8, 58, 7, 58, 59,\n 8, 9, 56, 8, 56, 57, 8, 57, 58, 9, 10, 55, 9, 55, 56, 10, 11, 54, 10, 54, 55, 11, 12, 54, 12, 13, 54, 13, 14, 35, 13, 35, 54, 14, 15, 46, 14, 46, 35, 15, 16,\n 45, 15, 45, 46, 16, 26, 45, 17, 36, 18, 18, 37, 19, 18, 36, 37, 19, 38, 20, 19, 37, 38, 20, 39, 21, 20, 38, 39, 21, 39, 27, 22, 42, 23, 22, 27, 42, 23, 43, 24,\n 23, 42, 43, 24, 44, 25, 24, 43, 44, 25, 45, 26, 25, 44, 45, 27, 39, 28, 27, 28, 42, 28, 39, 29, 28, 29, 42, 29, 31, 30, 29, 30, 35, 29, 40, 31, 29, 35, 47, 29,\n 39, 40, 29, 47, 42, 30, 31, 32, 30, 32, 33, 30, 33, 34, 30, 34, 35, 31, 50, 32, 31, 40, 41, 31, 48, 49, 31, 49, 50, 32, 51, 33, 32, 50, 51, 33, 51, 34, 34, 52,\n 35, 34, 51, 52, 35, 46, 47, 35, 52, 53, 35, 53, 54, 36, 41, 37, 37, 40, 38, 37, 41, 40, 38, 40, 39, 42, 47, 43, 43, 47, 44, 44, 46, 45, 44, 47, 46, 48, 60, 49,\n 48, 59, 60, 49, 61, 50, 49, 60, 61, 50, 62, 51, 50, 61, 62, 51, 62, 52, 52, 63, 53, 52, 62, 63, 53, 64, 54, 53, 63, 64, 54, 64, 55, 55, 65, 56, 55, 64, 65, 56,\n 66, 57, 56, 65, 66, 57, 66, 58, 58, 67, 59, 58, 66, 67, 59, 67, 60, 60, 67, 61, 61, 66, 62, 61, 67, 66, 62, 66, 63, 63, 65, 64, 63, 66, 65, 21, 27, 22];\n\nexport const TRI33: Array = [\n /* eyes */ 0, 8, 7, 7, 8, 1, 2, 10, 9, 9, 10, 3,\n /* brows */ 17, 0, 18, 18, 0, 7, 18, 7, 19, 19, 7, 1, 19, 1, 11, 19, 11, 20, 21, 3, 22, 21, 9, 3, 20, 9, 21, 20, 2, 9, 20, 11, 2,\n /* 4head */ 23, 17, 18, 25, 21, 22, 24, 19, 20, 24, 18, 19, 24, 20, 21, 24, 23, 18, 24, 21, 25,\n /* nose */ 11, 12, 4, 11, 4, 13, 1, 12, 11, 11, 13, 2, 12, 14, 4, 4, 14, 13,\n /* up-lip */ 14, 5, 15, 14, 15, 6, 12, 5, 14, 14, 6, 13,\n /* cheeks */ 8, 12, 1, 2, 13, 10, 8, 26, 12, 10, 13, 27, 26, 5, 12, 13, 6, 27, 0, 26, 8, 10, 27, 3,\n /* chin */ 5, 32, 16, 16, 32, 6, 5, 30, 32, 6, 32, 31,\n /* cont */ 26, 30, 5, 27, 6, 31, 0, 28, 26, 3, 27, 29, 17, 28, 0, 3, 29, 22, 23, 28, 17, 22, 29, 25, 28, 30, 26, 27, 31, 29,\n];\n\nexport const TRI7: Array = [0, 4, 1, 2, 4, 3, 4, 5, 6];\n\nexport const VTX68: Array = [\n /* cont */ 127, 234, 132, 58, 172, 150, 149, 148, 152, 377, 378, 379, 397, 288, 361, 454, 356,\n /* brows */ 70, 63, 105, 66, 107, 336, 296, 334, 293, 300,\n /* nose */ 168, 6, 195, 4, 98, 97, 2, 326, 327,\n /* eyes */ 33, 160, 158, 133, 153, 144, 362, 385, 387, 263, 373, 380,\n /* lip */ 57, 40, 37, 0, 267, 270, 287, 321, 314, 17, 84, 91,\n /* mouth */ 78, 81, 13, 311, 308, 402, 14, 178,\n];\n\nexport const VTX33: Array = [33, 133, 362, 263, 1, 62, 308, 159, 145, 386, 374, 6, 102, 331, 2, 13, 14, 70, 105, 107, 336, 334, 300, 54, 10, 284, 50, 280, 234, 454, 58, 288, 152];\n\nexport const VTX7: Array = [33, 133, 362, 263, 1, 78, 308];\n\nexport const UV68 = VTX68.map((x) => UV468[x]);\n\nexport const UV33 = VTX33.map((x) => UV468[x]);\n\nexport const UV7 = VTX7.map((x) => UV468[x]);\n", "/**\n * BlazeFace, FaceMesh & Iris model implementation\n * See `facemesh.ts` for entry point\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as coords from './facemeshcoords';\nimport { constants } from '../tfjs/constants';\nimport type { Box, Point } from '../result';\nimport { env } from '../util/env';\n\nexport const createBox = (startEndTensor) => ({ startPoint: tf.slice(startEndTensor, [0, 0], [-1, 2]), endPoint: tf.slice(startEndTensor, [0, 2], [-1, 2]) });\n\nexport const disposeBox = (t) => tf.dispose([t.startPoint, t.endPoint]);\n\nexport const getBoxSize = (box): [number, number] => [Math.abs(box.endPoint[0] - box.startPoint[0]), Math.abs(box.endPoint[1] - box.startPoint[1])];\n\nexport const getBoxCenter = (box): [number, number, number] => [box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2, box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2, 1];\n\nexport const clampBox = (box, input): Box => (box ? [\n Math.trunc(Math.max(0, box.startPoint[0])),\n Math.trunc(Math.max(0, box.startPoint[1])),\n Math.trunc(Math.min((input.shape[2] || 0), box.endPoint[0]) - Math.max(0, box.startPoint[0])),\n Math.trunc(Math.min((input.shape[1] || 0), box.endPoint[1]) - Math.max(0, box.startPoint[1])),\n] : [0, 0, 0, 0]);\n\nexport const getRawBox = (box, input): Box => (box ? [\n box.startPoint[0] / (input.shape[2] || 0),\n box.startPoint[1] / (input.shape[1] || 0),\n (box.endPoint[0] - box.startPoint[0]) / (input.shape[2] || 0),\n (box.endPoint[1] - box.startPoint[1]) / (input.shape[1] || 0),\n] : [0, 0, 0, 0]);\n\nexport const scaleBoxCoordinates = (box, factor) => {\n const startPoint: Point = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]];\n const endPoint: Point = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]];\n return { startPoint, endPoint, landmarks: box.landmarks, confidence: box.confidence };\n};\n\nexport const cutAndResize = (box, image, cropSize) => {\n const h = image.shape[1];\n const w = image.shape[2];\n const cutBox = [box.startPoint[1] / h, box.startPoint[0] / w, box.endPoint[1] / h, box.endPoint[0] / w];\n const crop = tf.image.cropAndResize(image, [cutBox], [0], cropSize);\n const norm = tf.div(crop, constants.tf255);\n tf.dispose(crop);\n return norm;\n};\n\nexport const enlargeBox = (box, factor) => {\n const center = getBoxCenter(box);\n const size = getBoxSize(box);\n const halfSize: [number, number] = [factor * size[0] / 2, factor * size[1] / 2];\n return { startPoint: [center[0] - halfSize[0], center[1] - halfSize[1]] as Point, endPoint: [center[0] + halfSize[0], center[1] + halfSize[1]] as Point, landmarks: box.landmarks, confidence: box.confidence };\n};\n\nexport const squarifyBox = (box) => {\n const centers = getBoxCenter(box);\n const size = getBoxSize(box);\n const halfSize = Math.max(...size) / 2;\n return { startPoint: [Math.round(centers[0] - halfSize), Math.round(centers[1] - halfSize)] as Point, endPoint: [Math.round(centers[0] + halfSize), Math.round(centers[1] + halfSize)] as Point, landmarks: box.landmarks, confidence: box.confidence };\n};\n\nexport const calculateLandmarksBoundingBox = (landmarks) => {\n const x = landmarks.map((d) => d[0]);\n const y = landmarks.map((d) => d[1]);\n return { startPoint: [Math.min(...x), Math.min(...y)] as Point, endPoint: [Math.max(...x), Math.max(...y)] as Point, landmarks };\n};\n\nexport const fixedRotationMatrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];\n\nexport const normalizeRadians = (angle) => angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI));\n\nexport const computeRotation = (point1, point2) => normalizeRadians(Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]));\n\nexport const radToDegrees = (rad) => rad * 180 / Math.PI;\n\nexport const buildTranslationMatrix = (x, y) => [[1, 0, x], [0, 1, y], [0, 0, 1]];\n\nexport const dot = (v1: number[], v2: number[]) => {\n let product = 0;\n for (let i = 0; i < v1.length; i++) product += v1[i] * v2[i];\n return product;\n};\n\nexport const getColumnFrom2DArr = (arr, columnIndex) => {\n const column: Array = [];\n for (let i = 0; i < arr.length; i++) column.push(arr[i][columnIndex]);\n return column;\n};\n\nexport const multiplyTransformMatrices = (mat1, mat2) => {\n const product: Array = [];\n const size = mat1.length;\n for (let row = 0; row < size; row++) {\n product.push([]);\n for (let col = 0; col < size; col++) product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col)));\n }\n return product;\n};\n\nexport const buildRotationMatrix = (rotation, center) => {\n const cosA = Math.cos(rotation);\n const sinA = Math.sin(rotation);\n const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]];\n const translationMatrix = buildTranslationMatrix(center[0], center[1]);\n const translationTimesRotation = multiplyTransformMatrices(translationMatrix, rotationMatrix);\n const negativeTranslationMatrix = buildTranslationMatrix(-center[0], -center[1]);\n return multiplyTransformMatrices(translationTimesRotation, negativeTranslationMatrix);\n};\n\nexport const invertTransformMatrix = (matrix) => {\n const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]];\n const translationComponent = [matrix[0][2], matrix[1][2]];\n const invertedTranslation = [-dot(rotationComponent[0], translationComponent), -dot(rotationComponent[1], translationComponent)];\n return [rotationComponent[0].concat(invertedTranslation[0]), rotationComponent[1].concat(invertedTranslation[1]), [0, 0, 1]];\n};\n\nexport const rotatePoint = (homogeneousCoordinate, rotationMatrix) => [dot(homogeneousCoordinate, rotationMatrix[0]), dot(homogeneousCoordinate, rotationMatrix[1])];\n\nexport const xyDistanceBetweenPoints = (a, b) => Math.sqrt(((a[0] - b[0]) ** 2) + ((a[1] - b[1]) ** 2));\n\nexport function generateAnchors(inputSize) {\n const spec = { strides: [inputSize / 16, inputSize / 8], anchors: [2, 6] };\n const anchors: Array<[number, number]> = [];\n for (let i = 0; i < spec.strides.length; i++) {\n const stride = spec.strides[i];\n const gridRows = Math.floor((inputSize + stride - 1) / stride);\n const gridCols = Math.floor((inputSize + stride - 1) / stride);\n const anchorsNum = spec.anchors[i];\n for (let gridY = 0; gridY < gridRows; gridY++) {\n const anchorY = stride * (gridY + 0.5);\n for (let gridX = 0; gridX < gridCols; gridX++) {\n const anchorX = stride * (gridX + 0.5);\n for (let n = 0; n < anchorsNum; n++) anchors.push([anchorX, anchorY]);\n }\n }\n }\n return anchors;\n}\n\nexport function transformRawCoords(coordsRaw, box, angle, rotationMatrix, inputSize) {\n const boxSize = getBoxSize(box);\n const coordsScaled = coordsRaw.map((coord) => ([ // scaled around zero-point\n (boxSize[0] / inputSize) * (coord[0] - (inputSize / 2)),\n (boxSize[1] / inputSize) * (coord[1] - (inputSize / 2)),\n (coord[2] || 0),\n ]));\n const largeAngle = angle && (angle !== 0) && (Math.abs(angle) > 0.2);\n const coordsRotationMatrix = largeAngle ? buildRotationMatrix(angle, [0, 0]) : fixedRotationMatrix;\n const coordsRotated = largeAngle ? coordsScaled.map((coord) => ([...rotatePoint(coord, coordsRotationMatrix), coord[2]])) : coordsScaled;\n const inverseRotationMatrix = largeAngle ? invertTransformMatrix(rotationMatrix) : fixedRotationMatrix;\n const boxCenter = getBoxCenter(box);\n const offsets = [dot(boxCenter, inverseRotationMatrix[0]), dot(boxCenter, inverseRotationMatrix[1])];\n return coordsRotated.map((coord) => ([\n Math.trunc(coord[0] + offsets[0]),\n Math.trunc(coord[1] + offsets[1]),\n Math.trunc(coord[2] || 0),\n ]));\n}\n\nexport function correctFaceRotation(rotate, box, input, inputSize) {\n const symmetryLine = (box.landmarks.length >= coords.meshLandmarks.count)\n ? coords.meshLandmarks.symmetryLine\n : coords.blazeFaceLandmarks.symmetryLine;\n let angle = 0; // default\n let rotationMatrix = fixedRotationMatrix; // default\n let face; // default\n\n if (rotate && env.kernels.includes('rotatewithoffset')) { // rotateWithOffset is not defined for tfjs-node\n angle = computeRotation(box.landmarks[symmetryLine[0]], box.landmarks[symmetryLine[1]]);\n const largeAngle = angle && (angle !== 0) && (Math.abs(angle) > 0.2);\n if (largeAngle) { // perform rotation only if angle is sufficiently high\n const center: Point = getBoxCenter(box);\n const centerRaw: Point = [center[0] / input.shape[2], center[1] / input.shape[1]];\n const rotated = tf.image.rotateWithOffset(input, angle, 0, centerRaw);\n rotationMatrix = buildRotationMatrix(-angle, center);\n face = cutAndResize(box, rotated, [inputSize, inputSize]);\n tf.dispose(rotated);\n } else {\n face = cutAndResize(box, input, [inputSize, inputSize]);\n }\n } else {\n face = cutAndResize(box, input, [inputSize, inputSize]);\n }\n return [angle, rotationMatrix, face];\n}\n\nexport const findFaceCenter = (mesh) => {\n const x = mesh.map((m) => m[0]);\n const y = mesh.map((m) => m[1]);\n // weighted center\n /*\n const sum = (arr: number[]) => arr.reduce((prev, curr) => prev + curr, 0);\n return [sum(x) / mesh.length, sum(y) / mesh.length];\n */\n // absolute center\n return [Math.min(...x) + (Math.max(...x) - Math.min(...x)) / 2, Math.min(...y) + (Math.max(...y) - Math.min(...y)) / 2];\n};\n\nexport const calculateFaceBox = (mesh, previousBox) => {\n const center = findFaceCenter(mesh);\n const boxSize = getBoxSize(previousBox);\n const calculatedBox = {\n startPoint: [center[0] - boxSize[0] / 2, center[1] - boxSize[1] / 2] as Point,\n endPoint: [center[0] + boxSize[0] / 2, center[1] + boxSize[1] / 2] as Point,\n };\n return calculatedBox;\n};\n", "/**\n * BlazeFace, FaceMesh & Iris model implementation\n * See `facemesh.ts` for entry point\n */\n\nimport { log } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as util from './facemeshutil';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport type { Config } from '../config';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport { env } from '../util/env';\nimport type { Point } from '../result';\n\nconst keypointsCount = 6;\nconst faceBoxScaleFactor = 1.2;\nlet model: GraphModel | null;\nlet anchors: Tensor | null = null;\nlet inputSize = 0;\nlet inputSizeT: Tensor | null = null;\n\ntype DetectBox = { startPoint: Point, endPoint: Point, landmarks: Array, confidence: number };\n\nexport const size = () => inputSize;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.detector?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n inputSize = model.inputs[0].shape ? model.inputs[0].shape[2] : 0;\n inputSizeT = tf.scalar(inputSize, 'int32') as Tensor;\n anchors = tf.tensor2d(util.generateAnchors(inputSize)) as Tensor;\n return model;\n}\n\nfunction decodeBounds(boxOutputs: Tensor) {\n const t: Record = {};\n t.boxStarts = tf.slice(boxOutputs, [0, 1], [-1, 2]);\n t.centers = tf.add(t.boxStarts, anchors);\n t.boxSizes = tf.slice(boxOutputs, [0, 3], [-1, 2]);\n t.boxSizesNormalized = tf.div(t.boxSizes, inputSizeT);\n t.centersNormalized = tf.div(t.centers, inputSizeT);\n t.halfBoxSize = tf.div(t.boxSizesNormalized, constants.tf2);\n t.starts = tf.sub(t.centersNormalized, t.halfBoxSize);\n t.ends = tf.add(t.centersNormalized, t.halfBoxSize);\n t.startNormalized = tf.mul(t.starts, inputSizeT);\n t.endNormalized = tf.mul(t.ends, inputSizeT);\n const boxes = tf.concat2d([t.startNormalized, t.endNormalized], 1);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return boxes;\n}\n\nexport async function getBoxes(inputImage: Tensor, config: Config) {\n // sanity check on input\n if ((!inputImage) || (inputImage['isDisposedInternal']) || (inputImage.shape.length !== 4) || (inputImage.shape[1] < 1) || (inputImage.shape[2] < 1)) return [];\n const t: Record = {};\n\n t.resized = tf.image.resizeBilinear(inputImage, [inputSize, inputSize]);\n t.div = tf.div(t.resized, constants.tf127);\n t.normalized = tf.sub(t.div, constants.tf05);\n const res = model?.execute(t.normalized) as Tensor[];\n if (Array.isArray(res)) { // are we using tfhub or pinto converted model?\n const sorted = res.sort((a, b) => a.size - b.size);\n t.concat384 = tf.concat([sorted[0], sorted[2]], 2); // dim: 384, 1 + 16\n t.concat512 = tf.concat([sorted[1], sorted[3]], 2); // dim: 512, 1 + 16\n t.concat = tf.concat([t.concat512, t.concat384], 1);\n t.batch = tf.squeeze(t.concat, 0);\n } else {\n t.batch = tf.squeeze(res); // when using tfhub model\n }\n tf.dispose(res);\n t.boxes = decodeBounds(t.batch);\n t.logits = tf.slice(t.batch, [0, 0], [-1, 1]);\n t.sigmoid = tf.sigmoid(t.logits);\n t.scores = tf.squeeze(t.sigmoid);\n t.nms = await tf.image.nonMaxSuppressionAsync(t.boxes, t.scores, (config.face.detector?.maxDetected || 0), (config.face.detector?.iouThreshold || 0), (config.face.detector?.minConfidence || 0));\n const nms = await t.nms.array() as number[];\n const boxes: Array = [];\n const scores = await t.scores.data();\n for (let i = 0; i < nms.length; i++) {\n const confidence = scores[nms[i]];\n if (confidence > (config.face.detector?.minConfidence || 0)) {\n const b: Record = {};\n b.bbox = tf.slice(t.boxes, [nms[i], 0], [1, -1]);\n b.slice = tf.slice(t.batch, [nms[i], keypointsCount - 1], [1, -1]);\n b.squeeze = tf.squeeze(b.slice);\n b.landmarks = tf.reshape(b.squeeze, [keypointsCount, -1]);\n const points = await b.bbox.data();\n const rawBox = {\n startPoint: [points[0], points[1]] as Point,\n endPoint: [points[2], points[3]] as Point,\n landmarks: (await b.landmarks.array()) as Point[],\n confidence,\n };\n const scaledBox = util.scaleBoxCoordinates(rawBox, [(inputImage.shape[2] || 0) / inputSize, (inputImage.shape[1] || 0) / inputSize]);\n const enlargedBox = util.enlargeBox(scaledBox, config.face['scale'] || faceBoxScaleFactor);\n const squaredBox = util.squarifyBox(enlargedBox);\n boxes.push(squaredBox);\n Object.keys(b).forEach((tensor) => tf.dispose(b[tensor]));\n }\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return boxes;\n}\n", "/* eslint-disable no-multi-spaces */\n\nexport const kpt: Array = [\n 'nose', // 0\n 'leftEyeInside', // 1\n 'leftEye', // 2\n 'leftEyeOutside', // 3\n 'rightEyeInside', // 4\n 'rightEye', // 5\n 'rightEyeOutside', // 6\n 'leftEar', // 7\n 'rightEar', // 8\n 'leftMouth', // 9\n 'rightMouth', // 10\n 'leftShoulder', // 11\n 'rightShoulder', // 12\n 'leftElbow', // 13\n 'rightElbow', // 14\n 'leftWrist', // 15\n 'rightWrist', // 16\n 'leftPinky', // 17\n 'rightPinky', // 18\n 'leftIndex', // 19\n 'rightIndex', // 20\n 'leftThumb', // 21\n 'rightThumb', // 22\n 'leftHip', // 23\n 'rightHip', // 24\n 'leftKnee', // 25\n 'rightKnee', // 26\n 'leftAnkle', // 27\n 'rightAnkle', // 28\n 'leftHeel', // 29\n 'rightHeel', // 30\n 'leftFoot', // 31\n 'rightFoot', // 32\n 'bodyCenter', // 33\n 'bodyTop', // 34\n 'leftPalm', // 35 // z-coord not ok\n 'leftHand', // 36 // similar to wrist but z-coord not ok\n 'rightPalm', // 37 // z-coord not ok\n 'rightHand', // 38 // similar to wrist but z-coord not ok\n];\n\nexport const connected: Record = {\n shoulders: ['leftShoulder', 'rightShoulder'],\n hips: ['rightHip', 'leftHip'],\n mouth: ['leftMouth', 'rightMouth'],\n leftLegUpper: ['leftHip', 'leftKnee'],\n leftLegLower: ['leftKnee', 'leftAnkle'],\n leftFoot: ['leftAnkle', 'leftHeel', 'leftFoot'],\n leftTorso: ['leftShoulder', 'leftHip'],\n leftArmUpper: ['leftShoulder', 'leftElbow'],\n leftArmLower: ['leftElbow', 'leftWrist'],\n leftHand: ['leftWrist', 'leftPalm'],\n leftHandPinky: ['leftPalm', 'leftPinky'],\n leftHandIndex: ['leftPalm', 'leftIndex'],\n leftHandThumb: ['leftPalm', 'leftThumb'],\n leftEyeOutline: ['leftEyeInside', 'leftEyeOutside'],\n rightLegUpper: ['rightHip', 'rightKnee'],\n rightLegLower: ['rightKnee', 'rightAnkle'],\n rightFoot: ['rightAnkle', 'rightHeel', 'rightFoot'],\n rightTorso: ['rightShoulder', 'rightHip'],\n rightArmUpper: ['rightShoulder', 'rightElbow'],\n rightArmLower: ['rightElbow', 'rightWrist'],\n rightHand: ['rightWrist', 'rightPalm'],\n rightHandPinky: ['rightPalm', 'rightPinky'],\n rightHandIndex: ['rightPalm', 'rightIndex'],\n rightHandThumb: ['rightPalm', 'rightThumb'],\n rightEyeOutline: ['rightEyeInside', 'rightEyeOutside'],\n};\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport type { Tensor } from '../tfjs/types';\nimport type { Box } from '../result';\nimport type { Config } from '../config';\n\ninterface DetectedBox { box: Box, boxRaw: Box, score: number }\n\nconst inputSize = 224;\nlet anchorTensor: { x, y };\nconst numLayers = 5;\nconst strides = [8, 16, 32, 32, 32];\n\nexport async function createAnchors() {\n const anchors: Array<{ x: number, y: number }> = [];\n let layerId = 0;\n while (layerId < numLayers) {\n let anchorCount = 0;\n let lastSameStrideLayer = layerId;\n while (lastSameStrideLayer < strides.length && strides[lastSameStrideLayer] === strides[layerId]) {\n anchorCount += 2;\n lastSameStrideLayer++;\n }\n const stride = strides[layerId];\n const featureMapHeight = Math.ceil(inputSize / stride);\n const featureMapWidth = Math.ceil(inputSize / stride);\n for (let y = 0; y < featureMapHeight; ++y) {\n for (let x = 0; x < featureMapWidth; ++x) {\n for (let anchorId = 0; anchorId < anchorCount; ++anchorId) {\n anchors.push({ x: (x + 0.5) / featureMapWidth, y: (y + 0.5) / featureMapHeight });\n }\n }\n }\n layerId = lastSameStrideLayer;\n }\n anchorTensor = { x: tf.tensor1d(anchors.map((a) => a.x)), y: tf.tensor1d(anchors.map((a) => a.y)) };\n}\n\nconst cropFactor = [5.0, 5.0];\nfunction decodeBoxes(boxesTensor, anchor): Tensor {\n return tf.tidy(() => {\n const split = tf.split(boxesTensor, 12, 1); // first 4 are box data [x,y,w,h] and 4 are keypoints data [x,y] for total of 12\n let xCenter = tf.squeeze(split[0]);\n let yCenter = tf.squeeze(split[1]);\n let width = tf.squeeze(split[2]);\n let height = tf.squeeze(split[3]);\n xCenter = tf.add(tf.div(xCenter, inputSize), anchor.x);\n yCenter = tf.add(tf.div(yCenter, inputSize), anchor.y);\n width = tf.mul(tf.div(width, inputSize), cropFactor[0]);\n height = tf.mul(tf.div(height, inputSize), cropFactor[1]);\n const xMin = tf.sub(xCenter, tf.div(width, 2));\n const yMin = tf.sub(yCenter, tf.div(height, 2));\n const boxes = tf.stack([xMin, yMin, width, height], 1);\n return boxes;\n });\n}\n\nexport async function decode(boxesTensor: Tensor, logitsTensor: Tensor, config: Config, outputSize: [number, number]): Promise {\n const t: Record = {};\n t.boxes = decodeBoxes(boxesTensor, anchorTensor);\n t.scores = tf.sigmoid(logitsTensor);\n t.argmax = tf.argMax(t.scores);\n const i = (await t.argmax.data())[0] as number;\n const scores = await t.scores.data();\n const detected: Array<{ box: Box, boxRaw: Box, score: number }> = [];\n const minScore = (config.body['detector'] && config.body['detector']['minConfidence']) ? config.body['detector']['minConfidence'] : 0;\n if (scores[i] >= minScore) {\n const boxes = await t.boxes.array();\n const boxRaw: Box = boxes[i];\n const box: Box = [boxRaw[0] * outputSize[0], boxRaw[1] * outputSize[1], boxRaw[2] * outputSize[0], boxRaw[3] * outputSize[1]];\n // console.log(box);\n detected.push({ box, boxRaw, score: scores[i] });\n }\n /*\n t.nms = await tf.image.nonMaxSuppressionAsync(t.boxes, t.scores, 1, config.body.detector?.minConfidence || 0.1, config.body.detector?.iouThreshold || 0.1);\n const boxes = t.boxes.arraySync();\n const scores = t.scores.dataSync();\n const nms = t.nms.dataSync();\n const detected: Array = [];\n for (const i of Array.from(nms)) {\n const boxRaw: Box = boxes[i];\n const box: Box = [boxRaw[0] * outputSize[0], boxRaw[0] * outputSize[1], boxRaw[3] * outputSize[0], boxRaw[2] * outputSize[1]];\n detected.push({ box, boxRaw, score: scores[i] });\n }\n */\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return detected;\n}\n", "import type { Point, Box } from '../result';\n\nexport function calc(keypoints: Array, outputSize: [number, number] = [1, 1]) {\n const coords = [keypoints.map((pt) => pt[0]), keypoints.map((pt) => pt[1])]; // all x/y coords\n const min = [Math.min(...coords[0]), Math.min(...coords[1])];\n const max = [Math.max(...coords[0]), Math.max(...coords[1])];\n const box: Box = [min[0], min[1], max[0] - min[0], max[1] - min[1]];\n const boxRaw: Box = [box[0] / outputSize[0], box[1] / outputSize[1], box[2] / outputSize[0], box[3] / outputSize[1]];\n return { box, boxRaw };\n}\n\nexport function square(keypoints: Array, outputSize: [number, number] = [1, 1]) {\n const coords = [keypoints.map((pt) => pt[0]), keypoints.map((pt) => pt[1])]; // all x/y coords\n const min = [Math.min(...coords[0]), Math.min(...coords[1])];\n const max = [Math.max(...coords[0]), Math.max(...coords[1])];\n const center = [(min[0] + max[0]) / 2, (min[1] + max[1]) / 2]; // find center x and y coord of all fingers\n const dist = Math.max(center[0] - min[0], center[1] - min[1], -center[0] + max[0], -center[1] + max[1]); // largest distance from center in any direction\n const box: Box = [Math.trunc(center[0] - dist), Math.trunc(center[1] - dist), Math.trunc(2 * dist), Math.trunc(2 * dist)];\n const boxRaw: Box = [box[0] / outputSize[0], box[1] / outputSize[1], box[2] / outputSize[0], box[3] / outputSize[1]];\n return { box, boxRaw };\n}\n\nexport function scale(box: Box, scaleFact: number) {\n const dist = [box[2] * scaleFact, box[3] * scaleFact];\n const newBox: Box = [\n box[0] - (dist[0] - box[2]) / 2,\n box[1] - (dist[1] - box[3]) / 2,\n dist[0],\n dist[1],\n ];\n return newBox;\n}\n\nexport function crop(box: Box) { // [y1, x1, y2, x2] clamped to 0..1\n const yxBox: Box = [Math.max(0, box[1]), Math.max(0, box[0]), Math.min(1, box[3] + box[1]), Math.min(1, box[2] + box[0])];\n return yxBox;\n}\n", "/**\n * BlazePose model implementation\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport { log, now } from '../util/util';\nimport type { BodyKeypoint, BodyResult, BodyLandmark, Box, Point, BodyAnnotation } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport * as coords from './blazeposecoords';\nimport * as detect from './blazeposedetector';\nimport * as box from '../util/box';\n\nconst env = { initial: true };\n// const models: [GraphModel | null, GraphModel | null] = [null, null];\nconst models: { detector: GraphModel | null, landmarks: GraphModel | null } = { detector: null, landmarks: null };\nconst inputSize: { detector: [number, number], landmarks: [number, number] } = { detector: [224, 224], landmarks: [256, 256] };\nlet skipped = Number.MAX_SAFE_INTEGER;\nconst outputNodes: { detector: string[], landmarks: string[] } = {\n landmarks: ['ld_3d', 'activation_segmentation', 'activation_heatmap', 'world_3d', 'output_poseflag'],\n detector: [],\n};\n\nlet cache: BodyResult | null = null;\nlet cropBox: Box | undefined;\nlet padding: [number, number][] = [[0, 0], [0, 0], [0, 0], [0, 0]];\nlet lastTime = 0;\n\nconst sigmoid = (x) => (1 - (1 / (1 + Math.exp(x))));\n\nexport async function loadDetect(config: Config): Promise {\n if (env.initial) models.detector = null;\n if (!models.detector && config.body['detector'] && config.body['detector']['modelPath'] || '') {\n models.detector = await loadModel(config.body['detector']['modelPath']);\n const inputs = Object.values(models.detector.modelSignature['inputs']);\n inputSize.detector[0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;\n inputSize.detector[1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug && models.detector) log('cached model:', models.detector['modelUrl']);\n await detect.createAnchors();\n return models.detector as GraphModel;\n}\n\nexport async function loadPose(config: Config): Promise {\n if (env.initial) models.landmarks = null;\n if (!models.landmarks) {\n models.landmarks = await loadModel(config.body.modelPath);\n const inputs = Object.values(models.landmarks.modelSignature['inputs']);\n inputSize.landmarks[0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;\n inputSize.landmarks[1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug) log('cached model:', models.landmarks['modelUrl']);\n return models.landmarks;\n}\n\nexport async function load(config: Config): Promise<[GraphModel | null, GraphModel | null]> {\n if (!models.detector) await loadDetect(config);\n if (!models.landmarks) await loadPose(config);\n return [models.detector, models.landmarks];\n}\n\nasync function prepareImage(input: Tensor, size: number): Promise {\n const t: Record = {};\n if (!input.shape || !input.shape[1] || !input.shape[2]) return input;\n let final: Tensor;\n if (cropBox) {\n t.cropped = tf.image.cropAndResize(input, [cropBox], [0], [input.shape[1], input.shape[2]]); // if we have cached box use it to crop input\n }\n if (input.shape[1] !== input.shape[2]) { // only pad if width different than height\n const height: [number, number] = [\n input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0,\n input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0,\n ];\n const width: [number, number] = [\n input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0,\n input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0,\n ];\n padding = [\n [0, 0], // dont touch batch\n height, // height before&after\n width, // width before&after\n [0, 0], // dont touch rbg\n ];\n t.pad = tf.pad(t.cropped || input, padding); // use cropped box if it exists\n t.resize = tf.image.resizeBilinear(t.pad, [size, size]);\n final = tf.div(t.resize, constants.tf255);\n } else if (input.shape[1] !== size) { // if input needs resizing\n t.resize = tf.image.resizeBilinear(t.cropped || input, [size, size]);\n final = tf.div(t.resize, constants.tf255);\n } else { // if input is already in a correct resolution just normalize it\n final = tf.div(t.cropped || input, constants.tf255);\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return final;\n}\n\nfunction rescaleKeypoints(keypoints: Array, outputSize: [number, number]): Array {\n for (const kpt of keypoints) { // first rescale due to padding\n kpt.position = [\n Math.trunc(kpt.position[0] * (outputSize[0] + padding[2][0] + padding[2][1]) / outputSize[0] - padding[2][0]),\n Math.trunc(kpt.position[1] * (outputSize[1] + padding[1][0] + padding[1][1]) / outputSize[1] - padding[1][0]),\n kpt.position[2] as number,\n ];\n kpt.positionRaw = [kpt.position[0] / outputSize[0], kpt.position[1] / outputSize[1], 2 * (kpt.position[2] as number) / (outputSize[0] + outputSize[1])];\n }\n if (cropBox) { // second rescale due to cropping\n for (const kpt of keypoints) {\n kpt.positionRaw = [\n kpt.positionRaw[0] + cropBox[1], // correct offset due to crop\n kpt.positionRaw[1] + cropBox[0], // correct offset due to crop\n kpt.positionRaw[2] as number,\n ];\n kpt.position = [\n Math.trunc(kpt.positionRaw[0] * outputSize[0]),\n Math.trunc(kpt.positionRaw[1] * outputSize[1]),\n kpt.positionRaw[2] as number,\n ];\n }\n }\n return keypoints;\n}\n\nasync function fixKeypoints(keypoints: Array) {\n // palm z-coord is incorrect around near-zero so we approximate it\n const leftPalm = keypoints.find((k) => k.part === 'leftPalm') as BodyKeypoint;\n const leftWrist = keypoints.find((k) => k.part === 'leftWrist') as BodyKeypoint;\n const leftIndex = keypoints.find((k) => k.part === 'leftIndex') as BodyKeypoint;\n leftPalm.position[2] = ((leftWrist.position[2] || 0) + (leftIndex.position[2] || 0)) / 2;\n const rightPalm = keypoints.find((k) => k.part === 'rightPalm') as BodyKeypoint;\n const rightWrist = keypoints.find((k) => k.part === 'rightWrist') as BodyKeypoint;\n const rightIndex = keypoints.find((k) => k.part === 'rightIndex') as BodyKeypoint;\n rightPalm.position[2] = ((rightWrist.position[2] || 0) + (rightIndex.position[2] || 0)) / 2;\n}\n\nasync function detectLandmarks(input: Tensor, config: Config, outputSize: [number, number]): Promise {\n /**\n * t.ld: 39 keypoints [x,y,z,score,presence] normalized to input size\n * t.segmentation:\n * t.heatmap:\n * t.world: 39 keypoints [x,y,z] normalized to -1..1\n * t.poseflag: body score\n */\n const t: Record = {};\n [t.ld/* 1,195(39*5) */, t.segmentation/* 1,256,256,1 */, t.heatmap/* 1,64,64,39 */, t.world/* 1,117(39*3) */, t.poseflag/* 1,1 */] = models.landmarks?.execute(input, outputNodes.landmarks) as Tensor[]; // run model\n const poseScore = (await t.poseflag.data())[0];\n const points = await t.ld.data();\n const distances = await t.world.data();\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor])); // dont need tensors after this\n const keypointsRelative: Array = [];\n const depth = 5; // each points has x,y,z,visibility,presence\n for (let i = 0; i < points.length / depth; i++) {\n const score = sigmoid(points[depth * i + 3]);\n const presence = sigmoid(points[depth * i + 4]);\n const adjScore = Math.trunc(100 * score * presence * poseScore) / 100;\n const positionRaw: Point = [points[depth * i + 0] / inputSize.landmarks[0], points[depth * i + 1] / inputSize.landmarks[1], points[depth * i + 2] + 0];\n const position: Point = [Math.trunc(outputSize[0] * positionRaw[0]), Math.trunc(outputSize[1] * positionRaw[1]), positionRaw[2] as number];\n const distance: Point = [distances[depth * i + 0], distances[depth * i + 1], distances[depth * i + 2] + 0];\n keypointsRelative.push({ part: coords.kpt[i] as BodyLandmark, positionRaw, position, distance, score: adjScore });\n }\n if (poseScore < (config.body.minConfidence || 0)) return null;\n fixKeypoints(keypointsRelative);\n const keypoints: Array = rescaleKeypoints(keypointsRelative, outputSize); // keypoints were relative to input image which is padded\n const kpts = keypoints.map((k) => k.position);\n const boxes = box.calc(kpts, [outputSize[0], outputSize[1]]); // now find boxes based on rescaled keypoints\n const annotations: Record = {} as Record;\n for (const [name, indexes] of Object.entries(coords.connected)) {\n const pt: Array = [];\n for (let i = 0; i < indexes.length - 1; i++) {\n const pt0 = keypoints.find((kpt) => kpt.part === indexes[i]);\n const pt1 = keypoints.find((kpt) => kpt.part === indexes[i + 1]);\n if (pt0 && pt1) pt.push([pt0.position, pt1.position]);\n }\n annotations[name] = pt;\n }\n const body = { id: 0, score: Math.trunc(100 * poseScore) / 100, box: boxes.box, boxRaw: boxes.boxRaw, keypoints, annotations };\n return body;\n}\n\n/*\ninterface DetectedBox { box: Box, boxRaw: Box, score: number }\n\nfunction rescaleBoxes(boxes: Array, outputSize: [number, number]): Array {\n for (const b of boxes) {\n b.box = [\n Math.trunc(b.box[0] * (outputSize[0] + padding[2][0] + padding[2][1]) / outputSize[0]),\n Math.trunc(b.box[1] * (outputSize[1] + padding[1][0] + padding[1][1]) / outputSize[1]),\n Math.trunc(b.box[2] * (outputSize[0] + padding[2][0] + padding[2][1]) / outputSize[0]),\n Math.trunc(b.box[3] * (outputSize[1] + padding[1][0] + padding[1][1]) / outputSize[1]),\n ];\n b.boxRaw = [b.box[0] / outputSize[0], b.box[1] / outputSize[1], b.box[2] / outputSize[0], b.box[3] / outputSize[1]];\n }\n return boxes;\n}\n\nasync function detectBoxes(input: Tensor, config: Config, outputSize: [number, number]) {\n const t: Record = {};\n t.res = models.detector?.execute(input, ['Identity']) as Tensor; //\n t.logitsRaw = tf.slice(t.res, [0, 0, 0], [1, -1, 1]);\n t.boxesRaw = tf.slice(t.res, [0, 0, 1], [1, -1, -1]);\n t.logits = tf.squeeze(t.logitsRaw);\n t.boxes = tf.squeeze(t.boxesRaw);\n const boxes = await detect.decode(t.boxes, t.logits, config, outputSize);\n rescaleBoxes(boxes, outputSize);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return boxes;\n}\n*/\n\nexport async function predict(input: Tensor, config: Config): Promise {\n const outputSize: [number, number] = [input.shape[2] || 0, input.shape[1] || 0];\n const skipTime = (config.body.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.body.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && cache !== null) {\n skipped++;\n } else {\n const t: Record = {};\n /*\n if (config.body['detector'] && config.body['detector']['enabled']) {\n t.detector = await prepareImage(input, 224);\n const boxes = await detectBoxes(t.detector, config, outputSize);\n }\n */\n t.landmarks = await prepareImage(input, 256); // padded and resized\n cache = await detectLandmarks(t.landmarks, config, outputSize);\n /*\n cropBox = [0, 0, 1, 1]; // reset crop coordinates\n if (cache?.boxRaw && config.skipAllowed) {\n const cx = (2.0 * cache.boxRaw[0] + cache.boxRaw[2]) / 2;\n const cy = (2.0 * cache.boxRaw[1] + cache.boxRaw[3]) / 2;\n let size = cache.boxRaw[2] > cache.boxRaw[3] ? cache.boxRaw[2] : cache.boxRaw[3];\n size = (size * 1.0) / 2; // enlarge and half it\n if (cx > 0.1 && cx < 0.9 && cy > 0.1 && cy < 0.9 && size > 0.1) { // only update if box is sane\n const y = 0; // cy - size;\n const x = cx - size;\n cropBox = [y, x, y + 1, x + 1]; // [y0,x0,y1,x1] used for cropping but width/height are not yet implemented so we only reposition image to center of body\n }\n }\n */\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n lastTime = now();\n skipped = 0;\n }\n return cache ? [cache] : [];\n}\n", "/**\n * CoCo Labels used by object detection implementations\n */\nexport const labels = [\n { class: 1, label: 'person' },\n { class: 2, label: 'bicycle' },\n { class: 3, label: 'car' },\n { class: 4, label: 'motorcycle' },\n { class: 5, label: 'airplane' },\n { class: 6, label: 'bus' },\n { class: 7, label: 'train' },\n { class: 8, label: 'truck' },\n { class: 9, label: 'boat' },\n { class: 10, label: 'traffic light' },\n { class: 11, label: 'fire hydrant' },\n { class: 12, label: 'stop sign' },\n { class: 13, label: 'parking meter' },\n { class: 14, label: 'bench' },\n { class: 15, label: 'bird' },\n { class: 16, label: 'cat' },\n { class: 17, label: 'dog' },\n { class: 18, label: 'horse' },\n { class: 19, label: 'sheep' },\n { class: 20, label: 'cow' },\n { class: 21, label: 'elephant' },\n { class: 22, label: 'bear' },\n { class: 23, label: 'zebra' },\n { class: 24, label: 'giraffe' },\n { class: 25, label: 'backpack' },\n { class: 26, label: 'umbrella' },\n { class: 27, label: 'handbag' },\n { class: 28, label: 'tie' },\n { class: 29, label: 'suitcase' },\n { class: 30, label: 'frisbee' },\n { class: 31, label: 'skis' },\n { class: 32, label: 'snowboard' },\n { class: 33, label: 'sports ball' },\n { class: 34, label: 'kite' },\n { class: 35, label: 'baseball bat' },\n { class: 36, label: 'baseball glove' },\n { class: 37, label: 'skateboard' },\n { class: 38, label: 'surfboard' },\n { class: 39, label: 'tennis racket' },\n { class: 40, label: 'bottle' },\n { class: 41, label: 'wine glass' },\n { class: 42, label: 'cup' },\n { class: 43, label: 'fork' },\n { class: 44, label: 'knife' },\n { class: 45, label: 'spoon' },\n { class: 46, label: 'bowl' },\n { class: 47, label: 'banana' },\n { class: 48, label: 'apple' },\n { class: 49, label: 'sandwich' },\n { class: 50, label: 'orange' },\n { class: 51, label: 'broccoli' },\n { class: 52, label: 'carrot' },\n { class: 53, label: 'hot dog' },\n { class: 54, label: 'pizza' },\n { class: 55, label: 'donut' },\n { class: 56, label: 'cake' },\n { class: 57, label: 'chair' },\n { class: 58, label: 'couch' },\n { class: 59, label: 'potted plant' },\n { class: 60, label: 'bed' },\n { class: 61, label: 'dining table' },\n { class: 62, label: 'toilet' },\n { class: 63, label: 'tv' },\n { class: 64, label: 'laptop' },\n { class: 65, label: 'mouse' },\n { class: 66, label: 'remote' },\n { class: 67, label: 'keyboard' },\n { class: 68, label: 'cell phone' },\n { class: 69, label: 'microwave' },\n { class: 70, label: 'oven' },\n { class: 71, label: 'toaster' },\n { class: 72, label: 'sink' },\n { class: 73, label: 'refrigerator' },\n { class: 74, label: 'book' },\n { class: 75, label: 'clock' },\n { class: 76, label: 'vase' },\n { class: 77, label: 'scissors' },\n { class: 78, label: 'teddy bear' },\n { class: 79, label: 'hair drier' },\n { class: 80, label: 'toothbrush' },\n];\n", "/**\n * CenterNet object detection model implementation\n *\n * Based on: [**NanoDet**](https://github.com/RangiLyu/nanodet)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { labels } from './labels';\nimport type { ObjectResult, ObjectType, Box } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nlet inputSize = 0;\nlet last: ObjectResult[] = [];\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) {\n // fakeOps(['floormod'], config);\n model = await loadModel(config.object.modelPath);\n const inputs = Object.values(model.modelSignature['inputs']);\n inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nasync function process(res: Tensor | null, outputShape: [number, number], config: Config) {\n if (!res) return [];\n const t: Record = {};\n const results: Array = [];\n const detections = await res.array() as number[][][];\n t.squeeze = tf.squeeze(res);\n const arr = tf.split(t.squeeze, 6, 1) as Tensor[]; // x1, y1, x2, y2, score, class\n t.stack = tf.stack([arr[1], arr[0], arr[3], arr[2]], 1); // reorder dims as tf.nms expects y, x\n t.boxes = tf.squeeze(t.stack);\n t.scores = tf.squeeze(arr[4]);\n t.classes = tf.squeeze(arr[5]);\n tf.dispose([res, ...arr]);\n t.nms = await tf.image.nonMaxSuppressionAsync(t.boxes, t.scores, config.object.maxDetected, config.object.iouThreshold, (config.object.minConfidence || 0));\n const nms = await t.nms.data();\n let i = 0;\n for (const id of Array.from(nms)) {\n const score = Math.trunc(100 * detections[0][id][4]) / 100;\n const classVal = detections[0][id][5];\n const label = labels[classVal].label as ObjectType;\n const [x, y] = [\n detections[0][id][0] / inputSize,\n detections[0][id][1] / inputSize,\n ];\n const boxRaw: Box = [\n x,\n y,\n detections[0][id][2] / inputSize - x,\n detections[0][id][3] / inputSize - y,\n ];\n const box: Box = [\n Math.trunc(boxRaw[0] * outputShape[0]),\n Math.trunc(boxRaw[1] * outputShape[1]),\n Math.trunc(boxRaw[2] * outputShape[0]),\n Math.trunc(boxRaw[3] * outputShape[1]),\n ];\n results.push({ id: i++, score, class: classVal, label, box, boxRaw });\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return results;\n}\n\nexport async function predict(input: Tensor, config: Config): Promise {\n const skipTime = (config.object.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.object.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && (last.length > 0)) {\n skipped++;\n return last;\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const outputSize = [input.shape[2] || 0, input.shape[1] || 0] as [number, number];\n const resize = tf.image.resizeBilinear(input, [inputSize, inputSize]);\n const objectT = config.object.enabled ? model?.execute(resize, ['tower_0/detections']) as Tensor : null;\n lastTime = now();\n tf.dispose(resize);\n\n const obj = await process(objectT, outputSize, config);\n last = obj;\n\n resolve(obj);\n });\n}\n", "export const kpt: Array = [\n 'head',\n 'neck',\n 'rightShoulder',\n 'rightElbow',\n 'rightWrist',\n 'chest',\n 'leftShoulder',\n 'leftElbow',\n 'leftWrist',\n 'bodyCenter',\n 'rightHip',\n 'rightKnee',\n 'rightAnkle',\n 'leftHip',\n 'leftKnee',\n 'leftAnkle',\n];\n\nexport const connected: Record = {\n leftLeg: ['leftHip', 'leftKnee', 'leftAnkle'],\n rightLeg: ['rightHip', 'rightKnee', 'rightAnkle'],\n torso: ['leftShoulder', 'rightShoulder', 'rightHip', 'leftHip', 'leftShoulder'],\n leftArm: ['leftShoulder', 'leftElbow', 'leftWrist'],\n rightArm: ['rightShoulder', 'rightElbow', 'rightWrist'],\n head: [],\n};\n", "/**\n * EfficientPose model implementation\n *\n * Based on: [**EfficientPose**](https://github.com/daniegr/EfficientPose)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport * as coords from './efficientposecoords';\nimport { constants } from '../tfjs/constants';\nimport type { BodyResult, Point, BodyLandmark, BodyAnnotation } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nlet lastTime = 0;\nconst cache: BodyResult = { id: 0, keypoints: [], box: [0, 0, 0, 0], boxRaw: [0, 0, 0, 0], score: 0, annotations: {} as Record };\n\n// const keypoints: Array = [];\n// let box: Box = [0, 0, 0, 0];\n// let boxRaw: Box = [0, 0, 0, 0];\n// let score = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.body.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n// performs argmax and max functions on a 2d tensor\nasync function max2d(inputs, minScore) {\n const [width, height] = inputs.shape;\n const reshaped = tf.reshape(inputs, [height * width]); // combine all data\n const max = tf.max(reshaped, 0);\n const newScore = (await max.data())[0]; // get highest score\n tf.dispose([reshaped, max]);\n if (newScore > minScore) { // skip coordinate calculation is score is too low\n const coordinates = tf.argMax(reshaped, 0);\n const mod = tf.mod(coordinates, width);\n const x = (await mod.data())[0];\n const div = tf.div(coordinates, tf.scalar(width, 'int32'));\n const y = (await div.data())[0];\n tf.dispose([mod, div]);\n return [x, y, newScore];\n }\n return [0, 0, newScore];\n}\n\nexport async function predict(image: Tensor, config: Config): Promise {\n const skipTime = (config.body.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.body.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && Object.keys(cache.keypoints).length > 0) {\n skipped++;\n return [cache];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const tensor = tf.tidy(() => {\n if (!model?.inputs[0].shape) return null;\n const resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n const enhance = tf.mul(resize, constants.tf2);\n const norm = tf.sub(enhance, constants.tf1);\n return norm;\n });\n\n let resT;\n if (config.body.enabled) resT = model?.execute(tensor);\n lastTime = now();\n tf.dispose(tensor);\n\n if (resT) {\n cache.keypoints.length = 0;\n const squeeze = resT.squeeze();\n tf.dispose(resT);\n // body parts are basically just a stack of 2d tensors\n const stack = squeeze.unstack(2);\n tf.dispose(squeeze);\n // process each unstacked tensor as a separate body part\n for (let id = 0; id < stack.length; id++) {\n // actual processing to get coordinates and score\n const [x, y, partScore] = await max2d(stack[id], config.body.minConfidence);\n if (partScore > (config.body?.minConfidence || 0)) {\n cache.keypoints.push({\n score: Math.round(100 * partScore) / 100,\n part: coords.kpt[id] as BodyLandmark,\n positionRaw: [ // normalized to 0..1\n // @ts-ignore model is not undefined here\n x / model.inputs[0].shape[2], y / model.inputs[0].shape[1],\n ],\n position: [ // normalized to input image size\n // @ts-ignore model is not undefined here\n Math.round(image.shape[2] * x / model.inputs[0].shape[2]), Math.round(image.shape[1] * y / model.inputs[0].shape[1]),\n ],\n });\n }\n }\n stack.forEach((s) => tf.dispose(s));\n }\n cache.score = cache.keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n const x = cache.keypoints.map((a) => a.position[0]);\n const y = cache.keypoints.map((a) => a.position[1]);\n cache.box = [\n Math.min(...x),\n Math.min(...y),\n Math.max(...x) - Math.min(...x),\n Math.max(...y) - Math.min(...y),\n ];\n const xRaw = cache.keypoints.map((a) => a.positionRaw[0]);\n const yRaw = cache.keypoints.map((a) => a.positionRaw[1]);\n cache.boxRaw = [\n Math.min(...xRaw),\n Math.min(...yRaw),\n Math.max(...xRaw) - Math.min(...xRaw),\n Math.max(...yRaw) - Math.min(...yRaw),\n ];\n for (const [name, indexes] of Object.entries(coords.connected)) {\n const pt: Array = [];\n for (let i = 0; i < indexes.length - 1; i++) {\n const pt0 = cache.keypoints.find((kpt) => kpt.part === indexes[i]);\n const pt1 = cache.keypoints.find((kpt) => kpt.part === indexes[i + 1]);\n if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);\n }\n cache.annotations[name] = pt;\n }\n resolve([cache]);\n });\n}\n", "/**\n * Emotion model implementation\n *\n * [**Oarriaga**](https://github.com/oarriaga/face_classification)\n */\n\nimport type { Emotion } from '../result';\nimport { log, now } from '../util/util';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { env } from '../util/env';\nimport { constants } from '../tfjs/constants';\n\nconst annotations = ['angry', 'disgust', 'fear', 'happy', 'sad', 'surprise', 'neutral'];\nlet model: GraphModel | null;\nconst last: Array> = [];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.emotion?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise> {\n if (!model) return [];\n const skipFrame = skipped < (config.face.emotion?.skipFrames || 0);\n const skipTime = (config.face.emotion?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && last[idx] && (last[idx].length > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const obj: Array<{ score: number, emotion: Emotion }> = [];\n if (config.face.emotion?.enabled) {\n const t: Record = {};\n const inputSize = model?.inputs[0].shape ? model.inputs[0].shape[2] : 0;\n t.resize = tf.image.resizeBilinear(image, [inputSize, inputSize], false);\n // const box = [[0.15, 0.15, 0.85, 0.85]]; // empyrical values for top, left, bottom, right\n // const resize = tf.image.cropAndResize(image, box, [0], [inputSize, inputSize]);\n // [t.red, t.green, t.blue] = tf.split(t.resize, 3, 3);\n // weighted rgb to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\n // t.redNorm = tf.mul(t.red, rgb[0]);\n // t.greenNorm = tf.mul(t.green, rgb[1]);\n // t.blueNorm = tf.mul(t.blue, rgb[2]);\n // t.grayscale = tf.addN([t.redNorm, t.greenNorm, t.blueNorm]);\n t.channels = tf.mul(t.resize, constants.rgb);\n t.grayscale = tf.sum(t.channels, 3, true);\n t.grayscaleSub = tf.sub(t.grayscale, constants.tf05);\n t.grayscaleMul = tf.mul(t.grayscaleSub, constants.tf2);\n t.emotion = model?.execute(t.grayscaleMul) as Tensor; // result is already in range 0..1, no need for additional activation\n lastTime = now();\n const data = await t.emotion.data();\n for (let i = 0; i < data.length; i++) {\n if (data[i] > (config.face.emotion?.minConfidence || 0)) obj.push({ score: Math.min(0.99, Math.trunc(100 * data[i]) / 100), emotion: annotations[i] as Emotion });\n }\n obj.sort((a, b) => b.score - a.score);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "/**\n * EfficientPose model implementation\n *\n * Based on: [**BecauseofAI MobileFace**](https://github.com/becauseofAI/MobileFace)\n *\n * Obsolete and replaced by `faceres` that performs age/gender/descriptor analysis\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nconst last: Array = [];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face['mobilefacenet'].modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n/*\n// convert to black&white to avoid colorization impact\nconst rgb = [0.2989, 0.5870, 0.1140]; // factors for red/green/blue colors when converting to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\nconst [red, green, blue] = tf.split(crop, 3, 3);\nconst redNorm = tf.mul(red, rgb[0]);\nconst greenNorm = tf.mul(green, rgb[1]);\nconst blueNorm = tf.mul(blue, rgb[2]);\nconst grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\nconst merge = tf.stack([grayscale, grayscale, grayscale], 3).squeeze(4);\n\n// optional increase image contrast\n// or do it per-channel so mean is done on each channel\n// or do it based on histogram\nconst mean = merge.mean();\nconst factor = 5;\nconst contrast = merge.sub(mean).mul(factor).add(mean);\n*/\n\nexport async function predict(input: Tensor, config: Config, idx, count): Promise {\n if (!model) return [];\n const skipFrame = skipped < (config.face['embedding']?.skipFrames || 0);\n const skipTime = (config.face['embedding']?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && last[idx]) {\n skipped++;\n return last[idx];\n }\n return new Promise(async (resolve) => {\n let data: Array = [];\n if (config.face['embedding']?.enabled && model?.inputs[0].shape) {\n const t: Record = {};\n t.crop = tf.image.resizeBilinear(input, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false); // just resize to fit the embedding model\n // do a tight crop of image and resize it to fit the model\n // const box = [[0.05, 0.15, 0.85, 0.85]]; // empyrical values for top, left, bottom, right\n // t.crop = tf.image.cropAndResize(input, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n t.data = model?.execute(t.crop) as Tensor;\n /*\n // optional normalize outputs with l2 normalization\n const scaled = tf.tidy(() => {\n const l2 = res.norm('euclidean');\n const scale = res.div(l2);\n return scale;\n });\n\n // optional reduce feature vector complexity\n const reshape = tf.reshape(res, [128, 2]); // split 256 vectors into 128 x 2\n const reduce = reshape.logSumExp(1); // reduce 2nd dimension by calculating logSumExp on it\n */\n const output = await t.data.data();\n data = Array.from(output); // convert typed array to simple array\n }\n last[idx] = data;\n lastCount = count;\n lastTime = now();\n resolve(data);\n });\n}\n", "import * as coords from './facemeshcoords';\nimport * as util from './facemeshutil';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport { env } from '../util/env';\nimport { log } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport type { Config } from '../config';\nimport type { Point } from '../result';\n\nlet model: GraphModel | null;\nlet inputSize = 0;\n\nconst irisEnlarge = 2.3;\n\nconst leftOutline = coords.meshAnnotations['leftEyeLower0'];\nconst rightOutline = coords.meshAnnotations['rightEyeLower0'];\n\nconst eyeLandmarks = {\n leftBounds: [leftOutline[0], leftOutline[leftOutline.length - 1]],\n rightBounds: [rightOutline[0], rightOutline[rightOutline.length - 1]],\n};\n\nconst irisLandmarks = {\n upperCenter: 3,\n lowerCenter: 4,\n index: 71,\n numCoordinates: 76,\n};\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.iris?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n inputSize = model.inputs[0].shape ? model.inputs[0].shape[2] : 0;\n if (inputSize === -1) inputSize = 64;\n return model;\n}\n\n// Replace the raw coordinates returned by facemesh with refined iris model coordinates\n// Update the z coordinate to be an average of the original and the new.\nfunction replaceRawCoordinates(rawCoords, newCoords, prefix, keys) {\n for (let i = 0; i < coords.MESH_TO_IRIS_INDICES_MAP.length; i++) {\n const { key, indices } = coords.MESH_TO_IRIS_INDICES_MAP[i];\n const originalIndices = coords.meshAnnotations[`${prefix}${key}`];\n if (!keys || keys.includes(key)) {\n for (let j = 0; j < indices.length; j++) {\n const index = indices[j];\n rawCoords[originalIndices[j]] = [\n newCoords[index][0], newCoords[index][1],\n (newCoords[index][2] + rawCoords[originalIndices[j]][2]) / 2,\n ];\n }\n }\n }\n}\n\n// eslint-disable-next-line class-methods-use-this\nexport const getLeftToRightEyeDepthDifference = (rawCoords) => {\n const leftEyeZ = rawCoords[eyeLandmarks.leftBounds[0]][2];\n const rightEyeZ = rawCoords[eyeLandmarks.rightBounds[0]][2];\n return leftEyeZ - rightEyeZ;\n};\n\n// Returns a box describing a cropped region around the eye fit for passing to the iris model.\nexport const getEyeBox = (rawCoords, face, eyeInnerCornerIndex, eyeOuterCornerIndex, meshSize, flip = false) => {\n const box = util.squarifyBox(util.enlargeBox(util.calculateLandmarksBoundingBox([rawCoords[eyeInnerCornerIndex], rawCoords[eyeOuterCornerIndex]]), irisEnlarge));\n const boxSize = util.getBoxSize(box);\n let crop = tf.image.cropAndResize(face, [[\n box.startPoint[1] / meshSize,\n box.startPoint[0] / meshSize, box.endPoint[1] / meshSize,\n box.endPoint[0] / meshSize,\n ]], [0], [inputSize, inputSize]);\n if (flip && env.kernels.includes('flipleftright')) {\n const flipped = tf.image.flipLeftRight(crop); // flipLeftRight is not defined for tfjs-node\n tf.dispose(crop);\n crop = flipped;\n }\n return { box, boxSize, crop };\n};\n\n// Given a cropped image of an eye, returns the coordinates of the contours surrounding the eye and the iris.\nexport const getEyeCoords = (eyeData, eyeBox, eyeBoxSize, flip = false) => {\n const eyeRawCoords: Array = [];\n for (let i = 0; i < irisLandmarks.numCoordinates; i++) {\n const x = eyeData[i * 3];\n const y = eyeData[i * 3 + 1];\n const z = eyeData[i * 3 + 2];\n eyeRawCoords.push([\n (flip ? (1 - (x / inputSize)) : (x / inputSize)) * eyeBoxSize[0] + eyeBox.startPoint[0],\n (y / inputSize) * eyeBoxSize[1] + eyeBox.startPoint[1], z,\n ]);\n }\n return { rawCoords: eyeRawCoords, iris: eyeRawCoords.slice(irisLandmarks.index) };\n};\n\n// The z-coordinates returned for the iris are unreliable, so we take the z values from the surrounding keypoints.\n// eslint-disable-next-line class-methods-use-this\nexport const getAdjustedIrisCoords = (rawCoords, irisCoords, direction) => {\n const upperCenterZ = rawCoords[coords.meshAnnotations[`${direction}EyeUpper0`][irisLandmarks.upperCenter]][2];\n const lowerCenterZ = rawCoords[coords.meshAnnotations[`${direction}EyeLower0`][irisLandmarks.lowerCenter]][2];\n const averageZ = (upperCenterZ + lowerCenterZ) / 2;\n // Iris indices: 0: center | 1: right | 2: above | 3: left | 4: below\n return irisCoords.map((coord, i) => {\n let z = averageZ;\n if (i === 2) {\n z = upperCenterZ;\n } else if (i === 4) {\n z = lowerCenterZ;\n }\n return [coord[0], coord[1], z];\n });\n};\n\nexport async function augmentIris(rawCoords, face, config, meshSize) {\n if (!model) {\n if (config.debug) log('face mesh iris detection requested, but model is not loaded');\n return rawCoords;\n }\n const { box: leftEyeBox, boxSize: leftEyeBoxSize, crop: leftEyeCrop } = getEyeBox(rawCoords, face, eyeLandmarks.leftBounds[0], eyeLandmarks.leftBounds[1], meshSize, true);\n const { box: rightEyeBox, boxSize: rightEyeBoxSize, crop: rightEyeCrop } = getEyeBox(rawCoords, face, eyeLandmarks.rightBounds[0], eyeLandmarks.rightBounds[1], meshSize, true);\n const combined = tf.concat([leftEyeCrop, rightEyeCrop]);\n tf.dispose(leftEyeCrop);\n tf.dispose(rightEyeCrop);\n const eyePredictions = model.execute(combined) as Tensor;\n tf.dispose(combined);\n const eyePredictionsData = await eyePredictions.data();\n tf.dispose(eyePredictions);\n const leftEyeData = eyePredictionsData.slice(0, irisLandmarks.numCoordinates * 3);\n const { rawCoords: leftEyeRawCoords, iris: leftIrisRawCoords } = getEyeCoords(leftEyeData, leftEyeBox, leftEyeBoxSize, true);\n const rightEyeData = eyePredictionsData.slice(irisLandmarks.numCoordinates * 3);\n const { rawCoords: rightEyeRawCoords, iris: rightIrisRawCoords } = getEyeCoords(rightEyeData, rightEyeBox, rightEyeBoxSize);\n const leftToRightEyeDepthDifference = getLeftToRightEyeDepthDifference(rawCoords);\n if (Math.abs(leftToRightEyeDepthDifference) < 30) { // User is looking straight ahead.\n replaceRawCoordinates(rawCoords, leftEyeRawCoords, 'left', null);\n replaceRawCoordinates(rawCoords, rightEyeRawCoords, 'right', null);\n // If the user is looking to the left or to the right, the iris coordinates tend to diverge too much from the mesh coordinates for them to be merged\n // So we only update a single contour line above and below the eye.\n } else if (leftToRightEyeDepthDifference < 1) { // User is looking towards the right.\n replaceRawCoordinates(rawCoords, leftEyeRawCoords, 'left', ['EyeUpper0', 'EyeLower0']);\n } else { // User is looking towards the left.\n replaceRawCoordinates(rawCoords, rightEyeRawCoords, 'right', ['EyeUpper0', 'EyeLower0']);\n }\n const adjustedLeftIrisCoords = getAdjustedIrisCoords(rawCoords, leftIrisRawCoords, 'left');\n const adjustedRightIrisCoords = getAdjustedIrisCoords(rawCoords, rightIrisRawCoords, 'right');\n const newCoords = rawCoords.concat(adjustedLeftIrisCoords).concat(adjustedRightIrisCoords);\n return newCoords;\n}\n", "/**\n * BlazeFace, FaceMesh & Iris model implementation\n *\n * Based on:\n * - [**MediaPipe BlazeFace**](https://drive.google.com/file/d/1f39lSzU5Oq-j_OXgS67KfN5wNsoeAZ4V/view)\n * - Facial Spacial Geometry: [**MediaPipe FaceMesh**](https://drive.google.com/file/d/1VFC_wIpw4O7xBOiTgUldl79d9LA-LsnA/view)\n * - Eye Iris Details: [**MediaPipe Iris**](https://drive.google.com/file/d/1bsWbokp9AklH2ANjCfmjqEzzxO1CNbMu/view)\n */\n\nimport { log, now } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as blazeface from './blazeface';\nimport * as util from './facemeshutil';\nimport * as coords from './facemeshcoords';\nimport * as iris from './iris';\nimport { histogramEqualization } from '../image/enhance';\nimport { env } from '../util/env';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { FaceResult, FaceLandmark, Point } from '../result';\nimport type { Config } from '../config';\n\ntype DetectBox = { startPoint: Point, endPoint: Point, landmarks: Array, confidence: number };\n\nconst cache = {\n boxes: [] as DetectBox[],\n skipped: Number.MAX_SAFE_INTEGER,\n timestamp: 0,\n};\n\nlet model: GraphModel | null = null;\nlet inputSize = 0;\n\nexport async function predict(input: Tensor, config: Config): Promise {\n // reset cached boxes\n const skipTime = (config.face.detector?.skipTime || 0) > (now() - cache.timestamp);\n const skipFrame = cache.skipped < (config.face.detector?.skipFrames || 0);\n if (!config.skipAllowed || !skipTime || !skipFrame || cache.boxes.length === 0) {\n cache.boxes = await blazeface.getBoxes(input, config); // get results from blazeface detector\n cache.timestamp = now();\n cache.skipped = 0;\n } else {\n cache.skipped++;\n }\n const faces: Array = [];\n const newCache: Array = [];\n let id = 0;\n for (let i = 0; i < cache.boxes.length; i++) {\n const box = cache.boxes[i];\n let angle = 0;\n let rotationMatrix;\n const face: FaceResult = { // init face result\n id: id++,\n mesh: [],\n meshRaw: [],\n box: [0, 0, 0, 0],\n boxRaw: [0, 0, 0, 0],\n score: 0,\n boxScore: 0,\n faceScore: 0,\n annotations: {} as Record,\n };\n\n // optional rotation correction based on detector data only if mesh is disabled otherwise perform it later when we have more accurate mesh data. if no rotation correction this function performs crop\n [angle, rotationMatrix, face.tensor] = util.correctFaceRotation(config.face.detector?.rotation, box, input, config.face.mesh?.enabled ? inputSize : blazeface.size());\n if (config?.filter?.equalization) {\n const equilized = await histogramEqualization(face.tensor as Tensor);\n tf.dispose(face.tensor);\n face.tensor = equilized;\n }\n face.boxScore = Math.round(100 * box.confidence) / 100;\n if (!config.face.mesh?.enabled) { // mesh not enabled, return resuts from detector only\n face.box = util.clampBox(box, input);\n face.boxRaw = util.getRawBox(box, input);\n face.score = face.boxScore;\n face.mesh = box.landmarks.map((pt) => [\n ((box.startPoint[0] + box.endPoint[0])) / 2 + ((box.endPoint[0] + box.startPoint[0]) * pt[0] / blazeface.size()),\n ((box.startPoint[1] + box.endPoint[1])) / 2 + ((box.endPoint[1] + box.startPoint[1]) * pt[1] / blazeface.size()),\n ]);\n face.meshRaw = face.mesh.map((pt) => [pt[0] / (input.shape[2] || 0), pt[1] / (input.shape[1] || 0), (pt[2] || 0) / inputSize]);\n for (const key of Object.keys(coords.blazeFaceLandmarks)) face.annotations[key] = [face.mesh[coords.blazeFaceLandmarks[key] as number]]; // add annotations\n } else if (!model) { // mesh enabled, but not loaded\n if (config.debug) log('face mesh detection requested, but model is not loaded');\n } else { // mesh enabled\n const [contours, confidence, contourCoords] = model.execute(face.tensor as Tensor) as Array; // first returned tensor represents facial contours which are already included in the coordinates.\n const faceConfidence = await confidence.data();\n face.faceScore = Math.round(100 * faceConfidence[0]) / 100;\n const coordsReshaped = tf.reshape(contourCoords, [-1, 3]);\n let rawCoords = await coordsReshaped.array();\n tf.dispose([contourCoords, coordsReshaped, confidence, contours]);\n if (face.faceScore < (config.face.detector?.minConfidence || 1)) { // low confidence in detected mesh\n box.confidence = face.faceScore; // reset confidence of cached box\n } else {\n if (config.face.iris?.enabled) rawCoords = await iris.augmentIris(rawCoords, face.tensor, config, inputSize); // augment results with iris\n face.mesh = util.transformRawCoords(rawCoords, box, angle, rotationMatrix, inputSize); // get processed mesh\n face.meshRaw = face.mesh.map((pt) => [pt[0] / (input.shape[2] || 0), pt[1] / (input.shape[1] || 0), (pt[2] || 0) / inputSize]);\n for (const key of Object.keys(coords.meshAnnotations)) face.annotations[key] = coords.meshAnnotations[key].map((index) => face.mesh[index]); // add annotations\n face.score = face.faceScore;\n const calculatedBox = { ...util.calculateFaceBox(face.mesh, box), confidence: box.confidence, landmarks: box.landmarks };\n face.box = util.clampBox(calculatedBox, input);\n face.boxRaw = util.getRawBox(calculatedBox, input);\n newCache.push(calculatedBox);\n }\n }\n if (face.score > (config.face.detector?.minConfidence || 1)) faces.push(face);\n else tf.dispose(face.tensor);\n }\n cache.boxes = newCache; // reset cache\n return faces;\n}\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.mesh?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n inputSize = model.inputs[0].shape ? model.inputs[0].shape[2] : 0;\n return model;\n}\n\nexport const triangulation = coords.TRI468;\nexport const uvmap = coords.UV468;\n", "/**\n * FaceRes model implementation\n *\n * Returns Age, Gender, Descriptor\n * Implements Face simmilarity function\n *\n * Based on: [**HSE-FaceRes**](https://github.com/HSE-asavchenko/HSE_FaceRec_tf)\n */\n\nimport { log, now } from '../util/util';\nimport { env } from '../util/env';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport type { Config } from '../config';\nimport type { Gender, Race } from '../result';\n\nexport type FaceRes = { age: number, gender: Gender, genderScore: number, descriptor: number[], race?: { score: number, race: Race }[] };\n\nlet model: GraphModel | null;\nconst last: Array<{\n age: number,\n gender: Gender,\n genderScore: number,\n descriptor: number[],\n}> = [];\n\nlet lastTime = 0;\nlet lastCount = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.description?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport function enhance(input): Tensor {\n const tensor = (input.image || input.tensor || input) as Tensor; // input received from detector is already normalized to 0..1, input is also assumed to be straightened\n if (!model?.inputs[0].shape) return tensor; // model has no shape so no point continuing\n const crop = tf.image.resizeBilinear(tensor, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n const norm = tf.mul(crop, constants.tf255);\n tf.dispose(crop);\n return norm;\n /*\n // do a tight crop of image and resize it to fit the model\n const box = [[0.05, 0.15, 0.85, 0.85]]; // empyrical values for top, left, bottom, right\n const crop = (tensor.shape.length === 3)\n ? tf.image.cropAndResize(tf.expandDims(tensor, 0), box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]) // add batch dimension if missing\n : tf.image.cropAndResize(tensor, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n */\n /*\n // convert to black&white to avoid colorization impact\n const rgb = [0.2989, 0.5870, 0.1140]; // factors for red/green/blue colors when converting to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\n const [red, green, blue] = tf.split(crop, 3, 3);\n const redNorm = tf.mul(red, rgb[0]);\n const greenNorm = tf.mul(green, rgb[1]);\n const blueNorm = tf.mul(blue, rgb[2]);\n const grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\n const merge = tf.stack([grayscale, grayscale, grayscale], 3).squeeze(4);\n */\n}\n\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise {\n if (!model) return { age: 0, gender: 'unknown', genderScore: 0, descriptor: [] };\n const skipFrame = skipped < (config.face.description?.skipFrames || 0);\n const skipTime = (config.face.description?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipFrame && skipTime && (lastCount === count) && last[idx]?.age && (last[idx]?.age > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const obj = {\n age: 0,\n gender: 'unknown',\n genderScore: 0,\n descriptor: [],\n };\n\n if (config.face.description?.enabled) {\n const enhanced = enhance(image);\n const resT = model?.execute(enhanced) as Tensor[];\n lastTime = now();\n tf.dispose(enhanced);\n const genderT = await resT.find((t) => t.shape[1] === 1) as Tensor;\n const gender = await genderT.data();\n const confidence = Math.trunc(200 * Math.abs((gender[0] - 0.5))) / 100;\n if (confidence > (config.face.description?.minConfidence || 0)) {\n obj.gender = gender[0] <= 0.5 ? 'female' : 'male';\n obj.genderScore = Math.min(0.99, confidence);\n }\n const argmax = tf.argMax(resT.find((t) => t.shape[1] === 100), 1);\n const age = (await argmax.data())[0];\n tf.dispose(argmax);\n const ageT = resT.find((t) => t.shape[1] === 100) as Tensor;\n const all = await ageT.data();\n obj.age = Math.round(all[age - 1] > all[age + 1] ? 10 * age - 100 * all[age - 1] : 10 * age + 100 * all[age + 1]) / 10;\n\n const desc = resT.find((t) => t.shape[1] === 1024);\n // const reshape = desc.reshape([128, 8]); // reshape large 1024-element descriptor to 128 x 8\n // const reduce = reshape.logSumExp(1); // reduce 2nd dimension by calculating logSumExp on it which leaves us with 128-element descriptor\n const descriptor = desc ? await desc.data() : [];\n obj.descriptor = Array.from(descriptor);\n resT.forEach((t) => tf.dispose(t));\n }\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport type { Point } from '../result';\n\nexport function getBoxSize(box) {\n return [\n Math.abs(box.endPoint[0] - box.startPoint[0]),\n Math.abs(box.endPoint[1] - box.startPoint[1]),\n ];\n}\n\nexport function getBoxCenter(box) {\n return [\n box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2,\n box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2,\n ];\n}\n\nexport function cutBoxFromImageAndResize(box, image, cropSize) {\n const h = image.shape[1];\n const w = image.shape[2];\n const boxes = [[\n box.startPoint[1] / h,\n box.startPoint[0] / w,\n box.endPoint[1] / h,\n box.endPoint[0] / w,\n ]];\n return tf.image.cropAndResize(image, boxes, [0], cropSize);\n}\n\nexport function scaleBoxCoordinates(box, factor) {\n const startPoint = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]] as Point;\n const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]] as Point;\n const palmLandmarks = box.palmLandmarks.map((coord) => {\n const scaledCoord = [coord[0] * factor[0], coord[1] * factor[1]];\n return scaledCoord;\n });\n return { startPoint, endPoint, palmLandmarks, confidence: box.confidence };\n}\n\nexport function enlargeBox(box, factor = 1.5) {\n const center = getBoxCenter(box);\n const size = getBoxSize(box);\n const newHalfSize = [factor * size[0] / 2, factor * size[1] / 2];\n const startPoint = [center[0] - newHalfSize[0], center[1] - newHalfSize[1]] as Point;\n const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]] as Point;\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n\nexport function squarifyBox(box) {\n const centers = getBoxCenter(box);\n const size = getBoxSize(box);\n const maxEdge = Math.max(...size);\n const halfSize = maxEdge / 2;\n const startPoint = [centers[0] - halfSize, centers[1] - halfSize] as Point;\n const endPoint = [centers[0] + halfSize, centers[1] + halfSize] as Point;\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n\nexport function shiftBox(box, shiftFactor) {\n const boxSize = [\n box.endPoint[0] - box.startPoint[0],\n box.endPoint[1] - box.startPoint[1],\n ];\n const shiftVector = [boxSize[0] * shiftFactor[0], boxSize[1] * shiftFactor[1]];\n const startPoint = [box.startPoint[0] + shiftVector[0], box.startPoint[1] + shiftVector[1]] as Point;\n const endPoint = [box.endPoint[0] + shiftVector[0], box.endPoint[1] + shiftVector[1]] as Point;\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n\nexport function normalizeRadians(angle) {\n return angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI));\n}\n\nexport function computeRotation(point1, point2) {\n const radians = Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]);\n return normalizeRadians(radians);\n}\n\nexport const buildTranslationMatrix = (x, y) => [[1, 0, x], [0, 1, y], [0, 0, 1]];\n\nexport function dot(v1, v2) {\n let product = 0;\n for (let i = 0; i < v1.length; i++) {\n product += v1[i] * v2[i];\n }\n return product;\n}\n\nexport function getColumnFrom2DArr(arr, columnIndex) {\n const column: Array = [];\n for (let i = 0; i < arr.length; i++) {\n column.push(arr[i][columnIndex]);\n }\n return column;\n}\n\nexport function multiplyTransformMatrices(mat1, mat2) {\n const product: Array = [];\n const size = mat1.length;\n for (let row = 0; row < size; row++) {\n product.push([]);\n for (let col = 0; col < size; col++) {\n product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col)));\n }\n }\n return product;\n}\n\nexport function buildRotationMatrix(rotation, center) {\n const cosA = Math.cos(rotation);\n const sinA = Math.sin(rotation);\n const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]];\n const translationMatrix = buildTranslationMatrix(center[0], center[1]);\n const translationTimesRotation = multiplyTransformMatrices(translationMatrix, rotationMatrix);\n const negativeTranslationMatrix = buildTranslationMatrix(-center[0], -center[1]);\n return multiplyTransformMatrices(translationTimesRotation, negativeTranslationMatrix);\n}\n\nexport function invertTransformMatrix(matrix) {\n const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]];\n const translationComponent = [matrix[0][2], matrix[1][2]];\n const invertedTranslation = [\n -dot(rotationComponent[0], translationComponent),\n -dot(rotationComponent[1], translationComponent),\n ];\n return [\n rotationComponent[0].concat(invertedTranslation[0]),\n rotationComponent[1].concat(invertedTranslation[1]),\n [0, 0, 1],\n ];\n}\n\nexport function rotatePoint(homogeneousCoordinate, rotationMatrix) {\n return [\n dot(homogeneousCoordinate, rotationMatrix[0]),\n dot(homogeneousCoordinate, rotationMatrix[1]),\n ];\n}\n", "/**\n * HandPose model implementation constants\n * See `handpose.ts` for entry point\n */\n\nexport const anchors = [\n { x: 0.015625, y: 0.015625 },\n { x: 0.015625, y: 0.015625 },\n { x: 0.046875, y: 0.015625 },\n { x: 0.046875, y: 0.015625 },\n { x: 0.078125, y: 0.015625 },\n { x: 0.078125, y: 0.015625 },\n { x: 0.109375, y: 0.015625 },\n { x: 0.109375, y: 0.015625 },\n { x: 0.140625, y: 0.015625 },\n { x: 0.140625, y: 0.015625 },\n { x: 0.171875, y: 0.015625 },\n { x: 0.171875, y: 0.015625 },\n { x: 0.203125, y: 0.015625 },\n { x: 0.203125, y: 0.015625 },\n { x: 0.234375, y: 0.015625 },\n { x: 0.234375, y: 0.015625 },\n { x: 0.265625, y: 0.015625 },\n { x: 0.265625, y: 0.015625 },\n { x: 0.296875, y: 0.015625 },\n { x: 0.296875, y: 0.015625 },\n { x: 0.328125, y: 0.015625 },\n { x: 0.328125, y: 0.015625 },\n { x: 0.359375, y: 0.015625 },\n { x: 0.359375, y: 0.015625 },\n { x: 0.390625, y: 0.015625 },\n { x: 0.390625, y: 0.015625 },\n { x: 0.421875, y: 0.015625 },\n { x: 0.421875, y: 0.015625 },\n { x: 0.453125, y: 0.015625 },\n { x: 0.453125, y: 0.015625 },\n { x: 0.484375, y: 0.015625 },\n { x: 0.484375, y: 0.015625 },\n { x: 0.515625, y: 0.015625 },\n { x: 0.515625, y: 0.015625 },\n { x: 0.546875, y: 0.015625 },\n { x: 0.546875, y: 0.015625 },\n { x: 0.578125, y: 0.015625 },\n { x: 0.578125, y: 0.015625 },\n { x: 0.609375, y: 0.015625 },\n { x: 0.609375, y: 0.015625 },\n { x: 0.640625, y: 0.015625 },\n { x: 0.640625, y: 0.015625 },\n { x: 0.671875, y: 0.015625 },\n { x: 0.671875, y: 0.015625 },\n { x: 0.703125, y: 0.015625 },\n { x: 0.703125, y: 0.015625 },\n { x: 0.734375, y: 0.015625 },\n { x: 0.734375, y: 0.015625 },\n { x: 0.765625, y: 0.015625 },\n { x: 0.765625, y: 0.015625 },\n { x: 0.796875, y: 0.015625 },\n { x: 0.796875, y: 0.015625 },\n { x: 0.828125, y: 0.015625 },\n { x: 0.828125, y: 0.015625 },\n { x: 0.859375, y: 0.015625 },\n { x: 0.859375, y: 0.015625 },\n { x: 0.890625, y: 0.015625 },\n { x: 0.890625, y: 0.015625 },\n { x: 0.921875, y: 0.015625 },\n { x: 0.921875, y: 0.015625 },\n { x: 0.953125, y: 0.015625 },\n { x: 0.953125, y: 0.015625 },\n { x: 0.984375, y: 0.015625 },\n { x: 0.984375, y: 0.015625 },\n { x: 0.015625, y: 0.046875 },\n { x: 0.015625, y: 0.046875 },\n { x: 0.046875, y: 0.046875 },\n { x: 0.046875, y: 0.046875 },\n { x: 0.078125, y: 0.046875 },\n { x: 0.078125, y: 0.046875 },\n { x: 0.109375, y: 0.046875 },\n { x: 0.109375, y: 0.046875 },\n { x: 0.140625, y: 0.046875 },\n { x: 0.140625, y: 0.046875 },\n { x: 0.171875, y: 0.046875 },\n { x: 0.171875, y: 0.046875 },\n { x: 0.203125, y: 0.046875 },\n { x: 0.203125, y: 0.046875 },\n { x: 0.234375, y: 0.046875 },\n { x: 0.234375, y: 0.046875 },\n { x: 0.265625, y: 0.046875 },\n { x: 0.265625, y: 0.046875 },\n { x: 0.296875, y: 0.046875 },\n { x: 0.296875, y: 0.046875 },\n { x: 0.328125, y: 0.046875 },\n { x: 0.328125, y: 0.046875 },\n { x: 0.359375, y: 0.046875 },\n { x: 0.359375, y: 0.046875 },\n { x: 0.390625, y: 0.046875 },\n { x: 0.390625, y: 0.046875 },\n { x: 0.421875, y: 0.046875 },\n { x: 0.421875, y: 0.046875 },\n { x: 0.453125, y: 0.046875 },\n { x: 0.453125, y: 0.046875 },\n { x: 0.484375, y: 0.046875 },\n { x: 0.484375, y: 0.046875 },\n { x: 0.515625, y: 0.046875 },\n { x: 0.515625, y: 0.046875 },\n { x: 0.546875, y: 0.046875 },\n { x: 0.546875, y: 0.046875 },\n { x: 0.578125, y: 0.046875 },\n { x: 0.578125, y: 0.046875 },\n { x: 0.609375, y: 0.046875 },\n { x: 0.609375, y: 0.046875 },\n { x: 0.640625, y: 0.046875 },\n { x: 0.640625, y: 0.046875 },\n { x: 0.671875, y: 0.046875 },\n { x: 0.671875, y: 0.046875 },\n { x: 0.703125, y: 0.046875 },\n { x: 0.703125, y: 0.046875 },\n { x: 0.734375, y: 0.046875 },\n { x: 0.734375, y: 0.046875 },\n { x: 0.765625, y: 0.046875 },\n { x: 0.765625, y: 0.046875 },\n { x: 0.796875, y: 0.046875 },\n { x: 0.796875, y: 0.046875 },\n { x: 0.828125, y: 0.046875 },\n { x: 0.828125, y: 0.046875 },\n { x: 0.859375, y: 0.046875 },\n { x: 0.859375, y: 0.046875 },\n { x: 0.890625, y: 0.046875 },\n { x: 0.890625, y: 0.046875 },\n { x: 0.921875, y: 0.046875 },\n { x: 0.921875, y: 0.046875 },\n { x: 0.953125, y: 0.046875 },\n { x: 0.953125, y: 0.046875 },\n { x: 0.984375, y: 0.046875 },\n { x: 0.984375, y: 0.046875 },\n { x: 0.015625, y: 0.078125 },\n { x: 0.015625, y: 0.078125 },\n { x: 0.046875, y: 0.078125 },\n { x: 0.046875, y: 0.078125 },\n { x: 0.078125, y: 0.078125 },\n { x: 0.078125, y: 0.078125 },\n { x: 0.109375, y: 0.078125 },\n { x: 0.109375, y: 0.078125 },\n { x: 0.140625, y: 0.078125 },\n { x: 0.140625, y: 0.078125 },\n { x: 0.171875, y: 0.078125 },\n { x: 0.171875, y: 0.078125 },\n { x: 0.203125, y: 0.078125 },\n { x: 0.203125, y: 0.078125 },\n { x: 0.234375, y: 0.078125 },\n { x: 0.234375, y: 0.078125 },\n { x: 0.265625, y: 0.078125 },\n { x: 0.265625, y: 0.078125 },\n { x: 0.296875, y: 0.078125 },\n { x: 0.296875, y: 0.078125 },\n { x: 0.328125, y: 0.078125 },\n { x: 0.328125, y: 0.078125 },\n { x: 0.359375, y: 0.078125 },\n { x: 0.359375, y: 0.078125 },\n { x: 0.390625, y: 0.078125 },\n { x: 0.390625, y: 0.078125 },\n { x: 0.421875, y: 0.078125 },\n { x: 0.421875, y: 0.078125 },\n { x: 0.453125, y: 0.078125 },\n { x: 0.453125, y: 0.078125 },\n { x: 0.484375, y: 0.078125 },\n { x: 0.484375, y: 0.078125 },\n { x: 0.515625, y: 0.078125 },\n { x: 0.515625, y: 0.078125 },\n { x: 0.546875, y: 0.078125 },\n { x: 0.546875, y: 0.078125 },\n { x: 0.578125, y: 0.078125 },\n { x: 0.578125, y: 0.078125 },\n { x: 0.609375, y: 0.078125 },\n { x: 0.609375, y: 0.078125 },\n { x: 0.640625, y: 0.078125 },\n { x: 0.640625, y: 0.078125 },\n { x: 0.671875, y: 0.078125 },\n { x: 0.671875, y: 0.078125 },\n { x: 0.703125, y: 0.078125 },\n { x: 0.703125, y: 0.078125 },\n { x: 0.734375, y: 0.078125 },\n { x: 0.734375, y: 0.078125 },\n { x: 0.765625, y: 0.078125 },\n { x: 0.765625, y: 0.078125 },\n { x: 0.796875, y: 0.078125 },\n { x: 0.796875, y: 0.078125 },\n { x: 0.828125, y: 0.078125 },\n { x: 0.828125, y: 0.078125 },\n { x: 0.859375, y: 0.078125 },\n { x: 0.859375, y: 0.078125 },\n { x: 0.890625, y: 0.078125 },\n { x: 0.890625, y: 0.078125 },\n { x: 0.921875, y: 0.078125 },\n { x: 0.921875, y: 0.078125 },\n { x: 0.953125, y: 0.078125 },\n { x: 0.953125, y: 0.078125 },\n { x: 0.984375, y: 0.078125 },\n { x: 0.984375, y: 0.078125 },\n { x: 0.015625, y: 0.109375 },\n { x: 0.015625, y: 0.109375 },\n { x: 0.046875, y: 0.109375 },\n { x: 0.046875, y: 0.109375 },\n { x: 0.078125, y: 0.109375 },\n { x: 0.078125, y: 0.109375 },\n { x: 0.109375, y: 0.109375 },\n { x: 0.109375, y: 0.109375 },\n { x: 0.140625, y: 0.109375 },\n { x: 0.140625, y: 0.109375 },\n { x: 0.171875, y: 0.109375 },\n { x: 0.171875, y: 0.109375 },\n { x: 0.203125, y: 0.109375 },\n { x: 0.203125, y: 0.109375 },\n { x: 0.234375, y: 0.109375 },\n { x: 0.234375, y: 0.109375 },\n { x: 0.265625, y: 0.109375 },\n { x: 0.265625, y: 0.109375 },\n { x: 0.296875, y: 0.109375 },\n { x: 0.296875, y: 0.109375 },\n { x: 0.328125, y: 0.109375 },\n { x: 0.328125, y: 0.109375 },\n { x: 0.359375, y: 0.109375 },\n { x: 0.359375, y: 0.109375 },\n { x: 0.390625, y: 0.109375 },\n { x: 0.390625, y: 0.109375 },\n { x: 0.421875, y: 0.109375 },\n { x: 0.421875, y: 0.109375 },\n { x: 0.453125, y: 0.109375 },\n { x: 0.453125, y: 0.109375 },\n { x: 0.484375, y: 0.109375 },\n { x: 0.484375, y: 0.109375 },\n { x: 0.515625, y: 0.109375 },\n { x: 0.515625, y: 0.109375 },\n { x: 0.546875, y: 0.109375 },\n { x: 0.546875, y: 0.109375 },\n { x: 0.578125, y: 0.109375 },\n { x: 0.578125, y: 0.109375 },\n { x: 0.609375, y: 0.109375 },\n { x: 0.609375, y: 0.109375 },\n { x: 0.640625, y: 0.109375 },\n { x: 0.640625, y: 0.109375 },\n { x: 0.671875, y: 0.109375 },\n { x: 0.671875, y: 0.109375 },\n { x: 0.703125, y: 0.109375 },\n { x: 0.703125, y: 0.109375 },\n { x: 0.734375, y: 0.109375 },\n { x: 0.734375, y: 0.109375 },\n { x: 0.765625, y: 0.109375 },\n { x: 0.765625, y: 0.109375 },\n { x: 0.796875, y: 0.109375 },\n { x: 0.796875, y: 0.109375 },\n { x: 0.828125, y: 0.109375 },\n { x: 0.828125, y: 0.109375 },\n { x: 0.859375, y: 0.109375 },\n { x: 0.859375, y: 0.109375 },\n { x: 0.890625, y: 0.109375 },\n { x: 0.890625, y: 0.109375 },\n { x: 0.921875, y: 0.109375 },\n { x: 0.921875, y: 0.109375 },\n { x: 0.953125, y: 0.109375 },\n { x: 0.953125, y: 0.109375 },\n { x: 0.984375, y: 0.109375 },\n { x: 0.984375, y: 0.109375 },\n { x: 0.015625, y: 0.140625 },\n { x: 0.015625, y: 0.140625 },\n { x: 0.046875, y: 0.140625 },\n { x: 0.046875, y: 0.140625 },\n { x: 0.078125, y: 0.140625 },\n { x: 0.078125, y: 0.140625 },\n { x: 0.109375, y: 0.140625 },\n { x: 0.109375, y: 0.140625 },\n { x: 0.140625, y: 0.140625 },\n { x: 0.140625, y: 0.140625 },\n { x: 0.171875, y: 0.140625 },\n { x: 0.171875, y: 0.140625 },\n { x: 0.203125, y: 0.140625 },\n { x: 0.203125, y: 0.140625 },\n { x: 0.234375, y: 0.140625 },\n { x: 0.234375, y: 0.140625 },\n { x: 0.265625, y: 0.140625 },\n { x: 0.265625, y: 0.140625 },\n { x: 0.296875, y: 0.140625 },\n { x: 0.296875, y: 0.140625 },\n { x: 0.328125, y: 0.140625 },\n { x: 0.328125, y: 0.140625 },\n { x: 0.359375, y: 0.140625 },\n { x: 0.359375, y: 0.140625 },\n { x: 0.390625, y: 0.140625 },\n { x: 0.390625, y: 0.140625 },\n { x: 0.421875, y: 0.140625 },\n { x: 0.421875, y: 0.140625 },\n { x: 0.453125, y: 0.140625 },\n { x: 0.453125, y: 0.140625 },\n { x: 0.484375, y: 0.140625 },\n { x: 0.484375, y: 0.140625 },\n { x: 0.515625, y: 0.140625 },\n { x: 0.515625, y: 0.140625 },\n { x: 0.546875, y: 0.140625 },\n { x: 0.546875, y: 0.140625 },\n { x: 0.578125, y: 0.140625 },\n { x: 0.578125, y: 0.140625 },\n { x: 0.609375, y: 0.140625 },\n { x: 0.609375, y: 0.140625 },\n { x: 0.640625, y: 0.140625 },\n { x: 0.640625, y: 0.140625 },\n { x: 0.671875, y: 0.140625 },\n { x: 0.671875, y: 0.140625 },\n { x: 0.703125, y: 0.140625 },\n { x: 0.703125, y: 0.140625 },\n { x: 0.734375, y: 0.140625 },\n { x: 0.734375, y: 0.140625 },\n { x: 0.765625, y: 0.140625 },\n { x: 0.765625, y: 0.140625 },\n { x: 0.796875, y: 0.140625 },\n { x: 0.796875, y: 0.140625 },\n { x: 0.828125, y: 0.140625 },\n { x: 0.828125, y: 0.140625 },\n { x: 0.859375, y: 0.140625 },\n { x: 0.859375, y: 0.140625 },\n { x: 0.890625, y: 0.140625 },\n { x: 0.890625, y: 0.140625 },\n { x: 0.921875, y: 0.140625 },\n { x: 0.921875, y: 0.140625 },\n { x: 0.953125, y: 0.140625 },\n { x: 0.953125, y: 0.140625 },\n { x: 0.984375, y: 0.140625 },\n { x: 0.984375, y: 0.140625 },\n { x: 0.015625, y: 0.171875 },\n { x: 0.015625, y: 0.171875 },\n { x: 0.046875, y: 0.171875 },\n { x: 0.046875, y: 0.171875 },\n { x: 0.078125, y: 0.171875 },\n { x: 0.078125, y: 0.171875 },\n { x: 0.109375, y: 0.171875 },\n { x: 0.109375, y: 0.171875 },\n { x: 0.140625, y: 0.171875 },\n { x: 0.140625, y: 0.171875 },\n { x: 0.171875, y: 0.171875 },\n { x: 0.171875, y: 0.171875 },\n { x: 0.203125, y: 0.171875 },\n { x: 0.203125, y: 0.171875 },\n { x: 0.234375, y: 0.171875 },\n { x: 0.234375, y: 0.171875 },\n { x: 0.265625, y: 0.171875 },\n { x: 0.265625, y: 0.171875 },\n { x: 0.296875, y: 0.171875 },\n { x: 0.296875, y: 0.171875 },\n { x: 0.328125, y: 0.171875 },\n { x: 0.328125, y: 0.171875 },\n { x: 0.359375, y: 0.171875 },\n { x: 0.359375, y: 0.171875 },\n { x: 0.390625, y: 0.171875 },\n { x: 0.390625, y: 0.171875 },\n { x: 0.421875, y: 0.171875 },\n { x: 0.421875, y: 0.171875 },\n { x: 0.453125, y: 0.171875 },\n { x: 0.453125, y: 0.171875 },\n { x: 0.484375, y: 0.171875 },\n { x: 0.484375, y: 0.171875 },\n { x: 0.515625, y: 0.171875 },\n { x: 0.515625, y: 0.171875 },\n { x: 0.546875, y: 0.171875 },\n { x: 0.546875, y: 0.171875 },\n { x: 0.578125, y: 0.171875 },\n { x: 0.578125, y: 0.171875 },\n { x: 0.609375, y: 0.171875 },\n { x: 0.609375, y: 0.171875 },\n { x: 0.640625, y: 0.171875 },\n { x: 0.640625, y: 0.171875 },\n { x: 0.671875, y: 0.171875 },\n { x: 0.671875, y: 0.171875 },\n { x: 0.703125, y: 0.171875 },\n { x: 0.703125, y: 0.171875 },\n { x: 0.734375, y: 0.171875 },\n { x: 0.734375, y: 0.171875 },\n { x: 0.765625, y: 0.171875 },\n { x: 0.765625, y: 0.171875 },\n { x: 0.796875, y: 0.171875 },\n { x: 0.796875, y: 0.171875 },\n { x: 0.828125, y: 0.171875 },\n { x: 0.828125, y: 0.171875 },\n { x: 0.859375, y: 0.171875 },\n { x: 0.859375, y: 0.171875 },\n { x: 0.890625, y: 0.171875 },\n { x: 0.890625, y: 0.171875 },\n { x: 0.921875, y: 0.171875 },\n { x: 0.921875, y: 0.171875 },\n { x: 0.953125, y: 0.171875 },\n { x: 0.953125, y: 0.171875 },\n { x: 0.984375, y: 0.171875 },\n { x: 0.984375, y: 0.171875 },\n { x: 0.015625, y: 0.203125 },\n { x: 0.015625, y: 0.203125 },\n { x: 0.046875, y: 0.203125 },\n { x: 0.046875, y: 0.203125 },\n { x: 0.078125, y: 0.203125 },\n { x: 0.078125, y: 0.203125 },\n { x: 0.109375, y: 0.203125 },\n { x: 0.109375, y: 0.203125 },\n { x: 0.140625, y: 0.203125 },\n { x: 0.140625, y: 0.203125 },\n { x: 0.171875, y: 0.203125 },\n { x: 0.171875, y: 0.203125 },\n { x: 0.203125, y: 0.203125 },\n { x: 0.203125, y: 0.203125 },\n { x: 0.234375, y: 0.203125 },\n { x: 0.234375, y: 0.203125 },\n { x: 0.265625, y: 0.203125 },\n { x: 0.265625, y: 0.203125 },\n { x: 0.296875, y: 0.203125 },\n { x: 0.296875, y: 0.203125 },\n { x: 0.328125, y: 0.203125 },\n { x: 0.328125, y: 0.203125 },\n { x: 0.359375, y: 0.203125 },\n { x: 0.359375, y: 0.203125 },\n { x: 0.390625, y: 0.203125 },\n { x: 0.390625, y: 0.203125 },\n { x: 0.421875, y: 0.203125 },\n { x: 0.421875, y: 0.203125 },\n { x: 0.453125, y: 0.203125 },\n { x: 0.453125, y: 0.203125 },\n { x: 0.484375, y: 0.203125 },\n { x: 0.484375, y: 0.203125 },\n { x: 0.515625, y: 0.203125 },\n { x: 0.515625, y: 0.203125 },\n { x: 0.546875, y: 0.203125 },\n { x: 0.546875, y: 0.203125 },\n { x: 0.578125, y: 0.203125 },\n { x: 0.578125, y: 0.203125 },\n { x: 0.609375, y: 0.203125 },\n { x: 0.609375, y: 0.203125 },\n { x: 0.640625, y: 0.203125 },\n { x: 0.640625, y: 0.203125 },\n { x: 0.671875, y: 0.203125 },\n { x: 0.671875, y: 0.203125 },\n { x: 0.703125, y: 0.203125 },\n { x: 0.703125, y: 0.203125 },\n { x: 0.734375, y: 0.203125 },\n { x: 0.734375, y: 0.203125 },\n { x: 0.765625, y: 0.203125 },\n { x: 0.765625, y: 0.203125 },\n { x: 0.796875, y: 0.203125 },\n { x: 0.796875, y: 0.203125 },\n { x: 0.828125, y: 0.203125 },\n { x: 0.828125, y: 0.203125 },\n { x: 0.859375, y: 0.203125 },\n { x: 0.859375, y: 0.203125 },\n { x: 0.890625, y: 0.203125 },\n { x: 0.890625, y: 0.203125 },\n { x: 0.921875, y: 0.203125 },\n { x: 0.921875, y: 0.203125 },\n { x: 0.953125, y: 0.203125 },\n { x: 0.953125, y: 0.203125 },\n { x: 0.984375, y: 0.203125 },\n { x: 0.984375, y: 0.203125 },\n { x: 0.015625, y: 0.234375 },\n { x: 0.015625, y: 0.234375 },\n { x: 0.046875, y: 0.234375 },\n { x: 0.046875, y: 0.234375 },\n { x: 0.078125, y: 0.234375 },\n { x: 0.078125, y: 0.234375 },\n { x: 0.109375, y: 0.234375 },\n { x: 0.109375, y: 0.234375 },\n { x: 0.140625, y: 0.234375 },\n { x: 0.140625, y: 0.234375 },\n { x: 0.171875, y: 0.234375 },\n { x: 0.171875, y: 0.234375 },\n { x: 0.203125, y: 0.234375 },\n { x: 0.203125, y: 0.234375 },\n { x: 0.234375, y: 0.234375 },\n { x: 0.234375, y: 0.234375 },\n { x: 0.265625, y: 0.234375 },\n { x: 0.265625, y: 0.234375 },\n { x: 0.296875, y: 0.234375 },\n { x: 0.296875, y: 0.234375 },\n { x: 0.328125, y: 0.234375 },\n { x: 0.328125, y: 0.234375 },\n { x: 0.359375, y: 0.234375 },\n { x: 0.359375, y: 0.234375 },\n { x: 0.390625, y: 0.234375 },\n { x: 0.390625, y: 0.234375 },\n { x: 0.421875, y: 0.234375 },\n { x: 0.421875, y: 0.234375 },\n { x: 0.453125, y: 0.234375 },\n { x: 0.453125, y: 0.234375 },\n { x: 0.484375, y: 0.234375 },\n { x: 0.484375, y: 0.234375 },\n { x: 0.515625, y: 0.234375 },\n { x: 0.515625, y: 0.234375 },\n { x: 0.546875, y: 0.234375 },\n { x: 0.546875, y: 0.234375 },\n { x: 0.578125, y: 0.234375 },\n { x: 0.578125, y: 0.234375 },\n { x: 0.609375, y: 0.234375 },\n { x: 0.609375, y: 0.234375 },\n { x: 0.640625, y: 0.234375 },\n { x: 0.640625, y: 0.234375 },\n { x: 0.671875, y: 0.234375 },\n { x: 0.671875, y: 0.234375 },\n { x: 0.703125, y: 0.234375 },\n { x: 0.703125, y: 0.234375 },\n { x: 0.734375, y: 0.234375 },\n { x: 0.734375, y: 0.234375 },\n { x: 0.765625, y: 0.234375 },\n { x: 0.765625, y: 0.234375 },\n { x: 0.796875, y: 0.234375 },\n { x: 0.796875, y: 0.234375 },\n { x: 0.828125, y: 0.234375 },\n { x: 0.828125, y: 0.234375 },\n { x: 0.859375, y: 0.234375 },\n { x: 0.859375, y: 0.234375 },\n { x: 0.890625, y: 0.234375 },\n { x: 0.890625, y: 0.234375 },\n { x: 0.921875, y: 0.234375 },\n { x: 0.921875, y: 0.234375 },\n { x: 0.953125, y: 0.234375 },\n { x: 0.953125, y: 0.234375 },\n { x: 0.984375, y: 0.234375 },\n { x: 0.984375, y: 0.234375 },\n { x: 0.015625, y: 0.265625 },\n { x: 0.015625, y: 0.265625 },\n { x: 0.046875, y: 0.265625 },\n { x: 0.046875, y: 0.265625 },\n { x: 0.078125, y: 0.265625 },\n { x: 0.078125, y: 0.265625 },\n { x: 0.109375, y: 0.265625 },\n { x: 0.109375, y: 0.265625 },\n { x: 0.140625, y: 0.265625 },\n { x: 0.140625, y: 0.265625 },\n { x: 0.171875, y: 0.265625 },\n { x: 0.171875, y: 0.265625 },\n { x: 0.203125, y: 0.265625 },\n { x: 0.203125, y: 0.265625 },\n { x: 0.234375, y: 0.265625 },\n { x: 0.234375, y: 0.265625 },\n { x: 0.265625, y: 0.265625 },\n { x: 0.265625, y: 0.265625 },\n { x: 0.296875, y: 0.265625 },\n { x: 0.296875, y: 0.265625 },\n { x: 0.328125, y: 0.265625 },\n { x: 0.328125, y: 0.265625 },\n { x: 0.359375, y: 0.265625 },\n { x: 0.359375, y: 0.265625 },\n { x: 0.390625, y: 0.265625 },\n { x: 0.390625, y: 0.265625 },\n { x: 0.421875, y: 0.265625 },\n { x: 0.421875, y: 0.265625 },\n { x: 0.453125, y: 0.265625 },\n { x: 0.453125, y: 0.265625 },\n { x: 0.484375, y: 0.265625 },\n { x: 0.484375, y: 0.265625 },\n { x: 0.515625, y: 0.265625 },\n { x: 0.515625, y: 0.265625 },\n { x: 0.546875, y: 0.265625 },\n { x: 0.546875, y: 0.265625 },\n { x: 0.578125, y: 0.265625 },\n { x: 0.578125, y: 0.265625 },\n { x: 0.609375, y: 0.265625 },\n { x: 0.609375, y: 0.265625 },\n { x: 0.640625, y: 0.265625 },\n { x: 0.640625, y: 0.265625 },\n { x: 0.671875, y: 0.265625 },\n { x: 0.671875, y: 0.265625 },\n { x: 0.703125, y: 0.265625 },\n { x: 0.703125, y: 0.265625 },\n { x: 0.734375, y: 0.265625 },\n { x: 0.734375, y: 0.265625 },\n { x: 0.765625, y: 0.265625 },\n { x: 0.765625, y: 0.265625 },\n { x: 0.796875, y: 0.265625 },\n { x: 0.796875, y: 0.265625 },\n { x: 0.828125, y: 0.265625 },\n { x: 0.828125, y: 0.265625 },\n { x: 0.859375, y: 0.265625 },\n { x: 0.859375, y: 0.265625 },\n { x: 0.890625, y: 0.265625 },\n { x: 0.890625, y: 0.265625 },\n { x: 0.921875, y: 0.265625 },\n { x: 0.921875, y: 0.265625 },\n { x: 0.953125, y: 0.265625 },\n { x: 0.953125, y: 0.265625 },\n { x: 0.984375, y: 0.265625 },\n { x: 0.984375, y: 0.265625 },\n { x: 0.015625, y: 0.296875 },\n { x: 0.015625, y: 0.296875 },\n { x: 0.046875, y: 0.296875 },\n { x: 0.046875, y: 0.296875 },\n { x: 0.078125, y: 0.296875 },\n { x: 0.078125, y: 0.296875 },\n { x: 0.109375, y: 0.296875 },\n { x: 0.109375, y: 0.296875 },\n { x: 0.140625, y: 0.296875 },\n { x: 0.140625, y: 0.296875 },\n { x: 0.171875, y: 0.296875 },\n { x: 0.171875, y: 0.296875 },\n { x: 0.203125, y: 0.296875 },\n { x: 0.203125, y: 0.296875 },\n { x: 0.234375, y: 0.296875 },\n { x: 0.234375, y: 0.296875 },\n { x: 0.265625, y: 0.296875 },\n { x: 0.265625, y: 0.296875 },\n { x: 0.296875, y: 0.296875 },\n { x: 0.296875, y: 0.296875 },\n { x: 0.328125, y: 0.296875 },\n { x: 0.328125, y: 0.296875 },\n { x: 0.359375, y: 0.296875 },\n { x: 0.359375, y: 0.296875 },\n { x: 0.390625, y: 0.296875 },\n { x: 0.390625, y: 0.296875 },\n { x: 0.421875, y: 0.296875 },\n { x: 0.421875, y: 0.296875 },\n { x: 0.453125, y: 0.296875 },\n { x: 0.453125, y: 0.296875 },\n { x: 0.484375, y: 0.296875 },\n { x: 0.484375, y: 0.296875 },\n { x: 0.515625, y: 0.296875 },\n { x: 0.515625, y: 0.296875 },\n { x: 0.546875, y: 0.296875 },\n { x: 0.546875, y: 0.296875 },\n { x: 0.578125, y: 0.296875 },\n { x: 0.578125, y: 0.296875 },\n { x: 0.609375, y: 0.296875 },\n { x: 0.609375, y: 0.296875 },\n { x: 0.640625, y: 0.296875 },\n { x: 0.640625, y: 0.296875 },\n { x: 0.671875, y: 0.296875 },\n { x: 0.671875, y: 0.296875 },\n { x: 0.703125, y: 0.296875 },\n { x: 0.703125, y: 0.296875 },\n { x: 0.734375, y: 0.296875 },\n { x: 0.734375, y: 0.296875 },\n { x: 0.765625, y: 0.296875 },\n { x: 0.765625, y: 0.296875 },\n { x: 0.796875, y: 0.296875 },\n { x: 0.796875, y: 0.296875 },\n { x: 0.828125, y: 0.296875 },\n { x: 0.828125, y: 0.296875 },\n { x: 0.859375, y: 0.296875 },\n { x: 0.859375, y: 0.296875 },\n { x: 0.890625, y: 0.296875 },\n { x: 0.890625, y: 0.296875 },\n { x: 0.921875, y: 0.296875 },\n { x: 0.921875, y: 0.296875 },\n { x: 0.953125, y: 0.296875 },\n { x: 0.953125, y: 0.296875 },\n { x: 0.984375, y: 0.296875 },\n { x: 0.984375, y: 0.296875 },\n { x: 0.015625, y: 0.328125 },\n { x: 0.015625, y: 0.328125 },\n { x: 0.046875, y: 0.328125 },\n { x: 0.046875, y: 0.328125 },\n { x: 0.078125, y: 0.328125 },\n { x: 0.078125, y: 0.328125 },\n { x: 0.109375, y: 0.328125 },\n { x: 0.109375, y: 0.328125 },\n { x: 0.140625, y: 0.328125 },\n { x: 0.140625, y: 0.328125 },\n { x: 0.171875, y: 0.328125 },\n { x: 0.171875, y: 0.328125 },\n { x: 0.203125, y: 0.328125 },\n { x: 0.203125, y: 0.328125 },\n { x: 0.234375, y: 0.328125 },\n { x: 0.234375, y: 0.328125 },\n { x: 0.265625, y: 0.328125 },\n { x: 0.265625, y: 0.328125 },\n { x: 0.296875, y: 0.328125 },\n { x: 0.296875, y: 0.328125 },\n { x: 0.328125, y: 0.328125 },\n { x: 0.328125, y: 0.328125 },\n { x: 0.359375, y: 0.328125 },\n { x: 0.359375, y: 0.328125 },\n { x: 0.390625, y: 0.328125 },\n { x: 0.390625, y: 0.328125 },\n { x: 0.421875, y: 0.328125 },\n { x: 0.421875, y: 0.328125 },\n { x: 0.453125, y: 0.328125 },\n { x: 0.453125, y: 0.328125 },\n { x: 0.484375, y: 0.328125 },\n { x: 0.484375, y: 0.328125 },\n { x: 0.515625, y: 0.328125 },\n { x: 0.515625, y: 0.328125 },\n { x: 0.546875, y: 0.328125 },\n { x: 0.546875, y: 0.328125 },\n { x: 0.578125, y: 0.328125 },\n { x: 0.578125, y: 0.328125 },\n { x: 0.609375, y: 0.328125 },\n { x: 0.609375, y: 0.328125 },\n { x: 0.640625, y: 0.328125 },\n { x: 0.640625, y: 0.328125 },\n { x: 0.671875, y: 0.328125 },\n { x: 0.671875, y: 0.328125 },\n { x: 0.703125, y: 0.328125 },\n { x: 0.703125, y: 0.328125 },\n { x: 0.734375, y: 0.328125 },\n { x: 0.734375, y: 0.328125 },\n { x: 0.765625, y: 0.328125 },\n { x: 0.765625, y: 0.328125 },\n { x: 0.796875, y: 0.328125 },\n { x: 0.796875, y: 0.328125 },\n { x: 0.828125, y: 0.328125 },\n { x: 0.828125, y: 0.328125 },\n { x: 0.859375, y: 0.328125 },\n { x: 0.859375, y: 0.328125 },\n { x: 0.890625, y: 0.328125 },\n { x: 0.890625, y: 0.328125 },\n { x: 0.921875, y: 0.328125 },\n { x: 0.921875, y: 0.328125 },\n { x: 0.953125, y: 0.328125 },\n { x: 0.953125, y: 0.328125 },\n { x: 0.984375, y: 0.328125 },\n { x: 0.984375, y: 0.328125 },\n { x: 0.015625, y: 0.359375 },\n { x: 0.015625, y: 0.359375 },\n { x: 0.046875, y: 0.359375 },\n { x: 0.046875, y: 0.359375 },\n { x: 0.078125, y: 0.359375 },\n { x: 0.078125, y: 0.359375 },\n { x: 0.109375, y: 0.359375 },\n { x: 0.109375, y: 0.359375 },\n { x: 0.140625, y: 0.359375 },\n { x: 0.140625, y: 0.359375 },\n { x: 0.171875, y: 0.359375 },\n { x: 0.171875, y: 0.359375 },\n { x: 0.203125, y: 0.359375 },\n { x: 0.203125, y: 0.359375 },\n { x: 0.234375, y: 0.359375 },\n { x: 0.234375, y: 0.359375 },\n { x: 0.265625, y: 0.359375 },\n { x: 0.265625, y: 0.359375 },\n { x: 0.296875, y: 0.359375 },\n { x: 0.296875, y: 0.359375 },\n { x: 0.328125, y: 0.359375 },\n { x: 0.328125, y: 0.359375 },\n { x: 0.359375, y: 0.359375 },\n { x: 0.359375, y: 0.359375 },\n { x: 0.390625, y: 0.359375 },\n { x: 0.390625, y: 0.359375 },\n { x: 0.421875, y: 0.359375 },\n { x: 0.421875, y: 0.359375 },\n { x: 0.453125, y: 0.359375 },\n { x: 0.453125, y: 0.359375 },\n { x: 0.484375, y: 0.359375 },\n { x: 0.484375, y: 0.359375 },\n { x: 0.515625, y: 0.359375 },\n { x: 0.515625, y: 0.359375 },\n { x: 0.546875, y: 0.359375 },\n { x: 0.546875, y: 0.359375 },\n { x: 0.578125, y: 0.359375 },\n { x: 0.578125, y: 0.359375 },\n { x: 0.609375, y: 0.359375 },\n { x: 0.609375, y: 0.359375 },\n { x: 0.640625, y: 0.359375 },\n { x: 0.640625, y: 0.359375 },\n { x: 0.671875, y: 0.359375 },\n { x: 0.671875, y: 0.359375 },\n { x: 0.703125, y: 0.359375 },\n { x: 0.703125, y: 0.359375 },\n { x: 0.734375, y: 0.359375 },\n { x: 0.734375, y: 0.359375 },\n { x: 0.765625, y: 0.359375 },\n { x: 0.765625, y: 0.359375 },\n { x: 0.796875, y: 0.359375 },\n { x: 0.796875, y: 0.359375 },\n { x: 0.828125, y: 0.359375 },\n { x: 0.828125, y: 0.359375 },\n { x: 0.859375, y: 0.359375 },\n { x: 0.859375, y: 0.359375 },\n { x: 0.890625, y: 0.359375 },\n { x: 0.890625, y: 0.359375 },\n { x: 0.921875, y: 0.359375 },\n { x: 0.921875, y: 0.359375 },\n { x: 0.953125, y: 0.359375 },\n { x: 0.953125, y: 0.359375 },\n { x: 0.984375, y: 0.359375 },\n { x: 0.984375, y: 0.359375 },\n { x: 0.015625, y: 0.390625 },\n { x: 0.015625, y: 0.390625 },\n { x: 0.046875, y: 0.390625 },\n { x: 0.046875, y: 0.390625 },\n { x: 0.078125, y: 0.390625 },\n { x: 0.078125, y: 0.390625 },\n { x: 0.109375, y: 0.390625 },\n { x: 0.109375, y: 0.390625 },\n { x: 0.140625, y: 0.390625 },\n { x: 0.140625, y: 0.390625 },\n { x: 0.171875, y: 0.390625 },\n { x: 0.171875, y: 0.390625 },\n { x: 0.203125, y: 0.390625 },\n { x: 0.203125, y: 0.390625 },\n { x: 0.234375, y: 0.390625 },\n { x: 0.234375, y: 0.390625 },\n { x: 0.265625, y: 0.390625 },\n { x: 0.265625, y: 0.390625 },\n { x: 0.296875, y: 0.390625 },\n { x: 0.296875, y: 0.390625 },\n { x: 0.328125, y: 0.390625 },\n { x: 0.328125, y: 0.390625 },\n { x: 0.359375, y: 0.390625 },\n { x: 0.359375, y: 0.390625 },\n { x: 0.390625, y: 0.390625 },\n { x: 0.390625, y: 0.390625 },\n { x: 0.421875, y: 0.390625 },\n { x: 0.421875, y: 0.390625 },\n { x: 0.453125, y: 0.390625 },\n { x: 0.453125, y: 0.390625 },\n { x: 0.484375, y: 0.390625 },\n { x: 0.484375, y: 0.390625 },\n { x: 0.515625, y: 0.390625 },\n { x: 0.515625, y: 0.390625 },\n { x: 0.546875, y: 0.390625 },\n { x: 0.546875, y: 0.390625 },\n { x: 0.578125, y: 0.390625 },\n { x: 0.578125, y: 0.390625 },\n { x: 0.609375, y: 0.390625 },\n { x: 0.609375, y: 0.390625 },\n { x: 0.640625, y: 0.390625 },\n { x: 0.640625, y: 0.390625 },\n { x: 0.671875, y: 0.390625 },\n { x: 0.671875, y: 0.390625 },\n { x: 0.703125, y: 0.390625 },\n { x: 0.703125, y: 0.390625 },\n { x: 0.734375, y: 0.390625 },\n { x: 0.734375, y: 0.390625 },\n { x: 0.765625, y: 0.390625 },\n { x: 0.765625, y: 0.390625 },\n { x: 0.796875, y: 0.390625 },\n { x: 0.796875, y: 0.390625 },\n { x: 0.828125, y: 0.390625 },\n { x: 0.828125, y: 0.390625 },\n { x: 0.859375, y: 0.390625 },\n { x: 0.859375, y: 0.390625 },\n { x: 0.890625, y: 0.390625 },\n { x: 0.890625, y: 0.390625 },\n { x: 0.921875, y: 0.390625 },\n { x: 0.921875, y: 0.390625 },\n { x: 0.953125, y: 0.390625 },\n { x: 0.953125, y: 0.390625 },\n { x: 0.984375, y: 0.390625 },\n { x: 0.984375, y: 0.390625 },\n { x: 0.015625, y: 0.421875 },\n { x: 0.015625, y: 0.421875 },\n { x: 0.046875, y: 0.421875 },\n { x: 0.046875, y: 0.421875 },\n { x: 0.078125, y: 0.421875 },\n { x: 0.078125, y: 0.421875 },\n { x: 0.109375, y: 0.421875 },\n { x: 0.109375, y: 0.421875 },\n { x: 0.140625, y: 0.421875 },\n { x: 0.140625, y: 0.421875 },\n { x: 0.171875, y: 0.421875 },\n { x: 0.171875, y: 0.421875 },\n { x: 0.203125, y: 0.421875 },\n { x: 0.203125, y: 0.421875 },\n { x: 0.234375, y: 0.421875 },\n { x: 0.234375, y: 0.421875 },\n { x: 0.265625, y: 0.421875 },\n { x: 0.265625, y: 0.421875 },\n { x: 0.296875, y: 0.421875 },\n { x: 0.296875, y: 0.421875 },\n { x: 0.328125, y: 0.421875 },\n { x: 0.328125, y: 0.421875 },\n { x: 0.359375, y: 0.421875 },\n { x: 0.359375, y: 0.421875 },\n { x: 0.390625, y: 0.421875 },\n { x: 0.390625, y: 0.421875 },\n { x: 0.421875, y: 0.421875 },\n { x: 0.421875, y: 0.421875 },\n { x: 0.453125, y: 0.421875 },\n { x: 0.453125, y: 0.421875 },\n { x: 0.484375, y: 0.421875 },\n { x: 0.484375, y: 0.421875 },\n { x: 0.515625, y: 0.421875 },\n { x: 0.515625, y: 0.421875 },\n { x: 0.546875, y: 0.421875 },\n { x: 0.546875, y: 0.421875 },\n { x: 0.578125, y: 0.421875 },\n { x: 0.578125, y: 0.421875 },\n { x: 0.609375, y: 0.421875 },\n { x: 0.609375, y: 0.421875 },\n { x: 0.640625, y: 0.421875 },\n { x: 0.640625, y: 0.421875 },\n { x: 0.671875, y: 0.421875 },\n { x: 0.671875, y: 0.421875 },\n { x: 0.703125, y: 0.421875 },\n { x: 0.703125, y: 0.421875 },\n { x: 0.734375, y: 0.421875 },\n { x: 0.734375, y: 0.421875 },\n { x: 0.765625, y: 0.421875 },\n { x: 0.765625, y: 0.421875 },\n { x: 0.796875, y: 0.421875 },\n { x: 0.796875, y: 0.421875 },\n { x: 0.828125, y: 0.421875 },\n { x: 0.828125, y: 0.421875 },\n { x: 0.859375, y: 0.421875 },\n { x: 0.859375, y: 0.421875 },\n { x: 0.890625, y: 0.421875 },\n { x: 0.890625, y: 0.421875 },\n { x: 0.921875, y: 0.421875 },\n { x: 0.921875, y: 0.421875 },\n { x: 0.953125, y: 0.421875 },\n { x: 0.953125, y: 0.421875 },\n { x: 0.984375, y: 0.421875 },\n { x: 0.984375, y: 0.421875 },\n { x: 0.015625, y: 0.453125 },\n { x: 0.015625, y: 0.453125 },\n { x: 0.046875, y: 0.453125 },\n { x: 0.046875, y: 0.453125 },\n { x: 0.078125, y: 0.453125 },\n { x: 0.078125, y: 0.453125 },\n { x: 0.109375, y: 0.453125 },\n { x: 0.109375, y: 0.453125 },\n { x: 0.140625, y: 0.453125 },\n { x: 0.140625, y: 0.453125 },\n { x: 0.171875, y: 0.453125 },\n { x: 0.171875, y: 0.453125 },\n { x: 0.203125, y: 0.453125 },\n { x: 0.203125, y: 0.453125 },\n { x: 0.234375, y: 0.453125 },\n { x: 0.234375, y: 0.453125 },\n { x: 0.265625, y: 0.453125 },\n { x: 0.265625, y: 0.453125 },\n { x: 0.296875, y: 0.453125 },\n { x: 0.296875, y: 0.453125 },\n { x: 0.328125, y: 0.453125 },\n { x: 0.328125, y: 0.453125 },\n { x: 0.359375, y: 0.453125 },\n { x: 0.359375, y: 0.453125 },\n { x: 0.390625, y: 0.453125 },\n { x: 0.390625, y: 0.453125 },\n { x: 0.421875, y: 0.453125 },\n { x: 0.421875, y: 0.453125 },\n { x: 0.453125, y: 0.453125 },\n { x: 0.453125, y: 0.453125 },\n { x: 0.484375, y: 0.453125 },\n { x: 0.484375, y: 0.453125 },\n { x: 0.515625, y: 0.453125 },\n { x: 0.515625, y: 0.453125 },\n { x: 0.546875, y: 0.453125 },\n { x: 0.546875, y: 0.453125 },\n { x: 0.578125, y: 0.453125 },\n { x: 0.578125, y: 0.453125 },\n { x: 0.609375, y: 0.453125 },\n { x: 0.609375, y: 0.453125 },\n { x: 0.640625, y: 0.453125 },\n { x: 0.640625, y: 0.453125 },\n { x: 0.671875, y: 0.453125 },\n { x: 0.671875, y: 0.453125 },\n { x: 0.703125, y: 0.453125 },\n { x: 0.703125, y: 0.453125 },\n { x: 0.734375, y: 0.453125 },\n { x: 0.734375, y: 0.453125 },\n { x: 0.765625, y: 0.453125 },\n { x: 0.765625, y: 0.453125 },\n { x: 0.796875, y: 0.453125 },\n { x: 0.796875, y: 0.453125 },\n { x: 0.828125, y: 0.453125 },\n { x: 0.828125, y: 0.453125 },\n { x: 0.859375, y: 0.453125 },\n { x: 0.859375, y: 0.453125 },\n { x: 0.890625, y: 0.453125 },\n { x: 0.890625, y: 0.453125 },\n { x: 0.921875, y: 0.453125 },\n { x: 0.921875, y: 0.453125 },\n { x: 0.953125, y: 0.453125 },\n { x: 0.953125, y: 0.453125 },\n { x: 0.984375, y: 0.453125 },\n { x: 0.984375, y: 0.453125 },\n { x: 0.015625, y: 0.484375 },\n { x: 0.015625, y: 0.484375 },\n { x: 0.046875, y: 0.484375 },\n { x: 0.046875, y: 0.484375 },\n { x: 0.078125, y: 0.484375 },\n { x: 0.078125, y: 0.484375 },\n { x: 0.109375, y: 0.484375 },\n { x: 0.109375, y: 0.484375 },\n { x: 0.140625, y: 0.484375 },\n { x: 0.140625, y: 0.484375 },\n { x: 0.171875, y: 0.484375 },\n { x: 0.171875, y: 0.484375 },\n { x: 0.203125, y: 0.484375 },\n { x: 0.203125, y: 0.484375 },\n { x: 0.234375, y: 0.484375 },\n { x: 0.234375, y: 0.484375 },\n { x: 0.265625, y: 0.484375 },\n { x: 0.265625, y: 0.484375 },\n { x: 0.296875, y: 0.484375 },\n { x: 0.296875, y: 0.484375 },\n { x: 0.328125, y: 0.484375 },\n { x: 0.328125, y: 0.484375 },\n { x: 0.359375, y: 0.484375 },\n { x: 0.359375, y: 0.484375 },\n { x: 0.390625, y: 0.484375 },\n { x: 0.390625, y: 0.484375 },\n { x: 0.421875, y: 0.484375 },\n { x: 0.421875, y: 0.484375 },\n { x: 0.453125, y: 0.484375 },\n { x: 0.453125, y: 0.484375 },\n { x: 0.484375, y: 0.484375 },\n { x: 0.484375, y: 0.484375 },\n { x: 0.515625, y: 0.484375 },\n { x: 0.515625, y: 0.484375 },\n { x: 0.546875, y: 0.484375 },\n { x: 0.546875, y: 0.484375 },\n { x: 0.578125, y: 0.484375 },\n { x: 0.578125, y: 0.484375 },\n { x: 0.609375, y: 0.484375 },\n { x: 0.609375, y: 0.484375 },\n { x: 0.640625, y: 0.484375 },\n { x: 0.640625, y: 0.484375 },\n { x: 0.671875, y: 0.484375 },\n { x: 0.671875, y: 0.484375 },\n { x: 0.703125, y: 0.484375 },\n { x: 0.703125, y: 0.484375 },\n { x: 0.734375, y: 0.484375 },\n { x: 0.734375, y: 0.484375 },\n { x: 0.765625, y: 0.484375 },\n { x: 0.765625, y: 0.484375 },\n { x: 0.796875, y: 0.484375 },\n { x: 0.796875, y: 0.484375 },\n { x: 0.828125, y: 0.484375 },\n { x: 0.828125, y: 0.484375 },\n { x: 0.859375, y: 0.484375 },\n { x: 0.859375, y: 0.484375 },\n { x: 0.890625, y: 0.484375 },\n { x: 0.890625, y: 0.484375 },\n { x: 0.921875, y: 0.484375 },\n { x: 0.921875, y: 0.484375 },\n { x: 0.953125, y: 0.484375 },\n { x: 0.953125, y: 0.484375 },\n { x: 0.984375, y: 0.484375 },\n { x: 0.984375, y: 0.484375 },\n { x: 0.015625, y: 0.515625 },\n { x: 0.015625, y: 0.515625 },\n { x: 0.046875, y: 0.515625 },\n { x: 0.046875, y: 0.515625 },\n { x: 0.078125, y: 0.515625 },\n { x: 0.078125, y: 0.515625 },\n { x: 0.109375, y: 0.515625 },\n { x: 0.109375, y: 0.515625 },\n { x: 0.140625, y: 0.515625 },\n { x: 0.140625, y: 0.515625 },\n { x: 0.171875, y: 0.515625 },\n { x: 0.171875, y: 0.515625 },\n { x: 0.203125, y: 0.515625 },\n { x: 0.203125, y: 0.515625 },\n { x: 0.234375, y: 0.515625 },\n { x: 0.234375, y: 0.515625 },\n { x: 0.265625, y: 0.515625 },\n { x: 0.265625, y: 0.515625 },\n { x: 0.296875, y: 0.515625 },\n { x: 0.296875, y: 0.515625 },\n { x: 0.328125, y: 0.515625 },\n { x: 0.328125, y: 0.515625 },\n { x: 0.359375, y: 0.515625 },\n { x: 0.359375, y: 0.515625 },\n { x: 0.390625, y: 0.515625 },\n { x: 0.390625, y: 0.515625 },\n { x: 0.421875, y: 0.515625 },\n { x: 0.421875, y: 0.515625 },\n { x: 0.453125, y: 0.515625 },\n { x: 0.453125, y: 0.515625 },\n { x: 0.484375, y: 0.515625 },\n { x: 0.484375, y: 0.515625 },\n { x: 0.515625, y: 0.515625 },\n { x: 0.515625, y: 0.515625 },\n { x: 0.546875, y: 0.515625 },\n { x: 0.546875, y: 0.515625 },\n { x: 0.578125, y: 0.515625 },\n { x: 0.578125, y: 0.515625 },\n { x: 0.609375, y: 0.515625 },\n { x: 0.609375, y: 0.515625 },\n { x: 0.640625, y: 0.515625 },\n { x: 0.640625, y: 0.515625 },\n { x: 0.671875, y: 0.515625 },\n { x: 0.671875, y: 0.515625 },\n { x: 0.703125, y: 0.515625 },\n { x: 0.703125, y: 0.515625 },\n { x: 0.734375, y: 0.515625 },\n { x: 0.734375, y: 0.515625 },\n { x: 0.765625, y: 0.515625 },\n { x: 0.765625, y: 0.515625 },\n { x: 0.796875, y: 0.515625 },\n { x: 0.796875, y: 0.515625 },\n { x: 0.828125, y: 0.515625 },\n { x: 0.828125, y: 0.515625 },\n { x: 0.859375, y: 0.515625 },\n { x: 0.859375, y: 0.515625 },\n { x: 0.890625, y: 0.515625 },\n { x: 0.890625, y: 0.515625 },\n { x: 0.921875, y: 0.515625 },\n { x: 0.921875, y: 0.515625 },\n { x: 0.953125, y: 0.515625 },\n { x: 0.953125, y: 0.515625 },\n { x: 0.984375, y: 0.515625 },\n { x: 0.984375, y: 0.515625 },\n { x: 0.015625, y: 0.546875 },\n { x: 0.015625, y: 0.546875 },\n { x: 0.046875, y: 0.546875 },\n { x: 0.046875, y: 0.546875 },\n { x: 0.078125, y: 0.546875 },\n { x: 0.078125, y: 0.546875 },\n { x: 0.109375, y: 0.546875 },\n { x: 0.109375, y: 0.546875 },\n { x: 0.140625, y: 0.546875 },\n { x: 0.140625, y: 0.546875 },\n { x: 0.171875, y: 0.546875 },\n { x: 0.171875, y: 0.546875 },\n { x: 0.203125, y: 0.546875 },\n { x: 0.203125, y: 0.546875 },\n { x: 0.234375, y: 0.546875 },\n { x: 0.234375, y: 0.546875 },\n { x: 0.265625, y: 0.546875 },\n { x: 0.265625, y: 0.546875 },\n { x: 0.296875, y: 0.546875 },\n { x: 0.296875, y: 0.546875 },\n { x: 0.328125, y: 0.546875 },\n { x: 0.328125, y: 0.546875 },\n { x: 0.359375, y: 0.546875 },\n { x: 0.359375, y: 0.546875 },\n { x: 0.390625, y: 0.546875 },\n { x: 0.390625, y: 0.546875 },\n { x: 0.421875, y: 0.546875 },\n { x: 0.421875, y: 0.546875 },\n { x: 0.453125, y: 0.546875 },\n { x: 0.453125, y: 0.546875 },\n { x: 0.484375, y: 0.546875 },\n { x: 0.484375, y: 0.546875 },\n { x: 0.515625, y: 0.546875 },\n { x: 0.515625, y: 0.546875 },\n { x: 0.546875, y: 0.546875 },\n { x: 0.546875, y: 0.546875 },\n { x: 0.578125, y: 0.546875 },\n { x: 0.578125, y: 0.546875 },\n { x: 0.609375, y: 0.546875 },\n { x: 0.609375, y: 0.546875 },\n { x: 0.640625, y: 0.546875 },\n { x: 0.640625, y: 0.546875 },\n { x: 0.671875, y: 0.546875 },\n { x: 0.671875, y: 0.546875 },\n { x: 0.703125, y: 0.546875 },\n { x: 0.703125, y: 0.546875 },\n { x: 0.734375, y: 0.546875 },\n { x: 0.734375, y: 0.546875 },\n { x: 0.765625, y: 0.546875 },\n { x: 0.765625, y: 0.546875 },\n { x: 0.796875, y: 0.546875 },\n { x: 0.796875, y: 0.546875 },\n { x: 0.828125, y: 0.546875 },\n { x: 0.828125, y: 0.546875 },\n { x: 0.859375, y: 0.546875 },\n { x: 0.859375, y: 0.546875 },\n { x: 0.890625, y: 0.546875 },\n { x: 0.890625, y: 0.546875 },\n { x: 0.921875, y: 0.546875 },\n { x: 0.921875, y: 0.546875 },\n { x: 0.953125, y: 0.546875 },\n { x: 0.953125, y: 0.546875 },\n { x: 0.984375, y: 0.546875 },\n { x: 0.984375, y: 0.546875 },\n { x: 0.015625, y: 0.578125 },\n { x: 0.015625, y: 0.578125 },\n { x: 0.046875, y: 0.578125 },\n { x: 0.046875, y: 0.578125 },\n { x: 0.078125, y: 0.578125 },\n { x: 0.078125, y: 0.578125 },\n { x: 0.109375, y: 0.578125 },\n { x: 0.109375, y: 0.578125 },\n { x: 0.140625, y: 0.578125 },\n { x: 0.140625, y: 0.578125 },\n { x: 0.171875, y: 0.578125 },\n { x: 0.171875, y: 0.578125 },\n { x: 0.203125, y: 0.578125 },\n { x: 0.203125, y: 0.578125 },\n { x: 0.234375, y: 0.578125 },\n { x: 0.234375, y: 0.578125 },\n { x: 0.265625, y: 0.578125 },\n { x: 0.265625, y: 0.578125 },\n { x: 0.296875, y: 0.578125 },\n { x: 0.296875, y: 0.578125 },\n { x: 0.328125, y: 0.578125 },\n { x: 0.328125, y: 0.578125 },\n { x: 0.359375, y: 0.578125 },\n { x: 0.359375, y: 0.578125 },\n { x: 0.390625, y: 0.578125 },\n { x: 0.390625, y: 0.578125 },\n { x: 0.421875, y: 0.578125 },\n { x: 0.421875, y: 0.578125 },\n { x: 0.453125, y: 0.578125 },\n { x: 0.453125, y: 0.578125 },\n { x: 0.484375, y: 0.578125 },\n { x: 0.484375, y: 0.578125 },\n { x: 0.515625, y: 0.578125 },\n { x: 0.515625, y: 0.578125 },\n { x: 0.546875, y: 0.578125 },\n { x: 0.546875, y: 0.578125 },\n { x: 0.578125, y: 0.578125 },\n { x: 0.578125, y: 0.578125 },\n { x: 0.609375, y: 0.578125 },\n { x: 0.609375, y: 0.578125 },\n { x: 0.640625, y: 0.578125 },\n { x: 0.640625, y: 0.578125 },\n { x: 0.671875, y: 0.578125 },\n { x: 0.671875, y: 0.578125 },\n { x: 0.703125, y: 0.578125 },\n { x: 0.703125, y: 0.578125 },\n { x: 0.734375, y: 0.578125 },\n { x: 0.734375, y: 0.578125 },\n { x: 0.765625, y: 0.578125 },\n { x: 0.765625, y: 0.578125 },\n { x: 0.796875, y: 0.578125 },\n { x: 0.796875, y: 0.578125 },\n { x: 0.828125, y: 0.578125 },\n { x: 0.828125, y: 0.578125 },\n { x: 0.859375, y: 0.578125 },\n { x: 0.859375, y: 0.578125 },\n { x: 0.890625, y: 0.578125 },\n { x: 0.890625, y: 0.578125 },\n { x: 0.921875, y: 0.578125 },\n { x: 0.921875, y: 0.578125 },\n { x: 0.953125, y: 0.578125 },\n { x: 0.953125, y: 0.578125 },\n { x: 0.984375, y: 0.578125 },\n { x: 0.984375, y: 0.578125 },\n { x: 0.015625, y: 0.609375 },\n { x: 0.015625, y: 0.609375 },\n { x: 0.046875, y: 0.609375 },\n { x: 0.046875, y: 0.609375 },\n { x: 0.078125, y: 0.609375 },\n { x: 0.078125, y: 0.609375 },\n { x: 0.109375, y: 0.609375 },\n { x: 0.109375, y: 0.609375 },\n { x: 0.140625, y: 0.609375 },\n { x: 0.140625, y: 0.609375 },\n { x: 0.171875, y: 0.609375 },\n { x: 0.171875, y: 0.609375 },\n { x: 0.203125, y: 0.609375 },\n { x: 0.203125, y: 0.609375 },\n { x: 0.234375, y: 0.609375 },\n { x: 0.234375, y: 0.609375 },\n { x: 0.265625, y: 0.609375 },\n { x: 0.265625, y: 0.609375 },\n { x: 0.296875, y: 0.609375 },\n { x: 0.296875, y: 0.609375 },\n { x: 0.328125, y: 0.609375 },\n { x: 0.328125, y: 0.609375 },\n { x: 0.359375, y: 0.609375 },\n { x: 0.359375, y: 0.609375 },\n { x: 0.390625, y: 0.609375 },\n { x: 0.390625, y: 0.609375 },\n { x: 0.421875, y: 0.609375 },\n { x: 0.421875, y: 0.609375 },\n { x: 0.453125, y: 0.609375 },\n { x: 0.453125, y: 0.609375 },\n { x: 0.484375, y: 0.609375 },\n { x: 0.484375, y: 0.609375 },\n { x: 0.515625, y: 0.609375 },\n { x: 0.515625, y: 0.609375 },\n { x: 0.546875, y: 0.609375 },\n { x: 0.546875, y: 0.609375 },\n { x: 0.578125, y: 0.609375 },\n { x: 0.578125, y: 0.609375 },\n { x: 0.609375, y: 0.609375 },\n { x: 0.609375, y: 0.609375 },\n { x: 0.640625, y: 0.609375 },\n { x: 0.640625, y: 0.609375 },\n { x: 0.671875, y: 0.609375 },\n { x: 0.671875, y: 0.609375 },\n { x: 0.703125, y: 0.609375 },\n { x: 0.703125, y: 0.609375 },\n { x: 0.734375, y: 0.609375 },\n { x: 0.734375, y: 0.609375 },\n { x: 0.765625, y: 0.609375 },\n { x: 0.765625, y: 0.609375 },\n { x: 0.796875, y: 0.609375 },\n { x: 0.796875, y: 0.609375 },\n { x: 0.828125, y: 0.609375 },\n { x: 0.828125, y: 0.609375 },\n { x: 0.859375, y: 0.609375 },\n { x: 0.859375, y: 0.609375 },\n { x: 0.890625, y: 0.609375 },\n { x: 0.890625, y: 0.609375 },\n { x: 0.921875, y: 0.609375 },\n { x: 0.921875, y: 0.609375 },\n { x: 0.953125, y: 0.609375 },\n { x: 0.953125, y: 0.609375 },\n { x: 0.984375, y: 0.609375 },\n { x: 0.984375, y: 0.609375 },\n { x: 0.015625, y: 0.640625 },\n { x: 0.015625, y: 0.640625 },\n { x: 0.046875, y: 0.640625 },\n { x: 0.046875, y: 0.640625 },\n { x: 0.078125, y: 0.640625 },\n { x: 0.078125, y: 0.640625 },\n { x: 0.109375, y: 0.640625 },\n { x: 0.109375, y: 0.640625 },\n { x: 0.140625, y: 0.640625 },\n { x: 0.140625, y: 0.640625 },\n { x: 0.171875, y: 0.640625 },\n { x: 0.171875, y: 0.640625 },\n { x: 0.203125, y: 0.640625 },\n { x: 0.203125, y: 0.640625 },\n { x: 0.234375, y: 0.640625 },\n { x: 0.234375, y: 0.640625 },\n { x: 0.265625, y: 0.640625 },\n { x: 0.265625, y: 0.640625 },\n { x: 0.296875, y: 0.640625 },\n { x: 0.296875, y: 0.640625 },\n { x: 0.328125, y: 0.640625 },\n { x: 0.328125, y: 0.640625 },\n { x: 0.359375, y: 0.640625 },\n { x: 0.359375, y: 0.640625 },\n { x: 0.390625, y: 0.640625 },\n { x: 0.390625, y: 0.640625 },\n { x: 0.421875, y: 0.640625 },\n { x: 0.421875, y: 0.640625 },\n { x: 0.453125, y: 0.640625 },\n { x: 0.453125, y: 0.640625 },\n { x: 0.484375, y: 0.640625 },\n { x: 0.484375, y: 0.640625 },\n { x: 0.515625, y: 0.640625 },\n { x: 0.515625, y: 0.640625 },\n { x: 0.546875, y: 0.640625 },\n { x: 0.546875, y: 0.640625 },\n { x: 0.578125, y: 0.640625 },\n { x: 0.578125, y: 0.640625 },\n { x: 0.609375, y: 0.640625 },\n { x: 0.609375, y: 0.640625 },\n { x: 0.640625, y: 0.640625 },\n { x: 0.640625, y: 0.640625 },\n { x: 0.671875, y: 0.640625 },\n { x: 0.671875, y: 0.640625 },\n { x: 0.703125, y: 0.640625 },\n { x: 0.703125, y: 0.640625 },\n { x: 0.734375, y: 0.640625 },\n { x: 0.734375, y: 0.640625 },\n { x: 0.765625, y: 0.640625 },\n { x: 0.765625, y: 0.640625 },\n { x: 0.796875, y: 0.640625 },\n { x: 0.796875, y: 0.640625 },\n { x: 0.828125, y: 0.640625 },\n { x: 0.828125, y: 0.640625 },\n { x: 0.859375, y: 0.640625 },\n { x: 0.859375, y: 0.640625 },\n { x: 0.890625, y: 0.640625 },\n { x: 0.890625, y: 0.640625 },\n { x: 0.921875, y: 0.640625 },\n { x: 0.921875, y: 0.640625 },\n { x: 0.953125, y: 0.640625 },\n { x: 0.953125, y: 0.640625 },\n { x: 0.984375, y: 0.640625 },\n { x: 0.984375, y: 0.640625 },\n { x: 0.015625, y: 0.671875 },\n { x: 0.015625, y: 0.671875 },\n { x: 0.046875, y: 0.671875 },\n { x: 0.046875, y: 0.671875 },\n { x: 0.078125, y: 0.671875 },\n { x: 0.078125, y: 0.671875 },\n { x: 0.109375, y: 0.671875 },\n { x: 0.109375, y: 0.671875 },\n { x: 0.140625, y: 0.671875 },\n { x: 0.140625, y: 0.671875 },\n { x: 0.171875, y: 0.671875 },\n { x: 0.171875, y: 0.671875 },\n { x: 0.203125, y: 0.671875 },\n { x: 0.203125, y: 0.671875 },\n { x: 0.234375, y: 0.671875 },\n { x: 0.234375, y: 0.671875 },\n { x: 0.265625, y: 0.671875 },\n { x: 0.265625, y: 0.671875 },\n { x: 0.296875, y: 0.671875 },\n { x: 0.296875, y: 0.671875 },\n { x: 0.328125, y: 0.671875 },\n { x: 0.328125, y: 0.671875 },\n { x: 0.359375, y: 0.671875 },\n { x: 0.359375, y: 0.671875 },\n { x: 0.390625, y: 0.671875 },\n { x: 0.390625, y: 0.671875 },\n { x: 0.421875, y: 0.671875 },\n { x: 0.421875, y: 0.671875 },\n { x: 0.453125, y: 0.671875 },\n { x: 0.453125, y: 0.671875 },\n { x: 0.484375, y: 0.671875 },\n { x: 0.484375, y: 0.671875 },\n { x: 0.515625, y: 0.671875 },\n { x: 0.515625, y: 0.671875 },\n { x: 0.546875, y: 0.671875 },\n { x: 0.546875, y: 0.671875 },\n { x: 0.578125, y: 0.671875 },\n { x: 0.578125, y: 0.671875 },\n { x: 0.609375, y: 0.671875 },\n { x: 0.609375, y: 0.671875 },\n { x: 0.640625, y: 0.671875 },\n { x: 0.640625, y: 0.671875 },\n { x: 0.671875, y: 0.671875 },\n { x: 0.671875, y: 0.671875 },\n { x: 0.703125, y: 0.671875 },\n { x: 0.703125, y: 0.671875 },\n { x: 0.734375, y: 0.671875 },\n { x: 0.734375, y: 0.671875 },\n { x: 0.765625, y: 0.671875 },\n { x: 0.765625, y: 0.671875 },\n { x: 0.796875, y: 0.671875 },\n { x: 0.796875, y: 0.671875 },\n { x: 0.828125, y: 0.671875 },\n { x: 0.828125, y: 0.671875 },\n { x: 0.859375, y: 0.671875 },\n { x: 0.859375, y: 0.671875 },\n { x: 0.890625, y: 0.671875 },\n { x: 0.890625, y: 0.671875 },\n { x: 0.921875, y: 0.671875 },\n { x: 0.921875, y: 0.671875 },\n { x: 0.953125, y: 0.671875 },\n { x: 0.953125, y: 0.671875 },\n { x: 0.984375, y: 0.671875 },\n { x: 0.984375, y: 0.671875 },\n { x: 0.015625, y: 0.703125 },\n { x: 0.015625, y: 0.703125 },\n { x: 0.046875, y: 0.703125 },\n { x: 0.046875, y: 0.703125 },\n { x: 0.078125, y: 0.703125 },\n { x: 0.078125, y: 0.703125 },\n { x: 0.109375, y: 0.703125 },\n { x: 0.109375, y: 0.703125 },\n { x: 0.140625, y: 0.703125 },\n { x: 0.140625, y: 0.703125 },\n { x: 0.171875, y: 0.703125 },\n { x: 0.171875, y: 0.703125 },\n { x: 0.203125, y: 0.703125 },\n { x: 0.203125, y: 0.703125 },\n { x: 0.234375, y: 0.703125 },\n { x: 0.234375, y: 0.703125 },\n { x: 0.265625, y: 0.703125 },\n { x: 0.265625, y: 0.703125 },\n { x: 0.296875, y: 0.703125 },\n { x: 0.296875, y: 0.703125 },\n { x: 0.328125, y: 0.703125 },\n { x: 0.328125, y: 0.703125 },\n { x: 0.359375, y: 0.703125 },\n { x: 0.359375, y: 0.703125 },\n { x: 0.390625, y: 0.703125 },\n { x: 0.390625, y: 0.703125 },\n { x: 0.421875, y: 0.703125 },\n { x: 0.421875, y: 0.703125 },\n { x: 0.453125, y: 0.703125 },\n { x: 0.453125, y: 0.703125 },\n { x: 0.484375, y: 0.703125 },\n { x: 0.484375, y: 0.703125 },\n { x: 0.515625, y: 0.703125 },\n { x: 0.515625, y: 0.703125 },\n { x: 0.546875, y: 0.703125 },\n { x: 0.546875, y: 0.703125 },\n { x: 0.578125, y: 0.703125 },\n { x: 0.578125, y: 0.703125 },\n { x: 0.609375, y: 0.703125 },\n { x: 0.609375, y: 0.703125 },\n { x: 0.640625, y: 0.703125 },\n { x: 0.640625, y: 0.703125 },\n { x: 0.671875, y: 0.703125 },\n { x: 0.671875, y: 0.703125 },\n { x: 0.703125, y: 0.703125 },\n { x: 0.703125, y: 0.703125 },\n { x: 0.734375, y: 0.703125 },\n { x: 0.734375, y: 0.703125 },\n { x: 0.765625, y: 0.703125 },\n { x: 0.765625, y: 0.703125 },\n { x: 0.796875, y: 0.703125 },\n { x: 0.796875, y: 0.703125 },\n { x: 0.828125, y: 0.703125 },\n { x: 0.828125, y: 0.703125 },\n { x: 0.859375, y: 0.703125 },\n { x: 0.859375, y: 0.703125 },\n { x: 0.890625, y: 0.703125 },\n { x: 0.890625, y: 0.703125 },\n { x: 0.921875, y: 0.703125 },\n { x: 0.921875, y: 0.703125 },\n { x: 0.953125, y: 0.703125 },\n { x: 0.953125, y: 0.703125 },\n { x: 0.984375, y: 0.703125 },\n { x: 0.984375, y: 0.703125 },\n { x: 0.015625, y: 0.734375 },\n { x: 0.015625, y: 0.734375 },\n { x: 0.046875, y: 0.734375 },\n { x: 0.046875, y: 0.734375 },\n { x: 0.078125, y: 0.734375 },\n { x: 0.078125, y: 0.734375 },\n { x: 0.109375, y: 0.734375 },\n { x: 0.109375, y: 0.734375 },\n { x: 0.140625, y: 0.734375 },\n { x: 0.140625, y: 0.734375 },\n { x: 0.171875, y: 0.734375 },\n { x: 0.171875, y: 0.734375 },\n { x: 0.203125, y: 0.734375 },\n { x: 0.203125, y: 0.734375 },\n { x: 0.234375, y: 0.734375 },\n { x: 0.234375, y: 0.734375 },\n { x: 0.265625, y: 0.734375 },\n { x: 0.265625, y: 0.734375 },\n { x: 0.296875, y: 0.734375 },\n { x: 0.296875, y: 0.734375 },\n { x: 0.328125, y: 0.734375 },\n { x: 0.328125, y: 0.734375 },\n { x: 0.359375, y: 0.734375 },\n { x: 0.359375, y: 0.734375 },\n { x: 0.390625, y: 0.734375 },\n { x: 0.390625, y: 0.734375 },\n { x: 0.421875, y: 0.734375 },\n { x: 0.421875, y: 0.734375 },\n { x: 0.453125, y: 0.734375 },\n { x: 0.453125, y: 0.734375 },\n { x: 0.484375, y: 0.734375 },\n { x: 0.484375, y: 0.734375 },\n { x: 0.515625, y: 0.734375 },\n { x: 0.515625, y: 0.734375 },\n { x: 0.546875, y: 0.734375 },\n { x: 0.546875, y: 0.734375 },\n { x: 0.578125, y: 0.734375 },\n { x: 0.578125, y: 0.734375 },\n { x: 0.609375, y: 0.734375 },\n { x: 0.609375, y: 0.734375 },\n { x: 0.640625, y: 0.734375 },\n { x: 0.640625, y: 0.734375 },\n { x: 0.671875, y: 0.734375 },\n { x: 0.671875, y: 0.734375 },\n { x: 0.703125, y: 0.734375 },\n { x: 0.703125, y: 0.734375 },\n { x: 0.734375, y: 0.734375 },\n { x: 0.734375, y: 0.734375 },\n { x: 0.765625, y: 0.734375 },\n { x: 0.765625, y: 0.734375 },\n { x: 0.796875, y: 0.734375 },\n { x: 0.796875, y: 0.734375 },\n { x: 0.828125, y: 0.734375 },\n { x: 0.828125, y: 0.734375 },\n { x: 0.859375, y: 0.734375 },\n { x: 0.859375, y: 0.734375 },\n { x: 0.890625, y: 0.734375 },\n { x: 0.890625, y: 0.734375 },\n { x: 0.921875, y: 0.734375 },\n { x: 0.921875, y: 0.734375 },\n { x: 0.953125, y: 0.734375 },\n { x: 0.953125, y: 0.734375 },\n { x: 0.984375, y: 0.734375 },\n { x: 0.984375, y: 0.734375 },\n { x: 0.015625, y: 0.765625 },\n { x: 0.015625, y: 0.765625 },\n { x: 0.046875, y: 0.765625 },\n { x: 0.046875, y: 0.765625 },\n { x: 0.078125, y: 0.765625 },\n { x: 0.078125, y: 0.765625 },\n { x: 0.109375, y: 0.765625 },\n { x: 0.109375, y: 0.765625 },\n { x: 0.140625, y: 0.765625 },\n { x: 0.140625, y: 0.765625 },\n { x: 0.171875, y: 0.765625 },\n { x: 0.171875, y: 0.765625 },\n { x: 0.203125, y: 0.765625 },\n { x: 0.203125, y: 0.765625 },\n { x: 0.234375, y: 0.765625 },\n { x: 0.234375, y: 0.765625 },\n { x: 0.265625, y: 0.765625 },\n { x: 0.265625, y: 0.765625 },\n { x: 0.296875, y: 0.765625 },\n { x: 0.296875, y: 0.765625 },\n { x: 0.328125, y: 0.765625 },\n { x: 0.328125, y: 0.765625 },\n { x: 0.359375, y: 0.765625 },\n { x: 0.359375, y: 0.765625 },\n { x: 0.390625, y: 0.765625 },\n { x: 0.390625, y: 0.765625 },\n { x: 0.421875, y: 0.765625 },\n { x: 0.421875, y: 0.765625 },\n { x: 0.453125, y: 0.765625 },\n { x: 0.453125, y: 0.765625 },\n { x: 0.484375, y: 0.765625 },\n { x: 0.484375, y: 0.765625 },\n { x: 0.515625, y: 0.765625 },\n { x: 0.515625, y: 0.765625 },\n { x: 0.546875, y: 0.765625 },\n { x: 0.546875, y: 0.765625 },\n { x: 0.578125, y: 0.765625 },\n { x: 0.578125, y: 0.765625 },\n { x: 0.609375, y: 0.765625 },\n { x: 0.609375, y: 0.765625 },\n { x: 0.640625, y: 0.765625 },\n { x: 0.640625, y: 0.765625 },\n { x: 0.671875, y: 0.765625 },\n { x: 0.671875, y: 0.765625 },\n { x: 0.703125, y: 0.765625 },\n { x: 0.703125, y: 0.765625 },\n { x: 0.734375, y: 0.765625 },\n { x: 0.734375, y: 0.765625 },\n { x: 0.765625, y: 0.765625 },\n { x: 0.765625, y: 0.765625 },\n { x: 0.796875, y: 0.765625 },\n { x: 0.796875, y: 0.765625 },\n { x: 0.828125, y: 0.765625 },\n { x: 0.828125, y: 0.765625 },\n { x: 0.859375, y: 0.765625 },\n { x: 0.859375, y: 0.765625 },\n { x: 0.890625, y: 0.765625 },\n { x: 0.890625, y: 0.765625 },\n { x: 0.921875, y: 0.765625 },\n { x: 0.921875, y: 0.765625 },\n { x: 0.953125, y: 0.765625 },\n { x: 0.953125, y: 0.765625 },\n { x: 0.984375, y: 0.765625 },\n { x: 0.984375, y: 0.765625 },\n { x: 0.015625, y: 0.796875 },\n { x: 0.015625, y: 0.796875 },\n { x: 0.046875, y: 0.796875 },\n { x: 0.046875, y: 0.796875 },\n { x: 0.078125, y: 0.796875 },\n { x: 0.078125, y: 0.796875 },\n { x: 0.109375, y: 0.796875 },\n { x: 0.109375, y: 0.796875 },\n { x: 0.140625, y: 0.796875 },\n { x: 0.140625, y: 0.796875 },\n { x: 0.171875, y: 0.796875 },\n { x: 0.171875, y: 0.796875 },\n { x: 0.203125, y: 0.796875 },\n { x: 0.203125, y: 0.796875 },\n { x: 0.234375, y: 0.796875 },\n { x: 0.234375, y: 0.796875 },\n { x: 0.265625, y: 0.796875 },\n { x: 0.265625, y: 0.796875 },\n { x: 0.296875, y: 0.796875 },\n { x: 0.296875, y: 0.796875 },\n { x: 0.328125, y: 0.796875 },\n { x: 0.328125, y: 0.796875 },\n { x: 0.359375, y: 0.796875 },\n { x: 0.359375, y: 0.796875 },\n { x: 0.390625, y: 0.796875 },\n { x: 0.390625, y: 0.796875 },\n { x: 0.421875, y: 0.796875 },\n { x: 0.421875, y: 0.796875 },\n { x: 0.453125, y: 0.796875 },\n { x: 0.453125, y: 0.796875 },\n { x: 0.484375, y: 0.796875 },\n { x: 0.484375, y: 0.796875 },\n { x: 0.515625, y: 0.796875 },\n { x: 0.515625, y: 0.796875 },\n { x: 0.546875, y: 0.796875 },\n { x: 0.546875, y: 0.796875 },\n { x: 0.578125, y: 0.796875 },\n { x: 0.578125, y: 0.796875 },\n { x: 0.609375, y: 0.796875 },\n { x: 0.609375, y: 0.796875 },\n { x: 0.640625, y: 0.796875 },\n { x: 0.640625, y: 0.796875 },\n { x: 0.671875, y: 0.796875 },\n { x: 0.671875, y: 0.796875 },\n { x: 0.703125, y: 0.796875 },\n { x: 0.703125, y: 0.796875 },\n { x: 0.734375, y: 0.796875 },\n { x: 0.734375, y: 0.796875 },\n { x: 0.765625, y: 0.796875 },\n { x: 0.765625, y: 0.796875 },\n { x: 0.796875, y: 0.796875 },\n { x: 0.796875, y: 0.796875 },\n { x: 0.828125, y: 0.796875 },\n { x: 0.828125, y: 0.796875 },\n { x: 0.859375, y: 0.796875 },\n { x: 0.859375, y: 0.796875 },\n { x: 0.890625, y: 0.796875 },\n { x: 0.890625, y: 0.796875 },\n { x: 0.921875, y: 0.796875 },\n { x: 0.921875, y: 0.796875 },\n { x: 0.953125, y: 0.796875 },\n { x: 0.953125, y: 0.796875 },\n { x: 0.984375, y: 0.796875 },\n { x: 0.984375, y: 0.796875 },\n { x: 0.015625, y: 0.828125 },\n { x: 0.015625, y: 0.828125 },\n { x: 0.046875, y: 0.828125 },\n { x: 0.046875, y: 0.828125 },\n { x: 0.078125, y: 0.828125 },\n { x: 0.078125, y: 0.828125 },\n { x: 0.109375, y: 0.828125 },\n { x: 0.109375, y: 0.828125 },\n { x: 0.140625, y: 0.828125 },\n { x: 0.140625, y: 0.828125 },\n { x: 0.171875, y: 0.828125 },\n { x: 0.171875, y: 0.828125 },\n { x: 0.203125, y: 0.828125 },\n { x: 0.203125, y: 0.828125 },\n { x: 0.234375, y: 0.828125 },\n { x: 0.234375, y: 0.828125 },\n { x: 0.265625, y: 0.828125 },\n { x: 0.265625, y: 0.828125 },\n { x: 0.296875, y: 0.828125 },\n { x: 0.296875, y: 0.828125 },\n { x: 0.328125, y: 0.828125 },\n { x: 0.328125, y: 0.828125 },\n { x: 0.359375, y: 0.828125 },\n { x: 0.359375, y: 0.828125 },\n { x: 0.390625, y: 0.828125 },\n { x: 0.390625, y: 0.828125 },\n { x: 0.421875, y: 0.828125 },\n { x: 0.421875, y: 0.828125 },\n { x: 0.453125, y: 0.828125 },\n { x: 0.453125, y: 0.828125 },\n { x: 0.484375, y: 0.828125 },\n { x: 0.484375, y: 0.828125 },\n { x: 0.515625, y: 0.828125 },\n { x: 0.515625, y: 0.828125 },\n { x: 0.546875, y: 0.828125 },\n { x: 0.546875, y: 0.828125 },\n { x: 0.578125, y: 0.828125 },\n { x: 0.578125, y: 0.828125 },\n { x: 0.609375, y: 0.828125 },\n { x: 0.609375, y: 0.828125 },\n { x: 0.640625, y: 0.828125 },\n { x: 0.640625, y: 0.828125 },\n { x: 0.671875, y: 0.828125 },\n { x: 0.671875, y: 0.828125 },\n { x: 0.703125, y: 0.828125 },\n { x: 0.703125, y: 0.828125 },\n { x: 0.734375, y: 0.828125 },\n { x: 0.734375, y: 0.828125 },\n { x: 0.765625, y: 0.828125 },\n { x: 0.765625, y: 0.828125 },\n { x: 0.796875, y: 0.828125 },\n { x: 0.796875, y: 0.828125 },\n { x: 0.828125, y: 0.828125 },\n { x: 0.828125, y: 0.828125 },\n { x: 0.859375, y: 0.828125 },\n { x: 0.859375, y: 0.828125 },\n { x: 0.890625, y: 0.828125 },\n { x: 0.890625, y: 0.828125 },\n { x: 0.921875, y: 0.828125 },\n { x: 0.921875, y: 0.828125 },\n { x: 0.953125, y: 0.828125 },\n { x: 0.953125, y: 0.828125 },\n { x: 0.984375, y: 0.828125 },\n { x: 0.984375, y: 0.828125 },\n { x: 0.015625, y: 0.859375 },\n { x: 0.015625, y: 0.859375 },\n { x: 0.046875, y: 0.859375 },\n { x: 0.046875, y: 0.859375 },\n { x: 0.078125, y: 0.859375 },\n { x: 0.078125, y: 0.859375 },\n { x: 0.109375, y: 0.859375 },\n { x: 0.109375, y: 0.859375 },\n { x: 0.140625, y: 0.859375 },\n { x: 0.140625, y: 0.859375 },\n { x: 0.171875, y: 0.859375 },\n { x: 0.171875, y: 0.859375 },\n { x: 0.203125, y: 0.859375 },\n { x: 0.203125, y: 0.859375 },\n { x: 0.234375, y: 0.859375 },\n { x: 0.234375, y: 0.859375 },\n { x: 0.265625, y: 0.859375 },\n { x: 0.265625, y: 0.859375 },\n { x: 0.296875, y: 0.859375 },\n { x: 0.296875, y: 0.859375 },\n { x: 0.328125, y: 0.859375 },\n { x: 0.328125, y: 0.859375 },\n { x: 0.359375, y: 0.859375 },\n { x: 0.359375, y: 0.859375 },\n { x: 0.390625, y: 0.859375 },\n { x: 0.390625, y: 0.859375 },\n { x: 0.421875, y: 0.859375 },\n { x: 0.421875, y: 0.859375 },\n { x: 0.453125, y: 0.859375 },\n { x: 0.453125, y: 0.859375 },\n { x: 0.484375, y: 0.859375 },\n { x: 0.484375, y: 0.859375 },\n { x: 0.515625, y: 0.859375 },\n { x: 0.515625, y: 0.859375 },\n { x: 0.546875, y: 0.859375 },\n { x: 0.546875, y: 0.859375 },\n { x: 0.578125, y: 0.859375 },\n { x: 0.578125, y: 0.859375 },\n { x: 0.609375, y: 0.859375 },\n { x: 0.609375, y: 0.859375 },\n { x: 0.640625, y: 0.859375 },\n { x: 0.640625, y: 0.859375 },\n { x: 0.671875, y: 0.859375 },\n { x: 0.671875, y: 0.859375 },\n { x: 0.703125, y: 0.859375 },\n { x: 0.703125, y: 0.859375 },\n { x: 0.734375, y: 0.859375 },\n { x: 0.734375, y: 0.859375 },\n { x: 0.765625, y: 0.859375 },\n { x: 0.765625, y: 0.859375 },\n { x: 0.796875, y: 0.859375 },\n { x: 0.796875, y: 0.859375 },\n { x: 0.828125, y: 0.859375 },\n { x: 0.828125, y: 0.859375 },\n { x: 0.859375, y: 0.859375 },\n { x: 0.859375, y: 0.859375 },\n { x: 0.890625, y: 0.859375 },\n { x: 0.890625, y: 0.859375 },\n { x: 0.921875, y: 0.859375 },\n { x: 0.921875, y: 0.859375 },\n { x: 0.953125, y: 0.859375 },\n { x: 0.953125, y: 0.859375 },\n { x: 0.984375, y: 0.859375 },\n { x: 0.984375, y: 0.859375 },\n { x: 0.015625, y: 0.890625 },\n { x: 0.015625, y: 0.890625 },\n { x: 0.046875, y: 0.890625 },\n { x: 0.046875, y: 0.890625 },\n { x: 0.078125, y: 0.890625 },\n { x: 0.078125, y: 0.890625 },\n { x: 0.109375, y: 0.890625 },\n { x: 0.109375, y: 0.890625 },\n { x: 0.140625, y: 0.890625 },\n { x: 0.140625, y: 0.890625 },\n { x: 0.171875, y: 0.890625 },\n { x: 0.171875, y: 0.890625 },\n { x: 0.203125, y: 0.890625 },\n { x: 0.203125, y: 0.890625 },\n { x: 0.234375, y: 0.890625 },\n { x: 0.234375, y: 0.890625 },\n { x: 0.265625, y: 0.890625 },\n { x: 0.265625, y: 0.890625 },\n { x: 0.296875, y: 0.890625 },\n { x: 0.296875, y: 0.890625 },\n { x: 0.328125, y: 0.890625 },\n { x: 0.328125, y: 0.890625 },\n { x: 0.359375, y: 0.890625 },\n { x: 0.359375, y: 0.890625 },\n { x: 0.390625, y: 0.890625 },\n { x: 0.390625, y: 0.890625 },\n { x: 0.421875, y: 0.890625 },\n { x: 0.421875, y: 0.890625 },\n { x: 0.453125, y: 0.890625 },\n { x: 0.453125, y: 0.890625 },\n { x: 0.484375, y: 0.890625 },\n { x: 0.484375, y: 0.890625 },\n { x: 0.515625, y: 0.890625 },\n { x: 0.515625, y: 0.890625 },\n { x: 0.546875, y: 0.890625 },\n { x: 0.546875, y: 0.890625 },\n { x: 0.578125, y: 0.890625 },\n { x: 0.578125, y: 0.890625 },\n { x: 0.609375, y: 0.890625 },\n { x: 0.609375, y: 0.890625 },\n { x: 0.640625, y: 0.890625 },\n { x: 0.640625, y: 0.890625 },\n { x: 0.671875, y: 0.890625 },\n { x: 0.671875, y: 0.890625 },\n { x: 0.703125, y: 0.890625 },\n { x: 0.703125, y: 0.890625 },\n { x: 0.734375, y: 0.890625 },\n { x: 0.734375, y: 0.890625 },\n { x: 0.765625, y: 0.890625 },\n { x: 0.765625, y: 0.890625 },\n { x: 0.796875, y: 0.890625 },\n { x: 0.796875, y: 0.890625 },\n { x: 0.828125, y: 0.890625 },\n { x: 0.828125, y: 0.890625 },\n { x: 0.859375, y: 0.890625 },\n { x: 0.859375, y: 0.890625 },\n { x: 0.890625, y: 0.890625 },\n { x: 0.890625, y: 0.890625 },\n { x: 0.921875, y: 0.890625 },\n { x: 0.921875, y: 0.890625 },\n { x: 0.953125, y: 0.890625 },\n { x: 0.953125, y: 0.890625 },\n { x: 0.984375, y: 0.890625 },\n { x: 0.984375, y: 0.890625 },\n { x: 0.015625, y: 0.921875 },\n { x: 0.015625, y: 0.921875 },\n { x: 0.046875, y: 0.921875 },\n { x: 0.046875, y: 0.921875 },\n { x: 0.078125, y: 0.921875 },\n { x: 0.078125, y: 0.921875 },\n { x: 0.109375, y: 0.921875 },\n { x: 0.109375, y: 0.921875 },\n { x: 0.140625, y: 0.921875 },\n { x: 0.140625, y: 0.921875 },\n { x: 0.171875, y: 0.921875 },\n { x: 0.171875, y: 0.921875 },\n { x: 0.203125, y: 0.921875 },\n { x: 0.203125, y: 0.921875 },\n { x: 0.234375, y: 0.921875 },\n { x: 0.234375, y: 0.921875 },\n { x: 0.265625, y: 0.921875 },\n { x: 0.265625, y: 0.921875 },\n { x: 0.296875, y: 0.921875 },\n { x: 0.296875, y: 0.921875 },\n { x: 0.328125, y: 0.921875 },\n { x: 0.328125, y: 0.921875 },\n { x: 0.359375, y: 0.921875 },\n { x: 0.359375, y: 0.921875 },\n { x: 0.390625, y: 0.921875 },\n { x: 0.390625, y: 0.921875 },\n { x: 0.421875, y: 0.921875 },\n { x: 0.421875, y: 0.921875 },\n { x: 0.453125, y: 0.921875 },\n { x: 0.453125, y: 0.921875 },\n { x: 0.484375, y: 0.921875 },\n { x: 0.484375, y: 0.921875 },\n { x: 0.515625, y: 0.921875 },\n { x: 0.515625, y: 0.921875 },\n { x: 0.546875, y: 0.921875 },\n { x: 0.546875, y: 0.921875 },\n { x: 0.578125, y: 0.921875 },\n { x: 0.578125, y: 0.921875 },\n { x: 0.609375, y: 0.921875 },\n { x: 0.609375, y: 0.921875 },\n { x: 0.640625, y: 0.921875 },\n { x: 0.640625, y: 0.921875 },\n { x: 0.671875, y: 0.921875 },\n { x: 0.671875, y: 0.921875 },\n { x: 0.703125, y: 0.921875 },\n { x: 0.703125, y: 0.921875 },\n { x: 0.734375, y: 0.921875 },\n { x: 0.734375, y: 0.921875 },\n { x: 0.765625, y: 0.921875 },\n { x: 0.765625, y: 0.921875 },\n { x: 0.796875, y: 0.921875 },\n { x: 0.796875, y: 0.921875 },\n { x: 0.828125, y: 0.921875 },\n { x: 0.828125, y: 0.921875 },\n { x: 0.859375, y: 0.921875 },\n { x: 0.859375, y: 0.921875 },\n { x: 0.890625, y: 0.921875 },\n { x: 0.890625, y: 0.921875 },\n { x: 0.921875, y: 0.921875 },\n { x: 0.921875, y: 0.921875 },\n { x: 0.953125, y: 0.921875 },\n { x: 0.953125, y: 0.921875 },\n { x: 0.984375, y: 0.921875 },\n { x: 0.984375, y: 0.921875 },\n { x: 0.015625, y: 0.953125 },\n { x: 0.015625, y: 0.953125 },\n { x: 0.046875, y: 0.953125 },\n { x: 0.046875, y: 0.953125 },\n { x: 0.078125, y: 0.953125 },\n { x: 0.078125, y: 0.953125 },\n { x: 0.109375, y: 0.953125 },\n { x: 0.109375, y: 0.953125 },\n { x: 0.140625, y: 0.953125 },\n { x: 0.140625, y: 0.953125 },\n { x: 0.171875, y: 0.953125 },\n { x: 0.171875, y: 0.953125 },\n { x: 0.203125, y: 0.953125 },\n { x: 0.203125, y: 0.953125 },\n { x: 0.234375, y: 0.953125 },\n { x: 0.234375, y: 0.953125 },\n { x: 0.265625, y: 0.953125 },\n { x: 0.265625, y: 0.953125 },\n { x: 0.296875, y: 0.953125 },\n { x: 0.296875, y: 0.953125 },\n { x: 0.328125, y: 0.953125 },\n { x: 0.328125, y: 0.953125 },\n { x: 0.359375, y: 0.953125 },\n { x: 0.359375, y: 0.953125 },\n { x: 0.390625, y: 0.953125 },\n { x: 0.390625, y: 0.953125 },\n { x: 0.421875, y: 0.953125 },\n { x: 0.421875, y: 0.953125 },\n { x: 0.453125, y: 0.953125 },\n { x: 0.453125, y: 0.953125 },\n { x: 0.484375, y: 0.953125 },\n { x: 0.484375, y: 0.953125 },\n { x: 0.515625, y: 0.953125 },\n { x: 0.515625, y: 0.953125 },\n { x: 0.546875, y: 0.953125 },\n { x: 0.546875, y: 0.953125 },\n { x: 0.578125, y: 0.953125 },\n { x: 0.578125, y: 0.953125 },\n { x: 0.609375, y: 0.953125 },\n { x: 0.609375, y: 0.953125 },\n { x: 0.640625, y: 0.953125 },\n { x: 0.640625, y: 0.953125 },\n { x: 0.671875, y: 0.953125 },\n { x: 0.671875, y: 0.953125 },\n { x: 0.703125, y: 0.953125 },\n { x: 0.703125, y: 0.953125 },\n { x: 0.734375, y: 0.953125 },\n { x: 0.734375, y: 0.953125 },\n { x: 0.765625, y: 0.953125 },\n { x: 0.765625, y: 0.953125 },\n { x: 0.796875, y: 0.953125 },\n { x: 0.796875, y: 0.953125 },\n { x: 0.828125, y: 0.953125 },\n { x: 0.828125, y: 0.953125 },\n { x: 0.859375, y: 0.953125 },\n { x: 0.859375, y: 0.953125 },\n { x: 0.890625, y: 0.953125 },\n { x: 0.890625, y: 0.953125 },\n { x: 0.921875, y: 0.953125 },\n { x: 0.921875, y: 0.953125 },\n { x: 0.953125, y: 0.953125 },\n { x: 0.953125, y: 0.953125 },\n { x: 0.984375, y: 0.953125 },\n { x: 0.984375, y: 0.953125 },\n { x: 0.015625, y: 0.984375 },\n { x: 0.015625, y: 0.984375 },\n { x: 0.046875, y: 0.984375 },\n { x: 0.046875, y: 0.984375 },\n { x: 0.078125, y: 0.984375 },\n { x: 0.078125, y: 0.984375 },\n { x: 0.109375, y: 0.984375 },\n { x: 0.109375, y: 0.984375 },\n { x: 0.140625, y: 0.984375 },\n { x: 0.140625, y: 0.984375 },\n { x: 0.171875, y: 0.984375 },\n { x: 0.171875, y: 0.984375 },\n { x: 0.203125, y: 0.984375 },\n { x: 0.203125, y: 0.984375 },\n { x: 0.234375, y: 0.984375 },\n { x: 0.234375, y: 0.984375 },\n { x: 0.265625, y: 0.984375 },\n { x: 0.265625, y: 0.984375 },\n { x: 0.296875, y: 0.984375 },\n { x: 0.296875, y: 0.984375 },\n { x: 0.328125, y: 0.984375 },\n { x: 0.328125, y: 0.984375 },\n { x: 0.359375, y: 0.984375 },\n { x: 0.359375, y: 0.984375 },\n { x: 0.390625, y: 0.984375 },\n { x: 0.390625, y: 0.984375 },\n { x: 0.421875, y: 0.984375 },\n { x: 0.421875, y: 0.984375 },\n { x: 0.453125, y: 0.984375 },\n { x: 0.453125, y: 0.984375 },\n { x: 0.484375, y: 0.984375 },\n { x: 0.484375, y: 0.984375 },\n { x: 0.515625, y: 0.984375 },\n { x: 0.515625, y: 0.984375 },\n { x: 0.546875, y: 0.984375 },\n { x: 0.546875, y: 0.984375 },\n { x: 0.578125, y: 0.984375 },\n { x: 0.578125, y: 0.984375 },\n { x: 0.609375, y: 0.984375 },\n { x: 0.609375, y: 0.984375 },\n { x: 0.640625, y: 0.984375 },\n { x: 0.640625, y: 0.984375 },\n { x: 0.671875, y: 0.984375 },\n { x: 0.671875, y: 0.984375 },\n { x: 0.703125, y: 0.984375 },\n { x: 0.703125, y: 0.984375 },\n { x: 0.734375, y: 0.984375 },\n { x: 0.734375, y: 0.984375 },\n { x: 0.765625, y: 0.984375 },\n { x: 0.765625, y: 0.984375 },\n { x: 0.796875, y: 0.984375 },\n { x: 0.796875, y: 0.984375 },\n { x: 0.828125, y: 0.984375 },\n { x: 0.828125, y: 0.984375 },\n { x: 0.859375, y: 0.984375 },\n { x: 0.859375, y: 0.984375 },\n { x: 0.890625, y: 0.984375 },\n { x: 0.890625, y: 0.984375 },\n { x: 0.921875, y: 0.984375 },\n { x: 0.921875, y: 0.984375 },\n { x: 0.953125, y: 0.984375 },\n { x: 0.953125, y: 0.984375 },\n { x: 0.984375, y: 0.984375 },\n { x: 0.984375, y: 0.984375 },\n { x: 0.03125, y: 0.03125 },\n { x: 0.03125, y: 0.03125 },\n { x: 0.09375, y: 0.03125 },\n { x: 0.09375, y: 0.03125 },\n { x: 0.15625, y: 0.03125 },\n { x: 0.15625, y: 0.03125 },\n { x: 0.21875, y: 0.03125 },\n { x: 0.21875, y: 0.03125 },\n { x: 0.28125, y: 0.03125 },\n { x: 0.28125, y: 0.03125 },\n { x: 0.34375, y: 0.03125 },\n { x: 0.34375, y: 0.03125 },\n { x: 0.40625, y: 0.03125 },\n { x: 0.40625, y: 0.03125 },\n { x: 0.46875, y: 0.03125 },\n { x: 0.46875, y: 0.03125 },\n { x: 0.53125, y: 0.03125 },\n { x: 0.53125, y: 0.03125 },\n { x: 0.59375, y: 0.03125 },\n { x: 0.59375, y: 0.03125 },\n { x: 0.65625, y: 0.03125 },\n { x: 0.65625, y: 0.03125 },\n { x: 0.71875, y: 0.03125 },\n { x: 0.71875, y: 0.03125 },\n { x: 0.78125, y: 0.03125 },\n { x: 0.78125, y: 0.03125 },\n { x: 0.84375, y: 0.03125 },\n { x: 0.84375, y: 0.03125 },\n { x: 0.90625, y: 0.03125 },\n { x: 0.90625, y: 0.03125 },\n { x: 0.96875, y: 0.03125 },\n { x: 0.96875, y: 0.03125 },\n { x: 0.03125, y: 0.09375 },\n { x: 0.03125, y: 0.09375 },\n { x: 0.09375, y: 0.09375 },\n { x: 0.09375, y: 0.09375 },\n { x: 0.15625, y: 0.09375 },\n { x: 0.15625, y: 0.09375 },\n { x: 0.21875, y: 0.09375 },\n { x: 0.21875, y: 0.09375 },\n { x: 0.28125, y: 0.09375 },\n { x: 0.28125, y: 0.09375 },\n { x: 0.34375, y: 0.09375 },\n { x: 0.34375, y: 0.09375 },\n { x: 0.40625, y: 0.09375 },\n { x: 0.40625, y: 0.09375 },\n { x: 0.46875, y: 0.09375 },\n { x: 0.46875, y: 0.09375 },\n { x: 0.53125, y: 0.09375 },\n { x: 0.53125, y: 0.09375 },\n { x: 0.59375, y: 0.09375 },\n { x: 0.59375, y: 0.09375 },\n { x: 0.65625, y: 0.09375 },\n { x: 0.65625, y: 0.09375 },\n { x: 0.71875, y: 0.09375 },\n { x: 0.71875, y: 0.09375 },\n { x: 0.78125, y: 0.09375 },\n { x: 0.78125, y: 0.09375 },\n { x: 0.84375, y: 0.09375 },\n { x: 0.84375, y: 0.09375 },\n { x: 0.90625, y: 0.09375 },\n { x: 0.90625, y: 0.09375 },\n { x: 0.96875, y: 0.09375 },\n { x: 0.96875, y: 0.09375 },\n { x: 0.03125, y: 0.15625 },\n { x: 0.03125, y: 0.15625 },\n { x: 0.09375, y: 0.15625 },\n { x: 0.09375, y: 0.15625 },\n { x: 0.15625, y: 0.15625 },\n { x: 0.15625, y: 0.15625 },\n { x: 0.21875, y: 0.15625 },\n { x: 0.21875, y: 0.15625 },\n { x: 0.28125, y: 0.15625 },\n { x: 0.28125, y: 0.15625 },\n { x: 0.34375, y: 0.15625 },\n { x: 0.34375, y: 0.15625 },\n { x: 0.40625, y: 0.15625 },\n { x: 0.40625, y: 0.15625 },\n { x: 0.46875, y: 0.15625 },\n { x: 0.46875, y: 0.15625 },\n { x: 0.53125, y: 0.15625 },\n { x: 0.53125, y: 0.15625 },\n { x: 0.59375, y: 0.15625 },\n { x: 0.59375, y: 0.15625 },\n { x: 0.65625, y: 0.15625 },\n { x: 0.65625, y: 0.15625 },\n { x: 0.71875, y: 0.15625 },\n { x: 0.71875, y: 0.15625 },\n { x: 0.78125, y: 0.15625 },\n { x: 0.78125, y: 0.15625 },\n { x: 0.84375, y: 0.15625 },\n { x: 0.84375, y: 0.15625 },\n { x: 0.90625, y: 0.15625 },\n { x: 0.90625, y: 0.15625 },\n { x: 0.96875, y: 0.15625 },\n { x: 0.96875, y: 0.15625 },\n { x: 0.03125, y: 0.21875 },\n { x: 0.03125, y: 0.21875 },\n { x: 0.09375, y: 0.21875 },\n { x: 0.09375, y: 0.21875 },\n { x: 0.15625, y: 0.21875 },\n { x: 0.15625, y: 0.21875 },\n { x: 0.21875, y: 0.21875 },\n { x: 0.21875, y: 0.21875 },\n { x: 0.28125, y: 0.21875 },\n { x: 0.28125, y: 0.21875 },\n { x: 0.34375, y: 0.21875 },\n { x: 0.34375, y: 0.21875 },\n { x: 0.40625, y: 0.21875 },\n { x: 0.40625, y: 0.21875 },\n { x: 0.46875, y: 0.21875 },\n { x: 0.46875, y: 0.21875 },\n { x: 0.53125, y: 0.21875 },\n { x: 0.53125, y: 0.21875 },\n { x: 0.59375, y: 0.21875 },\n { x: 0.59375, y: 0.21875 },\n { x: 0.65625, y: 0.21875 },\n { x: 0.65625, y: 0.21875 },\n { x: 0.71875, y: 0.21875 },\n { x: 0.71875, y: 0.21875 },\n { x: 0.78125, y: 0.21875 },\n { x: 0.78125, y: 0.21875 },\n { x: 0.84375, y: 0.21875 },\n { x: 0.84375, y: 0.21875 },\n { x: 0.90625, y: 0.21875 },\n { x: 0.90625, y: 0.21875 },\n { x: 0.96875, y: 0.21875 },\n { x: 0.96875, y: 0.21875 },\n { x: 0.03125, y: 0.28125 },\n { x: 0.03125, y: 0.28125 },\n { x: 0.09375, y: 0.28125 },\n { x: 0.09375, y: 0.28125 },\n { x: 0.15625, y: 0.28125 },\n { x: 0.15625, y: 0.28125 },\n { x: 0.21875, y: 0.28125 },\n { x: 0.21875, y: 0.28125 },\n { x: 0.28125, y: 0.28125 },\n { x: 0.28125, y: 0.28125 },\n { x: 0.34375, y: 0.28125 },\n { x: 0.34375, y: 0.28125 },\n { x: 0.40625, y: 0.28125 },\n { x: 0.40625, y: 0.28125 },\n { x: 0.46875, y: 0.28125 },\n { x: 0.46875, y: 0.28125 },\n { x: 0.53125, y: 0.28125 },\n { x: 0.53125, y: 0.28125 },\n { x: 0.59375, y: 0.28125 },\n { x: 0.59375, y: 0.28125 },\n { x: 0.65625, y: 0.28125 },\n { x: 0.65625, y: 0.28125 },\n { x: 0.71875, y: 0.28125 },\n { x: 0.71875, y: 0.28125 },\n { x: 0.78125, y: 0.28125 },\n { x: 0.78125, y: 0.28125 },\n { x: 0.84375, y: 0.28125 },\n { x: 0.84375, y: 0.28125 },\n { x: 0.90625, y: 0.28125 },\n { x: 0.90625, y: 0.28125 },\n { x: 0.96875, y: 0.28125 },\n { x: 0.96875, y: 0.28125 },\n { x: 0.03125, y: 0.34375 },\n { x: 0.03125, y: 0.34375 },\n { x: 0.09375, y: 0.34375 },\n { x: 0.09375, y: 0.34375 },\n { x: 0.15625, y: 0.34375 },\n { x: 0.15625, y: 0.34375 },\n { x: 0.21875, y: 0.34375 },\n { x: 0.21875, y: 0.34375 },\n { x: 0.28125, y: 0.34375 },\n { x: 0.28125, y: 0.34375 },\n { x: 0.34375, y: 0.34375 },\n { x: 0.34375, y: 0.34375 },\n { x: 0.40625, y: 0.34375 },\n { x: 0.40625, y: 0.34375 },\n { x: 0.46875, y: 0.34375 },\n { x: 0.46875, y: 0.34375 },\n { x: 0.53125, y: 0.34375 },\n { x: 0.53125, y: 0.34375 },\n { x: 0.59375, y: 0.34375 },\n { x: 0.59375, y: 0.34375 },\n { x: 0.65625, y: 0.34375 },\n { x: 0.65625, y: 0.34375 },\n { x: 0.71875, y: 0.34375 },\n { x: 0.71875, y: 0.34375 },\n { x: 0.78125, y: 0.34375 },\n { x: 0.78125, y: 0.34375 },\n { x: 0.84375, y: 0.34375 },\n { x: 0.84375, y: 0.34375 },\n { x: 0.90625, y: 0.34375 },\n { x: 0.90625, y: 0.34375 },\n { x: 0.96875, y: 0.34375 },\n { x: 0.96875, y: 0.34375 },\n { x: 0.03125, y: 0.40625 },\n { x: 0.03125, y: 0.40625 },\n { x: 0.09375, y: 0.40625 },\n { x: 0.09375, y: 0.40625 },\n { x: 0.15625, y: 0.40625 },\n { x: 0.15625, y: 0.40625 },\n { x: 0.21875, y: 0.40625 },\n { x: 0.21875, y: 0.40625 },\n { x: 0.28125, y: 0.40625 },\n { x: 0.28125, y: 0.40625 },\n { x: 0.34375, y: 0.40625 },\n { x: 0.34375, y: 0.40625 },\n { x: 0.40625, y: 0.40625 },\n { x: 0.40625, y: 0.40625 },\n { x: 0.46875, y: 0.40625 },\n { x: 0.46875, y: 0.40625 },\n { x: 0.53125, y: 0.40625 },\n { x: 0.53125, y: 0.40625 },\n { x: 0.59375, y: 0.40625 },\n { x: 0.59375, y: 0.40625 },\n { x: 0.65625, y: 0.40625 },\n { x: 0.65625, y: 0.40625 },\n { x: 0.71875, y: 0.40625 },\n { x: 0.71875, y: 0.40625 },\n { x: 0.78125, y: 0.40625 },\n { x: 0.78125, y: 0.40625 },\n { x: 0.84375, y: 0.40625 },\n { x: 0.84375, y: 0.40625 },\n { x: 0.90625, y: 0.40625 },\n { x: 0.90625, y: 0.40625 },\n { x: 0.96875, y: 0.40625 },\n { x: 0.96875, y: 0.40625 },\n { x: 0.03125, y: 0.46875 },\n { x: 0.03125, y: 0.46875 },\n { x: 0.09375, y: 0.46875 },\n { x: 0.09375, y: 0.46875 },\n { x: 0.15625, y: 0.46875 },\n { x: 0.15625, y: 0.46875 },\n { x: 0.21875, y: 0.46875 },\n { x: 0.21875, y: 0.46875 },\n { x: 0.28125, y: 0.46875 },\n { x: 0.28125, y: 0.46875 },\n { x: 0.34375, y: 0.46875 },\n { x: 0.34375, y: 0.46875 },\n { x: 0.40625, y: 0.46875 },\n { x: 0.40625, y: 0.46875 },\n { x: 0.46875, y: 0.46875 },\n { x: 0.46875, y: 0.46875 },\n { x: 0.53125, y: 0.46875 },\n { x: 0.53125, y: 0.46875 },\n { x: 0.59375, y: 0.46875 },\n { x: 0.59375, y: 0.46875 },\n { x: 0.65625, y: 0.46875 },\n { x: 0.65625, y: 0.46875 },\n { x: 0.71875, y: 0.46875 },\n { x: 0.71875, y: 0.46875 },\n { x: 0.78125, y: 0.46875 },\n { x: 0.78125, y: 0.46875 },\n { x: 0.84375, y: 0.46875 },\n { x: 0.84375, y: 0.46875 },\n { x: 0.90625, y: 0.46875 },\n { x: 0.90625, y: 0.46875 },\n { x: 0.96875, y: 0.46875 },\n { x: 0.96875, y: 0.46875 },\n { x: 0.03125, y: 0.53125 },\n { x: 0.03125, y: 0.53125 },\n { x: 0.09375, y: 0.53125 },\n { x: 0.09375, y: 0.53125 },\n { x: 0.15625, y: 0.53125 },\n { x: 0.15625, y: 0.53125 },\n { x: 0.21875, y: 0.53125 },\n { x: 0.21875, y: 0.53125 },\n { x: 0.28125, y: 0.53125 },\n { x: 0.28125, y: 0.53125 },\n { x: 0.34375, y: 0.53125 },\n { x: 0.34375, y: 0.53125 },\n { x: 0.40625, y: 0.53125 },\n { x: 0.40625, y: 0.53125 },\n { x: 0.46875, y: 0.53125 },\n { x: 0.46875, y: 0.53125 },\n { x: 0.53125, y: 0.53125 },\n { x: 0.53125, y: 0.53125 },\n { x: 0.59375, y: 0.53125 },\n { x: 0.59375, y: 0.53125 },\n { x: 0.65625, y: 0.53125 },\n { x: 0.65625, y: 0.53125 },\n { x: 0.71875, y: 0.53125 },\n { x: 0.71875, y: 0.53125 },\n { x: 0.78125, y: 0.53125 },\n { x: 0.78125, y: 0.53125 },\n { x: 0.84375, y: 0.53125 },\n { x: 0.84375, y: 0.53125 },\n { x: 0.90625, y: 0.53125 },\n { x: 0.90625, y: 0.53125 },\n { x: 0.96875, y: 0.53125 },\n { x: 0.96875, y: 0.53125 },\n { x: 0.03125, y: 0.59375 },\n { x: 0.03125, y: 0.59375 },\n { x: 0.09375, y: 0.59375 },\n { x: 0.09375, y: 0.59375 },\n { x: 0.15625, y: 0.59375 },\n { x: 0.15625, y: 0.59375 },\n { x: 0.21875, y: 0.59375 },\n { x: 0.21875, y: 0.59375 },\n { x: 0.28125, y: 0.59375 },\n { x: 0.28125, y: 0.59375 },\n { x: 0.34375, y: 0.59375 },\n { x: 0.34375, y: 0.59375 },\n { x: 0.40625, y: 0.59375 },\n { x: 0.40625, y: 0.59375 },\n { x: 0.46875, y: 0.59375 },\n { x: 0.46875, y: 0.59375 },\n { x: 0.53125, y: 0.59375 },\n { x: 0.53125, y: 0.59375 },\n { x: 0.59375, y: 0.59375 },\n { x: 0.59375, y: 0.59375 },\n { x: 0.65625, y: 0.59375 },\n { x: 0.65625, y: 0.59375 },\n { x: 0.71875, y: 0.59375 },\n { x: 0.71875, y: 0.59375 },\n { x: 0.78125, y: 0.59375 },\n { x: 0.78125, y: 0.59375 },\n { x: 0.84375, y: 0.59375 },\n { x: 0.84375, y: 0.59375 },\n { x: 0.90625, y: 0.59375 },\n { x: 0.90625, y: 0.59375 },\n { x: 0.96875, y: 0.59375 },\n { x: 0.96875, y: 0.59375 },\n { x: 0.03125, y: 0.65625 },\n { x: 0.03125, y: 0.65625 },\n { x: 0.09375, y: 0.65625 },\n { x: 0.09375, y: 0.65625 },\n { x: 0.15625, y: 0.65625 },\n { x: 0.15625, y: 0.65625 },\n { x: 0.21875, y: 0.65625 },\n { x: 0.21875, y: 0.65625 },\n { x: 0.28125, y: 0.65625 },\n { x: 0.28125, y: 0.65625 },\n { x: 0.34375, y: 0.65625 },\n { x: 0.34375, y: 0.65625 },\n { x: 0.40625, y: 0.65625 },\n { x: 0.40625, y: 0.65625 },\n { x: 0.46875, y: 0.65625 },\n { x: 0.46875, y: 0.65625 },\n { x: 0.53125, y: 0.65625 },\n { x: 0.53125, y: 0.65625 },\n { x: 0.59375, y: 0.65625 },\n { x: 0.59375, y: 0.65625 },\n { x: 0.65625, y: 0.65625 },\n { x: 0.65625, y: 0.65625 },\n { x: 0.71875, y: 0.65625 },\n { x: 0.71875, y: 0.65625 },\n { x: 0.78125, y: 0.65625 },\n { x: 0.78125, y: 0.65625 },\n { x: 0.84375, y: 0.65625 },\n { x: 0.84375, y: 0.65625 },\n { x: 0.90625, y: 0.65625 },\n { x: 0.90625, y: 0.65625 },\n { x: 0.96875, y: 0.65625 },\n { x: 0.96875, y: 0.65625 },\n { x: 0.03125, y: 0.71875 },\n { x: 0.03125, y: 0.71875 },\n { x: 0.09375, y: 0.71875 },\n { x: 0.09375, y: 0.71875 },\n { x: 0.15625, y: 0.71875 },\n { x: 0.15625, y: 0.71875 },\n { x: 0.21875, y: 0.71875 },\n { x: 0.21875, y: 0.71875 },\n { x: 0.28125, y: 0.71875 },\n { x: 0.28125, y: 0.71875 },\n { x: 0.34375, y: 0.71875 },\n { x: 0.34375, y: 0.71875 },\n { x: 0.40625, y: 0.71875 },\n { x: 0.40625, y: 0.71875 },\n { x: 0.46875, y: 0.71875 },\n { x: 0.46875, y: 0.71875 },\n { x: 0.53125, y: 0.71875 },\n { x: 0.53125, y: 0.71875 },\n { x: 0.59375, y: 0.71875 },\n { x: 0.59375, y: 0.71875 },\n { x: 0.65625, y: 0.71875 },\n { x: 0.65625, y: 0.71875 },\n { x: 0.71875, y: 0.71875 },\n { x: 0.71875, y: 0.71875 },\n { x: 0.78125, y: 0.71875 },\n { x: 0.78125, y: 0.71875 },\n { x: 0.84375, y: 0.71875 },\n { x: 0.84375, y: 0.71875 },\n { x: 0.90625, y: 0.71875 },\n { x: 0.90625, y: 0.71875 },\n { x: 0.96875, y: 0.71875 },\n { x: 0.96875, y: 0.71875 },\n { x: 0.03125, y: 0.78125 },\n { x: 0.03125, y: 0.78125 },\n { x: 0.09375, y: 0.78125 },\n { x: 0.09375, y: 0.78125 },\n { x: 0.15625, y: 0.78125 },\n { x: 0.15625, y: 0.78125 },\n { x: 0.21875, y: 0.78125 },\n { x: 0.21875, y: 0.78125 },\n { x: 0.28125, y: 0.78125 },\n { x: 0.28125, y: 0.78125 },\n { x: 0.34375, y: 0.78125 },\n { x: 0.34375, y: 0.78125 },\n { x: 0.40625, y: 0.78125 },\n { x: 0.40625, y: 0.78125 },\n { x: 0.46875, y: 0.78125 },\n { x: 0.46875, y: 0.78125 },\n { x: 0.53125, y: 0.78125 },\n { x: 0.53125, y: 0.78125 },\n { x: 0.59375, y: 0.78125 },\n { x: 0.59375, y: 0.78125 },\n { x: 0.65625, y: 0.78125 },\n { x: 0.65625, y: 0.78125 },\n { x: 0.71875, y: 0.78125 },\n { x: 0.71875, y: 0.78125 },\n { x: 0.78125, y: 0.78125 },\n { x: 0.78125, y: 0.78125 },\n { x: 0.84375, y: 0.78125 },\n { x: 0.84375, y: 0.78125 },\n { x: 0.90625, y: 0.78125 },\n { x: 0.90625, y: 0.78125 },\n { x: 0.96875, y: 0.78125 },\n { x: 0.96875, y: 0.78125 },\n { x: 0.03125, y: 0.84375 },\n { x: 0.03125, y: 0.84375 },\n { x: 0.09375, y: 0.84375 },\n { x: 0.09375, y: 0.84375 },\n { x: 0.15625, y: 0.84375 },\n { x: 0.15625, y: 0.84375 },\n { x: 0.21875, y: 0.84375 },\n { x: 0.21875, y: 0.84375 },\n { x: 0.28125, y: 0.84375 },\n { x: 0.28125, y: 0.84375 },\n { x: 0.34375, y: 0.84375 },\n { x: 0.34375, y: 0.84375 },\n { x: 0.40625, y: 0.84375 },\n { x: 0.40625, y: 0.84375 },\n { x: 0.46875, y: 0.84375 },\n { x: 0.46875, y: 0.84375 },\n { x: 0.53125, y: 0.84375 },\n { x: 0.53125, y: 0.84375 },\n { x: 0.59375, y: 0.84375 },\n { x: 0.59375, y: 0.84375 },\n { x: 0.65625, y: 0.84375 },\n { x: 0.65625, y: 0.84375 },\n { x: 0.71875, y: 0.84375 },\n { x: 0.71875, y: 0.84375 },\n { x: 0.78125, y: 0.84375 },\n { x: 0.78125, y: 0.84375 },\n { x: 0.84375, y: 0.84375 },\n { x: 0.84375, y: 0.84375 },\n { x: 0.90625, y: 0.84375 },\n { x: 0.90625, y: 0.84375 },\n { x: 0.96875, y: 0.84375 },\n { x: 0.96875, y: 0.84375 },\n { x: 0.03125, y: 0.90625 },\n { x: 0.03125, y: 0.90625 },\n { x: 0.09375, y: 0.90625 },\n { x: 0.09375, y: 0.90625 },\n { x: 0.15625, y: 0.90625 },\n { x: 0.15625, y: 0.90625 },\n { x: 0.21875, y: 0.90625 },\n { x: 0.21875, y: 0.90625 },\n { x: 0.28125, y: 0.90625 },\n { x: 0.28125, y: 0.90625 },\n { x: 0.34375, y: 0.90625 },\n { x: 0.34375, y: 0.90625 },\n { x: 0.40625, y: 0.90625 },\n { x: 0.40625, y: 0.90625 },\n { x: 0.46875, y: 0.90625 },\n { x: 0.46875, y: 0.90625 },\n { x: 0.53125, y: 0.90625 },\n { x: 0.53125, y: 0.90625 },\n { x: 0.59375, y: 0.90625 },\n { x: 0.59375, y: 0.90625 },\n { x: 0.65625, y: 0.90625 },\n { x: 0.65625, y: 0.90625 },\n { x: 0.71875, y: 0.90625 },\n { x: 0.71875, y: 0.90625 },\n { x: 0.78125, y: 0.90625 },\n { x: 0.78125, y: 0.90625 },\n { x: 0.84375, y: 0.90625 },\n { x: 0.84375, y: 0.90625 },\n { x: 0.90625, y: 0.90625 },\n { x: 0.90625, y: 0.90625 },\n { x: 0.96875, y: 0.90625 },\n { x: 0.96875, y: 0.90625 },\n { x: 0.03125, y: 0.96875 },\n { x: 0.03125, y: 0.96875 },\n { x: 0.09375, y: 0.96875 },\n { x: 0.09375, y: 0.96875 },\n { x: 0.15625, y: 0.96875 },\n { x: 0.15625, y: 0.96875 },\n { x: 0.21875, y: 0.96875 },\n { x: 0.21875, y: 0.96875 },\n { x: 0.28125, y: 0.96875 },\n { x: 0.28125, y: 0.96875 },\n { x: 0.34375, y: 0.96875 },\n { x: 0.34375, y: 0.96875 },\n { x: 0.40625, y: 0.96875 },\n { x: 0.40625, y: 0.96875 },\n { x: 0.46875, y: 0.96875 },\n { x: 0.46875, y: 0.96875 },\n { x: 0.53125, y: 0.96875 },\n { x: 0.53125, y: 0.96875 },\n { x: 0.59375, y: 0.96875 },\n { x: 0.59375, y: 0.96875 },\n { x: 0.65625, y: 0.96875 },\n { x: 0.65625, y: 0.96875 },\n { x: 0.71875, y: 0.96875 },\n { x: 0.71875, y: 0.96875 },\n { x: 0.78125, y: 0.96875 },\n { x: 0.78125, y: 0.96875 },\n { x: 0.84375, y: 0.96875 },\n { x: 0.84375, y: 0.96875 },\n { x: 0.90625, y: 0.96875 },\n { x: 0.90625, y: 0.96875 },\n { x: 0.96875, y: 0.96875 },\n { x: 0.96875, y: 0.96875 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n];\n", "/**\n * HandPose model implementation\n * See `handpose.ts` for entry point\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as util from './handposeutil';\nimport * as anchors from './handposeanchors';\nimport { constants } from '../tfjs/constants';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport type { Point } from '../result';\n\nexport class HandDetector {\n model: GraphModel;\n anchors: number[][];\n anchorsTensor: Tensor;\n inputSize: number;\n inputSizeTensor: Tensor;\n doubleInputSizeTensor: Tensor;\n\n constructor(model) {\n this.model = model;\n this.anchors = anchors.anchors.map((anchor) => [anchor.x, anchor.y]);\n this.anchorsTensor = tf.tensor2d(this.anchors);\n this.inputSize = (this.model && this.model.inputs && this.model.inputs[0].shape) ? this.model.inputs[0].shape[2] : 0;\n this.inputSizeTensor = tf.tensor1d([this.inputSize, this.inputSize]);\n this.doubleInputSizeTensor = tf.tensor1d([this.inputSize * 2, this.inputSize * 2]);\n }\n\n normalizeBoxes(boxes) {\n const t: Record = {};\n t.boxOffsets = tf.slice(boxes, [0, 0], [-1, 2]);\n t.boxSizes = tf.slice(boxes, [0, 2], [-1, 2]);\n t.div = tf.div(t.boxOffsets, this.inputSizeTensor);\n t.boxCenterPoints = tf.add(t.div, this.anchorsTensor);\n t.halfBoxSizes = tf.div(t.boxSizes, this.doubleInputSizeTensor);\n t.sub = tf.sub(t.boxCenterPoints, t.halfBoxSizes);\n t.startPoints = tf.mul(t.sub, this.inputSizeTensor);\n t.add = tf.add(t.boxCenterPoints, t.halfBoxSizes);\n t.endPoints = tf.mul(t.add, this.inputSizeTensor);\n const res = tf.concat2d([t.startPoints, t.endPoints], 1);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return res;\n }\n\n normalizeLandmarks(rawPalmLandmarks, index) {\n const t: Record = {};\n t.reshape = tf.reshape(rawPalmLandmarks, [-1, 7, 2]);\n t.div = tf.div(t.reshape, this.inputSizeTensor);\n t.landmarks = tf.add(t.div, this.anchors[index]);\n const res = tf.mul(t.landmarks, this.inputSizeTensor);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return res;\n }\n\n async predict(input, config): Promise<{ startPoint: Point; endPoint: Point, palmLandmarks: Point[]; confidence: number }[]> {\n const t: Record = {};\n t.resize = tf.image.resizeBilinear(input, [this.inputSize, this.inputSize]);\n t.div = tf.div(t.resize, constants.tf127);\n t.image = tf.sub(t.div, constants.tf1);\n t.batched = this.model.execute(t.image) as Tensor;\n t.predictions = tf.squeeze(t.batched);\n t.slice = tf.slice(t.predictions, [0, 0], [-1, 1]);\n t.sigmoid = tf.sigmoid(t.slice);\n t.scores = tf.squeeze(t.sigmoid);\n const scores = await t.scores.data();\n t.boxes = tf.slice(t.predictions, [0, 1], [-1, 4]);\n t.norm = this.normalizeBoxes(t.boxes);\n // box detection is flaky so we look for 3x boxes than we need results\n t.nms = await tf.image.nonMaxSuppressionAsync(t.norm, t.scores, 3 * config.hand.maxDetected, config.hand.iouThreshold, config.hand.minConfidence);\n const nms = await t.nms.array() as Array;\n const hands: Array<{ startPoint: Point; endPoint: Point; palmLandmarks: Point[]; confidence: number }> = [];\n for (const index of nms) {\n const p: Record = {};\n p.box = tf.slice(t.norm, [index, 0], [1, -1]);\n p.slice = tf.slice(t.predictions, [index, 5], [1, 14]);\n p.norm = this.normalizeLandmarks(p.slice, index);\n p.palmLandmarks = tf.reshape(p.norm, [-1, 2]);\n const box = await p.box.data();\n const startPoint = box.slice(0, 2) as unknown as Point;\n const endPoint = box.slice(2, 4) as unknown as Point;\n const palmLandmarks = await p.palmLandmarks.array();\n const hand = { startPoint, endPoint, palmLandmarks, confidence: scores[index] };\n const scaled = util.scaleBoxCoordinates(hand, [input.shape[2] / this.inputSize, input.shape[1] / this.inputSize]);\n hands.push(scaled);\n Object.keys(p).forEach((tensor) => tf.dispose(p[tensor]));\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return hands;\n }\n}\n", "/**\n * HandPose model implementation\n * See `handpose.ts` for entry point\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as util from './handposeutil';\nimport type * as detector from './handposedetector';\nimport { constants } from '../tfjs/constants';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport { env } from '../util/env';\nimport { now } from '../util/util';\nimport type { Point } from '../result';\n\nconst palmBoxEnlargeFactor = 5; // default 3\nconst handBoxEnlargeFactor = 1.65; // default 1.65\nconst palmLandmarkIds = [0, 5, 9, 13, 17, 1, 2];\nconst palmLandmarksPalmBase = 0;\nconst palmLandmarksMiddleFingerBase = 2;\nlet lastTime = 0;\n\nexport class HandPipeline {\n handDetector: detector.HandDetector;\n handPoseModel: GraphModel;\n inputSize: number;\n storedBoxes: Array<{ startPoint: Point; endPoint: Point; palmLandmarks: Point[]; confidence: number } | null>;\n skipped: number;\n detectedHands: number;\n\n constructor(handDetector, handPoseModel) {\n this.handDetector = handDetector;\n this.handPoseModel = handPoseModel;\n this.inputSize = this.handPoseModel && this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0;\n this.storedBoxes = [];\n this.skipped = Number.MAX_SAFE_INTEGER;\n this.detectedHands = 0;\n }\n\n // eslint-disable-next-line class-methods-use-this\n calculateLandmarksBoundingBox(landmarks) {\n const xs = landmarks.map((d) => d[0]);\n const ys = landmarks.map((d) => d[1]);\n const startPoint = [Math.min(...xs), Math.min(...ys)];\n const endPoint = [Math.max(...xs), Math.max(...ys)];\n return { startPoint, endPoint };\n }\n\n getBoxForPalmLandmarks(palmLandmarks, rotationMatrix) {\n const rotatedPalmLandmarks = palmLandmarks.map((coord) => util.rotatePoint([...coord, 1], rotationMatrix));\n const boxAroundPalm = this.calculateLandmarksBoundingBox(rotatedPalmLandmarks);\n return util.enlargeBox(util.squarifyBox(boxAroundPalm), palmBoxEnlargeFactor);\n }\n\n getBoxForHandLandmarks(landmarks) {\n const boundingBox = this.calculateLandmarksBoundingBox(landmarks);\n const boxAroundHand = util.enlargeBox(util.squarifyBox(boundingBox), handBoxEnlargeFactor);\n boxAroundHand.palmLandmarks = [];\n for (let i = 0; i < palmLandmarkIds.length; i++) {\n boxAroundHand.palmLandmarks.push(landmarks[palmLandmarkIds[i]].slice(0, 2));\n }\n return boxAroundHand;\n }\n\n transformRawCoords(rawCoords, box2, angle, rotationMatrix) {\n const boxSize = util.getBoxSize(box2);\n const scaleFactor = [boxSize[0] / this.inputSize, boxSize[1] / this.inputSize, (boxSize[0] + boxSize[1]) / this.inputSize / 2];\n const coordsScaled = rawCoords.map((coord) => [\n scaleFactor[0] * (coord[0] - this.inputSize / 2),\n scaleFactor[1] * (coord[1] - this.inputSize / 2),\n scaleFactor[2] * coord[2],\n ]);\n const coordsRotationMatrix = util.buildRotationMatrix(angle, [0, 0]);\n const coordsRotated = coordsScaled.map((coord) => {\n const rotated = util.rotatePoint(coord, coordsRotationMatrix);\n return [...rotated, coord[2]];\n });\n const inverseRotationMatrix = util.invertTransformMatrix(rotationMatrix);\n const boxCenter = [...util.getBoxCenter(box2), 1];\n const originalBoxCenter = [\n util.dot(boxCenter, inverseRotationMatrix[0]),\n util.dot(boxCenter, inverseRotationMatrix[1]),\n ];\n return coordsRotated.map((coord) => [\n Math.trunc(coord[0] + originalBoxCenter[0]),\n Math.trunc(coord[1] + originalBoxCenter[1]),\n Math.trunc(coord[2]),\n ]);\n }\n\n async estimateHands(image, config) {\n let useFreshBox = false;\n\n // run new detector every skipFrames\n let boxes;\n const skipTime = (config.hand.skipTime || 0) > (now() - lastTime);\n const skipFrame = this.skipped < (config.hand.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame) {\n boxes = await this.handDetector.predict(image, config);\n this.skipped = 0;\n }\n if (config.skipAllowed) this.skipped++;\n\n // if detector result count doesn't match current working set, use it to reset current working set\n if (boxes && (boxes.length > 0) && ((boxes.length !== this.detectedHands) && (this.detectedHands !== config.hand.maxDetected) || !config.hand.landmarks)) {\n this.detectedHands = 0;\n this.storedBoxes = [...boxes];\n // for (const possible of boxes) this.storedBoxes.push(possible);\n if (this.storedBoxes.length > 0) useFreshBox = true;\n }\n const hands: Array<{ landmarks: Point[], confidence: number, boxConfidence: number, fingerConfidence: number, box: { topLeft: Point, bottomRight: Point } }> = [];\n\n // go through working set of boxes\n for (let i = 0; i < this.storedBoxes.length; i++) {\n const currentBox = this.storedBoxes[i];\n if (!currentBox) continue;\n if (config.hand.landmarks) {\n const angle = config.hand.rotation ? util.computeRotation(currentBox.palmLandmarks[palmLandmarksPalmBase], currentBox.palmLandmarks[palmLandmarksMiddleFingerBase]) : 0;\n const palmCenter = util.getBoxCenter(currentBox);\n const palmCenterNormalized = [palmCenter[0] / image.shape[2], palmCenter[1] / image.shape[1]];\n const rotatedImage = config.hand.rotation && env.kernels.includes('rotatewithoffset') ? tf.image.rotateWithOffset(image, angle, 0, palmCenterNormalized) : image.clone();\n const rotationMatrix = util.buildRotationMatrix(-angle, palmCenter);\n const newBox = useFreshBox ? this.getBoxForPalmLandmarks(currentBox.palmLandmarks, rotationMatrix) : currentBox;\n const croppedInput = util.cutBoxFromImageAndResize(newBox, rotatedImage, [this.inputSize, this.inputSize]);\n const handImage = tf.div(croppedInput, constants.tf255);\n tf.dispose(croppedInput);\n tf.dispose(rotatedImage);\n const [confidenceT, keypoints] = this.handPoseModel.execute(handImage) as Array;\n lastTime = now();\n tf.dispose(handImage);\n const confidence = (await confidenceT.data())[0];\n tf.dispose(confidenceT);\n if (confidence >= config.hand.minConfidence / 4) {\n const keypointsReshaped = tf.reshape(keypoints, [-1, 3]);\n const rawCoords = await keypointsReshaped.array();\n tf.dispose(keypoints);\n tf.dispose(keypointsReshaped);\n const coords = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix);\n const nextBoundingBox = this.getBoxForHandLandmarks(coords);\n this.storedBoxes[i] = { ...nextBoundingBox, confidence };\n const result = {\n landmarks: coords,\n confidence,\n boxConfidence: currentBox.confidence,\n fingerConfidence: confidence,\n box: { topLeft: nextBoundingBox.startPoint, bottomRight: nextBoundingBox.endPoint },\n };\n hands.push(result);\n } else {\n this.storedBoxes[i] = null;\n }\n tf.dispose(keypoints);\n } else {\n // const enlarged = box.enlargeBox(box.squarifyBox(box.shiftBox(currentBox, HAND_BOX_SHIFT_VECTOR)), handBoxEnlargeFactor);\n const enlarged = util.enlargeBox(util.squarifyBox(currentBox), handBoxEnlargeFactor);\n const result = {\n confidence: currentBox.confidence,\n boxConfidence: currentBox.confidence,\n fingerConfidence: 0,\n box: { topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint },\n landmarks: [],\n };\n hands.push(result);\n }\n }\n this.storedBoxes = this.storedBoxes.filter((a) => a !== null);\n this.detectedHands = hands.length;\n if (hands.length > config.hand.maxDetected) hands.length = config.hand.maxDetected;\n return hands;\n }\n}\n", "/**\n * FingerPose algorithm implementation\n * See `fingerpose.ts` for entry point\n */\n\nexport const Finger = {\n thumb: 0,\n index: 1,\n middle: 2,\n ring: 3,\n pinky: 4,\n all: [0, 1, 2, 3, 4], // just for convenience\n nameMapping: { 0: 'thumb', 1: 'index', 2: 'middle', 3: 'ring', 4: 'pinky' },\n // Describes mapping of joints based on the 21 points returned by handpose.\n // [0] Palm\n // [1-4] Thumb\n // [5-8] Index\n // [9-12] Middle\n // [13-16] Ring\n // [17-20] Pinky\n pointsMapping: {\n 0: [[0, 1], [1, 2], [2, 3], [3, 4]],\n 1: [[0, 5], [5, 6], [6, 7], [7, 8]],\n 2: [[0, 9], [9, 10], [10, 11], [11, 12]],\n 3: [[0, 13], [13, 14], [14, 15], [15, 16]],\n 4: [[0, 17], [17, 18], [18, 19], [19, 20]],\n },\n getName: (value) => Finger.nameMapping[value],\n getPoints: (value) => Finger.pointsMapping[value],\n};\n\nexport const FingerCurl = {\n none: 0,\n half: 1,\n full: 2,\n nameMapping: { 0: 'none', 1: 'half', 2: 'full' },\n getName: (value) => FingerCurl.nameMapping[value],\n};\n\nexport const FingerDirection = {\n verticalUp: 0,\n verticalDown: 1,\n horizontalLeft: 2,\n horizontalRight: 3,\n diagonalUpRight: 4,\n diagonalUpLeft: 5,\n diagonalDownRight: 6,\n diagonalDownLeft: 7,\n nameMapping: { 0: 'verticalUp', 1: 'verticalDown', 2: 'horizontalLeft', 3: 'horizontalRight', 4: 'diagonalUpRight', 5: 'diagonalUpLeft', 6: 'diagonalDownRight', 7: 'diagonalDownLeft' },\n getName: (value) => FingerDirection.nameMapping[value],\n};\n\nexport class FingerGesture {\n name;\n curls;\n directions;\n weights;\n weightsRelative;\n\n constructor(name) {\n // name (should be unique)\n this.name = name;\n this.curls = {};\n this.directions = {};\n this.weights = [1.0, 1.0, 1.0, 1.0, 1.0];\n this.weightsRelative = [1.0, 1.0, 1.0, 1.0, 1.0];\n }\n\n curl(finger, curl, confidence) {\n if (typeof this.curls[finger] === 'undefined') this.curls[finger] = [];\n this.curls[finger].push([curl, confidence]);\n }\n\n direction(finger, position, confidence) {\n if (!this.directions[finger]) this.directions[finger] = [];\n this.directions[finger].push([position, confidence]);\n }\n\n weight(finger, weight) {\n this.weights[finger] = weight;\n // recalculate relative weights\n const total = this.weights.reduce((a, b) => a + b, 0);\n this.weightsRelative = this.weights.map((el) => el * 5 / total);\n }\n\n matchAgainst(detectedCurls, detectedDirections) {\n let confidence = 0.0;\n // look at the detected curl of each finger and compare with\n // the expected curl of this finger inside current gesture\n for (const fingerIdx in detectedCurls) {\n const detectedCurl = detectedCurls[fingerIdx];\n const expectedCurls = this.curls[fingerIdx];\n if (typeof expectedCurls === 'undefined') {\n // no curl description available for this finger\n // add default confidence of \"1\"\n confidence += this.weightsRelative[fingerIdx];\n continue;\n }\n // compare to each possible curl of this specific finger\n for (const [expectedCurl, score] of expectedCurls) {\n if (detectedCurl === expectedCurl) {\n confidence += score * this.weightsRelative[fingerIdx];\n break;\n }\n }\n }\n // same for detected direction of each finger\n for (const fingerIdx in detectedDirections) {\n const detectedDirection = detectedDirections[fingerIdx];\n const expectedDirections = this.directions[fingerIdx];\n if (typeof expectedDirections === 'undefined') {\n // no direction description available for this finger\n // add default confidence of \"1\"\n confidence += this.weightsRelative[fingerIdx];\n continue;\n }\n // compare to each possible direction of this specific finger\n for (const [expectedDirection, score] of expectedDirections) {\n if (detectedDirection === expectedDirection) {\n confidence += score * this.weightsRelative[fingerIdx];\n break;\n }\n }\n }\n return confidence / 10;\n }\n}\n", "/**\n * FingerPose algorithm implementation\n * See `fingerpose.ts` for entry point\n */\n\nimport { Finger, FingerCurl, FingerDirection, FingerGesture } from './fingerdef';\n\n// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\nexport const { thumb, index, middle, ring, pinky } = Finger;\n// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\nexport const { none, half, full } = FingerCurl;\n// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\nexport const { verticalUp, verticalDown, horizontalLeft, horizontalRight, diagonalUpRight, diagonalUpLeft, diagonalDownRight, diagonalDownLeft } = FingerDirection;\n\n// describe thumbs up gesture \uD83D\uDC4D\nconst ThumbsUp = new FingerGesture('thumbs up');\nThumbsUp.curl(thumb, none, 1.0);\nThumbsUp.direction(thumb, verticalUp, 1.0);\nThumbsUp.direction(thumb, diagonalUpLeft, 0.25);\nThumbsUp.direction(thumb, diagonalUpRight, 0.25);\nfor (const finger of [Finger.index, Finger.middle, Finger.ring, Finger.pinky]) {\n ThumbsUp.curl(finger, full, 1.0);\n ThumbsUp.direction(finger, horizontalLeft, 1.0);\n ThumbsUp.direction(finger, horizontalRight, 1.0);\n}\n\n// describe Victory gesture \u270C\uFE0F\nconst Victory = new FingerGesture('victory');\nVictory.curl(thumb, half, 0.5);\nVictory.curl(thumb, none, 0.5);\nVictory.direction(thumb, verticalUp, 1.0);\nVictory.direction(thumb, diagonalUpLeft, 1.0);\nVictory.curl(index, none, 1.0);\nVictory.direction(index, verticalUp, 0.75);\nVictory.direction(index, diagonalUpLeft, 1.0);\nVictory.curl(middle, none, 1.0);\nVictory.direction(middle, verticalUp, 1.0);\nVictory.direction(middle, diagonalUpLeft, 0.75);\nVictory.curl(ring, full, 1.0);\nVictory.direction(ring, verticalUp, 0.2);\nVictory.direction(ring, diagonalUpLeft, 1.0);\nVictory.direction(ring, horizontalLeft, 0.2);\nVictory.curl(pinky, full, 1.0);\nVictory.direction(pinky, verticalUp, 0.2);\nVictory.direction(pinky, diagonalUpLeft, 1.0);\nVictory.direction(pinky, horizontalLeft, 0.2);\nVictory.weight(index, 2);\nVictory.weight(middle, 2);\n\n// describe Point gesture \u270C\uFE0F\nconst Point = new FingerGesture('point');\nPoint.curl(thumb, full, 1.0);\nPoint.curl(index, none, 0.5);\nPoint.curl(middle, full, 0.5);\nPoint.curl(ring, full, 0.5);\nPoint.curl(pinky, full, 0.5);\nPoint.weight(index, 2);\nPoint.weight(middle, 2);\n\n// describe Point gesture \u270C\uFE0F\nconst MiddleFinger = new FingerGesture('middle finger');\nMiddleFinger.curl(thumb, none, 1.0);\nMiddleFinger.curl(index, full, 0.5);\nMiddleFinger.curl(middle, full, 0.5);\nMiddleFinger.curl(ring, full, 0.5);\nMiddleFinger.curl(pinky, full, 0.5);\nMiddleFinger.weight(index, 2);\nMiddleFinger.weight(middle, 2);\n\n// describe Open Palm gesture \u270C\uFE0F\nconst OpenPalm = new FingerGesture('open palm');\nOpenPalm.curl(thumb, none, 0.75);\nOpenPalm.curl(index, none, 0.75);\nOpenPalm.curl(middle, none, 0.75);\nOpenPalm.curl(ring, none, 0.75);\nOpenPalm.curl(pinky, none, 0.75);\n\nexport default [ThumbsUp, Victory, Point, MiddleFinger, OpenPalm];\n", "/**\n * FingerPose algorithm implementation constants\n *\n * Based on: [**FingerPose***](https://github.com/andypotato/fingerpose)\n */\n\nimport { Finger, FingerCurl, FingerDirection } from './fingerdef';\nimport Gestures from '../hand/fingergesture';\n\nconst minConfidence = 0.7;\nconst options = {\n // curl estimation\n HALF_CURL_START_LIMIT: 60.0,\n NO_CURL_START_LIMIT: 130.0,\n // direction estimation\n DISTANCE_VOTE_POWER: 1.1,\n SINGLE_ANGLE_VOTE_POWER: 0.9,\n TOTAL_ANGLE_VOTE_POWER: 1.6,\n};\n\nfunction calculateSlope(point1x, point1y, point2x, point2y) {\n const value = (point1y - point2y) / (point1x - point2x);\n let slope = Math.atan(value) * 180 / Math.PI;\n if (slope <= 0) slope = -slope;\n else if (slope > 0) slope = 180 - slope;\n return slope;\n}\n\n// point1, point2 are 2d or 3d point arrays (xy[z])\n// returns either a single scalar (2d) or array of two slopes (3d)\nfunction getSlopes(point1, point2) {\n if (!point1 || !point2) return [0, 0];\n const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]);\n if (point1.length === 2) return slopeXY;\n const slopeYZ = calculateSlope(point1[1], point1[2], point2[1], point2[2]);\n return [slopeXY, slopeYZ];\n}\n\nfunction angleOrientationAt(angle, weightageAt = 1.0) {\n let isVertical = 0;\n let isDiagonal = 0;\n let isHorizontal = 0;\n if (angle >= 75.0 && angle <= 105.0) isVertical = 1 * weightageAt;\n else if (angle >= 25.0 && angle <= 155.0) isDiagonal = 1 * weightageAt;\n else isHorizontal = 1 * weightageAt;\n return [isVertical, isDiagonal, isHorizontal];\n}\n\nfunction estimateFingerCurl(startPoint, midPoint, endPoint) {\n const start_mid_x_dist = startPoint[0] - midPoint[0];\n const start_end_x_dist = startPoint[0] - endPoint[0];\n const mid_end_x_dist = midPoint[0] - endPoint[0];\n const start_mid_y_dist = startPoint[1] - midPoint[1];\n const start_end_y_dist = startPoint[1] - endPoint[1];\n const mid_end_y_dist = midPoint[1] - endPoint[1];\n const start_mid_z_dist = startPoint[2] - midPoint[2];\n const start_end_z_dist = startPoint[2] - endPoint[2];\n const mid_end_z_dist = midPoint[2] - endPoint[2];\n const start_mid_dist = Math.sqrt(start_mid_x_dist * start_mid_x_dist + start_mid_y_dist * start_mid_y_dist + start_mid_z_dist * start_mid_z_dist);\n const start_end_dist = Math.sqrt(start_end_x_dist * start_end_x_dist + start_end_y_dist * start_end_y_dist + start_end_z_dist * start_end_z_dist);\n const mid_end_dist = Math.sqrt(mid_end_x_dist * mid_end_x_dist + mid_end_y_dist * mid_end_y_dist + mid_end_z_dist * mid_end_z_dist);\n let cos_in = (mid_end_dist * mid_end_dist + start_mid_dist * start_mid_dist - start_end_dist * start_end_dist) / (2 * mid_end_dist * start_mid_dist);\n if (cos_in > 1.0) cos_in = 1.0;\n else if (cos_in < -1.0) cos_in = -1.0;\n let angleOfCurve = Math.acos(cos_in);\n angleOfCurve = (57.2958 * angleOfCurve) % 180;\n let fingerCurl;\n if (angleOfCurve > options.NO_CURL_START_LIMIT) fingerCurl = FingerCurl.none;\n else if (angleOfCurve > options.HALF_CURL_START_LIMIT) fingerCurl = FingerCurl.half;\n else fingerCurl = FingerCurl.full;\n return fingerCurl;\n}\n\nfunction estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x) {\n let estimatedDirection;\n if (max_dist_x === Math.abs(start_end_x_dist)) {\n if (start_end_x_dist > 0) estimatedDirection = FingerDirection.horizontalLeft;\n else estimatedDirection = FingerDirection.horizontalRight;\n } else if (max_dist_x === Math.abs(start_mid_x_dist)) {\n if (start_mid_x_dist > 0) estimatedDirection = FingerDirection.horizontalLeft;\n else estimatedDirection = FingerDirection.horizontalRight;\n } else {\n if (mid_end_x_dist > 0) estimatedDirection = FingerDirection.horizontalLeft;\n else estimatedDirection = FingerDirection.horizontalRight;\n }\n return estimatedDirection;\n}\n\nfunction estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y) {\n let estimatedDirection;\n if (max_dist_y === Math.abs(start_end_y_dist)) {\n if (start_end_y_dist < 0) estimatedDirection = FingerDirection.verticalDown;\n else estimatedDirection = FingerDirection.verticalUp;\n } else if (max_dist_y === Math.abs(start_mid_y_dist)) {\n if (start_mid_y_dist < 0) estimatedDirection = FingerDirection.verticalDown;\n else estimatedDirection = FingerDirection.verticalUp;\n } else {\n if (mid_end_y_dist < 0) estimatedDirection = FingerDirection.verticalDown;\n else estimatedDirection = FingerDirection.verticalUp;\n }\n return estimatedDirection;\n}\n\nfunction estimateDiagonalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y, start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x) {\n let estimatedDirection;\n const reqd_vertical_direction = estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y);\n const reqd_horizontal_direction = estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x);\n if (reqd_vertical_direction === FingerDirection.verticalUp) {\n if (reqd_horizontal_direction === FingerDirection.horizontalLeft) estimatedDirection = FingerDirection.diagonalUpLeft;\n else estimatedDirection = FingerDirection.diagonalUpRight;\n } else {\n if (reqd_horizontal_direction === FingerDirection.horizontalLeft) estimatedDirection = FingerDirection.diagonalDownLeft;\n else estimatedDirection = FingerDirection.diagonalDownRight;\n }\n return estimatedDirection;\n}\n\nfunction calculateFingerDirection(startPoint, midPoint, endPoint, fingerSlopes) {\n const start_mid_x_dist = startPoint[0] - midPoint[0];\n const start_end_x_dist = startPoint[0] - endPoint[0];\n const mid_end_x_dist = midPoint[0] - endPoint[0];\n const start_mid_y_dist = startPoint[1] - midPoint[1];\n const start_end_y_dist = startPoint[1] - endPoint[1];\n const mid_end_y_dist = midPoint[1] - endPoint[1];\n const max_dist_x = Math.max(Math.abs(start_mid_x_dist), Math.abs(start_end_x_dist), Math.abs(mid_end_x_dist));\n const max_dist_y = Math.max(Math.abs(start_mid_y_dist), Math.abs(start_end_y_dist), Math.abs(mid_end_y_dist));\n let voteVertical = 0.0;\n let voteDiagonal = 0.0;\n let voteHorizontal = 0.0;\n const start_end_x_y_dist_ratio = max_dist_y / (max_dist_x + 0.00001);\n if (start_end_x_y_dist_ratio > 1.5) voteVertical += options.DISTANCE_VOTE_POWER;\n else if (start_end_x_y_dist_ratio > 0.66) voteDiagonal += options.DISTANCE_VOTE_POWER;\n else voteHorizontal += options.DISTANCE_VOTE_POWER;\n const start_mid_dist = Math.sqrt(start_mid_x_dist * start_mid_x_dist + start_mid_y_dist * start_mid_y_dist);\n const start_end_dist = Math.sqrt(start_end_x_dist * start_end_x_dist + start_end_y_dist * start_end_y_dist);\n const mid_end_dist = Math.sqrt(mid_end_x_dist * mid_end_x_dist + mid_end_y_dist * mid_end_y_dist);\n const max_dist = Math.max(start_mid_dist, start_end_dist, mid_end_dist);\n let calc_start_point_x = startPoint[0];\n let calc_start_point_y = startPoint[1];\n let calc_end_point_x = endPoint[0];\n let calc_end_point_y = endPoint[1];\n if (max_dist === start_mid_dist) {\n calc_end_point_x = endPoint[0];\n calc_end_point_y = endPoint[1];\n } else if (max_dist === mid_end_dist) {\n calc_start_point_x = midPoint[0];\n calc_start_point_y = midPoint[1];\n }\n const calcStartPoint = [calc_start_point_x, calc_start_point_y];\n const calcEndPoint = [calc_end_point_x, calc_end_point_y];\n const totalAngle = getSlopes(calcStartPoint, calcEndPoint);\n const votes = angleOrientationAt(totalAngle, options.TOTAL_ANGLE_VOTE_POWER);\n voteVertical += votes[0];\n voteDiagonal += votes[1];\n voteHorizontal += votes[2];\n for (const fingerSlope of fingerSlopes) {\n const fingerVotes = angleOrientationAt(fingerSlope, options.SINGLE_ANGLE_VOTE_POWER);\n voteVertical += fingerVotes[0];\n voteDiagonal += fingerVotes[1];\n voteHorizontal += fingerVotes[2];\n }\n // in case of tie, highest preference goes to Vertical,\n // followed by horizontal and then diagonal\n let estimatedDirection;\n if (voteVertical === Math.max(voteVertical, voteDiagonal, voteHorizontal)) {\n estimatedDirection = estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y);\n } else if (voteHorizontal === Math.max(voteDiagonal, voteHorizontal)) {\n estimatedDirection = estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x);\n } else {\n estimatedDirection = estimateDiagonalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y, start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x);\n }\n return estimatedDirection;\n}\n\nfunction estimate(landmarks) {\n // step 1: calculate slopes\n const slopesXY: Array = [];\n const slopesYZ: Array = [];\n const fingerCurls: Array = [];\n const fingerDirections: Array = [];\n if (!landmarks) return { curls: fingerCurls, directions: fingerDirections };\n\n // step 1: calculate slopes\n for (const finger of Finger.all) {\n const points = Finger.getPoints(finger);\n const slopeAtXY: Array = [];\n const slopeAtYZ: Array = [];\n for (const point of points) {\n const point1 = landmarks[point[0]];\n const point2 = landmarks[point[1]];\n // calculate single slope\n const slopes = getSlopes(point1, point2);\n const slopeXY = slopes[0];\n const slopeYZ = slopes[1];\n slopeAtXY.push(slopeXY);\n slopeAtYZ.push(slopeYZ);\n }\n slopesXY.push(slopeAtXY);\n slopesYZ.push(slopeAtYZ);\n }\n\n // step 2: calculate orientations\n for (const finger of Finger.all) {\n // start finger predictions from palm - except for thumb\n const pointIndexAt = (finger === Finger.thumb) ? 1 : 0;\n const fingerPointsAt = Finger.getPoints(finger);\n const startPoint = landmarks[fingerPointsAt[pointIndexAt][0]];\n const midPoint = landmarks[fingerPointsAt[pointIndexAt + 1][1]];\n const endPoint = landmarks[fingerPointsAt[3][1]];\n // check if finger is curled\n const fingerCurled = estimateFingerCurl(startPoint, midPoint, endPoint);\n const fingerPosition = calculateFingerDirection(startPoint, midPoint, endPoint, slopesXY[finger].slice(pointIndexAt));\n fingerCurls[finger] = fingerCurled;\n fingerDirections[finger] = fingerPosition;\n }\n return { curls: fingerCurls, directions: fingerDirections };\n}\n\nexport function analyze(keypoints) { // get estimations of curl / direction for each finger\n if (!keypoints || keypoints.length === 0) return null;\n const estimatorRes = estimate(keypoints);\n const landmarks = {};\n for (const fingerIdx of Finger.all) {\n landmarks[Finger.getName(fingerIdx)] = {\n curl: FingerCurl.getName(estimatorRes.curls[fingerIdx]),\n direction: FingerDirection.getName(estimatorRes.directions[fingerIdx]),\n };\n }\n return landmarks;\n}\n\nexport function match(keypoints) { // compare gesture description to each known gesture\n const poses: Array<{ name: string, confidence: number }> = [];\n if (!keypoints || keypoints.length === 0) return poses;\n const estimatorRes = estimate(keypoints);\n for (const gesture of Gestures) {\n const confidence = gesture.matchAgainst(estimatorRes.curls, estimatorRes.directions);\n if (confidence >= minConfidence) poses.push({ name: gesture.name, confidence });\n }\n return poses;\n}\n", "/**\n * HandPose model implementation\n *\n * Based on: [**MediaPipe HandPose**](https://drive.google.com/file/d/1sv4sSb9BSNVZhLzxXJ0jBv9DqD-4jnAz/view)\n */\n\nimport { log } from '../util/util';\nimport * as handdetector from './handposedetector';\nimport * as handpipeline from './handposepipeline';\nimport * as fingerPose from './fingerpose';\nimport { loadModel } from '../tfjs/load';\nimport type { HandResult, Box, Point } from '../result';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nconst meshAnnotations = {\n thumb: [1, 2, 3, 4],\n index: [5, 6, 7, 8],\n middle: [9, 10, 11, 12],\n ring: [13, 14, 15, 16],\n pinky: [17, 18, 19, 20],\n palm: [0],\n};\n\nlet handDetectorModel: GraphModel | null;\nlet handPoseModel: GraphModel | null;\nlet handPipeline: handpipeline.HandPipeline;\n\nexport async function predict(input: Tensor, config: Config): Promise {\n const predictions = await handPipeline.estimateHands(input, config);\n if (!predictions) return [];\n const hands: Array = [];\n for (let i = 0; i < predictions.length; i++) {\n const annotations = {};\n if (predictions[i].landmarks) {\n for (const key of Object.keys(meshAnnotations)) {\n annotations[key] = meshAnnotations[key].map((index) => predictions[i].landmarks[index]);\n }\n }\n const keypoints = predictions[i].landmarks as unknown as Array;\n let box: Box = [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, 0, 0]; // maximums so conditionals work\n let boxRaw: Box = [0, 0, 0, 0];\n if (keypoints && keypoints.length > 0) { // if we have landmarks, calculate box based on landmarks\n for (const pt of keypoints) {\n if (pt[0] < box[0]) box[0] = pt[0];\n if (pt[1] < box[1]) box[1] = pt[1];\n if (pt[0] > box[2]) box[2] = pt[0];\n if (pt[1] > box[3]) box[3] = pt[1];\n }\n box[2] -= box[0];\n box[3] -= box[1];\n boxRaw = [box[0] / (input.shape[2] || 0), box[1] / (input.shape[1] || 0), box[2] / (input.shape[2] || 0), box[3] / (input.shape[1] || 0)];\n } else { // otherwise use box from prediction\n box = predictions[i].box ? [\n Math.trunc(Math.max(0, predictions[i].box.topLeft[0])),\n Math.trunc(Math.max(0, predictions[i].box.topLeft[1])),\n Math.trunc(Math.min((input.shape[2] || 0), predictions[i].box.bottomRight[0]) - Math.max(0, predictions[i].box.topLeft[0])),\n Math.trunc(Math.min((input.shape[1] || 0), predictions[i].box.bottomRight[1]) - Math.max(0, predictions[i].box.topLeft[1])),\n ] : [0, 0, 0, 0];\n boxRaw = [\n (predictions[i].box.topLeft[0]) / (input.shape[2] || 0),\n (predictions[i].box.topLeft[1]) / (input.shape[1] || 0),\n (predictions[i].box.bottomRight[0] - predictions[i].box.topLeft[0]) / (input.shape[2] || 0),\n (predictions[i].box.bottomRight[1] - predictions[i].box.topLeft[1]) / (input.shape[1] || 0),\n ];\n }\n const landmarks = fingerPose.analyze(keypoints);\n hands.push({\n id: i,\n score: Math.round(100 * predictions[i].confidence) / 100,\n boxScore: Math.round(100 * predictions[i].boxConfidence) / 100,\n fingerScore: Math.round(100 * predictions[i].fingerConfidence) / 100,\n label: 'hand',\n box,\n boxRaw,\n keypoints,\n annotations: annotations as HandResult['annotations'],\n landmarks: landmarks as HandResult['landmarks'],\n });\n }\n return hands;\n}\n\nexport async function load(config: Config): Promise<[GraphModel | null, GraphModel | null]> {\n if (env.initial) {\n handDetectorModel = null;\n handPoseModel = null;\n }\n if (!handDetectorModel || !handPoseModel) {\n [handDetectorModel, handPoseModel] = await Promise.all([\n config.hand.enabled ? loadModel(config.hand.detector?.modelPath) : null,\n config.hand.landmarks ? loadModel(config.hand.skeleton?.modelPath) : null,\n ]);\n } else {\n if (config.debug) log('cached model:', handDetectorModel['modelUrl']);\n if (config.debug) log('cached model:', handPoseModel['modelUrl']);\n }\n const handDetector = new handdetector.HandDetector(handDetectorModel);\n handPipeline = new handpipeline.HandPipeline(handDetector, handPoseModel);\n return [handDetectorModel, handPoseModel];\n}\n", "/**\n * HandTrack model implementation\n *\n * Based on:\n * - Hand Detection & Skeleton: [**MediaPipe HandPose**](https://drive.google.com/file/d/1sv4sSb9BSNVZhLzxXJ0jBv9DqD-4jnAz/view)\n * - Hand Tracking: [**HandTracking**](https://github.com/victordibia/handtracking)\n */\n\nimport { log, now } from '../util/util';\nimport * as box from '../util/box';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport type { HandResult, HandType, Box, Point } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\nimport * as fingerPose from './fingerpose';\nimport { fakeOps } from '../tfjs/backend';\nimport { constants } from '../tfjs/constants';\n\nconst models: [GraphModel | null, GraphModel | null] = [null, null];\nconst modelOutputNodes = ['StatefulPartitionedCall/Postprocessor/Slice', 'StatefulPartitionedCall/Postprocessor/ExpandDims_1'];\n\nconst inputSize = [[0, 0], [0, 0]];\n\nconst classes = ['hand', 'fist', 'pinch', 'point', 'face', 'tip', 'pinchtip'];\nconst faceIndex = 4;\n\nconst boxExpandFact = 1.6;\nconst maxDetectorResolution = 512;\nconst detectorExpandFact = 1.4;\n\nlet skipped = Number.MAX_SAFE_INTEGER;\nlet lastTime = 0;\nlet outputSize: [number, number] = [0, 0];\n\ntype HandDetectResult = {\n id: number,\n score: number,\n box: Box,\n boxRaw: Box,\n label: HandType,\n}\n\nconst cache: {\n boxes: Array,\n hands: Array;\n} = {\n boxes: [],\n hands: [],\n};\n\nconst fingerMap = {\n /*\n thumb: [0, 1, 2, 3, 4],\n index: [0, 5, 6, 7, 8],\n middle: [0, 9, 10, 11, 12],\n ring: [0, 13, 14, 15, 16],\n pinky: [0, 17, 18, 19, 20],\n palm: [0],\n */\n thumb: [1, 2, 3, 4],\n index: [5, 6, 7, 8],\n middle: [9, 10, 11, 12],\n ring: [13, 14, 15, 16],\n pinky: [17, 18, 19, 20],\n base: [0],\n palm: [0, 17, 13, 9, 5, 1, 0],\n};\n\nexport async function loadDetect(config: Config): Promise {\n // HandTrack Model: Original: TFJS Port: \n if (env.initial) models[0] = null;\n if (!models[0]) {\n // handtrack model has some kernel ops defined in model but those are never referenced and non-existent in tfjs\n // ideally need to prune the model itself\n fakeOps(['tensorlistreserve', 'enter', 'tensorlistfromtensor', 'merge', 'loopcond', 'switch', 'exit', 'tensorliststack', 'nextiteration', 'tensorlistsetitem', 'tensorlistgetitem', 'reciprocal', 'shape', 'split', 'where'], config);\n models[0] = await loadModel(config.hand.detector?.modelPath);\n const inputs = Object.values(models[0].modelSignature['inputs']);\n inputSize[0][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;\n inputSize[0][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug) log('cached model:', models[0]['modelUrl']);\n return models[0];\n}\n\nexport async function loadSkeleton(config: Config): Promise {\n if (env.initial) models[1] = null;\n if (!models[1]) {\n models[1] = await loadModel(config.hand.skeleton?.modelPath);\n const inputs = Object.values(models[1].modelSignature['inputs']);\n inputSize[1][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;\n inputSize[1][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug) log('cached model:', models[1]['modelUrl']);\n return models[1];\n}\n\nexport async function load(config: Config): Promise<[GraphModel | null, GraphModel | null]> {\n if (!models[0]) await loadDetect(config);\n if (!models[1]) await loadSkeleton(config);\n return models;\n}\n\nasync function detectHands(input: Tensor, config: Config): Promise {\n const hands: HandDetectResult[] = [];\n if (!input || !models[0]) return hands;\n const t: Record = {};\n const ratio = (input.shape[2] || 1) / (input.shape[1] || 1);\n const height = Math.min(Math.round((input.shape[1] || 0) / 8) * 8, maxDetectorResolution); // use dynamic input size but cap at 512\n const width = Math.round(height * ratio / 8) * 8;\n t.resize = tf.image.resizeBilinear(input, [height, width]); // todo: resize with padding\n t.cast = tf.cast(t.resize, 'int32');\n [t.rawScores, t.rawBoxes] = await models[0].executeAsync(t.cast, modelOutputNodes) as Tensor[];\n t.boxes = tf.squeeze(t.rawBoxes, [0, 2]);\n t.scores = tf.squeeze(t.rawScores, [0]);\n const classScores: Array = tf.unstack(t.scores, 1); // unstack scores based on classes\n tf.dispose(classScores[faceIndex]);\n classScores.splice(faceIndex, 1); // remove faces\n t.filtered = tf.stack(classScores, 1); // restack\n tf.dispose(classScores);\n // t.filtered = t.scores;\n t.max = tf.max(t.filtered, 1); // max overall score\n t.argmax = tf.argMax(t.filtered, 1); // class index of max overall score\n let id = 0;\n t.nms = await tf.image.nonMaxSuppressionAsync(t.boxes, t.max, (config.hand.maxDetected || 0) + 1, config.hand.iouThreshold || 0, config.hand.minConfidence || 1);\n const nms = await t.nms.data();\n const scores = await t.max.data();\n const classNum = await t.argmax.data();\n for (const nmsIndex of Array.from(nms)) { // generates results for each class\n const boxSlice = tf.slice(t.boxes, nmsIndex, 1);\n const boxYX = await boxSlice.data();\n tf.dispose(boxSlice);\n const boxData: Box = [boxYX[1], boxYX[0], boxYX[3] - boxYX[1], boxYX[2] - boxYX[0]]; // yx box reshaped to standard box\n const boxRaw: Box = box.scale(boxData, detectorExpandFact);\n const boxFull: Box = [Math.trunc(boxData[0] * outputSize[0]), Math.trunc(boxData[1] * outputSize[1]), Math.trunc(boxData[2] * outputSize[0]), Math.trunc(boxData[3] * outputSize[1])];\n const score = scores[nmsIndex];\n const label = classes[classNum[nmsIndex]] as HandType;\n const hand: HandDetectResult = { id: id++, score, box: boxFull, boxRaw, label };\n hands.push(hand);\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n hands.sort((a, b) => b.score - a.score);\n if (hands.length > (config.hand.maxDetected || 1)) hands.length = (config.hand.maxDetected || 1);\n return hands;\n}\n\nasync function detectFingers(input: Tensor, h: HandDetectResult, config: Config): Promise {\n const hand: HandResult = { // initial values inherited from hand detect\n id: h.id,\n score: Math.round(100 * h.score) / 100,\n boxScore: Math.round(100 * h.score) / 100,\n fingerScore: 0,\n box: h.box,\n boxRaw: h.boxRaw,\n label: h.label,\n keypoints: [],\n landmarks: {} as HandResult['landmarks'],\n annotations: {} as HandResult['annotations'],\n };\n if (input && models[1] && config.hand.landmarks && h.score > (config.hand.minConfidence || 0)) {\n const t: Record = {};\n const boxCrop = [h.boxRaw[1], h.boxRaw[0], h.boxRaw[3] + h.boxRaw[1], h.boxRaw[2] + h.boxRaw[0]] as Box;\n t.crop = tf.image.cropAndResize(input, [boxCrop], [0], [inputSize[1][0], inputSize[1][1]], 'bilinear');\n t.div = tf.div(t.crop, constants.tf255);\n [t.score, t.keypoints] = models[1].execute(t.div, ['Identity_1', 'Identity']) as Tensor[];\n const rawScore = (await t.score.data())[0];\n const score = (100 - Math.trunc(100 / (1 + Math.exp(rawScore)))) / 100; // reverse sigmoid value\n if (score >= (config.hand.minConfidence || 0)) {\n hand.fingerScore = score;\n t.reshaped = tf.reshape(t.keypoints, [-1, 3]);\n const coordsData: Point[] = await t.reshaped.array() as Point[];\n const coordsRaw: Point[] = coordsData.map((kpt) => [kpt[0] / inputSize[1][1], kpt[1] / inputSize[1][0], (kpt[2] || 0)]);\n const coordsNorm: Point[] = coordsRaw.map((kpt) => [kpt[0] * h.boxRaw[2], kpt[1] * h.boxRaw[3], (kpt[2] || 0)]);\n hand.keypoints = (coordsNorm).map((kpt) => [outputSize[0] * (kpt[0] + h.boxRaw[0]), outputSize[1] * (kpt[1] + h.boxRaw[1]), (kpt[2] || 0)]);\n hand.landmarks = fingerPose.analyze(hand.keypoints) as HandResult['landmarks']; // calculate finger gestures\n for (const key of Object.keys(fingerMap)) { // map keypoints to per-finger annotations\n hand.annotations[key] = fingerMap[key].map((index: number) => (hand.landmarks && hand.keypoints[index] ? hand.keypoints[index] : null));\n }\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n return hand;\n}\n\nexport async function predict(input: Tensor, config: Config): Promise {\n if (!models[0] || !models[1] || !models[0]?.inputs[0].shape || !models[1]?.inputs[0].shape) return []; // something is wrong with the model\n outputSize = [input.shape[2] || 0, input.shape[1] || 0];\n skipped++; // increment skip frames\n const skipTime = (config.hand.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.hand.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame) {\n return cache.hands; // return cached results without running anything\n }\n return new Promise(async (resolve) => {\n const skipTimeExtended = 3 * (config.hand.skipTime || 0) > (now() - lastTime);\n const skipFrameExtended = skipped < 3 * (config.hand.skipFrames || 0);\n if (config.skipAllowed && cache.hands.length === config.hand.maxDetected) { // we have all detected hands so we're definitely skipping\n cache.hands = await Promise.all(cache.boxes.map((handBox) => detectFingers(input, handBox, config)));\n } else if (config.skipAllowed && skipTimeExtended && skipFrameExtended && cache.hands.length > 0) { // we have some cached results: maybe not enough but anyhow continue for bit longer\n cache.hands = await Promise.all(cache.boxes.map((handBox) => detectFingers(input, handBox, config)));\n } else { // finally rerun detector\n cache.boxes = await detectHands(input, config);\n lastTime = now();\n cache.hands = await Promise.all(cache.boxes.map((handBox) => detectFingers(input, handBox, config)));\n skipped = 0;\n }\n\n const oldCache = [...cache.boxes];\n cache.boxes.length = 0; // reset cache\n if (config.cacheSensitivity > 0) {\n for (let i = 0; i < cache.hands.length; i++) {\n const boxKpt = box.square(cache.hands[i].keypoints, outputSize);\n if (boxKpt.box[2] / (input.shape[2] || 1) > 0.05 && boxKpt.box[3] / (input.shape[1] || 1) > 0.05 && cache.hands[i].fingerScore && cache.hands[i].fingerScore > (config.hand.minConfidence || 0)) {\n const boxScale = box.scale(boxKpt.box, boxExpandFact);\n const boxScaleRaw = box.scale(boxKpt.boxRaw, boxExpandFact);\n // const boxCrop = box.crop(boxScaleRaw);\n cache.boxes.push({ ...oldCache[i], box: boxScale, boxRaw: boxScaleRaw });\n }\n }\n }\n for (let i = 0; i < cache.hands.length; i++) { // replace detected boxes with calculated boxes in final output\n const bbox = box.calc(cache.hands[i].keypoints, outputSize);\n cache.hands[i].box = bbox.box;\n cache.hands[i].boxRaw = bbox.boxRaw;\n }\n resolve(cache.hands);\n });\n}\n", "/**\n * Anti-spoofing model implementation\n */\n\nimport { log, now } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nconst cached: Array = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\nlet lastCount = 0;\nlet lastTime = 0;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.liveness?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise {\n if (!model) return 0;\n const skipTime = (config.face.liveness?.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.face.liveness?.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && cached[idx]) {\n skipped++;\n return cached[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const resize = tf.image.resizeBilinear(image, [model?.inputs[0].shape ? model.inputs[0].shape[2] : 0, model?.inputs[0].shape ? model.inputs[0].shape[1] : 0], false);\n const res = model?.execute(resize) as Tensor;\n const num = (await res.data())[0];\n cached[idx] = Math.round(100 * num) / 100;\n lastCount = count;\n lastTime = now();\n tf.dispose([resize, res]);\n resolve(cached[idx]);\n });\n}\n", "export const kpt: Array = [ // used to create part labels\n 'nose',\n 'leftEye',\n 'rightEye',\n 'leftEar',\n 'rightEar',\n 'leftShoulder',\n 'rightShoulder',\n 'leftElbow',\n 'rightElbow',\n 'leftWrist',\n 'rightWrist',\n 'leftHip',\n 'rightHip',\n 'leftKnee',\n 'rightKnee',\n 'leftAnkle',\n 'rightAnkle',\n];\n\nexport const horizontal: Array = [ // used to fix left vs right\n ['leftEye', 'rightEye'],\n ['leftEar', 'rightEar'],\n ['leftShoulder', 'rightShoulder'],\n ['leftElbow', 'rightElbow'],\n ['leftWrist', 'rightWrist'],\n ['leftHip', 'rightHip'],\n ['leftKnee', 'rightKnee'],\n ['leftAnkle', 'rightAnkle'],\n];\n\nexport const vertical: Array = [ // used to remove unlikely keypoint positions\n ['leftKnee', 'leftShoulder'],\n ['rightKnee', 'rightShoulder'],\n ['leftAnkle', 'leftKnee'],\n ['rightAnkle', 'rightKnee'],\n];\n\nexport const relative: Array = [ // used to match relative body parts\n [['leftHip', 'rightHip'], ['leftShoulder', 'rightShoulder']],\n [['leftElbow', 'rightElbow'], ['leftShoulder', 'rightShoulder']],\n];\n\nexport const connected: Record = { // used to create body outline in annotations\n leftLeg: ['leftHip', 'leftKnee', 'leftAnkle'],\n rightLeg: ['rightHip', 'rightKnee', 'rightAnkle'],\n torso: ['leftShoulder', 'rightShoulder', 'rightHip', 'leftHip', 'leftShoulder'],\n leftArm: ['leftShoulder', 'leftElbow', 'leftWrist'],\n rightArm: ['rightShoulder', 'rightElbow', 'rightWrist'],\n head: [],\n};\n", "import type { BodyKeypoint, BodyResult } from '../result';\nimport * as box from '../util/box';\nimport * as coords from './movenetcoords';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport type { Tensor } from '../tfjs/types';\n\nconst maxJitter = 0.005; // default allowed jitter is within 0.5%\n\nconst cache: {\n keypoints: Array,\n padding: [number, number][];\n} = {\n keypoints: [],\n padding: [[0, 0], [0, 0], [0, 0], [0, 0]],\n};\n\nexport function bodyParts(body: BodyResult) { // model sometimes mixes up left vs right keypoints so we fix them\n for (const pair of coords.horizontal) { // fix body parts left vs right\n const left = body.keypoints.findIndex((kp) => kp.part === pair[0]);\n const right = body.keypoints.findIndex((kp) => kp.part === pair[1]);\n if (body.keypoints[left] && body.keypoints[right]) {\n if (body.keypoints[left].position[0] < body.keypoints[right].position[0]) {\n const tmp = body.keypoints[left];\n body.keypoints[left] = body.keypoints[right];\n body.keypoints[right] = tmp;\n }\n }\n }\n for (const pair of coords.vertical) { // remove body parts with improbable vertical position\n const lower = body.keypoints.findIndex((kp) => (kp && kp.part === pair[0]));\n const higher = body.keypoints.findIndex((kp) => (kp && kp.part === pair[1]));\n if (body.keypoints[lower] && body.keypoints[higher]) {\n if (body.keypoints[lower].position[1] < body.keypoints[higher].position[1]) {\n body.keypoints.splice(lower, 1);\n }\n }\n }\n for (const [pair, compare] of coords.relative) { // rearrange body parts according to their relative position\n const left = body.keypoints.findIndex((kp) => (kp && kp.part === pair[0]));\n const right = body.keypoints.findIndex((kp) => (kp && kp.part === pair[1]));\n const leftTo = body.keypoints.findIndex((kp) => (kp && kp.part === compare[0]));\n const rightTo = body.keypoints.findIndex((kp) => (kp && kp.part === compare[1]));\n if (!body.keypoints[leftTo] || !body.keypoints[rightTo]) continue; // only if we have both compare points\n const distanceLeft = body.keypoints[left] ? [\n Math.abs(body.keypoints[leftTo].position[0] - body.keypoints[left].position[0]),\n Math.abs(body.keypoints[rightTo].position[0] - body.keypoints[left].position[0]),\n ] : [0, 0];\n const distanceRight = body.keypoints[right] ? [\n Math.abs(body.keypoints[rightTo].position[0] - body.keypoints[right].position[0]),\n Math.abs(body.keypoints[leftTo].position[0] - body.keypoints[right].position[0]),\n ] : [0, 0];\n if (distanceLeft[0] > distanceLeft[1] || distanceRight[0] > distanceRight[1]) { // should flip keypoints\n const tmp = body.keypoints[left];\n body.keypoints[left] = body.keypoints[right];\n body.keypoints[right] = tmp;\n }\n }\n}\n\nexport function jitter(keypoints: Array): Array {\n for (let i = 0; i < keypoints.length; i++) {\n if (keypoints[i] && cache.keypoints[i]) {\n const diff = [Math.abs(keypoints[i].positionRaw[0] - cache.keypoints[i].positionRaw[0]), Math.abs(keypoints[i].positionRaw[1] - cache.keypoints[i].positionRaw[1])];\n if (diff[0] < maxJitter && diff[1] < maxJitter) {\n keypoints[i] = cache.keypoints[i]; // below jitter so replace keypoint\n } else {\n cache.keypoints[i] = keypoints[i]; // above jitter so update cache\n }\n } else {\n cache.keypoints[i] = keypoints[i]; // cache for keypoint doesnt exist so create it here\n }\n }\n return keypoints;\n}\n\nexport function padInput(input: Tensor, inputSize: number): Tensor {\n const t: Record = {};\n if (!input.shape || !input.shape[1] || !input.shape[2]) return input;\n cache.padding = [\n [0, 0], // dont touch batch\n [input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0, input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0], // height before&after\n [input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0, input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0], // width before&after\n [0, 0], // dont touch rbg\n ];\n t.pad = tf.pad(input, cache.padding);\n t.resize = tf.image.resizeBilinear(t.pad, [inputSize, inputSize]);\n const final = tf.cast(t.resize, 'int32');\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return final;\n}\n\nexport function rescaleBody(body: BodyResult, outputSize: [number, number]): BodyResult {\n body.keypoints = body.keypoints.filter((kpt) => kpt && kpt.position); // filter invalid keypoints\n for (const kpt of body.keypoints) {\n kpt.position = [\n kpt.position[0] * (outputSize[0] + cache.padding[2][0] + cache.padding[2][1]) / outputSize[0] - cache.padding[2][0],\n kpt.position[1] * (outputSize[1] + cache.padding[1][0] + cache.padding[1][1]) / outputSize[1] - cache.padding[1][0],\n ];\n kpt.positionRaw = [\n kpt.position[0] / outputSize[0], kpt.position[1] / outputSize[1],\n ];\n }\n const rescaledBoxes = box.calc(body.keypoints.map((pt) => pt.position), outputSize);\n body.box = rescaledBoxes.box;\n body.boxRaw = rescaledBoxes.boxRaw;\n return body;\n}\n", "/**\n * MoveNet model implementation\n *\n * Based on: [**MoveNet**](https://blog.tensorflow.org/2021/05/next-generation-pose-detection-with-movenet-and-tensorflowjs.html)\n */\n\nimport { log, now } from '../util/util';\nimport * as box from '../util/box';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as coords from './movenetcoords';\nimport * as fix from './movenetfix';\nimport { loadModel } from '../tfjs/load';\nimport type { BodyKeypoint, BodyResult, BodyLandmark, BodyAnnotation, Box, Point } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { fakeOps } from '../tfjs/backend';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nlet inputSize = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n// const boxExpandFact = 1.5; // increase to 150%\n\nconst cache: {\n boxes: Array, // unused\n bodies: Array;\n last: number,\n} = {\n boxes: [],\n bodies: [],\n last: 0,\n};\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) {\n fakeOps(['size'], config);\n model = await loadModel(config.body.modelPath);\n } else if (config.debug) log('cached model:', model['modelUrl']);\n inputSize = model.inputs[0].shape ? model.inputs[0].shape[2] : 0;\n if (inputSize < 64) inputSize = 256;\n return model;\n}\n\nasync function parseSinglePose(res, config, image) {\n const kpt = res[0][0];\n const keypoints: Array = [];\n let score = 0;\n for (let id = 0; id < kpt.length; id++) {\n score = kpt[id][2];\n if (score > config.body.minConfidence) {\n const positionRaw: Point = [kpt[id][1], kpt[id][0]];\n keypoints.push({\n score: Math.round(100 * score) / 100,\n part: coords.kpt[id] as BodyLandmark,\n positionRaw,\n position: [ // normalized to input image size\n Math.round((image.shape[2] || 0) * positionRaw[0]),\n Math.round((image.shape[1] || 0) * positionRaw[1]),\n ],\n });\n }\n }\n score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n const bodies: Array = [];\n const newBox = box.calc(keypoints.map((pt) => pt.position), [image.shape[2], image.shape[1]]);\n const annotations: Record = {};\n for (const [name, indexes] of Object.entries(coords.connected)) {\n const pt: Array = [];\n for (let i = 0; i < indexes.length - 1; i++) {\n const pt0 = keypoints.find((kp) => kp.part === indexes[i]);\n const pt1 = keypoints.find((kp) => kp.part === indexes[i + 1]);\n if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);\n }\n annotations[name] = pt;\n }\n const body: BodyResult = { id: 0, score, box: newBox.box, boxRaw: newBox.boxRaw, keypoints, annotations };\n fix.bodyParts(body);\n bodies.push(body);\n return bodies;\n}\n\nasync function parseMultiPose(res, config, image) {\n const bodies: Array = [];\n for (let id = 0; id < res[0].length; id++) {\n const kpt = res[0][id];\n const totalScore = Math.round(100 * kpt[51 + 4]) / 100;\n if (totalScore > config.body.minConfidence) {\n const keypoints: Array = [];\n for (let i = 0; i < 17; i++) {\n const score = kpt[3 * i + 2];\n if (score > config.body.minConfidence) {\n const positionRaw: Point = [kpt[3 * i + 1], kpt[3 * i + 0]];\n keypoints.push({\n part: coords.kpt[i] as BodyLandmark,\n score: Math.round(100 * score) / 100,\n positionRaw,\n position: [Math.round((image.shape[2] || 0) * positionRaw[0]), Math.round((image.shape[1] || 0) * positionRaw[1])],\n });\n }\n }\n const newBox = box.calc(keypoints.map((pt) => pt.position), [image.shape[2], image.shape[1]]);\n // movenet-multipose has built-in box details\n // const boxRaw: Box = [kpt[51 + 1], kpt[51 + 0], kpt[51 + 3] - kpt[51 + 1], kpt[51 + 2] - kpt[51 + 0]];\n // const box: Box = [Math.trunc(boxRaw[0] * (image.shape[2] || 0)), Math.trunc(boxRaw[1] * (image.shape[1] || 0)), Math.trunc(boxRaw[2] * (image.shape[2] || 0)), Math.trunc(boxRaw[3] * (image.shape[1] || 0))];\n const annotations: Record = {} as Record;\n for (const [name, indexes] of Object.entries(coords.connected)) {\n const pt: Array = [];\n for (let i = 0; i < indexes.length - 1; i++) {\n const pt0 = keypoints.find((kp) => kp.part === indexes[i]);\n const pt1 = keypoints.find((kp) => kp.part === indexes[i + 1]);\n if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);\n }\n annotations[name] = pt;\n }\n const body: BodyResult = { id, score: totalScore, box: newBox.box, boxRaw: newBox.boxRaw, keypoints: [...keypoints], annotations };\n fix.bodyParts(body);\n bodies.push(body);\n }\n }\n bodies.sort((a, b) => b.score - a.score);\n if (bodies.length > config.body.maxDetected) bodies.length = config.body.maxDetected;\n return bodies;\n}\n\nexport async function predict(input: Tensor, config: Config): Promise {\n if (!model || !model?.inputs[0].shape) return []; // something is wrong with the model\n if (!config.skipAllowed) cache.boxes.length = 0; // allowed to use cache or not\n skipped++; // increment skip frames\n const skipTime = (config.body.skipTime || 0) > (now() - cache.last);\n const skipFrame = skipped < (config.body.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame) {\n return cache.bodies; // return cached results without running anything\n }\n return new Promise(async (resolve) => {\n const t: Record = {};\n skipped = 0;\n // run detection on squared input and cached boxes\n /*\n cache.bodies = []; // reset bodies result\n if (cache.boxes.length >= (config.body.maxDetected || 0)) { // if we have enough cached boxes run detection using cache\n for (let i = 0; i < cache.boxes.length; i++) { // run detection based on cached boxes\n t.crop = tf.image.cropAndResize(input, [cache.boxes[i]], [0], [inputSize, inputSize], 'bilinear');\n t.cast = tf.cast(t.crop, 'int32');\n // t.input = prepareImage(input);\n t.res = model?.execute(t.cast) as Tensor;\n const res = await t.res.array();\n const newBodies = (t.res.shape[2] === 17) ? await parseSinglePose(res, config, input, cache.boxes[i]) : await parseMultiPose(res, config, input, cache.boxes[i]);\n cache.bodies = cache.bodies.concat(newBodies);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n }\n if (cache.bodies.length !== config.body.maxDetected) { // did not find enough bodies based on cached boxes so run detection on full frame\n t.input = prepareImage(input);\n t.res = model?.execute(t.input) as Tensor;\n const res = await t.res.array();\n cache.bodies = (t.res.shape[2] === 17) ? await parseSinglePose(res, config, input, [0, 0, 1, 1]) : await parseMultiPose(res, config, input, [0, 0, 1, 1]);\n for (const body of cache.bodies) rescaleBody(body, [input.shape[2] || 1, input.shape[1] || 1]);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n cache.boxes.length = 0; // reset cache\n for (let i = 0; i < cache.bodies.length; i++) {\n if (cache.bodies[i].keypoints.length > (coords.kpt.length / 2)) { // only update cache if we detected at least half keypoints\n const scaledBox = box.scale(cache.bodies[i].boxRaw, boxExpandFact);\n const cropBox = box.crop(scaledBox);\n cache.boxes.push(cropBox);\n }\n }\n */\n\n // run detection on squared input and no cached boxes\n t.input = fix.padInput(input, inputSize);\n t.res = model?.execute(t.input) as Tensor;\n cache.last = now();\n const res = await t.res.array();\n cache.bodies = (t.res.shape[2] === 17)\n ? await parseSinglePose(res, config, input)\n : await parseMultiPose(res, config, input);\n for (const body of cache.bodies) {\n fix.rescaleBody(body, [input.shape[2] || 1, input.shape[1] || 1]);\n fix.jitter(body.keypoints);\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n\n resolve(cache.bodies);\n });\n}\n", "/**\n * NanoDet object detection model implementation\n *\n * Based on: [**MB3-CenterNet**](https://github.com/610265158/mobilenetv3_centernet)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport { labels } from './labels';\nimport type { ObjectResult, ObjectType, Box } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel;\nlet last: Array = [];\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\nlet inputSize = 0;\n\nconst scaleBox = 2.5; // increase box size\n\nexport async function load(config: Config): Promise {\n if (!model || env.initial) {\n model = await loadModel(config.object.modelPath);\n const inputs = Object.values(model.modelSignature['inputs']);\n inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nasync function process(res: Tensor[], outputShape: [number, number], config: Config) {\n let id = 0;\n let results: Array = [];\n for (const strideSize of [1, 2, 4]) { // try each stride size as it detects large/medium/small objects\n // find scores, boxes, classes\n tf.tidy(async () => { // wrap in tidy to automatically deallocate temp tensors\n const baseSize = strideSize * 13; // 13x13=169, 26x26=676, 52x52=2704\n // find boxes and scores output depending on stride\n const scoresT = tf.squeeze(res.find((a: Tensor) => (a.shape[1] === (baseSize ** 2) && (a.shape[2] || 0) === labels.length)));\n const featuresT = tf.squeeze(res.find((a: Tensor) => (a.shape[1] === (baseSize ** 2) && (a.shape[2] || 0) < labels.length)));\n const boxesMax = featuresT.reshape([-1, 4, featuresT.shape[1] / 4]); // reshape [output] to [4, output / 4] where number is number of different features inside each stride\n const boxIdx = await boxesMax.argMax(2).array(); // what we need is indexes of features with highest scores, not values itself\n const scores = await scoresT.array(); // optionally use exponential scores or just as-is\n for (let i = 0; i < scoresT.shape[0]; i++) { // total strides (x * y matrix)\n for (let j = 0; j < scoresT.shape[1]; j++) { // one score for each class\n const score = scores[i][j]; // get score for current position\n if (score > (config.object.minConfidence || 0) && j !== 61) {\n const cx = (0.5 + Math.trunc(i % baseSize)) / baseSize; // center.x normalized to range 0..1\n const cy = (0.5 + Math.trunc(i / baseSize)) / baseSize; // center.y normalized to range 0..1\n const boxOffset = boxIdx[i].map((a: number) => a * (baseSize / strideSize / inputSize)); // just grab indexes of features with highest scores\n const [x, y] = [\n cx - (scaleBox / strideSize * boxOffset[0]),\n cy - (scaleBox / strideSize * boxOffset[1]),\n ];\n const [w, h] = [\n cx + (scaleBox / strideSize * boxOffset[2]) - x,\n cy + (scaleBox / strideSize * boxOffset[3]) - y,\n ];\n let boxRaw: Box = [x, y, w, h]; // results normalized to range 0..1\n boxRaw = boxRaw.map((a) => Math.max(0, Math.min(a, 1))) as Box; // fix out-of-bounds coords\n const box = [ // results normalized to input image pixels\n boxRaw[0] * outputShape[0],\n boxRaw[1] * outputShape[1],\n boxRaw[2] * outputShape[0],\n boxRaw[3] * outputShape[1],\n ];\n const result = {\n id: id++,\n // strideSize,\n score: Math.round(100 * score) / 100,\n class: j + 1,\n label: labels[j].label as ObjectType,\n // center: [Math.trunc(outputShape[0] * cx), Math.trunc(outputShape[1] * cy)],\n // centerRaw: [cx, cy],\n box: box.map((a) => Math.trunc(a)) as Box,\n boxRaw,\n };\n results.push(result);\n }\n }\n }\n });\n }\n // deallocate tensors\n res.forEach((t) => tf.dispose(t));\n\n // normally nms is run on raw results, but since boxes need to be calculated this way we skip calulcation of\n // unnecessary boxes and run nms only on good candidates (basically it just does IOU analysis as scores are already filtered)\n const nmsBoxes = results.map((a) => [a.boxRaw[1], a.boxRaw[0], a.boxRaw[3], a.boxRaw[2]]); // switches coordinates from x,y to y,x as expected by tf.nms\n const nmsScores = results.map((a) => a.score);\n let nmsIdx: Array = [];\n if (nmsBoxes && nmsBoxes.length > 0) {\n const nms = await tf.image.nonMaxSuppressionAsync(nmsBoxes, nmsScores, config.object.maxDetected, config.object.iouThreshold, config.object.minConfidence);\n nmsIdx = await nms.data();\n tf.dispose(nms);\n }\n\n // filter & sort results\n results = results\n .filter((_val, idx) => nmsIdx.includes(idx))\n .sort((a, b) => (b.score - a.score));\n\n return results;\n}\n\nexport async function predict(image: Tensor, config: Config): Promise {\n const skipTime = (config.object.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.object.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && (last.length > 0)) {\n skipped++;\n return last;\n }\n skipped = 0;\n if (!env.kernels.includes('mod') || !env.kernels.includes('sparsetodense')) return last;\n return new Promise(async (resolve) => {\n const outputSize = [image.shape[2] || 0, image.shape[1] || 0];\n const resize = tf.image.resizeBilinear(image, [inputSize, inputSize], false);\n const norm = tf.div(resize, constants.tf255);\n const transpose = norm.transpose([0, 3, 1, 2]);\n tf.dispose(norm);\n tf.dispose(resize);\n\n let objectT;\n if (config.object.enabled) objectT = model.execute(transpose);\n lastTime = now();\n tf.dispose(transpose);\n\n const obj = await process(objectT as Tensor[], outputSize as [number, number], config);\n last = obj;\n resolve(obj);\n });\n}\n", "/**\n * PoseNet body detection model implementation constants\n * See `posenet.ts` for entry point\n */\n\nimport type { Point, BodyResult, BodyAnnotation, BodyLandmark } from '../result';\n\nexport const partNames = [\n 'nose', 'leftEye', 'rightEye', 'leftEar', 'rightEar', 'leftShoulder',\n 'rightShoulder', 'leftElbow', 'rightElbow', 'leftWrist', 'rightWrist',\n 'leftHip', 'rightHip', 'leftKnee', 'rightKnee', 'leftAnkle', 'rightAnkle',\n];\n\nexport const count = partNames.length; // 17 keypoints\n\nexport const partIds = partNames.reduce((result, jointName, i) => {\n result[jointName] = i;\n return result;\n}, {});\n\nconst connectedPartNames = [\n ['leftHip', 'leftShoulder'], ['leftElbow', 'leftShoulder'],\n ['leftElbow', 'leftWrist'], ['leftHip', 'leftKnee'],\n ['leftKnee', 'leftAnkle'], ['rightHip', 'rightShoulder'],\n ['rightElbow', 'rightShoulder'], ['rightElbow', 'rightWrist'],\n ['rightHip', 'rightKnee'], ['rightKnee', 'rightAnkle'],\n ['leftShoulder', 'rightShoulder'], ['leftHip', 'rightHip'],\n];\nexport const connectedPartIndices = connectedPartNames.map(([jointNameA, jointNameB]) => ([partIds[jointNameA], partIds[jointNameB]]));\n\nexport const poseChain = [\n ['nose', 'leftEye'], ['leftEye', 'leftEar'], ['nose', 'rightEye'],\n ['rightEye', 'rightEar'], ['nose', 'leftShoulder'],\n ['leftShoulder', 'leftElbow'], ['leftElbow', 'leftWrist'],\n ['leftShoulder', 'leftHip'], ['leftHip', 'leftKnee'],\n ['leftKnee', 'leftAnkle'], ['nose', 'rightShoulder'],\n ['rightShoulder', 'rightElbow'], ['rightElbow', 'rightWrist'],\n ['rightShoulder', 'rightHip'], ['rightHip', 'rightKnee'],\n ['rightKnee', 'rightAnkle'],\n];\n\nexport function eitherPointDoesntMeetConfidence(a: number, b: number, minConfidence: number) {\n return (a < minConfidence || b < minConfidence);\n}\n\nexport function getAdjacentKeyPoints(keypoints, minConfidence: number) {\n return connectedPartIndices.reduce((result, [leftJoint, rightJoint]) => {\n if (eitherPointDoesntMeetConfidence(keypoints[leftJoint].score, keypoints[rightJoint].score, minConfidence)) {\n return result;\n }\n result.push([keypoints[leftJoint], keypoints[rightJoint]]);\n return result;\n }, []);\n}\n\nexport function getBoundingBox(keypoints): [number, number, number, number] {\n const coord = keypoints.reduce(({ maxX, maxY, minX, minY }, { position: { x, y } }) => ({\n maxX: Math.max(maxX, x),\n maxY: Math.max(maxY, y),\n minX: Math.min(minX, x),\n minY: Math.min(minY, y),\n }), {\n maxX: Number.NEGATIVE_INFINITY,\n maxY: Number.NEGATIVE_INFINITY,\n minX: Number.POSITIVE_INFINITY,\n minY: Number.POSITIVE_INFINITY,\n });\n return [coord.minX, coord.minY, coord.maxX - coord.minX, coord.maxY - coord.minY];\n}\n\nexport function scalePoses(poses, [height, width], [inputResolutionHeight, inputResolutionWidth]): Array {\n const scaleY = height / inputResolutionHeight;\n const scaleX = width / inputResolutionWidth;\n const scalePose = (pose, i): BodyResult => ({\n id: i,\n score: pose.score,\n boxRaw: [pose.box[0] / inputResolutionWidth, pose.box[1] / inputResolutionHeight, pose.box[2] / inputResolutionWidth, pose.box[3] / inputResolutionHeight],\n box: [Math.trunc(pose.box[0] * scaleX), Math.trunc(pose.box[1] * scaleY), Math.trunc(pose.box[2] * scaleX), Math.trunc(pose.box[3] * scaleY)],\n keypoints: pose.keypoints.map(({ score, part, position }) => ({\n score: score as number,\n part: part as BodyLandmark,\n position: [Math.trunc(position.x * scaleX), Math.trunc(position.y * scaleY)] as Point,\n positionRaw: [position.x / inputResolutionHeight, position.y / inputResolutionHeight] as Point,\n })),\n annotations: {} as Record,\n });\n const scaledPoses = poses.map((pose, i) => scalePose(pose, i));\n return scaledPoses;\n}\n\n// algorithm based on Coursera Lecture from Algorithms, Part 1: https://www.coursera.org/learn/algorithms-part1/lecture/ZjoSM/heapsort\nexport class MaxHeap {\n priorityQueue: Array; // don't touch\n numberOfElements: number;\n getElementValue: unknown; // function call\n\n constructor(maxSize, getElementValue) {\n this.priorityQueue = new Array(maxSize);\n this.numberOfElements = -1;\n this.getElementValue = getElementValue;\n }\n\n enqueue(x) {\n this.priorityQueue[++this.numberOfElements] = x;\n this.swim(this.numberOfElements);\n }\n\n dequeue() {\n const max = this.priorityQueue[0];\n this.exchange(0, this.numberOfElements--);\n this.sink(0);\n this.priorityQueue[this.numberOfElements + 1] = null;\n return max;\n }\n\n empty() { return this.numberOfElements === -1; }\n\n size() { return this.numberOfElements + 1; }\n\n all() { return this.priorityQueue.slice(0, this.numberOfElements + 1); }\n\n max() { return this.priorityQueue[0]; }\n\n swim(k) {\n while (k > 0 && this.less(Math.floor(k / 2), k)) {\n this.exchange(k, Math.floor(k / 2));\n k = Math.floor(k / 2);\n }\n }\n\n sink(k) {\n while (2 * k <= this.numberOfElements) {\n let j = 2 * k;\n if (j < this.numberOfElements && this.less(j, j + 1)) j++;\n if (!this.less(k, j)) break;\n this.exchange(k, j);\n k = j;\n }\n }\n\n getValueAt(i) {\n // @ts-ignore getter is of unknown type\n return this.getElementValue(this.priorityQueue[i]);\n }\n\n less(i, j) {\n return this.getValueAt(i) < this.getValueAt(j);\n }\n\n exchange(i, j) {\n const t = this.priorityQueue[i];\n this.priorityQueue[i] = this.priorityQueue[j];\n this.priorityQueue[j] = t;\n }\n}\n\nexport function getOffsetPoint(y, x, keypoint, offsets) {\n return {\n y: offsets.get(y, x, keypoint),\n x: offsets.get(y, x, keypoint + count),\n };\n}\n\nexport function getImageCoords(part, outputStride, offsets) {\n const { heatmapY, heatmapX, id: keypoint } = part;\n const { y, x } = getOffsetPoint(heatmapY, heatmapX, keypoint, offsets);\n return {\n x: part.heatmapX * outputStride + x,\n y: part.heatmapY * outputStride + y,\n };\n}\n\nexport function fillArray(element, size) {\n const result = new Array(size);\n for (let i = 0; i < size; i++) {\n result[i] = element;\n }\n return result;\n}\n\nexport function clamp(a, min, max) {\n if (a < min) return min;\n if (a > max) return max;\n return a;\n}\n\nexport function squaredDistance(y1, x1, y2, x2) {\n const dy = y2 - y1;\n const dx = x2 - x1;\n return dy * dy + dx * dx;\n}\n\nexport function addVectors(a, b) {\n return { x: a.x + b.x, y: a.y + b.y };\n}\n\nexport function clampVector(a, min, max) {\n return { y: clamp(a.y, min, max), x: clamp(a.x, min, max) };\n}\n", "/**\n * PoseNet body detection model implementation\n *\n * Based on: [**PoseNet**](https://medium.com/tensorflow/real-time-human-pose-estimation-in-the-browser-with-tensorflow-js-7dd0bc881cd5)\n */\n\nimport { log } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport type { BodyResult, BodyLandmark, Box } from '../result';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\nimport * as utils from './posenetutils';\n\nlet model: GraphModel;\nconst poseNetOutputs = ['MobilenetV1/offset_2/BiasAdd'/* offsets */, 'MobilenetV1/heatmap_2/BiasAdd'/* heatmapScores */, 'MobilenetV1/displacement_fwd_2/BiasAdd'/* displacementFwd */, 'MobilenetV1/displacement_bwd_2/BiasAdd'/* displacementBwd */];\nconst localMaximumRadius = 1;\nconst outputStride = 16;\nconst squaredNmsRadius = 50 ** 2;\n\nfunction traverse(edgeId, sourceKeypoint, targetId, scores, offsets, displacements, offsetRefineStep = 2) {\n const getDisplacement = (point) => ({\n y: displacements.get(point.y, point.x, edgeId),\n x: displacements.get(point.y, point.x, (displacements.shape[2] / 2) + edgeId),\n });\n const getStridedIndexNearPoint = (point, height, width) => ({\n y: utils.clamp(Math.round(point.y / outputStride), 0, height - 1),\n x: utils.clamp(Math.round(point.x / outputStride), 0, width - 1),\n });\n\n const [height, width] = scores.shape;\n // Nearest neighbor interpolation for the source->target displacements.\n const sourceKeypointIndices = getStridedIndexNearPoint(sourceKeypoint.position, height, width);\n const displacement = getDisplacement(sourceKeypointIndices);\n const displacedPoint = utils.addVectors(sourceKeypoint.position, displacement);\n let targetKeypoint = displacedPoint;\n for (let i = 0; i < offsetRefineStep; i++) {\n const targetKeypointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);\n const offsetPoint = utils.getOffsetPoint(targetKeypointIndices.y, targetKeypointIndices.x, targetId, offsets);\n targetKeypoint = utils.addVectors(\n { x: targetKeypointIndices.x * outputStride, y: targetKeypointIndices.y * outputStride },\n { x: offsetPoint.x, y: offsetPoint.y },\n );\n }\n const targetKeyPointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);\n const score = scores.get(targetKeyPointIndices.y, targetKeyPointIndices.x, targetId);\n return { position: targetKeypoint, part: utils.partNames[targetId], score };\n}\n\nexport function decodePose(root, scores, offsets, displacementsFwd, displacementsBwd) {\n const tuples = utils.poseChain.map(([parentJoinName, childJoinName]) => ([utils.partIds[parentJoinName], utils.partIds[childJoinName]]));\n const edgesFwd = tuples.map(([, childJointId]) => childJointId);\n const edgesBwd = tuples.map(([parentJointId]) => parentJointId);\n const numParts = scores.shape[2]; // [21,21,17]\n const numEdges = edgesFwd.length;\n const keypoints = new Array(numParts);\n // Start a new detection instance at the position of the root.\n const rootPoint = utils.getImageCoords(root.part, outputStride, offsets);\n keypoints[root.part.id] = {\n score: root.score,\n part: utils.partNames[root.part.id] as BodyLandmark,\n position: rootPoint,\n };\n // Decode the part positions upwards in the tree, following the backward displacements.\n for (let edge = numEdges - 1; edge >= 0; --edge) {\n const sourceId = edgesFwd[edge];\n const targetId = edgesBwd[edge];\n if (keypoints[sourceId] && !keypoints[targetId]) {\n keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsBwd);\n }\n }\n // Decode the part positions downwards in the tree, following the forward displacements.\n for (let edge = 0; edge < numEdges; ++edge) {\n const sourceId = edgesBwd[edge];\n const targetId = edgesFwd[edge];\n if (keypoints[sourceId] && !keypoints[targetId]) {\n keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsFwd);\n }\n }\n return keypoints;\n}\n\nfunction scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores) {\n const [height, width] = scores.shape;\n let localMaximum = true;\n const yStart = Math.max(heatmapY - localMaximumRadius, 0);\n const yEnd = Math.min(heatmapY + localMaximumRadius + 1, height);\n for (let yCurrent = yStart; yCurrent < yEnd; ++yCurrent) {\n const xStart = Math.max(heatmapX - localMaximumRadius, 0);\n const xEnd = Math.min(heatmapX + localMaximumRadius + 1, width);\n for (let xCurrent = xStart; xCurrent < xEnd; ++xCurrent) {\n if (scores.get(yCurrent, xCurrent, keypointId) > score) {\n localMaximum = false;\n break;\n }\n }\n if (!localMaximum) break;\n }\n return localMaximum;\n}\n\nexport function buildPartWithScoreQueue(minConfidence, scores) {\n const [height, width, numKeypoints] = scores.shape;\n const queue = new utils.MaxHeap(height * width * numKeypoints, ({ score }) => score);\n for (let heatmapY = 0; heatmapY < height; ++heatmapY) {\n for (let heatmapX = 0; heatmapX < width; ++heatmapX) {\n for (let keypointId = 0; keypointId < numKeypoints; ++keypointId) {\n const score = scores.get(heatmapY, heatmapX, keypointId);\n // Only consider parts with score greater or equal to threshold as root candidates.\n if (score < minConfidence) continue;\n // Only consider keypoints whose score is maximum in a local window.\n if (scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores)) queue.enqueue({ score, part: { heatmapY, heatmapX, id: keypointId } });\n }\n }\n }\n return queue;\n}\n\nfunction withinRadius(poses, { x, y }, keypointId) {\n return poses.some(({ keypoints }) => {\n const correspondingKeypoint = keypoints[keypointId]?.position;\n if (!correspondingKeypoint) return false;\n return utils.squaredDistance(y, x, correspondingKeypoint.y, correspondingKeypoint.x) <= squaredNmsRadius;\n });\n}\n\nfunction getInstanceScore(existingPoses, keypoints) {\n const notOverlappedKeypointScores = keypoints.reduce((result, { position, score }, keypointId) => {\n if (!withinRadius(existingPoses, position, keypointId)) result += score;\n return result;\n }, 0.0);\n return notOverlappedKeypointScores / keypoints.length;\n}\n\nexport function decode(offsets, scores, displacementsFwd, displacementsBwd, maxDetected, minConfidence) {\n const poses: Array<{ keypoints, box: Box, score: number }> = [];\n const queue = buildPartWithScoreQueue(minConfidence, scores);\n // Generate at most maxDetected object instances per image in decreasing root part score order.\n while (poses.length < maxDetected && !queue.empty()) {\n // The top element in the queue is the next root candidate.\n const root = queue.dequeue();\n // Part-based non-maximum suppression: We reject a root candidate if it is within a disk of `nmsRadius` pixels from the corresponding part of a previously detected instance.\n // @ts-ignore this one is tree walk\n const rootImageCoords = utils.getImageCoords(root.part, outputStride, offsets);\n // @ts-ignore this one is tree walk\n if (withinRadius(poses, rootImageCoords, root.part.id)) continue;\n // Else start a new detection instance at the position of the root.\n let keypoints = decodePose(root, scores, offsets, displacementsFwd, displacementsBwd);\n keypoints = keypoints.filter((a) => a.score > minConfidence);\n const score = getInstanceScore(poses, keypoints);\n const box = utils.getBoundingBox(keypoints);\n if (score > minConfidence) poses.push({ keypoints, box, score: Math.round(100 * score) / 100 });\n }\n return poses;\n}\n\nexport async function predict(input: Tensor, config: Config): Promise {\n /** posenet is mostly obsolete\n * caching is not implemented\n */\n const res = tf.tidy(() => {\n if (!model.inputs[0].shape) return [];\n const resized = tf.image.resizeBilinear(input, [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n const normalized = tf.sub(tf.div(tf.cast(resized, 'float32'), 127.5), 1.0);\n const results: Array = model.execute(normalized, poseNetOutputs) as Array;\n const results3d = results.map((y) => tf.squeeze(y, [0]));\n results3d[1] = tf.sigmoid(results3d[1]); // apply sigmoid on scores\n return results3d;\n });\n\n const buffers = await Promise.all(res.map((tensor: Tensor) => tensor.buffer()));\n for (const t of res) tf.dispose(t);\n\n const decoded = await decode(buffers[0], buffers[1], buffers[2], buffers[3], config.body.maxDetected, config.body.minConfidence);\n if (!model.inputs[0].shape) return [];\n const scaled = utils.scalePoses(decoded, [input.shape[1], input.shape[2]], [model.inputs[0].shape[2], model.inputs[0].shape[1]]) as BodyResult[];\n return scaled;\n}\n\nexport async function load(config: Config): Promise {\n if (!model || env.initial) model = await loadModel(config.body.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n", "/**\n * Image segmentation for body detection model\n *\n * Based on:\n * - [**MediaPipe Meet**](https://drive.google.com/file/d/1lnP1bRi9CSqQQXUHa13159vLELYDgDu0/preview)\n * - [**MediaPipe Selfie**](https://drive.google.com/file/d/1dCfozqknMa068vVsO2j_1FgZkW_e3VWv/preview)\n */\n\nimport { log } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport * as image from '../image/image';\nimport { constants } from '../tfjs/constants';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\nimport type { Input, AnyCanvas } from '../exports';\n\nlet model: GraphModel;\nlet busy = false;\n\nexport async function load(config: Config): Promise {\n if (!model || env.initial) model = await loadModel(config.segmentation.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function process(input: Input, background: Input | undefined, config: Config)\n: Promise<{ data: Array | Tensor, canvas: AnyCanvas | null, alpha: AnyCanvas | null }> {\n if (busy) return { data: [], canvas: null, alpha: null };\n busy = true;\n if (!model) await load(config);\n const inputImage = await image.process(input, config);\n const width = inputImage.tensor?.shape[2] || 0;\n const height = inputImage.tensor?.shape[1] || 0;\n if (!inputImage.tensor) return { data: [], canvas: null, alpha: null };\n const t: Record = {};\n\n t.resize = tf.image.resizeBilinear(inputImage.tensor, [model.inputs[0].shape ? model.inputs[0].shape[1] : 0, model.inputs[0].shape ? model.inputs[0].shape[2] : 0], false);\n tf.dispose(inputImage.tensor);\n t.norm = tf.div(t.resize, constants.tf255);\n t.res = model.execute(t.norm) as Tensor;\n\n t.squeeze = tf.squeeze(t.res, 0); // meet.shape:[1,256,256,1], selfie.shape:[1,144,256,2]\n if (t.squeeze.shape[2] === 2) {\n t.softmax = tf.softmax(t.squeeze); // model meet has two channels for fg and bg\n [t.bg, t.fg] = tf.unstack(t.softmax, 2);\n t.expand = tf.expandDims(t.fg, 2);\n t.pad = tf.expandDims(t.expand, 0);\n t.crop = tf.image.cropAndResize(t.pad, [[0, 0, 0.5, 0.5]], [0], [width, height]);\n // running sofmax before unstack creates 2x2 matrix so we only take upper-left quadrant\n // otherwise run softmax after unstack and use standard resize\n // resizeOutput = tf.image.resizeBilinear(expand, [input.tensor?.shape[1], input.tensor?.shape[2]]);\n t.data = tf.squeeze(t.crop, 0);\n } else {\n t.data = tf.image.resizeBilinear(t.squeeze, [height, width]); // model selfie has a single channel that we can use directly\n }\n const data = Array.from(await t.data.data()) as number[];\n\n if (env.node && !env.Canvas && (typeof ImageData === 'undefined')) {\n if (config.debug) log('canvas support missing');\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return { data, canvas: null, alpha: null }; // running in nodejs so return alpha array as-is\n }\n\n const alphaCanvas = image.canvas(width, height);\n // @ts-ignore browser is not defined in tfjs-node\n if (tf.browser) await tf.browser.toPixels(t.data, alphaCanvas);\n const alphaCtx = alphaCanvas.getContext('2d') as CanvasRenderingContext2D;\n if (config.segmentation.blur && config.segmentation.blur > 0) alphaCtx.filter = `blur(${config.segmentation.blur}px)`; // use css filter for bluring, can be done with gaussian blur manually instead\n const alphaData = alphaCtx.getImageData(0, 0, width, height);\n\n const compositeCanvas = image.canvas(width, height);\n const compositeCtx = compositeCanvas.getContext('2d') as CanvasRenderingContext2D;\n if (inputImage.canvas) compositeCtx.drawImage(inputImage.canvas, 0, 0);\n compositeCtx.globalCompositeOperation = 'darken'; // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation // best options are: darken, color-burn, multiply\n if (config.segmentation.blur && config.segmentation.blur > 0) compositeCtx.filter = `blur(${config.segmentation.blur}px)`; // use css filter for bluring, can be done with gaussian blur manually instead\n compositeCtx.drawImage(alphaCanvas, 0, 0);\n compositeCtx.globalCompositeOperation = 'source-over'; // reset composite operation\n compositeCtx.filter = 'none'; // reset css filter\n const compositeData = compositeCtx.getImageData(0, 0, width, height);\n for (let i = 0; i < width * height; i++) compositeData.data[4 * i + 3] = alphaData.data[4 * i + 0]; // copy original alpha value to new composite canvas\n compositeCtx.putImageData(compositeData, 0, 0);\n\n let mergedCanvas: AnyCanvas | null = null;\n if (background && compositeCanvas) { // draw background with segmentation as overlay if background is present\n mergedCanvas = image.canvas(width, height);\n const bgImage = await image.process(background, config);\n tf.dispose(bgImage.tensor);\n const ctxMerge = mergedCanvas.getContext('2d') as CanvasRenderingContext2D;\n ctxMerge.drawImage(bgImage.canvas as HTMLCanvasElement, 0, 0, mergedCanvas.width, mergedCanvas.height);\n ctxMerge.drawImage(compositeCanvas, 0, 0);\n }\n\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n busy = false;\n // return { data, canvas: mergedCanvas || compositeCanvas, alpha: alphaCanvas };\n return { data, canvas: compositeCanvas, alpha: alphaCanvas };\n}\n", "/**\n * Loader and Validator for all models used by Human\n */\n\nimport { env } from './util/env';\nimport { log } from './util/util';\nimport * as gear from './gear/gear';\nimport * as ssrnetAge from './gear/ssrnet-age';\nimport * as ssrnetGender from './gear/ssrnet-gender';\nimport * as antispoof from './face/antispoof';\nimport * as blazeface from './face/blazeface';\nimport * as blazepose from './body/blazepose';\nimport * as centernet from './object/centernet';\nimport * as efficientpose from './body/efficientpose';\nimport * as emotion from './gear/emotion';\nimport * as mobilefacenet from './face/mobilefacenet';\nimport * as facemesh from './face/facemesh';\nimport * as faceres from './face/faceres';\nimport * as handpose from './hand/handpose';\nimport * as handtrack from './hand/handtrack';\nimport * as iris from './face/iris';\nimport * as liveness from './face/liveness';\nimport * as movenet from './body/movenet';\nimport * as nanodet from './object/nanodet';\nimport * as posenet from './body/posenet';\nimport * as segmentation from './segmentation/segmentation';\nimport type { GraphModel } from './tfjs/types';\nimport type { Human } from './human';\n\n/** Instances of all possible TFJS Graph Models used by Human\n * - loaded as needed based on configuration\n * - initialized explictly with `human.load()` method\n * - initialized implicity on first call to `human.detect()`\n * - each model can be `null` if not loaded, instance of `GraphModel` if loaded or `Promise` if loading\n */\nexport class Models {\n ssrnetage: null | GraphModel | Promise = null;\n gear: null | GraphModel | Promise = null;\n blazeposedetect: null | GraphModel | Promise = null;\n blazepose: null | GraphModel | Promise = null;\n centernet: null | GraphModel | Promise = null;\n efficientpose: null | GraphModel | Promise = null;\n mobilefacenet: null | GraphModel | Promise = null;\n emotion: null | GraphModel | Promise = null;\n facedetect: null | GraphModel | Promise = null;\n faceiris: null | GraphModel | Promise = null;\n facemesh: null | GraphModel | Promise = null;\n faceres: null | GraphModel | Promise = null;\n ssrnetgender: null | GraphModel | Promise = null;\n handpose: null | GraphModel | Promise = null;\n handskeleton: null | GraphModel | Promise = null;\n handtrack: null | GraphModel | Promise = null;\n liveness: null | GraphModel | Promise = null;\n movenet: null | GraphModel | Promise = null;\n nanodet: null | GraphModel | Promise = null;\n posenet: null | GraphModel | Promise = null;\n segmentation: null | GraphModel | Promise = null;\n antispoof: null | GraphModel | Promise = null;\n}\n\nexport function reset(instance: Human): void {\n // if (instance.config.debug) log('resetting loaded models');\n for (const model of Object.keys(instance.models)) instance.models[model as keyof Models] = null;\n}\n\n/** Load method preloads all instance.configured models on-demand */\nexport async function load(instance: Human): Promise {\n if (env.initial) reset(instance);\n if (instance.config.hand.enabled) { // handpose model is a combo that must be loaded as a whole\n if (!instance.models.handpose && instance.config.hand.detector?.modelPath?.includes('handdetect')) [instance.models.handpose, instance.models.handskeleton] = await handpose.load(instance.config);\n if (!instance.models.handskeleton && instance.config.hand.landmarks && instance.config.hand.detector?.modelPath?.includes('handdetect')) [instance.models.handpose, instance.models.handskeleton] = await handpose.load(instance.config);\n }\n if (instance.config.body.enabled && !instance.models.blazepose && instance.config.body?.modelPath?.includes('blazepose')) instance.models.blazepose = blazepose.loadPose(instance.config);\n // @ts-ignore optional model\n if (instance.config.body.enabled && !instance.models.blazeposedetect && instance.config.body['detector'] && instance.config.body['detector']['modelPath']) instance.models.blazeposedetect = blazepose.loadDetect(instance.config);\n if (instance.config.body.enabled && !instance.models.efficientpose && instance.config.body?.modelPath?.includes('efficientpose')) instance.models.efficientpose = efficientpose.load(instance.config);\n if (instance.config.body.enabled && !instance.models.movenet && instance.config.body?.modelPath?.includes('movenet')) instance.models.movenet = movenet.load(instance.config);\n if (instance.config.body.enabled && !instance.models.posenet && instance.config.body?.modelPath?.includes('posenet')) instance.models.posenet = posenet.load(instance.config);\n if (instance.config.face.enabled && !instance.models.facedetect) instance.models.facedetect = blazeface.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.antispoof?.enabled && !instance.models.antispoof) instance.models.antispoof = antispoof.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.liveness?.enabled && !instance.models.liveness) instance.models.liveness = liveness.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.description?.enabled && !instance.models.faceres) instance.models.faceres = faceres.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.emotion?.enabled && !instance.models.emotion) instance.models.emotion = emotion.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.iris?.enabled && !instance.models.faceiris) instance.models.faceiris = iris.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.mesh?.enabled && !instance.models.facemesh) instance.models.facemesh = facemesh.load(instance.config);\n // @ts-ignore optional model\n if (instance.config.face.enabled && instance.config.face['gear']?.enabled && !instance.models.gear) instance.models.gear = gear.load(instance.config);\n // @ts-ignore optional model\n if (instance.config.face.enabled && instance.config.face['ssrnet']?.enabled && !instance.models.ssrnetage) instance.models.ssrnetage = ssrnetAge.load(instance.config);\n // @ts-ignore optional model\n if (instance.config.face.enabled && instance.config.face['ssrnet']?.enabled && !instance.models.ssrnetgender) instance.models.ssrnetgender = ssrnetGender.load(instance.config);\n // @ts-ignore optional model\n if (instance.config.face.enabled && instance.config.face['mobilefacenet']?.enabled && !instance.models.mobilefacenet) instance.models.mobilefacenet = mobilefacenet.load(instance.config);\n if (instance.config.hand.enabled && !instance.models.handtrack && instance.config.hand.detector?.modelPath?.includes('handtrack')) instance.models.handtrack = handtrack.loadDetect(instance.config);\n if (instance.config.hand.enabled && instance.config.hand.landmarks && !instance.models.handskeleton && instance.config.hand.detector?.modelPath?.includes('handtrack')) instance.models.handskeleton = handtrack.loadSkeleton(instance.config);\n if (instance.config.object.enabled && !instance.models.centernet && instance.config.object?.modelPath?.includes('centernet')) instance.models.centernet = centernet.load(instance.config);\n if (instance.config.object.enabled && !instance.models.nanodet && instance.config.object?.modelPath?.includes('nanodet')) instance.models.nanodet = nanodet.load(instance.config);\n if (instance.config.segmentation.enabled && !instance.models.segmentation) instance.models.segmentation = segmentation.load(instance.config);\n\n // models are loaded in parallel asynchronously so lets wait until they are actually loaded\n for await (const model of Object.keys(instance.models)) {\n if (instance.models[model as keyof Models] && typeof instance.models[model as keyof Models] !== 'undefined') instance.models[model as keyof Models] = await instance.models[model as keyof Models];\n }\n}\n\nexport async function validate(instance: Human): Promise {\n interface Op { name: string, category: string, op: string }\n const simpleOps = ['const', 'placeholder', 'noop', 'pad', 'squeeze', 'add', 'sub', 'mul', 'div'];\n for (const defined of Object.keys(instance.models)) {\n const model: GraphModel | null = instance.models[defined as keyof Models] as GraphModel | null;\n if (!model) continue;\n const ops: string[] = [];\n // @ts-ignore // executor is a private method\n const executor = model?.executor;\n if (executor && executor.graph.nodes) {\n for (const kernel of Object.values(executor.graph.nodes)) {\n const op = (kernel as Op).op.toLowerCase();\n if (!ops.includes(op)) ops.push(op);\n }\n } else {\n if (!executor && instance.config.debug) log('model signature not determined:', defined);\n }\n const missing: string[] = [];\n for (const op of ops) {\n if (!simpleOps.includes(op) // exclude simple ops\n && !instance.env.kernels.includes(op) // check actual kernel ops\n && !instance.env.kernels.includes(op.replace('_', '')) // check variation without _\n && !instance.env.kernels.includes(op.replace('native', '')) // check standard variation\n && !instance.env.kernels.includes(op.replace('v2', ''))) { // check non-versioned variation\n missing.push(op);\n }\n }\n // log('model validation ops:', defined, ops);\n if (instance.config.debug && missing.length > 0) log('model validation failed:', defined, missing);\n }\n}\n", "/** TFJS custom backend registration */\n\nimport type { Human } from '../human';\nimport { log } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as image from '../image/image';\nimport * as models from '../models';\nimport type { AnyCanvas } from '../exports';\n// import { env } from '../env';\n\nexport const config = {\n name: 'humangl',\n priority: 999,\n canvas: null,\n gl: null,\n extensions: [],\n webGLattr: { // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.2\n alpha: false,\n antialias: false,\n premultipliedAlpha: false,\n preserveDrawingBuffer: false,\n depth: false,\n stencil: false,\n failIfMajorPerformanceCaveat: false,\n desynchronized: true,\n },\n};\n\nfunction extensions(): void {\n /*\n https://www.khronos.org/registry/webgl/extensions/\n https://webglreport.com/?v=2\n */\n const gl = config.gl;\n if (!gl) return;\n config.extensions = gl.getSupportedExtensions() as string[];\n // gl.getExtension('KHR_parallel_shader_compile');\n}\n\n/**\n * Registers custom WebGL2 backend to be used by Human library\n *\n * @returns void\n */\nexport async function register(instance: Human): Promise {\n // force backend reload if gl context is not valid\n if (instance.config.backend !== 'humangl') return;\n if ((config.name in tf.engine().registry) && (!config.gl || !config.gl.getParameter(config.gl.VERSION))) {\n log('error: humangl backend invalid context');\n models.reset(instance);\n /*\n log('resetting humangl backend');\n await tf.removeBackend(config.name);\n await register(instance); // re-register\n */\n }\n if (!tf.findBackend(config.name)) {\n try {\n config.canvas = await image.canvas(100, 100);\n } catch (err) {\n log('error: cannot create canvas:', err);\n return;\n }\n try {\n config.gl = config.canvas?.getContext('webgl2', config.webGLattr) as WebGL2RenderingContext;\n const glv2 = config.gl.getParameter(config.gl.VERSION).includes('2.0');\n if (!glv2) {\n log('override: using fallback webgl backend as webgl 2.0 is not detected');\n instance.config.backend = 'webgl';\n return;\n }\n if (config.canvas) {\n config.canvas.addEventListener('webglcontextlost', async (e) => {\n log('error: humangl:', e.type);\n log('possible browser memory leak using webgl or conflict with multiple backend registrations');\n instance.emit('error');\n throw new Error('backend error: webgl context lost');\n // log('resetting humangl backend');\n // env.initial = true;\n // models.reset(instance);\n // await tf.removeBackend(config.name);\n // await register(instance); // re-register\n });\n config.canvas.addEventListener('webglcontextrestored', (e) => {\n log('error: humangl context restored:', e);\n });\n config.canvas.addEventListener('webglcontextcreationerror', (e) => {\n log('error: humangl context create:', e);\n });\n }\n } catch (err) {\n log('error: cannot get WebGL context:', err);\n return;\n }\n try {\n tf.setWebGLContext(2, config.gl);\n } catch (err) {\n log('error: cannot set WebGL context:', err);\n return;\n }\n try {\n const ctx = new tf.GPGPUContext(config.gl);\n tf.registerBackend(config.name, () => new tf.MathBackendWebGL(ctx), config.priority);\n } catch (err) {\n log('error: cannot register WebGL backend:', err);\n return;\n }\n try {\n const kernels = tf.getKernelsForBackend('webgl');\n kernels.forEach((kernelConfig) => {\n const newKernelConfig = { ...kernelConfig, backendName: config.name };\n tf.registerKernel(newKernelConfig);\n });\n } catch (err) {\n log('error: cannot update WebGL backend registration:', err);\n return;\n }\n const current = tf.backend().getGPGPUContext ? tf.backend().getGPGPUContext().gl : null;\n if (current) {\n log(`humangl webgl version:${current.getParameter(current.VERSION)} renderer:${current.getParameter(current.RENDERER)}`);\n } else {\n log('error: no current gl context:', current, config.gl);\n return;\n }\n try {\n tf.ENV.set('WEBGL_VERSION', 2);\n } catch (err) {\n log('error: cannot set WebGL backend flags:', err);\n return;\n }\n extensions();\n log('backend registered:', config.name);\n }\n}\n", "/** TFJS backend initialization and customization */\n\nimport type { Human } from '../human';\nimport { log, now } from '../util/util';\nimport { env } from '../util/env';\nimport * as humangl from './humangl';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as constants from './constants';\n\nfunction registerCustomOps() {\n if (!env.kernels.includes('mod')) {\n const kernelMod = {\n kernelName: 'Mod',\n backendName: tf.getBackend(),\n kernelFunc: (op) => tf.tidy(() => tf.sub(op.inputs.a, tf.mul(tf.div(op.inputs.a, op.inputs.b), op.inputs.b))),\n };\n tf.registerKernel(kernelMod);\n env.kernels.push('mod');\n }\n if (!env.kernels.includes('floormod')) {\n const kernelMod = {\n kernelName: 'FloorMod',\n backendName: tf.getBackend(),\n kernelFunc: (op) => tf.tidy(() => tf.floorDiv(op.inputs.a / op.inputs.b) * op.inputs.b + tf.mod(op.inputs.a, op.inputs.b)),\n };\n tf.registerKernel(kernelMod);\n env.kernels.push('floormod');\n }\n}\n\nexport async function check(instance: Human, force = false) {\n instance.state = 'backend';\n if (force || env.initial || (instance.config.backend && (instance.config.backend.length > 0) && (tf.getBackend() !== instance.config.backend))) {\n const timeStamp = now();\n\n if (instance.config.backend && instance.config.backend.length > 0) {\n // detect web worker\n // @ts-ignore ignore missing type for WorkerGlobalScope as that is the point\n if (typeof window === 'undefined' && typeof WorkerGlobalScope !== 'undefined' && instance.config.debug) {\n if (instance.config.debug) log('running inside web worker');\n }\n\n // force browser vs node backend\n if (env.browser && instance.config.backend === 'tensorflow') {\n if (instance.config.debug) log('override: backend set to tensorflow while running in browser');\n instance.config.backend = 'humangl';\n }\n if (env.node && (instance.config.backend === 'webgl' || instance.config.backend === 'humangl')) {\n if (instance.config.debug) log(`override: backend set to ${instance.config.backend} while running in nodejs`);\n instance.config.backend = 'tensorflow';\n }\n\n // handle webgpu\n if (env.browser && instance.config.backend === 'webgpu') {\n if (typeof navigator === 'undefined' || typeof navigator['gpu'] === 'undefined') {\n log('override: backend set to webgpu but browser does not support webgpu');\n instance.config.backend = 'humangl';\n } else {\n const adapter = await navigator['gpu'].requestAdapter();\n if (instance.config.debug) log('enumerated webgpu adapter:', adapter);\n }\n }\n\n // check available backends\n if (instance.config.backend === 'humangl') await humangl.register(instance);\n const available = Object.keys(tf.engine().registryFactory);\n if (instance.config.debug) log('available backends:', available);\n\n if (!available.includes(instance.config.backend)) {\n log(`error: backend ${instance.config.backend} not found in registry`);\n instance.config.backend = env.node ? 'tensorflow' : 'webgl';\n if (instance.config.debug) log(`override: setting backend ${instance.config.backend}`);\n }\n\n if (instance.config.debug) log('setting backend:', instance.config.backend);\n\n // customize wasm\n if (instance.config.backend === 'wasm') {\n if (instance.config.debug) log('wasm path:', instance.config.wasmPath);\n if (typeof tf?.setWasmPaths !== 'undefined') await tf.setWasmPaths(instance.config.wasmPath, instance.config.wasmPlatformFetch);\n else throw new Error('backend error: attempting to use wasm backend but wasm path is not set');\n const simd = await tf.env().getAsync('WASM_HAS_SIMD_SUPPORT');\n const mt = await tf.env().getAsync('WASM_HAS_MULTITHREAD_SUPPORT');\n if (instance.config.debug) log(`wasm execution: ${simd ? 'SIMD' : 'no SIMD'} ${mt ? 'multithreaded' : 'singlethreaded'}`);\n if (instance.config.debug && !simd) log('warning: wasm simd support is not enabled');\n }\n\n try {\n await tf.setBackend(instance.config.backend);\n await tf.ready();\n constants.init();\n } catch (err) {\n log('error: cannot set backend:', instance.config.backend, err);\n return false;\n }\n }\n\n // customize humangl\n if (tf.getBackend() === 'humangl') {\n tf.ENV.set('CHECK_COMPUTATION_FOR_ERRORS', false);\n tf.ENV.set('WEBGL_CPU_FORWARD', true);\n // tf.ENV.set('WEBGL_PACK_DEPTHWISECONV', false);\n tf.ENV.set('WEBGL_USE_SHAPES_UNIFORMS', true);\n tf.ENV.set('CPU_HANDOFF_SIZE_THRESHOLD', 256);\n // if (!instance.config.object.enabled) tf.ENV.set('WEBGL_FORCE_F16_TEXTURES', true); // safe to use 16bit precision\n if (typeof instance.config['deallocate'] !== 'undefined' && instance.config['deallocate']) { // hidden param\n log('changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:', true);\n tf.ENV.set('WEBGL_DELETE_TEXTURE_THRESHOLD', 0);\n }\n if (tf.backend().getGPGPUContext) {\n const gl = await tf.backend().getGPGPUContext().gl;\n if (instance.config.debug) log(`gl version:${gl.getParameter(gl.VERSION)} renderer:${gl.getParameter(gl.RENDERER)}`);\n }\n }\n\n // customize webgpu\n if (tf.getBackend() === 'webgpu') {\n // tf.ENV.set('WEBGPU_CPU_HANDOFF_SIZE_THRESHOLD', 512);\n // tf.ENV.set('WEBGPU_DEFERRED_SUBMIT_BATCH_SIZE', 0);\n // tf.ENV.set('WEBGPU_CPU_FORWARD', true);\n }\n\n // wait for ready\n tf.enableProdMode();\n await tf.ready();\n\n instance.performance.initBackend = Math.trunc(now() - timeStamp);\n instance.config.backend = tf.getBackend();\n\n await env.updateBackend(); // update env on backend init\n registerCustomOps();\n // await env.updateBackend(); // update env on backend init\n }\n return true;\n}\n\n// register fake missing tfjs ops\nexport function fakeOps(kernelNames: Array, config) {\n // if (config.debug) log('registerKernel:', kernelNames);\n for (const kernelName of kernelNames) {\n const kernelConfig = {\n kernelName,\n backendName: config.backend,\n kernelFunc: () => { if (config.debug) log('kernelFunc', kernelName, config.backend); },\n // setupFunc: () => { if (config.debug) log('kernelFunc', kernelName, config.backend); },\n // disposeFunc: () => { if (config.debug) log('kernelFunc', kernelName, config.backend); },\n };\n tf.registerKernel(kernelConfig);\n }\n env.kernels = tf.getKernelsForBackend(tf.getBackend()).map((kernel) => kernel.kernelName.toLowerCase()); // re-scan registered ops\n}\n", "/**\n * Module that implements helper draw functions, exposed as human.draw\n */\n\nimport { TRI468 as triangulation } from '../face/facemeshcoords';\nimport { mergeDeep, now, log } from './util';\nimport { env } from './env';\nimport type { Result, FaceResult, BodyResult, HandResult, ObjectResult, GestureResult, PersonResult, Point } from '../result';\nimport type { AnyCanvas } from '../exports';\n\n/** Draw Options\n * - Accessed via `human.draw.options` or provided per each draw method as the drawOptions optional parameter\n */\nexport type DrawOptions = {\n /** draw line color */\n color: string,\n /** label color */\n labelColor: string,\n /** label shadow color */\n shadowColor: string,\n /** label font */\n font: string,\n /** line spacing between labels */\n lineHeight: number,\n /** line width for drawn lines */\n lineWidth: number,\n /** size of drawn points */\n pointSize: number,\n /** draw rounded boxes by n pixels */\n roundRect: number,\n /** should points be drawn? */\n drawPoints: boolean,\n /** should labels be drawn? */\n drawLabels: boolean,\n /** should detected gestures be drawn? */\n drawGestures: boolean,\n /** should draw boxes around detection results? */\n drawBoxes: boolean,\n /** should draw polygons from detection points? */\n drawPolygons: boolean,\n /** should draw gaze arrows? */\n drawGaze: boolean,\n /** should fill polygons? */\n fillPolygons: boolean,\n /** use z-coordinate when available */\n useDepth: boolean,\n /** should lines be curved? */\n useCurves: boolean,\n}\n\n/** currently set draw options {@link DrawOptions} */\nexport const options: DrawOptions = {\n color: 'rgba(173, 216, 230, 0.6)', // 'lightblue' with light alpha channel\n labelColor: 'rgba(173, 216, 230, 1)', // 'lightblue' with dark alpha channel\n shadowColor: 'black',\n font: 'small-caps 16px \"Segoe UI\"',\n lineHeight: 18,\n lineWidth: 4,\n pointSize: 2,\n roundRect: 8,\n drawPoints: false,\n drawLabels: true,\n drawBoxes: true,\n drawGestures: true,\n drawPolygons: true,\n drawGaze: true,\n fillPolygons: false,\n useDepth: true,\n useCurves: false,\n};\n\nlet drawTime = 0;\n\nconst getCanvasContext = (input: AnyCanvas) => {\n if (!input) log('draw error: invalid canvas');\n else if (!input.getContext) log('draw error: canvas context not defined');\n else {\n const ctx = input.getContext('2d');\n if (!ctx) log('draw error: cannot get canvas context');\n else return ctx;\n }\n return null;\n};\n\nconst rad2deg = (theta: number) => Math.round((theta * 180) / Math.PI);\n\nfunction point(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, x: number, y: number, z: number | undefined, localOptions: DrawOptions) {\n z = z || 0;\n ctx.fillStyle = localOptions.useDepth && z ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.3)` : localOptions.color;\n ctx.beginPath();\n ctx.arc(x, y, localOptions.pointSize, 0, 2 * Math.PI);\n ctx.fill();\n}\n\nfunction rect(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, x: number, y: number, width: number, height: number, localOptions: DrawOptions) {\n ctx.beginPath();\n ctx.lineWidth = localOptions.lineWidth;\n if (localOptions.useCurves) {\n const cx = (x + x + width) / 2;\n const cy = (y + y + height) / 2;\n ctx.ellipse(cx, cy, width / 2, height / 2, 0, 0, 2 * Math.PI);\n } else {\n ctx.moveTo(x + localOptions.roundRect, y);\n ctx.lineTo(x + width - localOptions.roundRect, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + localOptions.roundRect);\n ctx.lineTo(x + width, y + height - localOptions.roundRect);\n ctx.quadraticCurveTo(x + width, y + height, x + width - localOptions.roundRect, y + height);\n ctx.lineTo(x + localOptions.roundRect, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - localOptions.roundRect);\n ctx.lineTo(x, y + localOptions.roundRect);\n ctx.quadraticCurveTo(x, y, x + localOptions.roundRect, y);\n ctx.closePath();\n }\n ctx.stroke();\n}\n\nfunction lines(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, points: Point[], localOptions: DrawOptions) {\n if (points.length < 2) return;\n ctx.beginPath();\n ctx.moveTo(points[0][0], points[0][1]);\n for (const pt of points) {\n const z = pt[2] || 0;\n ctx.strokeStyle = localOptions.useDepth && z !== 0 ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.3)` : localOptions.color;\n ctx.fillStyle = localOptions.useDepth && z !== 0 ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.3)` : localOptions.color;\n ctx.lineTo(pt[0], Math.round(pt[1]));\n }\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.closePath();\n ctx.fill();\n }\n}\n\nfunction curves(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, points: Point[], localOptions: DrawOptions) {\n if (points.length < 2) return;\n ctx.lineWidth = localOptions.lineWidth;\n if (!localOptions.useCurves || points.length <= 2) {\n lines(ctx, points, localOptions);\n return;\n }\n ctx.moveTo(points[0][0], points[0][1]);\n for (let i = 0; i < points.length - 2; i++) {\n const xc = (points[i][0] + points[i + 1][0]) / 2;\n const yc = (points[i][1] + points[i + 1][1]) / 2;\n ctx.quadraticCurveTo(points[i][0], points[i][1], xc, yc);\n }\n ctx.quadraticCurveTo(points[points.length - 2][0], points[points.length - 2][1], points[points.length - 1][0], points[points.length - 1][1]);\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.closePath();\n ctx.fill();\n }\n}\n\nfunction arrow(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, from: Point, to: Point, radius = 5) {\n let angle;\n let x;\n let y;\n ctx.beginPath();\n ctx.moveTo(from[0], from[1]);\n ctx.lineTo(to[0], to[1]);\n angle = Math.atan2(to[1] - from[1], to[0] - from[0]);\n x = radius * Math.cos(angle) + to[0];\n y = radius * Math.sin(angle) + to[1];\n ctx.moveTo(x, y);\n angle += (1.0 / 3.0) * (2 * Math.PI);\n x = radius * Math.cos(angle) + to[0];\n y = radius * Math.sin(angle) + to[1];\n ctx.lineTo(x, y);\n angle += (1.0 / 3.0) * (2 * Math.PI);\n x = radius * Math.cos(angle) + to[0];\n y = radius * Math.sin(angle) + to[1];\n ctx.lineTo(x, y);\n ctx.closePath();\n ctx.stroke();\n ctx.fill();\n}\n\n/** draw detected gestures */\nexport async function gesture(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (localOptions.drawGestures) {\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n ctx.font = localOptions.font;\n ctx.fillStyle = localOptions.color;\n let i = 1;\n for (let j = 0; j < result.length; j++) {\n let where: unknown[] = []; // what&where is a record\n let what: unknown[] = []; // what&where is a record\n [where, what] = Object.entries(result[j]);\n if ((what.length > 1) && ((what[1] as string).length > 0)) {\n const who = where[1] as number > 0 ? `#${where[1]}` : '';\n const label = `${where[0]} ${who}: ${what[1]}`;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(label, 8, 2 + (i * localOptions.lineHeight));\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(label, 6, 0 + (i * localOptions.lineHeight));\n i += 1;\n }\n }\n }\n}\n\n/** draw detected faces */\nexport async function face(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n for (const f of result) {\n ctx.font = localOptions.font;\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n if (localOptions.drawBoxes) rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], localOptions);\n if (localOptions.drawLabels) {\n // silly hack since fillText does not suport new line\n const labels:string[] = [];\n labels.push(`face: ${Math.trunc(100 * f.score)}%`);\n if (f.genderScore) labels.push(`${f.gender || ''} ${Math.trunc(100 * f.genderScore)}%`);\n if (f.age) labels.push(`age: ${f.age || ''}`);\n if (f.iris) labels.push(`distance: ${f.iris}`);\n if (f.real) labels.push(`real: ${Math.trunc(100 * f.real)}%`);\n if (f.live) labels.push(`live: ${Math.trunc(100 * f.live)}%`);\n if (f.emotion && f.emotion.length > 0) {\n const emotion = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);\n if (emotion.length > 3) emotion.length = 3;\n labels.push(emotion.join(' '));\n }\n if (f.rotation && f.rotation.angle && f.rotation.gaze) {\n if (f.rotation.angle.roll) labels.push(`roll: ${rad2deg(f.rotation.angle.roll)}\u00B0 yaw:${rad2deg(f.rotation.angle.yaw)}\u00B0 pitch:${rad2deg(f.rotation.angle.pitch)}\u00B0`);\n if (f.rotation.gaze.bearing) labels.push(`gaze: ${rad2deg(f.rotation.gaze.bearing)}\u00B0`);\n }\n if (labels.length === 0) labels.push('face');\n ctx.fillStyle = localOptions.color;\n for (let i = labels.length - 1; i >= 0; i--) {\n const x = Math.max(f.box[0], 0);\n const y = i * localOptions.lineHeight + f.box[1];\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(labels[i], x + 5, y + 16);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(labels[i], x + 4, y + 15);\n }\n }\n // ctx.lineWidth = localOptions.lineWidth;\n ctx.lineWidth = 2;\n if (f.mesh && f.mesh.length > 0) {\n if (localOptions.drawPoints) {\n for (const pt of f.mesh) point(ctx, pt[0], pt[1], pt[2], localOptions);\n }\n if (localOptions.drawPolygons) {\n if (f.mesh.length > 450) {\n for (let i = 0; i < triangulation.length / 3; i++) {\n const points = [\n triangulation[i * 3 + 0],\n triangulation[i * 3 + 1],\n triangulation[i * 3 + 2],\n ].map((index) => f.mesh[index]);\n lines(ctx, points, localOptions);\n }\n }\n // iris: array[center, left, top, right, bottom]\n if (f.annotations && f.annotations['leftEyeIris'] && f.annotations['leftEyeIris'][0]) {\n ctx.strokeStyle = localOptions.useDepth ? 'rgba(255, 200, 255, 0.3)' : localOptions.color;\n ctx.beginPath();\n const sizeX = Math.abs(f.annotations['leftEyeIris'][3][0] - f.annotations['leftEyeIris'][1][0]) / 2;\n const sizeY = Math.abs(f.annotations['leftEyeIris'][4][1] - f.annotations['leftEyeIris'][2][1]) / 2;\n ctx.ellipse(f.annotations['leftEyeIris'][0][0], f.annotations['leftEyeIris'][0][1], sizeX, sizeY, 0, 0, 2 * Math.PI);\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.fillStyle = localOptions.useDepth ? 'rgba(255, 255, 200, 0.3)' : localOptions.color;\n ctx.fill();\n }\n }\n if (f.annotations && f.annotations['rightEyeIris'] && f.annotations['rightEyeIris'][0]) {\n ctx.strokeStyle = localOptions.useDepth ? 'rgba(255, 200, 255, 0.3)' : localOptions.color;\n ctx.beginPath();\n const sizeX = Math.abs(f.annotations['rightEyeIris'][3][0] - f.annotations['rightEyeIris'][1][0]) / 2;\n const sizeY = Math.abs(f.annotations['rightEyeIris'][4][1] - f.annotations['rightEyeIris'][2][1]) / 2;\n ctx.ellipse(f.annotations['rightEyeIris'][0][0], f.annotations['rightEyeIris'][0][1], sizeX, sizeY, 0, 0, 2 * Math.PI);\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.fillStyle = localOptions.useDepth ? 'rgba(255, 255, 200, 0.3)' : localOptions.color;\n ctx.fill();\n }\n }\n if (localOptions.drawGaze && f.rotation?.angle && typeof Path2D !== 'undefined') {\n ctx.strokeStyle = 'pink';\n const valX = (f.box[0] + f.box[2] / 2) - (f.box[3] * rad2deg(f.rotation.angle.yaw) / 90);\n const valY = (f.box[1] + f.box[3] / 2) + (f.box[2] * rad2deg(f.rotation.angle.pitch) / 90);\n const pathV = new Path2D(`\n M ${f.box[0] + f.box[2] / 2} ${f.box[1]}\n C\n ${valX} ${f.box[1]},\n ${valX} ${f.box[1] + f.box[3]},\n ${f.box[0] + f.box[2] / 2} ${f.box[1] + f.box[3]}\n `);\n const pathH = new Path2D(`\n M ${f.box[0]} ${f.box[1] + f.box[3] / 2}\n C \n ${f.box[0]} ${valY},\n ${f.box[0] + f.box[2]} ${valY},\n ${f.box[0] + f.box[2]} ${f.box[1] + f.box[3] / 2}\n `);\n ctx.stroke(pathH);\n ctx.stroke(pathV);\n }\n if (localOptions.drawGaze && f.rotation?.gaze?.strength && f.rotation?.gaze?.bearing && f.annotations['leftEyeIris'] && f.annotations['rightEyeIris'] && f.annotations['leftEyeIris'][0] && f.annotations['rightEyeIris'][0]) {\n ctx.strokeStyle = 'pink';\n ctx.fillStyle = 'pink';\n const leftGaze = [\n f.annotations['leftEyeIris'][0][0] + (Math.sin(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[3]),\n f.annotations['leftEyeIris'][0][1] + (Math.cos(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[2]),\n ];\n arrow(ctx, [f.annotations['leftEyeIris'][0][0], f.annotations['leftEyeIris'][0][1]], [leftGaze[0], leftGaze[1]], 4);\n const rightGaze = [\n f.annotations['rightEyeIris'][0][0] + (Math.sin(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[3]),\n f.annotations['rightEyeIris'][0][1] + (Math.cos(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[2]),\n ];\n arrow(ctx, [f.annotations['rightEyeIris'][0][0], f.annotations['rightEyeIris'][0][1]], [rightGaze[0], rightGaze[1]], 4);\n }\n }\n }\n }\n}\n\n/** draw detected bodies */\nexport async function body(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n ctx.lineJoin = 'round';\n for (let i = 0; i < result.length; i++) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n ctx.lineWidth = localOptions.lineWidth;\n ctx.font = localOptions.font;\n if (localOptions.drawBoxes && result[i].box && result[i].box?.length === 4) {\n rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions);\n if (localOptions.drawLabels) {\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 3, 1 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n }\n if (localOptions.drawPoints && result[i].keypoints) {\n for (let pt = 0; pt < result[i].keypoints.length; pt++) {\n if (!result[i].keypoints[pt].score || (result[i].keypoints[pt].score === 0)) continue;\n ctx.fillStyle = localOptions.useDepth && result[i].keypoints[pt].position[2] ? `rgba(${127.5 + (2 * (result[i].keypoints[pt].position[2] || 0))}, ${127.5 - (2 * (result[i].keypoints[pt].position[2] || 0))}, 255, 0.5)` : localOptions.color;\n point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions);\n }\n }\n if (localOptions.drawLabels && result[i].keypoints) {\n ctx.font = localOptions.font;\n for (const pt of result[i].keypoints) {\n if (!pt.score || (pt.score === 0)) continue;\n ctx.fillStyle = localOptions.useDepth && pt.position[2] ? `rgba(${127.5 + (2 * pt.position[2])}, ${127.5 - (2 * pt.position[2])}, 255, 0.5)` : localOptions.color;\n ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position[0] + 4, pt.position[1] + 4);\n }\n }\n if (localOptions.drawPolygons && result[i].keypoints && result[i].annotations) {\n for (const part of Object.values(result[i].annotations)) {\n for (const connected of part) curves(ctx, connected, localOptions);\n }\n }\n }\n}\n\n/** draw detected hands */\nexport async function hand(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n ctx.lineJoin = 'round';\n ctx.font = localOptions.font;\n for (const h of result) {\n if (localOptions.drawBoxes) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions);\n if (localOptions.drawLabels) {\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(`hand:${Math.trunc(100 * h.score)}%`, h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]); // can use h.label\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(`hand:${Math.trunc(100 * h.score)}%`, h.box[0] + 2, 0 + h.box[1] + localOptions.lineHeight, h.box[2]); // can use h.label\n }\n ctx.stroke();\n }\n if (localOptions.drawPoints) {\n if (h.keypoints && h.keypoints.length > 0) {\n for (const pt of h.keypoints) {\n ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * (pt[2] || 0))}, ${127.5 - (2 * (pt[2] || 0))}, 255, 0.5)` : localOptions.color;\n point(ctx, pt[0], pt[1], 0, localOptions);\n }\n }\n }\n if (localOptions.drawLabels && h.annotations) {\n const addHandLabel = (part: Array, title: string) => {\n if (!part || part.length === 0 || !part[0]) return;\n const z = part[part.length - 1][2] || 0;\n ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.5)` : localOptions.color;\n ctx.fillText(title, part[part.length - 1][0] + 4, part[part.length - 1][1] + 4);\n };\n ctx.font = localOptions.font;\n addHandLabel(h.annotations['index'], 'index');\n addHandLabel(h.annotations['middle'], 'middle');\n addHandLabel(h.annotations['ring'], 'ring');\n addHandLabel(h.annotations['pinky'], 'pinky');\n addHandLabel(h.annotations['thumb'], 'thumb');\n addHandLabel(h.annotations['palm'], 'palm');\n }\n if (localOptions.drawPolygons && h.annotations) {\n const addHandLine = (part: Array) => {\n if (!part || part.length === 0 || !part[0]) return;\n for (let i = 0; i < part.length; i++) {\n ctx.beginPath();\n const z = part[i][2] || 0;\n ctx.strokeStyle = localOptions.useDepth ? `rgba(${127.5 + (i * z)}, ${127.5 - (i * z)}, 255, 0.5)` : localOptions.color;\n ctx.moveTo(part[i > 0 ? i - 1 : 0][0], part[i > 0 ? i - 1 : 0][1]);\n ctx.lineTo(part[i][0], part[i][1]);\n ctx.stroke();\n }\n };\n ctx.lineWidth = localOptions.lineWidth;\n addHandLine(h.annotations['index']);\n addHandLine(h.annotations['middle']);\n addHandLine(h.annotations['ring']);\n addHandLine(h.annotations['pinky']);\n addHandLine(h.annotations['thumb']);\n // addPart(h.annotations.palm);\n }\n }\n}\n\n/** draw detected objects */\nexport async function object(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n ctx.lineJoin = 'round';\n ctx.font = localOptions.font;\n for (const h of result) {\n if (localOptions.drawBoxes) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions);\n if (localOptions.drawLabels) {\n const label = `${h.label} ${Math.round(100 * h.score)}%`;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(label, h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(label, h.box[0] + 2, 0 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.stroke();\n }\n }\n}\n\n/** draw combined person results instead of individual detection result objects */\nexport async function person(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n ctx.lineJoin = 'round';\n ctx.font = localOptions.font;\n\n for (let i = 0; i < result.length; i++) {\n if (localOptions.drawBoxes) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions);\n if (localOptions.drawLabels) {\n const label = `person #${i}`;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(label, result[i].box[0] + 3, 1 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(label, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n ctx.stroke();\n }\n }\n}\n\n/** draw processed canvas */\nexport async function canvas(input: AnyCanvas | HTMLImageElement | HTMLVideoElement, output: AnyCanvas) {\n if (!input || !output) return;\n const ctx = getCanvasContext(output);\n if (!ctx) return;\n ctx.drawImage(input, 0, 0);\n}\n\n/** meta-function that performs draw for: canvas, face, body, hand */\nexport async function all(inCanvas: AnyCanvas, result: Result, drawOptions?: Partial) {\n if (!result || !result.performance || !result || !inCanvas) return null;\n const timeStamp = now();\n const localOptions = mergeDeep(options, drawOptions);\n const promise = Promise.all([\n face(inCanvas, result.face, localOptions),\n body(inCanvas, result.body, localOptions),\n hand(inCanvas, result.hand, localOptions),\n object(inCanvas, result.object, localOptions),\n gesture(inCanvas, result.gesture, localOptions), // gestures do not have buffering\n // person(inCanvas, result.persons, localOptions); // already included above\n ]);\n drawTime = env.perfadd ? drawTime + Math.round(now() - timeStamp) : Math.round(now() - timeStamp);\n result.performance.draw = drawTime;\n return promise;\n}\n", "import type { Tensor } from '../tfjs/types';\nimport type { FaceResult } from '../result';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { meshAnnotations } from './facemeshcoords';\n\nconst expandFact = 0.1;\nconst alpha = 0.5;\n\n// point inclusion in polygon based on https://wrf.ecse.rpi.edu/Research/Short_Notes/pnpoly.html\nfunction insidePoly(x: number, y: number, polygon: Array<{ x: number, y: number }>): boolean {\n let inside = false;\n let j = polygon.length - 1;\n for (let i = 0; i < polygon.length; j = i++) {\n if (((polygon[i].y > y) !== (polygon[j].y > y)) && (x < (polygon[j].x - polygon[i].x) * (y - polygon[i].y) / (polygon[j].y - polygon[i].y) + polygon[i].x)) inside = !inside;\n }\n return inside;\n}\n\nexport async function mask(face: FaceResult): Promise {\n if (!face.tensor) return face.tensor;\n if (!face.mesh || face.mesh.length < 100) return face.tensor;\n const width = face.tensor.shape[2] || 0;\n const height = face.tensor.shape[1] || 0;\n const buffer = await face.tensor.buffer();\n let silhouette: Array<{ x: number, y: number }> = [];\n for (const pt of meshAnnotations.silhouette) silhouette.push({ x: (face.mesh[pt][0] - face.box[0]) / face.box[2], y: (face.mesh[pt][1] - face.box[1]) / face.box[3] }); // add all silhouette points scaled to local box\n if (expandFact && expandFact > 0) silhouette = silhouette.map((pt) => ({ x: pt.x > 0.5 ? pt.x + expandFact : pt.x - expandFact, y: pt.y > 0.5 ? pt.y + expandFact : pt.y - expandFact })); // expand silhouette\n for (let x = 0; x < width; x++) {\n for (let y = 0; y < height; y++) {\n const inside = insidePoly(x / width, y / width, silhouette);\n if (!inside) {\n buffer.set(alpha * buffer.get(0, y, x, 0), 0, y, x, 0);\n buffer.set(alpha * buffer.get(0, y, x, 1), 0, y, x, 1);\n buffer.set(alpha * buffer.get(0, y, x, 2), 0, y, x, 2);\n }\n }\n }\n const output = buffer.toTensor();\n tf.dispose(buffer);\n return output;\n}\n", "import type { Point, FaceResult } from '../result';\n\ntype Vector = [number, number, number];\n\nconst calculateGaze = (face: FaceResult): { bearing: number, strength: number } => {\n const radians = (pt1: Point, pt2: Point) => Math.atan2(pt1[1] - pt2[1], pt1[0] - pt2[0]); // function to calculate angle between any two points\n if (!face.annotations['rightEyeIris'] || !face.annotations['leftEyeIris']) return { bearing: 0, strength: 0 };\n\n const offsetIris = [0, -0.1]; // iris center may not align with average of eye extremes\n const eyeRatio = 1; // factor to normalize changes x vs y\n\n const left = (face.mesh[33][2] || 0) > (face.mesh[263][2] || 0); // pick left or right eye depending which one is closer bazed on outsize point z axis\n const irisCenter = left ? face.mesh[473] : face.mesh[468];\n const eyeCenter = left // eye center is average of extreme points on x axis for both x and y, ignoring y extreme points as eyelids naturally open/close more when gazing up/down so relative point is less precise\n ? [(face.mesh[133][0] + face.mesh[33][0]) / 2, (face.mesh[133][1] + face.mesh[33][1]) / 2]\n : [(face.mesh[263][0] + face.mesh[362][0]) / 2, (face.mesh[263][1] + face.mesh[362][1]) / 2];\n const eyeSize = left // eye size is difference between extreme points for both x and y, used to normalize & squarify eye dimensions\n ? [face.mesh[133][0] - face.mesh[33][0], face.mesh[23][1] - face.mesh[27][1]]\n : [face.mesh[263][0] - face.mesh[362][0], face.mesh[253][1] - face.mesh[257][1]];\n const eyeDiff: Point = [ // x distance between extreme point and center point normalized with eye size\n (eyeCenter[0] - irisCenter[0]) / eyeSize[0] - offsetIris[0],\n eyeRatio * (irisCenter[1] - eyeCenter[1]) / eyeSize[1] - offsetIris[1],\n ];\n let strength = Math.sqrt((eyeDiff[0] * eyeDiff[0]) + (eyeDiff[1] * eyeDiff[1])); // vector length is a diagonal between two differences\n strength = Math.min(strength, face.boxRaw[2] / 2, face.boxRaw[3] / 2); // limit strength to half of box size to avoid clipping due to low precision\n const bearing = (radians([0, 0], eyeDiff) + (Math.PI / 2)) % Math.PI; // using eyeDiff instead eyeCenter/irisCenter combo due to manual adjustments and rotate clockwise 90degrees\n return { bearing, strength };\n};\n\nexport const calculateFaceAngle = (face: FaceResult, imageSize: [number, number]): {\n angle: { pitch: number, yaw: number, roll: number },\n matrix: [number, number, number, number, number, number, number, number, number],\n gaze: { bearing: number, strength: number },\n} => {\n // const degrees = (theta) => Math.abs(((theta * 180) / Math.PI) % 360);\n const normalize = (v: Vector): Vector => { // normalize vector\n const length = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);\n v[0] /= length;\n v[1] /= length;\n v[2] /= length;\n return v;\n };\n const subVectors = (a: Vector, b: Vector): Vector => { // vector subtraction (a - b)\n const x = a[0] - b[0];\n const y = a[1] - b[1];\n const z = a[2] - b[2];\n return [x, y, z];\n };\n const crossVectors = (a: Vector, b: Vector): Vector => { // vector cross product (a x b)\n const x = a[1] * b[2] - a[2] * b[1];\n const y = a[2] * b[0] - a[0] * b[2];\n const z = a[0] * b[1] - a[1] * b[0];\n return [x, y, z];\n };\n // 3x3 rotation matrix to Euler angles based on https://www.geometrictools.com/Documentation/EulerAngles.pdf\n const rotationMatrixToEulerAngle = (r: number[]): { pitch: number, yaw: number, roll: number } => {\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const [r00, _r01, _r02, r10, r11, r12, r20, r21, r22] = r;\n let thetaX: number;\n let thetaY: number;\n let thetaZ: number;\n if (r10 < 1) { // YZX calculation\n if (r10 > -1) {\n thetaZ = Math.asin(r10);\n thetaY = Math.atan2(-r20, r00);\n thetaX = Math.atan2(-r12, r11);\n } else {\n thetaZ = -Math.PI / 2;\n thetaY = -Math.atan2(r21, r22);\n thetaX = 0;\n }\n } else {\n thetaZ = Math.PI / 2;\n thetaY = Math.atan2(r21, r22);\n thetaX = 0;\n }\n if (isNaN(thetaX)) thetaX = 0;\n if (isNaN(thetaY)) thetaY = 0;\n if (isNaN(thetaZ)) thetaZ = 0;\n return { pitch: 2 * -thetaX, yaw: 2 * -thetaY, roll: 2 * -thetaZ };\n };\n\n /*\n const meshToEulerAngle = (mesh) => { // simple Euler angle calculation based existing 3D mesh\n const radians = (a1, a2, b1, b2) => Math.atan2(b2 - a2, b1 - a1);\n return { // values are in radians in range of -pi/2 to pi/2 which is -90 to +90 degrees, value of 0 means center\n pitch: radians(mesh[10][1], mesh[10][2], mesh[152][1], mesh[152][2]), // looking at y,z of top and bottom points of the face // pitch is face move up/down\n yaw: radians(mesh[33][0], mesh[33][2], mesh[263][0], mesh[263][2]), // looking at x,z of outside corners of leftEye and rightEye // yaw is face turn left/right\n roll: radians(mesh[33][0], mesh[33][1], mesh[263][0], mesh[263][1]), // looking at x,y of outside corners of leftEye and rightEye // roll is face lean left/right\n };\n };\n */\n\n // initialize gaze and mesh\n const mesh = face.meshRaw;\n if (!mesh || mesh.length < 300) return { angle: { pitch: 0, yaw: 0, roll: 0 }, matrix: [1, 0, 0, 0, 1, 0, 0, 0, 1], gaze: { bearing: 0, strength: 0 } };\n\n const size = Math.max(face.boxRaw[2] * imageSize[0], face.boxRaw[3] * imageSize[1]) / 1.5;\n // top, bottom, left, right\n const pts: Point[] = [mesh[10], mesh[152], mesh[234], mesh[454]].map((pt) => [pt[0] * imageSize[0] / size, pt[1] * imageSize[1] / size, pt[2]] as Point); // make the xyz coordinates proportional, independent of the image/box size\n\n const y_axis = normalize(subVectors(pts[1] as Vector, pts[0] as Vector));\n let x_axis = normalize(subVectors(pts[3] as Vector, pts[2] as Vector));\n const z_axis = normalize(crossVectors(x_axis, y_axis));\n // adjust x_axis to make sure that all axes are perpendicular to each other\n x_axis = crossVectors(y_axis, z_axis);\n\n // Rotation Matrix from Axis Vectors - http://renderdan.blogspot.com/2006/05/rotation-matrix-from-axis-vectors.html\n // 3x3 rotation matrix is flatten to array in row-major order. Note that the rotation represented by this matrix is inverted.\n const matrix: [number, number, number, number, number, number, number, number, number] = [\n x_axis[0], x_axis[1], x_axis[2],\n y_axis[0], y_axis[1], y_axis[2],\n z_axis[0], z_axis[1], z_axis[2],\n ];\n const angle = rotationMatrixToEulerAngle(matrix);\n // const angle = meshToEulerAngle(mesh);\n\n // we have iris keypoints so we can calculate gaze direction\n const gaze = mesh.length === 478 ? calculateGaze(face) : { bearing: 0, strength: 0 };\n\n return { angle, matrix, gaze };\n};\n", "/**\n * Face algorithm implementation\n * Uses FaceMesh, Emotion and FaceRes models to create a unified pipeline\n */\n\nimport { log, now } from '../util/util';\nimport { env } from '../util/env';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as facemesh from './facemesh';\nimport * as emotion from '../gear/emotion';\nimport * as faceres from './faceres';\nimport * as mask from './mask';\nimport * as antispoof from './antispoof';\nimport * as liveness from './liveness';\nimport * as gear from '../gear/gear';\nimport * as ssrnetAge from '../gear/ssrnet-age';\nimport * as ssrnetGender from '../gear/ssrnet-gender';\nimport * as mobilefacenet from './mobilefacenet';\nimport type { FaceResult, Emotion, Gender, Race } from '../result';\nimport type { Tensor } from '../tfjs/types';\nimport type { Human } from '../human';\nimport { calculateFaceAngle } from './angles';\n\ntype DescRes = { age: number, gender: Gender, genderScore: number, descriptor: number[], race?: { score: number, race: Race }[] };\n\nexport const detectFace = async (instance: Human /* instance of human */, input: Tensor): Promise => {\n // run facemesh, includes blazeface and iris\n // eslint-disable-next-line no-async-promise-executor\n let timeStamp: number = now();\n let ageRes: { age: number } | Promise<{ age: number }> | null;\n let gearRes: gear.GearType | Promise | null;\n let genderRes: { gender: string, genderScore: number } | Promise<{ gender: string, genderScore: number }> | null;\n let emotionRes: { score: number, emotion: Emotion }[] | Promise<{ score: number, emotion: Emotion }[]>;\n let mobilefacenetRes: number[] | Promise | null;\n let antispoofRes: number | Promise | null;\n let livenessRes: number | Promise | null;\n let descRes: DescRes | Promise | null;\n\n const faceRes: Array = [];\n instance.state = 'run:face';\n\n const faces = await facemesh.predict(input, instance.config);\n instance.performance.face = env.perfadd ? (instance.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n if (!input.shape || input.shape.length !== 4) return [];\n if (!faces) return [];\n // for (const face of faces) {\n for (let i = 0; i < faces.length; i++) {\n instance.analyze('Get Face');\n\n // is something went wrong, skip the face\n // @ts-ignore possibly undefied\n if (!faces[i].tensor || faces[i].tensor['isDisposedInternal']) {\n log('Face object is disposed:', faces[i].tensor);\n continue;\n }\n\n // optional face mask\n if (instance.config.face.detector?.mask) {\n const masked = await mask.mask(faces[i]);\n tf.dispose(faces[i].tensor);\n faces[i].tensor = masked as Tensor;\n }\n\n // calculate face angles\n const rotation = faces[i].mesh && (faces[i].mesh.length > 200) ? calculateFaceAngle(faces[i], [input.shape[2], input.shape[1]]) : null;\n\n // run emotion, inherits face from blazeface\n instance.analyze('Start Emotion:');\n if (instance.config.async) {\n emotionRes = instance.config.face.emotion?.enabled ? emotion.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : [];\n } else {\n instance.state = 'run:emotion';\n timeStamp = now();\n emotionRes = instance.config.face.emotion?.enabled ? await emotion.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : [];\n instance.performance.emotion = env.perfadd ? (instance.performance.emotion || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n instance.analyze('End Emotion:');\n\n // run antispoof, inherits face from blazeface\n instance.analyze('Start AntiSpoof:');\n if (instance.config.async) {\n antispoofRes = instance.config.face.antispoof?.enabled ? antispoof.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : 0;\n } else {\n instance.state = 'run:antispoof';\n timeStamp = now();\n antispoofRes = instance.config.face.antispoof?.enabled ? await antispoof.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : 0;\n instance.performance.antispoof = env.perfadd ? (instance.performance.antispoof || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n instance.analyze('End AntiSpoof:');\n\n // run liveness, inherits face from blazeface\n instance.analyze('Start Liveness:');\n if (instance.config.async) {\n livenessRes = instance.config.face.liveness?.enabled ? liveness.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : 0;\n } else {\n instance.state = 'run:liveness';\n timeStamp = now();\n livenessRes = instance.config.face.liveness?.enabled ? await liveness.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : 0;\n instance.performance.liveness = env.perfadd ? (instance.performance.antispoof || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n instance.analyze('End Liveness:');\n\n // run gear, inherits face from blazeface\n instance.analyze('Start GEAR:');\n if (instance.config.async) {\n gearRes = instance.config.face['gear']?.enabled ? gear.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n } else {\n instance.state = 'run:gear';\n timeStamp = now();\n gearRes = instance.config.face['gear']?.enabled ? await gear.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n instance.performance.gear = Math.trunc(now() - timeStamp);\n }\n instance.analyze('End GEAR:');\n\n // run gear, inherits face from blazeface\n instance.analyze('Start SSRNet:');\n if (instance.config.async) {\n ageRes = instance.config.face['ssrnet']?.enabled ? ssrnetAge.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n genderRes = instance.config.face['ssrnet']?.enabled ? ssrnetGender.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n } else {\n instance.state = 'run:ssrnet';\n timeStamp = now();\n ageRes = instance.config.face['ssrnet']?.enabled ? await ssrnetAge.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n genderRes = instance.config.face['ssrnet']?.enabled ? await ssrnetGender.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n instance.performance.ssrnet = Math.trunc(now() - timeStamp);\n }\n instance.analyze('End SSRNet:');\n\n // run gear, inherits face from blazeface\n instance.analyze('Start MobileFaceNet:');\n if (instance.config.async) {\n mobilefacenetRes = instance.config.face['mobilefacenet']?.enabled ? mobilefacenet.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n } else {\n instance.state = 'run:mobilefacenet';\n timeStamp = now();\n mobilefacenetRes = instance.config.face['mobilefacenet']?.enabled ? await mobilefacenet.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n instance.performance.mobilefacenet = Math.trunc(now() - timeStamp);\n }\n instance.analyze('End MobileFaceNet:');\n\n // run emotion, inherits face from blazeface\n instance.analyze('Start Description:');\n if (instance.config.async) {\n descRes = instance.config.face.description?.enabled ? faceres.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n } else {\n instance.state = 'run:description';\n timeStamp = now();\n descRes = instance.config.face.description?.enabled ? await faceres.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n instance.performance.description = env.perfadd ? (instance.performance.description || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n instance.analyze('End Description:');\n\n // if async wait for results\n if (instance.config.async) {\n [ageRes, genderRes, emotionRes, mobilefacenetRes, descRes, gearRes, antispoofRes, livenessRes] = await Promise.all([ageRes, genderRes, emotionRes, mobilefacenetRes, descRes, gearRes, antispoofRes, livenessRes]);\n }\n instance.analyze('Finish Face:');\n\n if (instance.config.face['ssrnet']?.enabled && ageRes && genderRes) { // override age/gender if ssrnet model is used\n descRes = {\n ...(descRes as DescRes),\n age: (ageRes as { age: number}).age,\n gender: (genderRes as { gender: Gender, genderScore: number }).gender,\n genderScore: (genderRes as { gender: Gender, genderScore: number }).genderScore,\n };\n }\n if (instance.config.face['gear']?.enabled && gearRes) { // override age/gender/race if gear model is used\n descRes = {\n ...(descRes as DescRes),\n age: (gearRes as gear.GearType).age,\n gender: (gearRes as gear.GearType).gender,\n genderScore: (gearRes as gear.GearType).genderScore,\n race: (gearRes as gear.GearType).race,\n };\n }\n if (instance.config.face['mobilefacenet']?.enabled && mobilefacenetRes) { // override descriptor if embedding model is used\n (descRes as DescRes).descriptor = mobilefacenetRes as number[];\n }\n\n // calculate iris distance\n // iris: array[ center, left, top, right, bottom]\n if (!instance.config.face.iris?.enabled) {\n // if (faces[i]?.annotations?.leftEyeIris) delete faces[i].annotations.leftEyeIris;\n // if (faces[i]?.annotations?.rightEyeIris) delete faces[i].annotations.rightEyeIris;\n }\n const irisSize = (faces[i].annotations && faces[i].annotations.leftEyeIris && faces[i].annotations.leftEyeIris[0] && faces[i].annotations.rightEyeIris && faces[i].annotations.rightEyeIris[0]\n && (faces[i].annotations.leftEyeIris.length > 0) && (faces[i].annotations.rightEyeIris.length > 0)\n && (faces[i].annotations.leftEyeIris[0] !== null) && (faces[i].annotations.rightEyeIris[0] !== null))\n ? Math.max(Math.abs(faces[i].annotations.leftEyeIris[3][0] - faces[i].annotations.leftEyeIris[1][0]), Math.abs(faces[i].annotations.rightEyeIris[4][1] - faces[i].annotations.rightEyeIris[2][1])) / input.shape[2]\n : 0; // note: average human iris size is 11.7mm\n\n // optionally return tensor\n const tensor = instance.config.face.detector?.return ? tf.squeeze(faces[i].tensor) : null;\n // dispose original face tensor\n tf.dispose(faces[i].tensor);\n // delete temp face image\n if (faces[i].tensor) delete faces[i].tensor;\n // combine results\n const res: FaceResult = {\n ...faces[i],\n id: i,\n };\n if ((descRes as DescRes)?.age) res.age = (descRes as DescRes).age as number;\n if ((descRes as DescRes)?.gender) res.gender = (descRes as DescRes).gender as Gender;\n if ((descRes as DescRes)?.genderScore) res.genderScore = (descRes as DescRes)?.genderScore as number;\n if ((descRes as DescRes)?.descriptor) res.embedding = (descRes as DescRes)?.descriptor as Array;\n if ((descRes as DescRes)?.race) res.race = (descRes as DescRes)?.race as { score: number, race: Race }[];\n if (emotionRes) res.emotion = emotionRes as Array<{ score: number, emotion: Emotion }>;\n if (antispoofRes) res.real = antispoofRes as number;\n if (livenessRes) res.live = livenessRes as number;\n if (irisSize && irisSize !== 0) res.iris = Math.trunc(500 / irisSize / 11.7) / 100;\n if (rotation) res.rotation = rotation;\n if (tensor) res.tensor = tensor;\n faceRes.push(res);\n instance.analyze('End Face');\n }\n instance.analyze('End FaceMesh:');\n if (instance.config.async) {\n if (instance.performance.face) delete instance.performance.face;\n if (instance.performance.age) delete instance.performance.age;\n if (instance.performance.gender) delete instance.performance.gender;\n if (instance.performance.emotion) delete instance.performance.emotion;\n }\n return faceRes;\n};\n", "/**\n * Gesture detection algorithm\n */\n\nimport type { GestureResult, BodyResult, FaceResult, HandResult, Point } from '../result';\nimport * as fingerPose from '../hand/fingerpose';\n\n/** face gesture type */\nexport type FaceGesture =\n `facing ${'left' | 'center' | 'right'}`\n | `blink ${'left' | 'right'} eye`\n | `mouth ${number}% open`\n | `head ${'up' | 'down'}`;\n\n/** iris gesture type */\nexport type IrisGesture =\n 'facing center'\n | `looking ${'left' | 'right' | 'up' | 'down'}`\n | 'looking center';\n\n/** body gesture type */\nexport type BodyGesture =\n `leaning ${'left' | 'right'}`\n | `raise ${'left' | 'right'} hand`\n | 'i give up';\n\n/** hand gesture type */\nexport type HandGesture =\n `${'thumb' | 'index' | 'middle' | 'ring' | 'pinky'} forward`\n | `${'thumb' | 'index' | 'middle' | 'ring' | 'pinky'} up`\n | 'victory'\n | 'thumbs up';\n\nexport const body = (res: BodyResult[]): GestureResult[] => {\n if (!res) return [];\n const gestures: Array<{ body: number, gesture: BodyGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n // raising hands\n const leftWrist = res[i].keypoints.find((a) => (a.part === 'leftWrist'));\n const rightWrist = res[i].keypoints.find((a) => (a.part === 'rightWrist'));\n const nose = res[i].keypoints.find((a) => (a.part === 'nose'));\n if (nose && leftWrist && rightWrist && (leftWrist.position[1] < nose.position[1]) && (rightWrist.position[1] < nose.position[1])) gestures.push({ body: i, gesture: 'i give up' });\n else if (nose && leftWrist && (leftWrist.position[1] < nose.position[1])) gestures.push({ body: i, gesture: 'raise left hand' });\n else if (nose && rightWrist && (rightWrist.position[1] < nose.position[1])) gestures.push({ body: i, gesture: 'raise right hand' });\n\n // leaning\n const leftShoulder = res[i].keypoints.find((a) => (a.part === 'leftShoulder'));\n const rightShoulder = res[i].keypoints.find((a) => (a.part === 'rightShoulder'));\n if (leftShoulder && rightShoulder && Math.abs(leftShoulder.positionRaw[1] - rightShoulder.positionRaw[1]) > 0.1) {\n gestures.push({ body: i, gesture: `leaning ${(leftShoulder.position[1] > rightShoulder.position[1]) ? 'left' : 'right'}` });\n }\n }\n return gestures;\n};\n\nexport const face = (res: FaceResult[]): GestureResult[] => {\n if (!res) return [];\n const gestures: Array<{ face: number, gesture: FaceGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n if (res[i].mesh && res[i].mesh.length > 450) {\n const zDiff = (res[i].mesh[33][2] || 0) - (res[i].mesh[263][2] || 0);\n const xDiff = res[i].mesh[33][0] - res[i].mesh[263][0];\n if (Math.abs(zDiff / xDiff) <= 0.15) gestures.push({ face: i, gesture: 'facing center' });\n else gestures.push({ face: i, gesture: `facing ${zDiff < 0 ? 'left' : 'right'}` });\n const openLeft = Math.abs(res[i].mesh[374][1] - res[i].mesh[386][1]) / Math.abs(res[i].mesh[443][1] - res[i].mesh[450][1]); // center of eye inner lid y coord div center of wider eye border y coord\n if (openLeft < 0.2) gestures.push({ face: i, gesture: 'blink left eye' });\n const openRight = Math.abs(res[i].mesh[145][1] - res[i].mesh[159][1]) / Math.abs(res[i].mesh[223][1] - res[i].mesh[230][1]); // center of eye inner lid y coord div center of wider eye border y coord\n if (openRight < 0.2) gestures.push({ face: i, gesture: 'blink right eye' });\n const mouthOpen = Math.min(100, 500 * Math.abs(res[i].mesh[13][1] - res[i].mesh[14][1]) / Math.abs(res[i].mesh[10][1] - res[i].mesh[152][1]));\n if (mouthOpen > 10) gestures.push({ face: i, gesture: `mouth ${Math.trunc(mouthOpen)}% open` });\n const chinDepth = res[i].mesh[152][2] || 0;\n if (Math.abs(chinDepth) > 10) gestures.push({ face: i, gesture: `head ${chinDepth < 0 ? 'up' : 'down'}` });\n }\n }\n return gestures;\n};\n\nexport const iris = (res: FaceResult[]): GestureResult[] => {\n if (!res) return [];\n const gestures: Array<{ iris: number, gesture: IrisGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n if (!res[i].annotations || !res[i].annotations.leftEyeIris || !res[i].annotations.leftEyeIris[0] || !res[i].annotations.rightEyeIris || !res[i].annotations.rightEyeIris[0]) continue;\n const sizeXLeft = res[i].annotations.leftEyeIris[3][0] - res[i].annotations.leftEyeIris[1][0];\n const sizeYLeft = res[i].annotations.leftEyeIris[4][1] - res[i].annotations.leftEyeIris[2][1];\n const areaLeft = Math.abs(sizeXLeft * sizeYLeft);\n\n const sizeXRight = res[i].annotations.rightEyeIris[3][0] - res[i].annotations.rightEyeIris[1][0];\n const sizeYRight = res[i].annotations.rightEyeIris[4][1] - res[i].annotations.rightEyeIris[2][1];\n const areaRight = Math.abs(sizeXRight * sizeYRight);\n\n let center = false;\n const difference = Math.abs(areaLeft - areaRight) / Math.max(areaLeft, areaRight);\n if (difference < 0.25) {\n center = true;\n gestures.push({ iris: i, gesture: 'facing center' });\n }\n\n const leftIrisCenterX = Math.abs(res[i].mesh[263][0] - res[i].annotations.leftEyeIris[0][0]) / res[i].box[2];\n const rightIrisCenterX = Math.abs(res[i].mesh[33][0] - res[i].annotations.rightEyeIris[0][0]) / res[i].box[2];\n if (leftIrisCenterX > 0.06 || rightIrisCenterX > 0.06) center = false;\n if (leftIrisCenterX > rightIrisCenterX) { // check eye with bigger offset\n if (leftIrisCenterX > 0.05) gestures.push({ iris: i, gesture: 'looking right' });\n } else {\n if (rightIrisCenterX > 0.05) gestures.push({ iris: i, gesture: 'looking left' });\n }\n\n const rightIrisCenterY = Math.abs(res[i].mesh[145][1] - res[i].annotations.rightEyeIris[0][1]) / res[i].box[3];\n const leftIrisCenterY = Math.abs(res[i].mesh[374][1] - res[i].annotations.leftEyeIris[0][1]) / res[i].box[3];\n if (leftIrisCenterY < 0.01 || rightIrisCenterY < 0.01 || leftIrisCenterY > 0.022 || rightIrisCenterY > 0.022) center = false;\n if (leftIrisCenterY < 0.01 || rightIrisCenterY < 0.01) gestures.push({ iris: i, gesture: 'looking down' });\n if (leftIrisCenterY > 0.022 || rightIrisCenterY > 0.022) gestures.push({ iris: i, gesture: 'looking up' });\n\n // still center;\n if (center) gestures.push({ iris: i, gesture: 'looking center' });\n }\n return gestures;\n};\n\nexport const hand = (res: HandResult[]): GestureResult[] => {\n if (!res) return [];\n const gestures: Array<{ hand: number, gesture: HandGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n const fingers: Array<{ name: string, position: Point }> = [];\n if (res[i]['annotations']) {\n for (const [finger, pos] of Object.entries(res[i]['annotations'])) {\n if (finger !== 'palmBase' && Array.isArray(pos) && pos[0]) fingers.push({ name: finger.toLowerCase(), position: pos[0] }); // get tip of each finger\n }\n }\n if (fingers && fingers.length > 0) {\n const closest = fingers.reduce((best, a) => ((best.position[2] || 0) < (a.position[2] || 0) ? best : a));\n gestures.push({ hand: i, gesture: `${closest.name} forward` as HandGesture });\n const highest = fingers.reduce((best, a) => (best.position[1] < a.position[1] ? best : a));\n gestures.push({ hand: i, gesture: `${highest.name} up` as HandGesture });\n }\n if (res[i]['keypoints']) {\n const poses = fingerPose.match(res[i]['keypoints']);\n for (const pose of poses) gestures.push({ hand: i, gesture: pose.name as HandGesture });\n }\n }\n return gestures;\n};\n", "/**\n * Results interpolation for smoothening of video detection results inbetween detected frames\n */\n\nimport type { Result, FaceResult, BodyResult, HandResult, ObjectResult, GestureResult, PersonResult, Box, Point, BodyLandmark, BodyAnnotation } from '../result';\nimport type { Config } from '../config';\n\nimport * as moveNetCoords from '../body/movenetcoords';\nimport * as blazePoseCoords from '../body/blazeposecoords';\nimport * as efficientPoseCoords from '../body/efficientposecoords';\nimport { now } from './util';\nimport { env } from './env';\n\nconst bufferedResult: Result = { face: [], body: [], hand: [], gesture: [], object: [], persons: [], performance: {}, timestamp: 0, error: null };\nlet interpolateTime = 0;\n\nexport function calc(newResult: Result, config: Config): Result {\n const t0 = now();\n if (!newResult) return { face: [], body: [], hand: [], gesture: [], object: [], persons: [], performance: {}, timestamp: 0, error: null };\n // each record is only updated using deep clone when number of detected record changes, otherwise it will converge by itself\n // otherwise bufferedResult is a shallow clone of result plus updated local calculated values\n // thus mixing by-reference and by-value assignments to minimize memory operations\n\n const elapsed = Date.now() - newResult.timestamp;\n // curve fitted: buffer = 8 - ln(delay)\n // interpolation formula: current = ((buffer - 1) * previous + live) / buffer\n // - at 50ms delay buffer = ~4.1 => 28% towards live data\n // - at 250ms delay buffer = ~2.5 => 40% towards live data\n // - at 500ms delay buffer = ~1.8 => 55% towards live data\n // - at 750ms delay buffer = ~1.4 => 71% towards live data\n // - at 1sec delay buffer = 1 which means live data is used\n const bufferedFactor = elapsed < 1000 ? 8 - Math.log(elapsed + 1) : 1;\n\n if (newResult.canvas) bufferedResult.canvas = newResult.canvas;\n if (newResult.error) bufferedResult.error = newResult.error;\n\n // interpolate body results\n if (!bufferedResult.body || (newResult.body.length !== bufferedResult.body.length)) {\n bufferedResult.body = JSON.parse(JSON.stringify(newResult.body as BodyResult[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.body.length; i++) {\n const box = newResult.body[i].box // update box\n .map((newBoxCoord, j) => ((bufferedFactor - 1) * bufferedResult.body[i].box[j] + newBoxCoord) / bufferedFactor) as Box;\n const boxRaw = newResult.body[i].boxRaw // update boxRaw\n .map((newBoxCoord, j) => ((bufferedFactor - 1) * bufferedResult.body[i].boxRaw[j] + newBoxCoord) / bufferedFactor) as Box;\n const keypoints = (newResult.body[i].keypoints // update keypoints\n .map((newKpt, j) => ({\n score: newKpt.score,\n part: newKpt.part as BodyLandmark,\n position: [\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[0] || 0) + (newKpt.position[0] || 0)) / bufferedFactor : newKpt.position[0],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[1] || 0) + (newKpt.position[1] || 0)) / bufferedFactor : newKpt.position[1],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[2] || 0) + (newKpt.position[2] || 0)) / bufferedFactor : newKpt.position[2],\n ],\n positionRaw: [\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[0] || 0) + (newKpt.positionRaw[0] || 0)) / bufferedFactor : newKpt.positionRaw[0],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[1] || 0) + (newKpt.positionRaw[1] || 0)) / bufferedFactor : newKpt.positionRaw[1],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[2] || 0) + (newKpt.positionRaw[2] || 0)) / bufferedFactor : newKpt.positionRaw[2],\n ],\n distance: [\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].distance?.[0] || 0) + (newKpt.distance?.[0] || 0)) / bufferedFactor : newKpt.distance?.[0],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].distance?.[1] || 0) + (newKpt.distance?.[1] || 0)) / bufferedFactor : newKpt.distance?.[1],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].distance?.[2] || 0) + (newKpt.distance?.[2] || 0)) / bufferedFactor : newKpt.distance?.[2],\n ],\n }))) as Array<{ score: number, part: BodyLandmark, position: [number, number, number?], positionRaw: [number, number, number?] }>;\n\n const annotations: Record = {} as Record; // recreate annotations\n let coords = { connected: {} };\n if (config.body?.modelPath?.includes('efficientpose')) coords = efficientPoseCoords;\n else if (config.body?.modelPath?.includes('blazepose')) coords = blazePoseCoords;\n else if (config.body?.modelPath?.includes('movenet')) coords = moveNetCoords;\n for (const [name, indexes] of Object.entries(coords.connected as Record)) {\n const pt: Array = [];\n for (let j = 0; j < indexes.length - 1; j++) {\n const pt0 = keypoints.find((kp) => kp.part === indexes[j]);\n const pt1 = keypoints.find((kp) => kp.part === indexes[j + 1]);\n // if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);\n if (pt0 && pt1) pt.push([pt0.position, pt1.position]);\n }\n annotations[name] = pt;\n }\n bufferedResult.body[i] = { ...newResult.body[i], box, boxRaw, keypoints, annotations: annotations as BodyResult['annotations'] }; // shallow clone plus updated values\n }\n }\n\n // interpolate hand results\n if (!bufferedResult.hand || (newResult.hand.length !== bufferedResult.hand.length)) {\n bufferedResult.hand = JSON.parse(JSON.stringify(newResult.hand as HandResult[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.hand.length; i++) {\n const box = (newResult.hand[i].box// update box\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].box[j] + b) / bufferedFactor)) as Box;\n const boxRaw = (newResult.hand[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].boxRaw[j] + b) / bufferedFactor)) as Box;\n if (bufferedResult.hand[i].keypoints.length !== newResult.hand[i].keypoints.length) bufferedResult.hand[i].keypoints = newResult.hand[i].keypoints; // reset keypoints as previous frame did not have them\n const keypoints = newResult.hand[i].keypoints && newResult.hand[i].keypoints.length > 0 ? newResult.hand[i].keypoints // update landmarks\n .map((landmark, j) => landmark\n .map((coord, k) => (((bufferedFactor - 1) * (bufferedResult.hand[i].keypoints[j][k] || 1) + (coord || 0)) / bufferedFactor)) as Point)\n : [];\n let annotations = {};\n if (Object.keys(bufferedResult.hand[i].annotations).length !== Object.keys(newResult.hand[i].annotations).length) {\n bufferedResult.hand[i].annotations = newResult.hand[i].annotations; // reset annotations as previous frame did not have them\n annotations = bufferedResult.hand[i].annotations;\n } else if (newResult.hand[i].annotations) {\n for (const key of Object.keys(newResult.hand[i].annotations)) { // update annotations\n annotations[key] = newResult.hand[i].annotations[key] && newResult.hand[i].annotations[key][0]\n ? newResult.hand[i].annotations[key]\n .map((val, j: number) => val\n .map((coord: number, k: number) => ((bufferedFactor - 1) * bufferedResult.hand[i].annotations[key][j][k] + coord) / bufferedFactor))\n : null;\n }\n }\n bufferedResult.hand[i] = { ...newResult.hand[i], box, boxRaw, keypoints, annotations: annotations as HandResult['annotations'] }; // shallow clone plus updated values\n }\n }\n\n // interpolate face results\n if (!bufferedResult.face || (newResult.face.length !== bufferedResult.face.length)) {\n bufferedResult.face = JSON.parse(JSON.stringify(newResult.face as FaceResult[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.face.length; i++) {\n const box = (newResult.face[i].box // update box\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].box[j] + b) / bufferedFactor)) as Box;\n const boxRaw = (newResult.face[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].boxRaw[j] + b) / bufferedFactor)) as Box;\n if (newResult.face[i].rotation) {\n const rotation: {\n matrix: [number, number, number, number, number, number, number, number, number],\n angle: { roll: number, yaw: number, pitch: number },\n gaze: { bearing: number, strength: number }\n } = { matrix: [0, 0, 0, 0, 0, 0, 0, 0, 0], angle: { roll: 0, yaw: 0, pitch: 0 }, gaze: { bearing: 0, strength: 0 } };\n rotation.matrix = newResult.face[i].rotation?.matrix as [number, number, number, number, number, number, number, number, number];\n rotation.angle = {\n roll: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.roll || 0) + (newResult.face[i].rotation?.angle?.roll || 0)) / bufferedFactor,\n yaw: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.yaw || 0) + (newResult.face[i].rotation?.angle?.yaw || 0)) / bufferedFactor,\n pitch: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.pitch || 0) + (newResult.face[i].rotation?.angle?.pitch || 0)) / bufferedFactor,\n };\n rotation.gaze = {\n // not fully correct due projection on circle, also causes wrap-around draw on jump from negative to positive\n bearing: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.gaze?.bearing || 0) + (newResult.face[i].rotation?.gaze?.bearing || 0)) / bufferedFactor,\n strength: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.gaze?.strength || 0) + (newResult.face[i].rotation?.gaze?.strength || 0)) / bufferedFactor,\n };\n bufferedResult.face[i] = { ...newResult.face[i], rotation, box, boxRaw }; // shallow clone plus updated values\n }\n bufferedResult.face[i] = { ...newResult.face[i], box, boxRaw }; // shallow clone plus updated values\n }\n }\n\n // interpolate object detection results\n if (!bufferedResult.object || (newResult.object.length !== bufferedResult.object.length)) {\n bufferedResult.object = JSON.parse(JSON.stringify(newResult.object as ObjectResult[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.object.length; i++) {\n const box = (newResult.object[i].box // update box\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].box[j] + b) / bufferedFactor)) as Box;\n const boxRaw = (newResult.object[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].boxRaw[j] + b) / bufferedFactor)) as Box;\n bufferedResult.object[i] = { ...newResult.object[i], box, boxRaw }; // shallow clone plus updated values\n }\n }\n\n // interpolate person results\n if (newResult.persons) {\n const newPersons = newResult.persons; // trigger getter function\n if (!bufferedResult.persons || (newPersons.length !== bufferedResult.persons.length)) {\n bufferedResult.persons = JSON.parse(JSON.stringify(newPersons as PersonResult[]));\n } else {\n for (let i = 0; i < newPersons.length; i++) { // update person box, we don't update the rest as it's updated as reference anyhow\n bufferedResult.persons[i].box = (newPersons[i].box\n .map((box, j) => ((bufferedFactor - 1) * bufferedResult.persons[i].box[j] + box) / bufferedFactor)) as Box;\n }\n }\n }\n\n // just copy latest gestures without interpolation\n if (newResult.gesture) bufferedResult.gesture = newResult.gesture as GestureResult[];\n\n // append interpolation performance data\n const t1 = now();\n interpolateTime = env.perfadd ? interpolateTime + Math.round(t1 - t0) : Math.round(t1 - t0);\n if (newResult.performance) bufferedResult.performance = { ...newResult.performance, interpolate: interpolateTime };\n\n return bufferedResult;\n}\n", "/** Face descriptor type as number array */\nexport type Descriptor = Array\nexport type MatchOptions = { order?: number, threshold?: number, multiplier?: number, min?: number, max?: number } | undefined;\n\n/** Calculates distance between two descriptors\n * @param options - calculation options\n * - order - algorithm to use\n * Euclidean distance if `order` is 2 (default), Minkowski distance algorithm of nth order if `order` is higher than 2\n * - multiplier - by how much to enhance difference analysis in range of 1..100\n * default is 20 which normalizes results to similarity above 0.5 can be considered a match\n */\nexport function distance(descriptor1: Descriptor, descriptor2: Descriptor, options: MatchOptions = { order: 2, multiplier: 25 }) {\n // general minkowski distance, euclidean distance is limited case where order is 2\n let sum = 0;\n for (let i = 0; i < descriptor1.length; i++) {\n const diff = (!options.order || options.order === 2) ? (descriptor1[i] - descriptor2[i]) : (Math.abs(descriptor1[i] - descriptor2[i]));\n sum += (!options.order || options.order === 2) ? (diff * diff) : (diff ** options.order);\n }\n return (options.multiplier || 20) * sum;\n}\n\n// invert distance to similarity, normalize to given range and clamp\nconst normalizeDistance = (dist, order, min, max) => {\n if (dist === 0) return 1; // short circuit for identical inputs\n const root = order === 2 ? Math.sqrt(dist) : dist ** (1 / order); // take root of distance\n const norm = (1 - (root / 100) - min) / (max - min); // normalize to range\n const clamp = Math.max(Math.min(norm, 1), 0); // clamp to 0..1\n return clamp;\n};\n\n/** Calculates normalized similarity between two face descriptors based on their `distance`\n * @param options - calculation options\n * - order - algorithm to use\n * Euclidean distance if `order` is 2 (default), Minkowski distance algorithm of nth order if `order` is higher than 2\n * - multiplier - by how much to enhance difference analysis in range of 1..100\n * default is 20 which normalizes results to similarity above 0.5 can be considered a match\n * - min - normalize similarity result to a given range\n * - max - normalzie similarity resutl to a given range\n * default is 0.2...0.8\n * Returns similarity between two face descriptors normalized to 0..1 range where 0 is no similarity and 1 is perfect similarity\n */\nexport function similarity(descriptor1: Descriptor, descriptor2: Descriptor, options: MatchOptions = { order: 2, multiplier: 25, min: 0.2, max: 0.8 }) {\n const dist = distance(descriptor1, descriptor2, options);\n return normalizeDistance(dist, options.order || 2, options.min || 0, options.max || 1);\n}\n\n/** Matches given descriptor to a closest entry in array of descriptors\n * @param descriptor - face descriptor\n * @param descriptors - array of face descriptors to commpare given descriptor to\n * @param options - see {@link similarity}\n * Returns\n * - `index` index array index where best match was found or -1 if no matches\n * - {@link distance} calculated `distance` of given descriptor to the best match\n * - {@link similarity} calculated normalized `similarity` of given descriptor to the best match\n*/\nexport function match(descriptor: Descriptor, descriptors: Array, options: MatchOptions = { order: 2, multiplier: 25, threshold: 0, min: 0.2, max: 0.8 }) {\n if (!Array.isArray(descriptor) || !Array.isArray(descriptors) || descriptor.length < 64 || descriptors.length === 0 || descriptor.length !== descriptors[0].length) { // validate input\n return { index: -1, distance: Number.POSITIVE_INFINITY, similarity: 0 };\n }\n let lowestDistance = Number.MAX_SAFE_INTEGER;\n let index = -1;\n for (let i = 0; i < descriptors.length; i++) {\n const res = distance(descriptor, descriptors[i], options);\n if (res < lowestDistance) {\n lowestDistance = res;\n index = i;\n }\n if (lowestDistance < (options.threshold || 0)) break;\n }\n const normalizedSimilarity = normalizeDistance(lowestDistance, options.order || 2, options.min || 0, options.max || 1);\n return { index, distance: lowestDistance, similarity: normalizedSimilarity };\n}\n", "/**\n * Analyze detection Results and sort&combine them into per-person view\n */\n\nimport type { FaceResult, BodyResult, HandResult, GestureResult, PersonResult, Box } from '../result';\n\nexport function join(faces: Array, bodies: Array, hands: Array, gestures: Array, shape: Array | undefined): Array {\n let id = 0;\n const persons: Array = [];\n for (const face of faces) { // person is defined primarily by face and then we append other objects as found\n const person: PersonResult = { id: id++, face, body: null, hands: { left: null, right: null }, gestures: [], box: [0, 0, 0, 0] };\n for (const body of bodies) {\n if (face.box[0] > body.box[0] // x within body\n && face.box[0] < body.box[0] + body.box[2]\n && face.box[1] + face.box[3] > body.box[1] // y within body\n && face.box[1] + face.box[3] < body.box[1] + body.box[3]) {\n person.body = body;\n }\n }\n if (person.body) { // only try to join hands if body is found\n for (const hand of hands) {\n if (hand.box[0] + hand.box[2] > person.body.box[0] // x within body for left hand\n && hand.box[0] + hand.box[2] < person.body.box[0] + person.body.box[2]\n && hand.box[1] + hand.box[3] > person.body.box[1] // x within body for left hand\n && hand.box[1] + hand.box[3] < person.body.box[1] + person.body.box[3]) {\n if (person.hands) person.hands.left = hand;\n }\n if (hand.box[0] < person.body.box[0] + person.body.box[2] // x within body for right hand\n && hand.box[0] > person.body.box[0]\n && hand.box[1] + hand.box[3] > person.body.box[1] // x within body for right hand\n && hand.box[1] + hand.box[3] < person.body.box[1] + person.body.box[3]) {\n if (person.hands) person.hands.right = hand;\n }\n }\n }\n for (const gesture of gestures) { // append all gestures according to ids\n if (gesture['face'] !== undefined && gesture['face'] === face.id) person.gestures?.push(gesture);\n else if (gesture['iris'] !== undefined && gesture['iris'] === face.id) person.gestures?.push(gesture);\n else if (gesture['body'] !== undefined && gesture['body'] === person.body?.id) person.gestures?.push(gesture);\n else if (gesture['hand'] !== undefined && gesture['hand'] === person.hands?.left?.id) person.gestures?.push(gesture);\n else if (gesture['hand'] !== undefined && gesture['hand'] === person.hands?.right?.id) person.gestures?.push(gesture);\n }\n\n // create new overarching box from all boxes belonging to person\n const x: number[] = [];\n const y: number[] = [];\n const extractXY = (box: Box | undefined) => { // extract all [x, y] coordinates from boxes [x, y, width, height]\n if (box && box.length === 4) {\n x.push(box[0], box[0] + box[2]);\n y.push(box[1], box[1] + box[3]);\n }\n };\n extractXY(person.face?.box);\n extractXY(person.body?.box);\n extractXY(person.hands?.left?.box);\n extractXY(person.hands?.right?.box);\n const minX = Math.min(...x);\n const minY = Math.min(...y);\n person.box = [minX, minY, Math.max(...x) - minX, Math.max(...y) - minY]; // create new overarching box\n\n // shape is known so we calculate boxRaw as well\n if (shape && shape[1] && shape[2]) person.boxRaw = [person.box[0] / shape[2], person.box[1] / shape[1], person.box[2] / shape[2], person.box[3] / shape[1]];\n\n persons.push(person);\n }\n return persons;\n}\n", "/**\n * Embedded sample images used during warmup in dataURL format\n */\n\n// data:image/jpeg;base64,\nexport const face = `\n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`;\n\n// data:image/jpeg;base64,\nexport const body = `\n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\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAa2p1UYo5adbz+xbxMlvqJ1OqjDHLXree0ejmzNrWm953tPmTPWbWneZ7yoy5YhjrXXTjH8s75N\nmtkyxt0VZM2/m175N1V03yTKubMLXVXybeYLLX2VXy7eam+b0bOg4VquJW+rry4/O9uyZOq3UjVm\n9r25axMzPaIdvhns1kzbZddM0p5Y47z8/R2+HcF03Doi1a8+Xzvbv+TotJnjDXkt+K8ODHp8cY8N\nIpSO0RCwF2YAAAAAAAAACvUZYw6fJkntWN3k8dfHz2vLucdz8mkjFE9bz1+UOZosX1UzPm0nqI/W\nMYo9FlcPNklfFGeH/NshLGun+Cz6PtHZtVZWlRLS+jxPkRpIn7rdoupHTdA5s6SI+7H6Mfo+32Y2\n+To3neSIiZ7A0IjPXpXLePlMotGW3272t85datKzHZjbTVnsDj+FG/2Y/RlGP4R+jo20u7H6N1Ql\no+H8I/REY957R+jpfReiK6eOYHLtj2tttH6KrY/6Y/R2c+kjeJiFVtLG24hxpw7/AHY/RRkw9O37\nO99Hrt1YX0tfOBLjcGp4XF8c+u8fs9c4dcVcGemSI61nd3IneN1orQAAAAAAAAAAAAABFqxes1tE\nTE9JiUgPKcX4RbRXnNgiZwWnrH4XPi28PdXpW9JraImsxtMS8pxXhF9DecuGJtgmf+1TWW2N/la1\nL7N7T5e3Vy6W3hsYcvLbqzbO9jvvCzvDR0+XeO7crO6FmGSvRThy/RtVXJ92elvk2rRvDUzU7pl4\nizsd2J3jeBpcNz+Lg5LT7+Pp+Xk3W7js5eAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs0NTrN96Yp6edkW8Wzm6+LNTq4pvTHO9vOfRoWtt\n1mes95YWvs1s2fZldddOczLPLn2ju0MmebT3YZc2/mpm3qqllN1drsbZIhr3yzvtHf4AsvlYYseb\nV5Yx4KTe0+UQ6nDvZ3UazbJqd8OKeu33peq0eh0+hxcmnxxWPOfOfm0mP+steT/ji8N9mKY9suum\nL37+HHaPm9DSlaVitKxWsdohI0Y22gAgAAAAAAAAAABXnyRhw3yT92Nwef4xm8bVzET0rPJH5d12\n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\nAOZE/OsPS29nuH27YrV+VpeV9pdPXhOtw49NG9Mld55+vXcTPd42I47qo7xSfyWV9oM8d8VJ/VxM\nd8l46xWF9cV7en6o/qLfxp2I9ob+eCv/AHMo9op89P8A/wBORGmyT5R+qfo2X8P7n9Q/jTsx7RR5\n6ef+4/8AuHftg/8A6cWcOSO9J/WEbWr3pY7Efzp2Lcfv5YK/9zWy8d1E/ZpSv5Oba1/+Hb9lc+LP\nbFt87I7E/wAabWbiurvEx4nL/pjZzc2bJkn372t85ZXx55/BX85lucC0vPxnTxlnnjm32mOiZqUu\nLJ2p4TwnVavNWaYbRTfre0bQ99pcH0bT0xb78vmtiIiNojaErMwAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAHnfarF7umzRHaZrLjYrdIen9ocPi8JyTt1xzF4eUw23rCm3R4r6bMy\nwt6kdTaWLdjswmNoZontsCm0K5XWjopnuDC0dGpqG5bs08/daKV672MjbSaif6oh6Z5f2LtvptRX\n0tEvUN3Jfo8f7cYve0eX4zV7B5z20xc/C8eSPuZIRficfXlcPaG7ino08HWIbePpLF2NuiyOyrHK\n3fZFSwuovHVfaVF4QK5YWTM9UT0EKry6Ps1Tn4zjn8NZn9nOtLseydObiWW34cf918fWfk+PYANn\nKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq1WKM+ly4p+/WYeBxTNd6zG0xO0\nvobw3FcP0bi2em20Tbmj5Srr418V9sa2Z7qKyzi07MXUylhaU7yjqhLCeiq3ddaFNxFYW7NLNG8t\nzya+WO6Va9J7FW66mvwidnrXiPY3Ny8RyUn71Jj9Ht3RPjk19HK9pMHj8D1ER3rHN+jqqtTjjNps\nuOe16zAifXzfTz7kNyndpYazS9qT0mszDdoxrsi6m8LazMq6zDOsq1ZEyrt1WWlXaUCqyq0rbKbi\nFdp6PReyFd8uqv8ACsfy83aXrPZHHto89/xX2/SP/dpj6y8vx6EBq5gAAAAAAAAAAAAAAAAAAAAA\n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\nNO67NbkhzNVnmInqzaOZrL93JyZeV0M1++7S02jvxDWxhxx033tPpC8Z6rrezWjmZyazJG2/u03h\n2vFibTHoqvamiwVwY+nLGzV0+SZ1Mx8G0/45tOhzJ5lXMc3UVXRdlF1HP+iYsDPLPPy49/tz1+Te\npSIr0ho6ak5Ms5J8o2q6NImOrHV7XX488ypzTtHXo0s9t6zG7c1G1qz6ubeZiZ3UatXJG3yauSO7\ncvMTEx5tPLb3prPRMVr0HB8vicNxf0+7+kt+LOJwTJyY/Bnz3tH93X36N58cWvq6LSyiyndMSlC7\nmZcymLJiwLosmJVRLKLAtiU7q4lMSCzc3YxJuDMRuAlKAEgAAAlAkAAAAAABKAEgAAAAAJAAAAAA\nAAAAAAAEgAAAAAAAAAAAAAkAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAhIAAACAAAASgAAAAAAEAAAA\nhGzJAImGMwzQDDZjNVuyNgUTVhNGxysZqDVmiu1G5NN2M4waM0+DCaN2cbGcQNGaMZq3JxMJxA1J\nqx2bU4kU09slorWNwa20z02RXHbJbl26QvtFovbHWkxEdJt5y2MOHlr2U1W3jx+1hiw8vSO63lmI\nXRTaEWmtY6snRHO1VpmJ+DjavpSZl2s8b7y4HFcnh0n0gha5ebJN55KRM2mdoiPN6fh+kpwXh0Wy\nRHj5Otp/s5Ps1p62y31+em9aTMYt/OfVfxTiPjZ52naI7fBrI5t66xz5+a1rW7yx0eSL6iZjtEOX\nqNbSletom3lENjh2fbHzbbWt3iVozruc+5ztWubf4M4ybpQ2Oboyrva0Vjza8WdDR4OkXt3n9ldX\nkaePP9VtYqctYhdvt5oivTeCZ2YOxXk6ubqMfV0b9mrljfqlFcq88k7z2U5axeItDa1OPessuC8P\nya7XRWYnwqdbT/ZMilvIu4dpslNdixXja8Y5tt85djZdbDWnGOesRtXFtuw6T27No5Kx2OrKYQlC\nExKJgBnEpiyvdlEgsizKLKollFgWxLKJVRLKJBbEp3VxLKJBnuMWQJEbpBIAAAJAAAABIAAAAAAA\nlAJAAAAAAAAAAAAAASAAAAAAAAAAAAAJAAAABAJABAlAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAA\nAAABAJQAAAAgAABAAI2EoBGyJhkgGPKxmqxAKpownHC+YRMdN5BrTj67R3bOn01o7p01Iv71u89o\n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\n2Q==`;\n", "/**\n * Warmup algorithm that uses embedded images to exercise loaded models for faster future inference\n */\n\nimport { log, now, mergeDeep } from './util/util';\nimport * as sample from './sample';\nimport * as tf from '../dist/tfjs.esm.js';\nimport * as image from './image/image';\nimport type { Config } from './config';\nimport type { Result } from './result';\nimport type { Human } from './human';\nimport type { Tensor } from './tfjs/types';\nimport { env } from './util/env';\n\nasync function warmupBitmap(instance: Human) {\n const b64toBlob = (base64: string, type = 'application/octet-stream') => fetch(`data:${type};base64,${base64}`).then((res) => res.blob());\n let blob;\n let res;\n switch (instance.config.warmup) {\n case 'face': blob = await b64toBlob(sample.face); break;\n case 'body':\n case 'full': blob = await b64toBlob(sample.body); break;\n default: blob = null;\n }\n if (blob) {\n const bitmap = await createImageBitmap(blob);\n res = await instance.detect(bitmap, instance.config);\n bitmap.close();\n }\n return res;\n}\n\nasync function warmupCanvas(instance: Human): Promise {\n return new Promise((resolve) => {\n let src;\n // let size = 0;\n switch (instance.config.warmup) {\n case 'face':\n // size = 256;\n src = 'data:image/jpeg;base64,' + sample.face;\n break;\n case 'full':\n case 'body':\n // size = 1200;\n src = 'data:image/jpeg;base64,' + sample.body;\n break;\n default:\n src = null;\n }\n // src = encodeURI('../assets/human-sample-upper.jpg');\n let img: HTMLImageElement;\n if (typeof Image !== 'undefined') img = new Image();\n // @ts-ignore env.image is an external monkey-patch\n else if (env.Image) img = new env.Image();\n else return;\n img.onload = async () => {\n const canvas = image.canvas(img.naturalWidth, img.naturalHeight);\n if (!canvas) {\n log('Warmup: Canvas not found');\n resolve(undefined);\n } else {\n const ctx = canvas.getContext('2d');\n if (ctx) ctx.drawImage(img, 0, 0);\n // const data = ctx?.getImageData(0, 0, canvas.height, canvas.width);\n const tensor = await instance.image(canvas);\n const res = await instance.detect(tensor.tensor as Tensor, instance.config);\n resolve(res);\n }\n };\n if (src) img.src = src;\n else resolve(undefined);\n });\n}\n\nasync function warmupNode(instance: Human): Promise {\n const atob = (str: string) => Buffer.from(str, 'base64');\n let img;\n if (instance.config.warmup === 'face') img = atob(sample.face);\n else img = atob(sample.body);\n let res;\n if ('node' in tf) {\n // @ts-ignore tf.node may be undefined\n const data = tf['node'].decodeJpeg(img);\n const expanded = data.expandDims(0);\n instance.tf.dispose(data);\n // log('Input:', expanded);\n res = await instance.detect(expanded, instance.config);\n instance.tf.dispose(expanded);\n } else {\n if (instance.config.debug) log('Warmup tfjs-node not loaded');\n /*\n const input = await canvasJS.loadImage(img);\n const canvas = canvasJS.createCanvas(input.width, input.height);\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, input.width, input.height);\n res = await instance.detect(input, instance.config);\n */\n }\n return res;\n}\n\n/** Warmup method pre-initializes all configured models for faster inference\n * - can take significant time on startup\n * - only used for `webgl` and `humangl` backends\n * @param userConfig?: Config\n*/\nexport async function warmup(instance: Human, userConfig?: Partial): Promise {\n const t0 = now();\n instance.state = 'warmup';\n if (userConfig) instance.config = mergeDeep(instance.config, userConfig) as Config;\n if (!instance.config.warmup || instance.config.warmup.length === 0 || instance.config.warmup === 'none') {\n return { face: [], body: [], hand: [], gesture: [], object: [], performance: instance.performance, timestamp: now(), persons: [], error: null };\n }\n let res;\n return new Promise(async (resolve) => {\n if (typeof createImageBitmap === 'function') res = await warmupBitmap(instance);\n else if (typeof Image !== 'undefined' || env.Canvas !== undefined) res = await warmupCanvas(instance);\n else res = await warmupNode(instance);\n const t1 = now();\n if (instance.config.debug) log('Warmup', instance.config.warmup, Math.round(t1 - t0), 'ms');\n instance.emit('warmup');\n resolve(res);\n });\n}\n", "/**\n * Human main module\n * @default Human Library\n * @summary \n * @author \n * @copyright \n * @license MIT\n */\n\n// module imports\nimport { log, now, mergeDeep, validate } from './util/util';\nimport { defaults } from './config';\nimport { env, Env } from './util/env';\nimport { setModelLoadOptions } from './tfjs/load';\nimport * as tf from '../dist/tfjs.esm.js';\nimport * as app from '../package.json';\nimport * as backend from './tfjs/backend';\nimport * as blazepose from './body/blazepose';\nimport * as centernet from './object/centernet';\nimport * as draw from './util/draw';\nimport * as efficientpose from './body/efficientpose';\nimport * as face from './face/face';\nimport * as facemesh from './face/facemesh';\nimport * as faceres from './face/faceres';\nimport * as gesture from './gesture/gesture';\nimport * as handpose from './hand/handpose';\nimport * as handtrack from './hand/handtrack';\nimport * as humangl from './tfjs/humangl';\nimport * as image from './image/image';\nimport * as interpolate from './util/interpolate';\nimport * as match from './face/match';\nimport * as models from './models';\nimport * as movenet from './body/movenet';\nimport * as nanodet from './object/nanodet';\nimport * as persons from './util/persons';\nimport * as posenet from './body/posenet';\nimport * as segmentation from './segmentation/segmentation';\nimport * as warmups from './warmup';\n// type definitions\nimport type { Input, Tensor, DrawOptions, Config, Result, FaceResult, HandResult, BodyResult, ObjectResult, GestureResult, PersonResult, AnyCanvas } from './exports';\n// type exports\nexport * from './exports';\n\n/** **Human** library main class\n *\n * All methods and properties are available only as members of Human class\n *\n * - Configuration object definition: {@link Config}\n * - Results object definition: {@link Result}\n * - Possible inputs: {@link Input}\n *\n * @param userConfig - {@link Config}\n * @returns instance of {@link Human}\n */\nexport class Human {\n /** Current version of Human library in *semver* format */\n version: string;\n\n /** Current configuration\n * - Defaults: [config](https://github.com/vladmandic/human/blob/main/src/config.ts#L262)\n */\n config: Config;\n\n /** Last known result of detect run\n * - Can be accessed anytime after initial detection\n */\n result: Result;\n\n /** Current state of Human library\n * - Can be polled to determine operations that are currently executed\n * - Progresses through: 'config', 'check', 'backend', 'load', 'run:', 'idle'\n */\n state: string;\n\n /** currenty processed image tensor and canvas */\n process: { tensor: Tensor | null, canvas: AnyCanvas | null };\n\n /** Instance of TensorFlow/JS used by Human\n * - Can be embedded or externally provided\n * [TFJS API]: {@link https://js.tensorflow.org/api/latest/}\n */\n tf;\n\n /** Object containing environment information used for diagnostics */\n env: Env;\n\n /** Draw helper classes that can draw detected objects on canvas using specified draw\n * - canvas: draws input to canvas\n * - options: are global settings for all draw operations, can be overriden for each draw method {@link DrawOptions}\n * - face, body, hand, gesture, object, person: draws detected results as overlays on canvas\n */\n draw: { canvas: typeof draw.canvas, face: typeof draw.face, body: typeof draw.body, hand: typeof draw.hand, gesture: typeof draw.gesture, object: typeof draw.object, person: typeof draw.person, all: typeof draw.all, options: DrawOptions };\n\n /** Currently loaded models\n * @internal\n * {@link Models}\n */\n models: models.Models;\n\n /** Container for events dispatched by Human\n * Possible events:\n * - `create`: triggered when Human object is instantiated\n * - `load`: triggered when models are loaded (explicitly or on-demand)\n * - `image`: triggered when input image is processed\n * - `result`: triggered when detection is complete\n * - `warmup`: triggered when warmup is complete\n * - `error`: triggered on some errors\n */\n events: EventTarget | undefined;\n /** Reference face triangualtion array of 468 points, used for triangle references between points */\n faceTriangulation: number[];\n /** Refernce UV map of 468 values, used for 3D mapping of the face mesh */\n faceUVMap: [number, number][];\n /** Performance object that contains values for all recently performed operations */\n performance: Record; // perf members are dynamically defined as needed\n #numTensors: number;\n #analyzeMemoryLeaks: boolean;\n #checkSanity: boolean;\n /** WebGL debug info */\n gl: Record;\n // definition end\n\n /** Constructor for **Human** library that is futher used for all operations\n * @param userConfig - user configuration object {@link Config}\n */\n constructor(userConfig?: Partial) {\n this.env = env;\n defaults.wasmPath = tf.version['tfjs-core'].includes('-') // custom build or official build\n ? 'https://vladmandic.github.io/tfjs/dist/'\n : `https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${tf.version_core}/dist/`;\n defaults.modelBasePath = env.browser ? '../models/' : 'file://models/';\n defaults.backend = env.browser ? 'humangl' : 'tensorflow';\n this.version = app.version; // expose version property on instance of class\n Object.defineProperty(this, 'version', { value: app.version }); // expose version property directly on class itself\n this.config = JSON.parse(JSON.stringify(defaults));\n Object.seal(this.config);\n this.config.cacheModels = typeof indexedDB !== 'undefined';\n if (userConfig) this.config = mergeDeep(this.config, userConfig);\n setModelLoadOptions(this.config);\n this.tf = tf;\n this.state = 'idle';\n this.#numTensors = 0;\n this.#analyzeMemoryLeaks = false;\n this.#checkSanity = false;\n this.performance = {};\n this.events = (typeof EventTarget !== 'undefined') ? new EventTarget() : undefined;\n // object that contains all initialized models\n this.models = new models.Models();\n // reexport draw methods\n this.draw = {\n options: draw.options as DrawOptions,\n canvas: (input: AnyCanvas | HTMLImageElement | HTMLVideoElement, output: AnyCanvas) => draw.canvas(input, output),\n face: (output: AnyCanvas, result: FaceResult[], options?: Partial) => draw.face(output, result, options),\n body: (output: AnyCanvas, result: BodyResult[], options?: Partial) => draw.body(output, result, options),\n hand: (output: AnyCanvas, result: HandResult[], options?: Partial) => draw.hand(output, result, options),\n gesture: (output: AnyCanvas, result: GestureResult[], options?: Partial) => draw.gesture(output, result, options),\n object: (output: AnyCanvas, result: ObjectResult[], options?: Partial) => draw.object(output, result, options),\n person: (output: AnyCanvas, result: PersonResult[], options?: Partial) => draw.person(output, result, options),\n all: (output: AnyCanvas, result: Result, options?: Partial) => draw.all(output, result, options),\n };\n this.result = { face: [], body: [], hand: [], gesture: [], object: [], performance: {}, timestamp: 0, persons: [], error: null };\n // export access to image processing\n // @ts-ignore eslint-typescript cannot correctly infer type in anonymous function\n this.process = { tensor: null, canvas: null };\n // export raw access to underlying models\n this.faceTriangulation = facemesh.triangulation;\n this.faceUVMap = facemesh.uvmap;\n // set gl info\n this.gl = humangl.config;\n // include platform info\n this.emit('create');\n }\n\n /** internal function to measure tensor leaks */\n analyze = (...msg: string[]) => {\n if (!this.#analyzeMemoryLeaks) return;\n const currentTensors = this.tf.engine().state.numTensors;\n const previousTensors = this.#numTensors;\n this.#numTensors = currentTensors;\n const leaked = currentTensors - previousTensors;\n if (leaked !== 0) log(...msg, leaked);\n };\n\n /** internal function for quick sanity check on inputs @hidden */\n #sanity = (input: Input): null | string => {\n if (!this.#checkSanity) return null;\n if (!input) return 'input is not defined';\n if (this.env.node && !(input instanceof tf.Tensor)) return 'input must be a tensor';\n try {\n this.tf.getBackend();\n } catch {\n return 'backend not loaded';\n }\n return null;\n };\n\n /** Reset configuration to default values */\n reset(): void {\n const currentBackend = this.config.backend; // save backend;\n this.config = JSON.parse(JSON.stringify(defaults));\n this.config.backend = currentBackend;\n }\n\n /** Validate current configuration schema */\n validate(userConfig?: Partial) {\n return validate(defaults, userConfig || this.config);\n }\n\n /** Exports face matching methods {@link match#similarity} */\n public similarity = match.similarity;\n /** Exports face matching methods {@link match#distance} */\n public distance = match.distance;\n /** Exports face matching methods {@link match#match} */\n public match = match.match;\n\n /** Utility wrapper for performance.now() */\n now(): number {\n return now();\n }\n\n /** Process input as return canvas and tensor\n *\n * @param input - any input {@link Input}\n * @param getTensor - should image processing also return tensor or just canvas\n * Returns object with `tensor` and `canvas`\n */\n image(input: Input, getTensor: boolean = true) {\n return image.process(input, this.config, getTensor);\n }\n\n /** Segmentation method takes any input and returns processed canvas with body segmentation\n * - Segmentation is not triggered as part of detect process\n * @param input - {@link Input}\n * @param background - {@link Input}\n * - Optional parameter background is used to fill the background with specific input\n * Returns:\n * - `data` as raw data array with per-pixel segmentation values\n * - `canvas` as canvas which is input image filtered with segementation data and optionally merged with background image. canvas alpha values are set to segmentation values for easy merging\n * - `alpha` as grayscale canvas that represents segmentation alpha values\n */\n async segmentation(input: Input, background?: Input): Promise<{ data: number[] | Tensor, canvas: AnyCanvas | null, alpha: AnyCanvas | null }> {\n return segmentation.process(input, background, this.config);\n }\n\n /** Enhance method performs additional enhacements to face image previously detected for futher processing\n *\n * @param input - Tensor as provided in human.result.face[n].tensor\n * @returns Tensor\n */\n // eslint-disable-next-line class-methods-use-this\n enhance(input: Tensor): Tensor | null {\n return faceres.enhance(input);\n }\n\n /** Compare two input tensors for pixel simmilarity\n * - use `human.image` to process any valid input and get a tensor that can be used for compare\n * - when passing manually generated tensors:\n * - both input tensors must be in format [1, height, width, 3]\n * - if resolution of tensors does not match, second tensor will be resized to match resolution of the first tensor\n * - return value is pixel similarity score normalized by input resolution and rgb channels\n */\n compare(firstImageTensor: Tensor, secondImageTensor: Tensor): Promise {\n return image.compare(this.config, firstImageTensor, secondImageTensor);\n }\n\n /** Explicit backend initialization\n * - Normally done implicitly during initial load phase\n * - Call to explictly register and initialize TFJS backend without any other operations\n * - Use when changing backend during runtime\n */\n async init(): Promise {\n await backend.check(this, true);\n await this.tf.ready();\n }\n\n /** Load method preloads all configured models on-demand\n * - Not explicitly required as any required model is load implicitly on it's first run\n *\n * @param userConfig - {@link Config}\n */\n async load(userConfig?: Partial): Promise {\n this.state = 'load';\n const timeStamp = now();\n const count = Object.values(this.models).filter((model) => model).length;\n if (userConfig) this.config = mergeDeep(this.config, userConfig) as Config;\n\n if (this.env.initial) { // print version info on first run and check for correct backend setup\n if (this.config.debug) log(`version: ${this.version}`);\n if (this.config.debug) log(`tfjs version: ${this.tf.version['tfjs-core']}`);\n if (!await backend.check(this)) log('error: backend check failed');\n await tf.ready();\n if (this.env.browser) {\n if (this.config.debug) log('configuration:', this.config);\n if (this.config.debug) log('environment:', this.env);\n if (this.config.debug) log('tf flags:', this.tf.ENV['flags']);\n }\n }\n\n await models.load(this); // actually loads models\n if (this.env.initial && this.config.debug) log('tf engine state:', this.tf.engine().state.numBytes, 'bytes', this.tf.engine().state.numTensors, 'tensors'); // print memory stats on first run\n this.env.initial = false;\n\n const loaded = Object.values(this.models).filter((model) => model).length;\n if (loaded !== count) { // number of loaded models changed\n await models.validate(this); // validate kernel ops used by model against current backend\n this.emit('load');\n }\n\n const current = Math.trunc(now() - timeStamp);\n if (current > (this.performance.loadModels as number || 0)) this.performance.loadModels = this.env.perfadd ? (this.performance.loadModels || 0) + current : current;\n }\n\n /** emit event */\n emit = (event: string) => {\n if (this.events && this.events.dispatchEvent) this.events?.dispatchEvent(new Event(event));\n };\n\n /** Runs interpolation using last known result and returns smoothened result\n * Interpolation is based on time since last known result so can be called independently\n *\n * @param result - {@link Result} optional use specific result set to run interpolation on\n * @returns result - {@link Result}\n */\n next(result: Result = this.result): Result {\n return interpolate.calc(result, this.config) as Result;\n }\n\n /** Warmup method pre-initializes all configured models for faster inference\n * - can take significant time on startup\n * - only used for `webgl` and `humangl` backends\n * @param userConfig - {@link Config}\n * @returns result - {@link Result}\n */\n async warmup(userConfig?: Partial) {\n const t0 = now();\n const res = await warmups.warmup(this, userConfig);\n const t1 = now();\n this.performance.warmup = Math.trunc(t1 - t0);\n return res;\n }\n\n /** Run detect with tensorflow profiling\n * - result object will contain total exeuction time information for top-20 kernels\n * - actual detection object can be accessed via `human.result`\n */\n async profile(input: Input, userConfig?: Partial): Promise> {\n const profile = await this.tf.profile(() => this.detect(input, userConfig));\n const kernels: Record = {};\n for (const kernel of profile.kernels) { // sum kernel time values per kernel\n if (kernels[kernel.name]) kernels[kernel.name] += kernel.kernelTimeMs;\n else kernels[kernel.name] = kernel.kernelTimeMs;\n }\n const kernelArr: Array<{ name: string, ms: number }> = [];\n Object.entries(kernels).forEach((key) => kernelArr.push({ name: key[0], ms: key[1] as unknown as number })); // convert to array\n kernelArr.sort((a, b) => b.ms - a.ms); // sort\n kernelArr.length = 20; // crop\n const res: Record = {};\n for (const kernel of kernelArr) res[kernel.name] = kernel.ms; // create perf objects\n return res;\n }\n\n /** Main detection method\n * - Analyze configuration: {@link Config}\n * - Pre-process input: {@link Input}\n * - Run inference for all configured models\n * - Process and return result: {@link Result}\n *\n * @param input - {@link Input}\n * @param userConfig - {@link Config}\n * @returns result - {@link Result}\n */\n async detect(input: Input, userConfig?: Partial): Promise {\n // detection happens inside a promise\n this.state = 'detect';\n return new Promise(async (resolve) => {\n this.state = 'config';\n let timeStamp;\n\n // update configuration\n this.config = mergeDeep(this.config, userConfig) as Config;\n\n // sanity checks\n this.state = 'check';\n const error = this.#sanity(input);\n if (error) {\n log(error, input);\n this.emit('error');\n resolve({ face: [], body: [], hand: [], gesture: [], object: [], performance: this.performance, timestamp: now(), persons: [], error });\n }\n\n const timeStart = now();\n\n // configure backend if needed\n await backend.check(this);\n\n // load models if enabled\n await this.load();\n\n timeStamp = now();\n this.state = 'image';\n const img = await image.process(input, this.config) as { canvas: AnyCanvas, tensor: Tensor };\n this.process = img;\n this.performance.inputProcess = this.env.perfadd ? (this.performance.inputProcess || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n this.analyze('Get Image:');\n\n if (!img.tensor) {\n if (this.config.debug) log('could not convert input to tensor');\n this.emit('error');\n resolve({ face: [], body: [], hand: [], gesture: [], object: [], performance: this.performance, timestamp: now(), persons: [], error: 'could not convert input to tensor' });\n return;\n }\n this.emit('image');\n\n timeStamp = now();\n this.config.skipAllowed = await image.skip(this.config, img.tensor);\n if (!this.performance.totalFrames) this.performance.totalFrames = 0;\n if (!this.performance.cachedFrames) this.performance.cachedFrames = 0;\n (this.performance.totalFrames as number)++;\n if (this.config.skipAllowed) this.performance.cachedFrames++;\n this.performance.cacheCheck = this.env.perfadd ? (this.performance.cacheCheck || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n this.analyze('Check Changed:');\n\n // prepare where to store model results\n // keep them with weak typing as it can be promise or not\n let faceRes: FaceResult[] | Promise | never[] = [];\n let bodyRes: BodyResult[] | Promise | never[] = [];\n let handRes: HandResult[] | Promise | never[] = [];\n let objectRes: ObjectResult[] | Promise | never[] = [];\n\n // run face detection followed by all models that rely on face bounding box: face mesh, age, gender, emotion\n this.state = 'detect:face';\n if (this.config.async) {\n faceRes = this.config.face.enabled ? face.detectFace(this, img.tensor) : [];\n if (this.performance.face) delete this.performance.face;\n } else {\n timeStamp = now();\n faceRes = this.config.face.enabled ? await face.detectFace(this, img.tensor) : [];\n this.performance.face = this.env.perfadd ? (this.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n\n if (this.config.async && (this.config.body.maxDetected === -1 || this.config.hand.maxDetected === -1)) faceRes = await faceRes; // need face result for auto-detect number of hands or bodies\n\n // run body: can be posenet, blazepose, efficientpose, movenet\n this.analyze('Start Body:');\n this.state = 'detect:body';\n const bodyConfig = this.config.body.maxDetected === -1 ? mergeDeep(this.config, { body: { maxDetected: this.config.face.enabled ? 1 * (faceRes as FaceResult[]).length : 1 } }) : this.config; // autodetect number of bodies\n if (this.config.async) {\n if (this.config.body.modelPath?.includes('posenet')) bodyRes = this.config.body.enabled ? posenet.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('blazepose')) bodyRes = this.config.body.enabled ? blazepose.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('efficientpose')) bodyRes = this.config.body.enabled ? efficientpose.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('movenet')) bodyRes = this.config.body.enabled ? movenet.predict(img.tensor, bodyConfig) : [];\n if (this.performance.body) delete this.performance.body;\n } else {\n timeStamp = now();\n if (this.config.body.modelPath?.includes('posenet')) bodyRes = this.config.body.enabled ? await posenet.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('blazepose')) bodyRes = this.config.body.enabled ? await blazepose.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('efficientpose')) bodyRes = this.config.body.enabled ? await efficientpose.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('movenet')) bodyRes = this.config.body.enabled ? await movenet.predict(img.tensor, bodyConfig) : [];\n this.performance.body = this.env.perfadd ? (this.performance.body || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n this.analyze('End Body:');\n\n // run handpose\n this.analyze('Start Hand:');\n this.state = 'detect:hand';\n const handConfig = this.config.hand.maxDetected === -1 ? mergeDeep(this.config, { hand: { maxDetected: this.config.face.enabled ? 2 * (faceRes as FaceResult[]).length : 1 } }) : this.config; // autodetect number of hands\n if (this.config.async) {\n if (this.config.hand.detector?.modelPath?.includes('handdetect')) handRes = this.config.hand.enabled ? handpose.predict(img.tensor, handConfig) : [];\n else if (this.config.hand.detector?.modelPath?.includes('handtrack')) handRes = this.config.hand.enabled ? handtrack.predict(img.tensor, handConfig) : [];\n if (this.performance.hand) delete this.performance.hand;\n } else {\n timeStamp = now();\n if (this.config.hand.detector?.modelPath?.includes('handdetect')) handRes = this.config.hand.enabled ? await handpose.predict(img.tensor, handConfig) : [];\n else if (this.config.hand.detector?.modelPath?.includes('handtrack')) handRes = this.config.hand.enabled ? await handtrack.predict(img.tensor, handConfig) : [];\n this.performance.hand = this.env.perfadd ? (this.performance.hand || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n this.analyze('End Hand:');\n\n // run object detection\n this.analyze('Start Object:');\n this.state = 'detect:object';\n if (this.config.async) {\n if (this.config.object.modelPath?.includes('nanodet')) objectRes = this.config.object.enabled ? nanodet.predict(img.tensor, this.config) : [];\n else if (this.config.object.modelPath?.includes('centernet')) objectRes = this.config.object.enabled ? centernet.predict(img.tensor, this.config) : [];\n if (this.performance.object) delete this.performance.object;\n } else {\n timeStamp = now();\n if (this.config.object.modelPath?.includes('nanodet')) objectRes = this.config.object.enabled ? await nanodet.predict(img.tensor, this.config) : [];\n else if (this.config.object.modelPath?.includes('centernet')) objectRes = this.config.object.enabled ? await centernet.predict(img.tensor, this.config) : [];\n this.performance.object = this.env.perfadd ? (this.performance.object || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n this.analyze('End Object:');\n\n // if async wait for results\n this.state = 'detect:await';\n if (this.config.async) [faceRes, bodyRes, handRes, objectRes] = await Promise.all([faceRes, bodyRes, handRes, objectRes]);\n\n // run gesture analysis last\n this.state = 'detect:gesture';\n let gestureRes: GestureResult[] = [];\n if (this.config.gesture.enabled) {\n timeStamp = now();\n gestureRes = [...gesture.face(faceRes as FaceResult[]), ...gesture.body(bodyRes as BodyResult[]), ...gesture.hand(handRes as HandResult[]), ...gesture.iris(faceRes as FaceResult[])];\n if (!this.config.async) this.performance.gesture = this.env.perfadd ? (this.performance.gesture || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n else if (this.performance.gesture) delete this.performance.gesture;\n }\n\n this.performance.total = this.env.perfadd ? (this.performance.total || 0) + Math.trunc(now() - timeStart) : Math.trunc(now() - timeStart);\n const shape = this.process?.tensor?.shape || [];\n this.result = {\n face: faceRes as FaceResult[],\n body: bodyRes as BodyResult[],\n hand: handRes as HandResult[],\n gesture: gestureRes,\n object: objectRes as ObjectResult[],\n performance: this.performance,\n canvas: this.process.canvas,\n timestamp: Date.now(),\n error: null,\n get persons() { return persons.join(faceRes as FaceResult[], bodyRes as BodyResult[], handRes as HandResult[], gestureRes, shape); },\n };\n\n // finally dispose input tensor\n tf.dispose(img.tensor);\n\n // log('Result:', result);\n this.emit('detect');\n this.state = 'idle';\n resolve(this.result);\n });\n }\n}\n\n/** Class Human as default export */\n/* eslint no-restricted-exports: [\"off\", { \"restrictedNamedExports\": [\"default\"] }] */\nexport { Human as default };\n"], + "mappings": "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mB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,eAAiB,gBAAiB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,eAAgB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,eAAiB,gBAAiB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,eAAiB,gBAAiB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,eAAiB,gBAAiB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,eAAiB,eAAgB,EAClC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,eAAiB,gBAAiB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,cAAgB,gBAAiB,EAClC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,eAAiB,gBAAiB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,CACvC,EAEa,GAAwB,CACnC,IAAK,GAAI,IAAK,GAAI,EAAG,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,EACtJ,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAClJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GACrJ,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAC7I,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAClJ,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GACrJ,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GACpJ,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GACjJ,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,EAAG,IAC/I,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,EAAG,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IACnJ,IAAK,GAAI,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IACnJ,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,EAAG,IAAK,IAAK,GAAI,EAAG,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAC9I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GACtJ,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAClJ,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,EAAG,EAAG,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GACnJ,IAAK,IAAK,IAAK,GAAI,GAAI,EAAG,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GACrJ,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IACpJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,EAAG,IAClJ,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,GAAI,IAAK,IAAK,IAAK,IACnJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IACnJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,EAAG,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAC7I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAClJ,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAC7I,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,EAAG,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GACnJ,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GACpJ,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,GAAI,IAAK,GAAI,IAAK,EAAG,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAClJ,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAClJ,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,GAAI,GAAI,EAAG,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAChJ,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IACpJ,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GACrJ,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,GACpJ,IAAK,GAAI,IAAK,IAAK,EAAG,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,EAAG,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAC/I,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAC9I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GACpJ,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GACrJ,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IACpJ,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,EAAG,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,EACpJ,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAC9I,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,EAAG,GAAI,IAClJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAC9I,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAC9I,IAAK,GAAI,IAAK,EAAG,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAClJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,EAAG,IAAK,IAAK,IAAK,IAAK,IACpJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAA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AAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAA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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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", "names": [] } diff --git a/dist/human.esm.js b/dist/human.esm.js index 9d4247b1..d6ea9b52 100644 --- a/dist/human.esm.js +++ b/dist/human.esm.js @@ -218,519 +218,521 @@ __export(tfjs_esm_exports, { Abs: () => ao, Acos: () => nl, Acosh: () => sl, - AdadeltaOptimizer: () => pb, - AdagradOptimizer: () => hb, - AdamOptimizer: () => fb, - AdamaxOptimizer: () => mb, - Add: () => kr, - AddN: () => xa, + AdadeltaOptimizer: () => fb, + AdagradOptimizer: () => mb, + AdamOptimizer: () => gb, + AdamaxOptimizer: () => bb, + Add: () => Ir, + AddN: () => wa, All: () => rl, Any: () => al, - ArgMax: () => wa, + ArgMax: () => ka, ArgMin: () => il, Asin: () => ol, Asinh: () => ul, Atan: () => ll, Atan2: () => dl, Atanh: () => cl, - AvgPool: () => ka, - AvgPool3D: () => Hd, - AvgPool3DGrad: () => ag, - AvgPoolGrad: () => rg, - BackendWasm: () => ide, - BatchMatMul: () => Ia, + AvgPool: () => Ia, + AvgPool3D: () => qd, + AvgPool3DGrad: () => og, + AvgPoolGrad: () => ig, + BackendWasm: () => kde, + BatchMatMul: () => Sa, BatchToSpaceND: () => io, - Bincount: () => ig, - BroadcastArgs: () => og, - BroadcastTo: () => w$, - Callback: () => mW, - CallbackList: () => TL, - Cast: () => Sa, - Ceil: () => Ca, - ClipByValue: () => Ir, - Complex: () => qd, - ComplexAbs: () => jd, + Bincount: () => ug, + BroadcastArgs: () => lg, + BroadcastTo: () => A$, + Callback: () => CW, + CallbackList: () => zL, + Cast: () => Ca, + Ceil: () => Na, + ClipByValue: () => Sr, + Complex: () => jd, + ComplexAbs: () => Kd, Concat: () => oo, - Conv2D: () => Na, - Conv2DBackpropFilter: () => ug, - Conv2DBackpropInput: () => Ta, - Conv3D: () => Kd, - Conv3DBackpropFilterV2: () => lg, - Conv3DBackpropInputV2: () => cg, - Cos: () => $a, - Cosh: () => _a, + Conv2D: () => Ta, + Conv2DBackpropFilter: () => cg, + Conv2DBackpropInput: () => $a, + Conv3D: () => Xd, + Conv3DBackpropFilterV2: () => dg, + Conv3DBackpropInputV2: () => pg, + Cos: () => _a, + Cosh: () => Aa, CropAndResize: () => lo, + Cumprod: () => pl, Cumsum: () => uo, - CustomCallback: () => AL, - DataStorage: () => Wd, - DenseBincount: () => dg, + CustomCallback: () => BL, + DataStorage: () => Ud, + DenseBincount: () => hg, DepthToSpace: () => co, - DepthwiseConv2dNative: () => Aa, - DepthwiseConv2dNativeBackpropFilter: () => pg, - DepthwiseConv2dNativeBackpropInput: () => hg, - Diag: () => fg, - Dilation2D: () => Xd, - Dilation2DBackpropFilter: () => Xf, - Dilation2DBackpropInput: () => Kf, - ENV: () => jw, - EarlyStopping: () => gW, - Einsum: () => Yd, - Elu: () => Ra, - EluGrad: () => mg, - Environment: () => m$, + DepthwiseConv2dNative: () => Ea, + DepthwiseConv2dNativeBackpropFilter: () => fg, + DepthwiseConv2dNativeBackpropInput: () => mg, + Diag: () => gg, + Dilation2D: () => Yd, + Dilation2DBackpropFilter: () => Qf, + Dilation2DBackpropInput: () => Yf, + ENV: () => Jw, + EarlyStopping: () => NW, + Einsum: () => Qd, + Elu: () => Da, + EluGrad: () => bg, + Environment: () => S$, Equal: () => po, - Erf: () => pl, - Exp: () => Da, + Erf: () => hl, + Exp: () => Fa, ExpandDims: () => ho, Expm1: () => fo, - FFT: () => gg, - Fill: () => hl, + FFT: () => yg, + Fill: () => fl, FlipLeftRight: () => mo, - Floor: () => Fa, - FloorDiv: () => Oa, - FromPixels: () => hd, - FusedBatchNorm: () => Pa, - FusedConv2D: () => sa, - FusedDepthwiseConv2D: () => ra, - GPGPUContext: () => qf, + Floor: () => Oa, + FloorDiv: () => Pa, + FromPixels: () => fd, + FusedBatchNorm: () => za, + FusedConv2D: () => ra, + FusedDepthwiseConv2D: () => aa, + GPGPUContext: () => Kf, GatherNd: () => bo, GatherV2: () => go, - GraphModel: () => w4, + GraphModel: () => E4, Greater: () => yo, - GreaterEqual: () => za, - History: () => _L, - IFFT: () => bg, - Identity: () => Ma, - Imag: () => Qd, + GreaterEqual: () => Ma, + History: () => LL, + IFFT: () => vg, + Identity: () => La, + Imag: () => Zd, InputSpec: () => Dt, - IsFinite: () => fl, - IsInf: () => ml, - IsNan: () => gl, + IsFinite: () => ml, + IsInf: () => gl, + IsNan: () => bl, KernelBackend: () => tl, - LRN: () => Jd, - LRNGrad: () => vg, - LayerVariable: () => xL, + LRN: () => ep, + LRNGrad: () => wg, + LayerVariable: () => AL, LayersModel: () => pr, - LeakyRelu: () => La, + LeakyRelu: () => Ba, Less: () => vo, LessEqual: () => xo, - LinSpace: () => yg, - Log: () => Ba, - Log1p: () => bl, - LogSoftmax: () => k$, + LinSpace: () => xg, + Log: () => Va, + Log1p: () => yl, + LogSoftmax: () => E$, LogicalAnd: () => wo, - LogicalNot: () => yl, - LogicalOr: () => Zd, - MathBackendCPU: () => RS, - MathBackendWebGL: () => A1, - Max: () => Va, - MaxPool: () => Ua, - MaxPool3D: () => ep, - MaxPool3DGrad: () => wg, - MaxPoolGrad: () => xg, - MaxPoolWithArgmax: () => kg, - Maximum: () => Wa, - Mean: () => Ga, - Min: () => Ha, - Minimum: () => qa, - MirrorPad: () => ja, - Mod: () => vl, - MomentumOptimizer: () => gb, - Multinomial: () => Ig, - Multiply: () => Ka, + LogicalNot: () => vl, + LogicalOr: () => Jd, + MathBackendCPU: () => L0, + MathBackendWebGL: () => M1, + Max: () => Wa, + MaxPool: () => Ga, + MaxPool3D: () => tp, + MaxPool3DGrad: () => Ig, + MaxPoolGrad: () => kg, + MaxPoolWithArgmax: () => Sg, + Maximum: () => Ua, + Mean: () => Ha, + Min: () => qa, + Minimum: () => ja, + MirrorPad: () => Ka, + Mod: () => xl, + MomentumOptimizer: () => yb, + Multinomial: () => Cg, + Multiply: () => Xa, Neg: () => ko, NonMaxSuppressionV3: () => So, - NonMaxSuppressionV4: () => xl, + NonMaxSuppressionV4: () => wl, NonMaxSuppressionV5: () => Co, NotEqual: () => Io, - OP_SCOPE_SUFFIX: () => e_, + OP_SCOPE_SUFFIX: () => l_, OneHot: () => To, OnesLike: () => No, - Optimizer: () => $r, - OptimizerConstructors: () => Vr, + Optimizer: () => _r, + OptimizerConstructors: () => Wr, Pack: () => $o, - PadV2: () => Xa, - Pool: () => pde, - Pow: () => Ya, - Prelu: () => Qa, + PadV2: () => Ya, + Pool: () => $de, + Pow: () => Qa, + Prelu: () => Za, Prod: () => _o, - RMSPropOptimizer: () => bb, - RNN: () => _r, - Range: () => wl, - Rank: () => H$, - Real: () => tp, - RealDiv: () => Ea, - Reciprocal: () => kl, - Reduction: () => YF, - Relu: () => Za, - Relu6: () => ei, + RMSPropOptimizer: () => vb, + RNN: () => Ar, + Range: () => kl, + Rank: () => e_, + Real: () => np, + RealDiv: () => Ra, + Reciprocal: () => Il, + Reduction: () => oO, + Relu: () => Ja, + Relu6: () => ti, Reshape: () => Ao, - ResizeBilinear: () => Ja, - ResizeBilinearGrad: () => Cg, - ResizeNearestNeighbor: () => Il, - ResizeNearestNeighborGrad: () => Sg, + ResizeBilinear: () => ei, + ResizeBilinearGrad: () => Tg, + ResizeNearestNeighbor: () => Sl, + ResizeNearestNeighborGrad: () => Ng, Reverse: () => Eo, RotateWithOffset: () => Ho, Round: () => Ro, - Rsqrt: () => ti, - SGDOptimizer: () => kp, + Rsqrt: () => ni, + SGDOptimizer: () => Ip, ScatterNd: () => Do, Select: () => Fo, - Selu: () => Sl, - Sequential: () => Vb, - Sigmoid: () => si, - Sign: () => Cl, - Sin: () => ni, + Selu: () => Cl, + Sequential: () => Ub, + Sigmoid: () => ri, + Sign: () => Nl, + Sin: () => si, Sinh: () => Po, Slice: () => Oo, - Softmax: () => ii, - Softplus: () => Nl, + Softmax: () => oi, + Softplus: () => Tl, SpaceToBatchND: () => zo, - SparseFillEmptyRows: () => np, - SparseReshape: () => Tl, - SparseSegmentMean: () => sp, - SparseSegmentSum: () => rp, - SparseToDense: () => ap, + SparseFillEmptyRows: () => sp, + SparseReshape: () => $l, + SparseSegmentMean: () => rp, + SparseSegmentSum: () => ap, + SparseToDense: () => ip, SplitV: () => Mo, - Sqrt: () => ri, - Square: () => $l, - SquaredDifference: () => oi, - Step: () => di, + Sqrt: () => ai, + Square: () => _l, + SquaredDifference: () => ui, + Step: () => pi, StridedSlice: () => Lo, - StringNGrams: () => ip, - StringSplit: () => Ng, - StringToHashBucketFast: () => Tg, - Sub: () => ui, - Sum: () => ai, + StringNGrams: () => op, + StringSplit: () => $g, + StringToHashBucketFast: () => _g, + Sub: () => li, + Sum: () => ii, SymbolicTensor: () => $s, Tan: () => Bo, - Tanh: () => li, + Tanh: () => ci, Tensor: () => et, TensorBuffer: () => Vt, - Tile: () => Sr, + Tile: () => Cr, TopK: () => Vo, Transform: () => Wo, - Transpose: () => ci, - Unique: () => $g, + Transpose: () => di, + Unique: () => Ag, Unpack: () => Uo, - UnsortedSegmentSum: () => op, - Variable: () => md, + UnsortedSegmentSum: () => up, + Variable: () => gd, ZerosLike: () => Go, - _FusedMatMul: () => na, + _FusedMatMul: () => sa, abs: () => Mt, - acos: () => OA, - acosh: () => zA, + acos: () => GA, + acosh: () => qA, add: () => ie, - addN: () => LA, - all: () => Bk, - any: () => cm, + addN: () => KA, + all: () => qk, + any: () => pm, argMax: () => Gu, - argMin: () => GA, - asin: () => qA, - asinh: () => KA, - atan: () => YA, - atan2: () => ZA, - atanh: () => eE, - avgPool: () => Wg, - avgPool3d: () => Gk, - backend: () => $A, - backend_util: () => N, - basicLSTMCell: () => Ade, + argMin: () => JA, + asin: () => tE, + asinh: () => sE, + atan: () => aE, + atan2: () => oE, + atanh: () => lE, + avgPool: () => Gg, + avgPool3d: () => Yk, + backend: () => zA, + backend_util: () => S, + basicLSTMCell: () => qde, batchNorm: () => qu, - batchNorm2d: () => vE, - batchNorm3d: () => wE, - batchNorm4d: () => IE, - batchToSpaceND: () => Ug, - bincount: () => Hk, - booleanMaskAsync: () => rpe, - broadcastArgs: () => NE, - broadcastTo: () => td, + batchNorm2d: () => $E, + batchNorm3d: () => AE, + batchNorm4d: () => RE, + batchToSpaceND: () => Hg, + bincount: () => Qk, + booleanMaskAsync: () => xpe, + broadcastArgs: () => OE, + broadcastTo: () => nd, broadcast_util: () => qo, - browser: () => xk, + browser: () => Nk, buffer: () => De, - callbacks: () => fpe, + callbacks: () => Ape, cast: () => ce, - ceil: () => _E, - clipByValue: () => Bn, + ceil: () => ME, + clipByValue: () => Vn, clone: () => lr, - complex: () => aa, + complex: () => ia, concat: () => Ft, - concat1d: () => RE, - concat2d: () => FE, - concat3d: () => PE, - concat4d: () => ME, - constraints: () => $M, - conv1d: () => qk, - conv2d: () => ua, - conv2dTranspose: () => jk, - conv3d: () => Kk, - conv3dTranspose: () => qE, - copyRegisteredKernels: () => mde, - cos: () => Hg, - cosh: () => Yk, - cosineWindow: () => wI, - cumsum: () => Qk, + concat1d: () => VE, + concat2d: () => UE, + concat3d: () => HE, + concat4d: () => jE, + constraints: () => MM, + conv1d: () => Zk, + conv2d: () => la, + conv2dTranspose: () => Jk, + conv3d: () => eI, + conv3dTranspose: () => tR, + copyRegisteredKernels: () => Ede, + cos: () => jg, + cosh: () => nI, + cosineWindow: () => TI, + cumprod: () => aR, + cumsum: () => sI, customGrad: () => js, - data: () => k4, - denseBincount: () => QE, - deprecationWarn: () => Mk, - depthToSpace: () => JE, - depthwiseConv2d: () => pp, - deregisterOp: () => gpe, - device_util: () => cp, - diag: () => Ede, - dilation2d: () => sR, - disableDeprecationWarnings: () => vde, + data: () => R4, + denseBincount: () => uR, + deprecationWarn: () => Gk, + depthToSpace: () => cR, + depthwiseConv2d: () => hp, + deregisterOp: () => Rpe, + device_util: () => dp, + diag: () => jde, + dilation2d: () => fR, + disableDeprecationWarnings: () => Ode, dispose: () => Re, - disposeVariables: () => xde, + disposeVariables: () => Pde, div: () => xe, - divNoNan: () => uR, - dot: () => Rde, - dropout: () => H3, - einsum: () => dR, - elu: () => hp, - enableDebugMode: () => yde, - enableProdMode: () => bde, - enclosingPowerOfTwo: () => q3, + divNoNan: () => vR, + dot: () => Kde, + dropout: () => nF, + einsum: () => kR, + elu: () => fp, + enableDebugMode: () => Fde, + enableProdMode: () => Dde, + enclosingPowerOfTwo: () => sF, engine: () => Ss, env: () => X, - equal: () => qn, - erf: () => fR, - exp: () => jn, - expandDims: () => On, - expm1: () => yR, - eye: () => Zk, - fft: () => ob, - fill: () => Fl, - findBackend: () => Tde, - findBackendFactory: () => $de, - floor: () => fp, - floorDiv: () => Lk, - forceHalfFloat: () => DX, - fused: () => da, + equal: () => Kn, + erf: () => CR, + exp: () => Xn, + expandDims: () => Pn, + expm1: () => _R, + eye: () => rI, + fft: () => lb, + fill: () => Ol, + findBackend: () => Ude, + findBackendFactory: () => Gde, + floor: () => mp, + floorDiv: () => Hk, + forceHalfFloat: () => GX, + fused: () => pa, gather: () => ju, - gatherND: () => W3, - gather_util: () => kk, - getBackend: () => Cde, - getGradient: () => Jv, - getKernel: () => Yf, - getKernelsForBackend: () => Qf, - getThreadsCount: () => Npe, - gpgpu_util: () => wK, - grad: () => Ode, - grads: () => Pde, + gatherND: () => J3, + gather_util: () => $k, + getBackend: () => Vde, + getGradient: () => nx, + getKernel: () => Zf, + getKernelsForBackend: () => Jf, + getThreadsCount: () => Wpe, + gpgpu_util: () => RK, + grad: () => Qde, + grads: () => Zde, greater: () => Wn, greaterEqual: () => jo, - ifft: () => kd, - imag: () => qg, - image: () => ds, - inTopKAsync: () => ipe, - initializers: () => PM, - input: () => CB, - io: () => _n, - irfft: () => fI, - isFinite: () => Dde, - isInf: () => Fde, - isNaN: () => _R, + ifft: () => Id, + imag: () => Kg, + image: () => qn, + inTopKAsync: () => kpe, + initializers: () => qM, + input: () => OB, + io: () => En, + irfft: () => xI, + isFinite: () => Xde, + isInf: () => Yde, + isNaN: () => BR, keep: () => Ht, kernel_impls: () => xs, - layers: () => yL, - leakyRelu: () => jg, - less: () => Jk, + layers: () => $L, + leakyRelu: () => Xg, + less: () => aI, lessEqual: () => Ko, - linalg: () => AO, - linspace: () => DR, - loadGraphModel: () => bpe, - loadLayersModel: () => ppe, - localResponseNormalization: () => OR, - log: () => Kn, - log1p: () => Kg, - logSigmoid: () => Lde, - logSoftmax: () => eI, - logSumExp: () => XR, + linalg: () => VO, + linspace: () => GR, + loadGraphModel: () => Dpe, + loadLayersModel: () => $pe, + localResponseNormalization: () => qR, + log: () => Yn, + log1p: () => Yg, + logSigmoid: () => tpe, + logSoftmax: () => iI, + logSumExp: () => iD, logicalAnd: () => Ds, - logicalNot: () => Qg, - logicalOr: () => rI, - logicalXor: () => Bde, - losses: () => lpe, + logicalNot: () => Jg, + logicalOr: () => cI, + logicalXor: () => npe, + losses: () => Cpe, matMul: () => We, - math: () => Q_, + math: () => iA, max: () => As, - maxPool: () => Zg, - maxPool3d: () => aI, - maxPoolWithArgmax: () => sD, - maximum: () => Tr, - mean: () => It, - memory: () => lm, - meshgrid: () => Vde, - metrics: () => KV, - min: () => pm, - minimum: () => gp, - mirrorPad: () => lD, - mod: () => dD, - model: () => cpe, - models: () => cW, - moments: () => Jg, - movingAverage: () => ape, + maxPool: () => eb, + maxPool3d: () => dI, + maxPoolWithArgmax: () => fD, + maximum: () => $r, + mean: () => St, + memory: () => dm, + meshgrid: () => spe, + metrics: () => rW, + min: () => fm, + minimum: () => bp, + mirrorPad: () => xD, + mod: () => kD, + model: () => Npe, + models: () => xW, + moments: () => tb, + movingAverage: () => wpe, mul: () => V, - multiRNNCell: () => Wde, - multinomial: () => gD, + multiRNNCell: () => rpe, + multinomial: () => TD, neg: () => kt, - nextFrame: () => RO, - norm: () => vI, + nextFrame: () => OI, + norm: () => CI, notEqual: () => Ku, - oneHot: () => yd, - ones: () => zn, - onesLike: () => Xn, + oneHot: () => vd, + ones: () => Mn, + onesLike: () => Qn, op: () => L, - outerProduct: () => Ude, - pad: () => pi, - pad1d: () => Gde, - pad2d: () => Hde, - pad3d: () => qde, - pad4d: () => jde, - pool: () => Kde, - pow: () => ca, - prelu: () => tb, - print: () => F_, - prod: () => iI, - profile: () => wde, - rand: () => Xde, - randomGamma: () => Yde, - randomNormal: () => zD, - randomUniform: () => Pl, + outerProduct: () => ape, + pad: () => hi, + pad1d: () => ipe, + pad2d: () => ope, + pad3d: () => upe, + pad4d: () => lpe, + pool: () => cpe, + pow: () => da, + prelu: () => sb, + print: () => U_, + prod: () => pI, + profile: () => zde, + rand: () => dpe, + randomGamma: () => ppe, + randomNormal: () => KD, + randomUniform: () => zl, range: () => Xu, - ready: () => Sde, - real: () => xd, - reciprocal: () => VD, - registerBackend: () => dp, - registerCallbackConstructor: () => hpe, - registerGradient: () => S$, - registerKernel: () => _l, - registerOp: () => mpe, - regularizers: () => dW, + ready: () => Bde, + real: () => wd, + reciprocal: () => ZD, + registerBackend: () => pp, + registerCallbackConstructor: () => _pe, + registerGradient: () => D$, + registerKernel: () => Al, + registerOp: () => Epe, + regularizers: () => wW, relu: () => Xs, - relu6: () => oI, - removeBackend: () => Nde, + relu6: () => hI, + removeBackend: () => Wde, reshape: () => G, - reverse: () => Yn, - reverse1d: () => Qde, - reverse2d: () => Zde, - reverse3d: () => Jde, - reverse4d: () => epe, - rfft: () => ub, - round: () => uI, - rsqrt: () => lI, + reverse: () => Zn, + reverse1d: () => hpe, + reverse2d: () => fpe, + reverse3d: () => mpe, + reverse4d: () => gpe, + rfft: () => cb, + round: () => fI, + rsqrt: () => mI, scalar: () => Ie, - scatterND: () => M3, - scatter_util: () => Sk, - selu: () => cI, - separableConv2d: () => JD, - sequential: () => dpe, + scatterND: () => X3, + scatter_util: () => Ak, + selu: () => gI, + separableConv2d: () => c3, + sequential: () => Tpe, serialization: () => ae, - setBackend: () => Ide, - setPlatform: () => _de, - setThreadsCount: () => Cpe, - setWasmPath: () => Ipe, - setWasmPaths: () => Spe, - setWebGLContext: () => p5, - setdiff1dAsync: () => t3, - shared: () => Yy, + setBackend: () => Lde, + setPlatform: () => Hde, + setThreadsCount: () => Vpe, + setWasmPath: () => Lpe, + setWasmPaths: () => Bpe, + setWebGLContext: () => S5, + setdiff1dAsync: () => p3, + shared: () => Zy, sigmoid: () => qs, - sign: () => s3, - signal: () => upe, - sin: () => dI, - sinh: () => pI, + sign: () => f3, + signal: () => Spe, + sin: () => bI, + sinh: () => yI, slice: () => He, - slice1d: () => rb, - slice2d: () => hI, - slice3d: () => ab, - slice4d: () => wd, + slice1d: () => ib, + slice2d: () => vI, + slice3d: () => ob, + slice4d: () => kd, slice_util: () => wt, - softmax: () => ib, - softplus: () => Ol, - spaceToBatchND: () => eb, - sparse: () => Vc, - sparseToDense: () => xI, - spectral: () => ope, - split: () => Ln, - sqrt: () => ln, + softmax: () => ub, + softplus: () => Pl, + spaceToBatchND: () => nb, + sparse: () => Wc, + sparseToDense: () => NI, + spectral: () => Ipe, + split: () => Bn, + sqrt: () => dn, square: () => ct, - squaredDifference: () => mI, + squaredDifference: () => wI, squeeze: () => mr, - stack: () => Qn, - step: () => bp, - stridedSlice: () => k3, - string: () => Pf, + stack: () => Jn, + step: () => yp, + stridedSlice: () => D3, + string: () => Mf, sub: () => ge, - sum: () => ye, - sumOutType: () => lp, - tan: () => S3, + sum: () => ve, + sumOutType: () => cp, + tan: () => O3, tanh: () => Hu, - tensor: () => hs, - tensor1d: () => Qt, - tensor2d: () => ji, - tensor3d: () => sA, - tensor4d: () => tpe, - tensor5d: () => npe, - tensor6d: () => spe, + tensor: () => fs, + tensor1d: () => Zt, + tensor2d: () => Ki, + tensor3d: () => pA, + tensor4d: () => bpe, + tensor5d: () => ype, + tensor6d: () => vpe, tensor_util: () => _s, - test_util: () => xA, + test_util: () => _A, tidy: () => j, - tile: () => cs, - time: () => kde, - topk: () => N3, - train: () => Fi, + tile: () => ps, + time: () => Mde, + topk: () => z3, + train: () => Oi, transpose: () => qe, - truncatedNormal: () => lb, - unique: () => cx, - unregisterGradient: () => fde, - unregisterKernel: () => hde, - unsortedSegmentSum: () => A3, + truncatedNormal: () => db, + unique: () => hx, + unregisterGradient: () => Ade, + unregisterKernel: () => _de, + unsortedSegmentSum: () => V3, unstack: () => Fs, - upcastType: () => yn, - util: () => w, - valueAndGrad: () => zde, - valueAndGrads: () => Mde, - variable: () => R3, - variableGrads: () => MR, - version: () => $pe, - version_converter: () => ype, - version_core: () => gde, - version_cpu: () => vpe, - version_layers: () => t0, - version_wasm: () => Tpe, - version_webgl: () => xpe, - webgl: () => wpe, - webgl_util: () => d5, - webgpu: () => Hie, + upcastType: () => cn, + util: () => x, + valueAndGrad: () => Jde, + valueAndGrads: () => epe, + variable: () => U3, + variableGrads: () => XR, + version: () => Gpe, + version_converter: () => Fpe, + version_core: () => Rde, + version_cpu: () => Ope, + version_layers: () => uS, + version_wasm: () => Upe, + version_webgl: () => Ppe, + webgl: () => zpe, + webgl_util: () => I5, + webgpu: () => roe, where: () => vn, - whereAsync: () => bI, + whereAsync: () => II, zeros: () => $t, zerosLike: () => je }); -var AT = Object.create; -var Bd = Object.defineProperty; -var ET = Object.getOwnPropertyDescriptor; -var Ow = Object.getOwnPropertyNames; -var RT = Object.getPrototypeOf; -var DT = Object.prototype.hasOwnProperty; -var FT = (e) => Bd(e, "__esModule", { value: true }); +var LT = Object.create; +var Vd = Object.defineProperty; +var BT = Object.getOwnPropertyDescriptor; +var Vw = Object.getOwnPropertyNames; +var VT = Object.getPrototypeOf; +var WT = Object.prototype.hasOwnProperty; +var UT = (e) => Vd(e, "__esModule", { value: true }); var zt = (e, t) => function() { - return t || (0, e[Ow(e)[0]])((t = { exports: {} }).exports, t), t.exports; + return t || (0, e[Vw(e)[0]])((t = { exports: {} }).exports, t), t.exports; }; var Ae = (e, t) => { for (var n in t) - Bd(e, n, { get: t[n], enumerable: true }); + Vd(e, n, { get: t[n], enumerable: true }); }; -var OT = (e, t, n, s) => { +var GT = (e, t, n, s) => { if (t && typeof t == "object" || typeof t == "function") - for (let r of Ow(t)) - !DT.call(e, r) && (n || r !== "default") && Bd(e, r, { get: () => t[r], enumerable: !(s = ET(t, r)) || s.enumerable }); + for (let r of Vw(t)) + !WT.call(e, r) && (n || r !== "default") && Vd(e, r, { get: () => t[r], enumerable: !(s = BT(t, r)) || s.enumerable }); return e; }; -var ya = (e, t) => OT(FT(Bd(e != null ? AT(RT(e)) : {}, "default", !t && e && e.__esModule ? { get: () => e.default, enumerable: true } : { value: e, enumerable: true })), e); -var PT = zt({ "src/node_modules/long/src/long.js"(e, t) { +var va = (e, t) => GT(UT(Vd(e != null ? LT(VT(e)) : {}, "default", !t && e && e.__esModule ? { get: () => e.default, enumerable: true } : { value: e, enumerable: true })), e); +var HT = zt({ "src/node_modules/long/src/long.js"(e, t) { t.exports = s; var n = null; try { @@ -753,10 +755,10 @@ var PT = zt({ "src/node_modules/long/src/long.js"(e, t) { s.fromInt = o; function u(F, $) { if (isNaN(F)) - return $ ? x : v; + return $ ? w : v; if ($) { if (F < 0) - return x; + return w; if (F >= g) return A; } else { @@ -802,14 +804,14 @@ var PT = zt({ "src/node_modules/long/src/long.js"(e, t) { s.fromValue = d; var h = 1 << 16, f = 1 << 24, m = h * h, g = m * m, b = g / 2, y = o(f), v = o(0); s.ZERO = v; - var x = o(0, true); - s.UZERO = x; + var w = o(0, true); + s.UZERO = w; var k = o(1); s.ONE = k; - var C = o(1, true); - s.UONE = C; - var T = o(-1); - s.NEG_ONE = T; + var T = o(1, true); + s.UONE = T; + var N = o(-1); + s.NEG_ONE = N; var E = l(-1, 2147483647, false); s.MAX_VALUE = E; var A = l(-1, -1, true); @@ -920,24 +922,24 @@ var PT = zt({ "src/node_modules/long/src/long.js"(e, t) { return l(z, n.get_high(), this.unsigned); } if (this.isZero()) - return this.unsigned ? x : v; + return this.unsigned ? w : v; var W, q, K; if (this.unsigned) { if ($.unsigned || ($ = $.toUnsigned()), $.gt(this)) - return x; + return w; if ($.gt(this.shru(1))) - return C; - K = x; + return T; + K = w; } else { if (this.eq(P)) { - if ($.eq(k) || $.eq(T)) + if ($.eq(k) || $.eq(N)) return P; if ($.eq(P)) return k; var Y = this.shr(1); - return W = Y.div($).shl(1), W.eq(v) ? $.isNegative() ? k : T : (q = this.sub($.mul(W)), K = W.add(q.div($)), K); + return W = Y.div($).shl(1), W.eq(v) ? $.isNegative() ? k : N : (q = this.sub($.mul(W)), K = W.add(q.div($)), K); } else if ($.eq(P)) - return this.unsigned ? x : v; + return this.unsigned ? w : v; if (this.isNegative()) return $.isNegative() ? this.neg().div($.neg()) : this.neg().div($).neg(); if ($.isNegative()) @@ -998,11 +1000,11 @@ var PT = zt({ "src/node_modules/long/src/long.js"(e, t) { return new s($[4] << 24 | $[5] << 16 | $[6] << 8 | $[7], $[0] << 24 | $[1] << 16 | $[2] << 8 | $[3], z); }; } }); -var zT = zt({ "(disabled):src/node_modules/node-fetch/browser.js"() { +var qT = zt({ "(disabled):src/node_modules/node-fetch/browser.js"() { } }); -var MT = zt({ "(disabled):util"() { +var jT = zt({ "(disabled):util"() { } }); -var LT = zt({ "src/node_modules/seedrandom/lib/alea.js"(e, t) { +var KT = zt({ "src/node_modules/seedrandom/lib/alea.js"(e, t) { (function(n, s, r) { function a(l) { var c = this, p = u(); @@ -1041,7 +1043,7 @@ var LT = zt({ "src/node_modules/seedrandom/lib/alea.js"(e, t) { }) : this.alea = o; })(e, typeof t == "object" && t, typeof define == "function" && define); } }); -var BT = zt({ "src/node_modules/seedrandom/lib/xor128.js"(e, t) { +var XT = zt({ "src/node_modules/seedrandom/lib/xor128.js"(e, t) { (function(n, s, r) { function a(u) { var l = this, c = ""; @@ -1073,7 +1075,7 @@ var BT = zt({ "src/node_modules/seedrandom/lib/xor128.js"(e, t) { }) : this.xor128 = o; })(e, typeof t == "object" && t, typeof define == "function" && define); } }); -var VT = zt({ "src/node_modules/seedrandom/lib/xorwow.js"(e, t) { +var YT = zt({ "src/node_modules/seedrandom/lib/xorwow.js"(e, t) { (function(n, s, r) { function a(u) { var l = this, c = ""; @@ -1105,7 +1107,7 @@ var VT = zt({ "src/node_modules/seedrandom/lib/xorwow.js"(e, t) { }) : this.xorwow = o; })(e, typeof t == "object" && t, typeof define == "function" && define); } }); -var WT = zt({ "src/node_modules/seedrandom/lib/xorshift7.js"(e, t) { +var QT = zt({ "src/node_modules/seedrandom/lib/xorshift7.js"(e, t) { (function(n, s, r) { function a(u) { var l = this; @@ -1151,7 +1153,7 @@ var WT = zt({ "src/node_modules/seedrandom/lib/xorshift7.js"(e, t) { }) : this.xorshift7 = o; })(e, typeof t == "object" && t, typeof define == "function" && define); } }); -var UT = zt({ "src/node_modules/seedrandom/lib/xor4096.js"(e, t) { +var ZT = zt({ "src/node_modules/seedrandom/lib/xor4096.js"(e, t) { (function(n, s, r) { function a(u) { var l = this; @@ -1191,7 +1193,7 @@ var UT = zt({ "src/node_modules/seedrandom/lib/xor4096.js"(e, t) { }) : this.xor4096 = o; })(e, typeof t == "object" && t, typeof define == "function" && define); } }); -var GT = zt({ "src/node_modules/seedrandom/lib/tychei.js"(e, t) { +var JT = zt({ "src/node_modules/seedrandom/lib/tychei.js"(e, t) { (function(n, s, r) { function a(u) { var l = this, c = ""; @@ -1223,15 +1225,15 @@ var GT = zt({ "src/node_modules/seedrandom/lib/tychei.js"(e, t) { }) : this.tychei = o; })(e, typeof t == "object" && t, typeof define == "function" && define); } }); -var HT = zt({ "(disabled):crypto"() { +var e$ = zt({ "(disabled):crypto"() { } }); -var qT = zt({ "src/node_modules/seedrandom/seedrandom.js"(e, t) { +var t$ = zt({ "src/node_modules/seedrandom/seedrandom.js"(e, t) { (function(n, s, r) { var a = 256, i = 6, o = 52, u = "random", l = r.pow(a, i), c = r.pow(2, o), p = c * 2, d = a - 1, h; - function f(k, C, T) { + function f(k, T, N) { var E = []; - C = C == true ? { entropy: true } : C || {}; - var A = y(b(C.entropy ? [k, x(s)] : k == null ? v() : k, 3), E), P = new m(E), R = function() { + T = T == true ? { entropy: true } : T || {}; + var A = y(b(T.entropy ? [k, w(s)] : k == null ? v() : k, 3), E), P = new m(E), R = function() { for (var F = P.g(i), $ = l, z = 0; F < c; ) F = (F + z) * a, $ *= a, z = P.g(1); for (; F >= p; ) @@ -1242,58 +1244,58 @@ var qT = zt({ "src/node_modules/seedrandom/seedrandom.js"(e, t) { return P.g(4) | 0; }, R.quick = function() { return P.g(4) / 4294967296; - }, R.double = R, y(x(P.S), s), (C.pass || T || function(F, $, z, W) { + }, R.double = R, y(w(P.S), s), (T.pass || N || function(F, $, z, W) { return W && (W.S && g(W, P), F.state = function() { return g(P, {}); }), z ? (r[u] = F, $) : F; - })(R, A, "global" in C ? C.global : this == r, C.state); + })(R, A, "global" in T ? T.global : this == r, T.state); } function m(k) { - var C, T = k.length, E = this, A = 0, P = E.i = E.j = 0, R = E.S = []; - for (T || (k = [T++]); A < a; ) + var T, N = k.length, E = this, A = 0, P = E.i = E.j = 0, R = E.S = []; + for (N || (k = [N++]); A < a; ) R[A] = A++; for (A = 0; A < a; A++) - R[A] = R[P = d & P + k[A % T] + (C = R[A])], R[P] = C; + R[A] = R[P = d & P + k[A % N] + (T = R[A])], R[P] = T; (E.g = function(F) { for (var $, z = 0, W = E.i, q = E.j, K = E.S; F--; ) $ = K[W = d & W + 1], z = z * a + K[d & (K[W] = K[q = d & q + $]) + (K[q] = $)]; return E.i = W, E.j = q, z; })(a); } - function g(k, C) { - return C.i = k.i, C.j = k.j, C.S = k.S.slice(), C; + function g(k, T) { + return T.i = k.i, T.j = k.j, T.S = k.S.slice(), T; } - function b(k, C) { - var T = [], E = typeof k, A; - if (C && E == "object") + function b(k, T) { + var N = [], E = typeof k, A; + if (T && E == "object") for (A in k) try { - T.push(b(k[A], C - 1)); + N.push(b(k[A], T - 1)); } catch (P) { } - return T.length ? T : E == "string" ? k : k + "\0"; + return N.length ? N : E == "string" ? k : k + "\0"; } - function y(k, C) { - for (var T = k + "", E, A = 0; A < T.length; ) - C[d & A] = d & (E ^= C[d & A] * 19) + T.charCodeAt(A++); - return x(C); + function y(k, T) { + for (var N = k + "", E, A = 0; A < N.length; ) + T[d & A] = d & (E ^= T[d & A] * 19) + N.charCodeAt(A++); + return w(T); } function v() { try { var k; - return h && (k = h.randomBytes) ? k = k(a) : (k = new Uint8Array(a), (n.crypto || n.msCrypto).getRandomValues(k)), x(k); + return h && (k = h.randomBytes) ? k = k(a) : (k = new Uint8Array(a), (n.crypto || n.msCrypto).getRandomValues(k)), w(k); } catch (E) { - var C = n.navigator, T = C && C.plugins; - return [+new Date(), n, T, n.screen, x(s)]; + var T = n.navigator, N = T && T.plugins; + return [+new Date(), n, N, n.screen, w(s)]; } } - function x(k) { + function w(k) { return String.fromCharCode.apply(0, k); } if (y(r.random(), s), typeof t == "object" && t.exports) { t.exports = f; try { - h = HT(); + h = e$(); } catch (k) { } } else @@ -1302,70 +1304,70 @@ var qT = zt({ "src/node_modules/seedrandom/seedrandom.js"(e, t) { }) : r["seed" + u] = f; })(typeof self != "undefined" ? self : e, [], Math); } }); -var Vd = zt({ "src/node_modules/seedrandom/index.js"(e, t) { - var n = LT(), s = BT(), r = VT(), a = WT(), i = UT(), o = GT(), u = qT(); +var Wd = zt({ "src/node_modules/seedrandom/index.js"(e, t) { + var n = KT(), s = XT(), r = YT(), a = QT(), i = ZT(), o = JT(), u = t$(); u.alea = n, u.xor128 = s, u.xorwow = r, u.xorshift7 = a, u.xor4096 = i, u.tychei = o, t.exports = u; } }); -var Pw = zt({ "(disabled):src/node_modules/string_decoder/index.js"() { +var Ww = zt({ "(disabled):src/node_modules/string_decoder/index.js"() { } }); -var Jm = zt({ "(disabled):fs"() { +var tg = zt({ "(disabled):fs"() { } }); -var cd = zt({ "(disabled):path"() { +var dd = zt({ "(disabled):path"() { } }); -var jT = zt({ "(disabled):worker_threads"() { +var n$ = zt({ "(disabled):worker_threads"() { } }); -var KT = zt({ "(disabled):perf_hooks"() { +var s$ = zt({ "(disabled):perf_hooks"() { } }); -var XT = zt({ "(disabled):os"() { +var r$ = zt({ "(disabled):os"() { } }); -var YT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js"(e, t) { +var a$ = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js"(e, t) { var n = (() => { var s = typeof document != "undefined" && document.currentScript ? document.currentScript.src : void 0; return typeof __filename != "undefined" && (s = s || __filename), function(r) { r = r || {}; function a() { - return Ce.buffer != tn && ns(Ce.buffer), ac; + return Ce.buffer != nn && rs(Ce.buffer), ic; } function i() { - return Ce.buffer != tn && ns(Ce.buffer), ic; + return Ce.buffer != nn && rs(Ce.buffer), oc; } function o() { - return Ce.buffer != tn && ns(Ce.buffer), pu; + return Ce.buffer != nn && rs(Ce.buffer), pu; } function u() { - return Ce.buffer != tn && ns(Ce.buffer), oc; + return Ce.buffer != nn && rs(Ce.buffer), uc; } function l() { - return Ce.buffer != tn && ns(Ce.buffer), uc; + return Ce.buffer != nn && rs(Ce.buffer), lc; } function c() { - return Ce.buffer != tn && ns(Ce.buffer), lc; + return Ce.buffer != nn && rs(Ce.buffer), cc; } function p() { - return Ce.buffer != tn && ns(Ce.buffer), cc; + return Ce.buffer != nn && rs(Ce.buffer), dc; } var d = typeof r != "undefined" ? r : {}, h, f; - d.ready = new Promise(function(S, D) { - h = S, f = D; + d.ready = new Promise(function(C, D) { + h = C, f = D; }); var m; typeof process != "undefined" && process.listeners && (m = { uncaughtException: process.listeners("uncaughtException"), unhandledRejection: process.listeners("unhandledRejection") }); - var g = Object.assign({}, d), b = [], y = "./this.program", v = (S, D) => { + var g = Object.assign({}, d), b = [], y = "./this.program", v = (C, D) => { throw D; - }, x = typeof window == "object", k = typeof importScripts == "function", C = typeof process == "object" && typeof process.versions == "object" && typeof process.versions.node == "string", T = d.ENVIRONMENT_IS_PTHREAD || false, E = ""; - function A(S) { - return d.locateFile ? d.locateFile(S, E) : E + S; + }, w = typeof window == "object", k = typeof importScripts == "function", T = typeof process == "object" && typeof process.versions == "object" && typeof process.versions.node == "string", N = d.ENVIRONMENT_IS_PTHREAD || false, E = ""; + function A(C) { + return d.locateFile ? d.locateFile(C, E) : E + C; } var P, R, F, $; - function z(S) { - if (S instanceof wu) + function z(C) { + if (C instanceof wu) return; - ee("exiting due to exception: " + S); + ee("exiting due to exception: " + C); } var W, q, K; - if (C) { - k ? E = cd().dirname(E) + "/" : E = __dirname + "/", K = () => { - q || (W = Jm(), q = cd()); + if (T) { + k ? E = dd().dirname(E) + "/" : E = __dirname + "/", K = () => { + q || (W = tg(), q = dd()); }, P = function(B, Q) { return K(), B = q.normalize(B), W.readFileSync(B, Q ? void 0 : "utf8"); }, F = (D) => { @@ -1381,59 +1383,59 @@ var YT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js }), process.on("unhandledRejection", function(D) { throw D; }), v = (D, B) => { - if (Or()) + if (Pr()) throw process.exitCode = D, B; z(B), process.exit(D); }, d.inspect = function() { return "[Emscripten Module object]"; }; - let S; + let C; try { - S = jT(); + C = n$(); } catch (D) { throw console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'), D; } - global.Worker = S.Worker; + global.Worker = C.Worker; } else - (x || k) && (k ? E = self.location.href : typeof document != "undefined" && document.currentScript && (E = document.currentScript.src), typeof s != "undefined" && s && (E = s), E.indexOf("blob:") !== 0 ? E = E.substr(0, E.replace(/[?#].*/, "").lastIndexOf("/") + 1) : E = "", C || (P = (S) => { + (w || k) && (k ? E = self.location.href : typeof document != "undefined" && document.currentScript && (E = document.currentScript.src), typeof s != "undefined" && s && (E = s), E.indexOf("blob:") !== 0 ? E = E.substr(0, E.replace(/[?#].*/, "").lastIndexOf("/") + 1) : E = "", T || (P = (C) => { var D = new XMLHttpRequest(); - return D.open("GET", S, false), D.send(null), D.responseText; - }, k && (F = (S) => { + return D.open("GET", C, false), D.send(null), D.responseText; + }, k && (F = (C) => { var D = new XMLHttpRequest(); - return D.open("GET", S, false), D.responseType = "arraybuffer", D.send(null), new Uint8Array(D.response); - }), R = (S, D, B) => { + return D.open("GET", C, false), D.responseType = "arraybuffer", D.send(null), new Uint8Array(D.response); + }), R = (C, D, B) => { var Q = new XMLHttpRequest(); - Q.open("GET", S, true), Q.responseType = "arraybuffer", Q.onload = () => { + Q.open("GET", C, true), Q.responseType = "arraybuffer", Q.onload = () => { if (Q.status == 200 || Q.status == 0 && Q.response) { D(Q.response); return; } B(); }, Q.onerror = B, Q.send(null); - }), $ = (S) => document.title = S); - C && typeof performance == "undefined" && (global.performance = KT().performance); + }), $ = (C) => document.title = C); + T && typeof performance == "undefined" && (global.performance = s$().performance); var Y = console.log.bind(console), Z = console.warn.bind(console); - C && (K(), Y = (S) => W.writeSync(1, S + ` -`), Z = (S) => W.writeSync(2, S + ` + T && (K(), Y = (C) => W.writeSync(1, C + ` +`), Z = (C) => W.writeSync(2, C + ` `)); var te = d.print || Y, ee = d.printErr || Z; Object.assign(d, g), g = null, d.arguments && (b = d.arguments), d.thisProgram && (y = d.thisProgram), d.quit && (v = d.quit); var se = 4; - function ne(S) { - ne.shown || (ne.shown = {}), ne.shown[S] || (ne.shown[S] = 1, ee(S)); + function ne(C) { + ne.shown || (ne.shown = {}), ne.shown[C] || (ne.shown[C] = 1, ee(C)); } - function oe(S, D) { + function oe(C, D) { if (typeof WebAssembly.Function == "function") { for (var B = { i: "i32", j: "i64", f: "f32", d: "f64" }, Q = { parameters: [], results: D[0] == "v" ? [] : [B[D[0]]] }, ue = 1; ue < D.length; ++ue) Q.parameters.push(B[D[ue]]); - return new WebAssembly.Function(Q, S); + return new WebAssembly.Function(Q, C); } - var pe = [1, 0, 1, 96], be = D.slice(0, 1), Te = D.slice(1), bt = { i: 127, j: 126, f: 125, d: 124 }; + var pe = [1, 0, 1, 96], ye = D.slice(0, 1), Te = D.slice(1), bt = { i: 127, j: 126, f: 125, d: 124 }; pe.push(Te.length); for (var ue = 0; ue < Te.length; ++ue) pe.push(bt[Te[ue]]); - be == "v" ? pe.push(0) : pe = pe.concat([1, bt[be]]), pe[1] = pe.length - 2; - var is = new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0].concat(pe, [2, 7, 1, 1, 101, 1, 102, 0, 0, 7, 5, 1, 1, 102, 0, 0])), os = new WebAssembly.Module(is), Lc = new WebAssembly.Instance(os, { e: { f: S } }), ku = Lc.exports.f; + ye == "v" ? pe.push(0) : pe = pe.concat([1, bt[ye]]), pe[1] = pe.length - 2; + var us = new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0].concat(pe, [2, 7, 1, 1, 101, 1, 102, 0, 0, 7, 5, 1, 1, 102, 0, 0])), ls = new WebAssembly.Module(us), Bc = new WebAssembly.Instance(ls, { e: { f: C } }), ku = Bc.exports.f; return ku; } var re = [], le; @@ -1441,110 +1443,110 @@ var YT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js if (re.length) return re.pop(); try { - Dn.grow(1); - } catch (S) { - throw S instanceof RangeError ? "Unable to grow wasm table. Set ALLOW_TABLE_GROWTH." : S; + Fn.grow(1); + } catch (C) { + throw C instanceof RangeError ? "Unable to grow wasm table. Set ALLOW_TABLE_GROWTH." : C; } - return Dn.length - 1; + return Fn.length - 1; } - function we(S, D) { - for (var B = S; B < S + D; B++) { - var Q = Ni(B); + function we(C, D) { + for (var B = C; B < C + D; B++) { + var Q = Ti(B); Q && le.set(Q, B); } } - var Se = 0, Ee = (S) => { - Se = S; + var Se = 0, Ee = (C) => { + Se = C; }, Pe = Atomics.load, Xe = Atomics.store, Je = Atomics.compareExchange, Ye; d.wasmBinary && (Ye = d.wasmBinary); var tt = d.noExitRuntime || true; - typeof WebAssembly != "object" && Ii("no native wasm support detected"); - var Ce, ut, rt = false, Zt; - function Nt(S, D) { - S || Ii(D); + typeof WebAssembly != "object" && Si("no native wasm support detected"); + var Ce, ut, at = false, Jt; + function Nt(C, D) { + C || Si(D); } - function In(S) { - var D = d["_" + S]; + function Cn(C) { + var D = d["_" + C]; return D; } - function Et(S, D, B, Q, ue) { - var pe = { string: function(Nn) { - var Di = 0; - if (Nn != null && Nn !== 0) { - var Qv = (Nn.length << 2) + 1; - Di = Ri(Qv), Ls(Nn, Di, Qv); + function Et(C, D, B, Q, ue) { + var pe = { string: function($n) { + var Fi = 0; + if ($n != null && $n !== 0) { + var ex = ($n.length << 2) + 1; + Fi = Di(ex), Ls($n, Fi, ex); } - return Di; - }, array: function(Nn) { - var Di = Ri(Nn.length); - return Bs(Nn, Di), Di; + return Fi; + }, array: function($n) { + var Fi = Di($n.length); + return Bs($n, Fi), Fi; } }; - function be(Nn) { - return D === "string" ? en(Nn) : D === "boolean" ? Boolean(Nn) : Nn; + function ye($n) { + return D === "string" ? tn($n) : D === "boolean" ? Boolean($n) : $n; } - var Te = In(S), bt = [], is = 0; + var Te = Cn(C), bt = [], us = 0; if (Q) - for (var os = 0; os < Q.length; os++) { - var Lc = pe[B[os]]; - Lc ? (is === 0 && (is = _f()), bt[os] = Lc(Q[os])) : bt[os] = Q[os]; + for (var ls = 0; ls < Q.length; ls++) { + var Bc = pe[B[ls]]; + Bc ? (us === 0 && (us = Ef()), bt[ls] = Bc(Q[ls])) : bt[ls] = Q[ls]; } var ku = Te.apply(null, bt); - function _T(Nn) { - return is !== 0 && Oc(is), be(Nn); + function MT($n) { + return us !== 0 && Pc(us), ye($n); } - return ku = _T(ku), ku; + return ku = MT(ku), ku; } - function Jt(S, D, B, Q) { + function en(C, D, B, Q) { B = B || []; - var ue = B.every(function(be) { - return be === "number"; + var ue = B.every(function(ye) { + return ye === "number"; }), pe = D !== "string"; - return pe && ue && !Q ? In(S) : function() { - return Et(S, D, B, arguments, Q); + return pe && ue && !Q ? Cn(C) : function() { + return Et(C, D, B, arguments, Q); }; } - var Sn = 1; - function Cn(S) { - var D = new TextDecoder(S); + var Nn = 1; + function Tn(C) { + var D = new TextDecoder(C); this.decode = (B) => (B.buffer instanceof SharedArrayBuffer && (B = new Uint8Array(B)), D.decode.call(D, B)); } - var Xt = typeof TextDecoder != "undefined" ? new Cn("utf8") : void 0; - function Rn(S, D, B) { - for (var Q = D + B, ue = D; S[ue] && !(ue >= Q); ) + var Yt = typeof TextDecoder != "undefined" ? new Tn("utf8") : void 0; + function Dn(C, D, B) { + for (var Q = D + B, ue = D; C[ue] && !(ue >= Q); ) ++ue; - if (ue - D > 16 && S.subarray && Xt) - return Xt.decode(S.subarray(D, ue)); + if (ue - D > 16 && C.subarray && Yt) + return Yt.decode(C.subarray(D, ue)); for (var pe = ""; D < ue; ) { - var be = S[D++]; - if (!(be & 128)) { - pe += String.fromCharCode(be); + var ye = C[D++]; + if (!(ye & 128)) { + pe += String.fromCharCode(ye); continue; } - var Te = S[D++] & 63; - if ((be & 224) == 192) { - pe += String.fromCharCode((be & 31) << 6 | Te); + var Te = C[D++] & 63; + if ((ye & 224) == 192) { + pe += String.fromCharCode((ye & 31) << 6 | Te); continue; } - var bt = S[D++] & 63; - if ((be & 240) == 224 ? be = (be & 15) << 12 | Te << 6 | bt : be = (be & 7) << 18 | Te << 12 | bt << 6 | S[D++] & 63, be < 65536) - pe += String.fromCharCode(be); + var bt = C[D++] & 63; + if ((ye & 240) == 224 ? ye = (ye & 15) << 12 | Te << 6 | bt : ye = (ye & 7) << 18 | Te << 12 | bt << 6 | C[D++] & 63, ye < 65536) + pe += String.fromCharCode(ye); else { - var is = be - 65536; - pe += String.fromCharCode(55296 | is >> 10, 56320 | is & 1023); + var us = ye - 65536; + pe += String.fromCharCode(55296 | us >> 10, 56320 | us & 1023); } } return pe; } - function en(S, D) { - return S ? Rn(i(), S, D) : ""; + function tn(C, D) { + return C ? Dn(i(), C, D) : ""; } - function Ms(S, D, B, Q) { + function Ms(C, D, B, Q) { if (!(Q > 0)) return 0; - for (var ue = B, pe = B + Q - 1, be = 0; be < S.length; ++be) { - var Te = S.charCodeAt(be); + for (var ue = B, pe = B + Q - 1, ye = 0; ye < C.length; ++ye) { + var Te = C.charCodeAt(ye); if (Te >= 55296 && Te <= 57343) { - var bt = S.charCodeAt(++be); + var bt = C.charCodeAt(++ye); Te = 65536 + ((Te & 1023) << 10) | bt & 1023; } if (Te <= 127) { @@ -1567,160 +1569,160 @@ var YT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js } return D[B] = 0, B - ue; } - function Ls(S, D, B) { - return Ms(S, i(), D, B); + function Ls(C, D, B) { + return Ms(C, i(), D, B); } - function xi(S) { - for (var D = 0, B = 0; B < S.length; ++B) { - var Q = S.charCodeAt(B); - Q >= 55296 && Q <= 57343 && (Q = 65536 + ((Q & 1023) << 10) | S.charCodeAt(++B) & 1023), Q <= 127 ? ++D : Q <= 2047 ? D += 2 : Q <= 65535 ? D += 3 : D += 4; + function wi(C) { + for (var D = 0, B = 0; B < C.length; ++B) { + var Q = C.charCodeAt(B); + Q >= 55296 && Q <= 57343 && (Q = 65536 + ((Q & 1023) << 10) | C.charCodeAt(++B) & 1023), Q <= 127 ? ++D : Q <= 2047 ? D += 2 : Q <= 65535 ? D += 3 : D += 4; } return D; } - var Js = typeof TextDecoder != "undefined" ? new Cn("utf-16le") : void 0; - function Bs(S, D) { - a().set(S, D); + var Js = typeof TextDecoder != "undefined" ? new Tn("utf-16le") : void 0; + function Bs(C, D) { + a().set(C, D); } - function du(S, D, B) { - for (var Q = 0; Q < S.length; ++Q) - a()[D++ >> 0] = S.charCodeAt(Q); + function du(C, D, B) { + for (var Q = 0; Q < C.length; ++Q) + a()[D++ >> 0] = C.charCodeAt(Q); B || (a()[D >> 0] = 0); } - function wi(S, D) { - return S % D > 0 && (S += D - S % D), S; + function ki(C, D) { + return C % D > 0 && (C += D - C % D), C; } - var tn, ac, ic, pu, oc, uc, Ev, lc, cc; - T && (tn = d.buffer); - function ns(S) { - tn = S, d.HEAP8 = ac = new Int8Array(S), d.HEAP16 = pu = new Int16Array(S), d.HEAP32 = uc = new Int32Array(S), d.HEAPU8 = ic = new Uint8Array(S), d.HEAPU16 = oc = new Uint16Array(S), d.HEAPU32 = Ev = new Uint32Array(S), d.HEAPF32 = lc = new Float32Array(S), d.HEAPF64 = cc = new Float64Array(S); + var nn, ic, oc, pu, uc, lc, Fv, cc, dc; + N && (nn = d.buffer); + function rs(C) { + nn = C, d.HEAP8 = ic = new Int8Array(C), d.HEAP16 = pu = new Int16Array(C), d.HEAP32 = lc = new Int32Array(C), d.HEAPU8 = oc = new Uint8Array(C), d.HEAPU16 = uc = new Uint16Array(C), d.HEAPU32 = Fv = new Uint32Array(C), d.HEAPF32 = cc = new Float32Array(C), d.HEAPF64 = dc = new Float64Array(C); } - var dc = d.INITIAL_MEMORY || 16777216; - if (T) - Ce = d.wasmMemory, tn = d.buffer; + var pc = d.INITIAL_MEMORY || 16777216; + if (N) + Ce = d.wasmMemory, nn = d.buffer; else if (d.wasmMemory) Ce = d.wasmMemory; - else if (Ce = new WebAssembly.Memory({ initial: dc / 65536, maximum: 32768, shared: true }), !(Ce.buffer instanceof SharedArrayBuffer)) - throw ee("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"), C && console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"), Error("bad memory"); - Ce && (tn = Ce.buffer), dc = tn.byteLength, ns(tn); - var Dn, ki = [], er = [], eh = [], pc = [], Fr = false, th = false, hc = 0; - function Or() { - return tt || hc > 0; + else if (Ce = new WebAssembly.Memory({ initial: pc / 65536, maximum: 32768, shared: true }), !(Ce.buffer instanceof SharedArrayBuffer)) + throw ee("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"), T && console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"), Error("bad memory"); + Ce && (nn = Ce.buffer), pc = nn.byteLength, rs(nn); + var Fn, Ii = [], er = [], th = [], hc = [], Or = false, nh = false, fc = 0; + function Pr() { + return tt || fc > 0; } - function nn() { + function sn() { if (d.preRun) for (typeof d.preRun == "function" && (d.preRun = [d.preRun]); d.preRun.length; ) - Rv(d.preRun.shift()); - yc(ki); + Ov(d.preRun.shift()); + vc(Ii); } function hu() { - Fr = true, !T && yc(er); - } - function nh() { - T || ($e.terminateAllThreads(), th = true); + Or = true, !N && vc(er); } function sh() { - if (!T) { + N || ($e.terminateAllThreads(), nh = true); + } + function rh() { + if (!N) { if (d.postRun) for (typeof d.postRun == "function" && (d.postRun = [d.postRun]); d.postRun.length; ) fu(d.postRun.shift()); - yc(pc); + vc(hc); } } - function Rv(S) { - ki.unshift(S); + function Ov(C) { + Ii.unshift(C); } - function Dv(S) { - er.unshift(S); + function Pv(C) { + er.unshift(C); } - function fu(S) { - pc.unshift(S); + function fu(C) { + hc.unshift(C); } - var tr = 0, fc = null, ss = null; - function mu(S) { + var tr = 0, mc = null, as = null; + function mu(C) { tr++, d.monitorRunDependencies && d.monitorRunDependencies(tr); } - function Fv(S) { - if (tr--, d.monitorRunDependencies && d.monitorRunDependencies(tr), tr == 0 && (fc !== null && (clearInterval(fc), fc = null), ss)) { - var D = ss; - ss = null, D(); + function zv(C) { + if (tr--, d.monitorRunDependencies && d.monitorRunDependencies(tr), tr == 0 && (mc !== null && (clearInterval(mc), mc = null), as)) { + var D = as; + as = null, D(); } } d.preloadedImages = {}, d.preloadedAudios = {}; - function Ii(S) { - T ? postMessage({ cmd: "onAbort", arg: S }) : d.onAbort && d.onAbort(S), S = "Aborted(" + S + ")", ee(S), rt = true, Zt = 1, S += ". Build with -s ASSERTIONS=1 for more info."; - var D = new WebAssembly.RuntimeError(S); + function Si(C) { + N ? postMessage({ cmd: "onAbort", arg: C }) : d.onAbort && d.onAbort(C), C = "Aborted(" + C + ")", ee(C), at = true, Jt = 1, C += ". Build with -s ASSERTIONS=1 for more info."; + var D = new WebAssembly.RuntimeError(C); throw f(D), D; } - var rh = "data:application/octet-stream;base64,"; - function mc(S) { - return S.startsWith(rh); + var ah = "data:application/octet-stream;base64,"; + function gc(C) { + return C.startsWith(ah); } - function gc(S) { - return S.startsWith("file://"); + function bc(C) { + return C.startsWith("file://"); } - var sn; - sn = "tfjs-backend-wasm-threaded-simd.wasm", mc(sn) || (sn = A(sn)); - function bc(S) { + var rn; + rn = "tfjs-backend-wasm-threaded-simd.wasm", gc(rn) || (rn = A(rn)); + function yc(C) { try { - if (S == sn && Ye) + if (C == rn && Ye) return new Uint8Array(Ye); if (F) - return F(S); + return F(C); throw "both async and sync fetching of the wasm failed"; } catch (D) { - Ii(D); + Si(D); } } - function Si() { - if (!Ye && (x || k)) { - if (typeof fetch == "function" && !gc(sn)) - return fetch(sn, { credentials: "same-origin" }).then(function(S) { - if (!S.ok) - throw "failed to load wasm binary file at '" + sn + "'"; - return S.arrayBuffer(); + function Ci() { + if (!Ye && (w || k)) { + if (typeof fetch == "function" && !bc(rn)) + return fetch(rn, { credentials: "same-origin" }).then(function(C) { + if (!C.ok) + throw "failed to load wasm binary file at '" + rn + "'"; + return C.arrayBuffer(); }).catch(function() { - return bc(sn); + return yc(rn); }); if (R) - return new Promise(function(S, D) { - R(sn, function(B) { - S(new Uint8Array(B)); + return new Promise(function(C, D) { + R(rn, function(B) { + C(new Uint8Array(B)); }, D); }); } return Promise.resolve().then(function() { - return bc(sn); + return yc(rn); }); } - function ah() { - var S = { env: Ac, wasi_snapshot_preview1: Ac }; - function D(be, Te) { - var bt = be.exports; - if (d.asm = bt, ph(d.asm.emscripten_tls_init), Dn = d.asm.__indirect_function_table, Dv(d.asm.__wasm_call_ctors), ut = Te, !T) { - var is = $e.unusedWorkers.length; - $e.unusedWorkers.forEach(function(os) { - $e.loadWasmModuleToWorker(os, function() { - --is || Fv("wasm-instantiate"); + function ih() { + var C = { env: Ec, wasi_snapshot_preview1: Ec }; + function D(ye, Te) { + var bt = ye.exports; + if (d.asm = bt, hh(d.asm.emscripten_tls_init), Fn = d.asm.__indirect_function_table, Pv(d.asm.__wasm_call_ctors), ut = Te, !N) { + var us = $e.unusedWorkers.length; + $e.unusedWorkers.forEach(function(ls) { + $e.loadWasmModuleToWorker(ls, function() { + --us || zv("wasm-instantiate"); }); }); } } - T || mu("wasm-instantiate"); - function B(be) { - D(be.instance, be.module); + N || mu("wasm-instantiate"); + function B(ye) { + D(ye.instance, ye.module); } - function Q(be) { - return Si().then(function(Te) { - return WebAssembly.instantiate(Te, S); + function Q(ye) { + return Ci().then(function(Te) { + return WebAssembly.instantiate(Te, C); }).then(function(Te) { return Te; - }).then(be, function(Te) { - ee("failed to asynchronously prepare wasm: " + Te), Ii(Te); + }).then(ye, function(Te) { + ee("failed to asynchronously prepare wasm: " + Te), Si(Te); }); } function ue() { - return !Ye && typeof WebAssembly.instantiateStreaming == "function" && !mc(sn) && !gc(sn) && typeof fetch == "function" ? fetch(sn, { credentials: "same-origin" }).then(function(be) { - var Te = WebAssembly.instantiateStreaming(be, S); + return !Ye && typeof WebAssembly.instantiateStreaming == "function" && !gc(rn) && !bc(rn) && typeof fetch == "function" ? fetch(rn, { credentials: "same-origin" }).then(function(ye) { + var Te = WebAssembly.instantiateStreaming(ye, C); return Te.then(B, function(bt) { return ee("wasm streaming compile failed: " + bt), ee("falling back to ArrayBuffer instantiation"), Q(B); }); @@ -1728,76 +1730,76 @@ var YT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js } if (d.instantiateWasm) try { - var pe = d.instantiateWasm(S, D); + var pe = d.instantiateWasm(C, D); return pe; - } catch (be) { - return ee("Module.instantiateWasm callback failed with error: " + be), false; + } catch (ye) { + return ee("Module.instantiateWasm callback failed with error: " + ye), false; } return ue().catch(f), {}; } - var Ov, Pv, ih = {}; - function yc(S) { - for (; S.length > 0; ) { - var D = S.shift(); + var Mv, Lv, oh = {}; + function vc(C) { + for (; C.length > 0; ) { + var D = C.shift(); if (typeof D == "function") { D(d); continue; } var B = D.func; - typeof B == "number" ? D.arg === void 0 ? Ni(B)() : Ni(B)(D.arg) : B(D.arg === void 0 ? null : D.arg); + typeof B == "number" ? D.arg === void 0 ? Ti(B)() : Ti(B)(D.arg) : B(D.arg === void 0 ? null : D.arg); } } - function Ci(S) { - var D = _f(), B = S(); - return Oc(D), B; + function Ni(C) { + var D = Ef(), B = C(); + return Pc(D), B; } - function zN(S) { - return S; + function qN(C) { + return C; } - function zv(S) { + function Bv(C) { var D = /\b_Z[\w\d_]+/g; - return S.replace(D, function(B) { + return C.replace(D, function(B) { var Q = B; return B === Q ? B : Q + " [" + B + "]"; }); } - function oh(S) { - l()[S >> 2] = 0; - var D = $e.pthreads[S]; - delete $e.pthreads[S], D.worker.terminate(), $f(S), $e.runningWorkers.splice($e.runningWorkers.indexOf(D.worker), 1), D.worker.pthread = void 0; + function uh(C) { + l()[C >> 2] = 0; + var D = $e.pthreads[C]; + delete $e.pthreads[C], D.worker.terminate(), Af(C), $e.runningWorkers.splice($e.runningWorkers.indexOf(D.worker), 1), D.worker.pthread = void 0; } - function uh(S) { - var D = $e.pthreads[S]; + function lh(C) { + var D = $e.pthreads[C]; D.worker.postMessage({ cmd: "cancel" }); } - function vc(S) { - var D = $e.pthreads[S]; + function xc(C) { + var D = $e.pthreads[C]; if (D) { - l()[S >> 2] = 0; + l()[C >> 2] = 0; var B = D.worker; $e.returnWorkerToPool(B); } } - function xc(S) { - NT(S); + function wc(C) { + OT(C); } - function lh(S) { - if (S instanceof wu || S == "unwind") - return Zt; - v(1, S); + function ch(C) { + if (C instanceof wu || C == "unwind") + return Jt; + v(1, C); } var $e = { unusedWorkers: [], runningWorkers: [], tlsInitFunctions: [], init: function() { - T ? $e.initWorker() : $e.initMainThread(); + N ? $e.initWorker() : $e.initMainThread(); }, initMainThread: function() { - for (var S = 8, D = 0; D < S; ++D) + for (var C = 8, D = 0; D < C; ++D) $e.allocateUnusedWorker(); }, initWorker: function() { tt = false; - }, pthreads: {}, setExitStatus: function(S) { - Zt = S; + }, pthreads: {}, setExitStatus: function(C) { + Jt = C; }, terminateAllThreads: function() { - for (var S in $e.pthreads) { - var D = $e.pthreads[S]; + for (var C in $e.pthreads) { + var D = $e.pthreads[C]; D && D.worker && $e.returnWorkerToPool(D.worker); } for (var B = 0; B < $e.unusedWorkers.length; ++B) { @@ -1805,304 +1807,304 @@ var YT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js Q.terminate(); } $e.unusedWorkers = []; - }, returnWorkerToPool: function(S) { + }, returnWorkerToPool: function(C) { $e.runWithoutMainThreadQueuedCalls(function() { - delete $e.pthreads[S.pthread.threadInfoStruct], $e.unusedWorkers.push(S), $e.runningWorkers.splice($e.runningWorkers.indexOf(S), 1), $f(S.pthread.threadInfoStruct), S.pthread = void 0; + delete $e.pthreads[C.pthread.threadInfoStruct], $e.unusedWorkers.push(C), $e.runningWorkers.splice($e.runningWorkers.indexOf(C), 1), Af(C.pthread.threadInfoStruct), C.pthread = void 0; }); - }, runWithoutMainThreadQueuedCalls: function(S) { - l()[Yv >> 2] = 0; + }, runWithoutMainThreadQueuedCalls: function(C) { + l()[Jv >> 2] = 0; try { - S(); + C(); } finally { - l()[Yv >> 2] = 1; + l()[Jv >> 2] = 1; } - }, receiveObjectTransfer: function(S) { + }, receiveObjectTransfer: function(C) { }, threadInit: function() { - for (var S in $e.tlsInitFunctions) - $e.tlsInitFunctions[S](); - }, loadWasmModuleToWorker: function(S, D) { - S.onmessage = (B) => { + for (var C in $e.tlsInitFunctions) + $e.tlsInitFunctions[C](); + }, loadWasmModuleToWorker: function(C, D) { + C.onmessage = (B) => { var Q = B.data, ue = Q.cmd; - if (S.pthread && ($e.currentProxiedOperationCallerThread = S.pthread.threadInfoStruct), Q.targetThread && Q.targetThread != Fc()) { + if (C.pthread && ($e.currentProxiedOperationCallerThread = C.pthread.threadInfoStruct), Q.targetThread && Q.targetThread != Oc()) { var pe = $e.pthreads[Q.targetThread]; pe ? pe.worker.postMessage(Q, Q.transferList) : ee('Internal error! Worker sent a message "' + ue + '" to target pthread ' + Q.targetThread + ", but that thread no longer exists!"), $e.currentProxiedOperationCallerThread = void 0; return; } - ue === "processQueuedMainThreadWork" ? Hv() : ue === "spawnThread" ? kc(Q) : ue === "cleanupThread" ? vc(Q.thread) : ue === "killThread" ? oh(Q.thread) : ue === "cancelThread" ? uh(Q.thread) : ue === "loaded" ? (S.loaded = true, D && D(S), S.runPthread && (S.runPthread(), delete S.runPthread)) : ue === "print" ? te("Thread " + Q.threadId + ": " + Q.text) : ue === "printErr" ? ee("Thread " + Q.threadId + ": " + Q.text) : ue === "alert" ? alert("Thread " + Q.threadId + ": " + Q.text) : Q.target === "setimmediate" ? S.postMessage(Q) : ue === "onAbort" ? d.onAbort && d.onAbort(Q.arg) : ee("worker sent an unknown command " + ue), $e.currentProxiedOperationCallerThread = void 0; - }, S.onerror = (B) => { + ue === "processQueuedMainThreadWork" ? Kv() : ue === "spawnThread" ? Ic(Q) : ue === "cleanupThread" ? xc(Q.thread) : ue === "killThread" ? uh(Q.thread) : ue === "cancelThread" ? lh(Q.thread) : ue === "loaded" ? (C.loaded = true, D && D(C), C.runPthread && (C.runPthread(), delete C.runPthread)) : ue === "print" ? te("Thread " + Q.threadId + ": " + Q.text) : ue === "printErr" ? ee("Thread " + Q.threadId + ": " + Q.text) : ue === "alert" ? alert("Thread " + Q.threadId + ": " + Q.text) : Q.target === "setimmediate" ? C.postMessage(Q) : ue === "onAbort" ? d.onAbort && d.onAbort(Q.arg) : ee("worker sent an unknown command " + ue), $e.currentProxiedOperationCallerThread = void 0; + }, C.onerror = (B) => { var Q = "worker sent an error!"; throw ee(Q + " " + B.filename + ":" + B.lineno + ": " + B.message), B; - }, C && (S.on("message", function(B) { - S.onmessage({ data: B }); - }), S.on("error", function(B) { - S.onerror(B); - }), S.on("detachedExit", function() { - })), S.postMessage({ cmd: "load", urlOrBlob: d.mainScriptUrlOrBlob || s, wasmMemory: Ce, wasmModule: ut }); + }, T && (C.on("message", function(B) { + C.onmessage({ data: B }); + }), C.on("error", function(B) { + C.onerror(B); + }), C.on("detachedExit", function() { + })), C.postMessage({ cmd: "load", urlOrBlob: d.mainScriptUrlOrBlob || s, wasmMemory: Ce, wasmModule: ut }); }, allocateUnusedWorker: function() { - var S = A("tfjs-backend-wasm-threaded-simd.worker.js"); - $e.unusedWorkers.push(new Worker(S)); + var C = A("tfjs-backend-wasm-threaded-simd.worker.js"); + $e.unusedWorkers.push(new Worker(C)); }, getNewWorker: function() { return $e.unusedWorkers.length == 0 && ($e.allocateUnusedWorker(), $e.loadWasmModuleToWorker($e.unusedWorkers[0])), $e.unusedWorkers.pop(); } }; - function ch() { - var S = Fc(), D = l()[S + 44 >> 2], B = l()[S + 48 >> 2], Q = D - B; - Xv(D, Q), Oc(D); + function dh() { + var C = Oc(), D = l()[C + 44 >> 2], B = l()[C + 48 >> 2], Q = D - B; + Zv(D, Q), Pc(D); } - d.establishStackSpace = ch; - function wc(S) { - if (T) - return Mr(1, 0, S); + d.establishStackSpace = dh; + function kc(C) { + if (N) + return Lr(1, 0, C); try { - xc(S); + wc(C); } catch (D) { - lh(D); + ch(D); } } - var Pr = []; - function Ni(S) { - var D = Pr[S]; - return D || (S >= Pr.length && (Pr.length = S + 1), Pr[S] = D = Dn.get(S)), D; + var zr = []; + function Ti(C) { + var D = zr[C]; + return D || (C >= zr.length && (zr.length = C + 1), zr[C] = D = Fn.get(C)), D; } - function dh(S, D) { - return Ni(S)(D); + function ph(C, D) { + return Ti(C)(D); } - d.invokeEntryPoint = dh; - function Mv() { - var S = new Error(); - if (!S.stack) { + d.invokeEntryPoint = ph; + function Vv() { + var C = new Error(); + if (!C.stack) { try { throw new Error(); } catch (D) { - S = D; + C = D; } - if (!S.stack) + if (!C.stack) return "(no stack trace available)"; } - return S.stack.toString(); + return C.stack.toString(); } - function ph(S, D, B) { - $e.tlsInitFunctions.push(S); + function hh(C, D, B) { + $e.tlsInitFunctions.push(C); } - function Lv(S, D) { - Dn.set(S, D), Pr[S] = D; + function Wv(C, D) { + Fn.set(C, D), zr[C] = D; } - var zr; - C ? zr = () => { - var S = process.hrtime(); - return S[0] * 1e3 + S[1] / 1e6; - } : T ? zr = () => performance.now() - d.__performance_now_clock_drift : zr = () => performance.now(); - var hh = true; - function fh(S) { - return l()[Gv() >> 2] = S, S; + var Mr; + T ? Mr = () => { + var C = process.hrtime(); + return C[0] * 1e3 + C[1] / 1e6; + } : N ? Mr = () => performance.now() - d.__performance_now_clock_drift : Mr = () => performance.now(); + var fh = true; + function mh(C) { + return l()[jv() >> 2] = C, C; } - function mh(S, D) { + function gh(C, D) { var B; - if (S === 0) + if (C === 0) B = Date.now(); - else if ((S === 1 || S === 4) && hh) - B = zr(); + else if ((C === 1 || C === 4) && fh) + B = Mr(); else - return fh(28), -1; + return mh(28), -1; return l()[D >> 2] = B / 1e3 | 0, l()[D + 4 >> 2] = B % 1e3 * 1e3 * 1e3 | 0, 0; } - function gh(S, D) { - return mh(S, D); + function bh(C, D) { + return gh(C, D); } - function bh(S) { - qv(S, !k, 1, !x), $e.threadInit(); + function yh(C) { + Xv(C, !k, 1, !w), $e.threadInit(); } - function yh(S) { - T ? postMessage({ cmd: "cleanupThread", thread: S }) : vc(S); + function vh(C) { + N ? postMessage({ cmd: "cleanupThread", thread: C }) : xc(C); } - function kc(S) { + function Ic(C) { var D = $e.getNewWorker(); if (!D) return 6; $e.runningWorkers.push(D); - var B = $e.pthreads[S.pthread_ptr] = { worker: D, threadInfoStruct: S.pthread_ptr }; + var B = $e.pthreads[C.pthread_ptr] = { worker: D, threadInfoStruct: C.pthread_ptr }; D.pthread = B; - var Q = { cmd: "run", start_routine: S.startRoutine, arg: S.arg, threadInfoStruct: S.pthread_ptr }; + var Q = { cmd: "run", start_routine: C.startRoutine, arg: C.arg, threadInfoStruct: C.pthread_ptr }; return D.runPthread = () => { - Q.time = performance.now(), D.postMessage(Q, S.transferList); + Q.time = performance.now(), D.postMessage(Q, C.transferList); }, D.loaded && (D.runPthread(), delete D.runPthread), 0; } - function vh(S, D, B, Q) { + function xh(C, D, B, Q) { if (typeof SharedArrayBuffer == "undefined") return ee("Current environment does not support SharedArrayBuffer, pthreads are not available!"), 6; var ue = [], pe = 0; - if (T && (ue.length === 0 || pe)) - return jv(687865856, S, D, B, Q); + if (N && (ue.length === 0 || pe)) + return Yv(687865856, C, D, B, Q); if (pe) return pe; - var be = { startRoutine: B, pthread_ptr: S, arg: Q, transferList: ue }; - return T ? (be.cmd = "spawnThread", postMessage(be, ue), 0) : kc(be); + var ye = { startRoutine: B, pthread_ptr: C, arg: Q, transferList: ue }; + return N ? (ye.cmd = "spawnThread", postMessage(ye, ue), 0) : Ic(ye); } - function xh() { + function wh() { return 2097152; } - function wh(S, D) { - if (S == D) + function kh(C, D) { + if (C == D) postMessage({ cmd: "processQueuedMainThreadWork" }); - else if (T) - postMessage({ targetThread: S, cmd: "processThreadQueue" }); + else if (N) + postMessage({ targetThread: C, cmd: "processThreadQueue" }); else { - var B = $e.pthreads[S], Q = B && B.worker; + var B = $e.pthreads[C], Q = B && B.worker; if (!Q) return; Q.postMessage({ cmd: "processThreadQueue" }); } return 1; } - function kh() { - Ii(""); - } function Ih() { - C || k || ne("Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread"); + Si(""); } - function Ic() { + function Sh() { + T || k || ne("Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread"); + } + function Sc() { return 2147483648; } - function Sh(S, D, B) { - i().copyWithin(S, D, D + B); + function Ch(C, D, B) { + i().copyWithin(C, D, D + B); } - function Ch() { - return C ? XT().cpus().length : navigator.hardwareConcurrency; + function Nh() { + return T ? r$().cpus().length : navigator.hardwareConcurrency; } - function Mr(S, D) { + function Lr(C, D) { var B = arguments.length - 2, Q = arguments; - return Ci(function() { - for (var ue = B, pe = Ri(ue * 8), be = pe >> 3, Te = 0; Te < B; Te++) { + return Ni(function() { + for (var ue = B, pe = Di(ue * 8), ye = pe >> 3, Te = 0; Te < B; Te++) { var bt = Q[2 + Te]; - p()[be + Te] = bt; + p()[ye + Te] = bt; } - return Kv(S, ue, pe, D); + return Qv(C, ue, pe, D); }); } var gu = []; - function Nh(S, D, B) { + function Th(C, D, B) { gu.length = D; for (var Q = B >> 3, ue = 0; ue < D; ue++) gu[ue] = p()[Q + ue]; - var pe = S < 0, be = pe ? ih[-S - 1] : Hh[S]; - return be.apply(null, gu); + var pe = C < 0, ye = pe ? oh[-C - 1] : qh[C]; + return ye.apply(null, gu); } - function Th(S) { + function $h(C) { try { - return Ce.grow(S - tn.byteLength + 65535 >>> 16), ns(Ce.buffer), 1; + return Ce.grow(C - nn.byteLength + 65535 >>> 16), rs(Ce.buffer), 1; } catch (D) { } } - function $h(S) { + function _h(C) { var D = i().length; - if (S = S >>> 0, S <= D) + if (C = C >>> 0, C <= D) return false; - var B = Ic(); - if (S > B) + var B = Sc(); + if (C > B) return false; for (var Q = 1; Q <= 4; Q *= 2) { var ue = D * (1 + 0.2 / Q); - ue = Math.min(ue, S + 100663296); - var pe = Math.min(B, wi(Math.max(S, ue), 65536)), be = Th(pe); - if (be) + ue = Math.min(ue, C + 100663296); + var pe = Math.min(B, ki(Math.max(C, ue), 65536)), ye = $h(pe); + if (ye) return true; } return false; } var Le = { inEventHandler: 0, removeAllEventListeners: function() { - for (var S = Le.eventHandlers.length - 1; S >= 0; --S) - Le._removeHandler(S); + for (var C = Le.eventHandlers.length - 1; C >= 0; --C) + Le._removeHandler(C); Le.eventHandlers = [], Le.deferredCalls = []; }, registerRemoveEventListeners: function() { - Le.removeEventListenersRegistered || (eh.push(Le.removeAllEventListeners), Le.removeEventListenersRegistered = true); - }, deferredCalls: [], deferCall: function(S, D, B) { - function Q(be, Te) { - if (be.length != Te.length) + Le.removeEventListenersRegistered || (th.push(Le.removeAllEventListeners), Le.removeEventListenersRegistered = true); + }, deferredCalls: [], deferCall: function(C, D, B) { + function Q(ye, Te) { + if (ye.length != Te.length) return false; - for (var bt in be) - if (be[bt] != Te[bt]) + for (var bt in ye) + if (ye[bt] != Te[bt]) return false; return true; } for (var ue in Le.deferredCalls) { var pe = Le.deferredCalls[ue]; - if (pe.targetFunction == S && Q(pe.argsList, B)) + if (pe.targetFunction == C && Q(pe.argsList, B)) return; } - Le.deferredCalls.push({ targetFunction: S, precedence: D, argsList: B }), Le.deferredCalls.sort(function(be, Te) { - return be.precedence < Te.precedence; + Le.deferredCalls.push({ targetFunction: C, precedence: D, argsList: B }), Le.deferredCalls.sort(function(ye, Te) { + return ye.precedence < Te.precedence; }); - }, removeDeferredCalls: function(S) { + }, removeDeferredCalls: function(C) { for (var D = 0; D < Le.deferredCalls.length; ++D) - Le.deferredCalls[D].targetFunction == S && (Le.deferredCalls.splice(D, 1), --D); + Le.deferredCalls[D].targetFunction == C && (Le.deferredCalls.splice(D, 1), --D); }, canPerformEventHandlerRequests: function() { return Le.inEventHandler && Le.currentEventHandler.allowsDeferredCalls; }, runDeferredCalls: function() { if (!!Le.canPerformEventHandlerRequests()) - for (var S = 0; S < Le.deferredCalls.length; ++S) { - var D = Le.deferredCalls[S]; - Le.deferredCalls.splice(S, 1), --S, D.targetFunction.apply(null, D.argsList); + for (var C = 0; C < Le.deferredCalls.length; ++C) { + var D = Le.deferredCalls[C]; + Le.deferredCalls.splice(C, 1), --C, D.targetFunction.apply(null, D.argsList); } - }, eventHandlers: [], removeAllHandlersOnTarget: function(S, D) { + }, eventHandlers: [], removeAllHandlersOnTarget: function(C, D) { for (var B = 0; B < Le.eventHandlers.length; ++B) - Le.eventHandlers[B].target == S && (!D || D == Le.eventHandlers[B].eventTypeString) && Le._removeHandler(B--); - }, _removeHandler: function(S) { - var D = Le.eventHandlers[S]; - D.target.removeEventListener(D.eventTypeString, D.eventListenerFunc, D.useCapture), Le.eventHandlers.splice(S, 1); - }, registerOrRemoveHandler: function(S) { + Le.eventHandlers[B].target == C && (!D || D == Le.eventHandlers[B].eventTypeString) && Le._removeHandler(B--); + }, _removeHandler: function(C) { + var D = Le.eventHandlers[C]; + D.target.removeEventListener(D.eventTypeString, D.eventListenerFunc, D.useCapture), Le.eventHandlers.splice(C, 1); + }, registerOrRemoveHandler: function(C) { var D = function(ue) { - ++Le.inEventHandler, Le.currentEventHandler = S, Le.runDeferredCalls(), S.handlerFunc(ue), Le.runDeferredCalls(), --Le.inEventHandler; + ++Le.inEventHandler, Le.currentEventHandler = C, Le.runDeferredCalls(), C.handlerFunc(ue), Le.runDeferredCalls(), --Le.inEventHandler; }; - if (S.callbackfunc) - S.eventListenerFunc = D, S.target.addEventListener(S.eventTypeString, D, S.useCapture), Le.eventHandlers.push(S), Le.registerRemoveEventListeners(); + if (C.callbackfunc) + C.eventListenerFunc = D, C.target.addEventListener(C.eventTypeString, D, C.useCapture), Le.eventHandlers.push(C), Le.registerRemoveEventListeners(); else for (var B = 0; B < Le.eventHandlers.length; ++B) - Le.eventHandlers[B].target == S.target && Le.eventHandlers[B].eventTypeString == S.eventTypeString && Le._removeHandler(B--); - }, queueEventHandlerOnThread_iiii: function(S, D, B, Q, ue) { - Ci(function() { - var pe = Ri(12); - l()[pe >> 2] = B, l()[pe + 4 >> 2] = Q, l()[pe + 8 >> 2] = ue, Tf(S, 637534208, D, Q, pe); + Le.eventHandlers[B].target == C.target && Le.eventHandlers[B].eventTypeString == C.eventTypeString && Le._removeHandler(B--); + }, queueEventHandlerOnThread_iiii: function(C, D, B, Q, ue) { + Ni(function() { + var pe = Di(12); + l()[pe >> 2] = B, l()[pe + 4 >> 2] = Q, l()[pe + 8 >> 2] = ue, _f(C, 637534208, D, Q, pe); }); - }, getTargetThreadForEventCallback: function(S) { - switch (S) { + }, getTargetThreadForEventCallback: function(C) { + switch (C) { case 1: return 0; case 2: return $e.currentProxiedOperationCallerThread; default: - return S; + return C; } - }, getNodeNameForTarget: function(S) { - return S ? S == window ? "#window" : S == screen ? "#screen" : S && S.nodeName ? S.nodeName : "" : ""; + }, getNodeNameForTarget: function(C) { + return C ? C == window ? "#window" : C == screen ? "#screen" : C && C.nodeName ? C.nodeName : "" : ""; }, fullscreenEnabled: function() { return document.fullscreenEnabled || document.webkitFullscreenEnabled; } }; - function _h(S) { - var D = xi(S) + 1, B = Nf(D); - return Ls(S, B, D), B; + function Ah(C) { + var D = wi(C) + 1, B = $f(D); + return Ls(C, B, D), B; } - function Ah(S, D, B, Q) { - Ci(function() { - var ue = Ri(12), pe = 0; - D && (pe = _h(D)), l()[ue >> 2] = pe, l()[ue + 4 >> 2] = B, l()[ue + 8 >> 2] = Q, Tf(S, 657457152, 0, pe, ue); + function Eh(C, D, B, Q) { + Ni(function() { + var ue = Di(12), pe = 0; + D && (pe = Ah(D)), l()[ue >> 2] = pe, l()[ue + 4 >> 2] = B, l()[ue + 8 >> 2] = Q, _f(C, 657457152, 0, pe, ue); }); } - function Eh(S, D, B, Q) { - D = D ? en(D) : "", Ah(S, D, B, Q); + function Rh(C, D, B, Q) { + D = D ? tn(D) : "", Eh(C, D, B, Q); } - function Rh(S) { - return S > 2 ? en(S) : S; + function Dh(C) { + return C > 2 ? tn(C) : C; } - var Dh = [0, typeof document != "undefined" ? document : 0, typeof window != "undefined" ? window : 0]; - function Fh(S) { - S = Rh(S); - var D = Dh[S] || (typeof document != "undefined" ? document.querySelector(S) : void 0); + var Fh = [0, typeof document != "undefined" ? document : 0, typeof window != "undefined" ? window : 0]; + function Oh(C) { + C = Dh(C); + var D = Fh[C] || (typeof document != "undefined" ? document.querySelector(C) : void 0); return D; } - function bu(S) { - return Fh(S); + function bu(C) { + return Oh(C); } - function Sc(S, D, B) { - var Q = bu(S); + function Cc(C, D, B) { + var Q = bu(C); if (!Q) return -4; if (Q.canvasSharedPtr && (l()[Q.canvasSharedPtr >> 2] = D, l()[Q.canvasSharedPtr + 4 >> 2] = B), Q.offscreenCanvas || !Q.controlTransferredOffscreen) { @@ -2114,228 +2116,230 @@ var YT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js } Q.width = D, Q.height = B, ue && Q.GLctxObject.GLctx.viewport(0, 0, D, B); } else if (Q.canvasSharedPtr) { - var be = l()[Q.canvasSharedPtr + 8 >> 2]; - return Eh(be, S, D, B), 1; + var ye = l()[Q.canvasSharedPtr + 8 >> 2]; + return Rh(ye, C, D, B), 1; } else return -4; return 0; } - function Cc(S, D, B) { - return T ? Mr(2, 1, S, D, B) : Sc(S, D, B); + function Nc(C, D, B) { + return N ? Lr(2, 1, C, D, B) : Cc(C, D, B); } - function Oh(S, D, B) { - var Q = bu(S); - return Q ? Sc(S, D, B) : Cc(S, D, B); + function Ph(C, D, B) { + var Q = bu(C); + return Q ? Cc(C, D, B) : Nc(C, D, B); } - function Ph() { + function zh() { throw "unwind"; } - function zh(S) { - var D = S.getExtension("ANGLE_instanced_arrays"); + function Mh(C) { + var D = C.getExtension("ANGLE_instanced_arrays"); if (D) - return S.vertexAttribDivisor = function(B, Q) { + return C.vertexAttribDivisor = function(B, Q) { D.vertexAttribDivisorANGLE(B, Q); - }, S.drawArraysInstanced = function(B, Q, ue, pe) { + }, C.drawArraysInstanced = function(B, Q, ue, pe) { D.drawArraysInstancedANGLE(B, Q, ue, pe); - }, S.drawElementsInstanced = function(B, Q, ue, pe, be) { - D.drawElementsInstancedANGLE(B, Q, ue, pe, be); + }, C.drawElementsInstanced = function(B, Q, ue, pe, ye) { + D.drawElementsInstancedANGLE(B, Q, ue, pe, ye); }, 1; } - function Mh(S) { - var D = S.getExtension("OES_vertex_array_object"); + function Lh(C) { + var D = C.getExtension("OES_vertex_array_object"); if (D) - return S.createVertexArray = function() { + return C.createVertexArray = function() { return D.createVertexArrayOES(); - }, S.deleteVertexArray = function(B) { + }, C.deleteVertexArray = function(B) { D.deleteVertexArrayOES(B); - }, S.bindVertexArray = function(B) { + }, C.bindVertexArray = function(B) { D.bindVertexArrayOES(B); - }, S.isVertexArray = function(B) { + }, C.isVertexArray = function(B) { return D.isVertexArrayOES(B); }, 1; } - function Lh(S) { - var D = S.getExtension("WEBGL_draw_buffers"); + function Bh(C) { + var D = C.getExtension("WEBGL_draw_buffers"); if (D) - return S.drawBuffers = function(B, Q) { + return C.drawBuffers = function(B, Q) { D.drawBuffersWEBGL(B, Q); }, 1; } - function Bh(S) { - return !!(S.multiDrawWebgl = S.getExtension("WEBGL_multi_draw")); + function Vh(C) { + return !!(C.multiDrawWebgl = C.getExtension("WEBGL_multi_draw")); } var gt = { counter: 1, buffers: [], programs: [], framebuffers: [], renderbuffers: [], textures: [], shaders: [], vaos: [], contexts: {}, offscreenCanvases: {}, queries: [], stringCache: {}, unpackAlignment: 4, recordError: function(D) { gt.lastError || (gt.lastError = D); - }, getNewId: function(S) { - for (var D = gt.counter++, B = S.length; B < D; B++) - S[B] = null; + }, getNewId: function(C) { + for (var D = gt.counter++, B = C.length; B < D; B++) + C[B] = null; return D; - }, getSource: function(S, D, B, Q) { + }, getSource: function(C, D, B, Q) { for (var ue = "", pe = 0; pe < D; ++pe) { - var be = Q ? l()[Q + pe * 4 >> 2] : -1; - ue += en(l()[B + pe * 4 >> 2], be < 0 ? void 0 : be); + var ye = Q ? l()[Q + pe * 4 >> 2] : -1; + ue += tn(l()[B + pe * 4 >> 2], ye < 0 ? void 0 : ye); } return ue; - }, createContext: function(S, D) { - S.getContextSafariWebGL2Fixed || (S.getContextSafariWebGL2Fixed = S.getContext, S.getContext = function(ue, pe) { - var be = S.getContextSafariWebGL2Fixed(ue, pe); - return ue == "webgl" == be instanceof WebGLRenderingContext ? be : null; + }, createContext: function(C, D) { + C.getContextSafariWebGL2Fixed || (C.getContextSafariWebGL2Fixed = C.getContext, C.getContext = function(ue, pe) { + var ye = C.getContextSafariWebGL2Fixed(ue, pe); + return ue == "webgl" == ye instanceof WebGLRenderingContext ? ye : null; }); - var B = S.getContext("webgl", D); + var B = C.getContext("webgl", D); if (!B) return 0; var Q = gt.registerContext(B, D); return Q; - }, registerContext: function(S, D) { - var B = Nf(8); - l()[B + 4 >> 2] = Fc(); - var Q = { handle: B, attributes: D, version: D.majorVersion, GLctx: S }; - return S.canvas && (S.canvas.GLctxObject = Q), gt.contexts[B] = Q, (typeof D.enableExtensionsByDefault == "undefined" || D.enableExtensionsByDefault) && gt.initExtensions(Q), B; - }, makeContextCurrent: function(S) { - return gt.currentContext = gt.contexts[S], d.ctx = _c = gt.currentContext && gt.currentContext.GLctx, !(S && !_c); - }, getContext: function(S) { - return gt.contexts[S]; - }, deleteContext: function(S) { - gt.currentContext === gt.contexts[S] && (gt.currentContext = null), typeof Le == "object" && Le.removeAllHandlersOnTarget(gt.contexts[S].GLctx.canvas), gt.contexts[S] && gt.contexts[S].GLctx.canvas && (gt.contexts[S].GLctx.canvas.GLctxObject = void 0), Uv(gt.contexts[S].handle), gt.contexts[S] = null; - }, initExtensions: function(S) { - if (S || (S = gt.currentContext), !S.initExtensionsDone) { - S.initExtensionsDone = true; - var D = S.GLctx; - zh(D), Mh(D), Lh(D), D.disjointTimerQueryExt = D.getExtension("EXT_disjoint_timer_query"), Bh(D); + }, registerContext: function(C, D) { + var B = $f(8); + l()[B + 4 >> 2] = Oc(); + var Q = { handle: B, attributes: D, version: D.majorVersion, GLctx: C }; + return C.canvas && (C.canvas.GLctxObject = Q), gt.contexts[B] = Q, (typeof D.enableExtensionsByDefault == "undefined" || D.enableExtensionsByDefault) && gt.initExtensions(Q), B; + }, makeContextCurrent: function(C) { + return gt.currentContext = gt.contexts[C], d.ctx = Ac = gt.currentContext && gt.currentContext.GLctx, !(C && !Ac); + }, getContext: function(C) { + return gt.contexts[C]; + }, deleteContext: function(C) { + gt.currentContext === gt.contexts[C] && (gt.currentContext = null), typeof Le == "object" && Le.removeAllHandlersOnTarget(gt.contexts[C].GLctx.canvas), gt.contexts[C] && gt.contexts[C].GLctx.canvas && (gt.contexts[C].GLctx.canvas.GLctxObject = void 0), qv(gt.contexts[C].handle), gt.contexts[C] = null; + }, initExtensions: function(C) { + if (C || (C = gt.currentContext), !C.initExtensionsDone) { + C.initExtensionsDone = true; + var D = C.GLctx; + Mh(D), Lh(D), Bh(D), D.disjointTimerQueryExt = D.getExtension("EXT_disjoint_timer_query"), Vh(D); var B = D.getSupportedExtensions() || []; B.forEach(function(Q) { !Q.includes("lose_context") && !Q.includes("debug") && D.getExtension(Q); }); } - } }, Vh = ["default", "low-power", "high-performance"]; - function Wh(S, D) { - var B = D >> 2, Q = l()[B + 6], ue = { alpha: !!l()[B + 0], depth: !!l()[B + 1], stencil: !!l()[B + 2], antialias: !!l()[B + 3], premultipliedAlpha: !!l()[B + 4], preserveDrawingBuffer: !!l()[B + 5], powerPreference: Vh[Q], failIfMajorPerformanceCaveat: !!l()[B + 7], majorVersion: l()[B + 8], minorVersion: l()[B + 9], enableExtensionsByDefault: l()[B + 10], explicitSwapControl: l()[B + 11], proxyContextToMainThread: l()[B + 12], renderViaOffscreenBackBuffer: l()[B + 13] }, pe = bu(S); + } }, Wh = ["default", "low-power", "high-performance"]; + function Uh(C, D) { + var B = D >> 2, Q = l()[B + 6], ue = { alpha: !!l()[B + 0], depth: !!l()[B + 1], stencil: !!l()[B + 2], antialias: !!l()[B + 3], premultipliedAlpha: !!l()[B + 4], preserveDrawingBuffer: !!l()[B + 5], powerPreference: Wh[Q], failIfMajorPerformanceCaveat: !!l()[B + 7], majorVersion: l()[B + 8], minorVersion: l()[B + 9], enableExtensionsByDefault: l()[B + 10], explicitSwapControl: l()[B + 11], proxyContextToMainThread: l()[B + 12], renderViaOffscreenBackBuffer: l()[B + 13] }, pe = bu(C); if (!pe || ue.explicitSwapControl) return 0; - var be = gt.createContext(pe, ue); - return be; + var ye = gt.createContext(pe, ue); + return ye; } - function Uh(S, D) { - return Wh(S, D); + function Gh(C, D) { + return Uh(C, D); } - var Ti = { mappings: {}, buffers: [null, [], []], printChar: function(S, D) { - var B = Ti.buffers[S]; - D === 0 || D === 10 ? ((S === 1 ? te : ee)(Rn(B, 0)), B.length = 0) : B.push(D); + var $i = { mappings: {}, buffers: [null, [], []], printChar: function(C, D) { + var B = $i.buffers[C]; + D === 0 || D === 10 ? ((C === 1 ? te : ee)(Dn(B, 0)), B.length = 0) : B.push(D); }, varargs: void 0, get: function() { - Ti.varargs += 4; - var S = l()[Ti.varargs - 4 >> 2]; - return S; - }, getStr: function(S) { - var D = en(S); + $i.varargs += 4; + var C = l()[$i.varargs - 4 >> 2]; + return C; + }, getStr: function(C) { + var D = tn(C); return D; - }, get64: function(S, D) { - return S; + }, get64: function(C, D) { + return C; } }; - function Nc(S) { - return T ? Mr(3, 1, S) : 0; + function Tc(C) { + return N ? Lr(3, 1, C) : 0; } - function Tc(S, D, B, Q, ue) { - if (T) - return Mr(4, 1, S, D, B, Q, ue); + function $c(C, D, B, Q, ue) { + if (N) + return Lr(4, 1, C, D, B, Q, ue); } - function $c(S, D, B, Q) { - if (T) - return Mr(5, 1, S, D, B, Q); + function _c(C, D, B, Q) { + if (N) + return Lr(5, 1, C, D, B, Q); for (var ue = 0, pe = 0; pe < B; pe++) { - var be = l()[D >> 2], Te = l()[D + 4 >> 2]; + var ye = l()[D >> 2], Te = l()[D + 4 >> 2]; D += 8; for (var bt = 0; bt < Te; bt++) - Ti.printChar(S, i()[be + bt]); + $i.printChar(C, i()[ye + bt]); ue += Te; } return l()[Q >> 2] = ue, 0; } - function Gh(S) { - Ee(S); + function Hh(C) { + Ee(C); } $e.init(); - var _c, Hh = [null, wc, Cc, Nc, Tc, $c], Bv = false, Ac = { __clock_gettime: gh, __emscripten_init_main_thread_js: bh, __emscripten_thread_cleanup: yh, __pthread_create_js: vh, _emscripten_default_pthread_stack_size: xh, _emscripten_notify_thread_queue: wh, abort: kh, emscripten_check_blocking_allowed: Ih, emscripten_get_heap_max: Ic, emscripten_get_now: zr, emscripten_memcpy_big: Sh, emscripten_num_logical_cores: Ch, emscripten_receive_on_main_thread_js: Nh, emscripten_resize_heap: $h, emscripten_set_canvas_element_size: Oh, emscripten_unwind_to_js_event_loop: Ph, emscripten_webgl_create_context: Uh, exit: xc, fd_close: Nc, fd_seek: Tc, fd_write: $c, memory: Ce || d.wasmMemory, setTempRet0: Gh }, Vv = ah(), qh = d.___wasm_call_ctors = function() { - return (qh = d.___wasm_call_ctors = d.asm.__wasm_call_ctors).apply(null, arguments); - }, jh = d._init = function() { - return (jh = d._init = d.asm.init).apply(null, arguments); - }, Kh = d._init_with_threads_count = function() { - return (Kh = d._init_with_threads_count = d.asm.init_with_threads_count).apply(null, arguments); - }, Xh = d._get_threads_count = function() { - return (Xh = d._get_threads_count = d.asm.get_threads_count).apply(null, arguments); - }, Yh = d._register_tensor = function() { - return (Yh = d._register_tensor = d.asm.register_tensor).apply(null, arguments); - }, Qh = d._dispose_data = function() { - return (Qh = d._dispose_data = d.asm.dispose_data).apply(null, arguments); - }, Zh = d._dispose = function() { - return (Zh = d._dispose = d.asm.dispose).apply(null, arguments); - }, Jh = d._Abs = function() { - return (Jh = d._Abs = d.asm.Abs).apply(null, arguments); - }, ef = d._Add = function() { - return (ef = d._Add = d.asm.Add).apply(null, arguments); - }, tf = d._AddN = function() { - return (tf = d._AddN = d.asm.AddN).apply(null, arguments); - }, nf = d._All = function() { - return (nf = d._All = d.asm.All).apply(null, arguments); - }, sf = d._Any = function() { - return (sf = d._Any = d.asm.Any).apply(null, arguments); - }, rf = d._ArgMax = function() { - return (rf = d._ArgMax = d.asm.ArgMax).apply(null, arguments); - }, af = d._AvgPool = function() { - return (af = d._AvgPool = d.asm.AvgPool).apply(null, arguments); - }, of = d._BatchMatMul = function() { - return (of = d._BatchMatMul = d.asm.BatchMatMul).apply(null, arguments); - }, uf = d._Ceil = function() { - return (uf = d._Ceil = d.asm.Ceil).apply(null, arguments); - }, lf = d._ClipByValue = function() { - return (lf = d._ClipByValue = d.asm.ClipByValue).apply(null, arguments); - }, cf = d._Conv2D = function() { - return (cf = d._Conv2D = d.asm.Conv2D).apply(null, arguments); - }, df = d._Conv2DBackpropInput = function() { - return (df = d._Conv2DBackpropInput = d.asm.Conv2DBackpropInput).apply(null, arguments); - }, pf = d._Cos = function() { - return (pf = d._Cos = d.asm.Cos).apply(null, arguments); - }, hf = d._Cosh = function() { - return (hf = d._Cosh = d.asm.Cosh).apply(null, arguments); - }, ff = d._CropAndResize = function() { - return (ff = d._CropAndResize = d.asm.CropAndResize).apply(null, arguments); - }, mf = d._Cumsum = function() { - return (mf = d._Cumsum = d.asm.Cumsum).apply(null, arguments); - }, gf = d._DepthToSpace = function() { - return (gf = d._DepthToSpace = d.asm.DepthToSpace).apply(null, arguments); - }, bf = d._DepthwiseConv2dNative = function() { - return (bf = d._DepthwiseConv2dNative = d.asm.DepthwiseConv2dNative).apply(null, arguments); - }, yf = d._Elu = function() { - return (yf = d._Elu = d.asm.Elu).apply(null, arguments); - }, vf = d._Equal = function() { - return (vf = d._Equal = d.asm.Equal).apply(null, arguments); - }, xf = d._Exp = function() { - return (xf = d._Exp = d.asm.Exp).apply(null, arguments); - }, wf = d._FlipLeftRight = function() { - return (wf = d._FlipLeftRight = d.asm.FlipLeftRight).apply(null, arguments); - }, Ec = d._Floor = function() { - return (Ec = d._Floor = d.asm.Floor).apply(null, arguments); - }, Rc = d._FloorDiv = function() { - return (Rc = d._FloorDiv = d.asm.FloorDiv).apply(null, arguments); + var Ac, qh = [null, kc, Nc, Tc, $c, _c], Uv = false, Ec = { __clock_gettime: bh, __emscripten_init_main_thread_js: yh, __emscripten_thread_cleanup: vh, __pthread_create_js: xh, _emscripten_default_pthread_stack_size: wh, _emscripten_notify_thread_queue: kh, abort: Ih, emscripten_check_blocking_allowed: Sh, emscripten_get_heap_max: Sc, emscripten_get_now: Mr, emscripten_memcpy_big: Ch, emscripten_num_logical_cores: Nh, emscripten_receive_on_main_thread_js: Th, emscripten_resize_heap: _h, emscripten_set_canvas_element_size: Ph, emscripten_unwind_to_js_event_loop: zh, emscripten_webgl_create_context: Gh, exit: wc, fd_close: Tc, fd_seek: $c, fd_write: _c, memory: Ce || d.wasmMemory, setTempRet0: Hh }, Gv = ih(), jh = d.___wasm_call_ctors = function() { + return (jh = d.___wasm_call_ctors = d.asm.__wasm_call_ctors).apply(null, arguments); + }, Kh = d._init = function() { + return (Kh = d._init = d.asm.init).apply(null, arguments); + }, Xh = d._init_with_threads_count = function() { + return (Xh = d._init_with_threads_count = d.asm.init_with_threads_count).apply(null, arguments); + }, Yh = d._get_threads_count = function() { + return (Yh = d._get_threads_count = d.asm.get_threads_count).apply(null, arguments); + }, Qh = d._register_tensor = function() { + return (Qh = d._register_tensor = d.asm.register_tensor).apply(null, arguments); + }, Zh = d._dispose_data = function() { + return (Zh = d._dispose_data = d.asm.dispose_data).apply(null, arguments); + }, Jh = d._dispose = function() { + return (Jh = d._dispose = d.asm.dispose).apply(null, arguments); + }, ef = d._Abs = function() { + return (ef = d._Abs = d.asm.Abs).apply(null, arguments); + }, tf = d._Add = function() { + return (tf = d._Add = d.asm.Add).apply(null, arguments); + }, nf = d._AddN = function() { + return (nf = d._AddN = d.asm.AddN).apply(null, arguments); + }, sf = d._All = function() { + return (sf = d._All = d.asm.All).apply(null, arguments); + }, rf = d._Any = function() { + return (rf = d._Any = d.asm.Any).apply(null, arguments); + }, af = d._ArgMax = function() { + return (af = d._ArgMax = d.asm.ArgMax).apply(null, arguments); + }, of = d._AvgPool = function() { + return (of = d._AvgPool = d.asm.AvgPool).apply(null, arguments); + }, uf = d._BatchMatMul = function() { + return (uf = d._BatchMatMul = d.asm.BatchMatMul).apply(null, arguments); + }, lf = d._Ceil = function() { + return (lf = d._Ceil = d.asm.Ceil).apply(null, arguments); + }, cf = d._ClipByValue = function() { + return (cf = d._ClipByValue = d.asm.ClipByValue).apply(null, arguments); + }, df = d._Conv2D = function() { + return (df = d._Conv2D = d.asm.Conv2D).apply(null, arguments); + }, pf = d._Conv2DBackpropInput = function() { + return (pf = d._Conv2DBackpropInput = d.asm.Conv2DBackpropInput).apply(null, arguments); + }, hf = d._Cos = function() { + return (hf = d._Cos = d.asm.Cos).apply(null, arguments); + }, ff = d._Cosh = function() { + return (ff = d._Cosh = d.asm.Cosh).apply(null, arguments); + }, mf = d._CropAndResize = function() { + return (mf = d._CropAndResize = d.asm.CropAndResize).apply(null, arguments); + }, gf = d._Cumprod = function() { + return (gf = d._Cumprod = d.asm.Cumprod).apply(null, arguments); + }, bf = d._Cumsum = function() { + return (bf = d._Cumsum = d.asm.Cumsum).apply(null, arguments); + }, yf = d._DepthToSpace = function() { + return (yf = d._DepthToSpace = d.asm.DepthToSpace).apply(null, arguments); + }, vf = d._DepthwiseConv2dNative = function() { + return (vf = d._DepthwiseConv2dNative = d.asm.DepthwiseConv2dNative).apply(null, arguments); + }, xf = d._Elu = function() { + return (xf = d._Elu = d.asm.Elu).apply(null, arguments); + }, wf = d._Equal = function() { + return (wf = d._Equal = d.asm.Equal).apply(null, arguments); + }, kf = d._Exp = function() { + return (kf = d._Exp = d.asm.Exp).apply(null, arguments); + }, If = d._FlipLeftRight = function() { + return (If = d._FlipLeftRight = d.asm.FlipLeftRight).apply(null, arguments); + }, Rc = d._Floor = function() { + return (Rc = d._Floor = d.asm.Floor).apply(null, arguments); + }, Dc = d._FloorDiv = function() { + return (Dc = d._FloorDiv = d.asm.FloorDiv).apply(null, arguments); }, yu = d._FusedBatchNorm = function() { return (yu = d._FusedBatchNorm = d.asm.FusedBatchNorm).apply(null, arguments); - }, kf = d._FusedConv2D = function() { - return (kf = d._FusedConv2D = d.asm.FusedConv2D).apply(null, arguments); - }, If = d._FusedDepthwiseConv2D = function() { - return (If = d._FusedDepthwiseConv2D = d.asm.FusedDepthwiseConv2D).apply(null, arguments); - }, $i = d._Gather = function() { - return ($i = d._Gather = d.asm.Gather).apply(null, arguments); + }, Sf = d._FusedConv2D = function() { + return (Sf = d._FusedConv2D = d.asm.FusedConv2D).apply(null, arguments); + }, Cf = d._FusedDepthwiseConv2D = function() { + return (Cf = d._FusedDepthwiseConv2D = d.asm.FusedDepthwiseConv2D).apply(null, arguments); + }, _i = d._Gather = function() { + return (_i = d._Gather = d.asm.Gather).apply(null, arguments); }, vu = d._GatherNd = function() { return (vu = d._GatherNd = d.asm.GatherNd).apply(null, arguments); }, xu = d._Greater = function() { return (xu = d._Greater = d.asm.Greater).apply(null, arguments); - }, Wv = d._GreaterEqual = function() { - return (Wv = d._GreaterEqual = d.asm.GreaterEqual).apply(null, arguments); - }, _i = d._LeakyRelu = function() { - return (_i = d._LeakyRelu = d.asm.LeakyRelu).apply(null, arguments); - }, Ai = d._Less = function() { - return (Ai = d._Less = d.asm.Less).apply(null, arguments); - }, Sf = d._LessEqual = function() { - return (Sf = d._LessEqual = d.asm.LessEqual).apply(null, arguments); + }, Hv = d._GreaterEqual = function() { + return (Hv = d._GreaterEqual = d.asm.GreaterEqual).apply(null, arguments); + }, Ai = d._LeakyRelu = function() { + return (Ai = d._LeakyRelu = d.asm.LeakyRelu).apply(null, arguments); + }, Ei = d._Less = function() { + return (Ei = d._Less = d.asm.Less).apply(null, arguments); + }, Nf = d._LessEqual = function() { + return (Nf = d._LessEqual = d.asm.LessEqual).apply(null, arguments); }, H = d._Log = function() { return (H = d._Log = d.asm.Log).apply(null, arguments); }, J = d._LogicalAnd = function() { @@ -2354,154 +2358,154 @@ var YT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js return (ze = d._Minimum = d.asm.Minimum).apply(null, arguments); }, Tt = d._MirrorPad = function() { return (Tt = d._MirrorPad = d.asm.MirrorPad).apply(null, arguments); - }, rs = d._Multiply = function() { - return (rs = d._Multiply = d.asm.Multiply).apply(null, arguments); - }, as = d._Neg = function() { - return (as = d._Neg = d.asm.Neg).apply(null, arguments); - }, Ei = d._NonMaxSuppressionV3 = function() { - return (Ei = d._NonMaxSuppressionV3 = d.asm.NonMaxSuppressionV3).apply(null, arguments); - }, Lr = d._NonMaxSuppressionV4 = function() { - return (Lr = d._NonMaxSuppressionV4 = d.asm.NonMaxSuppressionV4).apply(null, arguments); - }, Cf = d._NonMaxSuppressionV5 = function() { - return (Cf = d._NonMaxSuppressionV5 = d.asm.NonMaxSuppressionV5).apply(null, arguments); - }, rn = d._NotEqual = function() { - return (rn = d._NotEqual = d.asm.NotEqual).apply(null, arguments); + }, is = d._Multiply = function() { + return (is = d._Multiply = d.asm.Multiply).apply(null, arguments); + }, os = d._Neg = function() { + return (os = d._Neg = d.asm.Neg).apply(null, arguments); + }, Ri = d._NonMaxSuppressionV3 = function() { + return (Ri = d._NonMaxSuppressionV3 = d.asm.NonMaxSuppressionV3).apply(null, arguments); + }, Br = d._NonMaxSuppressionV4 = function() { + return (Br = d._NonMaxSuppressionV4 = d.asm.NonMaxSuppressionV4).apply(null, arguments); + }, Tf = d._NonMaxSuppressionV5 = function() { + return (Tf = d._NonMaxSuppressionV5 = d.asm.NonMaxSuppressionV5).apply(null, arguments); + }, an = d._NotEqual = function() { + return (an = d._NotEqual = d.asm.NotEqual).apply(null, arguments); }, nr = d._OneHot = function() { return (nr = d._OneHot = d.asm.OneHot).apply(null, arguments); - }, Dc = d._PadV2 = function() { - return (Dc = d._PadV2 = d.asm.PadV2).apply(null, arguments); - }, MN = d._Pow = function() { - return (MN = d._Pow = d.asm.Pow).apply(null, arguments); - }, LN = d._Prelu = function() { - return (LN = d._Prelu = d.asm.Prelu).apply(null, arguments); - }, BN = d._Prod = function() { - return (BN = d._Prod = d.asm.Prod).apply(null, arguments); - }, VN = d._RealDiv = function() { - return (VN = d._RealDiv = d.asm.RealDiv).apply(null, arguments); - }, WN = d._Relu = function() { - return (WN = d._Relu = d.asm.Relu).apply(null, arguments); - }, UN = d._Relu6 = function() { - return (UN = d._Relu6 = d.asm.Relu6).apply(null, arguments); - }, GN = d._ResizeBilinear = function() { - return (GN = d._ResizeBilinear = d.asm.ResizeBilinear).apply(null, arguments); - }, HN = d._Reverse = function() { - return (HN = d._Reverse = d.asm.Reverse).apply(null, arguments); - }, qN = d._RotateWithOffset = function() { - return (qN = d._RotateWithOffset = d.asm.RotateWithOffset).apply(null, arguments); - }, jN = d._Round = function() { - return (jN = d._Round = d.asm.Round).apply(null, arguments); - }, KN = d._Rsqrt = function() { - return (KN = d._Rsqrt = d.asm.Rsqrt).apply(null, arguments); - }, XN = d._ScatterNd = function() { - return (XN = d._ScatterNd = d.asm.ScatterNd).apply(null, arguments); - }, YN = d._SelectV2 = function() { - return (YN = d._SelectV2 = d.asm.SelectV2).apply(null, arguments); - }, QN = d._Sigmoid = function() { - return (QN = d._Sigmoid = d.asm.Sigmoid).apply(null, arguments); - }, ZN = d._Sin = function() { - return (ZN = d._Sin = d.asm.Sin).apply(null, arguments); - }, JN = d._Softmax = function() { - return (JN = d._Softmax = d.asm.Softmax).apply(null, arguments); - }, eT = d._SparseFillEmptyRows = function() { - return (eT = d._SparseFillEmptyRows = d.asm.SparseFillEmptyRows).apply(null, arguments); - }, tT = d._SparseReshape = function() { - return (tT = d._SparseReshape = d.asm.SparseReshape).apply(null, arguments); - }, nT = d._SparseSegmentReduction = function() { - return (nT = d._SparseSegmentReduction = d.asm.SparseSegmentReduction).apply(null, arguments); - }, sT = d._Sqrt = function() { - return (sT = d._Sqrt = d.asm.Sqrt).apply(null, arguments); - }, rT = d._Square = function() { - return (rT = d._Square = d.asm.Square).apply(null, arguments); - }, aT = d._SquaredDifference = function() { - return (aT = d._SquaredDifference = d.asm.SquaredDifference).apply(null, arguments); - }, iT = d._Step = function() { - return (iT = d._Step = d.asm.Step).apply(null, arguments); - }, oT = d._StridedSlice = function() { - return (oT = d._StridedSlice = d.asm.StridedSlice).apply(null, arguments); - }, uT = d._Sub = function() { - return (uT = d._Sub = d.asm.Sub).apply(null, arguments); - }, lT = d._Sum = function() { - return (lT = d._Sum = d.asm.Sum).apply(null, arguments); - }, cT = d._Tan = function() { - return (cT = d._Tan = d.asm.Tan).apply(null, arguments); - }, dT = d._Tanh = function() { - return (dT = d._Tanh = d.asm.Tanh).apply(null, arguments); - }, pT = d._Tile = function() { - return (pT = d._Tile = d.asm.Tile).apply(null, arguments); - }, hT = d._TopK = function() { - return (hT = d._TopK = d.asm.TopK).apply(null, arguments); - }, fT = d._Transform = function() { - return (fT = d._Transform = d.asm.Transform).apply(null, arguments); - }, mT = d._Transpose = function() { - return (mT = d._Transpose = d.asm.Transpose).apply(null, arguments); - }, gT = d.__FusedMatMul = function() { - return (gT = d.__FusedMatMul = d.asm._FusedMatMul).apply(null, arguments); - }, Nf = d._malloc = function() { - return (Nf = d._malloc = d.asm.malloc).apply(null, arguments); - }, Uv = d._free = function() { - return (Uv = d._free = d.asm.free).apply(null, arguments); - }, bT = d._emscripten_tls_init = function() { - return (bT = d._emscripten_tls_init = d.asm.emscripten_tls_init).apply(null, arguments); - }, Gv = d.___errno_location = function() { - return (Gv = d.___errno_location = d.asm.__errno_location).apply(null, arguments); - }, Fc = d._pthread_self = function() { - return (Fc = d._pthread_self = d.asm.pthread_self).apply(null, arguments); - }, Hv = d._emscripten_main_thread_process_queued_calls = function() { - return (Hv = d._emscripten_main_thread_process_queued_calls = d.asm.emscripten_main_thread_process_queued_calls).apply(null, arguments); - }, yT = d.__emscripten_thread_crashed = function() { - return (yT = d.__emscripten_thread_crashed = d.asm._emscripten_thread_crashed).apply(null, arguments); - }, qv = d.__emscripten_thread_init = function() { - return (qv = d.__emscripten_thread_init = d.asm._emscripten_thread_init).apply(null, arguments); - }, vT = d._emscripten_current_thread_process_queued_calls = function() { - return (vT = d._emscripten_current_thread_process_queued_calls = d.asm.emscripten_current_thread_process_queued_calls).apply(null, arguments); - }, xT = d._emscripten_main_browser_thread_id = function() { - return (xT = d._emscripten_main_browser_thread_id = d.asm.emscripten_main_browser_thread_id).apply(null, arguments); - }, wT = d._emscripten_sync_run_in_main_thread_2 = function() { - return (wT = d._emscripten_sync_run_in_main_thread_2 = d.asm.emscripten_sync_run_in_main_thread_2).apply(null, arguments); - }, jv = d._emscripten_sync_run_in_main_thread_4 = function() { - return (jv = d._emscripten_sync_run_in_main_thread_4 = d.asm.emscripten_sync_run_in_main_thread_4).apply(null, arguments); - }, Kv = d._emscripten_run_in_main_runtime_thread_js = function() { - return (Kv = d._emscripten_run_in_main_runtime_thread_js = d.asm.emscripten_run_in_main_runtime_thread_js).apply(null, arguments); - }, Tf = d._emscripten_dispatch_to_thread_ = function() { - return (Tf = d._emscripten_dispatch_to_thread_ = d.asm.emscripten_dispatch_to_thread_).apply(null, arguments); - }, $f = d.__emscripten_thread_free_data = function() { - return ($f = d.__emscripten_thread_free_data = d.asm._emscripten_thread_free_data).apply(null, arguments); - }, kT = d.__emscripten_thread_exit = function() { - return (kT = d.__emscripten_thread_exit = d.asm._emscripten_thread_exit).apply(null, arguments); - }, IT = d._memalign = function() { - return (IT = d._memalign = d.asm.memalign).apply(null, arguments); - }, Xv = d._emscripten_stack_set_limits = function() { - return (Xv = d._emscripten_stack_set_limits = d.asm.emscripten_stack_set_limits).apply(null, arguments); - }, _f = d.stackSave = function() { - return (_f = d.stackSave = d.asm.stackSave).apply(null, arguments); - }, Oc = d.stackRestore = function() { - return (Oc = d.stackRestore = d.asm.stackRestore).apply(null, arguments); - }, Ri = d.stackAlloc = function() { - return (Ri = d.stackAlloc = d.asm.stackAlloc).apply(null, arguments); - }, ST = d.dynCall_iijjiiii = function() { - return (ST = d.dynCall_iijjiiii = d.asm.dynCall_iijjiiii).apply(null, arguments); - }, CT = d.dynCall_jiji = function() { - return (CT = d.dynCall_jiji = d.asm.dynCall_jiji).apply(null, arguments); - }, Yv = d.__emscripten_allow_main_runtime_queued_calls = 21408; - d.cwrap = Jt, d.keepRuntimeAlive = Or, d.PThread = $e, d.PThread = $e, d.wasmMemory = Ce, d.ExitStatus = wu; - var Pc; - function wu(S) { - this.name = "ExitStatus", this.message = "Program terminated with exit(" + S + ")", this.status = S; + }, Fc = d._PadV2 = function() { + return (Fc = d._PadV2 = d.asm.PadV2).apply(null, arguments); + }, jN = d._Pow = function() { + return (jN = d._Pow = d.asm.Pow).apply(null, arguments); + }, KN = d._Prelu = function() { + return (KN = d._Prelu = d.asm.Prelu).apply(null, arguments); + }, XN = d._Prod = function() { + return (XN = d._Prod = d.asm.Prod).apply(null, arguments); + }, YN = d._RealDiv = function() { + return (YN = d._RealDiv = d.asm.RealDiv).apply(null, arguments); + }, QN = d._Relu = function() { + return (QN = d._Relu = d.asm.Relu).apply(null, arguments); + }, ZN = d._Relu6 = function() { + return (ZN = d._Relu6 = d.asm.Relu6).apply(null, arguments); + }, JN = d._ResizeBilinear = function() { + return (JN = d._ResizeBilinear = d.asm.ResizeBilinear).apply(null, arguments); + }, eT = d._Reverse = function() { + return (eT = d._Reverse = d.asm.Reverse).apply(null, arguments); + }, tT = d._RotateWithOffset = function() { + return (tT = d._RotateWithOffset = d.asm.RotateWithOffset).apply(null, arguments); + }, nT = d._Round = function() { + return (nT = d._Round = d.asm.Round).apply(null, arguments); + }, sT = d._Rsqrt = function() { + return (sT = d._Rsqrt = d.asm.Rsqrt).apply(null, arguments); + }, rT = d._ScatterNd = function() { + return (rT = d._ScatterNd = d.asm.ScatterNd).apply(null, arguments); + }, aT = d._SelectV2 = function() { + return (aT = d._SelectV2 = d.asm.SelectV2).apply(null, arguments); + }, iT = d._Sigmoid = function() { + return (iT = d._Sigmoid = d.asm.Sigmoid).apply(null, arguments); + }, oT = d._Sin = function() { + return (oT = d._Sin = d.asm.Sin).apply(null, arguments); + }, uT = d._Softmax = function() { + return (uT = d._Softmax = d.asm.Softmax).apply(null, arguments); + }, lT = d._SparseFillEmptyRows = function() { + return (lT = d._SparseFillEmptyRows = d.asm.SparseFillEmptyRows).apply(null, arguments); + }, cT = d._SparseReshape = function() { + return (cT = d._SparseReshape = d.asm.SparseReshape).apply(null, arguments); + }, dT = d._SparseSegmentReduction = function() { + return (dT = d._SparseSegmentReduction = d.asm.SparseSegmentReduction).apply(null, arguments); + }, pT = d._Sqrt = function() { + return (pT = d._Sqrt = d.asm.Sqrt).apply(null, arguments); + }, hT = d._Square = function() { + return (hT = d._Square = d.asm.Square).apply(null, arguments); + }, fT = d._SquaredDifference = function() { + return (fT = d._SquaredDifference = d.asm.SquaredDifference).apply(null, arguments); + }, mT = d._Step = function() { + return (mT = d._Step = d.asm.Step).apply(null, arguments); + }, gT = d._StridedSlice = function() { + return (gT = d._StridedSlice = d.asm.StridedSlice).apply(null, arguments); + }, bT = d._Sub = function() { + return (bT = d._Sub = d.asm.Sub).apply(null, arguments); + }, yT = d._Sum = function() { + return (yT = d._Sum = d.asm.Sum).apply(null, arguments); + }, vT = d._Tan = function() { + return (vT = d._Tan = d.asm.Tan).apply(null, arguments); + }, xT = d._Tanh = function() { + return (xT = d._Tanh = d.asm.Tanh).apply(null, arguments); + }, wT = d._Tile = function() { + return (wT = d._Tile = d.asm.Tile).apply(null, arguments); + }, kT = d._TopK = function() { + return (kT = d._TopK = d.asm.TopK).apply(null, arguments); + }, IT = d._Transform = function() { + return (IT = d._Transform = d.asm.Transform).apply(null, arguments); + }, ST = d._Transpose = function() { + return (ST = d._Transpose = d.asm.Transpose).apply(null, arguments); + }, CT = d.__FusedMatMul = function() { + return (CT = d.__FusedMatMul = d.asm._FusedMatMul).apply(null, arguments); + }, $f = d._malloc = function() { + return ($f = d._malloc = d.asm.malloc).apply(null, arguments); + }, qv = d._free = function() { + return (qv = d._free = d.asm.free).apply(null, arguments); + }, NT = d._emscripten_tls_init = function() { + return (NT = d._emscripten_tls_init = d.asm.emscripten_tls_init).apply(null, arguments); + }, jv = d.___errno_location = function() { + return (jv = d.___errno_location = d.asm.__errno_location).apply(null, arguments); + }, Oc = d._pthread_self = function() { + return (Oc = d._pthread_self = d.asm.pthread_self).apply(null, arguments); + }, Kv = d._emscripten_main_thread_process_queued_calls = function() { + return (Kv = d._emscripten_main_thread_process_queued_calls = d.asm.emscripten_main_thread_process_queued_calls).apply(null, arguments); + }, TT = d.__emscripten_thread_crashed = function() { + return (TT = d.__emscripten_thread_crashed = d.asm._emscripten_thread_crashed).apply(null, arguments); + }, Xv = d.__emscripten_thread_init = function() { + return (Xv = d.__emscripten_thread_init = d.asm._emscripten_thread_init).apply(null, arguments); + }, $T = d._emscripten_current_thread_process_queued_calls = function() { + return ($T = d._emscripten_current_thread_process_queued_calls = d.asm.emscripten_current_thread_process_queued_calls).apply(null, arguments); + }, _T = d._emscripten_main_browser_thread_id = function() { + return (_T = d._emscripten_main_browser_thread_id = d.asm.emscripten_main_browser_thread_id).apply(null, arguments); + }, AT = d._emscripten_sync_run_in_main_thread_2 = function() { + return (AT = d._emscripten_sync_run_in_main_thread_2 = d.asm.emscripten_sync_run_in_main_thread_2).apply(null, arguments); + }, Yv = d._emscripten_sync_run_in_main_thread_4 = function() { + return (Yv = d._emscripten_sync_run_in_main_thread_4 = d.asm.emscripten_sync_run_in_main_thread_4).apply(null, arguments); + }, Qv = d._emscripten_run_in_main_runtime_thread_js = function() { + return (Qv = d._emscripten_run_in_main_runtime_thread_js = d.asm.emscripten_run_in_main_runtime_thread_js).apply(null, arguments); + }, _f = d._emscripten_dispatch_to_thread_ = function() { + return (_f = d._emscripten_dispatch_to_thread_ = d.asm.emscripten_dispatch_to_thread_).apply(null, arguments); + }, Af = d.__emscripten_thread_free_data = function() { + return (Af = d.__emscripten_thread_free_data = d.asm._emscripten_thread_free_data).apply(null, arguments); + }, ET = d.__emscripten_thread_exit = function() { + return (ET = d.__emscripten_thread_exit = d.asm._emscripten_thread_exit).apply(null, arguments); + }, RT = d._memalign = function() { + return (RT = d._memalign = d.asm.memalign).apply(null, arguments); + }, Zv = d._emscripten_stack_set_limits = function() { + return (Zv = d._emscripten_stack_set_limits = d.asm.emscripten_stack_set_limits).apply(null, arguments); + }, Ef = d.stackSave = function() { + return (Ef = d.stackSave = d.asm.stackSave).apply(null, arguments); + }, Pc = d.stackRestore = function() { + return (Pc = d.stackRestore = d.asm.stackRestore).apply(null, arguments); + }, Di = d.stackAlloc = function() { + return (Di = d.stackAlloc = d.asm.stackAlloc).apply(null, arguments); + }, DT = d.dynCall_iijjiiii = function() { + return (DT = d.dynCall_iijjiiii = d.asm.dynCall_iijjiiii).apply(null, arguments); + }, FT = d.dynCall_jiji = function() { + return (FT = d.dynCall_jiji = d.asm.dynCall_jiji).apply(null, arguments); + }, Jv = d.__emscripten_allow_main_runtime_queued_calls = 21456; + d.cwrap = en, d.keepRuntimeAlive = Pr, d.PThread = $e, d.PThread = $e, d.wasmMemory = Ce, d.ExitStatus = wu; + var zc; + function wu(C) { + this.name = "ExitStatus", this.message = "Program terminated with exit(" + C + ")", this.status = C; } - ss = function S() { - Pc || Af(), Pc || (ss = S); + as = function C() { + zc || Rf(), zc || (as = C); }; - function Af(S) { - if (S = S || b, tr > 0) + function Rf(C) { + if (C = C || b, tr > 0) return; - if (T) { + if (N) { h(d), hu(), postMessage({ cmd: "loaded" }); return; } - if (nn(), tr > 0) + if (sn(), tr > 0) return; function D() { - Pc || (Pc = true, d.calledRun = true, !rt && (hu(), h(d), d.onRuntimeInitialized && d.onRuntimeInitialized(), sh())); + zc || (zc = true, d.calledRun = true, !at && (hu(), h(d), d.onRuntimeInitialized && d.onRuntimeInitialized(), rh())); } d.setStatus ? (d.setStatus("Running..."), setTimeout(function() { setTimeout(function() { @@ -2509,39 +2513,39 @@ var YT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js }, 1), D(); }, 1)) : D(); } - d.run = Af; - function NT(S, D) { - if (Zt = S, !D && T) - throw wc(S), "unwind"; - Or() || nh(), TT(S); + d.run = Rf; + function OT(C, D) { + if (Jt = C, !D && N) + throw kc(C), "unwind"; + Pr() || sh(), PT(C); } - function TT(S) { - Zt = S, Or() || ($e.terminateAllThreads(), d.onExit && d.onExit(S), rt = true), v(S, new wu(S)); + function PT(C) { + Jt = C, Pr() || ($e.terminateAllThreads(), d.onExit && d.onExit(C), at = true), v(C, new wu(C)); } if (d.preInit) for (typeof d.preInit == "function" && (d.preInit = [d.preInit]); d.preInit.length > 0; ) d.preInit.pop()(); - Af(); - var zc; - m && (zc = { uncaughtException: process.listeners("uncaughtException").filter(function(S) { - return !m.uncaughtException.indexOf(S) > -1; - }), unhandledRejection: process.listeners("unhandledRejection").filter(function(S) { - return !m.unhandledRejection.indexOf(S) > -1; - }) }); + Rf(); var Mc; + m && (Mc = { uncaughtException: process.listeners("uncaughtException").filter(function(C) { + return !m.uncaughtException.indexOf(C) > -1; + }), unhandledRejection: process.listeners("unhandledRejection").filter(function(C) { + return !m.unhandledRejection.indexOf(C) > -1; + }) }); + var Lc; if (typeof WasmBackendModule != "undefined") - Mc = WasmBackendModule; + Lc = WasmBackendModule; else if (typeof r != "undefined") - Mc = r; + Lc = r; else throw new Error("Could not find wasm module in post.js"); - if (zc) { - var $T = Mc._dispose; - Mc._dispose = function() { - $T(), zc.uncaughtException.forEach(function(S) { - process.removeListener("uncaughtException", S); - }), zc.unhandledRejection.forEach(function(S) { - process.removeListener("unhandledRejection", S); + if (Mc) { + var zT = Lc._dispose; + Lc._dispose = function() { + zT(), Mc.uncaughtException.forEach(function(C) { + process.removeListener("uncaughtException", C); + }), Mc.unhandledRejection.forEach(function(C) { + process.removeListener("unhandledRejection", C); }); }; } @@ -2552,7 +2556,7 @@ var YT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js return n; }) : typeof e == "object" && (e.WasmBackendModuleThreadedSimd = n); } }); -var QT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"(e, t) { +var i$ = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"(e, t) { var n = (() => { var s = typeof document != "undefined" && document.currentScript ? document.currentScript.src : void 0; return typeof __filename != "undefined" && (s = s || __filename), function(r) { @@ -2569,22 +2573,22 @@ var QT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"(e, t) { function b(H) { return a.locateFile ? a.locateFile(H, g) : g + H; } - var y, v, x, k; - function C(H) { + var y, v, w, k; + function T(H) { if (H instanceof vu) return; R("exiting due to exception: " + H); } - var T, E, A; - m ? (f ? g = cd().dirname(g) + "/" : g = __dirname + "/", A = () => { - E || (T = Jm(), E = cd()); + var N, E, A; + m ? (f ? g = dd().dirname(g) + "/" : g = __dirname + "/", A = () => { + E || (N = tg(), E = dd()); }, y = function(J, de) { - return A(), J = E.normalize(J), T.readFileSync(J, de ? void 0 : "utf8"); - }, x = (H) => { + return A(), J = E.normalize(J), N.readFileSync(J, de ? void 0 : "utf8"); + }, w = (H) => { var J = y(H, true); return J.buffer || (J = new Uint8Array(J)), J; }, v = (H, J, de) => { - A(), H = E.normalize(H), T.readFile(H, function(ke, Qe) { + A(), H = E.normalize(H), N.readFile(H, function(ke, Qe) { ke ? de(ke) : J(Qe.buffer); }); }, process.argv.length > 1 && (p = process.argv[1].replace(/\\/g, "/")), c = process.argv.slice(2), process.on("uncaughtException", function(H) { @@ -2595,13 +2599,13 @@ var QT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"(e, t) { }), d = (H, J) => { if (pu()) throw process.exitCode = H, J; - C(J), process.exit(H); + T(J), process.exit(H); }, a.inspect = function() { return "[Emscripten Module object]"; }) : (h || f) && (f ? g = self.location.href : typeof document != "undefined" && document.currentScript && (g = document.currentScript.src), s && (g = s), g.indexOf("blob:") !== 0 ? g = g.substr(0, g.replace(/[?#].*/, "").lastIndexOf("/") + 1) : g = "", y = (H) => { var J = new XMLHttpRequest(); return J.open("GET", H, false), J.send(null), J.responseText; - }, f && (x = (H) => { + }, f && (w = (H) => { var J = new XMLHttpRequest(); return J.open("GET", H, false), J.responseType = "arraybuffer", J.send(null), new Uint8Array(J.response); }), v = (H, J, de) => { @@ -2631,8 +2635,8 @@ var QT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"(e, t) { for (var Qe = 0; Qe < ze.length; ++Qe) Ze.push(Tt[ze[Qe]]); Ve == "v" ? Ze.push(0) : Ze = Ze.concat([1, Tt[Ve]]), Ze[1] = Ze.length - 2; - var rs = new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0].concat(Ze, [2, 7, 1, 1, 101, 1, 102, 0, 0, 7, 5, 1, 1, 102, 0, 0])), as = new WebAssembly.Module(rs), Ei = new WebAssembly.Instance(as, { e: { f: H } }), Lr = Ei.exports.f; - return Lr; + var is = new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0].concat(Ze, [2, 7, 1, 1, 101, 1, 102, 0, 0, 7, 5, 1, 1, 102, 0, 0])), os = new WebAssembly.Module(is), Ri = new WebAssembly.Instance(os, { e: { f: H } }), Br = Ri.exports.f; + return Br; } var W = [], q; function K() { @@ -2656,41 +2660,41 @@ var QT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"(e, t) { }, ee; a.wasmBinary && (ee = a.wasmBinary); var se = a.noExitRuntime || true; - typeof WebAssembly != "object" && Fr("no native wasm support detected"); + typeof WebAssembly != "object" && Or("no native wasm support detected"); var ne, oe = false, re; function le(H, J) { - H || Fr(J); + H || Or(J); } function me(H) { var J = a["_" + H]; return J; } function we(H, J, de, ke, Qe) { - var Ze = { string: function(rn) { + var Ze = { string: function(an) { var nr = 0; - if (rn != null && rn !== 0) { - var Dc = (rn.length << 2) + 1; - nr = yu(Dc), tt(rn, nr, Dc); + if (an != null && an !== 0) { + var Fc = (an.length << 2) + 1; + nr = yu(Fc), tt(an, nr, Fc); } return nr; - }, array: function(rn) { - var nr = yu(rn.length); - return rt(rn, nr), nr; + }, array: function(an) { + var nr = yu(an.length); + return at(an, nr), nr; } }; - function Ve(rn) { - return J === "string" ? Je(rn) : J === "boolean" ? Boolean(rn) : rn; + function Ve(an) { + return J === "string" ? Je(an) : J === "boolean" ? Boolean(an) : an; } - var ze = me(H), Tt = [], rs = 0; + var ze = me(H), Tt = [], is = 0; if (ke) - for (var as = 0; as < ke.length; as++) { - var Ei = Ze[de[as]]; - Ei ? (rs === 0 && (rs = Ec()), Tt[as] = Ei(ke[as])) : Tt[as] = ke[as]; + for (var os = 0; os < ke.length; os++) { + var Ri = Ze[de[os]]; + Ri ? (is === 0 && (is = Rc()), Tt[os] = Ri(ke[os])) : Tt[os] = ke[os]; } - var Lr = ze.apply(null, Tt); - function Cf(rn) { - return rs !== 0 && Rc(rs), Ve(rn); + var Br = ze.apply(null, Tt); + function Tf(an) { + return is !== 0 && Dc(is), Ve(an); } - return Lr = Cf(Lr), Lr; + return Br = Tf(Br), Br; } function Se(H, J, de, ke) { de = de || []; @@ -2722,14 +2726,14 @@ var QT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"(e, t) { if ((Ve & 240) == 224 ? Ve = (Ve & 15) << 12 | ze << 6 | Tt : Ve = (Ve & 7) << 18 | ze << 12 | Tt << 6 | H[J++] & 63, Ve < 65536) Ze += String.fromCharCode(Ve); else { - var rs = Ve - 65536; - Ze += String.fromCharCode(55296 | rs >> 10, 56320 | rs & 1023); + var is = Ve - 65536; + Ze += String.fromCharCode(55296 | is >> 10, 56320 | is & 1023); } } return Ze; } function Je(H, J) { - return H ? Xe(Jt, H, J) : ""; + return H ? Xe(en, H, J) : ""; } function Ye(H, J, de, ke) { if (!(ke > 0)) @@ -2761,7 +2765,7 @@ var QT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"(e, t) { return J[de] = 0, de - Qe; } function tt(H, J, de) { - return Ye(H, Jt, J, de); + return Ye(H, en, J, de); } function Ce(H) { for (var J = 0, de = 0; de < H.length; ++de) { @@ -2771,10 +2775,10 @@ var QT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"(e, t) { return J; } var ut = typeof TextDecoder != "undefined" ? new TextDecoder("utf-16le") : void 0; - function rt(H, J) { + function at(H, J) { Et.set(H, J); } - function Zt(H, J, de) { + function Jt(H, J, de) { for (var ke = 0; ke < H.length; ++ke) Et[J++ >> 0] = H.charCodeAt(ke); de || (Et[J >> 0] = 0); @@ -2782,119 +2786,119 @@ var QT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"(e, t) { function Nt(H, J) { return H % J > 0 && (H += J - H % J), H; } - var In, Et, Jt, Sn, Cn, Xt, Rn, en, Ms; + var Cn, Et, en, Nn, Tn, Yt, Dn, tn, Ms; function Ls(H) { - In = H, a.HEAP8 = Et = new Int8Array(H), a.HEAP16 = Sn = new Int16Array(H), a.HEAP32 = Xt = new Int32Array(H), a.HEAPU8 = Jt = new Uint8Array(H), a.HEAPU16 = Cn = new Uint16Array(H), a.HEAPU32 = Rn = new Uint32Array(H), a.HEAPF32 = en = new Float32Array(H), a.HEAPF64 = Ms = new Float64Array(H); + Cn = H, a.HEAP8 = Et = new Int8Array(H), a.HEAP16 = Nn = new Int16Array(H), a.HEAP32 = Yt = new Int32Array(H), a.HEAPU8 = en = new Uint8Array(H), a.HEAPU16 = Tn = new Uint16Array(H), a.HEAPU32 = Dn = new Uint32Array(H), a.HEAPF32 = tn = new Float32Array(H), a.HEAPF64 = Ms = new Float64Array(H); } - var xi = a.INITIAL_MEMORY || 16777216, Js, Bs = [], du = [], wi = [], tn = false, ac = false, ic = 0; + var wi = a.INITIAL_MEMORY || 16777216, Js, Bs = [], du = [], ki = [], nn = false, ic = false, oc = 0; function pu() { - return se || ic > 0; - } - function oc() { - if (a.preRun) - for (typeof a.preRun == "function" && (a.preRun = [a.preRun]); a.preRun.length; ) - cc(a.preRun.shift()); - fu(Bs); + return se || oc > 0; } function uc() { - tn = true, fu(du); - } - function Ev() { - ac = true; + if (a.preRun) + for (typeof a.preRun == "function" && (a.preRun = [a.preRun]); a.preRun.length; ) + dc(a.preRun.shift()); + fu(Bs); } function lc() { + nn = true, fu(du); + } + function Fv() { + ic = true; + } + function cc() { if (a.postRun) for (typeof a.postRun == "function" && (a.postRun = [a.postRun]); a.postRun.length; ) - dc(a.postRun.shift()); - fu(wi); - } - function cc(H) { - Bs.unshift(H); - } - function ns(H) { - du.unshift(H); + pc(a.postRun.shift()); + fu(ki); } function dc(H) { - wi.unshift(H); + Bs.unshift(H); } - var Dn = 0, ki = null, er = null; - function eh(H) { - Dn++, a.monitorRunDependencies && a.monitorRunDependencies(Dn); + function rs(H) { + du.unshift(H); } function pc(H) { - if (Dn--, a.monitorRunDependencies && a.monitorRunDependencies(Dn), Dn == 0 && (ki !== null && (clearInterval(ki), ki = null), er)) { + ki.unshift(H); + } + var Fn = 0, Ii = null, er = null; + function th(H) { + Fn++, a.monitorRunDependencies && a.monitorRunDependencies(Fn); + } + function hc(H) { + if (Fn--, a.monitorRunDependencies && a.monitorRunDependencies(Fn), Fn == 0 && (Ii !== null && (clearInterval(Ii), Ii = null), er)) { var J = er; er = null, J(); } } a.preloadedImages = {}, a.preloadedAudios = {}; - function Fr(H) { + function Or(H) { a.onAbort && a.onAbort(H), H = "Aborted(" + H + ")", R(H), oe = true, re = 1, H += ". Build with -s ASSERTIONS=1 for more info."; var J = new WebAssembly.RuntimeError(H); throw o(J), J; } - var th = "data:application/octet-stream;base64,"; - function hc(H) { - return H.startsWith(th); + var nh = "data:application/octet-stream;base64,"; + function fc(H) { + return H.startsWith(nh); } - function Or(H) { + function Pr(H) { return H.startsWith("file://"); } - var nn; - nn = "tfjs-backend-wasm.wasm", hc(nn) || (nn = b(nn)); + var sn; + sn = "tfjs-backend-wasm.wasm", fc(sn) || (sn = b(sn)); function hu(H) { try { - if (H == nn && ee) + if (H == sn && ee) return new Uint8Array(ee); - if (x) - return x(H); + if (w) + return w(H); throw "both async and sync fetching of the wasm failed"; } catch (J) { - Fr(J); + Or(J); } } - function nh() { + function sh() { if (!ee && (h || f)) { - if (typeof fetch == "function" && !Or(nn)) - return fetch(nn, { credentials: "same-origin" }).then(function(H) { + if (typeof fetch == "function" && !Pr(sn)) + return fetch(sn, { credentials: "same-origin" }).then(function(H) { if (!H.ok) - throw "failed to load wasm binary file at '" + nn + "'"; + throw "failed to load wasm binary file at '" + sn + "'"; return H.arrayBuffer(); }).catch(function() { - return hu(nn); + return hu(sn); }); if (v) return new Promise(function(H, J) { - v(nn, function(de) { + v(sn, function(de) { H(new Uint8Array(de)); }, J); }); } return Promise.resolve().then(function() { - return hu(nn); + return hu(sn); }); } - function sh() { - var H = { env: Ci, wasi_snapshot_preview1: Ci }; + function rh() { + var H = { env: Ni, wasi_snapshot_preview1: Ni }; function J(Ve, ze) { var Tt = Ve.exports; - a.asm = Tt, ne = a.asm.memory, Ls(ne.buffer), Js = a.asm.__indirect_function_table, ns(a.asm.__wasm_call_ctors), pc("wasm-instantiate"); + a.asm = Tt, ne = a.asm.memory, Ls(ne.buffer), Js = a.asm.__indirect_function_table, rs(a.asm.__wasm_call_ctors), hc("wasm-instantiate"); } - eh("wasm-instantiate"); + th("wasm-instantiate"); function de(Ve) { J(Ve.instance); } function ke(Ve) { - return nh().then(function(ze) { + return sh().then(function(ze) { return WebAssembly.instantiate(ze, H); }).then(function(ze) { return ze; }).then(Ve, function(ze) { - R("failed to asynchronously prepare wasm: " + ze), Fr(ze); + R("failed to asynchronously prepare wasm: " + ze), Or(ze); }); } function Qe() { - return !ee && typeof WebAssembly.instantiateStreaming == "function" && !hc(nn) && !Or(nn) && typeof fetch == "function" ? fetch(nn, { credentials: "same-origin" }).then(function(Ve) { + return !ee && typeof WebAssembly.instantiateStreaming == "function" && !fc(sn) && !Pr(sn) && typeof fetch == "function" ? fetch(sn, { credentials: "same-origin" }).then(function(Ve) { var ze = WebAssembly.instantiateStreaming(Ve, H); return ze.then(de, function(Tt) { return R("wasm streaming compile failed: " + Tt), R("falling back to ArrayBuffer instantiation"), ke(de); @@ -2910,7 +2914,7 @@ var QT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"(e, t) { } return Qe().catch(o), {}; } - var Rv, Dv; + var Ov, Pv; function fu(H) { for (; H.length > 0; ) { var J = H.shift(); @@ -2925,19 +2929,19 @@ var QT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"(e, t) { function tr(H) { return H; } - function fc(H) { + function mc(H) { var J = /\b_Z[\w\d_]+/g; return H.replace(J, function(de) { var ke = de; return de === ke ? de : ke + " [" + de + "]"; }); } - var ss = []; + var as = []; function mu(H) { - var J = ss[H]; - return J || (H >= ss.length && (ss.length = H + 1), ss[H] = J = Js.get(H)), J; + var J = as[H]; + return J || (H >= as.length && (as.length = H + 1), as[H] = J = Js.get(H)), J; } - function Fv() { + function zv() { var H = new Error(); if (!H.stack) { try { @@ -2950,45 +2954,45 @@ var QT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"(e, t) { } return H.stack.toString(); } - function Ii(H, J) { - Js.set(H, J), ss[H] = J; + function Si(H, J) { + Js.set(H, J), as[H] = J; } - function rh() { - Fr(""); + function ah() { + Or(""); } - function mc(H, J, de) { - Jt.copyWithin(H, J, J + de); + function gc(H, J, de) { + en.copyWithin(H, J, J + de); } - function gc() { + function bc() { return 2147483648; } - function sn(H) { + function rn(H) { try { - return ne.grow(H - In.byteLength + 65535 >>> 16), Ls(ne.buffer), 1; + return ne.grow(H - Cn.byteLength + 65535 >>> 16), Ls(ne.buffer), 1; } catch (J) { } } - function bc(H) { - var J = Jt.length; + function yc(H) { + var J = en.length; H = H >>> 0; - var de = gc(); + var de = bc(); if (H > de) return false; for (var ke = 1; ke <= 4; ke *= 2) { var Qe = J * (1 + 0.2 / ke); Qe = Math.min(Qe, H + 100663296); - var Ze = Math.min(de, Nt(Math.max(H, Qe), 65536)), Ve = sn(Ze); + var Ze = Math.min(de, Nt(Math.max(H, Qe), 65536)), Ve = rn(Ze); if (Ve) return true; } return false; } - var Si = { mappings: {}, buffers: [null, [], []], printChar: function(H, J) { - var de = Si.buffers[H]; + var Ci = { mappings: {}, buffers: [null, [], []], printChar: function(H, J) { + var de = Ci.buffers[H]; J === 0 || J === 10 ? ((H === 1 ? P : R)(Xe(de, 0)), de.length = 0) : de.push(J); }, varargs: void 0, get: function() { - Si.varargs += 4; - var H = Xt[Si.varargs - 4 >> 2]; + Ci.varargs += 4; + var H = Yt[Ci.varargs - 4 >> 2]; return H; }, getStr: function(H) { var J = Je(H); @@ -2996,238 +3000,240 @@ var QT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"(e, t) { }, get64: function(H, J) { return H; } }; - function ah(H) { + function ih(H) { return 0; } - function Ov(H, J, de, ke, Qe) { + function Mv(H, J, de, ke, Qe) { } - function Pv(H, J, de, ke) { + function Lv(H, J, de, ke) { for (var Qe = 0, Ze = 0; Ze < de; Ze++) { - var Ve = Xt[J >> 2], ze = Xt[J + 4 >> 2]; + var Ve = Yt[J >> 2], ze = Yt[J + 4 >> 2]; J += 8; for (var Tt = 0; Tt < ze; Tt++) - Si.printChar(H, Jt[Ve + Tt]); + Ci.printChar(H, en[Ve + Tt]); Qe += ze; } - return Xt[ke >> 2] = Qe, 0; + return Yt[ke >> 2] = Qe, 0; } - function ih(H) { + function oh(H) { te(H); } - var yc = false, Ci = { abort: rh, emscripten_memcpy_big: mc, emscripten_resize_heap: bc, fd_close: ah, fd_seek: Ov, fd_write: Pv, setTempRet0: ih }, zN = sh(), zv = a.___wasm_call_ctors = function() { - return (zv = a.___wasm_call_ctors = a.asm.__wasm_call_ctors).apply(null, arguments); - }, oh = a._init = function() { - return (oh = a._init = a.asm.init).apply(null, arguments); - }, uh = a._init_with_threads_count = function() { - return (uh = a._init_with_threads_count = a.asm.init_with_threads_count).apply(null, arguments); - }, vc = a._get_threads_count = function() { - return (vc = a._get_threads_count = a.asm.get_threads_count).apply(null, arguments); - }, xc = a._register_tensor = function() { - return (xc = a._register_tensor = a.asm.register_tensor).apply(null, arguments); - }, lh = a._dispose_data = function() { - return (lh = a._dispose_data = a.asm.dispose_data).apply(null, arguments); + var vc = false, Ni = { abort: ah, emscripten_memcpy_big: gc, emscripten_resize_heap: yc, fd_close: ih, fd_seek: Mv, fd_write: Lv, setTempRet0: oh }, qN = rh(), Bv = a.___wasm_call_ctors = function() { + return (Bv = a.___wasm_call_ctors = a.asm.__wasm_call_ctors).apply(null, arguments); + }, uh = a._init = function() { + return (uh = a._init = a.asm.init).apply(null, arguments); + }, lh = a._init_with_threads_count = function() { + return (lh = a._init_with_threads_count = a.asm.init_with_threads_count).apply(null, arguments); + }, xc = a._get_threads_count = function() { + return (xc = a._get_threads_count = a.asm.get_threads_count).apply(null, arguments); + }, wc = a._register_tensor = function() { + return (wc = a._register_tensor = a.asm.register_tensor).apply(null, arguments); + }, ch = a._dispose_data = function() { + return (ch = a._dispose_data = a.asm.dispose_data).apply(null, arguments); }, $e = a._dispose = function() { return ($e = a._dispose = a.asm.dispose).apply(null, arguments); - }, ch = a._Abs = function() { - return (ch = a._Abs = a.asm.Abs).apply(null, arguments); - }, wc = a._Add = function() { - return (wc = a._Add = a.asm.Add).apply(null, arguments); - }, Pr = a._AddN = function() { - return (Pr = a._AddN = a.asm.AddN).apply(null, arguments); - }, Ni = a._All = function() { - return (Ni = a._All = a.asm.All).apply(null, arguments); - }, dh = a._Any = function() { - return (dh = a._Any = a.asm.Any).apply(null, arguments); - }, Mv = a._ArgMax = function() { - return (Mv = a._ArgMax = a.asm.ArgMax).apply(null, arguments); - }, ph = a._AvgPool = function() { - return (ph = a._AvgPool = a.asm.AvgPool).apply(null, arguments); - }, Lv = a._BatchMatMul = function() { - return (Lv = a._BatchMatMul = a.asm.BatchMatMul).apply(null, arguments); - }, zr = a._Ceil = function() { - return (zr = a._Ceil = a.asm.Ceil).apply(null, arguments); - }, hh = a._ClipByValue = function() { - return (hh = a._ClipByValue = a.asm.ClipByValue).apply(null, arguments); - }, fh = a._Conv2D = function() { - return (fh = a._Conv2D = a.asm.Conv2D).apply(null, arguments); - }, mh = a._Conv2DBackpropInput = function() { - return (mh = a._Conv2DBackpropInput = a.asm.Conv2DBackpropInput).apply(null, arguments); - }, gh = a._Cos = function() { - return (gh = a._Cos = a.asm.Cos).apply(null, arguments); - }, bh = a._Cosh = function() { - return (bh = a._Cosh = a.asm.Cosh).apply(null, arguments); - }, yh = a._CropAndResize = function() { - return (yh = a._CropAndResize = a.asm.CropAndResize).apply(null, arguments); - }, kc = a._Cumsum = function() { - return (kc = a._Cumsum = a.asm.Cumsum).apply(null, arguments); - }, vh = a._DepthToSpace = function() { - return (vh = a._DepthToSpace = a.asm.DepthToSpace).apply(null, arguments); - }, xh = a._DepthwiseConv2dNative = function() { - return (xh = a._DepthwiseConv2dNative = a.asm.DepthwiseConv2dNative).apply(null, arguments); - }, wh = a._Elu = function() { - return (wh = a._Elu = a.asm.Elu).apply(null, arguments); - }, kh = a._Equal = function() { - return (kh = a._Equal = a.asm.Equal).apply(null, arguments); - }, Ih = a._Exp = function() { - return (Ih = a._Exp = a.asm.Exp).apply(null, arguments); - }, Ic = a._FlipLeftRight = function() { - return (Ic = a._FlipLeftRight = a.asm.FlipLeftRight).apply(null, arguments); - }, Sh = a._Floor = function() { - return (Sh = a._Floor = a.asm.Floor).apply(null, arguments); - }, Ch = a._FloorDiv = function() { - return (Ch = a._FloorDiv = a.asm.FloorDiv).apply(null, arguments); - }, Mr = a._FusedBatchNorm = function() { - return (Mr = a._FusedBatchNorm = a.asm.FusedBatchNorm).apply(null, arguments); - }, gu = a._FusedConv2D = function() { - return (gu = a._FusedConv2D = a.asm.FusedConv2D).apply(null, arguments); - }, Nh = a._FusedDepthwiseConv2D = function() { - return (Nh = a._FusedDepthwiseConv2D = a.asm.FusedDepthwiseConv2D).apply(null, arguments); - }, Th = a._Gather = function() { - return (Th = a._Gather = a.asm.Gather).apply(null, arguments); - }, $h = a._GatherNd = function() { - return ($h = a._GatherNd = a.asm.GatherNd).apply(null, arguments); - }, Le = a._Greater = function() { - return (Le = a._Greater = a.asm.Greater).apply(null, arguments); - }, _h = a._GreaterEqual = function() { - return (_h = a._GreaterEqual = a.asm.GreaterEqual).apply(null, arguments); - }, Ah = a._LeakyRelu = function() { - return (Ah = a._LeakyRelu = a.asm.LeakyRelu).apply(null, arguments); - }, Eh = a._Less = function() { - return (Eh = a._Less = a.asm.Less).apply(null, arguments); - }, Rh = a._LessEqual = function() { - return (Rh = a._LessEqual = a.asm.LessEqual).apply(null, arguments); - }, Dh = a._Log = function() { - return (Dh = a._Log = a.asm.Log).apply(null, arguments); - }, Fh = a._LogicalAnd = function() { - return (Fh = a._LogicalAnd = a.asm.LogicalAnd).apply(null, arguments); - }, bu = a._Max = function() { - return (bu = a._Max = a.asm.Max).apply(null, arguments); - }, Sc = a._MaxPool = function() { - return (Sc = a._MaxPool = a.asm.MaxPool).apply(null, arguments); - }, Cc = a._Maximum = function() { - return (Cc = a._Maximum = a.asm.Maximum).apply(null, arguments); - }, Oh = a._Mean = function() { - return (Oh = a._Mean = a.asm.Mean).apply(null, arguments); - }, Ph = a._Min = function() { - return (Ph = a._Min = a.asm.Min).apply(null, arguments); - }, zh = a._Minimum = function() { - return (zh = a._Minimum = a.asm.Minimum).apply(null, arguments); - }, Mh = a._MirrorPad = function() { - return (Mh = a._MirrorPad = a.asm.MirrorPad).apply(null, arguments); - }, Lh = a._Multiply = function() { - return (Lh = a._Multiply = a.asm.Multiply).apply(null, arguments); - }, Bh = a._Neg = function() { - return (Bh = a._Neg = a.asm.Neg).apply(null, arguments); - }, gt = a._NonMaxSuppressionV3 = function() { - return (gt = a._NonMaxSuppressionV3 = a.asm.NonMaxSuppressionV3).apply(null, arguments); - }, Vh = a._NonMaxSuppressionV4 = function() { - return (Vh = a._NonMaxSuppressionV4 = a.asm.NonMaxSuppressionV4).apply(null, arguments); - }, Wh = a._NonMaxSuppressionV5 = function() { - return (Wh = a._NonMaxSuppressionV5 = a.asm.NonMaxSuppressionV5).apply(null, arguments); - }, Uh = a._NotEqual = function() { - return (Uh = a._NotEqual = a.asm.NotEqual).apply(null, arguments); - }, Ti = a._OneHot = function() { - return (Ti = a._OneHot = a.asm.OneHot).apply(null, arguments); - }, Nc = a._PadV2 = function() { - return (Nc = a._PadV2 = a.asm.PadV2).apply(null, arguments); - }, Tc = a._Pow = function() { - return (Tc = a._Pow = a.asm.Pow).apply(null, arguments); - }, $c = a._Prelu = function() { - return ($c = a._Prelu = a.asm.Prelu).apply(null, arguments); - }, Gh = a._Prod = function() { - return (Gh = a._Prod = a.asm.Prod).apply(null, arguments); - }, _c = a._RealDiv = function() { - return (_c = a._RealDiv = a.asm.RealDiv).apply(null, arguments); - }, Hh = a._Relu = function() { - return (Hh = a._Relu = a.asm.Relu).apply(null, arguments); - }, Bv = a._Relu6 = function() { - return (Bv = a._Relu6 = a.asm.Relu6).apply(null, arguments); - }, Ac = a._ResizeBilinear = function() { - return (Ac = a._ResizeBilinear = a.asm.ResizeBilinear).apply(null, arguments); - }, Vv = a._Reverse = function() { - return (Vv = a._Reverse = a.asm.Reverse).apply(null, arguments); - }, qh = a._RotateWithOffset = function() { - return (qh = a._RotateWithOffset = a.asm.RotateWithOffset).apply(null, arguments); - }, jh = a._Round = function() { - return (jh = a._Round = a.asm.Round).apply(null, arguments); - }, Kh = a._Rsqrt = function() { - return (Kh = a._Rsqrt = a.asm.Rsqrt).apply(null, arguments); - }, Xh = a._ScatterNd = function() { - return (Xh = a._ScatterNd = a.asm.ScatterNd).apply(null, arguments); - }, Yh = a._SelectV2 = function() { - return (Yh = a._SelectV2 = a.asm.SelectV2).apply(null, arguments); - }, Qh = a._Sigmoid = function() { - return (Qh = a._Sigmoid = a.asm.Sigmoid).apply(null, arguments); - }, Zh = a._Sin = function() { - return (Zh = a._Sin = a.asm.Sin).apply(null, arguments); - }, Jh = a._Softmax = function() { - return (Jh = a._Softmax = a.asm.Softmax).apply(null, arguments); - }, ef = a._SparseFillEmptyRows = function() { - return (ef = a._SparseFillEmptyRows = a.asm.SparseFillEmptyRows).apply(null, arguments); - }, tf = a._SparseReshape = function() { - return (tf = a._SparseReshape = a.asm.SparseReshape).apply(null, arguments); - }, nf = a._SparseSegmentReduction = function() { - return (nf = a._SparseSegmentReduction = a.asm.SparseSegmentReduction).apply(null, arguments); - }, sf = a._Sqrt = function() { - return (sf = a._Sqrt = a.asm.Sqrt).apply(null, arguments); - }, rf = a._Square = function() { - return (rf = a._Square = a.asm.Square).apply(null, arguments); - }, af = a._SquaredDifference = function() { - return (af = a._SquaredDifference = a.asm.SquaredDifference).apply(null, arguments); - }, of = a._Step = function() { - return (of = a._Step = a.asm.Step).apply(null, arguments); - }, uf = a._StridedSlice = function() { - return (uf = a._StridedSlice = a.asm.StridedSlice).apply(null, arguments); - }, lf = a._Sub = function() { - return (lf = a._Sub = a.asm.Sub).apply(null, arguments); - }, cf = a._Sum = function() { - return (cf = a._Sum = a.asm.Sum).apply(null, arguments); - }, df = a._Tan = function() { - return (df = a._Tan = a.asm.Tan).apply(null, arguments); - }, pf = a._Tanh = function() { - return (pf = a._Tanh = a.asm.Tanh).apply(null, arguments); - }, hf = a._Tile = function() { - return (hf = a._Tile = a.asm.Tile).apply(null, arguments); - }, ff = a._TopK = function() { - return (ff = a._TopK = a.asm.TopK).apply(null, arguments); - }, mf = a._Transform = function() { - return (mf = a._Transform = a.asm.Transform).apply(null, arguments); - }, gf = a._Transpose = function() { - return (gf = a._Transpose = a.asm.Transpose).apply(null, arguments); - }, bf = a.__FusedMatMul = function() { - return (bf = a.__FusedMatMul = a.asm._FusedMatMul).apply(null, arguments); - }, yf = a._malloc = function() { - return (yf = a._malloc = a.asm.malloc).apply(null, arguments); - }, vf = a._free = function() { - return (vf = a._free = a.asm.free).apply(null, arguments); - }, xf = a.___errno_location = function() { - return (xf = a.___errno_location = a.asm.__errno_location).apply(null, arguments); - }, wf = a._emscripten_main_thread_process_queued_calls = function() { - return (wf = a._emscripten_main_thread_process_queued_calls = a.asm.emscripten_main_thread_process_queued_calls).apply(null, arguments); - }, Ec = a.stackSave = function() { - return (Ec = a.stackSave = a.asm.stackSave).apply(null, arguments); - }, Rc = a.stackRestore = function() { - return (Rc = a.stackRestore = a.asm.stackRestore).apply(null, arguments); + }, dh = a._Abs = function() { + return (dh = a._Abs = a.asm.Abs).apply(null, arguments); + }, kc = a._Add = function() { + return (kc = a._Add = a.asm.Add).apply(null, arguments); + }, zr = a._AddN = function() { + return (zr = a._AddN = a.asm.AddN).apply(null, arguments); + }, Ti = a._All = function() { + return (Ti = a._All = a.asm.All).apply(null, arguments); + }, ph = a._Any = function() { + return (ph = a._Any = a.asm.Any).apply(null, arguments); + }, Vv = a._ArgMax = function() { + return (Vv = a._ArgMax = a.asm.ArgMax).apply(null, arguments); + }, hh = a._AvgPool = function() { + return (hh = a._AvgPool = a.asm.AvgPool).apply(null, arguments); + }, Wv = a._BatchMatMul = function() { + return (Wv = a._BatchMatMul = a.asm.BatchMatMul).apply(null, arguments); + }, Mr = a._Ceil = function() { + return (Mr = a._Ceil = a.asm.Ceil).apply(null, arguments); + }, fh = a._ClipByValue = function() { + return (fh = a._ClipByValue = a.asm.ClipByValue).apply(null, arguments); + }, mh = a._Conv2D = function() { + return (mh = a._Conv2D = a.asm.Conv2D).apply(null, arguments); + }, gh = a._Conv2DBackpropInput = function() { + return (gh = a._Conv2DBackpropInput = a.asm.Conv2DBackpropInput).apply(null, arguments); + }, bh = a._Cos = function() { + return (bh = a._Cos = a.asm.Cos).apply(null, arguments); + }, yh = a._Cosh = function() { + return (yh = a._Cosh = a.asm.Cosh).apply(null, arguments); + }, vh = a._CropAndResize = function() { + return (vh = a._CropAndResize = a.asm.CropAndResize).apply(null, arguments); + }, Ic = a._Cumprod = function() { + return (Ic = a._Cumprod = a.asm.Cumprod).apply(null, arguments); + }, xh = a._Cumsum = function() { + return (xh = a._Cumsum = a.asm.Cumsum).apply(null, arguments); + }, wh = a._DepthToSpace = function() { + return (wh = a._DepthToSpace = a.asm.DepthToSpace).apply(null, arguments); + }, kh = a._DepthwiseConv2dNative = function() { + return (kh = a._DepthwiseConv2dNative = a.asm.DepthwiseConv2dNative).apply(null, arguments); + }, Ih = a._Elu = function() { + return (Ih = a._Elu = a.asm.Elu).apply(null, arguments); + }, Sh = a._Equal = function() { + return (Sh = a._Equal = a.asm.Equal).apply(null, arguments); + }, Sc = a._Exp = function() { + return (Sc = a._Exp = a.asm.Exp).apply(null, arguments); + }, Ch = a._FlipLeftRight = function() { + return (Ch = a._FlipLeftRight = a.asm.FlipLeftRight).apply(null, arguments); + }, Nh = a._Floor = function() { + return (Nh = a._Floor = a.asm.Floor).apply(null, arguments); + }, Lr = a._FloorDiv = function() { + return (Lr = a._FloorDiv = a.asm.FloorDiv).apply(null, arguments); + }, gu = a._FusedBatchNorm = function() { + return (gu = a._FusedBatchNorm = a.asm.FusedBatchNorm).apply(null, arguments); + }, Th = a._FusedConv2D = function() { + return (Th = a._FusedConv2D = a.asm.FusedConv2D).apply(null, arguments); + }, $h = a._FusedDepthwiseConv2D = function() { + return ($h = a._FusedDepthwiseConv2D = a.asm.FusedDepthwiseConv2D).apply(null, arguments); + }, _h = a._Gather = function() { + return (_h = a._Gather = a.asm.Gather).apply(null, arguments); + }, Le = a._GatherNd = function() { + return (Le = a._GatherNd = a.asm.GatherNd).apply(null, arguments); + }, Ah = a._Greater = function() { + return (Ah = a._Greater = a.asm.Greater).apply(null, arguments); + }, Eh = a._GreaterEqual = function() { + return (Eh = a._GreaterEqual = a.asm.GreaterEqual).apply(null, arguments); + }, Rh = a._LeakyRelu = function() { + return (Rh = a._LeakyRelu = a.asm.LeakyRelu).apply(null, arguments); + }, Dh = a._Less = function() { + return (Dh = a._Less = a.asm.Less).apply(null, arguments); + }, Fh = a._LessEqual = function() { + return (Fh = a._LessEqual = a.asm.LessEqual).apply(null, arguments); + }, Oh = a._Log = function() { + return (Oh = a._Log = a.asm.Log).apply(null, arguments); + }, bu = a._LogicalAnd = function() { + return (bu = a._LogicalAnd = a.asm.LogicalAnd).apply(null, arguments); + }, Cc = a._Max = function() { + return (Cc = a._Max = a.asm.Max).apply(null, arguments); + }, Nc = a._MaxPool = function() { + return (Nc = a._MaxPool = a.asm.MaxPool).apply(null, arguments); + }, Ph = a._Maximum = function() { + return (Ph = a._Maximum = a.asm.Maximum).apply(null, arguments); + }, zh = a._Mean = function() { + return (zh = a._Mean = a.asm.Mean).apply(null, arguments); + }, Mh = a._Min = function() { + return (Mh = a._Min = a.asm.Min).apply(null, arguments); + }, Lh = a._Minimum = function() { + return (Lh = a._Minimum = a.asm.Minimum).apply(null, arguments); + }, Bh = a._MirrorPad = function() { + return (Bh = a._MirrorPad = a.asm.MirrorPad).apply(null, arguments); + }, Vh = a._Multiply = function() { + return (Vh = a._Multiply = a.asm.Multiply).apply(null, arguments); + }, gt = a._Neg = function() { + return (gt = a._Neg = a.asm.Neg).apply(null, arguments); + }, Wh = a._NonMaxSuppressionV3 = function() { + return (Wh = a._NonMaxSuppressionV3 = a.asm.NonMaxSuppressionV3).apply(null, arguments); + }, Uh = a._NonMaxSuppressionV4 = function() { + return (Uh = a._NonMaxSuppressionV4 = a.asm.NonMaxSuppressionV4).apply(null, arguments); + }, Gh = a._NonMaxSuppressionV5 = function() { + return (Gh = a._NonMaxSuppressionV5 = a.asm.NonMaxSuppressionV5).apply(null, arguments); + }, $i = a._NotEqual = function() { + return ($i = a._NotEqual = a.asm.NotEqual).apply(null, arguments); + }, Tc = a._OneHot = function() { + return (Tc = a._OneHot = a.asm.OneHot).apply(null, arguments); + }, $c = a._PadV2 = function() { + return ($c = a._PadV2 = a.asm.PadV2).apply(null, arguments); + }, _c = a._Pow = function() { + return (_c = a._Pow = a.asm.Pow).apply(null, arguments); + }, Hh = a._Prelu = function() { + return (Hh = a._Prelu = a.asm.Prelu).apply(null, arguments); + }, Ac = a._Prod = function() { + return (Ac = a._Prod = a.asm.Prod).apply(null, arguments); + }, qh = a._RealDiv = function() { + return (qh = a._RealDiv = a.asm.RealDiv).apply(null, arguments); + }, Uv = a._Relu = function() { + return (Uv = a._Relu = a.asm.Relu).apply(null, arguments); + }, Ec = a._Relu6 = function() { + return (Ec = a._Relu6 = a.asm.Relu6).apply(null, arguments); + }, Gv = a._ResizeBilinear = function() { + return (Gv = a._ResizeBilinear = a.asm.ResizeBilinear).apply(null, arguments); + }, jh = a._Reverse = function() { + return (jh = a._Reverse = a.asm.Reverse).apply(null, arguments); + }, Kh = a._RotateWithOffset = function() { + return (Kh = a._RotateWithOffset = a.asm.RotateWithOffset).apply(null, arguments); + }, Xh = a._Round = function() { + return (Xh = a._Round = a.asm.Round).apply(null, arguments); + }, Yh = a._Rsqrt = function() { + return (Yh = a._Rsqrt = a.asm.Rsqrt).apply(null, arguments); + }, Qh = a._ScatterNd = function() { + return (Qh = a._ScatterNd = a.asm.ScatterNd).apply(null, arguments); + }, Zh = a._SelectV2 = function() { + return (Zh = a._SelectV2 = a.asm.SelectV2).apply(null, arguments); + }, Jh = a._Sigmoid = function() { + return (Jh = a._Sigmoid = a.asm.Sigmoid).apply(null, arguments); + }, ef = a._Sin = function() { + return (ef = a._Sin = a.asm.Sin).apply(null, arguments); + }, tf = a._Softmax = function() { + return (tf = a._Softmax = a.asm.Softmax).apply(null, arguments); + }, nf = a._SparseFillEmptyRows = function() { + return (nf = a._SparseFillEmptyRows = a.asm.SparseFillEmptyRows).apply(null, arguments); + }, sf = a._SparseReshape = function() { + return (sf = a._SparseReshape = a.asm.SparseReshape).apply(null, arguments); + }, rf = a._SparseSegmentReduction = function() { + return (rf = a._SparseSegmentReduction = a.asm.SparseSegmentReduction).apply(null, arguments); + }, af = a._Sqrt = function() { + return (af = a._Sqrt = a.asm.Sqrt).apply(null, arguments); + }, of = a._Square = function() { + return (of = a._Square = a.asm.Square).apply(null, arguments); + }, uf = a._SquaredDifference = function() { + return (uf = a._SquaredDifference = a.asm.SquaredDifference).apply(null, arguments); + }, lf = a._Step = function() { + return (lf = a._Step = a.asm.Step).apply(null, arguments); + }, cf = a._StridedSlice = function() { + return (cf = a._StridedSlice = a.asm.StridedSlice).apply(null, arguments); + }, df = a._Sub = function() { + return (df = a._Sub = a.asm.Sub).apply(null, arguments); + }, pf = a._Sum = function() { + return (pf = a._Sum = a.asm.Sum).apply(null, arguments); + }, hf = a._Tan = function() { + return (hf = a._Tan = a.asm.Tan).apply(null, arguments); + }, ff = a._Tanh = function() { + return (ff = a._Tanh = a.asm.Tanh).apply(null, arguments); + }, mf = a._Tile = function() { + return (mf = a._Tile = a.asm.Tile).apply(null, arguments); + }, gf = a._TopK = function() { + return (gf = a._TopK = a.asm.TopK).apply(null, arguments); + }, bf = a._Transform = function() { + return (bf = a._Transform = a.asm.Transform).apply(null, arguments); + }, yf = a._Transpose = function() { + return (yf = a._Transpose = a.asm.Transpose).apply(null, arguments); + }, vf = a.__FusedMatMul = function() { + return (vf = a.__FusedMatMul = a.asm._FusedMatMul).apply(null, arguments); + }, xf = a._malloc = function() { + return (xf = a._malloc = a.asm.malloc).apply(null, arguments); + }, wf = a._free = function() { + return (wf = a._free = a.asm.free).apply(null, arguments); + }, kf = a.___errno_location = function() { + return (kf = a.___errno_location = a.asm.__errno_location).apply(null, arguments); + }, If = a._emscripten_main_thread_process_queued_calls = function() { + return (If = a._emscripten_main_thread_process_queued_calls = a.asm.emscripten_main_thread_process_queued_calls).apply(null, arguments); + }, Rc = a.stackSave = function() { + return (Rc = a.stackSave = a.asm.stackSave).apply(null, arguments); + }, Dc = a.stackRestore = function() { + return (Dc = a.stackRestore = a.asm.stackRestore).apply(null, arguments); }, yu = a.stackAlloc = function() { return (yu = a.stackAlloc = a.asm.stackAlloc).apply(null, arguments); - }, kf = a.dynCall_iijjiiii = function() { - return (kf = a.dynCall_iijjiiii = a.asm.dynCall_iijjiiii).apply(null, arguments); - }, If = a.dynCall_jiji = function() { - return (If = a.dynCall_jiji = a.asm.dynCall_jiji).apply(null, arguments); + }, Sf = a.dynCall_iijjiiii = function() { + return (Sf = a.dynCall_iijjiiii = a.asm.dynCall_iijjiiii).apply(null, arguments); + }, Cf = a.dynCall_jiji = function() { + return (Cf = a.dynCall_jiji = a.asm.dynCall_jiji).apply(null, arguments); }; a.cwrap = Se; - var $i; + var _i; function vu(H) { this.name = "ExitStatus", this.message = "Program terminated with exit(" + H + ")", this.status = H; } er = function H() { - $i || xu(), $i || (er = H); + _i || xu(), _i || (er = H); }; function xu(H) { - if (H = H || c, Dn > 0 || (oc(), Dn > 0)) + if (H = H || c, Fn > 0 || (uc(), Fn > 0)) return; function J() { - $i || ($i = true, a.calledRun = true, !oe && (uc(), i(a), a.onRuntimeInitialized && a.onRuntimeInitialized(), lc())); + _i || (_i = true, a.calledRun = true, !oe && (lc(), i(a), a.onRuntimeInitialized && a.onRuntimeInitialized(), cc())); } a.setStatus ? (a.setStatus("Running..."), setTimeout(function() { setTimeout(function() { @@ -3236,32 +3242,32 @@ var QT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"(e, t) { }, 1)) : J(); } a.run = xu; - function Wv(H) { + function Hv(H) { re = H, pu() || (a.onExit && a.onExit(H), oe = true), d(H, new vu(H)); } if (a.preInit) for (typeof a.preInit == "function" && (a.preInit = [a.preInit]); a.preInit.length > 0; ) a.preInit.pop()(); xu(); - var _i; - u && (_i = { uncaughtException: process.listeners("uncaughtException").filter(function(H) { + var Ai; + u && (Ai = { uncaughtException: process.listeners("uncaughtException").filter(function(H) { return !u.uncaughtException.indexOf(H) > -1; }), unhandledRejection: process.listeners("unhandledRejection").filter(function(H) { return !u.unhandledRejection.indexOf(H) > -1; }) }); - var Ai; + var Ei; if (typeof r != "undefined") - Ai = r; + Ei = r; else if (typeof WasmBackendModuleThreadedSimd != "undefined") - Ai = WasmBackendModuleThreadedSimd; + Ei = WasmBackendModuleThreadedSimd; else throw new Error("Could not find wasm module in post.js"); - if (_i) { - var Sf = Ai._dispose; - Ai._dispose = function() { - Sf(), _i.uncaughtException.forEach(function(H) { + if (Ai) { + var Nf = Ei._dispose; + Ei._dispose = function() { + Nf(), Ai.uncaughtException.forEach(function(H) { process.removeListener("uncaughtException", H); - }), _i.unhandledRejection.forEach(function(H) { + }), Ai.unhandledRejection.forEach(function(H) { process.removeListener("unhandledRejection", H); }); }; @@ -3273,9 +3279,9 @@ var QT = zt({ "src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"(e, t) { return n; }) : typeof e == "object" && (e.WasmBackendModule = n); } }); -var ZT = 1e-7; -var JT = 1e-4; -var Wd = class { +var o$ = 1e-7; +var u$ = 1e-4; +var Ud = class { constructor(e, t) { this.backend = e, this.dataMover = t, this.data = /* @__PURE__ */ new WeakMap(), this.dataIdsCount = 0; } @@ -3297,87 +3303,87 @@ var Wd = class { }; var tl = class { refCount(e) { - return Fn("refCount"); + return On("refCount"); } incRef(e) { - return Fn("incRef"); + return On("incRef"); } timerAvailable() { return true; } time(e) { - return Fn("time"); + return On("time"); } read(e) { - return Fn("read"); + return On("read"); } readSync(e) { - return Fn("readSync"); + return On("readSync"); } readToGPU(e, t) { - return Fn("readToGPU"); + return On("readToGPU"); } numDataIds() { - return Fn("numDataIds"); + return On("numDataIds"); } disposeData(e, t) { - return Fn("disposeData"); + return On("disposeData"); } write(e, t, n) { - return Fn("write"); + return On("write"); } move(e, t, n, s, r) { - return Fn("move"); + return On("move"); } memory() { - return Fn("memory"); + return On("memory"); } floatPrecision() { - return Fn("floatPrecision"); + return On("floatPrecision"); } epsilon() { - return this.floatPrecision() === 32 ? ZT : JT; + return this.floatPrecision() === 32 ? o$ : u$; } dispose() { - return Fn("dispose"); + return On("dispose"); } }; -function Fn(e) { +function On(e) { throw new Error(`'${e}' not yet implemented or not found in the registry. This kernel may not be supported by the tfjs backend you have chosen`); } -function zw(e) { +function Uw(e) { let t = e.length, n = 0; for (; t > 0; ) - n = Math.random() * t | 0, t--, dd(e, t, n); + n = Math.random() * t | 0, t--, pd(e, t, n); } -function e$(e, t) { +function l$(e, t) { if (e.length !== t.length) throw new Error(`Array sizes must match to be shuffled together First array length was ${e.length}Second array length was ${t.length}`); let n = e.length, s = 0; for (; n > 0; ) - s = Math.random() * n | 0, n--, dd(e, n, s), dd(t, n, s); + s = Math.random() * n | 0, n--, pd(e, n, s), pd(t, n, s); } function Bu(e, t, n) { return Math.max(e, Math.min(t, n)); } -function t$(e) { +function c$(e) { return e % 2 === 0 ? e : e + 1; } -function dd(e, t, n) { +function pd(e, t, n) { let s = e[t]; e[t] = e[n], e[n] = s; } -function n$(e) { +function d$(e) { let t = 0; for (let n = 0; n < e.length; n++) t += e[n]; return t; } -function s$(e, t) { +function p$(e, t) { let n = Math.random(); return t * n + (1 - n) * e; } -function r$(e, t) { +function h$(e, t) { let n = 0; for (let s = 0; s < e.length; s++) { let r = Number(e[s]) - Number(t[s]); @@ -3389,16 +3395,16 @@ function O(e, t) { if (!e) throw new Error(typeof t == "string" ? t : t()); } -function dn(e, t, n = "") { - O(wr(e, t), () => n + ` Shapes ${e} and ${t} must match`); +function pn(e, t, n = "") { + O(kr(e, t), () => n + ` Shapes ${e} and ${t} must match`); } -function va(e) { +function xa(e) { O(e != null, () => "The input to the tensor constructor must be a non-null value."); } -function ta(e, t = [], n = false) { - if (t == null && (t = []), Array.isArray(e) || Yt(e) && !n) +function na(e, t = [], n = false) { + if (t == null && (t = []), Array.isArray(e) || Qt(e) && !n) for (let s = 0; s < e.length; ++s) - ta(e[s], t, n); + na(e[s], t, n); else t.push(e); return t; @@ -3411,10 +3417,10 @@ function pt(e) { t *= e[n]; return t; } -function a$(e) { +function f$(e) { return e.length === 0; } -function wr(e, t) { +function kr(e, t) { if (e === t) return true; if (e == null || t == null || e.length !== t.length) @@ -3424,10 +3430,10 @@ function wr(e, t) { return false; return true; } -function Xi(e) { +function Yi(e) { return e % 1 === 0; } -function i$(e) { +function m$(e) { if (Math.tanh != null) return Math.tanh(e); if (e === 1 / 0) @@ -3439,20 +3445,20 @@ function i$(e) { return (t - 1) / (t + 1); } } -function o$(e) { +function g$(e) { let t = Math.ceil(Math.sqrt(e)); return [t, Math.ceil(e / t)]; } -function u$(e) { +function b$(e) { let t = new Uint32Array(e); for (let n = 0; n < e; ++n) t[n] = n; - return zw(t), t; + return Uw(t), t; } function Pu(e, t) { return t <= e.length ? e : e + " ".repeat(t - e.length); } -function l$(e, t = (s) => 0, n) { +function y$(e, t = (s) => 0, n) { return new Promise((s, r) => { let a = 0, i = () => { if (e()) { @@ -3470,7 +3476,7 @@ function l$(e, t = (s) => 0, n) { i(); }); } -function c$(e, t) { +function v$(e, t) { let n = 1, s = -1; for (let a = 0; a < e.length; ++a) if (e[a] >= 0) @@ -3493,12 +3499,12 @@ function c$(e, t) { let r = e.slice(); return r[s] = t / n, r; } -function Jn(e, t) { +function ts(e, t) { let n = t.length; - return e = e == null ? t.map((s, r) => r) : [].concat(e), O(e.every((s) => s >= -n && s < n), () => `All values in axis param must be in range [-${n}, ${n}) but got axis ${e}`), O(e.every((s) => Xi(s)), () => `All values in axis param must be integers but got axis ${e}`), e.map((s) => s < 0 ? n + s : s); + return e = e == null ? t.map((s, r) => r) : [].concat(e), O(e.every((s) => s >= -n && s < n), () => `All values in axis param must be in range [-${n}, ${n}) but got axis ${e}`), O(e.every((s) => Yi(s)), () => `All values in axis param must be integers but got axis ${e}`), e.map((s) => s < 0 ? n + s : s); } -function Mw(e, t) { - let n = [], s = [], r = t != null && Array.isArray(t) && t.length === 0, a = t == null || r ? null : Jn(t, e).sort(), i = 0; +function Gw(e, t) { + let n = [], s = [], r = t != null && Array.isArray(t) && t.length === 0, a = t == null || r ? null : ts(t, e).sort(), i = 0; for (let o = 0; o < e.length; ++o) { if (a != null) { if (a[i] === o && e[o] !== 1) @@ -3509,7 +3515,7 @@ function Mw(e, t) { } return { newShape: n, keptDims: s }; } -function Lw(e, t) { +function Hw(e, t) { let n = null; if (e == null || e === "float32") n = new Float32Array(t); @@ -3521,7 +3527,7 @@ function Lw(e, t) { throw new Error(`Unknown data type ${e}`); return n; } -function Bw(e, t) { +function qw(e, t) { let n = null; if (e == null || e === "float32") n = new Float32Array(t); @@ -3535,23 +3541,23 @@ function Bw(e, t) { throw new Error(`Unknown data type ${e}`); return n; } -function Vw(e, t) { +function jw(e, t) { for (let n = 0; n < e.length; n++) { let s = e[n]; if (isNaN(s) || !isFinite(s)) throw Error(`A tensor of type ${t} being uploaded contains ${s}.`); } } -function Ww(e) { +function Kw(e) { return e === "bool" || e === "complex64" || e === "float32" || e === "int32" || e === "string"; } -function d$(e, t) { +function x$(e, t) { return !(t === "complex64" || t === "float32" && e !== "complex64" || t === "int32" && e !== "float32" && e !== "complex64" || t === "bool" && e === "bool"); } -function Yt(e) { +function Qt(e) { return e instanceof Float32Array || e instanceof Int32Array || e instanceof Uint8Array || e instanceof Uint8ClampedArray; } -function jf(e) { +function Xf(e) { if (e === "float32" || e === "int32") return 4; if (e === "complex64") @@ -3560,7 +3566,7 @@ function jf(e) { return 1; throw new Error(`Unknown dtype ${e}`); } -function Uw(e) { +function Xw(e) { if (e == null) return 0; let t = 0; @@ -3569,19 +3575,19 @@ function Uw(e) { function ir(e) { return typeof e == "string" || e instanceof String; } -function Gw(e) { +function Yw(e) { return typeof e == "boolean"; } -function Hw(e) { +function Qw(e) { return typeof e == "number"; } -function Ud(e) { - return Array.isArray(e) ? Ud(e[0]) : e instanceof Float32Array ? "float32" : e instanceof Int32Array || e instanceof Uint8Array || e instanceof Uint8ClampedArray ? "int32" : Hw(e) ? "float32" : ir(e) ? "string" : Gw(e) ? "bool" : "float32"; +function Gd(e) { + return Array.isArray(e) ? Gd(e[0]) : e instanceof Float32Array ? "float32" : e instanceof Int32Array || e instanceof Uint8Array || e instanceof Uint8ClampedArray ? "int32" : Qw(e) ? "float32" : ir(e) ? "string" : Yw(e) ? "bool" : "float32"; } function hr(e) { return !!(e && e.constructor && e.call && e.apply); } -function pd(e, t) { +function hd(e, t) { for (let n = t; n < e; ++n) if (e % n === 0) return n; @@ -3597,7 +3603,7 @@ function ro(e) { n[s] = n[s + 1] * e[s + 1]; return n; } -function qw(e, t, n, s = false) { +function Zw(e, t, n, s = false) { let r = new Array(); if (t.length === 1) { let a = t[0] * (s ? 2 : 1); @@ -3606,11 +3612,11 @@ function qw(e, t, n, s = false) { } else { let a = t[0], i = t.slice(1), o = i.reduce((u, l) => u * l) * (s ? 2 : 1); for (let u = 0; u < a; u++) - r[u] = qw(e + u * o, i, n, s); + r[u] = Zw(e + u * o, i, n, s); } return r; } -function Gi(e, t, n = false) { +function Hi(e, t, n = false) { if (e.length === 0) return t[0]; let s = e.reduce((r, a) => r * a) * (n ? 2 : 1); @@ -3618,15 +3624,15 @@ function Gi(e, t, n = false) { return []; if (s !== t.length) throw new Error(`[${e}] does not match the input size ${t.length}${n ? " for a complex tensor" : ""}.`); - return qw(0, e, t, n); + return Zw(0, e, t, n); } -function eg(e, t) { - let n = Gd(e, t); +function ng(e, t) { + let n = Hd(e, t); for (let s = 0; s < n.length; s++) n[s] = 1; return n; } -function Gd(e, t) { +function Hd(e, t) { if (t == null || t === "float32" || t === "complex64") return new Float32Array(e); if (t === "int32") @@ -3635,22 +3641,22 @@ function Gd(e, t) { return new Uint8Array(e); throw new Error(`Unknown data type ${t}`); } -function p$(e, t) { +function w$(e, t) { let n = e.reduce((s, r) => s * r, 1); if (t == null || t === "float32") - return Gi(e, new Float32Array(n)); + return Hi(e, new Float32Array(n)); if (t === "int32") - return Gi(e, new Int32Array(n)); + return Hi(e, new Int32Array(n)); if (t === "bool") - return Gi(e, new Uint8Array(n)); + return Hi(e, new Uint8Array(n)); throw new Error(`Unknown data type ${t}`); } -function tg(e) { +function sg(e) { e.forEach((t) => { O(Number.isInteger(t) && t >= 0, () => `Tensor must have a shape comprised of positive integers but got shape [${e}].`); }); } -function h$(e, t, n) { +function k$(e, t, n) { if (t === 0) return 0; if (t === 1) @@ -3660,7 +3666,7 @@ function h$(e, t, n) { s += n[r] * e[r]; return s; } -function f$(e, t, n) { +function I$(e, t, n) { if (t === 0) return []; if (t === 1) @@ -3670,13 +3676,13 @@ function f$(e, t, n) { s[r] = Math.floor(e / n[r]), e -= s[r] * n[r]; return s[s.length - 1] = e, s; } -function ng(e) { +function rg(e) { return e && e.then && typeof e.then == "function"; } -var Zv = "tfjsflags"; -var m$ = class { +var tx = "tfjsflags"; +var S$ = class { constructor(e) { - this.global = e, this.flags = {}, this.flagRegistry = {}, this.urlFlags = {}, this.getQueryParams = g$, this.populateURLFlags(); + this.global = e, this.flags = {}, this.flagRegistry = {}, this.urlFlags = {}, this.getQueryParams = C$, this.populateURLFlags(); } setPlatform(e, t) { this.platform != null && (X().getBool("IS_TEST") || X().getBool("PROD") || console.warn(`Platform ${this.platformName} has already been set. Overwriting the platform with ${e}.`)), this.platformName = e, this.platform = t; @@ -3694,7 +3700,7 @@ var m$ = class { if (e in this.flags) return this.flags[e]; let t = this.evaluateFlag(e); - if (ng(t)) + if (rg(t)) throw new Error(`Flag ${e} cannot be synchronously evaluated. Please use getAsync() instead.`); return this.flags[e] = t, this.flags[e]; } @@ -3730,20 +3736,20 @@ var m$ = class { if (typeof this.global == "undefined" || typeof this.global.location == "undefined" || typeof this.global.location.search == "undefined") return; let e = this.getQueryParams(this.global.location.search); - Zv in e && e[Zv].split(",").forEach((n) => { + tx in e && e[tx].split(",").forEach((n) => { let [s, r] = n.split(":"); - this.urlFlags[s] = y$(s, r); + this.urlFlags[s] = T$(s, r); }); } }; -function g$(e) { +function C$(e) { let t = {}; - return e.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g, (n, ...s) => (b$(t, s[0], s[1]), s.join("="))), t; + return e.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g, (n, ...s) => (N$(t, s[0], s[1]), s.join("="))), t; } -function b$(e, t, n) { +function N$(e, t, n) { e[decodeURIComponent(t)] = decodeURIComponent(n || ""); } -function y$(e, t) { +function T$(e, t) { if (t = t.toLowerCase(), t === "true" || t === "false") return t === "true"; if (`${+t}` === t) @@ -3751,15 +3757,15 @@ function y$(e, t) { throw new Error(`Could not parse value flag value ${t} for flag ${e}.`); } function X() { - return jw; + return Jw; } -var jw = null; -function v$(e) { - jw = e; +var Jw = null; +function $$(e) { + Jw = e; } -var Ef; -function Kw() { - if (Ef == null) { +var Df; +function ek() { + if (Df == null) { let e; if (typeof window != "undefined") e = window; @@ -3771,16 +3777,16 @@ function Kw() { e = self; else throw new Error("Could not find a global object"); - Ef = e; + Df = e; } - return Ef; + return Df; } -function x$() { - let e = Kw(); +function _$() { + let e = ek(); return e._tfGlobals == null && (e._tfGlobals = /* @__PURE__ */ new Map()), e._tfGlobals; } -function sg(e, t) { - let n = x$(); +function ag(e, t) { + let n = _$(); if (n.has(e)) return n.get(e); { @@ -3791,187 +3797,188 @@ function sg(e, t) { var ao = "Abs"; var nl = "Acos"; var sl = "Acosh"; -var kr = "Add"; -var xa = "AddN"; +var Ir = "Add"; +var wa = "AddN"; var rl = "All"; var al = "Any"; -var wa = "ArgMax"; +var ka = "ArgMax"; var il = "ArgMin"; var ol = "Asin"; var ul = "Asinh"; var ll = "Atan"; var cl = "Atanh"; var dl = "Atan2"; -var ka = "AvgPool"; -var rg = "AvgPoolGrad"; -var Hd = "AvgPool3D"; -var ag = "AvgPool3DGrad"; -var Ia = "BatchMatMul"; +var Ia = "AvgPool"; +var ig = "AvgPoolGrad"; +var qd = "AvgPool3D"; +var og = "AvgPool3DGrad"; +var Sa = "BatchMatMul"; var io = "BatchToSpaceND"; -var ig = "Bincount"; -var w$ = "BroadcastTo"; -var og = "BroadcastArgs"; -var Sa = "Cast"; -var Ca = "Ceil"; -var Ir = "ClipByValue"; -var qd = "Complex"; -var jd = "ComplexAbs"; +var ug = "Bincount"; +var A$ = "BroadcastTo"; +var lg = "BroadcastArgs"; +var Ca = "Cast"; +var Na = "Ceil"; +var Sr = "ClipByValue"; +var jd = "Complex"; +var Kd = "ComplexAbs"; var oo = "Concat"; -var Na = "Conv2D"; -var ug = "Conv2DBackpropFilter"; -var Ta = "Conv2DBackpropInput"; -var Kd = "Conv3D"; -var lg = "Conv3DBackpropFilterV2"; -var cg = "Conv3DBackpropInputV2"; -var $a = "Cos"; -var _a = "Cosh"; +var Ta = "Conv2D"; +var cg = "Conv2DBackpropFilter"; +var $a = "Conv2DBackpropInput"; +var Xd = "Conv3D"; +var dg = "Conv3DBackpropFilterV2"; +var pg = "Conv3DBackpropInputV2"; +var _a = "Cos"; +var Aa = "Cosh"; +var pl = "Cumprod"; var uo = "Cumsum"; var lo = "CropAndResize"; -var dg = "DenseBincount"; +var hg = "DenseBincount"; var co = "DepthToSpace"; -var Aa = "DepthwiseConv2dNative"; -var pg = "DepthwiseConv2dNativeBackpropFilter"; -var hg = "DepthwiseConv2dNativeBackpropInput"; -var fg = "Diag"; -var Xd = "Dilation2D"; -var Kf = "Dilation2DBackpropInput"; -var Xf = "Dilation2DBackpropFilter"; -var Ea = "RealDiv"; -var Yd = "Einsum"; -var Ra = "Elu"; -var mg = "EluGrad"; -var pl = "Erf"; +var Ea = "DepthwiseConv2dNative"; +var fg = "DepthwiseConv2dNativeBackpropFilter"; +var mg = "DepthwiseConv2dNativeBackpropInput"; +var gg = "Diag"; +var Yd = "Dilation2D"; +var Yf = "Dilation2DBackpropInput"; +var Qf = "Dilation2DBackpropFilter"; +var Ra = "RealDiv"; +var Qd = "Einsum"; +var Da = "Elu"; +var bg = "EluGrad"; +var hl = "Erf"; var po = "Equal"; -var Da = "Exp"; +var Fa = "Exp"; var ho = "ExpandDims"; var fo = "Expm1"; -var gg = "FFT"; -var hl = "Fill"; +var yg = "FFT"; +var fl = "Fill"; var mo = "FlipLeftRight"; -var Fa = "Floor"; -var Oa = "FloorDiv"; -var Pa = "FusedBatchNorm"; +var Oa = "Floor"; +var Pa = "FloorDiv"; +var za = "FusedBatchNorm"; var go = "GatherV2"; var bo = "GatherNd"; var yo = "Greater"; -var za = "GreaterEqual"; -var Ma = "Identity"; -var bg = "IFFT"; -var Qd = "Imag"; -var fl = "IsFinite"; -var ml = "IsInf"; -var gl = "IsNan"; -var La = "LeakyRelu"; +var Ma = "GreaterEqual"; +var La = "Identity"; +var vg = "IFFT"; +var Zd = "Imag"; +var ml = "IsFinite"; +var gl = "IsInf"; +var bl = "IsNan"; +var Ba = "LeakyRelu"; var vo = "Less"; var xo = "LessEqual"; -var yg = "LinSpace"; -var Ba = "Log"; -var bl = "Log1p"; +var xg = "LinSpace"; +var Va = "Log"; +var yl = "Log1p"; var wo = "LogicalAnd"; -var yl = "LogicalNot"; -var Zd = "LogicalOr"; -var k$ = "LogSoftmax"; -var Jd = "LRN"; -var vg = "LRNGrad"; -var Va = "Max"; -var Wa = "Maximum"; -var Ua = "MaxPool"; -var xg = "MaxPoolGrad"; -var ep = "MaxPool3D"; -var wg = "MaxPool3DGrad"; -var kg = "MaxPoolWithArgmax"; -var Ga = "Mean"; -var Ha = "Min"; -var qa = "Minimum"; -var ja = "MirrorPad"; -var vl = "Mod"; -var Ig = "Multinomial"; -var Ka = "Multiply"; +var vl = "LogicalNot"; +var Jd = "LogicalOr"; +var E$ = "LogSoftmax"; +var ep = "LRN"; +var wg = "LRNGrad"; +var Wa = "Max"; +var Ua = "Maximum"; +var Ga = "MaxPool"; +var kg = "MaxPoolGrad"; +var tp = "MaxPool3D"; +var Ig = "MaxPool3DGrad"; +var Sg = "MaxPoolWithArgmax"; +var Ha = "Mean"; +var qa = "Min"; +var ja = "Minimum"; +var Ka = "MirrorPad"; +var xl = "Mod"; +var Cg = "Multinomial"; +var Xa = "Multiply"; var ko = "Neg"; var Io = "NotEqual"; var So = "NonMaxSuppressionV3"; -var xl = "NonMaxSuppressionV4"; +var wl = "NonMaxSuppressionV4"; var Co = "NonMaxSuppressionV5"; var No = "OnesLike"; var To = "OneHot"; var $o = "Pack"; -var Xa = "PadV2"; -var pde = "Pool"; -var Ya = "Pow"; -var Qa = "Prelu"; +var Ya = "PadV2"; +var $de = "Pool"; +var Qa = "Pow"; +var Za = "Prelu"; var _o = "Prod"; -var wl = "Range"; -var tp = "Real"; -var kl = "Reciprocal"; -var Za = "Relu"; +var kl = "Range"; +var np = "Real"; +var Il = "Reciprocal"; +var Ja = "Relu"; var Ao = "Reshape"; -var Il = "ResizeNearestNeighbor"; -var Sg = "ResizeNearestNeighborGrad"; -var Ja = "ResizeBilinear"; -var Cg = "ResizeBilinearGrad"; -var ei = "Relu6"; +var Sl = "ResizeNearestNeighbor"; +var Ng = "ResizeNearestNeighborGrad"; +var ei = "ResizeBilinear"; +var Tg = "ResizeBilinearGrad"; +var ti = "Relu6"; var Eo = "Reverse"; var Ro = "Round"; -var ti = "Rsqrt"; +var ni = "Rsqrt"; var Do = "ScatterNd"; var Fo = "Select"; -var Sl = "Selu"; +var Cl = "Selu"; var Oo = "Slice"; -var ni = "Sin"; +var si = "Sin"; var Po = "Sinh"; -var Cl = "Sign"; -var si = "Sigmoid"; -var Nl = "Softplus"; -var ri = "Sqrt"; -var ai = "Sum"; +var Nl = "Sign"; +var ri = "Sigmoid"; +var Tl = "Softplus"; +var ai = "Sqrt"; +var ii = "Sum"; var zo = "SpaceToBatchND"; var Mo = "SplitV"; -var ii = "Softmax"; -var np = "SparseFillEmptyRows"; -var Tl = "SparseReshape"; -var sp = "SparseSegmentMean"; -var rp = "SparseSegmentSum"; -var ap = "SparseToDense"; -var oi = "SquaredDifference"; -var $l = "Square"; +var oi = "Softmax"; +var sp = "SparseFillEmptyRows"; +var $l = "SparseReshape"; +var rp = "SparseSegmentMean"; +var ap = "SparseSegmentSum"; +var ip = "SparseToDense"; +var ui = "SquaredDifference"; +var _l = "Square"; var Lo = "StridedSlice"; -var ip = "StringNGrams"; -var Ng = "StringSplit"; -var Tg = "StringToHashBucketFast"; -var ui = "Sub"; +var op = "StringNGrams"; +var $g = "StringSplit"; +var _g = "StringToHashBucketFast"; +var li = "Sub"; var Bo = "Tan"; -var li = "Tanh"; -var Sr = "Tile"; +var ci = "Tanh"; +var Cr = "Tile"; var Vo = "TopK"; var Wo = "Transform"; -var ci = "Transpose"; -var $g = "Unique"; +var di = "Transpose"; +var Ag = "Unique"; var Uo = "Unpack"; -var op = "UnsortedSegmentSum"; +var up = "UnsortedSegmentSum"; var Go = "ZerosLike"; -var di = "Step"; -var hd = "FromPixels"; +var pi = "Step"; +var fd = "FromPixels"; var Ho = "RotateWithOffset"; -var na = "_FusedMatMul"; -var sa = "FusedConv2D"; -var ra = "FusedDepthwiseConv2D"; +var sa = "_FusedMatMul"; +var ra = "FusedConv2D"; +var aa = "FusedDepthwiseConv2D"; function ar(...e) { X().getBool("IS_TEST") || X().getBool("PROD") || console.warn(...e); } -function I$(...e) { +function R$(...e) { X().getBool("IS_TEST") || X().getBool("PROD") || console.log(...e); } -var Yi = sg("kernelRegistry", () => /* @__PURE__ */ new Map()); -var Vu = sg("gradRegistry", () => /* @__PURE__ */ new Map()); -function Yf(e, t) { - let n = _g(e, t); - return Yi.get(n); +var Qi = ag("kernelRegistry", () => /* @__PURE__ */ new Map()); +var Vu = ag("gradRegistry", () => /* @__PURE__ */ new Map()); +function Zf(e, t) { + let n = Eg(e, t); + return Qi.get(n); } -function Jv(e) { +function nx(e) { return Vu.get(e); } -function Qf(e) { - let t = Yi.entries(), n = []; +function Jf(e) { + let t = Qi.entries(), n = []; for (; ; ) { let { done: s, value: r } = t.next(); if (s) @@ -3981,122 +3988,122 @@ function Qf(e) { } return n; } -function _l(e) { - let { kernelName: t, backendName: n } = e, s = _g(t, n); - Yi.has(s) && ar(`The kernel '${t}' for backend '${n}' is already registered`), Yi.set(s, e); +function Al(e) { + let { kernelName: t, backendName: n } = e, s = Eg(t, n); + Qi.has(s) && ar(`The kernel '${t}' for backend '${n}' is already registered`), Qi.set(s, e); } -function S$(e) { +function D$(e) { let { kernelName: t } = e; Vu.has(t) && X().getBool("DEBUG") && ar(`Overriding the gradient for '${t}'`), Vu.set(t, e); } -function hde(e, t) { - let n = _g(e, t); - if (!Yi.has(n)) +function _de(e, t) { + let n = Eg(e, t); + if (!Qi.has(n)) throw new Error(`The kernel '${e}' for backend '${t}' is not registered`); - Yi.delete(n); + Qi.delete(n); } -function fde(e) { +function Ade(e) { if (!Vu.has(e)) throw new Error(`The gradient '${e}' for backend is not registered`); Vu.delete(e); } -function mde(e, t) { - Qf(e).forEach((s) => { +function Ede(e, t) { + Jf(e).forEach((s) => { let r = Object.assign({}, s, { backendName: t }); - _l(r); + Al(r); }); } -function _g(e, t) { +function Eg(e, t) { return `${t}_${e}`; } -var w = {}; -Ae(w, { arraysEqual: () => wr, assert: () => O, assertNonNegativeIntegerDimensions: () => tg, assertNonNull: () => va, assertShapesMatch: () => dn, bytesFromStringArray: () => Uw, bytesPerElement: () => jf, checkConversionForErrors: () => Vw, clamp: () => Bu, computeStrides: () => ro, createScalarValue: () => A$, createShuffledIndices: () => u$, decodeString: () => fd, distSquared: () => r$, encodeString: () => El, fetch: () => R$, fingerPrint64: () => _$, flatten: () => ta, getArrayFromDType: () => Bw, getTypedArrayFromDType: () => Lw, hasEncodingLoss: () => d$, hexToLong: () => Al, indexToLoc: () => f$, inferDtype: () => Ud, inferFromImplicitShape: () => c$, isBoolean: () => Gw, isFunction: () => hr, isInt: () => Xi, isNumber: () => Hw, isPromise: () => ng, isScalarShape: () => a$, isString: () => ir, isTypedArray: () => Yt, isValidDtype: () => Ww, locToIndex: () => h$, makeOnesTypedArray: () => eg, makeZerosNestedTypedArray: () => p$, makeZerosTypedArray: () => Gd, nearestDivisor: () => pd, nearestLargerEven: () => t$, now: () => Wu, parseAxisParam: () => Jn, randUniform: () => s$, repeatedTry: () => l$, rightPad: () => Pu, shuffle: () => zw, shuffleCombo: () => e$, sizeFromShape: () => pt, sizeToSquarishShape: () => o$, squeezeShape: () => Mw, sum: () => n$, swap: () => dd, tanh: () => i$, toNestedArray: () => Gi, toTypedArray: () => up }); -var ex = ya(PT()); -var Gr = ex.default || ex; -function Al(e) { - return Gr.fromString(e, true, 16); +var x = {}; +Ae(x, { arraysEqual: () => kr, assert: () => O, assertNonNegativeIntegerDimensions: () => sg, assertNonNull: () => xa, assertShapesMatch: () => pn, bytesFromStringArray: () => Xw, bytesPerElement: () => Xf, checkConversionForErrors: () => jw, clamp: () => Bu, computeStrides: () => ro, createScalarValue: () => L$, createShuffledIndices: () => b$, decodeString: () => md, distSquared: () => h$, encodeString: () => Rl, fetch: () => V$, fingerPrint64: () => M$, flatten: () => na, getArrayFromDType: () => qw, getTypedArrayFromDType: () => Hw, hasEncodingLoss: () => x$, hexToLong: () => El, indexToLoc: () => I$, inferDtype: () => Gd, inferFromImplicitShape: () => v$, isBoolean: () => Yw, isFunction: () => hr, isInt: () => Yi, isNumber: () => Qw, isPromise: () => rg, isScalarShape: () => f$, isString: () => ir, isTypedArray: () => Qt, isValidDtype: () => Kw, locToIndex: () => k$, makeOnesTypedArray: () => ng, makeZerosNestedTypedArray: () => w$, makeZerosTypedArray: () => Hd, nearestDivisor: () => hd, nearestLargerEven: () => c$, now: () => Wu, parseAxisParam: () => ts, randUniform: () => p$, repeatedTry: () => y$, rightPad: () => Pu, shuffle: () => Uw, shuffleCombo: () => l$, sizeFromShape: () => pt, sizeToSquarishShape: () => g$, squeezeShape: () => Gw, sum: () => d$, swap: () => pd, tanh: () => m$, toNestedArray: () => Hi, toTypedArray: () => lp }); +var sx = va(HT()); +var Hr = sx.default || sx; +function El(e) { + return Hr.fromString(e, true, 16); } -var Xw = Al("c3a5c85c97cb3127"); -var Ur = Al("b492b66fbe98f273"); -var an = Al("9ae16a3b2f90404f"); -function Zf(e) { +var tk = El("c3a5c85c97cb3127"); +var Gr = El("b492b66fbe98f273"); +var on = El("9ae16a3b2f90404f"); +function em(e) { return e.xor(e.shru(47)); } -function Yw(e, t, n) { +function nk(e, t, n) { let s = e.slice(t, t + n); - return Gr.fromBytes(Array.from(s), true, true); + return Hr.fromBytes(Array.from(s), true, true); } function lt(e, t) { - return Yw(e, t, 8); + return nk(e, t, 8); } -function tx(e, t) { - return Yw(e, t, 4); +function rx(e, t) { + return nk(e, t, 4); } function Lt(e, t) { return t === 0 ? e : e.shru(t).or(e.shl(64 - t)); } -function ur(e, t, n = Al("9ddfea08eb382d69")) { +function ur(e, t, n = El("9ddfea08eb382d69")) { let s = e.xor(t).mul(n); s = s.xor(s.shru(47)); let r = t.xor(s).mul(n); return r = r.xor(r.shru(47)), r = r.mul(n), r; } -function C$(e, t, n, s, r, a) { +function F$(e, t, n, s, r, a) { r = r.add(e), a = Lt(a.add(r).add(s), 21); let i = r; return r = r.add(t), r = r.add(n), a = a.add(Lt(r, 44)), [r.add(s), a.add(i)]; } -function Bc(e, t, n, s) { - return C$(lt(e, t), lt(e, t + 8), lt(e, t + 16), lt(e, t + 24), n, s); +function Vc(e, t, n, s) { + return F$(lt(e, t), lt(e, t + 8), lt(e, t + 16), lt(e, t + 24), n, s); } -function N$(e, t = e.length) { +function O$(e, t = e.length) { if (t >= 8) { - let n = an.add(t * 2), s = lt(e, 0).add(an), r = lt(e, t - 8), a = Lt(r, 37).mul(n).add(s), i = Lt(s, 25).add(r).mul(n); + let n = on.add(t * 2), s = lt(e, 0).add(on), r = lt(e, t - 8), a = Lt(r, 37).mul(n).add(s), i = Lt(s, 25).add(r).mul(n); return ur(a, i, n); } if (t >= 4) { - let n = an.add(t * 2), s = tx(e, 0); - return ur(s.shl(3).add(t), tx(e, t - 4), n); + let n = on.add(t * 2), s = rx(e, 0); + return ur(s.shl(3).add(t), rx(e, t - 4), n); } if (t > 0) { let n = e[0], s = e[t >> 1], r = e[t - 1], a = n + (s << 8), i = t + (r << 2); - return Zf(an.mul(a).xor(Xw.mul(i))).mul(an); + return em(on.mul(a).xor(tk.mul(i))).mul(on); } - return an; + return on; } -function T$(e, t = e.length) { - let n = an.add(t * 2), s = lt(e, 0).mul(Ur), r = lt(e, 8), a = lt(e, t - 8).mul(n), i = lt(e, t - 16).mul(an); - return ur(Lt(s.add(r), 43).add(Lt(a, 30)).add(i), s.add(Lt(r.add(an), 18)).add(a), n); +function P$(e, t = e.length) { + let n = on.add(t * 2), s = lt(e, 0).mul(Gr), r = lt(e, 8), a = lt(e, t - 8).mul(n), i = lt(e, t - 16).mul(on); + return ur(Lt(s.add(r), 43).add(Lt(a, 30)).add(i), s.add(Lt(r.add(on), 18)).add(a), n); } -function $$(e, t = e.length) { - let n = an.add(t * 2), s = lt(e, 0).mul(an), r = lt(e, 8), a = lt(e, t - 8).mul(n), i = lt(e, t - 16).mul(an), o = Lt(s.add(r), 43).add(Lt(a, 30)).add(i), u = ur(o, s.add(Lt(r.add(an), 18)).add(a), n), l = lt(e, 16).mul(n), c = lt(e, 24), p = o.add(lt(e, t - 32)).mul(n), d = u.add(lt(e, t - 24)).mul(n); +function z$(e, t = e.length) { + let n = on.add(t * 2), s = lt(e, 0).mul(on), r = lt(e, 8), a = lt(e, t - 8).mul(n), i = lt(e, t - 16).mul(on), o = Lt(s.add(r), 43).add(Lt(a, 30)).add(i), u = ur(o, s.add(Lt(r.add(on), 18)).add(a), n), l = lt(e, 16).mul(n), c = lt(e, 24), p = o.add(lt(e, t - 32)).mul(n), d = u.add(lt(e, t - 24)).mul(n); return ur(Lt(l.add(c), 43).add(Lt(p, 30)).add(d), l.add(Lt(c.add(s), 18)).add(p), n); } -function _$(e, t = e.length) { - let n = Gr.fromNumber(81, true); +function M$(e, t = e.length) { + let n = Hr.fromNumber(81, true); if (t <= 32) - return t <= 16 ? N$(e, t) : T$(e, t); + return t <= 16 ? O$(e, t) : P$(e, t); if (t <= 64) - return $$(e, t); - let s = n, r = n.mul(Ur).add(113), a = Zf(r.mul(an).add(113)).mul(an), i = [Gr.UZERO, Gr.UZERO], o = [Gr.UZERO, Gr.UZERO]; - s = s.mul(an).add(lt(e, 0)); + return z$(e, t); + let s = n, r = n.mul(Gr).add(113), a = em(r.mul(on).add(113)).mul(on), i = [Hr.UZERO, Hr.UZERO], o = [Hr.UZERO, Hr.UZERO]; + s = s.mul(on).add(lt(e, 0)); let u = 0, l = (t - 1 >> 6) * 64, c = l + (t - 1 & 63) - 63; do - s = Lt(s.add(r).add(i[0]).add(lt(e, u + 8)), 37).mul(Ur), r = Lt(r.add(i[1]).add(lt(e, u + 48)), 42).mul(Ur), s = s.xor(o[1]), r = r.add(i[0]).add(lt(e, u + 40)), a = Lt(a.add(o[0]), 33).mul(Ur), i = Bc(e, u, i[1].mul(Ur), s.add(o[0])), o = Bc(e, u + 32, a.add(o[1]), r.add(lt(e, u + 16))), [a, s] = [s, a], u += 64; + s = Lt(s.add(r).add(i[0]).add(lt(e, u + 8)), 37).mul(Gr), r = Lt(r.add(i[1]).add(lt(e, u + 48)), 42).mul(Gr), s = s.xor(o[1]), r = r.add(i[0]).add(lt(e, u + 40)), a = Lt(a.add(o[0]), 33).mul(Gr), i = Vc(e, u, i[1].mul(Gr), s.add(o[0])), o = Vc(e, u + 32, a.add(o[1]), r.add(lt(e, u + 16))), [a, s] = [s, a], u += 64; while (u !== l); - let p = Ur.add(a.and(255).shl(1)); - return u = c, o[0] = o[0].add(t - 1 & 63), i[0] = i[0].add(o[0]), o[0] = o[0].add(i[0]), s = Lt(s.add(r).add(i[0]).add(lt(e, u + 8)), 37).mul(p), r = Lt(r.add(i[1]).add(lt(e, u + 48)), 42).mul(p), s = s.xor(o[1].mul(9)), r = r.add(i[0].mul(9).add(lt(e, u + 40))), a = Lt(a.add(o[0]), 33).mul(p), i = Bc(e, u, i[1].mul(p), s.add(o[0])), o = Bc(e, u + 32, a.add(o[1]), r.add(lt(e, u + 16))), [a, s] = [s, a], ur(ur(i[0], o[0], p).add(Zf(r).mul(Xw)).add(a), ur(i[1], o[1], p).add(s), p); + let p = Gr.add(a.and(255).shl(1)); + return u = c, o[0] = o[0].add(t - 1 & 63), i[0] = i[0].add(o[0]), o[0] = o[0].add(i[0]), s = Lt(s.add(r).add(i[0]).add(lt(e, u + 8)), 37).mul(p), r = Lt(r.add(i[1]).add(lt(e, u + 48)), 42).mul(p), s = s.xor(o[1].mul(9)), r = r.add(i[0].mul(9).add(lt(e, u + 40))), a = Lt(a.add(o[0]), 33).mul(p), i = Vc(e, u, i[1].mul(p), s.add(o[0])), o = Vc(e, u + 32, a.add(o[1]), r.add(lt(e, u + 16))), [a, s] = [s, a], ur(ur(i[0], o[0], p).add(em(r).mul(tk)).add(a), ur(i[1], o[1], p).add(s), p); } -function A$(e, t) { - return t === "string" ? El(e) : up([e], t); +function L$(e, t) { + return t === "string" ? Rl(e) : lp([e], t); } -function E$(e, t) { +function B$(e, t) { return e instanceof Float32Array && t === "float32" || e instanceof Int32Array && t === "int32" || e instanceof Uint8Array && t === "bool"; } -function up(e, t) { +function lp(e, t) { if (t === "string") throw new Error("Cannot convert a string[] to a TypedArray"); - if (Array.isArray(e) && (e = ta(e)), X().getBool("DEBUG") && Vw(e, t), E$(e, t)) + if (Array.isArray(e) && (e = na(e)), X().getBool("DEBUG") && jw(e, t), B$(e, t)) return e; if (t == null || t === "float32" || t === "complex64") return new Float32Array(e); @@ -4113,18 +4120,18 @@ function up(e, t) { function Wu() { return X().platform.now(); } -function R$(e, t) { +function V$(e, t) { return X().platform.fetch(e, t); } -function El(e, t = "utf-8") { +function Rl(e, t = "utf-8") { return t = t || "utf-8", X().platform.encode(e, t); } -function fd(e, t = "utf-8") { +function md(e, t = "utf-8") { return t = t || "utf-8", X().platform.decode(e, t); } -var D$ = class { +var W$ = class { constructor(e, t) { - this.backendTimer = e, this.logger = t, t == null && (this.logger = new O$()); + this.backendTimer = e, this.logger = t, t == null && (this.logger = new G$()); } profileKernel(e, t, n) { let s, r = () => { @@ -4142,7 +4149,7 @@ var D$ = class { for (let u = 0; u < s.length; u++) { let l = s[u]; l.data().then((c) => { - F$(c, l.dtype, e); + U$(c, l.dtype, e); }); } return { kernelName: e, outputs: s, inputs: t, timeMs: a.then((u) => u.kernelMs), extraInfo: a.then((u) => u.getExtraProfileInfo != null ? u.getExtraProfileInfo() : "") }; @@ -4156,7 +4163,7 @@ var D$ = class { }); } }; -function F$(e, t, n) { +function U$(e, t, n) { if (t !== "float32") return false; for (let s = 0; s < e.length; s++) { @@ -4166,7 +4173,7 @@ function F$(e, t, n) { } return false; } -var O$ = class { +var G$ = class { logKernelProfile(e, t, n, s, r, a) { let i = typeof s == "number" ? Pu(`${s}ms`, 9) : s.error, o = Pu(e, 25), u = t.rank, l = t.size, c = Pu(t.shape.toString(), 14), p = ""; for (let d in r) { @@ -4179,7 +4186,7 @@ var O$ = class { console.log(`%c${o} %c${i} %c${u}D ${c} %c${l} %c${p} %c${a}`, "font-weight:bold", "color:red", "color:blue", "color: orange", "color: green", "color: steelblue"); } }; -function P$(e, t, n) { +function H$(e, t, n) { let s = {}, r = {}; for (let u = 0; u < t.length; u++) s[t[u].id] = true; @@ -4223,7 +4230,7 @@ function P$(e, t, n) { } return o; } -function z$(e, t, n, s) { +function q$(e, t, n, s) { for (let r = t.length - 1; r >= 0; r--) { let a = t[r], i = []; if (a.outputs.forEach((u) => { @@ -4239,7 +4246,7 @@ function z$(e, t, n, s) { if (l.dtype !== "float32") throw new Error(`Error in gradient for op ${a.kernelName}. The gradient of input ${u} must have 'float32' dtype, but has '${l.dtype}'`); let c = a.inputs[u]; - if (!wr(l.shape, c.shape)) + if (!kr(l.shape, c.shape)) throw new Error(`Error in gradient for op ${a.kernelName}. The gradient of input '${u}' has shape '${l.shape}', which does not match the shape of the input '${c.shape}'`); if (e[c.id] == null) e[c.id] = l; @@ -4250,16 +4257,16 @@ function z$(e, t, n, s) { } } } -var nx = 20; +var ax = 20; var Iu = 3; -var Rf = 7; -function M$(e, t, n, s) { - let r = ro(t), a = L$(e, t, n, r), i = t.length, o = Jc(e, t, n, r, a), u = ["Tensor"]; +var Ff = 7; +function j$(e, t, n, s) { + let r = ro(t), a = K$(e, t, n, r), i = t.length, o = ed(e, t, n, r, a), u = ["Tensor"]; return s && (u.push(` dtype: ${n}`), u.push(` rank: ${i}`), u.push(` shape: [${t}]`), u.push(" values:")), u.push(o.map((l) => " " + l).join(` `)), u.join(` `); } -function L$(e, t, n, s) { +function K$(e, t, n, s) { let r = pt(t), a = s[s.length - 1], i = new Array(a).fill(0), o = t.length, u = n === "complex64" ? $u(e) : e; if (o > 1) for (let l = 0; l < r / a; l++) { @@ -4271,43 +4278,43 @@ function L$(e, t, n, s) { } function Tu(e, t, n) { let s; - return Array.isArray(e) ? s = `${parseFloat(e[0].toFixed(Rf))} + ${parseFloat(e[1].toFixed(Rf))}j` : ir(e) ? s = `'${e}'` : n === "bool" ? s = Qw(e) : s = parseFloat(e.toFixed(Rf)).toString(), Pu(s, t); + return Array.isArray(e) ? s = `${parseFloat(e[0].toFixed(Ff))} + ${parseFloat(e[1].toFixed(Ff))}j` : ir(e) ? s = `'${e}'` : n === "bool" ? s = sk(e) : s = parseFloat(e.toFixed(Ff)).toString(), Pu(s, t); } -function Qw(e) { +function sk(e) { return e === 0 ? "false" : "true"; } -function Jc(e, t, n, s, r, a = true) { +function ed(e, t, n, s, r, a = true) { let i = n === "complex64" ? 2 : 1, o = t[0], u = t.length; if (u === 0) { if (n === "complex64") { let m = $u(e); return [Tu(m[0], 0, n)]; } - return n === "bool" ? [Qw(e[0])] : [e[0].toString()]; + return n === "bool" ? [sk(e[0])] : [e[0].toString()]; } if (u === 1) { - if (o > nx) { + if (o > ax) { let g = Iu * i, b = Array.from(e.slice(0, g)), y = Array.from(e.slice((o - Iu) * i, o * i)); - return n === "complex64" && (b = $u(b), y = $u(y)), ["[" + b.map((v, x) => Tu(v, r[x], n)).join(", ") + ", ..., " + y.map((v, x) => Tu(v, r[o - Iu + x], n)).join(", ") + "]"]; + return n === "complex64" && (b = $u(b), y = $u(y)), ["[" + b.map((v, w) => Tu(v, r[w], n)).join(", ") + ", ..., " + y.map((v, w) => Tu(v, r[o - Iu + w], n)).join(", ") + "]"]; } let m = n === "complex64" ? $u(e) : Array.from(e); return ["[" + m.map((g, b) => Tu(g, r[b], n)).join(", ") + "]"]; } let l = t.slice(1), c = s.slice(1), p = s[0] * i, d = []; - if (o > nx) { + if (o > ax) { for (let m = 0; m < Iu; m++) { let g = m * p, b = g + p; - d.push(...Jc(e.slice(g, b), l, n, c, r, false)); + d.push(...ed(e.slice(g, b), l, n, c, r, false)); } d.push("..."); for (let m = o - Iu; m < o; m++) { let g = m * p, b = g + p; - d.push(...Jc(e.slice(g, b), l, n, c, r, m === o - 1)); + d.push(...ed(e.slice(g, b), l, n, c, r, m === o - 1)); } } else for (let m = 0; m < o; m++) { let g = m * p, b = g + p; - d.push(...Jc(e.slice(g, b), l, n, c, r, m === o - 1)); + d.push(...ed(e.slice(g, b), l, n, c, r, m === o - 1)); } let h = u === 2 ? "," : ""; d[0] = "[" + d[0] + h; @@ -4334,7 +4341,7 @@ var Vt = class { } if (t === "complex64") throw new Error("complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag)."); - this.values = n || Bw(t, this.size), this.strides = ro(e); + this.values = n || qw(t, this.size), this.strides = ro(e); } set(e, ...t) { t.length === 0 && (t = [0]), O(t.length === this.rank, () => `The number of provided coordinates (${t.length}) must match the rank (${this.rank})`); @@ -4380,20 +4387,20 @@ var Vt = class { return this.shape.length; } toTensor() { - return us().makeTensor(this.values, this.shape, this.dtype); + return cs().makeTensor(this.values, this.shape, this.dtype); } }; -var us = null; -var Bi = null; -var B$ = null; -function V$(e) { - us = e; +var cs = null; +var Vi = null; +var X$ = null; +function Y$(e) { + cs = e; } -function W$(e) { - Bi = e; +function Q$(e) { + Vi = e; } -function U$(e) { - B$ = e; +function Z$(e) { + X$ = e; } var et = class { constructor(e, t, n, s) { @@ -4404,25 +4411,25 @@ var et = class { } async buffer() { let e = await this.data(); - return Bi.buffer(this.shape, this.dtype, e); + return Vi.buffer(this.shape, this.dtype, e); } bufferSync() { - return Bi.buffer(this.shape, this.dtype, this.dataSync()); + return Vi.buffer(this.shape, this.dtype, this.dataSync()); } async array() { let e = await this.data(); - return Gi(this.shape, e, this.dtype === "complex64"); + return Hi(this.shape, e, this.dtype === "complex64"); } arraySync() { - return Gi(this.shape, this.dataSync(), this.dtype === "complex64"); + return Hi(this.shape, this.dataSync(), this.dtype === "complex64"); } async data() { this.throwIfDisposed(); - let e = us().read(this.dataId); + let e = cs().read(this.dataId); if (this.dtype === "string") { let t = await e; try { - return t.map((n) => fd(n)); + return t.map((n) => md(n)); } catch (n) { throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes()."); } @@ -4430,14 +4437,14 @@ var et = class { return e; } dataToGPU(e) { - return this.throwIfDisposed(), us().readToGPU(this.dataId, e); + return this.throwIfDisposed(), cs().readToGPU(this.dataId, e); } dataSync() { this.throwIfDisposed(); - let e = us().readSync(this.dataId); + let e = cs().readSync(this.dataId); if (this.dtype === "string") try { - return e.map((t) => fd(t)); + return e.map((t) => md(t)); } catch (t) { throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes()."); } @@ -4445,11 +4452,11 @@ var et = class { } async bytes() { this.throwIfDisposed(); - let e = await us().read(this.dataId); + let e = await cs().read(this.dataId); return this.dtype === "string" ? e : new Uint8Array(e.buffer); } dispose() { - this.isDisposed || (us().disposeTensor(this), this.isDisposedInternal = true); + this.isDisposed || (cs().disposeTensor(this), this.isDisposedInternal = true); } get isDisposed() { return this.isDisposedInternal; @@ -4459,28 +4466,28 @@ var et = class { throw new Error("Tensor is disposed."); } print(e = false) { - return Bi.print(this, e); + return Vi.print(this, e); } clone() { - return this.throwIfDisposed(), Bi.clone(this); + return this.throwIfDisposed(), Vi.clone(this); } toString(e = false) { let t = this.dataSync(); - return M$(t, this.shape, this.dtype, e); + return j$(t, this.shape, this.dtype, e); } cast(e) { - return this.throwIfDisposed(), Bi.cast(this, e); + return this.throwIfDisposed(), Vi.cast(this, e); } variable(e = true, t, n) { - return this.throwIfDisposed(), us().makeVariable(this, e, t, n); + return this.throwIfDisposed(), cs().makeVariable(this, e, t, n); } }; Object.defineProperty(et, Symbol.hasInstance, { value: (e) => !!e && e.data != null && e.dataSync != null && e.throwIfDisposed != null }); -function G$() { - return sg("Tensor", () => et); +function J$() { + return ag("Tensor", () => et); } -G$(); -var md = class extends et { +J$(); +var gd = class extends et { constructor(e, t, n, s) { super(e.shape, e.dtype, e.dataId, s); this.trainable = t, this.name = n; @@ -4488,72 +4495,72 @@ var md = class extends et { assign(e) { if (e.dtype !== this.dtype) throw new Error(`dtype of the new value (${e.dtype}) and previous value (${this.dtype}) must match`); - if (!wr(e.shape, this.shape)) + if (!kr(e.shape, this.shape)) throw new Error(`shape of the new value (${e.shape}) and previous value (${this.shape}) must match`); - us().disposeTensor(this), this.dataId = e.dataId, us().incRef(this, null); + cs().disposeTensor(this), this.dataId = e.dataId, cs().incRef(this, null); } dispose() { - us().disposeVariable(this), this.isDisposedInternal = true; + cs().disposeVariable(this), this.isDisposedInternal = true; } }; -Object.defineProperty(md, Symbol.hasInstance, { value: (e) => e instanceof et && e.assign != null && e.assign instanceof Function }); +Object.defineProperty(gd, Symbol.hasInstance, { value: (e) => e instanceof et && e.assign != null && e.assign instanceof Function }); var _s = {}; -Ae(_s, { assertTypesMatch: () => nk, getTensorsInContainer: () => Ag, isTensorInList: () => j$, makeTypesMatch: () => vt }); -var H$ = ((e) => (e.R0 = "R0", e.R1 = "R1", e.R2 = "R2", e.R3 = "R3", e.R4 = "R4", e.R5 = "R5", e.R6 = "R6", e))(H$ || {}); -var Zw = ((e) => (e.float32 = "float32", e.int32 = "int32", e.bool = "int32", e.complex64 = "complex64", e))(Zw || {}); -var Jw = ((e) => (e.float32 = "float32", e.int32 = "int32", e.bool = "bool", e.complex64 = "complex64", e))(Jw || {}); -var ek = ((e) => (e.float32 = "float32", e.int32 = "float32", e.bool = "float32", e.complex64 = "complex64", e))(ek || {}); -var tk = ((e) => (e.float32 = "complex64", e.int32 = "complex64", e.bool = "complex64", e.complex64 = "complex64", e))(tk || {}); -var q$ = { float32: ek, int32: Zw, bool: Jw, complex64: tk }; -function yn(e, t) { +Ae(_s, { assertTypesMatch: () => uk, getTensorsInContainer: () => Rg, isTensorInList: () => n_, makeTypesMatch: () => vt }); +var e_ = ((e) => (e.R0 = "R0", e.R1 = "R1", e.R2 = "R2", e.R3 = "R3", e.R4 = "R4", e.R5 = "R5", e.R6 = "R6", e))(e_ || {}); +var rk = ((e) => (e.float32 = "float32", e.int32 = "int32", e.bool = "int32", e.complex64 = "complex64", e))(rk || {}); +var ak = ((e) => (e.float32 = "float32", e.int32 = "int32", e.bool = "bool", e.complex64 = "complex64", e))(ak || {}); +var ik = ((e) => (e.float32 = "float32", e.int32 = "float32", e.bool = "float32", e.complex64 = "complex64", e))(ik || {}); +var ok = ((e) => (e.float32 = "complex64", e.int32 = "complex64", e.bool = "complex64", e.complex64 = "complex64", e))(ok || {}); +var t_ = { float32: ik, int32: rk, bool: ak, complex64: ok }; +function cn(e, t) { if (e === "string" || t === "string") { if (e === "string" && t === "string") return "string"; throw new Error(`Can not upcast ${e} with ${t}`); } - return q$[e][t]; + return t_[e][t]; } -function lp(e) { - return yn(e, "int32"); +function cp(e) { + return cn(e, "int32"); } function vt(e, t) { if (e.dtype === t.dtype) return [e, t]; - let n = yn(e.dtype, t.dtype); + let n = cn(e.dtype, t.dtype); return [e.cast(n), t.cast(n)]; } -function nk(e, t) { +function uk(e, t) { O(e.dtype === t.dtype, () => `The dtypes of the first(${e.dtype}) and second(${t.dtype}) input must match`); } -function j$(e, t) { +function n_(e, t) { return t.some((n) => n.id === e.id); } -function Ag(e) { +function Rg(e) { let t = []; - return sk(e, t, /* @__PURE__ */ new Set()), t; + return lk(e, t, /* @__PURE__ */ new Set()), t; } -function sk(e, t, n) { +function lk(e, t, n) { if (e == null) return; if (e instanceof et) { t.push(e); return; } - if (!K$(e)) + if (!s_(e)) return; let s = e; for (let r in s) { let a = s[r]; - n.has(a) || (n.add(a), sk(a, t, n)); + n.has(a) || (n.add(a), lk(a, t, n)); } } -function K$(e) { +function s_(e) { return Array.isArray(e) || typeof e == "object"; } -function Df(e) { +function Of(e) { return e.kernelName != null; } -var sx = class { +var ix = class { constructor() { this.registeredVariables = {}, this.nextTapeNodeId = 0, this.numBytes = 0, this.numTensors = 0, this.numStringTensors = 0, this.numDataBuffers = 0, this.gradientDepth = 0, this.kernelDepth = 0, this.scopeStack = [], this.numDataMovesStack = [], this.nextScopeId = 0, this.tensorInfo = /* @__PURE__ */ new WeakMap(), this.profiling = false, this.activeProfile = { newBytes: 0, newTensors: 0, peakBytes: 0, kernels: [], result: null, get kernelNames() { return Array.from(new Set(this.kernels.map((e) => e.name))); @@ -4564,9 +4571,9 @@ var sx = class { this.registeredVariables[e].dispose(); } }; -var Jf = class { +var tm = class { constructor(e) { - this.ENV = e, this.registry = {}, this.registryFactory = {}, this.pendingBackendInitId = 0, this.state = new sx(); + this.ENV = e, this.registry = {}, this.registryFactory = {}, this.pendingBackendInitId = 0, this.state = new ix(); } async ready() { if (this.pendingBackendInit != null) @@ -4623,15 +4630,15 @@ var Jf = class { if (!(n ? await t : t)) return false; } - return this.backendInstance = this.registry[e], this.setupRegisteredKernels(), this.profiler = new D$(this.backendInstance), true; + return this.backendInstance = this.registry[e], this.setupRegisteredKernels(), this.profiler = new W$(this.backendInstance), true; } setupRegisteredKernels() { - Qf(this.backendName).forEach((t) => { + Jf(this.backendName).forEach((t) => { t.setupFunc != null && t.setupFunc(this.backendInstance); }); } disposeRegisteredKernels(e) { - Qf(e).forEach((n) => { + Jf(e).forEach((n) => { n.disposeFunc != null && n.disposeFunc(this.registry[e]); }); } @@ -4699,20 +4706,20 @@ var Jf = class { } } nextTensorId() { - return Jf.nextTensorId++; + return tm.nextTensorId++; } nextVariableId() { - return Jf.nextVariableId++; + return tm.nextVariableId++; } clone(e) { - let t = M.runKernel(Ma, { x: e }), n = { x: e }, s = (a) => ({ x: () => { + let t = M.runKernel(La, { x: e }), n = { x: e }, s = (a) => ({ x: () => { let i = "float32", o = { x: a }, u = { dtype: i }; - return M.runKernel(Sa, o, u); + return M.runKernel(Ca, o, u); } }), r = []; return this.addTapeNode(this.state.activeScope.name, n, [t], s, r, {}), t; } runKernel(e, t, n) { - if (this.backendName == null && this.backend, !(Yf(e, this.backendName) != null)) + if (this.backendName == null && this.backend, !(Zf(e, this.backendName) != null)) throw new Error(`Kernel '${e}' not registered for backend '${this.backendName}'`); return this.runKernelFunc({ kernelName: e, inputs: t, attrs: n }); } @@ -4733,25 +4740,25 @@ var Jf = class { this.shouldCheckForMemLeaks() && this.state.numDataMovesStack.push(0); let i; this.backendName == null && this.backend; - let o, u = Df(e) ? e.kernelName : this.state.activeScope != null ? this.state.activeScope.name : ""; - if (Df(e)) { + let o, u = Of(e) ? e.kernelName : this.state.activeScope != null ? this.state.activeScope.name : ""; + if (Of(e)) { let { kernelName: h, inputs: f, attrs: m } = e; this.backendName == null && this.backend; - let g = Yf(h, this.backendName); + let g = Zf(h, this.backendName); O(g != null, () => `Cannot find registered kernel '${h}' for backend '${this.backendName}'`), i = () => { let b = this.backend.numDataIds(); o = g.kernelFunc({ inputs: f, attrs: m, backend: this.backend }); let y = Array.isArray(o) ? o : [o]; this.shouldCheckForMemLeaks() && this.checkKernelForMemLeak(h, b, y); - let v = y.map((x) => { - if (x.rank != null) - return x; - let { dataId: k, shape: C, dtype: T } = x; - return this.makeTensorFromDataId(k, C, T); + let v = y.map((w) => { + if (w.rank != null) + return w; + let { dataId: k, shape: T, dtype: N } = w; + return this.makeTensorFromDataId(k, T, N); }); if (s) { - let x = this.getTensorsForGradient(h, f, v); - n = this.saveTensorsForBackwardMode(x); + let w = this.getTensorsForGradient(h, f, v); + n = this.saveTensorsForBackwardMode(w); } return v; }; @@ -4766,7 +4773,7 @@ var Jf = class { return this.shouldCheckForMemLeaks() && this.checkKernelForMemLeak(u, m, g), g; }; } - let { inputs: l, attrs: c } = e, p = Df(e) ? null : e.backwardsFunc, d; + let { inputs: l, attrs: c } = e, p = Of(e) ? null : e.backwardsFunc, d; return this.scopedRun(() => this.state.kernelDepth++, () => this.state.kernelDepth--, () => { !this.ENV.getBool("DEBUG") && !this.state.profiling ? t = i() : (d = this.profiler.profileKernel(u, l, () => i()), this.ENV.getBool("DEBUG") && this.profiler.logKernelProfile(d), t = d.outputs); }), s && this.addTapeNode(u, l, t, p, n, c), this.state.profiling && this.state.activeProfile.kernels.push({ name: u, bytesAdded: this.state.numBytes - r, totalBytesSnapshot: this.state.numBytes, tensorsAdded: this.state.numTensors - a, totalTensorsSnapshot: this.state.numTensors, inputShapes: Object.keys(l).map((h) => l[h] != null ? l[h].shape : null), outputShapes: t.map((h) => h.shape), kernelTimeMs: d.timeMs, extraInfo: d.extraInfo }), Array.isArray(o) ? t : t[0]; @@ -4775,7 +4782,7 @@ var Jf = class { return e.map((n) => this.keep(this.clone(n))); } getTensorsForGradient(e, t, n) { - let s = Jv(e); + let s = nx(e); if (s != null) { let r = s.inputsToSave || [], a = s.outputsToSave || [], i; s.saveAllInputs ? (O(Array.isArray(t), () => "saveAllInputs is true, expected inputs to be an array."), i = Object.keys(t).map((u) => t[u])) : i = r.map((u) => t[u]); @@ -4789,10 +4796,10 @@ var Jf = class { throw new Error("Values passed to engine.makeTensor() are null"); n = n || "float32", s = s || this.backend; let r = e; - n === "string" && ir(e[0]) && (r = e.map((o) => El(o))); + n === "string" && ir(e[0]) && (r = e.map((o) => Rl(o))); let a = s.write(r, t, n), i = new et(t, n, a, this.nextTensorId()); if (this.trackTensor(i, s), n === "string") { - let o = this.state.tensorInfo.get(a), u = Uw(r); + let o = this.state.tensorInfo.get(a), u = Xw(r); this.state.numBytes += u - o.bytes, o.bytes = u; } return i; @@ -4804,7 +4811,7 @@ var Jf = class { } makeVariable(e, t = true, n, s) { n = n || this.nextVariableId().toString(), s != null && s !== e.dtype && (e = e.cast(s)); - let r = new md(e, t, n, this.nextTensorId()); + let r = new gd(e, t, n, this.nextTensorId()); if (this.state.registeredVariables[r.name] != null) throw new Error(`Variable with name ${r.name} was already registered`); return this.state.registeredVariables[r.name] = r, this.incRef(r, this.backend), r; @@ -4812,7 +4819,7 @@ var Jf = class { trackTensor(e, t) { this.state.numTensors++, e.dtype === "string" && this.state.numStringTensors++; let n = 0; - e.dtype !== "complex64" && e.dtype !== "string" && (n = e.size * jf(e.dtype)), this.state.numBytes += n, this.state.tensorInfo.has(e.dataId) || (this.state.numDataBuffers++, this.state.tensorInfo.set(e.dataId, { backend: t || this.backend, dtype: e.dtype, shape: e.shape, bytes: n })), e instanceof md || this.track(e); + e.dtype !== "complex64" && e.dtype !== "string" && (n = e.size * Xf(e.dtype)), this.state.numBytes += n, this.state.tensorInfo.has(e.dataId) || (this.state.numDataBuffers++, this.state.tensorInfo.set(e.dataId, { backend: t || this.backend, dtype: e.dtype, shape: e.shape, bytes: n })), e instanceof gd || this.track(e); } incRef(e, t) { this.trackTensor(e, t), this.backend.incRef(e.dataId); @@ -4825,7 +4832,7 @@ var Jf = class { return; let t = this.state.tensorInfo.get(e.dataId); if (this.state.numTensors--, e.dtype === "string" && (this.state.numStringTensors--, this.state.numBytes -= t.bytes), e.dtype !== "complex64" && e.dtype !== "string") { - let n = e.size * jf(e.dtype); + let n = e.size * Xf(e.dtype); this.state.numBytes -= n; } t.backend.disposeData(e.dataId) && this.removeDataId(e.dataId, t.backend); @@ -4855,10 +4862,10 @@ var Jf = class { return this.state.gradientDepth > 0 && this.state.kernelDepth === 0; } addTapeNode(e, t, n, s, r, a) { - let i = { id: this.state.nextTapeNodeId++, kernelName: e, inputs: t, outputs: n, saved: r }, o = Jv(e); + let i = { id: this.state.nextTapeNodeId++, kernelName: e, inputs: t, outputs: n, saved: r }, o = nx(e); o != null && (s = o.gradFunc), s != null && (i.gradient = (u) => (u = u.map((l, c) => { if (l == null) { - let p = n[c], d = Gd(p.size, p.dtype); + let p = n[c], d = Hd(p.size, p.dtype); return this.makeTensor(d, p.shape, p.dtype); } return l; @@ -4878,7 +4885,7 @@ var Jf = class { e && (t.name = e), this.state.scopeStack.push(t), this.state.activeScope = t; } endScope(e) { - let t = Ag(e), n = new Set(t.map((r) => r.id)); + let t = Rg(e), n = new Set(t.map((r) => r.id)); for (let r = 0; r < this.state.activeScope.track.length; r++) { let a = this.state.activeScope.track[r]; !a.kept && !n.has(a.id) && a.dispose(); @@ -4893,12 +4900,12 @@ var Jf = class { throw new Error(`dy must have 'float32' dtype, but has '${n.dtype}'`); let r = this.scopedRun(() => this.startTape(), () => this.endTape(), () => this.tidy("forward", e)); O(r instanceof et, () => "The result y returned by f() must be a tensor."); - let a = P$(this.state.activeTape, t, r); + let a = H$(this.state.activeTape, t, r); if (!s && a.length === 0 && t.length > 0) throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y."); return this.tidy("backward", () => { let i = {}; - i[r.id] = n == null ? X$(r.shape) : n, z$(i, a, (u) => this.tidy(u), Y$); + i[r.id] = n == null ? r_(r.shape) : n, q$(i, a, (u) => this.tidy(u), a_); let o = t.map((u) => i[u.id]); return this.state.gradientDepth === 0 && (this.state.activeTape.forEach((u) => { for (let l of u.saved) @@ -4944,45 +4951,45 @@ var Jf = class { return this.state.registeredVariables; } reset() { - this.pendingBackendInitId++, this.state.dispose(), this.ENV.reset(), this.state = new sx(); + this.pendingBackendInitId++, this.state.dispose(), this.ENV.reset(), this.state = new ix(); for (let e in this.registry) this.disposeRegisteredKernels(e), this.registry[e].dispose(), delete this.registry[e]; this.backendName = null, this.backendInstance = null, this.pendingBackendInit = null; } }; -var Eg = Jf; -Eg.nextTensorId = 0; -Eg.nextVariableId = 0; -function X$(e) { - let t = eg(pt(e), "float32"); +var Dg = tm; +Dg.nextTensorId = 0; +Dg.nextVariableId = 0; +function r_(e) { + let t = ng(pt(e), "float32"); return M.makeTensor(t, e, "float32"); } -function rk() { - let e = Kw(); +function ck() { + let e = ek(); if (e._tfengine == null) { - let t = new m$(e); - e._tfengine = new Eg(t); + let t = new S$(e); + e._tfengine = new Dg(t); } - return v$(e._tfengine.ENV), V$(() => e._tfengine), e._tfengine; + return $$(e._tfengine.ENV), Y$(() => e._tfengine), e._tfengine; } -var M = rk(); -function Y$(e, t) { +var M = ck(); +function a_(e, t) { let n = { a: e, b: t }; - return M.runKernel(kr, n); + return M.runKernel(Ir, n); } -var cp = {}; -Ae(cp, { isBrowser: () => ak, isMobile: () => J$, mockIsMobile: () => Z$ }); -function Q$() { +var dp = {}; +Ae(dp, { isBrowser: () => dk, isMobile: () => u_, mockIsMobile: () => o_ }); +function i_() { return typeof navigator != "undefined" && navigator != null; } -var em; -function Z$(e) { - em = e; +var nm; +function o_(e) { + nm = e; } -function J$(e) { - if (em !== void 0) - return em; - if (e || Q$()) { +function u_(e) { + if (nm !== void 0) + return nm; + if (e || i_()) { if (e || (e = navigator), e.product === "ReactNative") return true; let t = e.userAgent || e.vendor || (typeof window != "undefined" ? window.opera : ""); @@ -4994,44 +5001,45 @@ function J$(e) { } return false; } -function ak() { +function dk() { return typeof window != "undefined" && window.document != null || typeof WorkerGlobalScope != "undefined"; } -var gs = X(); -gs.registerFlag("DEBUG", () => false, (e) => { +var jn = X(); +jn.registerFlag("DEBUG", () => false, (e) => { e && console.warn("Debugging mode is ON. The output of every math call will be downloaded to CPU and checked for NaNs. This significantly impacts performance."); }); -gs.registerFlag("IS_BROWSER", () => ak()); -gs.registerFlag("IS_NODE", () => typeof process != "undefined" && typeof process.versions != "undefined" && typeof process.versions.node != "undefined"); -gs.registerFlag("IS_CHROME", () => typeof navigator != "undefined" && navigator != null && navigator.userAgent != null && /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor)); -gs.registerFlag("PROD", () => false); -gs.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY", () => gs.getBool("DEBUG")); -gs.registerFlag("DEPRECATION_WARNINGS_ENABLED", () => true); -gs.registerFlag("IS_TEST", () => false); -gs.registerFlag("CHECK_COMPUTATION_FOR_ERRORS", () => true); -gs.registerFlag("WRAP_TO_IMAGEBITMAP", () => false); +jn.registerFlag("IS_BROWSER", () => dk()); +jn.registerFlag("IS_NODE", () => typeof process != "undefined" && typeof process.versions != "undefined" && typeof process.versions.node != "undefined"); +jn.registerFlag("IS_CHROME", () => typeof navigator != "undefined" && navigator != null && navigator.userAgent != null && /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor)); +jn.registerFlag("PROD", () => false); +jn.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY", () => jn.getBool("DEBUG")); +jn.registerFlag("DEPRECATION_WARNINGS_ENABLED", () => true); +jn.registerFlag("IS_TEST", () => false); +jn.registerFlag("CHECK_COMPUTATION_FOR_ERRORS", () => true); +jn.registerFlag("WRAP_TO_IMAGEBITMAP", () => false); +jn.registerFlag("ENGINE_COMPILE_ONLY", () => false); function Rs(e, t) { let n = e; - if (Yt(e)) + if (Qt(e)) return t === "string" ? [] : [e.length]; if (!Array.isArray(e)) return []; let s = []; - for (; Array.isArray(n) || Yt(n) && t !== "string"; ) + for (; Array.isArray(n) || Qt(n) && t !== "string"; ) s.push(n.length), n = n[0]; - return Array.isArray(e) && X().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY") && ik(e, s, []), s; + return Array.isArray(e) && X().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY") && pk(e, s, []), s; } -function ik(e, t, n) { - if (n = n || [], !Array.isArray(e) && !Yt(e)) { +function pk(e, t, n) { + if (n = n || [], !Array.isArray(e) && !Qt(e)) { O(t.length === 0, () => `Element arr[${n.join("][")}] is a primitive, but should be an array/TypedArray of ${t[0]} elements`); return; } O(t.length > 0, () => `Element arr[${n.join("][")}] should be a primitive, but is an array of ${e.length} elements`), O(e.length === t[0], () => `Element arr[${n.join("][")}] should have ${t[0]} elements, but has ${e.length} elements`); let s = t.slice(1); for (let r = 0; r < e.length; ++r) - ik(e[r], s, n.concat(r)); + pk(e[r], s, n.concat(r)); } -function rx(e, t, n, s) { +function ox(e, t, n, s) { if (e !== "string_or_numeric") { if (e == null) throw new Error("Expected dtype cannot be null."); @@ -5041,15 +5049,15 @@ function rx(e, t, n, s) { } function _(e, t, n, s = "numeric") { if (e instanceof et) - return rx(s, e.dtype, t, n), e; - let r = Ud(e); - if (r !== "string" && ["bool", "int32", "float32"].indexOf(s) >= 0 && (r = s), rx(s, r, t, n), e == null || !Yt(e) && !Array.isArray(e) && typeof e != "number" && typeof e != "boolean" && typeof e != "string") { + return ox(s, e.dtype, t, n), e; + let r = Gd(e); + if (r !== "string" && ["bool", "int32", "float32"].indexOf(s) >= 0 && (r = s), ox(s, r, t, n), e == null || !Qt(e) && !Array.isArray(e) && typeof e != "number" && typeof e != "boolean" && typeof e != "string") { let u = e == null ? "null" : e.constructor.name; throw new Error(`Argument '${t}' passed to '${n}' must be a Tensor or TensorLike, but got '${u}'`); } let a = Rs(e, r); - !Yt(e) && !Array.isArray(e) && (e = [e]); - let o = r !== "string" ? up(e, r) : ta(e, [], true); + !Qt(e) && !Array.isArray(e) && (e = [e]); + let o = r !== "string" ? lp(e, r) : na(e, [], true); return M.makeTensor(o, a, r); } function Uu(e, t, n, s = "numeric") { @@ -5057,38 +5065,38 @@ function Uu(e, t, n, s = "numeric") { throw new Error(`Argument ${t} passed to ${n} must be a \`Tensor[]\` or \`TensorLike[]\``); return e.map((a, i) => _(a, `${t}[${i}]`, n, s)); } -var e_ = "__op"; +var l_ = "__op"; function L(e) { let t = Object.keys(e); if (t.length !== 1) throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${t.length} keys.`); let n = t[0], s = e[n]; - n.endsWith("_") && (n = n.substring(0, n.length - 1)), n = n + e_; + n.endsWith("_") && (n = n.substring(0, n.length - 1)), n = n + l_; let r = (...a) => { M.startScope(n); try { let i = s(...a); - return ng(i) && console.error("Cannot return a Promise inside of tidy."), M.endScope(i), i; + return rg(i) && console.error("Cannot return a Promise inside of tidy."), M.endScope(i), i; } catch (i) { throw M.endScope(null), i; } }; return Object.defineProperty(r, "name", { value: n, configurable: true }), r; } -function t_(e, t) { +function c_(e, t) { let n = _(e, "real", "complex"), s = _(t, "imag", "complex"); - dn(n.shape, s.shape, `real and imag shapes, ${n.shape} and ${s.shape}, must match in call to tf.complex().`); + pn(n.shape, s.shape, `real and imag shapes, ${n.shape} and ${s.shape}, must match in call to tf.complex().`); let r = { real: n, imag: s }; - return M.runKernel(qd, r); + return M.runKernel(jd, r); } -var aa = L({ complex_: t_ }); -function Cr(e, t, n, s) { - if (s == null && (s = Ud(e)), s === "complex64") +var ia = L({ complex_: c_ }); +function Nr(e, t, n, s) { + if (s == null && (s = Gd(e)), s === "complex64") throw new Error("Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag)."); - if (!Yt(e) && !Array.isArray(e) && typeof e != "number" && typeof e != "boolean" && typeof e != "string") + if (!Qt(e) && !Array.isArray(e) && typeof e != "number" && typeof e != "boolean" && typeof e != "string") throw new Error("values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray"); if (t != null) { - tg(t); + sg(t); let r = pt(t), a = pt(n); O(r === a, () => `Based on the provided shape, [${t}], the tensor should have ${r} values but has ${a}`); for (let i = 0; i < n.length; ++i) { @@ -5096,15 +5104,15 @@ function Cr(e, t, n, s) { O(n[i] === t[i] || !u, () => `Error creating a new Tensor. Inferred shape (${n}) does not match the provided shape (${t}). `); } } - return !Yt(e) && !Array.isArray(e) && (e = [e]), t = t || n, e = s !== "string" ? up(e, s) : ta(e, [], true), M.makeTensor(e, t, s); + return !Qt(e) && !Array.isArray(e) && (e = [e]), t = t || n, e = s !== "string" ? lp(e, s) : na(e, [], true), M.makeTensor(e, t, s); } -function hs(e, t, n) { +function fs(e, t, n) { let s = Rs(e, n); - return Cr(e, t, s, n); + return Nr(e, t, s, n); } -var tm = { float32: 4, float16: 2, int32: 4, uint16: 2, uint8: 1, bool: 1, complex64: 8 }; -var gd = 4; -async function n_(e, t) { +var sm = { float32: 4, float16: 2, int32: 4, uint16: 2, uint8: 1, bool: 1, complex64: 8 }; +var bd = 4; +async function d_(e, t) { let n = [], s = [], r = Array.isArray(e) ? e.map((i) => i.name) : Object.keys(e); for (let i = 0; i < r.length; ++i) { let o = r[i], u = Array.isArray(e) ? e[i].tensor : e[o]; @@ -5113,10 +5121,10 @@ async function n_(e, t) { let l = { name: o, shape: u.shape, dtype: u.dtype }; if (u.dtype === "string") { let c = new Promise(async (p) => { - let d = await u.bytes(), h = d.reduce((g, b) => g + b.length, 0) + gd * d.length, f = new Uint8Array(h), m = 0; + let d = await u.bytes(), h = d.reduce((g, b) => g + b.length, 0) + bd * d.length, f = new Uint8Array(h), m = 0; for (let g = 0; g < d.length; g++) { let b = d[g], y = new Uint8Array(new Uint32Array([b.length]).buffer); - f.set(y, m), m += gd, f.set(b, m), m += b.length; + f.set(y, m), m += bd, f.set(b, m), m += b.length; } p(f); }); @@ -5126,9 +5134,9 @@ async function n_(e, t) { t != null && (l.group = t), n.push(l); } let a = await Promise.all(s); - return { data: s_(a), specs: n }; + return { data: p_(a), specs: n }; } -function ok(e, t) { +function hk(e, t) { let n = {}, s, r = 0; for (let a of t) { let i = a.name, o = a.dtype, u = a.shape, l = pt(u), c; @@ -5142,7 +5150,7 @@ function ok(e, t) { throw new Error(`Weight ${a.name} is quantized with ${p.dtype} which only supports weights of type float32 not ${o}.`); } else throw new Error(`Weight ${a.name} has unknown quantization dtype ${p.dtype}. Supported quantization dtypes are: 'uint8', 'uint16', and 'float16'.`); - let d = tm[p.dtype], h = e.slice(r, r + l * d), f = p.dtype === "uint8" ? new Uint8Array(h) : new Uint16Array(h); + let d = sm[p.dtype], h = e.slice(r, r + l * d), f = p.dtype === "uint8" ? new Uint8Array(h) : new Uint16Array(h); if (o === "float32") if (p.dtype === "uint8" || p.dtype === "uint16") { c = new Float32Array(f.length); @@ -5151,7 +5159,7 @@ function ok(e, t) { c[m] = g * p.scale + p.min; } } else if (p.dtype === "float16") - s === void 0 && (s = l_()), c = s(f); + s === void 0 && (s = y_()), c = s(f); else throw new Error(`Unsupported quantization type ${p.dtype} for weight type float32.`); else if (o === "int32") { @@ -5169,13 +5177,13 @@ function ok(e, t) { let p = pt(a.shape); c = []; for (let d = 0; d < p; d++) { - let h = new Uint32Array(e.slice(r, r + gd))[0]; - r += gd; + let h = new Uint32Array(e.slice(r, r + bd))[0]; + r += bd; let f = new Uint8Array(e.slice(r, r + h)); c.push(f), r += h; } } else { - let p = tm[o], d = e.slice(r, r + l * p); + let p = sm[o], d = e.slice(r, r + l * p); if (o === "float32") c = new Float32Array(d); else if (o === "int32") @@ -5187,17 +5195,17 @@ function ok(e, t) { let h = new Float32Array(c.length / 2), f = new Float32Array(c.length / 2); for (let b = 0; b < h.length; b++) h[b] = c[b * 2], f[b] = c[b * 2 + 1]; - let m = hs(h, u, "float32"), g = hs(f, u, "float32"); - n[i] = aa(m, g), m.dispose(), g.dispose(); + let m = fs(h, u, "float32"), g = fs(f, u, "float32"); + n[i] = ia(m, g), m.dispose(), g.dispose(); } else throw new Error(`Unsupported dtype in weight '${i}': ${o}`); r += l * p; } - o !== "complex64" && (n[i] = hs(c, u, o)); + o !== "complex64" && (n[i] = fs(c, u, o)); } return n; } -function s_(e) { +function p_(e) { if (e === null) throw new Error(`Invalid input value: ${JSON.stringify(e)}`); let t = 0, n = []; @@ -5210,20 +5218,20 @@ function s_(e) { s.set(new Uint8Array(a.buffer), r), r += a.byteLength; }), s.buffer; } -var Rg = typeof Buffer != "undefined" && (typeof Blob == "undefined" || typeof atob == "undefined" || typeof btoa == "undefined"); -function ax(e) { - return Rg ? Buffer.byteLength(e) : new Blob([e]).size; +var Fg = typeof Buffer != "undefined" && (typeof Blob == "undefined" || typeof atob == "undefined" || typeof btoa == "undefined"); +function ux(e) { + return Fg ? Buffer.byteLength(e) : new Blob([e]).size; } -function r_(e) { - if (Rg) +function h_(e) { + if (Fg) return Buffer.from(e).toString("base64"); let t = new Uint8Array(e), n = ""; for (let s = 0, r = t.length; s < r; s++) n += String.fromCharCode(t[s]); return btoa(n); } -function a_(e) { - if (Rg) { +function f_(e) { + if (Fg) { let s = Buffer.from(e, "base64"); return s.buffer.slice(s.byteOffset, s.byteOffset + s.byteLength); } @@ -5232,7 +5240,7 @@ function a_(e) { n.set([t.charCodeAt(s)], s); return n.buffer; } -function Dg(e) { +function Og(e) { if (e.length === 1) return e[0]; let t = 0; @@ -5244,18 +5252,18 @@ function Dg(e) { n.set(new Uint8Array(r), s), s += r.byteLength; }), n.buffer; } -function ix(e) { +function lx(e) { let t = "/"; for (e = e.trim(); e.endsWith(t); ) e = e.slice(0, e.length - 1); let n = e.split(t); return n[n.length - 1]; } -function uk(e, t) { +function fk(e, t) { let n = { modelTopology: e.modelTopology, format: e.format, generatedBy: e.generatedBy, convertedBy: e.convertedBy, weightsManifest: t }; return e.signature != null && (n.signature = e.signature), e.userDefinedMetadata != null && (n.userDefinedMetadata = e.userDefinedMetadata), e.modelInitializer != null && (n.modelInitializer = e.modelInitializer), e.trainingConfig != null && (n.trainingConfig = e.trainingConfig), n; } -async function Fg(e, t) { +async function Pg(e, t) { let n = { modelTopology: e.modelTopology, format: e.format, generatedBy: e.generatedBy, convertedBy: e.convertedBy }; if (e.trainingConfig != null && (n.trainingConfig = e.trainingConfig), e.weightsManifest != null) { let [s, r] = await t(e.weightsManifest); @@ -5263,12 +5271,12 @@ async function Fg(e, t) { } return e.signature != null && (n.signature = e.signature), e.userDefinedMetadata != null && (n.userDefinedMetadata = e.userDefinedMetadata), e.modelInitializer != null && (n.modelInitializer = e.modelInitializer), n; } -function Rl(e) { +function Dl(e) { if (e.modelTopology instanceof ArrayBuffer) throw new Error("Expected JSON model topology, received ArrayBuffer."); - return { dateSaved: new Date(), modelTopologyType: "JSON", modelTopologyBytes: e.modelTopology == null ? 0 : ax(JSON.stringify(e.modelTopology)), weightSpecsBytes: e.weightSpecs == null ? 0 : ax(JSON.stringify(e.weightSpecs)), weightDataBytes: e.weightData == null ? 0 : e.weightData.byteLength }; + return { dateSaved: new Date(), modelTopologyType: "JSON", modelTopologyBytes: e.modelTopology == null ? 0 : ux(JSON.stringify(e.modelTopology)), weightSpecsBytes: e.weightSpecs == null ? 0 : ux(JSON.stringify(e.weightSpecs)), weightDataBytes: e.weightData == null ? 0 : e.weightData.byteLength }; } -function i_() { +function m_() { let e = (n) => { let s = n << 13, r = 0; for (; (s & 8388608) === 0; ) @@ -5282,7 +5290,7 @@ function i_() { t[n] = 939524096 + (n - 1024 << 13); return t; } -function o_() { +function g_() { let e = new Uint32Array(64); e[0] = 0, e[31] = 1199570944, e[32] = 2147483648, e[63] = 3347054592; for (let t = 1; t < 31; t++) @@ -5291,14 +5299,14 @@ function o_() { e[t] = 2147483648 + (t - 32 << 23); return e; } -function u_() { +function b_() { let e = new Uint32Array(64); for (let t = 0; t < 64; t++) e[t] = 1024; return e[0] = e[32] = 0, e; } -function l_() { - let e = i_(), t = o_(), n = u_(); +function y_() { + let e = m_(), t = g_(), n = b_(); return (s) => { let r = new ArrayBuffer(4 * s.length), a = new Uint32Array(r); for (let i = 0; i < s.length; i++) { @@ -5335,15 +5343,15 @@ var xt = class { }), s; } }; -var c_ = (e) => xt.registerSaveRouter(e); -var d_ = (e) => xt.registerLoadRouter(e); -var p_ = (e) => xt.getSaveHandlers(e); -var h_ = (e, t) => xt.getLoadHandlers(e, t); -var nm = "tensorflowjs"; -var sm = 1; -var Kr = "models_store"; +var v_ = (e) => xt.registerSaveRouter(e); +var x_ = (e) => xt.registerLoadRouter(e); +var w_ = (e) => xt.getSaveHandlers(e); +var k_ = (e, t) => xt.getLoadHandlers(e, t); +var rm = "tensorflowjs"; +var am = 1; +var Xr = "models_store"; var or = "model_info_store"; -function lk() { +function mk() { if (!X().getBool("IS_BROWSER")) throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser."); let e = typeof window == "undefined" ? self : window, t = e.indexedDB || e.mozIndexedDB || e.webkitIndexedDB || e.msIndexedDB || e.shimIndexedDB; @@ -5351,13 +5359,13 @@ function lk() { throw new Error("The current browser does not appear to support IndexedDB."); return t; } -function rm(e) { +function im(e) { let t = e.result; - t.createObjectStore(Kr, { keyPath: "modelPath" }), t.createObjectStore(or, { keyPath: "modelPath" }); + t.createObjectStore(Xr, { keyPath: "modelPath" }), t.createObjectStore(or, { keyPath: "modelPath" }); } -var ia = class { +var oa = class { constructor(e) { - if (this.indexedDB = lk(), e == null || !e) + if (this.indexedDB = mk(), e == null || !e) throw new Error("For IndexedDB, modelPath must not be null, undefined or empty."); this.modelPath = e; } @@ -5371,21 +5379,21 @@ var ia = class { } databaseAction(e, t) { return new Promise((n, s) => { - let r = this.indexedDB.open(nm, sm); - r.onupgradeneeded = () => rm(r), r.onsuccess = () => { + let r = this.indexedDB.open(rm, am); + r.onupgradeneeded = () => im(r), r.onsuccess = () => { let a = r.result; if (t == null) { - let i = a.transaction(Kr, "readonly"), u = i.objectStore(Kr).get(this.modelPath); + let i = a.transaction(Xr, "readonly"), u = i.objectStore(Xr).get(this.modelPath); u.onsuccess = () => { if (u.result == null) return a.close(), s(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`)); n(u.result.modelArtifacts); }, u.onerror = (l) => (a.close(), s(u.error)), i.oncomplete = () => a.close(); } else { - let i = Rl(t), o = a.transaction(or, "readwrite"), u = o.objectStore(or), l = u.put({ modelPath: this.modelPath, modelArtifactsInfo: i }), c; + let i = Dl(t), o = a.transaction(or, "readwrite"), u = o.objectStore(or), l = u.put({ modelPath: this.modelPath, modelArtifactsInfo: i }), c; l.onsuccess = () => { - c = a.transaction(Kr, "readwrite"); - let d = c.objectStore(Kr).put({ modelPath: this.modelPath, modelArtifacts: t, modelArtifactsInfo: i }); + c = a.transaction(Xr, "readwrite"); + let d = c.objectStore(Xr).put({ modelPath: this.modelPath, modelArtifacts: t, modelArtifactsInfo: i }); d.onsuccess = () => n({ modelArtifactsInfo: i }), d.onerror = (h) => { u = o.objectStore(or); let f = u.delete(this.modelPath); @@ -5399,24 +5407,24 @@ var ia = class { }); } }; -ia.URL_SCHEME = "indexeddb://"; -var ck = (e) => X().getBool("IS_BROWSER") && !Array.isArray(e) && e.startsWith(ia.URL_SCHEME) ? f_(e.slice(ia.URL_SCHEME.length)) : null; -xt.registerSaveRouter(ck); -xt.registerLoadRouter(ck); -function f_(e) { - return new ia(e); +oa.URL_SCHEME = "indexeddb://"; +var gk = (e) => X().getBool("IS_BROWSER") && !Array.isArray(e) && e.startsWith(oa.URL_SCHEME) ? I_(e.slice(oa.URL_SCHEME.length)) : null; +xt.registerSaveRouter(gk); +xt.registerLoadRouter(gk); +function I_(e) { + return new oa(e); } -function m_(e) { - return e.startsWith(ia.URL_SCHEME) ? e.slice(ia.URL_SCHEME.length) : e; +function S_(e) { + return e.startsWith(oa.URL_SCHEME) ? e.slice(oa.URL_SCHEME.length) : e; } -var g_ = class { +var C_ = class { constructor() { - this.indexedDB = lk(); + this.indexedDB = mk(); } async listModels() { return new Promise((e, t) => { - let n = this.indexedDB.open(nm, sm); - n.onupgradeneeded = () => rm(n), n.onsuccess = () => { + let n = this.indexedDB.open(rm, am); + n.onupgradeneeded = () => im(n), n.onsuccess = () => { let s = n.result, r = s.transaction(or, "readonly"), i = r.objectStore(or).getAll(); i.onsuccess = () => { let o = {}; @@ -5428,17 +5436,17 @@ var g_ = class { }); } async removeModel(e) { - return e = m_(e), new Promise((t, n) => { - let s = this.indexedDB.open(nm, sm); - s.onupgradeneeded = () => rm(s), s.onsuccess = () => { + return e = S_(e), new Promise((t, n) => { + let s = this.indexedDB.open(rm, am); + s.onupgradeneeded = () => im(s), s.onsuccess = () => { let r = s.result, a = r.transaction(or, "readwrite"), i = a.objectStore(or), o = i.get(e), u; o.onsuccess = () => { if (o.result == null) return r.close(), n(new Error(`Cannot find model with path '${e}' in IndexedDB.`)); { let l = i.delete(e), c = () => { - u = r.transaction(Kr, "readwrite"); - let d = u.objectStore(Kr).delete(e); + u = r.transaction(Xr, "readwrite"); + let d = u.objectStore(Xr).delete(e); d.onsuccess = () => t(o.result.modelArtifactsInfo), d.onerror = (h) => n(o.error); }; l.onsuccess = c, l.onerror = (p) => (c(), r.close(), n(o.error)); @@ -5451,47 +5459,47 @@ var g_ = class { } }; var Gs = "/"; -var Vi = "tensorflowjs_models"; -var dk = "info"; -var b_ = "model_topology"; -var y_ = "weight_specs"; -var v_ = "weight_data"; -var x_ = "model_metadata"; -function pk(e) { - return { info: [Vi, e, dk].join(Gs), topology: [Vi, e, b_].join(Gs), weightSpecs: [Vi, e, y_].join(Gs), weightData: [Vi, e, v_].join(Gs), modelMetadata: [Vi, e, x_].join(Gs) }; +var Wi = "tensorflowjs_models"; +var bk = "info"; +var N_ = "model_topology"; +var T_ = "weight_specs"; +var $_ = "weight_data"; +var __ = "model_metadata"; +function yk(e) { + return { info: [Wi, e, bk].join(Gs), topology: [Wi, e, N_].join(Gs), weightSpecs: [Wi, e, T_].join(Gs), weightData: [Wi, e, $_].join(Gs), modelMetadata: [Wi, e, __].join(Gs) }; } -function hk(e) { +function vk(e) { for (let t of Object.values(e)) window.localStorage.removeItem(t); } -function w_(e) { +function A_(e) { let t = e.split(Gs); if (t.length < 3) throw new Error(`Invalid key format: ${e}`); return t.slice(1, t.length - 1).join(Gs); } -function k_(e) { - return e.startsWith(oa.URL_SCHEME) ? e.slice(oa.URL_SCHEME.length) : e; +function E_(e) { + return e.startsWith(ua.URL_SCHEME) ? e.slice(ua.URL_SCHEME.length) : e; } -var oa = class { +var ua = class { constructor(e) { if (!X().getBool("IS_BROWSER") || typeof window == "undefined" || typeof window.localStorage == "undefined") throw new Error("The current environment does not support local storage."); if (this.LS = window.localStorage, e == null || !e) throw new Error("For local storage, modelPath must not be null, undefined or empty."); - this.modelPath = e, this.keys = pk(this.modelPath); + this.modelPath = e, this.keys = yk(this.modelPath); } async save(e) { if (e.modelTopology instanceof ArrayBuffer) throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet."); { - let t = JSON.stringify(e.modelTopology), n = JSON.stringify(e.weightSpecs), s = Rl(e); + let t = JSON.stringify(e.modelTopology), n = JSON.stringify(e.weightSpecs), s = Dl(e); try { - this.LS.setItem(this.keys.info, JSON.stringify(s)), this.LS.setItem(this.keys.topology, t), this.LS.setItem(this.keys.weightSpecs, n), this.LS.setItem(this.keys.weightData, r_(e.weightData)); + this.LS.setItem(this.keys.info, JSON.stringify(s)), this.LS.setItem(this.keys.topology, t), this.LS.setItem(this.keys.weightSpecs, n), this.LS.setItem(this.keys.weightData, h_(e.weightData)); let r = { format: e.format, generatedBy: e.generatedBy, convertedBy: e.convertedBy, signature: e.signature != null ? e.signature : void 0, userDefinedMetadata: e.userDefinedMetadata != null ? e.userDefinedMetadata : void 0, modelInitializer: e.modelInitializer != null ? e.modelInitializer : void 0, trainingConfig: e.trainingConfig != null ? e.trainingConfig : void 0 }; return this.LS.setItem(this.keys.modelMetadata, JSON.stringify(r)), { modelArtifactsInfo: s }; } catch (r) { - throw hk(this.keys), new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${s.modelTopologyBytes}, weightSpecsBytes=${s.weightSpecsBytes}, weightDataBytes=${s.weightDataBytes}.`); + throw vk(this.keys), new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${s.modelTopologyBytes}, weightSpecsBytes=${s.weightSpecsBytes}, weightDataBytes=${s.weightDataBytes}.`); } } } @@ -5517,51 +5525,51 @@ var oa = class { let a = this.LS.getItem(this.keys.weightData); if (a == null) throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`); - return t.weightData = a_(a), t; + return t.weightData = f_(a), t; } }; -oa.URL_SCHEME = "localstorage://"; -var fk = (e) => X().getBool("IS_BROWSER") && !Array.isArray(e) && e.startsWith(oa.URL_SCHEME) ? I_(e.slice(oa.URL_SCHEME.length)) : null; -xt.registerSaveRouter(fk); -xt.registerLoadRouter(fk); -function I_(e) { - return new oa(e); +ua.URL_SCHEME = "localstorage://"; +var xk = (e) => X().getBool("IS_BROWSER") && !Array.isArray(e) && e.startsWith(ua.URL_SCHEME) ? R_(e.slice(ua.URL_SCHEME.length)) : null; +xt.registerSaveRouter(xk); +xt.registerLoadRouter(xk); +function R_(e) { + return new ua(e); } -var S_ = class { +var D_ = class { constructor() { O(X().getBool("IS_BROWSER"), () => "Current environment is not a web browser"), O(typeof window == "undefined" || typeof window.localStorage != "undefined", () => "Current browser does not appear to support localStorage"), this.LS = window.localStorage; } async listModels() { - let e = {}, t = Vi + Gs, n = Gs + dk; + let e = {}, t = Wi + Gs, n = Gs + bk; for (let s = 0; s < this.LS.length; ++s) { let r = this.LS.key(s); if (r.startsWith(t) && r.endsWith(n)) { - let a = w_(r); + let a = A_(r); e[a] = JSON.parse(this.LS.getItem(r)); } } return e; } async removeModel(e) { - e = k_(e); - let t = pk(e); + e = E_(e); + let t = yk(e); if (this.LS.getItem(t.info) == null) throw new Error(`Cannot find model at path '${e}'`); let n = JSON.parse(this.LS.getItem(t.info)); - return hk(t), n; + return vk(t), n; } }; -var Hi = "://"; -var Pn = class { +var qi = "://"; +var zn = class { constructor() { this.managers = {}; } static getInstance() { - return Pn.instance == null && (Pn.instance = new Pn()), Pn.instance; + return zn.instance == null && (zn.instance = new zn()), zn.instance; } static registerManager(e, t) { - O(e != null, () => "scheme must not be undefined or null."), e.endsWith(Hi) && (e = e.slice(0, e.indexOf(Hi))), O(e.length > 0, () => "scheme must not be an empty string."); - let n = Pn.getInstance(); + O(e != null, () => "scheme must not be undefined or null."), e.endsWith(qi) && (e = e.slice(0, e.indexOf(qi))), O(e.length > 0, () => "scheme must not be an empty string."); + let n = zn.getInstance(); O(n.managers[e] == null, () => `A model store manager is already registered for scheme '${e}'.`), n.managers[e] = t; } static getManager(e) { @@ -5574,44 +5582,44 @@ var Pn = class { return Object.keys(this.getInstance().managers); } }; -function ed(e) { - if (e.indexOf(Hi) === -1) - throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${Pn.getSchemes().join(",")}`); - return { scheme: e.split(Hi)[0], path: e.split(Hi)[1] }; +function td(e) { + if (e.indexOf(qi) === -1) + throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${zn.getSchemes().join(",")}`); + return { scheme: e.split(qi)[0], path: e.split(qi)[1] }; } -async function mk(e, t, n = false) { +async function wk(e, t, n = false) { O(e !== t, () => `Old path and new path are the same: '${e}'`); let s = xt.getLoadHandlers(e); O(s.length > 0, () => `Copying failed because no load handler is found for source URL ${e}.`), O(s.length < 2, () => `Copying failed because more than one (${s.length}) load handlers for source URL ${e}.`); let r = s[0], a = xt.getSaveHandlers(t); O(a.length > 0, () => `Copying failed because no save handler is found for destination URL ${t}.`), O(a.length < 2, () => `Copying failed because more than one (${s.length}) save handlers for destination URL ${t}.`); - let i = a[0], o = ed(e).scheme, u = ed(e).path, l = o === ed(e).scheme, c = await r.load(); - n && l && await Pn.getManager(o).removeModel(u); + let i = a[0], o = td(e).scheme, u = td(e).path, l = o === td(e).scheme, c = await r.load(); + n && l && await zn.getManager(o).removeModel(u); let p = await i.save(c); - return n && !l && await Pn.getManager(o).removeModel(u), p.modelArtifactsInfo; + return n && !l && await zn.getManager(o).removeModel(u), p.modelArtifactsInfo; } -async function C_() { - let e = Pn.getSchemes(), t = {}; +async function F_() { + let e = zn.getSchemes(), t = {}; for (let n of e) { - let s = await Pn.getManager(n).listModels(); + let s = await zn.getManager(n).listModels(); for (let r in s) { - let a = n + Hi + r; + let a = n + qi + r; t[a] = s[r]; } } return t; } -async function N_(e) { - let t = ed(e); - return Pn.getManager(t.scheme).removeModel(t.path); +async function O_(e) { + let t = td(e); + return zn.getManager(t.scheme).removeModel(t.path); } -async function T_(e, t) { - return mk(e, t, false); +async function P_(e, t) { + return wk(e, t, false); } -async function $_(e, t) { - return mk(e, t, true); +async function z_(e, t) { + return wk(e, t, true); } -var __ = class { +var M_ = class { fetch(e, t) { return fetch(e, t); } @@ -5628,24 +5636,24 @@ var __ = class { } }; if (X().get("IS_BROWSER")) { - X().setPlatform("browser", new __()); + X().setPlatform("browser", new M_()); try { - Pn.registerManager(oa.URL_SCHEME, new S_()); + zn.registerManager(ua.URL_SCHEME, new D_()); } catch (e) { } try { - Pn.registerManager(ia.URL_SCHEME, new g_()); + zn.registerManager(oa.URL_SCHEME, new C_()); } catch (e) { } } -var A_ = { importFetch: () => zT() }; -var Ff; -var E_ = class { +var L_ = { importFetch: () => qT() }; +var Pf; +var B_ = class { constructor() { - this.util = MT(), this.textEncoder = new this.util.TextEncoder(); + this.util = jT(), this.textEncoder = new this.util.TextEncoder(); } fetch(e, t) { - return X().global.fetch != null ? X().global.fetch(e, t) : (Ff == null && (Ff = A_.importFetch()), Ff(e, t)); + return X().global.fetch != null ? X().global.fetch(e, t) : (Pf == null && (Pf = L_.importFetch()), Pf(e, t)); } now() { let e = process.hrtime(); @@ -5660,44 +5668,44 @@ var E_ = class { return e.length === 0 ? "" : new this.util.TextDecoder(t).decode(e); } }; -X().get("IS_NODE") && !X().get("IS_BROWSER") && X().setPlatform("node", new E_()); +X().get("IS_NODE") && !X().get("IS_BROWSER") && X().setPlatform("node", new B_()); function De(e, t = "float32", n) { - return t = t || "float32", tg(e), new Vt(e, t, n); + return t = t || "float32", sg(e), new Vt(e, t, n); } -function R_(e, t) { +function V_(e, t) { let n = _(e, "x", "cast"); - if (!Ww(t)) + if (!Kw(t)) throw new Error(`Failed to cast to unknown dtype ${t}`); if (t === "string" && n.dtype !== "string" || t !== "string" && n.dtype === "string") throw new Error("Only strings can be casted to strings"); let s = { x: n }, r = { dtype: t }; - return M.runKernel(Sa, s, r); + return M.runKernel(Ca, s, r); } -var ce = L({ cast_: R_ }); -function D_(e) { +var ce = L({ cast_: V_ }); +function W_(e) { let n = { x: _(e, "x", "clone", "string_or_numeric") }; - return M.runKernel(Ma, n); + return M.runKernel(La, n); } -var lr = L({ clone_: D_ }); -function F_(e, t = false) { +var lr = L({ clone_: W_ }); +function U_(e, t = false) { console.log(e.toString(t)); } -rk(); -var O_ = { buffer: De, cast: ce, clone: lr, print: F_ }; -W$(O_); -var _n = {}; -Ae(_n, { browserFiles: () => W_, browserHTTPRequest: () => j_, concatenateArrayBuffers: () => Dg, copyModel: () => T_, decodeWeights: () => ok, encodeWeights: () => n_, fromMemory: () => X_, getLoadHandlers: () => h_, getModelArtifactsForJSON: () => Fg, getModelArtifactsInfoForJSON: () => Rl, getSaveHandlers: () => p_, http: () => Pg, isHTTPScheme: () => im, listModels: () => C_, loadWeights: () => U_, moveModel: () => $_, registerLoadRouter: () => d_, registerSaveRouter: () => c_, removeModel: () => N_, weightsLoaderFactory: () => bk, withSaveHandler: () => Y_ }); -var P_ = "model"; -var z_ = ".json"; -var M_ = ".weights.bin"; -function ox(e) { +ck(); +var G_ = { buffer: De, cast: ce, clone: lr, print: U_ }; +Q$(G_); +var En = {}; +Ae(En, { browserFiles: () => Q_, browserHTTPRequest: () => nA, concatenateArrayBuffers: () => Og, copyModel: () => P_, decodeWeights: () => hk, encodeWeights: () => d_, fromMemory: () => rA, getLoadHandlers: () => k_, getModelArtifactsForJSON: () => Pg, getModelArtifactsInfoForJSON: () => Dl, getSaveHandlers: () => w_, http: () => Mg, isHTTPScheme: () => um, listModels: () => F_, loadWeights: () => Z_, moveModel: () => z_, registerLoadRouter: () => x_, registerSaveRouter: () => v_, removeModel: () => O_, weightsLoaderFactory: () => Ik, withSaveHandler: () => aA }); +var H_ = "model"; +var q_ = ".json"; +var j_ = ".weights.bin"; +function cx(e) { return new Promise((t) => setTimeout(t)).then(e); } -var am = class { +var om = class { constructor(e) { if (!X().getBool("IS_BROWSER")) throw new Error("browserDownloads() cannot proceed because the current environment is not a browser."); - e.startsWith(am.URL_SCHEME) && (e = e.slice(am.URL_SCHEME.length)), (e == null || e.length === 0) && (e = P_), this.modelJsonFileName = e + z_, this.weightDataFileName = e + M_; + e.startsWith(om.URL_SCHEME) && (e = e.slice(om.URL_SCHEME.length)), (e == null || e.length === 0) && (e = H_), this.modelJsonFileName = e + q_, this.weightDataFileName = e + j_; } async save(e) { if (typeof document == "undefined") @@ -5706,18 +5714,18 @@ var am = class { if (e.modelTopology instanceof ArrayBuffer) throw new Error("BrowserDownloads.save() does not support saving model topology in binary formats yet."); { - let n = [{ paths: ["./" + this.weightDataFileName], weights: e.weightSpecs }], s = uk(e, n), r = window.URL.createObjectURL(new Blob([JSON.stringify(s)], { type: "application/json" })), a = this.modelJsonAnchor == null ? document.createElement("a") : this.modelJsonAnchor; - if (a.download = this.modelJsonFileName, a.href = r, await ox(() => a.dispatchEvent(new MouseEvent("click"))), e.weightData != null) { + let n = [{ paths: ["./" + this.weightDataFileName], weights: e.weightSpecs }], s = fk(e, n), r = window.URL.createObjectURL(new Blob([JSON.stringify(s)], { type: "application/json" })), a = this.modelJsonAnchor == null ? document.createElement("a") : this.modelJsonAnchor; + if (a.download = this.modelJsonFileName, a.href = r, await cx(() => a.dispatchEvent(new MouseEvent("click"))), e.weightData != null) { let i = this.weightDataAnchor == null ? document.createElement("a") : this.weightDataAnchor; - i.download = this.weightDataFileName, i.href = t, await ox(() => i.dispatchEvent(new MouseEvent("click"))); + i.download = this.weightDataFileName, i.href = t, await cx(() => i.dispatchEvent(new MouseEvent("click"))); } - return { modelArtifactsInfo: Rl(e) }; + return { modelArtifactsInfo: Dl(e) }; } } }; -var bd = am; -bd.URL_SCHEME = "downloads://"; -var L_ = class { +var yd = om; +yd.URL_SCHEME = "downloads://"; +var K_ = class { constructor(e) { if (e == null || e.length < 1) throw new Error(`When calling browserFiles, at least 1 file is required, but received ${e}`); @@ -5740,7 +5748,7 @@ var L_ = class { e({ modelTopology: a }); return; } - let o = Fg(r, (u) => this.loadWeights(u)); + let o = Pg(r, (u) => this.loadWeights(u)); e(o); }, n.onerror = (s) => t(`Failed to read model topology and weights manifest JSON from file '${this.jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`), n.readAsText(this.jsonFile); }); @@ -5750,7 +5758,7 @@ var L_ = class { for (let a of e) t.push(...a.weights), n.push(...a.paths); let s = this.checkManifestAndWeightFiles(e), r = n.map((a) => this.loadWeightsFile(a, s[a])); - return Promise.all(r).then((a) => [t, Dg(a)]); + return Promise.all(r).then((a) => [t, Og(a)]); } loadWeightsFile(e, t) { return new Promise((n, s) => { @@ -5762,10 +5770,10 @@ var L_ = class { }); } checkManifestAndWeightFiles(e) { - let t = [], n = this.weightsFiles.map((r) => ix(r.name)), s = {}; + let t = [], n = this.weightsFiles.map((r) => lx(r.name)), s = {}; for (let r of e) r.paths.forEach((a) => { - let i = ix(a); + let i = lx(a); if (t.indexOf(i) !== -1) throw new Error(`Duplicate file basename found in weights manifest: '${i}'`); if (t.push(i), n.indexOf(i) === -1) @@ -5777,15 +5785,15 @@ var L_ = class { return s; } }; -var B_ = (e) => X().getBool("IS_BROWSER") && !Array.isArray(e) && e.startsWith(bd.URL_SCHEME) ? V_(e.slice(bd.URL_SCHEME.length)) : null; -xt.registerSaveRouter(B_); -function V_(e = "model") { - return new bd(e); +var X_ = (e) => X().getBool("IS_BROWSER") && !Array.isArray(e) && e.startsWith(yd.URL_SCHEME) ? Y_(e.slice(yd.URL_SCHEME.length)) : null; +xt.registerSaveRouter(X_); +function Y_(e = "model") { + return new yd(e); } -function W_(e) { - return new L_(e); +function Q_(e) { + return new K_(e); } -function ux(e, t, n, s) { +function dx(e, t, n, s) { i(e), n = n == null ? 0 : n, s = s == null ? 1 : s, o(n, s); let r = 0, a = (u) => (u.then((l) => { let c = n + ++r / e.length * (s - n); @@ -5799,25 +5807,25 @@ function ux(e, t, n, s) { } return Promise.all(e.map(a)); } -async function gk(e, t) { +async function kk(e, t) { t == null && (t = {}); - let n = t.fetchFunc == null ? X().platform.fetch : t.fetchFunc, s = e.map((p) => n(p, t.requestInit, { isBinary: true })), r = 0, a = 0.5, o = (t.onProgress == null ? await Promise.all(s) : await ux(s, t.onProgress, r, a)).map((p) => p.arrayBuffer()), u = 0.5, l = 1; - return t.onProgress == null ? await Promise.all(o) : await ux(o, t.onProgress, u, l); + let n = t.fetchFunc == null ? X().platform.fetch : t.fetchFunc, s = e.map((p) => n(p, t.requestInit, { isBinary: true })), r = 0, a = 0.5, o = (t.onProgress == null ? await Promise.all(s) : await dx(s, t.onProgress, r, a)).map((p) => p.arrayBuffer()), u = 0.5, l = 1; + return t.onProgress == null ? await Promise.all(o) : await dx(o, t.onProgress, u, l); } -async function U_(e, t = "", n, s) { - return bk((i) => gk(i, { requestInit: s }))(e, t, n); +async function Z_(e, t = "", n, s) { + return Ik((i) => kk(i, { requestInit: s }))(e, t, n); } -function bk(e) { +function Ik(e) { return async (t, n = "", s) => { let r = t.map(() => false), a = {}, i = s != null ? s.map(() => false) : [], o = []; if (t.forEach((h, f) => { let m = 0; h.weights.forEach((g) => { - let b = "quantization" in g ? g.quantization.dtype : g.dtype, y = tm[b] * pt(g.shape), v = () => { + let b = "quantization" in g ? g.quantization.dtype : g.dtype, y = sm[b] * pt(g.shape), v = () => { r[f] = true, a[f] == null && (a[f] = []), a[f].push({ manifestEntry: g, groupOffset: m, sizeBytes: y }); }; - s != null ? s.forEach((x, k) => { - x === g.name && (v(), i[k] = true); + s != null ? s.forEach((w, k) => { + w === g.name && (v(), i[k] = true); }) : v(), o.push(g.name), m += y; }); }), !i.every((h) => h)) { @@ -5835,24 +5843,24 @@ Manifest JSON has weights with names: ${o.join(", ")}.`); let c = await e(l), p = {}, d = 0; return u.forEach((h) => { let f = t[h].paths.length, m = 0; - for (let x = 0; x < f; x++) - m += c[d + x].byteLength; + for (let w = 0; w < f; w++) + m += c[d + w].byteLength; let g = new ArrayBuffer(m), b = new Uint8Array(g), y = 0; - for (let x = 0; x < f; x++) { - let k = new Uint8Array(c[d + x]); + for (let w = 0; w < f; w++) { + let k = new Uint8Array(c[d + w]); b.set(k, y), y += k.byteLength; } - a[h].forEach((x) => { - let k = g.slice(x.groupOffset, x.groupOffset + x.sizeBytes), C = ok(k, [x.manifestEntry]); - for (let T in C) - p[T] = C[T]; + a[h].forEach((w) => { + let k = g.slice(w.groupOffset, w.groupOffset + w.sizeBytes), T = hk(k, [w.manifestEntry]); + for (let N in T) + p[N] = T[N]; }), d += f; }), p; }; } -var G_ = "application/octet-stream"; -var H_ = "application/json"; -var Og = class { +var J_ = "application/octet-stream"; +var eA = "application/json"; +var zg = class { constructor(e, t) { if (this.DEFAULT_METHOD = "POST", t == null && (t = {}), this.weightPathPrefix = t.weightPathPrefix, this.onProgress = t.onProgress, this.weightUrlConverter = t.weightUrlConverter, t.fetchFunc != null ? (O(typeof t.fetchFunc == "function", () => "Must pass a function that matches the signature of `fetch` (see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)"), this.fetch = t.fetchFunc) : this.fetch = X().platform.fetch, O(e != null && e.length > 0, () => "URL path for http must not be null, undefined or empty."), Array.isArray(e) && O(e.length === 2, () => `URL paths for http must have a length of 2, (actual length is ${e.length}).`), this.path = e, t.requestInit != null && t.requestInit.body != null) throw new Error("requestInit is expected to have no pre-existing body, but has one."); @@ -5863,11 +5871,11 @@ var Og = class { throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet."); let t = Object.assign({ method: this.DEFAULT_METHOD }, this.requestInit); t.body = new FormData(); - let n = [{ paths: ["./model.weights.bin"], weights: e.weightSpecs }], s = uk(e, n); - t.body.append("model.json", new Blob([JSON.stringify(s)], { type: H_ }), "model.json"), e.weightData != null && t.body.append("model.weights.bin", new Blob([e.weightData], { type: G_ }), "model.weights.bin"); + let n = [{ paths: ["./model.weights.bin"], weights: e.weightSpecs }], s = fk(e, n); + t.body.append("model.json", new Blob([JSON.stringify(s)], { type: eA }), "model.json"), e.weightData != null && t.body.append("model.weights.bin", new Blob([e.weightData], { type: J_ }), "model.weights.bin"); let r = await this.fetch(this.path, t); if (r.ok) - return { modelArtifactsInfo: Rl(e), responses: [r] }; + return { modelArtifactsInfo: Dl(e), responses: [r] }; throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${r.status}.`); } async load() { @@ -5884,10 +5892,10 @@ var Og = class { let n = t.modelTopology, s = t.weightsManifest; if (n == null && s == null) throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`); - return Fg(t, (r) => this.loadWeights(r)); + return Pg(t, (r) => this.loadWeights(r)); } async loadWeights(e) { - let t = Array.isArray(this.path) ? this.path[1] : this.path, [n, s] = q_(t), r = this.weightPathPrefix || n, a = []; + let t = Array.isArray(this.path) ? this.path[1] : this.path, [n, s] = tA(t), r = this.weightPathPrefix || n, a = []; for (let l of e) a.push(...l.weights); let i = [], o = []; @@ -5895,37 +5903,37 @@ var Og = class { for (let c of l.paths) this.weightUrlConverter != null ? o.push(this.weightUrlConverter(c)) : i.push(r + c + s); this.weightUrlConverter && i.push(...await Promise.all(o)); - let u = await gk(i, { requestInit: this.requestInit, fetchFunc: this.fetch, onProgress: this.onProgress }); - return [a, Dg(u)]; + let u = await kk(i, { requestInit: this.requestInit, fetchFunc: this.fetch, onProgress: this.onProgress }); + return [a, Og(u)]; } }; -Og.URL_SCHEME_REGEX = /^https?:\/\//; -function q_(e) { +zg.URL_SCHEME_REGEX = /^https?:\/\//; +function tA(e) { let t = e.lastIndexOf("/"), n = e.lastIndexOf("?"), s = e.substring(0, t), r = n > t ? e.substring(n) : ""; return [s + "/", r]; } -function im(e) { - return e.match(Og.URL_SCHEME_REGEX) != null; +function um(e) { + return e.match(zg.URL_SCHEME_REGEX) != null; } -var yk = (e, t) => { +var Sk = (e, t) => { if (typeof fetch == "undefined" && (t == null || t.fetchFunc == null)) return null; { let n = true; - if (Array.isArray(e) ? n = e.every((s) => im(s)) : n = im(e), n) - return Pg(e, t); + if (Array.isArray(e) ? n = e.every((s) => um(s)) : n = um(e), n) + return Mg(e, t); } return null; }; -xt.registerSaveRouter(yk); -xt.registerLoadRouter(yk); -function Pg(e, t) { - return new Og(e, t); +xt.registerSaveRouter(Sk); +xt.registerLoadRouter(Sk); +function Mg(e, t) { + return new zg(e, t); } -function j_(e, t) { - return Pg(e, t); +function nA(e, t) { + return Mg(e, t); } -var Of = class { +var zf = class { constructor(e) { this.modelArtifacts = e; } @@ -5933,7 +5941,7 @@ var Of = class { return this.modelArtifacts; } }; -var K_ = class { +var sA = class { constructor(e) { this.saveHandler = e; } @@ -5941,48 +5949,48 @@ var K_ = class { return this.saveHandler(e); } }; -function X_(e, t, n, s) { - return arguments.length === 1 ? e.modelTopology != null || e.weightSpecs != null ? new Of(e) : (console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."), new Of({ modelTopology: e })) : (console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."), new Of({ modelTopology: e, weightSpecs: t, weightData: n, trainingConfig: s })); +function rA(e, t, n, s) { + return arguments.length === 1 ? e.modelTopology != null || e.weightSpecs != null ? new zf(e) : (console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."), new zf({ modelTopology: e })) : (console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."), new zf({ modelTopology: e, weightSpecs: t, weightData: n, trainingConfig: s })); } -function Y_(e) { - return new K_(e); +function aA(e) { + return new sA(e); } -var Q_ = {}; -Ae(Q_, { confusionMatrix: () => nA }); -function Z_(e, t, n = false, s = false) { +var iA = {}; +Ae(iA, { confusionMatrix: () => dA }); +function oA(e, t, n = false, s = false) { let r = _(e, "a", "matMul"), a = _(t, "b", "matMul"); [r, a] = vt(r, a); let i = { a: r, b: a }, o = { transposeA: n, transposeB: s }; - return M.runKernel(Ia, i, o); + return M.runKernel(Sa, i, o); } -var We = L({ matMul_: Z_ }); -function J_(e, t, n = 1, s = 0) { +var We = L({ matMul_: oA }); +function uA(e, t, n = 1, s = 0) { if (t < 2) throw new Error(`Error in oneHot: depth must be >=2, but it is ${t}`); let a = { indices: _(e, "indices", "oneHot", "int32") }, i = { depth: t, onValue: n, offValue: s }; return M.runKernel(To, a, i); } -var yd = L({ oneHot_: J_ }); -function eA(e, t) { +var vd = L({ oneHot_: uA }); +function lA(e, t) { let n = _(e, "x", "transpose"); if (t == null && (t = n.shape.map((a, i) => i).reverse()), O(n.rank === t.length, () => `Error in transpose: rank of input ${n.rank} must match length of perm ${t}.`), t.forEach((a) => { O(a >= 0 && a < n.rank, () => `All entries in 'perm' must be between 0 and ${n.rank - 1} but got ${t}`); }), n.rank <= 1) return n.clone(); let s = { x: n }, r = { perm: t }; - return M.runKernel(ci, s, r); + return M.runKernel(di, s, r); } -var qe = L({ transpose_: eA }); -function tA(e, t, n) { +var qe = L({ transpose_: lA }); +function cA(e, t, n) { let s = _(e, "labels", "confusionMatrix"), r = _(t, "predictions", "confusionMatrix"); O(n == null || n > 0 && Number.isInteger(n), () => `If provided, numClasses must be a positive integer, but got ${n}`), O(s.rank === 1, () => `Expected the rank of labels to be 1, but got ${s.rank}`), O(r.rank === 1, () => `Expected the rank of predictions to be 1, but got ${r.rank}`), O(s.shape[0] === r.shape[0], () => `Mismatch in the number of examples: ${s.shape[0]} vs. ${r.shape[0]}. Labels and predictions should have the same number of elements.`), O(n > 0 && Number.isInteger(n), () => `numClasses is required to be a positive integer, but got ${n}`); - let a = yd(ce(s, "int32"), n), i = yd(ce(r, "int32"), n), o = qe(a), u = We(o, i); + let a = vd(ce(s, "int32"), n), i = vd(ce(r, "int32"), n), o = qe(a), u = We(o, i); return ce(u, "int32"); } -var nA = L({ confusionMatrix_: tA }); +var dA = L({ confusionMatrix_: cA }); var qo = {}; -Ae(qo, { assertAndGetBroadcastShape: () => it, getBroadcastDims: () => vk, getReductionAxes: () => _t }); -function vk(e, t) { +Ae(qo, { assertAndGetBroadcastShape: () => ot, getBroadcastDims: () => Ck, getReductionAxes: () => _t }); +function Ck(e, t) { let n = e.length, s = []; for (let r = 0; r < n; r++) { let a = n - 1 - r, i = e[a] || 1; @@ -5998,7 +6006,7 @@ function _t(e, t) { } return n; } -function it(e, t) { +function ot(e, t) { let n = [], s = Math.max(e.length, t.length); for (let r = 0; r < s; r++) { let a = e[e.length - r - 1]; @@ -6016,20 +6024,20 @@ function it(e, t) { } return n; } -var xk = {}; -Ae(xk, { fromPixels: () => cA, fromPixelsAsync: () => uA, toPixels: () => lA }); -function sA(e, t, n) { - if (va(e), t != null && t.length !== 3) +var Nk = {}; +Ae(Nk, { fromPixels: () => vA, fromPixelsAsync: () => bA, toPixels: () => yA }); +function pA(e, t, n) { + if (xa(e), t != null && t.length !== 3) throw new Error("tensor3d() requires shape to have three numbers"); let s = Rs(e, n); if (s.length !== 3 && s.length !== 1) throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray"); if (s.length === 1 && t == null) throw new Error("tensor3d() requires shape to be provided when `values` are a flat array"); - return Cr(e, t, s, n); + return Nr(e, t, s, n); } -var Br; -function wk(e, t = 3) { +var Vr; +function Tk(e, t = 3) { if (t > 4) throw new Error("Cannot construct Tensor with more than 4 channels from pixels."); if (e == null) @@ -6051,9 +6059,9 @@ function wk(e, t = 3) { throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${e.constructor.name}`); if (r && r && e.readyState < 2) throw new Error("The video element has not loaded data yet. Please wait for `loadeddata` event on the