diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c2c52f9..0b52ac54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,10 +11,11 @@ ### **HEAD -> main** 2022/04/11 mandic00@live.com +- face attention model is available in human-models +- beta release 2.7 +- refactor draw methods - implement face attention model - -### **origin/main** 2022/04/10 mandic00@live.com - +- add electronjs demo - rebuild ### **2.6.5** 2022/04/01 mandic00@live.com diff --git a/dist/human.d.ts b/dist/human.d.ts index d965b941..d82c1c15 100644 --- a/dist/human.d.ts +++ b/dist/human.d.ts @@ -1,3 +1,5 @@ +/// + /** meta-function that performs draw for: canvas, face, body, hand */ declare function all(inCanvas: AnyCanvas, result: Result, drawOptions?: Partial): Promise<[void, void, void, void, void] | null>; diff --git a/dist/human.esm-nobundle.d.ts b/dist/human.esm-nobundle.d.ts index d965b941..d82c1c15 100644 --- a/dist/human.esm-nobundle.d.ts +++ b/dist/human.esm-nobundle.d.ts @@ -1,3 +1,5 @@ +/// + /** meta-function that performs draw for: canvas, face, body, hand */ declare function all(inCanvas: AnyCanvas, result: Result, drawOptions?: Partial): Promise<[void, void, void, void, void] | null>; diff --git a/dist/human.esm-nobundle.js b/dist/human.esm-nobundle.js index fba4d53d..c1935034 100644 --- a/dist/human.esm-nobundle.js +++ b/dist/human.esm-nobundle.js @@ -4,7 +4,7 @@ author: ' */ -var Ft=Object.defineProperty;var cr=Object.getOwnPropertyDescriptor;var dr=Object.getOwnPropertyNames;var fr=Object.prototype.hasOwnProperty;var mr=(e,t,o)=>t in e?Ft(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o;var $0=(e,t)=>{for(var o in t)Ft(e,o,{get:t[o],enumerable:!0})},To=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let A of dr(t))!fr.call(e,A)&&A!==o&&Ft(e,A,{get:()=>t[A],enumerable:!(n=cr(t,A))||n.enumerable});return e},Z=(e,t,o)=>(To(e,t,"default"),o&&To(o,t,"default"));var k=(e,t,o)=>(mr(e,typeof t!="symbol"?t+"":t,o),o),wo=(e,t,o)=>{if(!t.has(e))throw TypeError("Cannot "+o)};var Le=(e,t,o)=>(wo(e,t,"read from private field"),o?o.call(e):t.get(e)),Ne=(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)},Ge=(e,t,o,n)=>(wo(e,t,"write to private field"),n?n.call(e,o):t.set(e,o),o);function b(...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 Ro(e,t){let o=e.endsWith("/")?"":"/",A=t.startsWith(".")||t.startsWith("/")||t.startsWith("http:")||t.startsWith("https:")||t.startsWith("file:")?`${t}`:`${e}${o}${t}`;if(!A.toLocaleLowerCase().includes(".json"))throw new Error(`modelpath error: expecting json file: ${A}`);return A}var g=()=>typeof performance!="undefined"?performance.now():parseInt((Number(process.hrtime.bigint())/1e3/1e3).toString());function Ht(e,t,o="config",n=[]){for(let A of Object.keys(t))if(typeof t[A]=="object")Ht(e[A],t[A],A,n);else{let s=e&&typeof e[A]!="undefined";s||n.push({reason:"unknown property",where:`${o}.${A} = ${t[A]}`});let a=e&&typeof e[A]==typeof t[A];s&&!a&&n.push({reason:"property type mismatch",where:`${o}.${A} = ${t[A]}`,expected:typeof e[A]})}return t.debug&&o==="config"&&n.length>0&&b("invalid configuration",n),n}function Y(...e){let t=o=>o&&typeof o=="object";return e.reduce((o,n)=>(Object.keys(n||{}).forEach(A=>{let s=o[A],a=n[A];Array.isArray(s)&&Array.isArray(a)?o[A]=s.concat(...a):t(s)&&t(a)?o[A]=Y(s,a):o[A]=a}),o),{})}var ee={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"},attention:{enabled:!1,modelPath:"facemesh-attention.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={};$0(r,{GraphModel:()=>Vt,Tensor:()=>xe,version:()=>Be});Z(r,rs);Z(r,ss);import*as rs from"@tensorflow/tfjs/dist/index.js";import*as ss from"@tensorflow/tfjs-backend-webgl/dist/index.js";import{Tensor as xe}from"@tensorflow/tfjs/dist/index.js";import{GraphModel as Vt}from"@tensorflow/tfjs-converter/dist/index";var pr="3.15.0",ur="3.15.0",hr="3.15.0",br="3.15.0",gr="3.15.0",Mr="3.15.0",Pr="3.15.0",vr="3.15.0",Be={tfjs:pr,"tfjs-core":ur,"tfjs-data":hr,"tfjs-layers":br,"tfjs-converter":gr,"tfjs-backend-cpu":Mr,"tfjs-backend-webgl":Pr,"tfjs-backend-wasm":vr};var ko=` +var Ht=Object.defineProperty;var dr=Object.getOwnPropertyDescriptor;var fr=Object.getOwnPropertyNames;var mr=Object.prototype.hasOwnProperty;var pr=(e,t,o)=>t in e?Ht(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o;var ee=(e,t)=>{for(var o in t)Ht(e,o,{get:t[o],enumerable:!0})},Ro=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let A of fr(t))!mr.call(e,A)&&A!==o&&Ht(e,A,{get:()=>t[A],enumerable:!(n=dr(t,A))||n.enumerable});return e},Z=(e,t,o)=>(Ro(e,t,"default"),o&&Ro(o,t,"default"));var k=(e,t,o)=>(pr(e,typeof t!="symbol"?t+"":t,o),o),wo=(e,t,o)=>{if(!t.has(e))throw TypeError("Cannot "+o)};var Ne=(e,t,o)=>(wo(e,t,"read from private field"),o?o.call(e):t.get(e)),Ge=(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)},Be=(e,t,o,n)=>(wo(e,t,"write to private field"),n?n.call(e,o):t.set(e,o),o);function b(...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 ko(e,t){let o=e.endsWith("/")?"":"/",A=t.startsWith(".")||t.startsWith("/")||t.startsWith("http:")||t.startsWith("https:")||t.startsWith("file:")?`${t}`:`${e}${o}${t}`;if(!A.toLocaleLowerCase().includes(".json"))throw new Error(`modelpath error: expecting json file: ${A}`);return A}var g=()=>typeof performance!="undefined"?performance.now():parseInt((Number(process.hrtime.bigint())/1e3/1e3).toString());function Vt(e,t,o="config",n=[]){for(let A of Object.keys(t))if(typeof t[A]=="object")Vt(e[A],t[A],A,n);else{let s=e&&typeof e[A]!="undefined";s||n.push({reason:"unknown property",where:`${o}.${A} = ${t[A]}`});let a=e&&typeof e[A]==typeof t[A];s&&!a&&n.push({reason:"property type mismatch",where:`${o}.${A} = ${t[A]}`,expected:typeof e[A]})}return t.debug&&o==="config"&&n.length>0&&b("invalid configuration",n),n}function Y(...e){let t=o=>o&&typeof o=="object";return e.reduce((o,n)=>(Object.keys(n||{}).forEach(A=>{let s=o[A],a=n[A];Array.isArray(s)&&Array.isArray(a)?o[A]=s.concat(...a):t(s)&&t(a)?o[A]=Y(s,a):o[A]=a}),o),{})}var te={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"},attention:{enabled:!1,modelPath:"facemesh-attention.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={};ee(r,{GraphModel:()=>Zt,Tensor:()=>ce,version:()=>Fe});Z(r,ss);Z(r,as);import*as ss from"@tensorflow/tfjs/dist/index.js";import*as as from"@tensorflow/tfjs-backend-webgl/dist/index.js";import{Tensor as ce}from"@tensorflow/tfjs/dist/index.js";import{GraphModel as Zt}from"@tensorflow/tfjs-converter/dist/index";var ur="3.15.0",hr="3.15.0",br="3.15.0",gr="3.15.0",Mr="3.15.0",Pr="3.15.0",vr="3.15.0",Tr="3.15.0",Fe={tfjs:ur,"tfjs-core":hr,"tfjs-data":br,"tfjs-layers":gr,"tfjs-converter":Mr,"tfjs-backend-cpu":Pr,"tfjs-backend-webgl":vr,"tfjs-backend-wasm":Tr};var Eo=` precision highp float; attribute vec2 pos; attribute vec2 uv; @@ -14,7 +14,7 @@ var Ft=Object.defineProperty;var cr=Object.getOwnPropertyDescriptor;var dr=Objec vUv = uv; gl_Position = vec4(pos.x, pos.y*flipY, 0.0, 1.); } -`;var Eo=` +`;var zo=` precision highp float; varying vec2 vUv; uniform sampler2D texture; @@ -26,7 +26,7 @@ var Ft=Object.defineProperty;var cr=Object.getOwnPropertyDescriptor;var dr=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]; } -`,zo=` +`,jo=` precision highp float; varying vec2 vUv; uniform sampler2D texture; @@ -38,7 +38,7 @@ var Ft=Object.defineProperty;var cr=Object.getOwnPropertyDescriptor;var dr=Objec gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[14]; gl_FragColor.a = c.a; } -`,jo=` +`,So=` precision highp float; varying vec2 vUv; uniform vec2 size; @@ -51,7 +51,7 @@ var Ft=Object.defineProperty;var cr=Object.getOwnPropertyDescriptor;var dr=Objec vec2 coord = pixelate(vUv, size); gl_FragColor += texture2D(texture, coord); } -`,So=` +`,Wo=` precision highp float; varying vec2 vUv; uniform sampler2D texture; @@ -96,7 +96,7 @@ var Ft=Object.defineProperty;var cr=Object.getOwnPropertyDescriptor;var dr=Objec c31 * m[6] + c32 * m[7] + c33 * m[8]; gl_FragColor.a = c22.a; } -`;var Zt=(e,t,o)=>{let n=new RegExp("\\b"+t+" \\w+ (\\w+)","ig");e.replace(n,(A,s)=>(o[s]=0,A))},Xt=class{constructor(t,o,n){k(this,"uniform",{});k(this,"attribute",{});k(this,"gl");k(this,"id");k(this,"compile",(t,o)=>{let n=this.gl.createShader(o);return n?(this.gl.shaderSource(n,t),this.gl.compileShader(n),this.gl.getShaderParameter(n,this.gl.COMPILE_STATUS)?n:(b(`filter: gl compile failed: ${this.gl.getShaderInfoLog(n)}`),null)):(b("filter: could not create shader"),null)});this.gl=t;let A=this.compile(o,this.gl.VERTEX_SHADER),s=this.compile(n,this.gl.FRAGMENT_SHADER);if(this.id=this.gl.createProgram(),!(!A||!s)){if(!this.id){b("filter: could not create webgl program");return}if(this.gl.attachShader(this.id,A),this.gl.attachShader(this.id,s),this.gl.linkProgram(this.id),!this.gl.getProgramParameter(this.id,this.gl.LINK_STATUS)){b(`filter: gl link failed: ${this.gl.getProgramInfoLog(this.id)}`);return}this.gl.useProgram(this.id),Zt(o,"attribute",this.attribute);for(let a in this.attribute)this.attribute[a]=this.gl.getAttribLocation(this.id,a);Zt(o,"uniform",this.uniform),Zt(n,"uniform",this.uniform);for(let a in this.uniform)this.uniform[a]=this.gl.getUniformLocation(this.id,a)}}};function Wo(){let e=0,t=null,o=!1,n=-1,A=[null,null],s=[],a=null,i=null,x=a0(100,100),d={},l={INTERMEDIATE:1},y=x.getContext("webgl");if(!y){b("filter: cannot get webgl context");return}this.gl=y;function c(u,p){if(!(u===x.width&&p===x.height)){if(x.width=u,x.height=p,!a){let P=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,P,y.STATIC_DRAW),y.pixelStorei(y.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0)}y.viewport(0,0,x.width,x.height),A=[null,null]}}function f(u,p){let P=y.createFramebuffer();y.bindFramebuffer(y.FRAMEBUFFER,P);let R=y.createRenderbuffer();y.bindRenderbuffer(y.RENDERBUFFER,R);let S=y.createTexture();return y.bindTexture(y.TEXTURE_2D,S),y.texImage2D(y.TEXTURE_2D,0,y.RGBA,u,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,S,0),y.bindTexture(y.TEXTURE_2D,null),y.bindFramebuffer(y.FRAMEBUFFER,null),{fbo:P,texture:S}}function h(u){return A[u]=A[u]||f(x.width,x.height),A[u]}function m(u=0){if(!i)return;let p=null,P=null,R=!1;e===0?p=t:p=h(n).texture||null,e++,o&&!(u&l.INTERMEDIATE)?(P=null,R=e%2===0):(n=(n+1)%2,P=h(n).fbo||null),y.bindTexture(y.TEXTURE_2D,p),y.bindFramebuffer(y.FRAMEBUFFER,P),y.uniform1f(i.uniform.flipY,R?-1:1),y.drawArrays(y.TRIANGLES,0,6)}function v(u){if(d[u])return i=d[u],y.useProgram((i?i.id:null)||null),i;if(i=new Xt(y,ko,u),!i)return b("filter: could not get webgl program"),null;let p=Float32Array.BYTES_PER_ELEMENT,P=4*p;return y.enableVertexAttribArray(i.attribute.pos),y.vertexAttribPointer(i.attribute.pos,2,y.FLOAT,!1,P,0*p),y.enableVertexAttribArray(i.attribute.uv),y.vertexAttribPointer(i.attribute.uv,2,y.FLOAT,!1,P,2*p),d[u]=i,i}let M={colorMatrix:u=>{let p=new Float32Array(u);p[4]/=255,p[9]/=255,p[14]/=255,p[19]/=255;let P=p[18]===1&&p[3]===0&&p[8]===0&&p[13]===0&&p[15]===0&&p[16]===0&&p[17]===0&&p[19]===0?zo:Eo,R=v(P);!R||(y.uniform1fv(R.uniform.m,p),m())},brightness:u=>{let p=(u||0)+1;M.colorMatrix([p,0,0,0,0,0,p,0,0,0,0,0,p,0,0,0,0,0,1,0])},saturation:u=>{let p=(u||0)*2/3+1,P=(p-1)*-.5;M.colorMatrix([p,P,P,0,0,P,p,P,0,0,P,P,p,0,0,0,0,0,1,0])},desaturate:()=>{M.saturation(-1)},contrast:u=>{let p=(u||0)+1,P=-128*(p-1);M.colorMatrix([p,0,0,0,P,0,p,0,0,P,0,0,p,0,P,0,0,0,1,0])},negative:()=>{M.contrast(-2)},hue:u=>{u=(u||0)/180*Math.PI;let p=Math.cos(u),P=Math.sin(u),R=.213,S=.715,O=.072;M.colorMatrix([R+p*(1-R)+P*-R,S+p*-S+P*-S,O+p*-O+P*(1-O),0,0,R+p*-R+P*.143,S+p*(1-S)+P*.14,O+p*-O+P*-.283,0,0,R+p*-R+P*-(1-R),S+p*-S+P*S,O+p*(1-O)+P*O,0,0,0,0,0,1,0])},desaturateLuminance:()=>{M.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:()=>{M.colorMatrix([.393,.7689999,.18899999,0,0,.349,.6859999,.16799999,0,0,.272,.5339999,.13099999,0,0,0,0,0,1,0])},brownie:()=>{M.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:()=>{M.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:()=>{M.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:()=>{M.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:()=>{M.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:()=>{M.colorMatrix([0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0])},convolution:u=>{let p=new Float32Array(u),P=1/x.width,R=1/x.height,S=v(Co);!S||(y.uniform1fv(S.uniform.m,p),y.uniform2f(S.uniform.px,P,R),m())},detectEdges:()=>{M.convolution.call(this,[0,1,0,1,-4,1,0,1,0])},sobelX:()=>{M.convolution.call(this,[-1,0,1,-2,0,2,-1,0,1])},sobelY:()=>{M.convolution.call(this,[-1,-2,-1,0,0,0,1,2,1])},sharpen:u=>{let p=u||1;M.convolution.call(this,[0,-1*p,0,-1*p,1+4*p,-1*p,0,-1*p,0])},emboss:u=>{let p=u||1;M.convolution.call(this,[-2*p,-1*p,0,-1*p,1,1*p,0,1*p,2*p])},blur:u=>{let p=u/7/x.width,P=u/7/x.height,R=v(So);!R||(y.uniform2f(R.uniform.px,0,P),m(l.INTERMEDIATE),y.uniform2f(R.uniform.px,p,0),m())},pixelate:u=>{let p=u/x.width,P=u/x.height,R=v(jo);!R||(y.uniform2f(R.uniform.size,p,P),m())}};this.add=function(u){let p=Array.prototype.slice.call(arguments,1),P=M[u];s.push({func:P,args:p})},this.reset=function(){s=[]},this.get=function(){return s},this.apply=function(u){c(u.width,u.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,u);for(let p=0;pf.data())),a=.99*Math.max(s[0][0],s[1][0],s[2][0]),i=[r.sub(o[0],n[0]),r.sub(o[1],n[1]),r.sub(o[2],n[2])],x=[r.sub(A[0],n[0]),r.sub(A[1],n[1]),r.sub(A[2],n[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,...n,...A,...i,...x,...d,...l,y,t]),c}var et=2048,F=null,_=null,ce=null,D,O0={inputSum:0,cacheDiff:1,sumMethod:0,inputTensor:void 0};function a0(e,t){let o;if(w.browser)if(w.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 w.Canvas!="undefined"?o=new w.Canvas(e,t):typeof globalThis.Canvas!="undefined"&&(o=new globalThis.Canvas(e,t));return o}function tt(e,t){let o=t||a0(e.width,e.height);return o.getContext("2d").drawImage(e,0,0),o}async function de(e,t,o=!0){if(!e)return t.debug&&b("input error: input is missing"),{tensor:null,canvas:null};if(!(e instanceof xe)&&!(typeof Image!="undefined"&&e instanceof Image)&&!(typeof w.Canvas!="undefined"&&e instanceof w.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 xe){let n=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)n=r.expandDims(e,0);else if(e.shape[2]===4){let A=r.slice3d(e,[0,0,0],[-1,-1,3]);n=r.expandDims(A,0),r.dispose(A)}}else e.shape.length===4&&(e.shape[3]===3?n=r.clone(e):e.shape[3]===4&&(n=r.slice4d(e,[0,0,0,0],[-1,-1,-1,3])));if(n==null||n.shape.length!==4||n.shape[0]!==1||n.shape[3]!==3)throw new Error(`input error: attempted to use tensor with unrecognized shape: ${e.shape}`);if(n.dtype==="int32"){let A=r.cast(n,"float32");r.dispose(n),n=A}return{tensor:n,canvas:t.filter.return?_:null}}else{if(typeof e.readyState!="undefined"&&e.readyState<=2)return t.debug&&b("input stream is not ready"),{tensor:null,canvas:F};let n=e.naturalWidth||e.videoWidth||e.width||e.shape&&e.shape[1]>0,A=e.naturalHeight||e.videoHeight||e.height||e.shape&&e.shape[2]>0;if(!n||!A)return t.debug&&b("cannot determine input dimensions"),{tensor:null,canvas:F};let s=n,a=A;if(s>et&&(s=et,a=Math.trunc(s*A/n)),a>et&&(a=et,s=Math.trunc(a*n/A)),(t.filter.width||0)>0?s=t.filter.width:(t.filter.height||0)>0&&(s=n*((t.filter.height||0)/A)),(t.filter.height||0)>0?a=t.filter.height:(t.filter.width||0)>0&&(a=A*((t.filter.width||0)/n)),!s||!a)throw new Error("input error: cannot determine dimension");(!F||(F==null?void 0:F.width)!==s||(F==null?void 0:F.height)!==a)&&(F=a0(s,a));let i=F.getContext("2d");if(typeof ImageData!="undefined"&&e instanceof ImageData?i.putImageData(e,0,0):t.filter.flip&&typeof i.translate!="undefined"?(i.translate(n,0),i.scale(-1,1),i.drawImage(e,0,0,n,A,0,0,F==null?void 0:F.width,F==null?void 0:F.height),i.setTransform(1,0,0,1,0,0)):i.drawImage(e,0,0,n,A,0,0,F==null?void 0:F.width,F==null?void 0:F.height),(!_||F.width!==_.width||(F==null?void 0:F.height)!==(_==null?void 0:_.height))&&(_=a0(F.width,F.height)),t.filter.enabled&&w.webgl.supported?(D||(D=w.browser?new Wo:null),w.filter=!!D,!D||!D.add?(t.debug&&b("input process error: cannot initialize filters"),w.webgl.supported=!1,t.filter.enabled=!1,tt(F,_)):(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(F):_=D.draw(F))):(tt(F,_),D&&(D=null),w.filter=!!D),!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(w.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((!ce||_.width!==ce.width||_.height!==ce.height)&&(ce=a0(_.width,_.height)),r.browser&&w.browser)t.backend==="webgl"||t.backend==="humangl"||t.backend==="webgpu"?x=r.browser.fromPixels(_):(ce=tt(_),x=r.browser.fromPixels(ce));else{let h=tt(_).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 $e(l):r.expandDims(l,0);return r.dispose([x,l]),{tensor:y,canvas:t.filter.return?_:null}}}async function Oo(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(!O0.inputTensor)O0.inputTensor=r.clone(t);else if(O0.inputTensor.shape[1]!==t.shape[1]||O0.inputTensor.shape[2]!==t.shape[2])r.dispose(O0.inputTensor),O0.inputTensor=r.clone(t);else{let n={};n.diff=r.sub(t,O0.inputTensor),n.squared=r.mul(n.diff,n.diff),n.sum=r.sum(n.squared);let s=(await n.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;r.dispose([O0.inputTensor,n.diff,n.squared,n.sum]),O0.inputTensor=r.clone(t),o=s<=(e.cacheSensitivity||0)}return o}async function Io(e,t,o){let n={};if(!t||!o||t.shape.length!==4||t.shape.length!==o.shape.length)return e.debug||b("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||b("input tensors must be of shape [1, height, width, 3]:",t.shape,o.shape),0;n.input1=r.clone(t),n.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),n.diff=r.sub(n.input1,n.input2),n.squared=r.mul(n.diff,n.diff),n.sum=r.sum(n.squared);let s=(await n.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;return r.dispose([n.input1,n.input2,n.diff,n.squared,n.sum]),s}var Dt=class{constructor(){k(this,"browser");k(this,"node");k(this,"worker");k(this,"platform","");k(this,"agent","");k(this,"backends",[]);k(this,"initial");k(this,"filter");k(this,"tfjs");k(this,"offscreen");k(this,"perfadd",!1);k(this,"wasm",{supported:void 0,backend:void 0,simd:void 0,multithread:void 0});k(this,"webgl",{supported:void 0,backend:void 0,version:void 0,renderer:void 0});k(this,"webgpu",{supported:void 0,backend:void 0,adapter:void 0});k(this,"cpu",{model:void 0,flags:[]});k(this,"kernels",[]);k(this,"Canvas");k(this,"Image");k(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:Be["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=a0(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 n=r.backend().gpgpu!=="undefined"?await r.backend().getGPGPUContext().gl:null;n&&(this.webgl.version=n.getParameter(n.VERSION),this.webgl.renderer=n.getParameter(n.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(n){this.webgpu.supported=!1}try{this.kernels=r.getKernelsForBackend(r.getBackend()).map(n=>n.kernelName.toLowerCase())}catch(n){}}async updateCPU(){let t={model:"",flags:[]};this.node&&this.platform.startsWith("linux"),this.cpu?this.cpu=t:Object.defineProperty(this,"cpu",{value:t})}},w=new Dt;var I0={cacheModels:!1,verbose:!0,debug:!1,modelBasePath:""};async function kr(e,t){return I0.debug&&b("load model fetch:",e,t),fetch(e,t)}function Lo(e){I0.cacheModels=e.cacheModels,I0.verbose=e.debug,I0.modelBasePath=e.modelBasePath}async function L(e){let t=Ro(I0.modelBasePath,e||""),o=t.split("/"),n="indexeddb://"+o[o.length-1].replace(".json",""),A=await r.io.listModels(),s=I0.cacheModels&&Object.keys(A).includes(n),a=typeof fetch=="undefined"?{}:{fetchFunc:(d,l)=>kr(d,l)},i=new Vt(s?n:t,a),x=!1;try{i.findIOHandler(),I0.debug&&b("model load handler:",i.handler);let d=await i.handler.load();i.loadSync(d),I0.verbose&&b("load model:",i.modelUrl),x=!0}catch(d){b("error loading model:",t,d)}if(x&&I0.cacheModels&&!s)try{let d=await i.save(n);b("model saved:",n,d)}catch(d){b("error saving model:",t,d)}return i}var qt="2.7.0";var ao={};$0(ao,{Models:()=>Ye,load:()=>ro,reset:()=>It,validate:()=>so});var b0,Ut=[],jr=["white","black","asian","indian","other"],Sr=[15,23,28,35.5,45.5,55.5,65],No=0,Go=0,Jt=Number.MAX_SAFE_INTEGER;async function Bo(e){return w.initial&&(b0=null),b0?e.debug&&b("cached model:",b0.modelUrl):b0=await L(e.face.gear),b0}async function Yt(e,t,o,n){var a,i;if(!b0)return{age:0,gender:"unknown",genderScore:0,race:[]};let A=Jt<(((a=t.face.gear)==null?void 0:a.skipFrames)||0),s=(((i=t.face.gear)==null?void 0:i.skipTime)||0)>g()-Go;return t.skipAllowed&&s&&A&&No===n&&Ut[o]?(Jt++,Ut[o]):(Jt=0,new Promise(async x=>{var M,u;if(!(b0!=null&&b0.inputs[0].shape))return;let d={},l=[[0,.1,.9,.9]];d.resize=r.image.cropAndResize(e,l,[0],[b0.inputs[0].shape[2],b0.inputs[0].shape[1]]);let y={age:0,gender:"unknown",genderScore:0,race:[]};(M=t.face.gear)!=null&&M.enabled&&([d.age,d.gender,d.race]=b0.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(((u=t.face.gear)==null?void 0:u.minConfidence)||.2)&&y.race.push({score:Math.round(100*f[p])/100,race:jr[p]});y.race.sort((p,P)=>P.score-p.score);let m=Array.from(await d.age.data()).map((p,P)=>[Sr[P],p]).sort((p,P)=>P[1]-p[1]),v=m[0][0];for(let p=1;pr.dispose(d[p])),Ut[o]=y,No=n,Go=g(),x(y)}))}var N={tf255:255,tf1:1,tf2:2,tf05:.5,tf127:127.5,rgb:[.2989,.587,.114]};function Ho(){N.tf255=r.scalar(255,"float32"),N.tf1=r.scalar(1,"float32"),N.tf2=r.scalar(2,"float32"),N.tf05=r.scalar(.5,"float32"),N.tf127=r.scalar(127.5,"float32"),N.rgb=r.tensor1d([.2989,.587,.114],"float32")}var y0,ot=[],Vo=0,Zo=0,Kt=Number.MAX_SAFE_INTEGER;async function Xo(e){return w.initial&&(y0=null),y0?e.debug&&b("cached model:",y0.modelUrl):y0=await L(e.face.ssrnet.modelPathAge),y0}async function Qt(e,t,o,n){var a,i,x,d;if(!y0)return{age:0};let A=Kt<(((a=t.face.ssrnet)==null?void 0:a.skipFrames)||0),s=(((i=t.face.ssrnet)==null?void 0:i.skipTime)||0)>g()-Zo;return t.skipAllowed&&A&&s&&Vo===n&&((x=ot[o])==null?void 0:x.age)&&((d=ot[o])==null?void 0:d.age)>0?(Kt++,ot[o]):(Kt=0,new Promise(async l=>{if(!(y0!=null&&y0.inputs)||!y0.inputs[0]||!y0.inputs[0].shape)return;let y={};y.resize=r.image.resizeBilinear(e,[y0.inputs[0].shape[2],y0.inputs[0].shape[1]],!1),y.enhance=r.mul(y.resize,N.tf255);let c={age:0};if(t.face.ssrnet.enabled&&(y.age=y0.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])),ot[o]=c,Vo=n,Zo=g(),l(c)}))}var g0,nt=[],qo=0,Uo=0,_t=Number.MAX_SAFE_INTEGER,$t=[.2989,.587,.114];async function Jo(e){return w.initial&&(g0=null),g0?e.debug&&b("cached model:",g0.modelUrl):g0=await L(e.face.ssrnet.modelPathGender),g0}async function e5(e,t,o,n){var a,i,x,d;if(!g0)return{gender:"unknown",genderScore:0};let A=_t<(((a=t.face.ssrnet)==null?void 0:a.skipFrames)||0),s=(((i=t.face.ssrnet)==null?void 0:i.skipTime)||0)>g()-Uo;return t.skipAllowed&&A&&s&&qo===n&&((x=nt[o])==null?void 0:x.gender)&&((d=nt[o])==null?void 0:d.genderScore)>0?(_t++,nt[o]):(_t=0,new Promise(async l=>{if(!(g0!=null&&g0.inputs[0].shape))return;let y={};y.resize=r.image.resizeBilinear(e,[g0.inputs[0].shape[2],g0.inputs[0].shape[1]],!1),y.enhance=r.tidy(()=>{let[h,m,v]=r.split(y.resize,3,3),M=r.mul(h,$t[0]),u=r.mul(m,$t[1]),p=r.mul(v,$t[2]),P=r.addN([M,u,p]);return r.mul(r.sub(P,N.tf05),2)});let c={gender:"unknown",genderScore:0};t.face.ssrnet.enabled&&(y.gender=g0.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])),nt[o]=c,qo=n,Uo=g(),l(c)}))}var A0,At=[],t5=Number.MAX_SAFE_INTEGER,Ko=0,Qo=0;async function _o(e){var t;return w.initial&&(A0=null),A0?e.debug&&b("cached model:",A0.modelUrl):A0=await L((t=e.face.antispoof)==null?void 0:t.modelPath),A0}async function o5(e,t,o,n){var a,i;if(!A0)return 0;let A=(((a=t.face.antispoof)==null?void 0:a.skipTime)||0)>g()-Qo,s=t5<(((i=t.face.antispoof)==null?void 0:i.skipFrames)||0);return t.skipAllowed&&A&&s&&Ko===n&&At[o]?(t5++,At[o]):(t5=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];At[o]=Math.round(100*y)/100,Ko=n,Qo=g(),r.dispose([d,l]),x(At[o])}))}var M0={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]},n5={count:468,mouth:13,symmetryLine:[13,M0.midwayBetweenEyes[0]]},He={leftEye:0,rightEye:1,nose:2,mouth:3,leftEar:4,rightEar:5,symmetryLine:[3,2]},A5=[{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]}],Ve=[[.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]],te=[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],Or=[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],Ir=[33,133,362,263,1,78,308],Es=Wr.map(e=>Ve[e]),zs=Or.map(e=>Ve[e]),js=Ir.map(e=>Ve[e]);var fe=e=>[Math.abs(e.endPoint[0]-e.startPoint[0]),Math.abs(e.endPoint[1]-e.startPoint[1])],rt=e=>[e.startPoint[0]+(e.endPoint[0]-e.startPoint[0])/2,e.startPoint[1]+(e.endPoint[1]-e.startPoint[1])/2,1],i5=(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],l5=(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],on=(e,t)=>{let o=[e.startPoint[0]*t[0],e.startPoint[1]*t[1]],n=[e.endPoint[0]*t[0],e.endPoint[1]*t[1]];return{startPoint:o,endPoint:n,landmarks:e.landmarks,confidence:e.confidence}},s5=(e,t,o)=>{let n=t.shape[1],A=t.shape[2],s=[e.startPoint[1]/n,e.startPoint[0]/A,e.endPoint[1]/n,e.endPoint[0]/A],a=r.image.cropAndResize(t,[s],[0],o),i=r.div(a,N.tf255);return r.dispose(a),i},st=(e,t)=>{let o=rt(e),n=fe(e),A=[t*n[0]/2,t*n[1]/2];return{startPoint:[o[0]-A[0],o[1]-A[1]],endPoint:[o[0]+A[0],o[1]+A[1]],landmarks:e.landmarks,confidence:e.confidence}},at=e=>{let t=rt(e),o=fe(e),n=Math.max(...o)/2;return{startPoint:[Math.round(t[0]-n),Math.round(t[1]-n)],endPoint:[Math.round(t[0]+n),Math.round(t[1]+n)],landmarks:e.landmarks,confidence:e.confidence}},nn=e=>{let t=e.map(n=>n[0]),o=e.map(n=>n[1]);return{startPoint:[Math.min(...t),Math.min(...o)],endPoint:[Math.max(...t),Math.max(...o)],landmarks:e}},a5=[[1,0,0],[0,1,0],[0,0,1]],Lr=e=>e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI)),Nr=(e,t)=>Lr(Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]));var en=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]],oe=(e,t)=>{let o=0;for(let n=0;n{let o=[];for(let n=0;n{let o=[],n=e.length;for(let A=0;A{let o=Math.cos(e),n=Math.sin(e),A=[[o,-n,0],[n,o,0],[0,0,1]],s=en(t[0],t[1]),a=tn(s,A),i=en(-t[0],-t[1]);return tn(a,i)},Br=e=>{let t=[[e[0][0],e[1][0]],[e[0][1],e[1][1]]],o=[e[0][2],e[1][2]],n=[-oe(t[0],o),-oe(t[1],o)];return[t[0].concat(n[0]),t[1].concat(n[1]),[0,0,1]]},Fr=(e,t)=>[oe(e,t[0]),oe(e,t[1])];function rn(e){let t={strides:[e/16,e/8],anchors:[2,6]},o=[];for(let n=0;n[s[0]/A*(f[0]-A/2),s[1]/A*(f[1]-A/2),f[2]||0]),i=o&&o!==0&&Math.abs(o)>.2,x=i?An(o,[0,0]):a5,d=i?a.map(f=>[...Fr(f,x),f[2]]):a,l=i?Br(n):a5,y=rt(t),c=[oe(y,l[0]),oe(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 an(e,t,o,n){let A=t.landmarks.length>=n5.count?n5.symmetryLine:He.symmetryLine,s=0,a=a5,i;if(e&&w.kernels.includes("rotatewithoffset"))if(s=Nr(t.landmarks[A[0]],t.landmarks[A[1]]),s&&s!==0&&Math.abs(s)>.2){let d=rt(t),l=[d[0]/o.shape[2],d[1]/o.shape[1]],y=r.image.rotateWithOffset(o,s,0,l);a=An(-s,d),i=s5(t,y,[n,n]),r.dispose(y)}else i=s5(t,o,[n,n]);else i=s5(t,o,[n,n]);return[s,a,i]}var Hr=e=>{let t=e.map(n=>n[0]),o=e.map(n=>n[1]);return[Math.min(...t)+(Math.max(...t)-Math.min(...t))/2,Math.min(...o)+(Math.max(...o)-Math.min(...o))/2]},ln=(e,t)=>{let o=Hr(e),n=fe(t);return{startPoint:[o[0]-n[0]/2,o[1]-n[1]/2],endPoint:[o[0]+n[0]/2,o[1]+n[1]/2]}};var yn=6,Vr=1.4,R0,xn=null,Z0=0,Ze=null,it=()=>Z0;async function cn(e){var t;return w.initial&&(R0=null),R0?e.debug&&b("cached model:",R0.modelUrl):R0=await L((t=e.face.detector)==null?void 0:t.modelPath),Z0=R0.inputs[0].shape?R0.inputs[0].shape[2]:0,Ze=r.scalar(Z0,"int32"),xn=r.tensor2d(rn(Z0)),R0}function Zr(e){let t={};t.boxStarts=r.slice(e,[0,1],[-1,2]),t.centers=r.add(t.boxStarts,xn),t.boxSizes=r.slice(e,[0,3],[-1,2]),t.boxSizesNormalized=r.div(t.boxSizes,Ze),t.centersNormalized=r.div(t.centers,Ze),t.halfBoxSize=r.div(t.boxSizesNormalized,N.tf2),t.starts=r.sub(t.centersNormalized,t.halfBoxSize),t.ends=r.add(t.centersNormalized,t.halfBoxSize),t.startNormalized=r.mul(t.starts,Ze),t.endNormalized=r.mul(t.ends,Ze);let o=r.concat2d([t.startNormalized,t.endNormalized],1);return Object.keys(t).forEach(n=>r.dispose(t[n])),o}async function dn(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,[Z0,Z0]),o.div=r.div(o.resized,N.tf127),o.normalized=r.sub(o.div,N.tf05);let n=R0==null?void 0:R0.execute(o.normalized);if(Array.isArray(n)){let y=n.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(n);r.dispose(n),o.boxes=Zr(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 A=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,[A[y],0],[1,-1]),f.slice=r.slice(o.batch,[A[y],yn-1],[1,-1]),f.squeeze=r.squeeze(f.slice),f.landmarks=r.reshape(f.squeeze,[yn,-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=on(m,[(e.shape[2]||0)/Z0,(e.shape[1]||0)/Z0]),M=st(v,t.face.scale||Vr),u=at(M);s.push(u),Object.keys(f).forEach(p=>r.dispose(f[p]))}}return Object.keys(o).forEach(y=>r.dispose(o[y])),s}var lt={};$0(lt,{connected:()=>c5,kpt:()=>x5});var x5=["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"],c5={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 mn=224,Xr,Dr=5,yt=[8,16,32,32,32];async function pn(){let e=[],t=0;for(;to.x)),y:r.tensor1d(e.map(o=>o.y))}}function L0(e,t=[1,1]){let o=[e.map(i=>i[0]),e.map(i=>i[1])],n=[Math.min(...o[0]),Math.min(...o[1])],A=[Math.max(...o[0]),Math.max(...o[1])],s=[n[0],n[1],A[0]-n[0],A[1]-n[1]],a=[s[0]/t[0],s[1]/t[1],s[2]/t[0],s[3]/t[1]];return{box:s,boxRaw:a}}function un(e,t=[1,1]){let o=[e.map(d=>d[0]),e.map(d=>d[1])],n=[Math.min(...o[0]),Math.min(...o[1])],A=[Math.max(...o[0]),Math.max(...o[1])],s=[(n[0]+A[0])/2,(n[1]+A[1])/2],a=Math.max(s[0]-n[0],s[1]-n[1],-s[0]+A[0],-s[1]+A[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 xt(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 gn={initial:!0},x0={detector:null,landmarks:null},me={detector:[224,224],landmarks:[256,256]},d5=Number.MAX_SAFE_INTEGER,Ur={landmarks:["ld_3d","activation_segmentation","activation_heatmap","world_3d","output_poseflag"],detector:[]},dt=null,Xe,X0=[[0,0],[0,0],[0,0],[0,0]],hn=0,bn=e=>1-1/(1+Math.exp(e));async function Mn(e){if(gn.initial&&(x0.detector=null),!x0.detector&&e.body.detector&&e.body.detector.modelPath){x0.detector=await L(e.body.detector.modelPath);let t=Object.values(x0.detector.modelSignature.inputs);me.detector[0]=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0,me.detector[1]=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):0}else e.debug&&x0.detector&&b("cached model:",x0.detector.modelUrl);return await pn(),x0.detector}async function Pn(e){if(gn.initial&&(x0.landmarks=null),x0.landmarks)e.debug&&b("cached model:",x0.landmarks.modelUrl);else{x0.landmarks=await L(e.body.modelPath);let t=Object.values(x0.landmarks.modelSignature.inputs);me.landmarks[0]=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0,me.landmarks[1]=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):0}return x0.landmarks}async function Jr(e,t){let o={};if(!e.shape||!e.shape[1]||!e.shape[2])return e;let n;if(Xe&&(o.cropped=r.image.cropAndResize(e,[Xe],[0],[e.shape[1],e.shape[2]])),e.shape[1]!==e.shape[2]){let A=[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];X0=[[0,0],A,s,[0,0]],o.pad=r.pad(o.cropped||e,X0),o.resize=r.image.resizeBilinear(o.pad,[t,t]),n=r.div(o.resize,N.tf255)}else e.shape[1]!==t?(o.resize=r.image.resizeBilinear(o.cropped||e,[t,t]),n=r.div(o.resize,N.tf255)):n=r.div(o.cropped||e,N.tf255);return Object.keys(o).forEach(A=>r.dispose(o[A])),n}function Yr(e,t){for(let o of e)o.position=[Math.trunc(o.position[0]*(t[0]+X0[2][0]+X0[2][1])/t[0]-X0[2][0]),Math.trunc(o.position[1]*(t[1]+X0[1][0]+X0[1][1])/t[1]-X0[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(Xe)for(let o of e)o.positionRaw=[o.positionRaw[0]+Xe[1],o.positionRaw[1]+Xe[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 Kr(e){let t=e.find(i=>i.part==="leftPalm"),o=e.find(i=>i.part==="leftWrist"),n=e.find(i=>i.part==="leftIndex");t.position[2]=((o.position[2]||0)+(n.position[2]||0))/2;let A=e.find(i=>i.part==="rightPalm"),s=e.find(i=>i.part==="rightWrist"),a=e.find(i=>i.part==="rightIndex");A.position[2]=((s.position[2]||0)+(a.position[2]||0))/2}async function Qr(e,t,o){var h;let n={};[n.ld,n.segmentation,n.heatmap,n.world,n.poseflag]=(h=x0.landmarks)==null?void 0:h.execute(e,Ur.landmarks);let A=(await n.poseflag.data())[0],s=await n.ld.data(),a=await n.world.data();Object.keys(n).forEach(m=>r.dispose(n[m]));let i=[],x=5;for(let m=0;mm.position),y=L0(l,[o[0],o[1]]),c={};for(let[m,v]of Object.entries(c5)){let M=[];for(let u=0;uR.part===v[u]),P=d.find(R=>R.part===v[u+1]);p&&P&&M.push([p.position,P.position])}c[m]=M}return{id:0,score:Math.trunc(100*A)/100,box:y.box,boxRaw:y.boxRaw,keypoints:d,annotations:c}}async function f5(e,t){let o=[e.shape[2]||0,e.shape[1]||0],n=(t.body.skipTime||0)>g()-hn,A=d5<(t.body.skipFrames||0);if(t.skipAllowed&&n&&A&&dt!==null)d5++;else{let s={};s.landmarks=await Jr(e,256),dt=await Qr(s.landmarks,t,o),Object.keys(s).forEach(a=>r.dispose(s[a])),hn=g(),d5=0}return dt?[dt]:[]}var pe=[{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 N0,ne=0,m5=[],Tn=0,p5=Number.MAX_SAFE_INTEGER;async function wn(e){if(w.initial&&(N0=null),N0)e.debug&&b("cached model:",N0.modelUrl);else{N0=await L(e.object.modelPath);let t=Object.values(N0.modelSignature.inputs);ne=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):0}return N0}async function _r(e,t,o){if(!e)return[];let n={},A=[],s=await e.array();n.squeeze=r.squeeze(e);let a=r.split(n.squeeze,6,1);n.stack=r.stack([a[1],a[0],a[3],a[2]],1),n.boxes=r.squeeze(n.stack),n.scores=r.squeeze(a[4]),n.classes=r.squeeze(a[5]),r.dispose([e,...a]),n.nms=await r.image.nonMaxSuppressionAsync(n.boxes,n.scores,o.object.maxDetected,o.object.iouThreshold,o.object.minConfidence||0);let i=await n.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=pe[y].label,[f,h]=[s[0][d][0]/ne,s[0][d][1]/ne],m=[f,h,s[0][d][2]/ne-f,s[0][d][3]/ne-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])];A.push({id:x++,score:l,class:y,label:c,box:v,boxRaw:m})}return Object.keys(n).forEach(d=>r.dispose(n[d])),A}async function u5(e,t){let o=(t.object.skipTime||0)>g()-Tn,n=p5<(t.object.skipFrames||0);return t.skipAllowed&&o&&n&&m5.length>0?(p5++,m5):(p5=0,new Promise(async A=>{let s=[e.shape[2]||0,e.shape[1]||0],a=r.image.resizeBilinear(e,[ne,ne]),i=t.object.enabled?N0==null?void 0:N0.execute(a,["tower_0/detections"]):null;Tn=g(),r.dispose(a);let x=await _r(i,s,t);m5=x,A(x)}))}var ft={};$0(ft,{connected:()=>b5,kpt:()=>h5});var h5=["head","neck","rightShoulder","rightElbow","rightWrist","chest","leftShoulder","leftElbow","leftWrist","bodyCenter","rightHip","rightKnee","rightAnkle","leftHip","leftKnee","leftAnkle"],b5={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var r0,kn=0,i0={id:0,keypoints:[],box:[0,0,0,0],boxRaw:[0,0,0,0],score:0,annotations:{}},g5=Number.MAX_SAFE_INTEGER;async function En(e){return w.initial&&(r0=null),r0?e.debug&&b("cached model:",r0.modelUrl):r0=await L(e.body.modelPath),r0}async function $r(e,t){let[o,n]=e.shape,A=r.reshape(e,[n*o]),s=r.max(A,0),a=(await s.data())[0];if(r.dispose([A,s]),a>t){let i=r.argMax(A,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 M5(e,t){let o=(t.body.skipTime||0)>g()-kn,n=g5<(t.body.skipFrames||0);return t.skipAllowed&&o&&n&&Object.keys(i0.keypoints).length>0?(g5++,[i0]):(g5=0,new Promise(async A=>{var y;let s=r.tidy(()=>{if(!(r0!=null&&r0.inputs[0].shape))return null;let c=r.image.resizeBilinear(e,[r0.inputs[0].shape[2],r0.inputs[0].shape[1]],!1),f=r.mul(c,N.tf2);return r.sub(f,N.tf1)}),a;if(t.body.enabled&&(a=r0==null?void 0:r0.execute(s)),kn=g(),r.dispose(s),a){i0.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)&&i0.keypoints.push({score:Math.round(100*M)/100,part:h5[h],positionRaw:[m/r0.inputs[0].shape[2],v/r0.inputs[0].shape[1]],position:[Math.round(e.shape[2]*m/r0.inputs[0].shape[2]),Math.round(e.shape[1]*v/r0.inputs[0].shape[1])]})}f.forEach(h=>r.dispose(h))}i0.score=i0.keypoints.reduce((c,f)=>f.score>c?f.score:c,0);let i=i0.keypoints.map(c=>c.position[0]),x=i0.keypoints.map(c=>c.position[1]);i0.box=[Math.min(...i),Math.min(...x),Math.max(...i)-Math.min(...i),Math.max(...x)-Math.min(...x)];let d=i0.keypoints.map(c=>c.positionRaw[0]),l=i0.keypoints.map(c=>c.positionRaw[1]);i0.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(b5)){let h=[];for(let m=0;mu.part===f[m]),M=i0.keypoints.find(u=>u.part===f[m+1]);v&&M&&v.score>(t.body.minConfidence||0)&&M.score>(t.body.minConfidence||0)&&h.push([v.position,M.position])}i0.annotations[c]=h}A([i0])}))}var e2=["angry","disgust","fear","happy","sad","surprise","neutral"],u0,mt=[],jn=0,Sn=0,P5=Number.MAX_SAFE_INTEGER;async function Cn(e){var t;return w.initial&&(u0=null),u0?e.debug&&b("cached model:",u0.modelUrl):u0=await L((t=e.face.emotion)==null?void 0:t.modelPath),u0}async function v5(e,t,o,n){var a,i;if(!u0)return[];let A=P5<(((a=t.face.emotion)==null?void 0:a.skipFrames)||0),s=(((i=t.face.emotion)==null?void 0:i.skipTime)||0)>g()-Sn;return t.skipAllowed&&s&&A&&jn===n&&mt[o]&&mt[o].length>0?(P5++,mt[o]):(P5=0,new Promise(async x=>{var l,y;let d=[];if((l=t.face.emotion)!=null&&l.enabled){let c={},f=u0!=null&&u0.inputs[0].shape?u0.inputs[0].shape[2]:0;c.resize=r.image.resizeBilinear(e,[f,f],!1),c.channels=r.mul(c.resize,N.rgb),c.grayscale=r.sum(c.channels,3,!0),c.grayscaleSub=r.sub(c.grayscale,N.tf05),c.grayscaleMul=r.mul(c.grayscaleSub,N.tf2),c.emotion=u0==null?void 0:u0.execute(c.grayscaleMul),Sn=g();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:e2[m]});d.sort((m,v)=>v.score-m.score),Object.keys(c).forEach(m=>r.dispose(c[m]))}mt[o]=d,jn=n,x(d)}))}var c0,T5=[],On=0,In=0,Ln=Number.MAX_SAFE_INTEGER;async function Nn(e){return w.initial&&(c0=null),c0?e.debug&&b("cached model:",c0.modelUrl):c0=await L(e.face.mobilefacenet.modelPath),c0}async function w5(e,t,o,n){var a,i;if(!c0)return[];let A=Ln<(((a=t.face.embedding)==null?void 0:a.skipFrames)||0),s=(((i=t.face.embedding)==null?void 0:i.skipTime)||0)>g()-In;return t.skipAllowed&&s&&A&&On===n&&T5[o]?(Ln++,T5[o]):new Promise(async x=>{var l;let d=[];if(((l=t.face.embedding)==null?void 0:l.enabled)&&(c0==null?void 0:c0.inputs[0].shape)){let y={};y.crop=r.image.resizeBilinear(e,[c0.inputs[0].shape[2],c0.inputs[0].shape[1]],!1),y.data=c0==null?void 0:c0.execute(y.crop);let c=await y.data.data();d=Array.from(c)}T5[o]=d,On=n,In=g(),x(d)})}var G0,D0=0,t2=2.3,R5=M0.leftEyeLower0,k5=M0.rightEyeLower0,ue={leftBounds:[R5[0],R5[R5.length-1]],rightBounds:[k5[0],k5[k5.length-1]]},he={upperCenter:3,lowerCenter:4,index:71,numCoordinates:76};async function Vn(e){var t;return w.initial&&(G0=null),G0?e.debug&&b("cached model:",G0.modelUrl):G0=await L((t=e.face.iris)==null?void 0:t.modelPath),D0=G0.inputs[0].shape?G0.inputs[0].shape[2]:0,D0===-1&&(D0=64),G0}function pt(e,t,o,n){for(let A=0;A{let t=e[ue.leftBounds[0]][2],o=e[ue.rightBounds[0]][2];return t-o},Bn=(e,t,o,n,A,s=!1)=>{let a=at(st(nn([e[o],e[n]]),t2)),i=fe(a),x=r.image.cropAndResize(t,[[a.startPoint[1]/A,a.startPoint[0]/A,a.endPoint[1]/A,a.endPoint[0]/A]],[0],[D0,D0]);if(s&&w.kernels.includes("flipleftright")){let d=r.image.flipLeftRight(x);r.dispose(x),x=d}return{box:a,boxSize:i,crop:x}},Fn=(e,t,o,n=!1)=>{let A=[];for(let s=0;s{let n=e[M0[`${o}EyeUpper0`][he.upperCenter]][2],A=e[M0[`${o}EyeLower0`][he.lowerCenter]][2],s=(n+A)/2;return t.map((a,i)=>{let x=s;return i===2?x=n:i===4&&(x=A),[a[0],a[1],x]})};async function Zn(e,t,o,n){if(!G0)return o.debug&&b("face mesh iris detection requested, but model is not loaded"),e;let{box:A,boxSize:s,crop:a}=Bn(e,t,ue.leftBounds[0],ue.leftBounds[1],n,!0),{box:i,boxSize:x,crop:d}=Bn(e,t,ue.rightBounds[0],ue.rightBounds[1],n,!0),l=r.concat([a,d]);r.dispose(a),r.dispose(d);let y=G0.execute(l);r.dispose(l);let c=await y.data();r.dispose(y);let f=c.slice(0,he.numCoordinates*3),{rawCoords:h,iris:m}=Fn(f,A,s,!0),v=c.slice(he.numCoordinates*3),{rawCoords:M,iris:u}=Fn(v,i,x,!1),p=o2(e);Math.abs(p)<30?(pt(e,h,"left",null),pt(e,M,"right",null)):p<1?pt(e,h,"left",["EyeUpper0","EyeLower0"]):pt(e,M,"right",["EyeUpper0","EyeLower0"]);let P=Hn(e,m,"left"),R=Hn(e,u,"right");return e.concat(P).concat(R)}async function Dn(e,t){let o={eyeL:t[0].dataSync(),eyeR:t[6].dataSync(),irisL:t[3].dataSync(),irisR:t[1].dataSync(),lips:t[5].dataSync()};for(let n=0;ng()-k0.timestamp,n=k0.skipped<(((x=t.face.detector)==null?void 0:x.skipFrames)||0);!t.skipAllowed||!o||!n||k0.boxes.length===0?(k0.boxes=await dn(e,t),k0.timestamp=g(),k0.skipped=0):k0.skipped++;let A=[],s=[],a=0;for(let M=0;MB.shape[B.shape.length-1]===1),C=S.find(B=>B.shape[B.shape.length-1]===1404),I=await O.data();R.faceScore=Math.round(100*I[0])/100;let V=r.reshape(C,[-1,3]),G=await V.array();if(R.faceScore<(((f=t.face.detector)==null?void 0:f.minConfidence)||1))u.confidence=R.faceScore;else{(h=t.face.attention)!=null&&h.enabled?G=await Dn(G,S):(m=t.face.iris)!=null&&m.enabled&&(G=await Zn(G,R.tensor,t,be)),R.mesh=sn(G,u,p,P,be),R.meshRaw=R.mesh.map(J=>[J[0]/(e.shape[2]||0),J[1]/(e.shape[1]||0),(J[2]||0)/be]);for(let J of Object.keys(M0))R.annotations[J]=M0[J].map(z=>R.mesh[z]);R.score=R.faceScore;let B={...ln(R.mesh,u),confidence:u.confidence,landmarks:u.landmarks};R.box=i5(B,e),R.boxRaw=l5(B,e),s.push(B)}r.dispose([...S,V])}else{R.box=i5(u,e),R.boxRaw=l5(u,e),R.score=R.boxScore,R.mesh=u.landmarks.map(S=>[(u.startPoint[0]+u.endPoint[0])/2+(u.endPoint[0]+u.startPoint[0])*S[0]/it(),(u.startPoint[1]+u.endPoint[1])/2+(u.endPoint[1]+u.startPoint[1])*S[1]/it()]),R.meshRaw=R.mesh.map(S=>[S[0]/(e.shape[2]||0),S[1]/(e.shape[1]||0),(S[2]||0)/be]);for(let S of Object.keys(He))R.annotations[S]=[R.mesh[He[S]]]}R.score>(((v=t.face.detector)==null?void 0:v.minConfidence)||1)?A.push(R):r.dispose(R.tensor)}return k0.boxes=s,A}async function Un(e){var t,o,n;return w.initial&&(E0=null),E0?e.debug&&b("cached model:",E0.modelUrl):(t=e.face.attention)!=null&&t.enabled?E0=await L((o=e.face.attention)==null?void 0:o.modelPath):E0=await L((n=e.face.mesh)==null?void 0:n.modelPath),be=E0.inputs[0].shape?E0.inputs[0].shape[2]:0,E0}var Jn=te,Yn=Ve;var d0,ut=[],Kn=0,Qn=0,z5=Number.MAX_SAFE_INTEGER;async function _n(e){var t;return w.initial&&(d0=null),d0?e.debug&&b("cached model:",d0.modelUrl):d0=await L((t=e.face.description)==null?void 0:t.modelPath),d0}function j5(e){let t=e.image||e.tensor||e;if(!(d0!=null&&d0.inputs[0].shape))return t;let o=r.image.resizeBilinear(t,[d0.inputs[0].shape[2],d0.inputs[0].shape[1]],!1),n=r.mul(o,N.tf255);return r.dispose(o),n}async function S5(e,t,o,n){var a,i,x,d;if(!d0)return{age:0,gender:"unknown",genderScore:0,descriptor:[]};let A=z5<(((a=t.face.description)==null?void 0:a.skipFrames)||0),s=(((i=t.face.description)==null?void 0:i.skipTime)||0)>g()-Kn;return t.skipAllowed&&A&&s&&Qn===n&&((x=ut[o])==null?void 0:x.age)&&((d=ut[o])==null?void 0:d.age)>0?(z5++,ut[o]):(z5=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=j5(e),m=d0==null?void 0:d0.execute(h);Kn=g(),r.dispose(h);let M=await(await m.find(I=>I.shape[1]===1)).data(),u=Math.trunc(200*Math.abs(M[0]-.5))/100;u>(((f=t.face.description)==null?void 0:f.minConfidence)||0)&&(y.gender=M[0]<=.5?"female":"male",y.genderScore=Math.min(.99,u));let p=r.argMax(m.find(I=>I.shape[1]===100),1),P=(await p.data())[0];r.dispose(p);let S=await m.find(I=>I.shape[1]===100).data();y.age=Math.round(S[P-1]>S[P+1]?10*P-100*S[P-1]:10*P+100*S[P+1])/10;let O=m.find(I=>I.shape[1]===1024),C=O?await O.data():[];y.descriptor=Array.from(C),m.forEach(I=>r.dispose(I))}ut[o]=y,Qn=n,l(y)}))}function ht(e){return[Math.abs(e.endPoint[0]-e.startPoint[0]),Math.abs(e.endPoint[1]-e.startPoint[1])]}function De(e){return[e.startPoint[0]+(e.endPoint[0]-e.startPoint[0])/2,e.startPoint[1]+(e.endPoint[1]-e.startPoint[1])/2]}function tA(e,t,o){let n=t.shape[1],A=t.shape[2],s=[[e.startPoint[1]/n,e.startPoint[0]/A,e.endPoint[1]/n,e.endPoint[0]/A]];return r.image.cropAndResize(t,s,[0],o)}function oA(e,t){let o=[e.startPoint[0]*t[0],e.startPoint[1]*t[1]],n=[e.endPoint[0]*t[0],e.endPoint[1]*t[1]],A=e.palmLandmarks.map(s=>[s[0]*t[0],s[1]*t[1]]);return{startPoint:o,endPoint:n,palmLandmarks:A,confidence:e.confidence}}function bt(e,t=1.5){let o=De(e),n=ht(e),A=[t*n[0]/2,t*n[1]/2],s=[o[0]-A[0],o[1]-A[1]],a=[o[0]+A[0],o[1]+A[1]];return{startPoint:s,endPoint:a,palmLandmarks:e.palmLandmarks}}function gt(e){let t=De(e),o=ht(e),A=Math.max(...o)/2,s=[t[0]-A,t[1]-A],a=[t[0]+A,t[1]+A];return{startPoint:s,endPoint:a,palmLandmarks:e.palmLandmarks}}function A2(e){return e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI))}function nA(e,t){let o=Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]);return A2(o)}var $n=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]];function q0(e,t){let o=0;for(let n=0;n[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 n=r.concat2d([o.startPoints,o.endPoints],1);return Object.keys(o).forEach(A=>r.dispose(o[A])),n}normalizeLandmarks(t,o){let n={};n.reshape=r.reshape(t,[-1,7,2]),n.div=r.div(n.reshape,this.inputSizeTensor),n.landmarks=r.add(n.div,this.anchors[o]);let A=r.mul(n.landmarks,this.inputSizeTensor);return Object.keys(n).forEach(s=>r.dispose(n[s])),A}async predict(t,o){let n={};n.resize=r.image.resizeBilinear(t,[this.inputSize,this.inputSize]),n.div=r.div(n.resize,N.tf127),n.image=r.sub(n.div,N.tf1),n.batched=this.model.execute(n.image),n.predictions=r.squeeze(n.batched),n.slice=r.slice(n.predictions,[0,0],[-1,1]),n.sigmoid=r.sigmoid(n.slice),n.scores=r.squeeze(n.sigmoid);let A=await n.scores.data();n.boxes=r.slice(n.predictions,[0,1],[-1,4]),n.norm=this.normalizeBoxes(n.boxes),n.nms=await r.image.nonMaxSuppressionAsync(n.norm,n.scores,3*o.hand.maxDetected,o.hand.iouThreshold,o.hand.minConfidence);let s=await n.nms.array(),a=[];for(let i of s){let x={};x.box=r.slice(n.norm,[i,0],[1,-1]),x.slice=r.slice(n.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:A[i]},h=oA(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(n).forEach(i=>r.dispose(n[i])),a}};var i2=5,aA=1.65,iA=[0,5,9,13,17,1,2],l2=0,y2=2,lA=0,Pt=class{constructor(t,o){k(this,"handDetector");k(this,"handPoseModel");k(this,"inputSize");k(this,"storedBoxes");k(this,"skipped");k(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]),n=t.map(a=>a[1]),A=[Math.min(...o),Math.min(...n)],s=[Math.max(...o),Math.max(...n)];return{startPoint:A,endPoint:s}}getBoxForPalmLandmarks(t,o){let n=t.map(s=>O5([...s,1],o)),A=this.calculateLandmarksBoundingBox(n);return bt(gt(A),i2)}getBoxForHandLandmarks(t){let o=this.calculateLandmarksBoundingBox(t),n=bt(gt(o),aA);n.palmLandmarks=[];for(let A=0;A[a[0]*(f[0]-this.inputSize/2),a[1]*(f[1]-this.inputSize/2),a[2]*f[2]]),x=W5(n,[0,0]),d=i.map(f=>[...O5(f,x),f[2]]),l=AA(A),y=[...De(o),1],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])])}async estimateHands(t,o){let n=!1,A,s=(o.hand.skipTime||0)>g()-lA,a=this.skipped<(o.hand.skipFrames||0);o.skipAllowed&&s&&a&&(A=await this.handDetector.predict(t,o),this.skipped=0),o.skipAllowed&&this.skipped++,A&&A.length>0&&(A.length!==this.detectedHands&&this.detectedHands!==o.hand.maxDetected||!o.hand.landmarks)&&(this.detectedHands=0,this.storedBoxes=[...A],this.storedBoxes.length>0&&(n=!0));let i=[];for(let x=0;x=o.hand.minConfidence/4){let R=r.reshape(p,[-1,3]),S=await R.array();r.dispose(p),r.dispose(R);let O=this.transformRawCoords(S,m,l,h),C=this.getBoxForHandLandmarks(O);this.storedBoxes[x]={...C,confidence:P};let I={landmarks:O,confidence:P,boxConfidence:d.confidence,fingerConfidence:P,box:{topLeft:C.startPoint,bottomRight:C.endPoint}};i.push(I)}else this.storedBoxes[x]=null;r.dispose(p)}else{let l=bt(gt(d),aA),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 l0={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=>l0.nameMapping[e],getPoints:e=>l0.pointsMapping[e]},J0={none:0,half:1,full:2,nameMapping:{0:"none",1:"half",2:"full"},getName:e=>J0.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]},U0=class{constructor(t){k(this,"name");k(this,"curls");k(this,"directions");k(this,"weights");k(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,n){typeof this.curls[t]=="undefined"&&(this.curls[t]=[]),this.curls[t].push([o,n])}direction(t,o,n){this.directions[t]||(this.directions[t]=[]),this.directions[t].push([o,n])}weight(t,o){this.weights[t]=o;let n=this.weights.reduce((A,s)=>A+s,0);this.weightsRelative=this.weights.map(A=>A*5/n)}matchAgainst(t,o){let n=0;for(let A in t){let s=t[A],a=this.curls[A];if(typeof a=="undefined"){n+=this.weightsRelative[A];continue}for(let[i,x]of a)if(s===i){n+=x*this.weightsRelative[A];break}}for(let A in o){let s=o[A],a=this.directions[A];if(typeof a=="undefined"){n+=this.weightsRelative[A];continue}for(let[i,x]of a)if(s===i){n+=x*this.weightsRelative[A];break}}return n/10}};var{thumb:P0,index:B0,middle:F0,ring:Ae,pinky:re}=l0,{none:v0,half:c2,full:T0}=J0,{verticalUp:ge,verticalDown:ba,horizontalLeft:I5,horizontalRight:d2,diagonalUpRight:f2,diagonalUpLeft:Me,diagonalDownRight:ga,diagonalDownLeft:Ma}=U,Y0=new U0("thumbs up");Y0.curl(P0,v0,1);Y0.direction(P0,ge,1);Y0.direction(P0,Me,.25);Y0.direction(P0,f2,.25);for(let e of[l0.index,l0.middle,l0.ring,l0.pinky])Y0.curl(e,T0,1),Y0.direction(e,I5,1),Y0.direction(e,d2,1);var $=new U0("victory");$.curl(P0,c2,.5);$.curl(P0,v0,.5);$.direction(P0,ge,1);$.direction(P0,Me,1);$.curl(B0,v0,1);$.direction(B0,ge,.75);$.direction(B0,Me,1);$.curl(F0,v0,1);$.direction(F0,ge,1);$.direction(F0,Me,.75);$.curl(Ae,T0,1);$.direction(Ae,ge,.2);$.direction(Ae,Me,1);$.direction(Ae,I5,.2);$.curl(re,T0,1);$.direction(re,ge,.2);$.direction(re,Me,1);$.direction(re,I5,.2);$.weight(B0,2);$.weight(F0,2);var K0=new U0("point");K0.curl(P0,T0,1);K0.curl(B0,v0,.5);K0.curl(F0,T0,.5);K0.curl(Ae,T0,.5);K0.curl(re,T0,.5);K0.weight(B0,2);K0.weight(F0,2);var Q0=new U0("middle finger");Q0.curl(P0,v0,1);Q0.curl(B0,T0,.5);Q0.curl(F0,T0,.5);Q0.curl(Ae,T0,.5);Q0.curl(re,T0,.5);Q0.weight(B0,2);Q0.weight(F0,2);var Pe=new U0("open palm");Pe.curl(P0,v0,.75);Pe.curl(B0,v0,.75);Pe.curl(F0,v0,.75);Pe.curl(Ae,v0,.75);Pe.curl(re,v0,.75);var yA=[Y0,$,K0,Q0,Pe];var m2=.7,se={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 xA(e,t,o,n){let A=(t-n)/(e-o),s=Math.atan(A)*180/Math.PI;return s<=0?s=-s:s>0&&(s=180-s),s}function dA(e,t){if(!e||!t)return[0,0];let o=xA(e[0],e[1],t[0],t[1]);if(e.length===2)return o;let n=xA(e[1],e[2],t[1],t[2]);return[o,n]}function cA(e,t=1){let o=0,n=0,A=0;return e>=75&&e<=105?o=1*t:e>=25&&e<=155?n=1*t:A=1*t,[o,n,A]}function p2(e,t,o){let n=e[0]-t[0],A=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(n*n+a*a+d*d),f=Math.sqrt(A*A+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 M;return v>se.NO_CURL_START_LIMIT?M=J0.none:v>se.HALF_CURL_START_LIMIT?M=J0.half:M=J0.full,M}function fA(e,t,o,n){let A;return n===Math.abs(e)?e>0?A=U.horizontalLeft:A=U.horizontalRight:n===Math.abs(t)?t>0?A=U.horizontalLeft:A=U.horizontalRight:o>0?A=U.horizontalLeft:A=U.horizontalRight,A}function mA(e,t,o,n){let A;return n===Math.abs(e)?e<0?A=U.verticalDown:A=U.verticalUp:n===Math.abs(t)?t<0?A=U.verticalDown:A=U.verticalUp:o<0?A=U.verticalDown:A=U.verticalUp,A}function u2(e,t,o,n,A,s,a,i){let x,d=mA(e,t,o,n),l=fA(A,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 h2(e,t,o,n){let A=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(A),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+=se.DISTANCE_VOTE_POWER:m>.66?f+=se.DISTANCE_VOTE_POWER:h+=se.DISTANCE_VOTE_POWER;let v=Math.sqrt(A*A+i*i),M=Math.sqrt(s*s+x*x),u=Math.sqrt(a*a+d*d),p=Math.max(v,M,u),P=e[0],R=e[1],S=o[0],O=o[1];p===v?(S=o[0],O=o[1]):p===u&&(P=t[0],R=t[1]);let V=dA([P,R],[S,O]),G=cA(V,se.TOTAL_ANGLE_VOTE_POWER);c+=G[0],f+=G[1],h+=G[2];for(let J of n){let z=cA(J,se.SINGLE_ANGLE_VOTE_POWER);c+=z[0],f+=z[1],h+=z[2]}let B;return c===Math.max(c,f,h)?B=mA(x,i,d,y):h===Math.max(f,h)?B=fA(s,A,a,l):B=u2(x,i,d,y,s,A,a,l),B}function pA(e){let t=[],o=[],n=[],A=[];if(!e)return{curls:n,directions:A};for(let s of l0.all){let a=l0.getPoints(s),i=[],x=[];for(let d of a){let l=e[d[0]],y=e[d[1]],c=dA(l,y),f=c[0],h=c[1];i.push(f),x.push(h)}t.push(i),o.push(x)}for(let s of l0.all){let a=s===l0.thumb?1:0,i=l0.getPoints(s),x=e[i[a][0]],d=e[i[a+1][1]],l=e[i[3][1]],y=p2(x,d,l),c=h2(x,d,l,t[s].slice(a));n[s]=y,A[s]=c}return{curls:n,directions:A}}function vt(e){if(!e||e.length===0)return null;let t=pA(e),o={};for(let n of l0.all)o[l0.getName(n)]={curl:J0.getName(t.curls[n]),direction:U.getName(t.directions[n])};return o}function uA(e){let t=[];if(!e||e.length===0)return t;let o=pA(e);for(let n of yA){let A=n.matchAgainst(o.curls,o.directions);A>=m2&&t.push({name:n.name,confidence:A})}return t}var hA={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]},ve,Te,bA;async function N5(e,t){let o=await bA.estimateHands(e,t);if(!o)return[];let n=[];for(let A=0;Ao[A].landmarks[y]);let a=o[A].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[A].box?[Math.trunc(Math.max(0,o[A].box.topLeft[0])),Math.trunc(Math.max(0,o[A].box.topLeft[1])),Math.trunc(Math.min(e.shape[2]||0,o[A].box.bottomRight[0])-Math.max(0,o[A].box.topLeft[0])),Math.trunc(Math.min(e.shape[1]||0,o[A].box.bottomRight[1])-Math.max(0,o[A].box.topLeft[1]))]:[0,0,0,0],x=[o[A].box.topLeft[0]/(e.shape[2]||0),o[A].box.topLeft[1]/(e.shape[1]||0),(o[A].box.bottomRight[0]-o[A].box.topLeft[0])/(e.shape[2]||0),(o[A].box.bottomRight[1]-o[A].box.topLeft[1])/(e.shape[1]||0)];let d=vt(a);n.push({id:A,score:Math.round(100*o[A].confidence)/100,boxScore:Math.round(100*o[A].boxConfidence)/100,fingerScore:Math.round(100*o[A].fingerConfidence)/100,label:"hand",box:i,boxRaw:x,keypoints:a,annotations:s,landmarks:d})}return n}async function G5(e){var o,n;w.initial&&(ve=null,Te=null),!ve||!Te?[ve,Te]=await Promise.all([e.hand.enabled?L((o=e.hand.detector)==null?void 0:o.modelPath):null,e.hand.landmarks?L((n=e.hand.skeleton)==null?void 0:n.modelPath):null]):(e.debug&&b("cached model:",ve.modelUrl),e.debug&&b("cached model:",Te.modelUrl));let t=new Mt(ve);return bA=new Pt(t,Te),[ve,Te]}var t0=[null,null],b2=["StatefulPartitionedCall/Postprocessor/Slice","StatefulPartitionedCall/Postprocessor/ExpandDims_1"],_0=[[0,0],[0,0]],g2=["hand","fist","pinch","point","face","tip","pinchtip"],MA=4,PA=1.6,M2=512,P2=1.4,Tt=Number.MAX_SAFE_INTEGER,B5=0,H0=[0,0],K={boxes:[],hands:[]},vA={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 TA(e){var t;if(w.initial&&(t0[0]=null),t0[0])e.debug&&b("cached model:",t0[0].modelUrl);else{wt(["tensorlistreserve","enter","tensorlistfromtensor","merge","loopcond","switch","exit","tensorliststack","nextiteration","tensorlistsetitem","tensorlistgetitem","reciprocal","shape","split","where"],e),t0[0]=await L((t=e.hand.detector)==null?void 0:t.modelPath);let o=Object.values(t0[0].modelSignature.inputs);_0[0][0]=Array.isArray(o)?parseInt(o[0].tensorShape.dim[1].size):0,_0[0][1]=Array.isArray(o)?parseInt(o[0].tensorShape.dim[2].size):0}return t0[0]}async function wA(e){var t;if(w.initial&&(t0[1]=null),t0[1])e.debug&&b("cached model:",t0[1].modelUrl);else{t0[1]=await L((t=e.hand.skeleton)==null?void 0:t.modelPath);let o=Object.values(t0[1].modelSignature.inputs);_0[1][0]=Array.isArray(o)?parseInt(o[0].tensorShape.dim[1].size):0,_0[1][1]=Array.isArray(o)?parseInt(o[0].tensorShape.dim[2].size):0}return t0[1]}async function v2(e,t){let o=[];if(!e||!t0[0])return o;let n={},A=(e.shape[2]||1)/(e.shape[1]||1),s=Math.min(Math.round((e.shape[1]||0)/8)*8,M2),a=Math.round(s*A/8)*8;n.resize=r.image.resizeBilinear(e,[s,a]),n.cast=r.cast(n.resize,"int32"),[n.rawScores,n.rawBoxes]=await t0[0].executeAsync(n.cast,b2),n.boxes=r.squeeze(n.rawBoxes,[0,2]),n.scores=r.squeeze(n.rawScores,[0]);let i=r.unstack(n.scores,1);r.dispose(i[MA]),i.splice(MA,1),n.filtered=r.stack(i,1),r.dispose(i),n.max=r.max(n.filtered,1),n.argmax=r.argMax(n.filtered,1);let x=0;n.nms=await r.image.nonMaxSuppressionAsync(n.boxes,n.max,(t.hand.maxDetected||0)+1,t.hand.iouThreshold||0,t.hand.minConfidence||1);let d=await n.nms.data(),l=await n.max.data(),y=await n.argmax.data();for(let c of Array.from(d)){let f=r.slice(n.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=xt(m,P2),M=[Math.trunc(m[0]*H0[0]),Math.trunc(m[1]*H0[1]),Math.trunc(m[2]*H0[0]),Math.trunc(m[3]*H0[1])],u=l[c],p=g2[y[c]],P={id:x++,score:u,box:M,boxRaw:v,label:p};o.push(P)}return Object.keys(n).forEach(c=>r.dispose(n[c])),o.sort((c,f)=>f.score-c.score),o.length>(t.hand.maxDetected||1)&&(o.length=t.hand.maxDetected||1),o}async function F5(e,t,o){let n={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&&t0[1]&&o.hand.landmarks&&t.score>(o.hand.minConfidence||0)){let A={},s=[t.boxRaw[1],t.boxRaw[0],t.boxRaw[3]+t.boxRaw[1],t.boxRaw[2]+t.boxRaw[0]];A.crop=r.image.cropAndResize(e,[s],[0],[_0[1][0],_0[1][1]],"bilinear"),A.div=r.div(A.crop,N.tf255),[A.score,A.keypoints]=t0[1].execute(A.div,["Identity_1","Identity"]);let a=(await A.score.data())[0],i=(100-Math.trunc(100/(1+Math.exp(a))))/100;if(i>=(o.hand.minConfidence||0)){n.fingerScore=i,A.reshaped=r.reshape(A.keypoints,[-1,3]);let l=(await A.reshaped.array()).map(y=>[y[0]/_0[1][1],y[1]/_0[1][0],y[2]||0]).map(y=>[y[0]*t.boxRaw[2],y[1]*t.boxRaw[3],y[2]||0]);n.keypoints=l.map(y=>[H0[0]*(y[0]+t.boxRaw[0]),H0[1]*(y[1]+t.boxRaw[1]),y[2]||0]),n.landmarks=vt(n.keypoints);for(let y of Object.keys(vA))n.annotations[y]=vA[y].map(c=>n.landmarks&&n.keypoints[c]?n.keypoints[c]:null)}Object.keys(A).forEach(x=>r.dispose(A[x]))}return n}async function H5(e,t){var A,s;if(!t0[0]||!t0[1]||!((A=t0[0])!=null&&A.inputs[0].shape)||!((s=t0[1])!=null&&s.inputs[0].shape))return[];H0=[e.shape[2]||0,e.shape[1]||0],Tt++;let o=(t.hand.skipTime||0)>g()-B5,n=Tt<(t.hand.skipFrames||0);return t.skipAllowed&&o&&n?K.hands:new Promise(async a=>{let i=3*(t.hand.skipTime||0)>g()-B5,x=Tt<3*(t.hand.skipFrames||0);t.skipAllowed&&K.hands.length===t.hand.maxDetected?K.hands=await Promise.all(K.boxes.map(l=>F5(e,l,t))):t.skipAllowed&&i&&x&&K.hands.length>0?K.hands=await Promise.all(K.boxes.map(l=>F5(e,l,t))):(K.boxes=await v2(e,t),B5=g(),K.hands=await Promise.all(K.boxes.map(l=>F5(e,l,t))),Tt=0);let d=[...K.boxes];if(K.boxes.length=0,t.cacheSensitivity>0)for(let l=0;l.05&&y.box[3]/(e.shape[1]||1)>.05&&K.hands[l].fingerScore&&K.hands[l].fingerScore>(t.hand.minConfidence||0)){let c=xt(y.box,PA),f=xt(y.boxRaw,PA);K.boxes.push({...d[l],box:c,boxRaw:f})}}for(let l=0;lg()-EA,s=V5<(((i=t.face.liveness)==null?void 0:i.skipFrames)||0);return t.skipAllowed&&A&&s&&kA===n&&Rt[o]?(V5++,Rt[o]):(V5=0,new Promise(async x=>{let d=r.image.resizeBilinear(e,[s0!=null&&s0.inputs[0].shape?s0.inputs[0].shape[2]:0,s0!=null&&s0.inputs[0].shape?s0.inputs[0].shape[1]:0],!1),l=s0==null?void 0:s0.execute(d),y=(await l.data())[0];Rt[o]=Math.round(100*y)/100,kA=n,EA=g(),r.dispose([d,l]),x(Rt[o])}))}var qe={};$0(qe,{connected:()=>Et,horizontal:()=>X5,kpt:()=>kt,relative:()=>q5,vertical:()=>D5});var kt=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],X5=[["leftEye","rightEye"],["leftEar","rightEar"],["leftShoulder","rightShoulder"],["leftElbow","rightElbow"],["leftWrist","rightWrist"],["leftHip","rightHip"],["leftKnee","rightKnee"],["leftAnkle","rightAnkle"]],D5=[["leftKnee","leftShoulder"],["rightKnee","rightShoulder"],["leftAnkle","leftKnee"],["rightAnkle","rightKnee"]],q5=[[["leftHip","rightHip"],["leftShoulder","rightShoulder"]],[["leftElbow","rightElbow"],["leftShoulder","rightShoulder"]]],Et={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var SA=.005,f0={keypoints:[],padding:[[0,0],[0,0],[0,0],[0,0]]};function U5(e){for(let t of X5){let o=e.keypoints.findIndex(A=>A.part===t[0]),n=e.keypoints.findIndex(A=>A.part===t[1]);if(e.keypoints[o]&&e.keypoints[n]&&e.keypoints[o].position[0]A&&A.part===t[0]),n=e.keypoints.findIndex(A=>A&&A.part===t[1]);e.keypoints[o]&&e.keypoints[n]&&e.keypoints[o].position[1]d&&d.part===t[0]),A=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[n]?[Math.abs(e.keypoints[s].position[0]-e.keypoints[n].position[0]),Math.abs(e.keypoints[a].position[0]-e.keypoints[n].position[0])]:[0,0],x=e.keypoints[A]?[Math.abs(e.keypoints[a].position[0]-e.keypoints[A].position[0]),Math.abs(e.keypoints[s].position[0]-e.keypoints[A].position[0])]:[0,0];if(i[0]>i[1]||x[0]>x[1]){let d=e.keypoints[n];e.keypoints[n]=e.keypoints[A],e.keypoints[A]=d}}}function CA(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,f0.padding),o.resize=r.image.resizeBilinear(o.pad,[t,t]);let n=r.cast(o.resize,"int32");return Object.keys(o).forEach(A=>r.dispose(o[A])),n}function OA(e,t){e.keypoints=e.keypoints.filter(n=>n&&n.position);for(let n of e.keypoints)n.position=[n.position[0]*(t[0]+f0.padding[2][0]+f0.padding[2][1])/t[0]-f0.padding[2][0],n.position[1]*(t[1]+f0.padding[1][0]+f0.padding[1][1])/t[1]-f0.padding[1][0]],n.positionRaw=[n.position[0]/t[0],n.position[1]/t[1]];let o=L0(e.keypoints.map(n=>n.position),t);return e.box=o.box,e.boxRaw=o.boxRaw,e}var m0,zt=0,J5=Number.MAX_SAFE_INTEGER,ae={boxes:[],bodies:[],last:0};async function IA(e){return w.initial&&(m0=null),m0?e.debug&&b("cached model:",m0.modelUrl):(wt(["size"],e),m0=await L(e.body.modelPath)),zt=m0.inputs[0].shape?m0.inputs[0].shape[2]:0,zt<64&&(zt=256),m0}async function w2(e,t,o){let n=e[0][0],A=[],s=0;for(let l=0;lt.body.minConfidence){let y=[n[l][1],n[l][0]];A.push({score:Math.round(100*s)/100,part:kt[l],positionRaw:y,position:[Math.round((o.shape[2]||0)*y[0]),Math.round((o.shape[1]||0)*y[1])]})}s=A.reduce((l,y)=>y.score>l?y.score:l,0);let a=[],i=L0(A.map(l=>l.position),[o.shape[2],o.shape[1]]),x={};for(let[l,y]of Object.entries(Et)){let c=[];for(let f=0;fv.part===y[f]),m=A.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:A,annotations:x};return U5(d),a.push(d),a}async function R2(e,t,o){let n=[];for(let A=0;At.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:kt[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=L0(i.map(y=>y.position),[o.shape[2],o.shape[1]]),d={};for(let[y,c]of Object.entries(Et)){let f=[];for(let h=0;hM.part===c[h]),v=i.find(M=>M.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:A,score:a,box:x.box,boxRaw:x.boxRaw,keypoints:[...i],annotations:d};U5(l),n.push(l)}}return n.sort((A,s)=>s.score-A.score),n.length>t.body.maxDetected&&(n.length=t.body.maxDetected),n}async function Y5(e,t){if(!m0||!(m0!=null&&m0.inputs[0].shape))return[];t.skipAllowed||(ae.boxes.length=0),J5++;let o=(t.body.skipTime||0)>g()-ae.last,n=J5<(t.body.skipFrames||0);return t.skipAllowed&&o&&n?ae.bodies:new Promise(async A=>{let s={};J5=0,s.input=WA(e,zt),s.res=m0==null?void 0:m0.execute(s.input),ae.last=g();let a=await s.res.array();ae.bodies=s.res.shape[2]===17?await w2(a,t,e):await R2(a,t,e);for(let i of ae.bodies)OA(i,[e.shape[2]||1,e.shape[1]||1]),CA(i.keypoints);Object.keys(s).forEach(i=>r.dispose(s[i])),A(ae.bodies)})}var we,jt=[],NA=0,K5=Number.MAX_SAFE_INTEGER,Ct=0,St=2.5;async function GA(e){if(!we||w.initial){we=await L(e.object.modelPath);let t=Object.values(we.modelSignature.inputs);Ct=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):0}else e.debug&&b("cached model:",we.modelUrl);return we}async function k2(e,t,o){let n=0,A=[];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)===pe.length)),y=r.squeeze(e.find(m=>m.shape[1]===d**2&&(m.shape[2]||0)(o.object.minConfidence||0)&&v!==61){let u=(.5+Math.trunc(m%d))/d,p=(.5+Math.trunc(m/d))/d,P=f[m].map(B=>B*(d/x/Ct)),[R,S]=[u-St/x*P[0],p-St/x*P[1]],[O,C]=[u+St/x*P[2]-R,p+St/x*P[3]-S],I=[R,S,O,C];I=I.map(B=>Math.max(0,Math.min(B,1)));let V=[I[0]*t[0],I[1]*t[1],I[2]*t[0],I[3]*t[1]],G={id:n++,score:Math.round(100*M)/100,class:v+1,label:pe[v].label,box:V.map(B=>Math.trunc(B)),boxRaw:I};A.push(G)}}});e.forEach(x=>r.dispose(x));let s=A.map(x=>[x.boxRaw[1],x.boxRaw[0],x.boxRaw[3],x.boxRaw[2]]),a=A.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 A=A.filter((x,d)=>i.includes(d)).sort((x,d)=>d.score-x.score),A}async function Q5(e,t){let o=(t.object.skipTime||0)>g()-NA,n=K5<(t.object.skipFrames||0);return t.skipAllowed&&o&&n&&jt.length>0?(K5++,jt):(K5=0,!w.kernels.includes("mod")||!w.kernels.includes("sparsetodense")?jt:new Promise(async A=>{let s=[e.shape[2]||0,e.shape[1]||0],a=r.image.resizeBilinear(e,[Ct,Ct],!1),i=r.div(a,N.tf255),x=i.transpose([0,3,1,2]);r.dispose(i),r.dispose(a);let d;t.object.enabled&&(d=we.execute(x)),NA=g(),r.dispose(x);let l=await k2(d,s,t);jt=l,A(l)}))}var Je=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],E2=Je.length,Ue=Je.reduce((e,t,o)=>(e[t]=o,e),{}),z2=[["leftHip","leftShoulder"],["leftElbow","leftShoulder"],["leftElbow","leftWrist"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["rightHip","rightShoulder"],["rightElbow","rightShoulder"],["rightElbow","rightWrist"],["rightHip","rightKnee"],["rightKnee","rightAnkle"],["leftShoulder","rightShoulder"],["leftHip","rightHip"]],Da=z2.map(([e,t])=>[Ue[e],Ue[t]]),FA=[["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 HA(e){let t=e.reduce(({maxX:o,maxY:n,minX:A,minY:s},{position:{x:a,y:i}})=>({maxX:Math.max(o,a),maxY:Math.max(n,i),minX:Math.min(A,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 VA(e,[t,o],[n,A]){let s=t/n,a=o/A,i=(d,l)=>({id:l,score:d.score,boxRaw:[d.box[0]/A,d.box[1]/n,d.box[2]/A,d.box[3]/n],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/n,f.y/n]})),annotations:{}});return e.map((d,l)=>i(d,l))}var Wt=class{constructor(t,o){k(this,"priorityQueue");k(this,"numberOfElements");k(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 ZA(e,t,o,n){let A=o-e,s=n-t;return A*A+s*s}function to(e,t){return{x:e.x+t.x,y:e.y+t.y}}var w0,S2=["MobilenetV1/offset_2/BiasAdd","MobilenetV1/heatmap_2/BiasAdd","MobilenetV1/displacement_fwd_2/BiasAdd","MobilenetV1/displacement_bwd_2/BiasAdd"],Ot=1,Re=16,C2=50**2;function XA(e,t,o,n,A,s,a=2){let i=M=>({y:s.get(M.y,M.x,e),x:s.get(M.y,M.x,s.shape[2]/2+e)}),x=(M,u,p)=>({y:eo(Math.round(M.y/Re),0,u-1),x:eo(Math.round(M.x/Re),0,p-1)}),[d,l]=n.shape,y=x(t.position,d,l),c=i(y),h=to(t.position,c);for(let M=0;M[Ue[c],Ue[f]]),a=s.map(([,c])=>c),i=s.map(([c])=>c),x=t.shape[2],d=a.length,l=new Array(x),y=$5(e.part,Re,o);l[e.part.id]={score:e.score,part:Je[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]=XA(c,l[f],h,t,o,A))}for(let c=0;ct){i=!1;break}if(!i)break}return i}function I2(e,t){let[o,n,A]=t.shape,s=new Wt(o*n*A,({score:a})=>a);for(let a=0;a{var a;let s=(a=A[n])==null?void 0:a.position;return s?ZA(o,t,s.y,s.x)<=C2:!1})}function L2(e,t){return t.reduce((n,{position:A,score:s},a)=>(DA(e,A,a)||(n+=s),n),0)/t.length}function N2(e,t,o,n,A,s){let a=[],i=I2(s,t);for(;a.lengthf.score>s);let y=L2(a,l),c=HA(l);y>s&&a.push({keypoints:l,box:c,score:Math.round(100*y)/100})}return a}async function oo(e,t){let o=r.tidy(()=>{if(!w0.inputs[0].shape)return[];let a=r.image.resizeBilinear(e,[w0.inputs[0].shape[2],w0.inputs[0].shape[1]]),i=r.sub(r.div(r.cast(a,"float32"),127.5),1),d=w0.execute(i,S2).map(l=>r.squeeze(l,[0]));return d[1]=r.sigmoid(d[1]),d}),n=await Promise.all(o.map(a=>a.buffer()));for(let a of o)r.dispose(a);let A=await N2(n[0],n[1],n[2],n[3],t.body.maxDetected,t.body.minConfidence);return w0.inputs[0].shape?VA(A,[e.shape[1],e.shape[2]],[w0.inputs[0].shape[2],w0.inputs[0].shape[1]]):[]}async function qA(e){return!w0||w.initial?w0=await L(e.body.modelPath):e.debug&&b("cached model:",w0.modelUrl),w0}var z0,no=!1;async function Ao(e){return!z0||w.initial?z0=await L(e.segmentation.modelPath):e.debug&&b("cached model:",z0.modelUrl),z0}async function JA(e,t,o){var m,v;if(no)return{data:[],canvas:null,alpha:null};no=!0,z0||await Ao(o);let n=await de(e,o),A=((m=n.tensor)==null?void 0:m.shape[2])||0,s=((v=n.tensor)==null?void 0:v.shape[1])||0;if(!n.tensor)return{data:[],canvas:null,alpha:null};let a={};a.resize=r.image.resizeBilinear(n.tensor,[z0.inputs[0].shape?z0.inputs[0].shape[1]:0,z0.inputs[0].shape?z0.inputs[0].shape[2]:0],!1),r.dispose(n.tensor),a.norm=r.div(a.resize,N.tf255),a.res=z0.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],[A,s]),a.data=r.squeeze(a.crop,0)):a.data=r.image.resizeBilinear(a.squeeze,[s,A]);let i=Array.from(await a.data.data());if(w.node&&!w.Canvas&&typeof ImageData=="undefined")return o.debug&&b("canvas support missing"),Object.keys(a).forEach(M=>r.dispose(a[M])),{data:i,canvas:null,alpha:null};let x=a0(A,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,A,s),y=a0(A,s),c=y.getContext("2d");n.canvas&&c.drawImage(n.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,A,s);for(let M=0;Mr.dispose(a[M])),no=!1,{data:i,canvas:y,alpha:x}}var Ye=class{constructor(){k(this,"ssrnetage",null);k(this,"gear",null);k(this,"blazeposedetect",null);k(this,"blazepose",null);k(this,"centernet",null);k(this,"efficientpose",null);k(this,"mobilefacenet",null);k(this,"emotion",null);k(this,"facedetect",null);k(this,"faceiris",null);k(this,"facemesh",null);k(this,"faceres",null);k(this,"ssrnetgender",null);k(this,"handpose",null);k(this,"handskeleton",null);k(this,"handtrack",null);k(this,"liveness",null);k(this,"movenet",null);k(this,"nanodet",null);k(this,"posenet",null);k(this,"segmentation",null);k(this,"antispoof",null)}};function It(e){for(let t of Object.keys(e.models))e.models[t]=null}async function ro(e){var t,o,n,A,s,a,i,x,d,l,y,c,f,h,m,v,M,u,p,P,R,S,O,C,I,V,G,B,J,z;w.initial&&It(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 G5(e.config)),!e.models.handskeleton&&e.config.hand.landmarks&&((A=(n=e.config.hand.detector)==null?void 0:n.modelPath)==null?void 0:A.includes("handdetect"))&&([e.models.handpose,e.models.handskeleton]=await G5(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=Pn(e.config)),e.config.body.enabled&&!e.models.blazeposedetect&&e.config.body.detector&&e.config.body.detector.modelPath&&(e.models.blazeposedetect=Mn(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=En(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=IA(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=qA(e.config)),e.config.face.enabled&&!e.models.facedetect&&(e.models.facedetect=cn(e.config)),e.config.face.enabled&&((f=e.config.face.antispoof)==null?void 0:f.enabled)&&!e.models.antispoof&&(e.models.antispoof=_o(e.config)),e.config.face.enabled&&((h=e.config.face.liveness)==null?void 0:h.enabled)&&!e.models.liveness&&(e.models.liveness=zA(e.config)),e.config.face.enabled&&((m=e.config.face.description)==null?void 0:m.enabled)&&!e.models.faceres&&(e.models.faceres=_n(e.config)),e.config.face.enabled&&((v=e.config.face.emotion)==null?void 0:v.enabled)&&!e.models.emotion&&(e.models.emotion=Cn(e.config)),e.config.face.enabled&&((M=e.config.face.iris)==null?void 0:M.enabled)&&!e.models.faceiris&&(e.models.faceiris=Vn(e.config)),e.config.face.enabled&&((u=e.config.face.mesh)==null?void 0:u.enabled)&&!e.models.facemesh&&(e.models.facemesh=Un(e.config)),e.config.face.enabled&&((p=e.config.face.gear)==null?void 0:p.enabled)&&!e.models.gear&&(e.models.gear=Bo(e.config)),e.config.face.enabled&&((P=e.config.face.ssrnet)==null?void 0:P.enabled)&&!e.models.ssrnetage&&(e.models.ssrnetage=Xo(e.config)),e.config.face.enabled&&((R=e.config.face.ssrnet)==null?void 0:R.enabled)&&!e.models.ssrnetgender&&(e.models.ssrnetgender=Jo(e.config)),e.config.face.enabled&&((S=e.config.face.mobilefacenet)==null?void 0:S.enabled)&&!e.models.mobilefacenet&&(e.models.mobilefacenet=Nn(e.config)),e.config.hand.enabled&&!e.models.handtrack&&((C=(O=e.config.hand.detector)==null?void 0:O.modelPath)==null?void 0:C.includes("handtrack"))&&(e.models.handtrack=TA(e.config)),e.config.hand.enabled&&e.config.hand.landmarks&&!e.models.handskeleton&&((V=(I=e.config.hand.detector)==null?void 0:I.modelPath)==null?void 0:V.includes("handtrack"))&&(e.models.handskeleton=wA(e.config)),e.config.object.enabled&&!e.models.centernet&&((B=(G=e.config.object)==null?void 0:G.modelPath)==null?void 0:B.includes("centernet"))&&(e.models.centernet=wn(e.config)),e.config.object.enabled&&!e.models.nanodet&&((z=(J=e.config.object)==null?void 0:J.modelPath)==null?void 0:z.includes("nanodet"))&&(e.models.nanodet=GA(e.config)),e.config.segmentation.enabled&&!e.models.segmentation&&(e.models.segmentation=Ao(e.config));for await(let p0 of Object.keys(e.models))e.models[p0]&&typeof e.models[p0]!="undefined"&&(e.models[p0]=await e.models[p0])}async function so(e){let t=["const","placeholder","noop","pad","squeeze","add","sub","mul","div"];for(let o of Object.keys(e.models)){let n=e.models[o];if(!n)continue;let A=[],s=n==null?void 0:n.executor;if(s&&s.graph.nodes)for(let i of Object.values(s.graph.nodes)){let x=i.op.toLowerCase();A.includes(x)||A.push(x)}else!s&&e.config.debug&&b("model signature not determined:",o);let a=[];for(let i of A)!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&&b("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 G2(){let e=q.gl;!e||(q.extensions=e.getSupportedExtensions())}async function KA(e){var t;if(e.config.backend==="humangl"&&(q.name in r.engine().registry&&(!q.gl||!q.gl.getParameter(q.gl.VERSION))&&(b("error: humangl backend invalid context"),It(e)),!r.findBackend(q.name))){try{q.canvas=await a0(100,100)}catch(n){b("error: cannot create canvas:",n);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")){b("override: using fallback webgl backend as webgl 2.0 is not detected"),e.config.backend="webgl";return}q.canvas&&(q.canvas.addEventListener("webglcontextlost",async A=>{throw b("error: humangl:",A.type),b("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",A=>{b("error: humangl context restored:",A)}),q.canvas.addEventListener("webglcontextcreationerror",A=>{b("error: humangl context create:",A)}))}catch(n){b("error: cannot get WebGL context:",n);return}try{r.setWebGLContext(2,q.gl)}catch(n){b("error: cannot set WebGL context:",n);return}try{let n=new r.GPGPUContext(q.gl);r.registerBackend(q.name,()=>new r.MathBackendWebGL(n),q.priority)}catch(n){b("error: cannot register WebGL backend:",n);return}try{r.getKernelsForBackend("webgl").forEach(A=>{let s={...A,backendName:q.name};r.registerKernel(s)})}catch(n){b("error: cannot update WebGL backend registration:",n);return}let o=r.backend().getGPGPUContext?r.backend().getGPGPUContext().gl:null;if(o)b(`humangl webgl version:${o.getParameter(o.VERSION)} renderer:${o.getParameter(o.RENDERER)}`);else{b("error: no current gl context:",o,q.gl);return}try{r.ENV.set("WEBGL_VERSION",2)}catch(n){b("error: cannot set WebGL backend flags:",n);return}G2(),b("backend registered:",q.name)}}function B2(){if(!w.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),w.kernels.push("mod")}if(!w.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),w.kernels.push("floormod")}}async function Lt(e,t=!1){if(e.state="backend",t||w.initial||e.config.backend&&e.config.backend.length>0&&r.getBackend()!==e.config.backend){let o=g();if(e.config.backend&&e.config.backend.length>0){if(typeof window=="undefined"&&typeof WorkerGlobalScope!="undefined"&&e.config.debug&&e.config.debug&&b("running inside web worker"),w.browser&&e.config.backend==="tensorflow"&&(e.config.debug&&b("override: backend set to tensorflow while running in browser"),e.config.backend="humangl"),w.node&&(e.config.backend==="webgl"||e.config.backend==="humangl")&&(e.config.debug&&b(`override: backend set to ${e.config.backend} while running in nodejs`),e.config.backend="tensorflow"),w.browser&&e.config.backend==="webgpu")if(typeof navigator=="undefined"||typeof navigator.gpu=="undefined")b("override: backend set to webgpu but browser does not support webgpu"),e.config.backend="humangl";else{let A=await navigator.gpu.requestAdapter();e.config.debug&&b("enumerated webgpu adapter:",A)}e.config.backend==="humangl"&&await KA(e);let n=Object.keys(r.engine().registryFactory);if(e.config.debug&&b("available backends:",n),n.includes(e.config.backend)||(b(`error: backend ${e.config.backend} not found in registry`),e.config.backend=w.node?"tensorflow":"webgl",e.config.debug&&b(`override: setting backend ${e.config.backend}`)),e.config.debug&&b("setting backend:",e.config.backend),e.config.backend==="wasm"){if(e.config.debug&&b("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 A=await r.env().getAsync("WASM_HAS_SIMD_SUPPORT"),s=await r.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT");e.config.debug&&b(`wasm execution: ${A?"SIMD":"no SIMD"} ${s?"multithreaded":"singlethreaded"}`),e.config.debug&&!A&&b("warning: wasm simd support is not enabled")}try{await r.setBackend(e.config.backend),await r.ready(),Ho()}catch(A){return b("error: cannot set backend:",e.config.backend,A),!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&&(b("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",!0),r.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",0)),r.backend().getGPGPUContext)){let n=await r.backend().getGPGPUContext().gl;e.config.debug&&b(`gl version:${n.getParameter(n.VERSION)} renderer:${n.getParameter(n.RENDERER)}`)}r.getBackend(),r.enableProdMode(),await r.ready(),e.performance.initBackend=Math.trunc(g()-o),e.config.backend=r.getBackend(),await w.updateBackend(),B2()}return!0}function wt(e,t){for(let o of e){let n={kernelName:o,backendName:t.backend,kernelFunc:()=>{t.debug&&b("kernelFunc",o,t.backend)}};r.registerKernel(n)}w.kernels=r.getKernelsForBackend(r.getBackend()).map(o=>o.kernelName.toLowerCase())}var $A={};$0($A,{all:()=>fo,body:()=>Ee,canvas:()=>co,face:()=>ke,gesture:()=>Se,hand:()=>ze,object:()=>je,options:()=>n0,person:()=>xo});var n0={color:"rgba(173, 216, 230, 0.6)",labelColor:"rgba(173, 216, 230, 1)",shadowColor:"black",alpha:.5,font:'small-caps 16px "Segoe UI"',lineHeight:18,lineWidth:4,pointSize:2,roundRect:8,drawPoints:!1,drawLabels:!0,drawBoxes:!0,drawAttention:!0,drawGestures:!0,drawPolygons:!0,drawGaze:!0,fillPolygons:!1,useDepth:!0,useCurves:!1};var h0=e=>{if(!e)b("draw error: invalid canvas");else if(!e.getContext)b("draw error: canvas context not defined");else{let t=e.getContext("2d");if(!t)b("draw error: cannot get canvas context");else return t}return null},ie=e=>Math.round(e*180/Math.PI),j0=(e,t=[!0,!0,!1])=>{let o=t[0]?127+Math.trunc(3*e):255,n=t[1]?127-Math.trunc(3*e):255,A=t[2]?127-Math.trunc(3*e):255;return`rgba(${o}, ${n}, ${A}, ${n0.alpha})`};function le(e,t,o,n,A){n=n||0,e.fillStyle=A.useDepth&&n?j0(n,n===-255?[!0,!1,!0]:[!0,!1,!1]):A.color,e.beginPath(),e.arc(t,o,A.pointSize,0,2*Math.PI),e.fill()}function S0(e,t,o,n,A,s){if(e.beginPath(),e.lineWidth=s.lineWidth,s.useCurves){let a=(t+t+n)/2,i=(o+o+A)/2;e.ellipse(a,i,n/2,A/2,0,0,2*Math.PI)}else e.moveTo(t+s.roundRect,o),e.lineTo(t+n-s.roundRect,o),e.quadraticCurveTo(t+n,o,t+n,o+s.roundRect),e.lineTo(t+n,o+A-s.roundRect),e.quadraticCurveTo(t+n,o+A,t+n-s.roundRect,o+A),e.lineTo(t+s.roundRect,o+A),e.quadraticCurveTo(t,o+A,t,o+A-s.roundRect),e.lineTo(t,o+s.roundRect),e.quadraticCurveTo(t,o,t+s.roundRect,o),e.closePath();e.stroke()}function io(e,t,o){if(!(t.length<2)){e.beginPath(),e.moveTo(t[0][0],t[0][1]);for(let n of t){let A=n[2]||0;e.strokeStyle=o.useDepth&&A!==0?j0(A):o.color,e.fillStyle=o.useDepth&&A!==0?j0(A):o.color,e.lineTo(n[0],Math.round(n[1]))}e.stroke(),o.fillPolygons&&(e.closePath(),e.fill())}}function _A(e,t,o){if(!(t.length<2)){if(e.lineWidth=o.lineWidth,!o.useCurves||t.length<=2){io(e,t,o);return}e.moveTo(t[0][0],t[0][1]);for(let n=0;n0){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: ${ie(l.rotation.angle.roll)}\xB0 yaw:${ie(l.rotation.angle.yaw)}\xB0 pitch:${ie(l.rotation.angle.pitch)}\xB0`),l.rotation.gaze.bearing&&y.push(`gaze: ${ie(l.rotation.gaze.bearing)}\xB0`)),y.length===0&&y.push("face"),A.fillStyle=n.color;for(let c=y.length-1;c>=0;c--){let f=Math.max(l.box[0],0),h=c*n.lineHeight+l.box[1];n.shadowColor&&n.shadowColor!==""&&(A.fillStyle=n.shadowColor,A.fillText(y[c],f+5,h+16)),A.fillStyle=n.labelColor,A.fillText(y[c],f+4,h+15)}}if(A.lineWidth=2,l.mesh&&l.mesh.length>0){if(n.drawPoints){let y=Math.max(468,l.mesh.length);for(let c=0;c468)for(let y=468;y450)for(let y=0;yl.mesh[f]);io(A,c,n)}if(l.annotations&&l.annotations.leftEyeIris&&l.annotations.leftEyeIris[0]){A.strokeStyle=n.useDepth?"rgba(255, 200, 255, 0.3)":n.color,A.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;A.ellipse(l.annotations.leftEyeIris[0][0],l.annotations.leftEyeIris[0][1],y,c,0,0,2*Math.PI),A.stroke(),n.fillPolygons&&(A.fillStyle=n.useDepth?"rgba(255, 255, 200, 0.3)":n.color,A.fill())}if(l.annotations&&l.annotations.rightEyeIris&&l.annotations.rightEyeIris[0]){A.strokeStyle=n.useDepth?"rgba(255, 200, 255, 0.3)":n.color,A.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;A.ellipse(l.annotations.rightEyeIris[0][0],l.annotations.rightEyeIris[0][1],y,c,0,0,2*Math.PI),A.stroke(),n.fillPolygons&&(A.fillStyle=n.useDepth?"rgba(255, 255, 200, 0.3)":n.color,A.fill())}if(n.drawGaze&&((s=l.rotation)==null?void 0:s.angle)&&typeof Path2D!="undefined"){A.strokeStyle="pink";let y=l.box[0]+l.box[2]/2-l.box[3]*ie(l.rotation.angle.yaw)/90,c=l.box[1]+l.box[3]/2+l.box[2]*ie(l.rotation.angle.pitch)/90,f=new Path2D(` +`;var Dt=(e,t,o)=>{let n=new RegExp("\\b"+t+" \\w+ (\\w+)","ig");e.replace(n,(A,s)=>(o[s]=0,A))},Xt=class{constructor(t,o,n){k(this,"uniform",{});k(this,"attribute",{});k(this,"gl");k(this,"id");k(this,"compile",(t,o)=>{let n=this.gl.createShader(o);return n?(this.gl.shaderSource(n,t),this.gl.compileShader(n),this.gl.getShaderParameter(n,this.gl.COMPILE_STATUS)?n:(b(`filter: gl compile failed: ${this.gl.getShaderInfoLog(n)}`),null)):(b("filter: could not create shader"),null)});this.gl=t;let A=this.compile(o,this.gl.VERTEX_SHADER),s=this.compile(n,this.gl.FRAGMENT_SHADER);if(this.id=this.gl.createProgram(),!(!A||!s)){if(!this.id){b("filter: could not create webgl program");return}if(this.gl.attachShader(this.id,A),this.gl.attachShader(this.id,s),this.gl.linkProgram(this.id),!this.gl.getProgramParameter(this.id,this.gl.LINK_STATUS)){b(`filter: gl link failed: ${this.gl.getProgramInfoLog(this.id)}`);return}this.gl.useProgram(this.id),Dt(o,"attribute",this.attribute);for(let a in this.attribute)this.attribute[a]=this.gl.getAttribLocation(this.id,a);Dt(o,"uniform",this.uniform),Dt(n,"uniform",this.uniform);for(let a in this.uniform)this.uniform[a]=this.gl.getUniformLocation(this.id,a)}}};function Oo(){let e=0,t=null,o=!1,n=-1,A=[null,null],s=[],a=null,i=null,x=a0(100,100),d={},l={INTERMEDIATE:1},y=x.getContext("webgl");if(!y){b("filter: cannot get webgl context");return}this.gl=y;function c(u,p){if(!(u===x.width&&p===x.height)){if(x.width=u,x.height=p,!a){let P=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,P,y.STATIC_DRAW),y.pixelStorei(y.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0)}y.viewport(0,0,x.width,x.height),A=[null,null]}}function f(u,p){let P=y.createFramebuffer();y.bindFramebuffer(y.FRAMEBUFFER,P);let w=y.createRenderbuffer();y.bindRenderbuffer(y.RENDERBUFFER,w);let S=y.createTexture();return y.bindTexture(y.TEXTURE_2D,S),y.texImage2D(y.TEXTURE_2D,0,y.RGBA,u,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,S,0),y.bindTexture(y.TEXTURE_2D,null),y.bindFramebuffer(y.FRAMEBUFFER,null),{fbo:P,texture:S}}function h(u){return A[u]=A[u]||f(x.width,x.height),A[u]}function m(u=0){if(!i)return;let p=null,P=null,w=!1;e===0?p=t:p=h(n).texture||null,e++,o&&!(u&l.INTERMEDIATE)?(P=null,w=e%2===0):(n=(n+1)%2,P=h(n).fbo||null),y.bindTexture(y.TEXTURE_2D,p),y.bindFramebuffer(y.FRAMEBUFFER,P),y.uniform1f(i.uniform.flipY,w?-1:1),y.drawArrays(y.TRIANGLES,0,6)}function v(u){if(d[u])return i=d[u],y.useProgram((i?i.id:null)||null),i;if(i=new Xt(y,Eo,u),!i)return b("filter: could not get webgl program"),null;let p=Float32Array.BYTES_PER_ELEMENT,P=4*p;return y.enableVertexAttribArray(i.attribute.pos),y.vertexAttribPointer(i.attribute.pos,2,y.FLOAT,!1,P,0*p),y.enableVertexAttribArray(i.attribute.uv),y.vertexAttribPointer(i.attribute.uv,2,y.FLOAT,!1,P,2*p),d[u]=i,i}let M={colorMatrix:u=>{let p=new Float32Array(u);p[4]/=255,p[9]/=255,p[14]/=255,p[19]/=255;let P=p[18]===1&&p[3]===0&&p[8]===0&&p[13]===0&&p[15]===0&&p[16]===0&&p[17]===0&&p[19]===0?jo:zo,w=v(P);!w||(y.uniform1fv(w.uniform.m,p),m())},brightness:u=>{let p=(u||0)+1;M.colorMatrix([p,0,0,0,0,0,p,0,0,0,0,0,p,0,0,0,0,0,1,0])},saturation:u=>{let p=(u||0)*2/3+1,P=(p-1)*-.5;M.colorMatrix([p,P,P,0,0,P,p,P,0,0,P,P,p,0,0,0,0,0,1,0])},desaturate:()=>{M.saturation(-1)},contrast:u=>{let p=(u||0)+1,P=-128*(p-1);M.colorMatrix([p,0,0,0,P,0,p,0,0,P,0,0,p,0,P,0,0,0,1,0])},negative:()=>{M.contrast(-2)},hue:u=>{u=(u||0)/180*Math.PI;let p=Math.cos(u),P=Math.sin(u),w=.213,S=.715,O=.072;M.colorMatrix([w+p*(1-w)+P*-w,S+p*-S+P*-S,O+p*-O+P*(1-O),0,0,w+p*-w+P*.143,S+p*(1-S)+P*.14,O+p*-O+P*-.283,0,0,w+p*-w+P*-(1-w),S+p*-S+P*S,O+p*(1-O)+P*O,0,0,0,0,0,1,0])},desaturateLuminance:()=>{M.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:()=>{M.colorMatrix([.393,.7689999,.18899999,0,0,.349,.6859999,.16799999,0,0,.272,.5339999,.13099999,0,0,0,0,0,1,0])},brownie:()=>{M.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:()=>{M.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:()=>{M.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:()=>{M.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:()=>{M.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:()=>{M.colorMatrix([0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0])},convolution:u=>{let p=new Float32Array(u),P=1/x.width,w=1/x.height,S=v(Co);!S||(y.uniform1fv(S.uniform.m,p),y.uniform2f(S.uniform.px,P,w),m())},detectEdges:()=>{M.convolution.call(this,[0,1,0,1,-4,1,0,1,0])},sobelX:()=>{M.convolution.call(this,[-1,0,1,-2,0,2,-1,0,1])},sobelY:()=>{M.convolution.call(this,[-1,-2,-1,0,0,0,1,2,1])},sharpen:u=>{let p=u||1;M.convolution.call(this,[0,-1*p,0,-1*p,1+4*p,-1*p,0,-1*p,0])},emboss:u=>{let p=u||1;M.convolution.call(this,[-2*p,-1*p,0,-1*p,1,1*p,0,1*p,2*p])},blur:u=>{let p=u/7/x.width,P=u/7/x.height,w=v(Wo);!w||(y.uniform2f(w.uniform.px,0,P),m(l.INTERMEDIATE),y.uniform2f(w.uniform.px,p,0),m())},pixelate:u=>{let p=u/x.width,P=u/x.height,w=v(So);!w||(y.uniform2f(w.uniform.size,p,P),m())}};this.add=function(u){let p=Array.prototype.slice.call(arguments,1),P=M[u];s.push({func:P,args:p})},this.reset=function(){s=[]},this.get=function(){return s},this.apply=function(u){c(u.width,u.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,u);for(let p=0;pf.data())),a=.99*Math.max(s[0][0],s[1][0],s[2][0]),i=[r.sub(o[0],n[0]),r.sub(o[1],n[1]),r.sub(o[2],n[2])],x=[r.sub(A[0],n[0]),r.sub(A[1],n[1]),r.sub(A[2],n[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,...n,...A,...i,...x,...d,...l,y,t]),c}var tt=2048,F=null,_=null,de=null,X,I0={inputSum:0,cacheDiff:1,sumMethod:0,inputTensor:void 0};function a0(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 ot(e,t){let o=t||a0(e.width,e.height);return o.getContext("2d").drawImage(e,0,0),o}async function fe(e,t,o=!0){if(!e)return t.debug&&b("input error: input is missing"),{tensor:null,canvas:null};if(!(e instanceof ce)&&!(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 ce){let n=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)n=r.expandDims(e,0);else if(e.shape[2]===4){let A=r.slice3d(e,[0,0,0],[-1,-1,3]);n=r.expandDims(A,0),r.dispose(A)}}else e.shape.length===4&&(e.shape[3]===3?n=r.clone(e):e.shape[3]===4&&(n=r.slice4d(e,[0,0,0,0],[-1,-1,-1,3])));if(n==null||n.shape.length!==4||n.shape[0]!==1||n.shape[3]!==3)throw new Error(`input error: attempted to use tensor with unrecognized shape: ${e.shape}`);if(n.dtype==="int32"){let A=r.cast(n,"float32");r.dispose(n),n=A}return{tensor:n,canvas:t.filter.return?_:null}}else{if(typeof e.readyState!="undefined"&&e.readyState<=2)return t.debug&&b("input stream is not ready"),{tensor:null,canvas:F};let n=e.naturalWidth||e.videoWidth||e.width||e.shape&&e.shape[1]>0,A=e.naturalHeight||e.videoHeight||e.height||e.shape&&e.shape[2]>0;if(!n||!A)return t.debug&&b("cannot determine input dimensions"),{tensor:null,canvas:F};let s=n,a=A;if(s>tt&&(s=tt,a=Math.trunc(s*A/n)),a>tt&&(a=tt,s=Math.trunc(a*n/A)),(t.filter.width||0)>0?s=t.filter.width:(t.filter.height||0)>0&&(s=n*((t.filter.height||0)/A)),(t.filter.height||0)>0?a=t.filter.height:(t.filter.width||0)>0&&(a=A*((t.filter.width||0)/n)),!s||!a)throw new Error("input error: cannot determine dimension");(!F||(F==null?void 0:F.width)!==s||(F==null?void 0:F.height)!==a)&&(F=a0(s,a));let i=F.getContext("2d");if(typeof ImageData!="undefined"&&e instanceof ImageData?i.putImageData(e,0,0):t.filter.flip&&typeof i.translate!="undefined"?(i.translate(n,0),i.scale(-1,1),i.drawImage(e,0,0,n,A,0,0,F==null?void 0:F.width,F==null?void 0:F.height),i.setTransform(1,0,0,1,0,0)):i.drawImage(e,0,0,n,A,0,0,F==null?void 0:F.width,F==null?void 0:F.height),(!_||F.width!==_.width||(F==null?void 0:F.height)!==(_==null?void 0:_.height))&&(_=a0(F.width,F.height)),t.filter.enabled&&R.webgl.supported?(X||(X=R.browser?new Oo:null),R.filter=!!X,!X||!X.add?(t.debug&&b("input process error: cannot initialize filters"),R.webgl.supported=!1,t.filter.enabled=!1,ot(F,_)):(X.reset(),t.filter.brightness!==0&&X.add("brightness",t.filter.brightness),t.filter.contrast!==0&&X.add("contrast",t.filter.contrast),t.filter.sharpness!==0&&X.add("sharpen",t.filter.sharpness),t.filter.blur!==0&&X.add("blur",t.filter.blur),t.filter.saturation!==0&&X.add("saturation",t.filter.saturation),t.filter.hue!==0&&X.add("hue",t.filter.hue),t.filter.negative&&X.add("negative"),t.filter.sepia&&X.add("sepia"),t.filter.vintage&&X.add("brownie"),t.filter.sepia&&X.add("sepia"),t.filter.kodachrome&&X.add("kodachrome"),t.filter.technicolor&&X.add("technicolor"),t.filter.polaroid&&X.add("polaroid"),t.filter.pixelate!==0&&X.add("pixelate",t.filter.pixelate),X.get()>0?_=X.apply(F):_=X.draw(F))):(ot(F,_),X&&(X=null),R.filter=!!X),!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((!de||_.width!==de.width||_.height!==de.height)&&(de=a0(_.width,_.height)),r.browser&&R.browser)t.backend==="webgl"||t.backend==="humangl"||t.backend==="webgpu"?x=r.browser.fromPixels(_):(de=ot(_),x=r.browser.fromPixels(de));else{let h=ot(_).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 et(l):r.expandDims(l,0);return r.dispose([x,l]),{tensor:y,canvas:t.filter.return?_:null}}}async function Io(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(!I0.inputTensor)I0.inputTensor=r.clone(t);else if(I0.inputTensor.shape[1]!==t.shape[1]||I0.inputTensor.shape[2]!==t.shape[2])r.dispose(I0.inputTensor),I0.inputTensor=r.clone(t);else{let n={};n.diff=r.sub(t,I0.inputTensor),n.squared=r.mul(n.diff,n.diff),n.sum=r.sum(n.squared);let s=(await n.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;r.dispose([I0.inputTensor,n.diff,n.squared,n.sum]),I0.inputTensor=r.clone(t),o=s<=(e.cacheSensitivity||0)}return o}async function Lo(e,t,o){let n={};if(!t||!o||t.shape.length!==4||t.shape.length!==o.shape.length)return e.debug||b("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||b("input tensors must be of shape [1, height, width, 3]:",t.shape,o.shape),0;n.input1=r.clone(t),n.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),n.diff=r.sub(n.input1,n.input2),n.squared=r.mul(n.diff,n.diff),n.sum=r.sum(n.squared);let s=(await n.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;return r.dispose([n.input1,n.input2,n.diff,n.squared,n.sum]),s}var qt=class{constructor(){k(this,"browser");k(this,"node");k(this,"worker");k(this,"platform","");k(this,"agent","");k(this,"backends",[]);k(this,"initial");k(this,"filter");k(this,"tfjs");k(this,"offscreen");k(this,"perfadd",!1);k(this,"wasm",{supported:void 0,backend:void 0,simd:void 0,multithread:void 0});k(this,"webgl",{supported:void 0,backend:void 0,version:void 0,renderer:void 0});k(this,"webgpu",{supported:void 0,backend:void 0,adapter:void 0});k(this,"cpu",{model:void 0,flags:[]});k(this,"kernels",[]);k(this,"Canvas");k(this,"Image");k(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:Fe["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=a0(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 n=r.backend().gpgpu!=="undefined"?await r.backend().getGPGPUContext().gl:null;n&&(this.webgl.version=n.getParameter(n.VERSION),this.webgl.renderer=n.getParameter(n.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(n){this.webgpu.supported=!1}try{this.kernels=r.getKernelsForBackend(r.getBackend()).map(n=>n.kernelName.toLowerCase())}catch(n){}}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 qt;var L0={cacheModels:!1,verbose:!0,debug:!1,modelBasePath:""};async function Er(e,t){return L0.debug&&b("load model fetch:",e,t),fetch(e,t)}function No(e){L0.cacheModels=e.cacheModels,L0.verbose=e.debug,L0.modelBasePath=e.modelBasePath}async function L(e){let t=ko(L0.modelBasePath,e||""),o=t.split("/"),n="indexeddb://"+o[o.length-1].replace(".json",""),A=await r.io.listModels(),s=L0.cacheModels&&Object.keys(A).includes(n),a=typeof fetch=="undefined"?{}:{fetchFunc:(d,l)=>Er(d,l)},i=new Zt(s?n:t,a),x=!1;try{i.findIOHandler(),L0.debug&&b("model load handler:",i.handler);let d=await i.handler.load();i.loadSync(d),L0.verbose&&b("load model:",i.modelUrl),x=!0}catch(d){b("error loading model:",t,d)}if(x&&L0.cacheModels&&!s)try{let d=await i.save(n);b("model saved:",n,d)}catch(d){b("error saving model:",t,d)}return i}var Ut="2.7.0";var io={};ee(io,{Models:()=>Ke,load:()=>so,reset:()=>Lt,validate:()=>ao});var b0,Jt=[],Sr=["white","black","asian","indian","other"],Wr=[15,23,28,35.5,45.5,55.5,65],Go=0,Bo=0,Yt=Number.MAX_SAFE_INTEGER;async function Fo(e){return R.initial&&(b0=null),b0?e.debug&&b("cached model:",b0.modelUrl):b0=await L(e.face.gear),b0}async function Kt(e,t,o,n){var a,i;if(!b0)return{age:0,gender:"unknown",genderScore:0,race:[]};let A=Yt<(((a=t.face.gear)==null?void 0:a.skipFrames)||0),s=(((i=t.face.gear)==null?void 0:i.skipTime)||0)>g()-Bo;return t.skipAllowed&&s&&A&&Go===n&&Jt[o]?(Yt++,Jt[o]):(Yt=0,new Promise(async x=>{var M,u;if(!(b0!=null&&b0.inputs[0].shape))return;let d={},l=[[0,.1,.9,.9]];d.resize=r.image.cropAndResize(e,l,[0],[b0.inputs[0].shape[2],b0.inputs[0].shape[1]]);let y={age:0,gender:"unknown",genderScore:0,race:[]};(M=t.face.gear)!=null&&M.enabled&&([d.age,d.gender,d.race]=b0.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(((u=t.face.gear)==null?void 0:u.minConfidence)||.2)&&y.race.push({score:Math.round(100*f[p])/100,race:Sr[p]});y.race.sort((p,P)=>P.score-p.score);let m=Array.from(await d.age.data()).map((p,P)=>[Wr[P],p]).sort((p,P)=>P[1]-p[1]),v=m[0][0];for(let p=1;pr.dispose(d[p])),Jt[o]=y,Go=n,Bo=g(),x(y)}))}var N={tf255:255,tf1:1,tf2:2,tf05:.5,tf127:127.5,rgb:[.2989,.587,.114]};function Vo(){N.tf255=r.scalar(255,"float32"),N.tf1=r.scalar(1,"float32"),N.tf2=r.scalar(2,"float32"),N.tf05=r.scalar(.5,"float32"),N.tf127=r.scalar(127.5,"float32"),N.rgb=r.tensor1d([.2989,.587,.114],"float32")}var y0,nt=[],Zo=0,Do=0,Qt=Number.MAX_SAFE_INTEGER;async function Xo(e){return R.initial&&(y0=null),y0?e.debug&&b("cached model:",y0.modelUrl):y0=await L(e.face.ssrnet.modelPathAge),y0}async function _t(e,t,o,n){var a,i,x,d;if(!y0)return{age:0};let A=Qt<(((a=t.face.ssrnet)==null?void 0:a.skipFrames)||0),s=(((i=t.face.ssrnet)==null?void 0:i.skipTime)||0)>g()-Do;return t.skipAllowed&&A&&s&&Zo===n&&((x=nt[o])==null?void 0:x.age)&&((d=nt[o])==null?void 0:d.age)>0?(Qt++,nt[o]):(Qt=0,new Promise(async l=>{if(!(y0!=null&&y0.inputs)||!y0.inputs[0]||!y0.inputs[0].shape)return;let y={};y.resize=r.image.resizeBilinear(e,[y0.inputs[0].shape[2],y0.inputs[0].shape[1]],!1),y.enhance=r.mul(y.resize,N.tf255);let c={age:0};if(t.face.ssrnet.enabled&&(y.age=y0.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])),nt[o]=c,Zo=n,Do=g(),l(c)}))}var g0,At=[],Uo=0,Jo=0,$t=Number.MAX_SAFE_INTEGER,e5=[.2989,.587,.114];async function Yo(e){return R.initial&&(g0=null),g0?e.debug&&b("cached model:",g0.modelUrl):g0=await L(e.face.ssrnet.modelPathGender),g0}async function t5(e,t,o,n){var a,i,x,d;if(!g0)return{gender:"unknown",genderScore:0};let A=$t<(((a=t.face.ssrnet)==null?void 0:a.skipFrames)||0),s=(((i=t.face.ssrnet)==null?void 0:i.skipTime)||0)>g()-Jo;return t.skipAllowed&&A&&s&&Uo===n&&((x=At[o])==null?void 0:x.gender)&&((d=At[o])==null?void 0:d.genderScore)>0?($t++,At[o]):($t=0,new Promise(async l=>{if(!(g0!=null&&g0.inputs[0].shape))return;let y={};y.resize=r.image.resizeBilinear(e,[g0.inputs[0].shape[2],g0.inputs[0].shape[1]],!1),y.enhance=r.tidy(()=>{let[h,m,v]=r.split(y.resize,3,3),M=r.mul(h,e5[0]),u=r.mul(m,e5[1]),p=r.mul(v,e5[2]),P=r.addN([M,u,p]);return r.mul(r.sub(P,N.tf05),2)});let c={gender:"unknown",genderScore:0};t.face.ssrnet.enabled&&(y.gender=g0.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])),At[o]=c,Uo=n,Jo=g(),l(c)}))}var A0,rt=[],o5=Number.MAX_SAFE_INTEGER,Qo=0,_o=0;async function $o(e){var t;return R.initial&&(A0=null),A0?e.debug&&b("cached model:",A0.modelUrl):A0=await L((t=e.face.antispoof)==null?void 0:t.modelPath),A0}async function n5(e,t,o,n){var a,i;if(!A0)return 0;let A=(((a=t.face.antispoof)==null?void 0:a.skipTime)||0)>g()-_o,s=o5<(((i=t.face.antispoof)==null?void 0:i.skipFrames)||0);return t.skipAllowed&&A&&s&&Qo===n&&rt[o]?(o5++,rt[o]):(o5=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];rt[o]=Math.round(100*y)/100,Qo=n,_o=g(),r.dispose([d,l]),x(rt[o])}))}var M0={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]},A5={count:468,mouth:13,symmetryLine:[13,M0.midwayBetweenEyes[0]]},Ve={leftEye:0,rightEye:1,nose:2,mouth:3,leftEar:4,rightEar:5,symmetryLine:[3,2]},r5=[{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]},{key:"EyebrowUpper",indices:[63,64,65,66,67,68,69,70]},{key:"EyebrowLower",indices:[48,49,50,51,52,53]}],Ze=[[.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]],oe=[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 Or=[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],Ir=[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],Lr=[33,133,362,263,1,78,308],zs=Or.map(e=>Ze[e]),js=Ir.map(e=>Ze[e]),Ss=Lr.map(e=>Ze[e]);var me=e=>[Math.abs(e.endPoint[0]-e.startPoint[0]),Math.abs(e.endPoint[1]-e.startPoint[1])],st=e=>[e.startPoint[0]+(e.endPoint[0]-e.startPoint[0])/2,e.startPoint[1]+(e.endPoint[1]-e.startPoint[1])/2,1],l5=(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],y5=(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],nn=(e,t)=>{let o=[e.startPoint[0]*t[0],e.startPoint[1]*t[1]],n=[e.endPoint[0]*t[0],e.endPoint[1]*t[1]];return{startPoint:o,endPoint:n,landmarks:e.landmarks,confidence:e.confidence}},a5=(e,t,o)=>{let n=t.shape[1],A=t.shape[2],s=[e.startPoint[1]/n,e.startPoint[0]/A,e.endPoint[1]/n,e.endPoint[0]/A],a=r.image.cropAndResize(t,[s],[0],o),i=r.div(a,N.tf255);return r.dispose(a),i},at=(e,t)=>{let o=st(e),n=me(e),A=[t*n[0]/2,t*n[1]/2];return{startPoint:[o[0]-A[0],o[1]-A[1]],endPoint:[o[0]+A[0],o[1]+A[1]],landmarks:e.landmarks,confidence:e.confidence}},it=e=>{let t=st(e),o=me(e),n=Math.max(...o)/2;return{startPoint:[Math.round(t[0]-n),Math.round(t[1]-n)],endPoint:[Math.round(t[0]+n),Math.round(t[1]+n)],landmarks:e.landmarks,confidence:e.confidence}},An=e=>{let t=e.map(n=>n[0]),o=e.map(n=>n[1]);return{startPoint:[Math.min(...t),Math.min(...o)],endPoint:[Math.max(...t),Math.max(...o)],landmarks:e}},i5=[[1,0,0],[0,1,0],[0,0,1]],Nr=e=>e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI)),Gr=(e,t)=>Nr(Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]));var tn=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]],ne=(e,t)=>{let o=0;for(let n=0;n{let o=[];for(let n=0;n{let o=[],n=e.length;for(let A=0;A{let o=Math.cos(e),n=Math.sin(e),A=[[o,-n,0],[n,o,0],[0,0,1]],s=tn(t[0],t[1]),a=on(s,A),i=tn(-t[0],-t[1]);return on(a,i)},Fr=e=>{let t=[[e[0][0],e[1][0]],[e[0][1],e[1][1]]],o=[e[0][2],e[1][2]],n=[-ne(t[0],o),-ne(t[1],o)];return[t[0].concat(n[0]),t[1].concat(n[1]),[0,0,1]]},Hr=(e,t)=>[ne(e,t[0]),ne(e,t[1])];function sn(e){let t={strides:[e/16,e/8],anchors:[2,6]},o=[];for(let n=0;n[s[0]/A*(f[0]-A/2),s[1]/A*(f[1]-A/2),f[2]||0]),i=o&&o!==0&&Math.abs(o)>.2,x=i?rn(o,[0,0]):i5,d=i?a.map(f=>[...Hr(f,x),f[2]]):a,l=i?Fr(n):i5,y=st(t),c=[ne(y,l[0]),ne(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 ln(e,t,o,n){let A=t.landmarks.length>=A5.count?A5.symmetryLine:Ve.symmetryLine,s=0,a=i5,i;if(e&&R.kernels.includes("rotatewithoffset"))if(s=Gr(t.landmarks[A[0]],t.landmarks[A[1]]),s&&s!==0&&Math.abs(s)>.2){let d=st(t),l=[d[0]/o.shape[2],d[1]/o.shape[1]],y=r.image.rotateWithOffset(o,s,0,l);a=rn(-s,d),i=a5(t,y,[n,n]),r.dispose(y)}else i=a5(t,o,[n,n]);else i=a5(t,o,[n,n]);return[s,a,i]}var Vr=e=>{let t=e.map(n=>n[0]),o=e.map(n=>n[1]);return[Math.min(...t)+(Math.max(...t)-Math.min(...t))/2,Math.min(...o)+(Math.max(...o)-Math.min(...o))/2]},yn=(e,t)=>{let o=Vr(e),n=me(t);return{startPoint:[o[0]-n[0]/2,o[1]-n[1]/2],endPoint:[o[0]+n[0]/2,o[1]+n[1]/2]}};var xn=6,Zr=1.4,k0,cn=null,Z0=0,De=null,lt=()=>Z0;async function dn(e){var t;return R.initial&&(k0=null),k0?e.debug&&b("cached model:",k0.modelUrl):k0=await L((t=e.face.detector)==null?void 0:t.modelPath),Z0=k0.inputs[0].shape?k0.inputs[0].shape[2]:0,De=r.scalar(Z0,"int32"),cn=r.tensor2d(sn(Z0)),k0}function Dr(e){let t={};t.boxStarts=r.slice(e,[0,1],[-1,2]),t.centers=r.add(t.boxStarts,cn),t.boxSizes=r.slice(e,[0,3],[-1,2]),t.boxSizesNormalized=r.div(t.boxSizes,De),t.centersNormalized=r.div(t.centers,De),t.halfBoxSize=r.div(t.boxSizesNormalized,N.tf2),t.starts=r.sub(t.centersNormalized,t.halfBoxSize),t.ends=r.add(t.centersNormalized,t.halfBoxSize),t.startNormalized=r.mul(t.starts,De),t.endNormalized=r.mul(t.ends,De);let o=r.concat2d([t.startNormalized,t.endNormalized],1);return Object.keys(t).forEach(n=>r.dispose(t[n])),o}async function fn(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,[Z0,Z0]),o.div=r.div(o.resized,N.tf127),o.normalized=r.sub(o.div,N.tf05);let n=k0==null?void 0:k0.execute(o.normalized);if(Array.isArray(n)){let y=n.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(n);r.dispose(n),o.boxes=Dr(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 A=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,[A[y],0],[1,-1]),f.slice=r.slice(o.batch,[A[y],xn-1],[1,-1]),f.squeeze=r.squeeze(f.slice),f.landmarks=r.reshape(f.squeeze,[xn,-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=nn(m,[(e.shape[2]||0)/Z0,(e.shape[1]||0)/Z0]),M=at(v,t.face.scale||Zr),u=it(M);s.push(u),Object.keys(f).forEach(p=>r.dispose(f[p]))}}return Object.keys(o).forEach(y=>r.dispose(o[y])),s}var yt={};ee(yt,{connected:()=>d5,kpt:()=>c5});var c5=["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"],d5={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 pn=224,Xr,qr=5,xt=[8,16,32,32,32];async function un(){let e=[],t=0;for(;to.x)),y:r.tensor1d(e.map(o=>o.y))}}function N0(e,t=[1,1]){let o=[e.map(i=>i[0]),e.map(i=>i[1])],n=[Math.min(...o[0]),Math.min(...o[1])],A=[Math.max(...o[0]),Math.max(...o[1])],s=[n[0],n[1],A[0]-n[0],A[1]-n[1]],a=[s[0]/t[0],s[1]/t[1],s[2]/t[0],s[3]/t[1]];return{box:s,boxRaw:a}}function hn(e,t=[1,1]){let o=[e.map(d=>d[0]),e.map(d=>d[1])],n=[Math.min(...o[0]),Math.min(...o[1])],A=[Math.max(...o[0]),Math.max(...o[1])],s=[(n[0]+A[0])/2,(n[1]+A[1])/2],a=Math.max(s[0]-n[0],s[1]-n[1],-s[0]+A[0],-s[1]+A[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 ct(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 Mn={initial:!0},x0={detector:null,landmarks:null},pe={detector:[224,224],landmarks:[256,256]},f5=Number.MAX_SAFE_INTEGER,Jr={landmarks:["ld_3d","activation_segmentation","activation_heatmap","world_3d","output_poseflag"],detector:[]},ft=null,Xe,D0=[[0,0],[0,0],[0,0],[0,0]],bn=0,gn=e=>1-1/(1+Math.exp(e));async function Pn(e){if(Mn.initial&&(x0.detector=null),!x0.detector&&e.body.detector&&e.body.detector.modelPath){x0.detector=await L(e.body.detector.modelPath);let t=Object.values(x0.detector.modelSignature.inputs);pe.detector[0]=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0,pe.detector[1]=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):0}else e.debug&&x0.detector&&b("cached model:",x0.detector.modelUrl);return await un(),x0.detector}async function vn(e){if(Mn.initial&&(x0.landmarks=null),x0.landmarks)e.debug&&b("cached model:",x0.landmarks.modelUrl);else{x0.landmarks=await L(e.body.modelPath);let t=Object.values(x0.landmarks.modelSignature.inputs);pe.landmarks[0]=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0,pe.landmarks[1]=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):0}return x0.landmarks}async function Yr(e,t){let o={};if(!e.shape||!e.shape[1]||!e.shape[2])return e;let n;if(Xe&&(o.cropped=r.image.cropAndResize(e,[Xe],[0],[e.shape[1],e.shape[2]])),e.shape[1]!==e.shape[2]){let A=[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];D0=[[0,0],A,s,[0,0]],o.pad=r.pad(o.cropped||e,D0),o.resize=r.image.resizeBilinear(o.pad,[t,t]),n=r.div(o.resize,N.tf255)}else e.shape[1]!==t?(o.resize=r.image.resizeBilinear(o.cropped||e,[t,t]),n=r.div(o.resize,N.tf255)):n=r.div(o.cropped||e,N.tf255);return Object.keys(o).forEach(A=>r.dispose(o[A])),n}function Kr(e,t){for(let o of e)o.position=[Math.trunc(o.position[0]*(t[0]+D0[2][0]+D0[2][1])/t[0]-D0[2][0]),Math.trunc(o.position[1]*(t[1]+D0[1][0]+D0[1][1])/t[1]-D0[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(Xe)for(let o of e)o.positionRaw=[o.positionRaw[0]+Xe[1],o.positionRaw[1]+Xe[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 Qr(e){let t=e.find(i=>i.part==="leftPalm"),o=e.find(i=>i.part==="leftWrist"),n=e.find(i=>i.part==="leftIndex");t.position[2]=((o.position[2]||0)+(n.position[2]||0))/2;let A=e.find(i=>i.part==="rightPalm"),s=e.find(i=>i.part==="rightWrist"),a=e.find(i=>i.part==="rightIndex");A.position[2]=((s.position[2]||0)+(a.position[2]||0))/2}async function _r(e,t,o){var h;let n={};[n.ld,n.segmentation,n.heatmap,n.world,n.poseflag]=(h=x0.landmarks)==null?void 0:h.execute(e,Jr.landmarks);let A=(await n.poseflag.data())[0],s=await n.ld.data(),a=await n.world.data();Object.keys(n).forEach(m=>r.dispose(n[m]));let i=[],x=5;for(let m=0;mm.position),y=N0(l,[o[0],o[1]]),c={};for(let[m,v]of Object.entries(d5)){let M=[];for(let u=0;uw.part===v[u]),P=d.find(w=>w.part===v[u+1]);p&&P&&M.push([p.position,P.position])}c[m]=M}return{id:0,score:Math.trunc(100*A)/100,box:y.box,boxRaw:y.boxRaw,keypoints:d,annotations:c}}async function m5(e,t){let o=[e.shape[2]||0,e.shape[1]||0],n=(t.body.skipTime||0)>g()-bn,A=f5<(t.body.skipFrames||0);if(t.skipAllowed&&n&&A&&ft!==null)f5++;else{let s={};s.landmarks=await Yr(e,256),ft=await _r(s.landmarks,t,o),Object.keys(s).forEach(a=>r.dispose(s[a])),bn=g(),f5=0}return ft?[ft]:[]}var ue=[{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 G0,Ae=0,p5=[],Rn=0,u5=Number.MAX_SAFE_INTEGER;async function wn(e){if(R.initial&&(G0=null),G0)e.debug&&b("cached model:",G0.modelUrl);else{G0=await L(e.object.modelPath);let t=Object.values(G0.modelSignature.inputs);Ae=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):0}return G0}async function $r(e,t,o){if(!e)return[];let n={},A=[],s=await e.array();n.squeeze=r.squeeze(e);let a=r.split(n.squeeze,6,1);n.stack=r.stack([a[1],a[0],a[3],a[2]],1),n.boxes=r.squeeze(n.stack),n.scores=r.squeeze(a[4]),n.classes=r.squeeze(a[5]),r.dispose([e,...a]),n.nms=await r.image.nonMaxSuppressionAsync(n.boxes,n.scores,o.object.maxDetected,o.object.iouThreshold,o.object.minConfidence||0);let i=await n.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=ue[y].label,[f,h]=[s[0][d][0]/Ae,s[0][d][1]/Ae],m=[f,h,s[0][d][2]/Ae-f,s[0][d][3]/Ae-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])];A.push({id:x++,score:l,class:y,label:c,box:v,boxRaw:m})}return Object.keys(n).forEach(d=>r.dispose(n[d])),A}async function h5(e,t){let o=(t.object.skipTime||0)>g()-Rn,n=u5<(t.object.skipFrames||0);return t.skipAllowed&&o&&n&&p5.length>0?(u5++,p5):(u5=0,new Promise(async A=>{let s=[e.shape[2]||0,e.shape[1]||0],a=r.image.resizeBilinear(e,[Ae,Ae]),i=t.object.enabled?G0==null?void 0:G0.execute(a,["tower_0/detections"]):null;Rn=g(),r.dispose(a);let x=await $r(i,s,t);p5=x,A(x)}))}var mt={};ee(mt,{connected:()=>g5,kpt:()=>b5});var b5=["head","neck","rightShoulder","rightElbow","rightWrist","chest","leftShoulder","leftElbow","leftWrist","bodyCenter","rightHip","rightKnee","rightAnkle","leftHip","leftKnee","leftAnkle"],g5={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var r0,En=0,i0={id:0,keypoints:[],box:[0,0,0,0],boxRaw:[0,0,0,0],score:0,annotations:{}},M5=Number.MAX_SAFE_INTEGER;async function zn(e){return R.initial&&(r0=null),r0?e.debug&&b("cached model:",r0.modelUrl):r0=await L(e.body.modelPath),r0}async function e2(e,t){let[o,n]=e.shape,A=r.reshape(e,[n*o]),s=r.max(A,0),a=(await s.data())[0];if(r.dispose([A,s]),a>t){let i=r.argMax(A,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 P5(e,t){let o=(t.body.skipTime||0)>g()-En,n=M5<(t.body.skipFrames||0);return t.skipAllowed&&o&&n&&Object.keys(i0.keypoints).length>0?(M5++,[i0]):(M5=0,new Promise(async A=>{var y;let s=r.tidy(()=>{if(!(r0!=null&&r0.inputs[0].shape))return null;let c=r.image.resizeBilinear(e,[r0.inputs[0].shape[2],r0.inputs[0].shape[1]],!1),f=r.mul(c,N.tf2);return r.sub(f,N.tf1)}),a;if(t.body.enabled&&(a=r0==null?void 0:r0.execute(s)),En=g(),r.dispose(s),a){i0.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)&&i0.keypoints.push({score:Math.round(100*M)/100,part:b5[h],positionRaw:[m/r0.inputs[0].shape[2],v/r0.inputs[0].shape[1]],position:[Math.round(e.shape[2]*m/r0.inputs[0].shape[2]),Math.round(e.shape[1]*v/r0.inputs[0].shape[1])]})}f.forEach(h=>r.dispose(h))}i0.score=i0.keypoints.reduce((c,f)=>f.score>c?f.score:c,0);let i=i0.keypoints.map(c=>c.position[0]),x=i0.keypoints.map(c=>c.position[1]);i0.box=[Math.min(...i),Math.min(...x),Math.max(...i)-Math.min(...i),Math.max(...x)-Math.min(...x)];let d=i0.keypoints.map(c=>c.positionRaw[0]),l=i0.keypoints.map(c=>c.positionRaw[1]);i0.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(g5)){let h=[];for(let m=0;mu.part===f[m]),M=i0.keypoints.find(u=>u.part===f[m+1]);v&&M&&v.score>(t.body.minConfidence||0)&&M.score>(t.body.minConfidence||0)&&h.push([v.position,M.position])}i0.annotations[c]=h}A([i0])}))}var t2=["angry","disgust","fear","happy","sad","surprise","neutral"],u0,pt=[],Sn=0,Wn=0,v5=Number.MAX_SAFE_INTEGER;async function Cn(e){var t;return R.initial&&(u0=null),u0?e.debug&&b("cached model:",u0.modelUrl):u0=await L((t=e.face.emotion)==null?void 0:t.modelPath),u0}async function T5(e,t,o,n){var a,i;if(!u0)return[];let A=v5<(((a=t.face.emotion)==null?void 0:a.skipFrames)||0),s=(((i=t.face.emotion)==null?void 0:i.skipTime)||0)>g()-Wn;return t.skipAllowed&&s&&A&&Sn===n&&pt[o]&&pt[o].length>0?(v5++,pt[o]):(v5=0,new Promise(async x=>{var l,y;let d=[];if((l=t.face.emotion)!=null&&l.enabled){let c={},f=u0!=null&&u0.inputs[0].shape?u0.inputs[0].shape[2]:0;c.resize=r.image.resizeBilinear(e,[f,f],!1),c.channels=r.mul(c.resize,N.rgb),c.grayscale=r.sum(c.channels,3,!0),c.grayscaleSub=r.sub(c.grayscale,N.tf05),c.grayscaleMul=r.mul(c.grayscaleSub,N.tf2),c.emotion=u0==null?void 0:u0.execute(c.grayscaleMul),Wn=g();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:t2[m]});d.sort((m,v)=>v.score-m.score),Object.keys(c).forEach(m=>r.dispose(c[m]))}pt[o]=d,Sn=n,x(d)}))}var c0,R5=[],In=0,Ln=0,Nn=Number.MAX_SAFE_INTEGER;async function Gn(e){return R.initial&&(c0=null),c0?e.debug&&b("cached model:",c0.modelUrl):c0=await L(e.face.mobilefacenet.modelPath),c0}async function w5(e,t,o,n){var a,i;if(!c0)return[];let A=Nn<(((a=t.face.embedding)==null?void 0:a.skipFrames)||0),s=(((i=t.face.embedding)==null?void 0:i.skipTime)||0)>g()-Ln;return t.skipAllowed&&s&&A&&In===n&&R5[o]?(Nn++,R5[o]):new Promise(async x=>{var l;let d=[];if(((l=t.face.embedding)==null?void 0:l.enabled)&&(c0==null?void 0:c0.inputs[0].shape)){let y={};y.crop=r.image.resizeBilinear(e,[c0.inputs[0].shape[2],c0.inputs[0].shape[1]],!1),y.data=c0==null?void 0:c0.execute(y.crop);let c=await y.data.data();d=Array.from(c)}R5[o]=d,In=n,Ln=g(),x(d)})}var B0,X0=0,o2=2.3,k5=M0.leftEyeLower0,E5=M0.rightEyeLower0,he={leftBounds:[k5[0],k5[k5.length-1]],rightBounds:[E5[0],E5[E5.length-1]]},be={upperCenter:3,lowerCenter:4,index:71,numCoordinates:76};async function Zn(e){var t;return R.initial&&(B0=null),B0?e.debug&&b("cached model:",B0.modelUrl):B0=await L((t=e.face.iris)==null?void 0:t.modelPath),X0=B0.inputs[0].shape?B0.inputs[0].shape[2]:0,X0===-1&&(X0=64),B0}function ut(e,t,o,n){for(let A=0;A{let t=e[he.leftBounds[0]][2],o=e[he.rightBounds[0]][2];return t-o},Fn=(e,t,o,n,A,s=!1)=>{let a=it(at(An([e[o],e[n]]),o2)),i=me(a),x=r.image.cropAndResize(t,[[a.startPoint[1]/A,a.startPoint[0]/A,a.endPoint[1]/A,a.endPoint[0]/A]],[0],[X0,X0]);if(s&&R.kernels.includes("flipleftright")){let d=r.image.flipLeftRight(x);r.dispose(x),x=d}return{box:a,boxSize:i,crop:x}},Hn=(e,t,o,n=!1)=>{let A=[];for(let s=0;s{let n=e[M0[`${o}EyeUpper0`][be.upperCenter]][2],A=e[M0[`${o}EyeLower0`][be.lowerCenter]][2],s=(n+A)/2;return t.map((a,i)=>{let x=s;return i===2?x=n:i===4&&(x=A),[a[0],a[1],x]})};async function Dn(e,t,o,n){if(!B0)return o.debug&&b("face mesh iris detection requested, but model is not loaded"),e;let{box:A,boxSize:s,crop:a}=Fn(e,t,he.leftBounds[0],he.leftBounds[1],n,!0),{box:i,boxSize:x,crop:d}=Fn(e,t,he.rightBounds[0],he.rightBounds[1],n,!0),l=r.concat([a,d]);r.dispose(a),r.dispose(d);let y=B0.execute(l);r.dispose(l);let c=await y.data();r.dispose(y);let f=c.slice(0,be.numCoordinates*3),{rawCoords:h,iris:m}=Hn(f,A,s,!0),v=c.slice(be.numCoordinates*3),{rawCoords:M,iris:u}=Hn(v,i,x,!1),p=n2(e);Math.abs(p)<30?(ut(e,h,"left",null),ut(e,M,"right",null)):p<1?ut(e,h,"left",["EyeUpper0","EyeLower0"]):ut(e,M,"right",["EyeUpper0","EyeLower0"]);let P=Vn(e,m,"left"),w=Vn(e,u,"right");return e.concat(P).concat(w)}var q0={eyeLLower:[33,7,163,144,145,153,154,155,133],eyeRLower:[263,249,390,373,374,380,381,382,362],lips:[61,76,91,181,84,17,314,405,321,291,291,185,40,39,37,0,267,269,270,291,62,183,88,178,87,14,268,303,304,408,291,184,42,178,87,14,268,303,304,408,61,62,90,180,85,16,315,404,307,308,291,185,40,73,72,0,302,269,270,409,61,184,95,179,86,15,316,403,324,408,291,184,74,41,38,11,268,303,304,408],eyeL:[33,7,163,144,145,153,154,155,133,246,161,160,159,158,157,173,130,25,110,24,23,22,26,112,243,247,30,29,27,28,56,190,226,31,228,229,230,231,232,233,244,113,225,224,223,222,221,189,35,124,46,53,52,65,143,111,117,118,119,120,121,128,245,156,70,63,105,66,107,55,193],eyeR:[263,249,390,373,374,380,381,382,362,466,388,387,386,385,384,398,359,255,339,254,253,252,256,341,463,467,260,259,257,258,286,414,446,261,448,449,450,451,452,453,464,342,445,444,443,442,441,413,265,353,276,283,282,295,372,340,346,347,348,349,350,357,465,383,300,293,334,296,336,285,417]};async function qn(e,t){let o={irisL:t[3].dataSync(),irisR:t[1].dataSync(),eyeL:t[0].dataSync(),eyeR:t[6].dataSync(),lips:t[5].dataSync()},n=q0.eyeRLower.reduce((s,a)=>s+=e[a][2],0)/q0.eyeRLower.length;for(let s=0;ss+=e[a][2],0)/q0.eyeLLower.length;for(let s=0;sg()-E0.timestamp,n=E0.skipped<(((x=t.face.detector)==null?void 0:x.skipFrames)||0);!t.skipAllowed||!o||!n||E0.boxes.length===0?(E0.boxes=await fn(e,t),E0.timestamp=g(),E0.skipped=0):E0.skipped++;let A=[],s=[],a=0;for(let M=0;MB.shape[B.shape.length-1]===1),W=S.find(B=>B.shape[B.shape.length-1]===1404),I=await O.data();w.faceScore=Math.round(100*I[0])/100;let V=r.reshape(W,[-1,3]),G=await V.array();if(w.faceScore<(((f=t.face.detector)==null?void 0:f.minConfidence)||1))u.confidence=w.faceScore;else{(h=t.face.attention)!=null&&h.enabled?G=await qn(G,S):(m=t.face.iris)!=null&&m.enabled&&(G=await Dn(G,w.tensor,t,ge)),w.mesh=an(G,u,p,P,ge),w.meshRaw=w.mesh.map(J=>[J[0]/(e.shape[2]||0),J[1]/(e.shape[1]||0),(J[2]||0)/ge]);for(let J of Object.keys(M0))w.annotations[J]=M0[J].map(z=>w.mesh[z]);w.score=w.faceScore;let B={...yn(w.mesh,u),confidence:u.confidence,landmarks:u.landmarks};w.box=l5(B,e),w.boxRaw=y5(B,e),s.push(B)}r.dispose([...S,V])}else{w.box=l5(u,e),w.boxRaw=y5(u,e),w.score=w.boxScore,w.mesh=u.landmarks.map(S=>[(u.startPoint[0]+u.endPoint[0])/2+(u.endPoint[0]+u.startPoint[0])*S[0]/lt(),(u.startPoint[1]+u.endPoint[1])/2+(u.endPoint[1]+u.startPoint[1])*S[1]/lt()]),w.meshRaw=w.mesh.map(S=>[S[0]/(e.shape[2]||0),S[1]/(e.shape[1]||0),(S[2]||0)/ge]);for(let S of Object.keys(Ve))w.annotations[S]=[w.mesh[Ve[S]]]}w.score>(((v=t.face.detector)==null?void 0:v.minConfidence)||1)?A.push(w):r.dispose(w.tensor)}return E0.boxes=s,A}async function Jn(e){var t,o,n;return R.initial&&(z0=null),z0?e.debug&&b("cached model:",z0.modelUrl):(t=e.face.attention)!=null&&t.enabled?z0=await L((o=e.face.attention)==null?void 0:o.modelPath):z0=await L((n=e.face.mesh)==null?void 0:n.modelPath),ge=z0.inputs[0].shape?z0.inputs[0].shape[2]:0,z0}var Yn=oe,Kn=Ze;var d0,ht=[],Qn=0,_n=0,j5=Number.MAX_SAFE_INTEGER;async function $n(e){var t;return R.initial&&(d0=null),d0?e.debug&&b("cached model:",d0.modelUrl):d0=await L((t=e.face.description)==null?void 0:t.modelPath),d0}function S5(e){let t=e.image||e.tensor||e;if(!(d0!=null&&d0.inputs[0].shape))return t;let o=r.image.resizeBilinear(t,[d0.inputs[0].shape[2],d0.inputs[0].shape[1]],!1),n=r.mul(o,N.tf255);return r.dispose(o),n}async function W5(e,t,o,n){var a,i,x,d;if(!d0)return{age:0,gender:"unknown",genderScore:0,descriptor:[]};let A=j5<(((a=t.face.description)==null?void 0:a.skipFrames)||0),s=(((i=t.face.description)==null?void 0:i.skipTime)||0)>g()-Qn;return t.skipAllowed&&A&&s&&_n===n&&((x=ht[o])==null?void 0:x.age)&&((d=ht[o])==null?void 0:d.age)>0?(j5++,ht[o]):(j5=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=S5(e),m=d0==null?void 0:d0.execute(h);Qn=g(),r.dispose(h);let M=await(await m.find(I=>I.shape[1]===1)).data(),u=Math.trunc(200*Math.abs(M[0]-.5))/100;u>(((f=t.face.description)==null?void 0:f.minConfidence)||0)&&(y.gender=M[0]<=.5?"female":"male",y.genderScore=Math.min(.99,u));let p=r.argMax(m.find(I=>I.shape[1]===100),1),P=(await p.data())[0];r.dispose(p);let S=await m.find(I=>I.shape[1]===100).data();y.age=Math.round(S[P-1]>S[P+1]?10*P-100*S[P-1]:10*P+100*S[P+1])/10;let O=m.find(I=>I.shape[1]===1024),W=O?await O.data():[];y.descriptor=Array.from(W),m.forEach(I=>r.dispose(I))}ht[o]=y,_n=n,l(y)}))}function bt(e){return[Math.abs(e.endPoint[0]-e.startPoint[0]),Math.abs(e.endPoint[1]-e.startPoint[1])]}function qe(e){return[e.startPoint[0]+(e.endPoint[0]-e.startPoint[0])/2,e.startPoint[1]+(e.endPoint[1]-e.startPoint[1])/2]}function oA(e,t,o){let n=t.shape[1],A=t.shape[2],s=[[e.startPoint[1]/n,e.startPoint[0]/A,e.endPoint[1]/n,e.endPoint[0]/A]];return r.image.cropAndResize(t,s,[0],o)}function nA(e,t){let o=[e.startPoint[0]*t[0],e.startPoint[1]*t[1]],n=[e.endPoint[0]*t[0],e.endPoint[1]*t[1]],A=e.palmLandmarks.map(s=>[s[0]*t[0],s[1]*t[1]]);return{startPoint:o,endPoint:n,palmLandmarks:A,confidence:e.confidence}}function gt(e,t=1.5){let o=qe(e),n=bt(e),A=[t*n[0]/2,t*n[1]/2],s=[o[0]-A[0],o[1]-A[1]],a=[o[0]+A[0],o[1]+A[1]];return{startPoint:s,endPoint:a,palmLandmarks:e.palmLandmarks}}function Mt(e){let t=qe(e),o=bt(e),A=Math.max(...o)/2,s=[t[0]-A,t[1]-A],a=[t[0]+A,t[1]+A];return{startPoint:s,endPoint:a,palmLandmarks:e.palmLandmarks}}function r2(e){return e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI))}function AA(e,t){let o=Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]);return r2(o)}var eA=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]];function U0(e,t){let o=0;for(let n=0;n[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 n=r.concat2d([o.startPoints,o.endPoints],1);return Object.keys(o).forEach(A=>r.dispose(o[A])),n}normalizeLandmarks(t,o){let n={};n.reshape=r.reshape(t,[-1,7,2]),n.div=r.div(n.reshape,this.inputSizeTensor),n.landmarks=r.add(n.div,this.anchors[o]);let A=r.mul(n.landmarks,this.inputSizeTensor);return Object.keys(n).forEach(s=>r.dispose(n[s])),A}async predict(t,o){let n={};n.resize=r.image.resizeBilinear(t,[this.inputSize,this.inputSize]),n.div=r.div(n.resize,N.tf127),n.image=r.sub(n.div,N.tf1),n.batched=this.model.execute(n.image),n.predictions=r.squeeze(n.batched),n.slice=r.slice(n.predictions,[0,0],[-1,1]),n.sigmoid=r.sigmoid(n.slice),n.scores=r.squeeze(n.sigmoid);let A=await n.scores.data();n.boxes=r.slice(n.predictions,[0,1],[-1,4]),n.norm=this.normalizeBoxes(n.boxes),n.nms=await r.image.nonMaxSuppressionAsync(n.norm,n.scores,3*o.hand.maxDetected,o.hand.iouThreshold,o.hand.minConfidence);let s=await n.nms.array(),a=[];for(let i of s){let x={};x.box=r.slice(n.norm,[i,0],[1,-1]),x.slice=r.slice(n.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:A[i]},h=nA(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(n).forEach(i=>r.dispose(n[i])),a}};var l2=5,iA=1.65,lA=[0,5,9,13,17,1,2],y2=0,x2=2,yA=0,vt=class{constructor(t,o){k(this,"handDetector");k(this,"handPoseModel");k(this,"inputSize");k(this,"storedBoxes");k(this,"skipped");k(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]),n=t.map(a=>a[1]),A=[Math.min(...o),Math.min(...n)],s=[Math.max(...o),Math.max(...n)];return{startPoint:A,endPoint:s}}getBoxForPalmLandmarks(t,o){let n=t.map(s=>I5([...s,1],o)),A=this.calculateLandmarksBoundingBox(n);return gt(Mt(A),l2)}getBoxForHandLandmarks(t){let o=this.calculateLandmarksBoundingBox(t),n=gt(Mt(o),iA);n.palmLandmarks=[];for(let A=0;A[a[0]*(f[0]-this.inputSize/2),a[1]*(f[1]-this.inputSize/2),a[2]*f[2]]),x=O5(n,[0,0]),d=i.map(f=>[...I5(f,x),f[2]]),l=rA(A),y=[...qe(o),1],c=[U0(y,l[0]),U0(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 n=!1,A,s=(o.hand.skipTime||0)>g()-yA,a=this.skipped<(o.hand.skipFrames||0);o.skipAllowed&&s&&a&&(A=await this.handDetector.predict(t,o),this.skipped=0),o.skipAllowed&&this.skipped++,A&&A.length>0&&(A.length!==this.detectedHands&&this.detectedHands!==o.hand.maxDetected||!o.hand.landmarks)&&(this.detectedHands=0,this.storedBoxes=[...A],this.storedBoxes.length>0&&(n=!0));let i=[];for(let x=0;x=o.hand.minConfidence/4){let w=r.reshape(p,[-1,3]),S=await w.array();r.dispose(p),r.dispose(w);let O=this.transformRawCoords(S,m,l,h),W=this.getBoxForHandLandmarks(O);this.storedBoxes[x]={...W,confidence:P};let I={landmarks:O,confidence:P,boxConfidence:d.confidence,fingerConfidence:P,box:{topLeft:W.startPoint,bottomRight:W.endPoint}};i.push(I)}else this.storedBoxes[x]=null;r.dispose(p)}else{let l=gt(Mt(d),iA),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 l0={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=>l0.nameMapping[e],getPoints:e=>l0.pointsMapping[e]},Y0={none:0,half:1,full:2,nameMapping:{0:"none",1:"half",2:"full"},getName:e=>Y0.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]},J0=class{constructor(t){k(this,"name");k(this,"curls");k(this,"directions");k(this,"weights");k(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,n){typeof this.curls[t]=="undefined"&&(this.curls[t]=[]),this.curls[t].push([o,n])}direction(t,o,n){this.directions[t]||(this.directions[t]=[]),this.directions[t].push([o,n])}weight(t,o){this.weights[t]=o;let n=this.weights.reduce((A,s)=>A+s,0);this.weightsRelative=this.weights.map(A=>A*5/n)}matchAgainst(t,o){let n=0;for(let A in t){let s=t[A],a=this.curls[A];if(typeof a=="undefined"){n+=this.weightsRelative[A];continue}for(let[i,x]of a)if(s===i){n+=x*this.weightsRelative[A];break}}for(let A in o){let s=o[A],a=this.directions[A];if(typeof a=="undefined"){n+=this.weightsRelative[A];continue}for(let[i,x]of a)if(s===i){n+=x*this.weightsRelative[A];break}}return n/10}};var{thumb:v0,index:F0,middle:H0,ring:re,pinky:se}=l0,{none:T0,half:d2,full:R0}=Y0,{verticalUp:Me,verticalDown:ga,horizontalLeft:L5,horizontalRight:f2,diagonalUpRight:m2,diagonalUpLeft:Pe,diagonalDownRight:Ma,diagonalDownLeft:Pa}=U,K0=new J0("thumbs up");K0.curl(v0,T0,1);K0.direction(v0,Me,1);K0.direction(v0,Pe,.25);K0.direction(v0,m2,.25);for(let e of[l0.index,l0.middle,l0.ring,l0.pinky])K0.curl(e,R0,1),K0.direction(e,L5,1),K0.direction(e,f2,1);var $=new J0("victory");$.curl(v0,d2,.5);$.curl(v0,T0,.5);$.direction(v0,Me,1);$.direction(v0,Pe,1);$.curl(F0,T0,1);$.direction(F0,Me,.75);$.direction(F0,Pe,1);$.curl(H0,T0,1);$.direction(H0,Me,1);$.direction(H0,Pe,.75);$.curl(re,R0,1);$.direction(re,Me,.2);$.direction(re,Pe,1);$.direction(re,L5,.2);$.curl(se,R0,1);$.direction(se,Me,.2);$.direction(se,Pe,1);$.direction(se,L5,.2);$.weight(F0,2);$.weight(H0,2);var Q0=new J0("point");Q0.curl(v0,R0,1);Q0.curl(F0,T0,.5);Q0.curl(H0,R0,.5);Q0.curl(re,R0,.5);Q0.curl(se,R0,.5);Q0.weight(F0,2);Q0.weight(H0,2);var _0=new J0("middle finger");_0.curl(v0,T0,1);_0.curl(F0,R0,.5);_0.curl(H0,R0,.5);_0.curl(re,R0,.5);_0.curl(se,R0,.5);_0.weight(F0,2);_0.weight(H0,2);var ve=new J0("open palm");ve.curl(v0,T0,.75);ve.curl(F0,T0,.75);ve.curl(H0,T0,.75);ve.curl(re,T0,.75);ve.curl(se,T0,.75);var xA=[K0,$,Q0,_0,ve];var p2=.7,ae={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 cA(e,t,o,n){let A=(t-n)/(e-o),s=Math.atan(A)*180/Math.PI;return s<=0?s=-s:s>0&&(s=180-s),s}function fA(e,t){if(!e||!t)return[0,0];let o=cA(e[0],e[1],t[0],t[1]);if(e.length===2)return o;let n=cA(e[1],e[2],t[1],t[2]);return[o,n]}function dA(e,t=1){let o=0,n=0,A=0;return e>=75&&e<=105?o=1*t:e>=25&&e<=155?n=1*t:A=1*t,[o,n,A]}function u2(e,t,o){let n=e[0]-t[0],A=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(n*n+a*a+d*d),f=Math.sqrt(A*A+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 M;return v>ae.NO_CURL_START_LIMIT?M=Y0.none:v>ae.HALF_CURL_START_LIMIT?M=Y0.half:M=Y0.full,M}function mA(e,t,o,n){let A;return n===Math.abs(e)?e>0?A=U.horizontalLeft:A=U.horizontalRight:n===Math.abs(t)?t>0?A=U.horizontalLeft:A=U.horizontalRight:o>0?A=U.horizontalLeft:A=U.horizontalRight,A}function pA(e,t,o,n){let A;return n===Math.abs(e)?e<0?A=U.verticalDown:A=U.verticalUp:n===Math.abs(t)?t<0?A=U.verticalDown:A=U.verticalUp:o<0?A=U.verticalDown:A=U.verticalUp,A}function h2(e,t,o,n,A,s,a,i){let x,d=pA(e,t,o,n),l=mA(A,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 b2(e,t,o,n){let A=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(A),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+=ae.DISTANCE_VOTE_POWER:m>.66?f+=ae.DISTANCE_VOTE_POWER:h+=ae.DISTANCE_VOTE_POWER;let v=Math.sqrt(A*A+i*i),M=Math.sqrt(s*s+x*x),u=Math.sqrt(a*a+d*d),p=Math.max(v,M,u),P=e[0],w=e[1],S=o[0],O=o[1];p===v?(S=o[0],O=o[1]):p===u&&(P=t[0],w=t[1]);let V=fA([P,w],[S,O]),G=dA(V,ae.TOTAL_ANGLE_VOTE_POWER);c+=G[0],f+=G[1],h+=G[2];for(let J of n){let z=dA(J,ae.SINGLE_ANGLE_VOTE_POWER);c+=z[0],f+=z[1],h+=z[2]}let B;return c===Math.max(c,f,h)?B=pA(x,i,d,y):h===Math.max(f,h)?B=mA(s,A,a,l):B=h2(x,i,d,y,s,A,a,l),B}function uA(e){let t=[],o=[],n=[],A=[];if(!e)return{curls:n,directions:A};for(let s of l0.all){let a=l0.getPoints(s),i=[],x=[];for(let d of a){let l=e[d[0]],y=e[d[1]],c=fA(l,y),f=c[0],h=c[1];i.push(f),x.push(h)}t.push(i),o.push(x)}for(let s of l0.all){let a=s===l0.thumb?1:0,i=l0.getPoints(s),x=e[i[a][0]],d=e[i[a+1][1]],l=e[i[3][1]],y=u2(x,d,l),c=b2(x,d,l,t[s].slice(a));n[s]=y,A[s]=c}return{curls:n,directions:A}}function Tt(e){if(!e||e.length===0)return null;let t=uA(e),o={};for(let n of l0.all)o[l0.getName(n)]={curl:Y0.getName(t.curls[n]),direction:U.getName(t.directions[n])};return o}function hA(e){let t=[];if(!e||e.length===0)return t;let o=uA(e);for(let n of xA){let A=n.matchAgainst(o.curls,o.directions);A>=p2&&t.push({name:n.name,confidence:A})}return t}var bA={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]},Te,Re,gA;async function G5(e,t){let o=await gA.estimateHands(e,t);if(!o)return[];let n=[];for(let A=0;Ao[A].landmarks[y]);let a=o[A].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[A].box?[Math.trunc(Math.max(0,o[A].box.topLeft[0])),Math.trunc(Math.max(0,o[A].box.topLeft[1])),Math.trunc(Math.min(e.shape[2]||0,o[A].box.bottomRight[0])-Math.max(0,o[A].box.topLeft[0])),Math.trunc(Math.min(e.shape[1]||0,o[A].box.bottomRight[1])-Math.max(0,o[A].box.topLeft[1]))]:[0,0,0,0],x=[o[A].box.topLeft[0]/(e.shape[2]||0),o[A].box.topLeft[1]/(e.shape[1]||0),(o[A].box.bottomRight[0]-o[A].box.topLeft[0])/(e.shape[2]||0),(o[A].box.bottomRight[1]-o[A].box.topLeft[1])/(e.shape[1]||0)];let d=Tt(a);n.push({id:A,score:Math.round(100*o[A].confidence)/100,boxScore:Math.round(100*o[A].boxConfidence)/100,fingerScore:Math.round(100*o[A].fingerConfidence)/100,label:"hand",box:i,boxRaw:x,keypoints:a,annotations:s,landmarks:d})}return n}async function B5(e){var o,n;R.initial&&(Te=null,Re=null),!Te||!Re?[Te,Re]=await Promise.all([e.hand.enabled?L((o=e.hand.detector)==null?void 0:o.modelPath):null,e.hand.landmarks?L((n=e.hand.skeleton)==null?void 0:n.modelPath):null]):(e.debug&&b("cached model:",Te.modelUrl),e.debug&&b("cached model:",Re.modelUrl));let t=new Pt(Te);return gA=new vt(t,Re),[Te,Re]}var t0=[null,null],g2=["StatefulPartitionedCall/Postprocessor/Slice","StatefulPartitionedCall/Postprocessor/ExpandDims_1"],$0=[[0,0],[0,0]],M2=["hand","fist","pinch","point","face","tip","pinchtip"],PA=4,vA=1.6,P2=512,v2=1.4,Rt=Number.MAX_SAFE_INTEGER,F5=0,V0=[0,0],K={boxes:[],hands:[]},TA={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 RA(e){var t;if(R.initial&&(t0[0]=null),t0[0])e.debug&&b("cached model:",t0[0].modelUrl);else{wt(["tensorlistreserve","enter","tensorlistfromtensor","merge","loopcond","switch","exit","tensorliststack","nextiteration","tensorlistsetitem","tensorlistgetitem","reciprocal","shape","split","where"],e),t0[0]=await L((t=e.hand.detector)==null?void 0:t.modelPath);let o=Object.values(t0[0].modelSignature.inputs);$0[0][0]=Array.isArray(o)?parseInt(o[0].tensorShape.dim[1].size):0,$0[0][1]=Array.isArray(o)?parseInt(o[0].tensorShape.dim[2].size):0}return t0[0]}async function wA(e){var t;if(R.initial&&(t0[1]=null),t0[1])e.debug&&b("cached model:",t0[1].modelUrl);else{t0[1]=await L((t=e.hand.skeleton)==null?void 0:t.modelPath);let o=Object.values(t0[1].modelSignature.inputs);$0[1][0]=Array.isArray(o)?parseInt(o[0].tensorShape.dim[1].size):0,$0[1][1]=Array.isArray(o)?parseInt(o[0].tensorShape.dim[2].size):0}return t0[1]}async function T2(e,t){let o=[];if(!e||!t0[0])return o;let n={},A=(e.shape[2]||1)/(e.shape[1]||1),s=Math.min(Math.round((e.shape[1]||0)/8)*8,P2),a=Math.round(s*A/8)*8;n.resize=r.image.resizeBilinear(e,[s,a]),n.cast=r.cast(n.resize,"int32"),[n.rawScores,n.rawBoxes]=await t0[0].executeAsync(n.cast,g2),n.boxes=r.squeeze(n.rawBoxes,[0,2]),n.scores=r.squeeze(n.rawScores,[0]);let i=r.unstack(n.scores,1);r.dispose(i[PA]),i.splice(PA,1),n.filtered=r.stack(i,1),r.dispose(i),n.max=r.max(n.filtered,1),n.argmax=r.argMax(n.filtered,1);let x=0;n.nms=await r.image.nonMaxSuppressionAsync(n.boxes,n.max,(t.hand.maxDetected||0)+1,t.hand.iouThreshold||0,t.hand.minConfidence||1);let d=await n.nms.data(),l=await n.max.data(),y=await n.argmax.data();for(let c of Array.from(d)){let f=r.slice(n.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=ct(m,v2),M=[Math.trunc(m[0]*V0[0]),Math.trunc(m[1]*V0[1]),Math.trunc(m[2]*V0[0]),Math.trunc(m[3]*V0[1])],u=l[c],p=M2[y[c]],P={id:x++,score:u,box:M,boxRaw:v,label:p};o.push(P)}return Object.keys(n).forEach(c=>r.dispose(n[c])),o.sort((c,f)=>f.score-c.score),o.length>(t.hand.maxDetected||1)&&(o.length=t.hand.maxDetected||1),o}async function H5(e,t,o){let n={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&&t0[1]&&o.hand.landmarks&&t.score>(o.hand.minConfidence||0)){let A={},s=[t.boxRaw[1],t.boxRaw[0],t.boxRaw[3]+t.boxRaw[1],t.boxRaw[2]+t.boxRaw[0]];A.crop=r.image.cropAndResize(e,[s],[0],[$0[1][0],$0[1][1]],"bilinear"),A.div=r.div(A.crop,N.tf255),[A.score,A.keypoints]=t0[1].execute(A.div,["Identity_1","Identity"]);let a=(await A.score.data())[0],i=(100-Math.trunc(100/(1+Math.exp(a))))/100;if(i>=(o.hand.minConfidence||0)){n.fingerScore=i,A.reshaped=r.reshape(A.keypoints,[-1,3]);let l=(await A.reshaped.array()).map(y=>[y[0]/$0[1][1],y[1]/$0[1][0],y[2]||0]).map(y=>[y[0]*t.boxRaw[2],y[1]*t.boxRaw[3],y[2]||0]);n.keypoints=l.map(y=>[V0[0]*(y[0]+t.boxRaw[0]),V0[1]*(y[1]+t.boxRaw[1]),y[2]||0]),n.landmarks=Tt(n.keypoints);for(let y of Object.keys(TA))n.annotations[y]=TA[y].map(c=>n.landmarks&&n.keypoints[c]?n.keypoints[c]:null)}Object.keys(A).forEach(x=>r.dispose(A[x]))}return n}async function V5(e,t){var A,s;if(!t0[0]||!t0[1]||!((A=t0[0])!=null&&A.inputs[0].shape)||!((s=t0[1])!=null&&s.inputs[0].shape))return[];V0=[e.shape[2]||0,e.shape[1]||0],Rt++;let o=(t.hand.skipTime||0)>g()-F5,n=Rt<(t.hand.skipFrames||0);return t.skipAllowed&&o&&n?K.hands:new Promise(async a=>{let i=3*(t.hand.skipTime||0)>g()-F5,x=Rt<3*(t.hand.skipFrames||0);t.skipAllowed&&K.hands.length===t.hand.maxDetected?K.hands=await Promise.all(K.boxes.map(l=>H5(e,l,t))):t.skipAllowed&&i&&x&&K.hands.length>0?K.hands=await Promise.all(K.boxes.map(l=>H5(e,l,t))):(K.boxes=await T2(e,t),F5=g(),K.hands=await Promise.all(K.boxes.map(l=>H5(e,l,t))),Rt=0);let d=[...K.boxes];if(K.boxes.length=0,t.cacheSensitivity>0)for(let l=0;l.05&&y.box[3]/(e.shape[1]||1)>.05&&K.hands[l].fingerScore&&K.hands[l].fingerScore>(t.hand.minConfidence||0)){let c=ct(y.box,vA),f=ct(y.boxRaw,vA);K.boxes.push({...d[l],box:c,boxRaw:f})}}for(let l=0;lg()-zA,s=Z5<(((i=t.face.liveness)==null?void 0:i.skipFrames)||0);return t.skipAllowed&&A&&s&&EA===n&&kt[o]?(Z5++,kt[o]):(Z5=0,new Promise(async x=>{let d=r.image.resizeBilinear(e,[s0!=null&&s0.inputs[0].shape?s0.inputs[0].shape[2]:0,s0!=null&&s0.inputs[0].shape?s0.inputs[0].shape[1]:0],!1),l=s0==null?void 0:s0.execute(d),y=(await l.data())[0];kt[o]=Math.round(100*y)/100,EA=n,zA=g(),r.dispose([d,l]),x(kt[o])}))}var Ue={};ee(Ue,{connected:()=>zt,horizontal:()=>X5,kpt:()=>Et,relative:()=>U5,vertical:()=>q5});var Et=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],X5=[["leftEye","rightEye"],["leftEar","rightEar"],["leftShoulder","rightShoulder"],["leftElbow","rightElbow"],["leftWrist","rightWrist"],["leftHip","rightHip"],["leftKnee","rightKnee"],["leftAnkle","rightAnkle"]],q5=[["leftKnee","leftShoulder"],["rightKnee","rightShoulder"],["leftAnkle","leftKnee"],["rightAnkle","rightKnee"]],U5=[[["leftHip","rightHip"],["leftShoulder","rightShoulder"]],[["leftElbow","rightElbow"],["leftShoulder","rightShoulder"]]],zt={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var WA=.005,f0={keypoints:[],padding:[[0,0],[0,0],[0,0],[0,0]]};function J5(e){for(let t of X5){let o=e.keypoints.findIndex(A=>A.part===t[0]),n=e.keypoints.findIndex(A=>A.part===t[1]);if(e.keypoints[o]&&e.keypoints[n]&&e.keypoints[o].position[0]A&&A.part===t[0]),n=e.keypoints.findIndex(A=>A&&A.part===t[1]);e.keypoints[o]&&e.keypoints[n]&&e.keypoints[o].position[1]d&&d.part===t[0]),A=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[n]?[Math.abs(e.keypoints[s].position[0]-e.keypoints[n].position[0]),Math.abs(e.keypoints[a].position[0]-e.keypoints[n].position[0])]:[0,0],x=e.keypoints[A]?[Math.abs(e.keypoints[a].position[0]-e.keypoints[A].position[0]),Math.abs(e.keypoints[s].position[0]-e.keypoints[A].position[0])]:[0,0];if(i[0]>i[1]||x[0]>x[1]){let d=e.keypoints[n];e.keypoints[n]=e.keypoints[A],e.keypoints[A]=d}}}function CA(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,f0.padding),o.resize=r.image.resizeBilinear(o.pad,[t,t]);let n=r.cast(o.resize,"int32");return Object.keys(o).forEach(A=>r.dispose(o[A])),n}function IA(e,t){e.keypoints=e.keypoints.filter(n=>n&&n.position);for(let n of e.keypoints)n.position=[n.position[0]*(t[0]+f0.padding[2][0]+f0.padding[2][1])/t[0]-f0.padding[2][0],n.position[1]*(t[1]+f0.padding[1][0]+f0.padding[1][1])/t[1]-f0.padding[1][0]],n.positionRaw=[n.position[0]/t[0],n.position[1]/t[1]];let o=N0(e.keypoints.map(n=>n.position),t);return e.box=o.box,e.boxRaw=o.boxRaw,e}var m0,jt=0,Y5=Number.MAX_SAFE_INTEGER,ie={boxes:[],bodies:[],last:0};async function LA(e){return R.initial&&(m0=null),m0?e.debug&&b("cached model:",m0.modelUrl):(wt(["size"],e),m0=await L(e.body.modelPath)),jt=m0.inputs[0].shape?m0.inputs[0].shape[2]:0,jt<64&&(jt=256),m0}async function w2(e,t,o){let n=e[0][0],A=[],s=0;for(let l=0;lt.body.minConfidence){let y=[n[l][1],n[l][0]];A.push({score:Math.round(100*s)/100,part:Et[l],positionRaw:y,position:[Math.round((o.shape[2]||0)*y[0]),Math.round((o.shape[1]||0)*y[1])]})}s=A.reduce((l,y)=>y.score>l?y.score:l,0);let a=[],i=N0(A.map(l=>l.position),[o.shape[2],o.shape[1]]),x={};for(let[l,y]of Object.entries(zt)){let c=[];for(let f=0;fv.part===y[f]),m=A.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:A,annotations:x};return J5(d),a.push(d),a}async function k2(e,t,o){let n=[];for(let A=0;At.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:Et[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=N0(i.map(y=>y.position),[o.shape[2],o.shape[1]]),d={};for(let[y,c]of Object.entries(zt)){let f=[];for(let h=0;hM.part===c[h]),v=i.find(M=>M.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:A,score:a,box:x.box,boxRaw:x.boxRaw,keypoints:[...i],annotations:d};J5(l),n.push(l)}}return n.sort((A,s)=>s.score-A.score),n.length>t.body.maxDetected&&(n.length=t.body.maxDetected),n}async function K5(e,t){if(!m0||!(m0!=null&&m0.inputs[0].shape))return[];t.skipAllowed||(ie.boxes.length=0),Y5++;let o=(t.body.skipTime||0)>g()-ie.last,n=Y5<(t.body.skipFrames||0);return t.skipAllowed&&o&&n?ie.bodies:new Promise(async A=>{let s={};Y5=0,s.input=OA(e,jt),s.res=m0==null?void 0:m0.execute(s.input),ie.last=g();let a=await s.res.array();ie.bodies=s.res.shape[2]===17?await w2(a,t,e):await k2(a,t,e);for(let i of ie.bodies)IA(i,[e.shape[2]||1,e.shape[1]||1]),CA(i.keypoints);Object.keys(s).forEach(i=>r.dispose(s[i])),A(ie.bodies)})}var we,St=[],GA=0,Q5=Number.MAX_SAFE_INTEGER,Ct=0,Wt=2.5;async function BA(e){if(!we||R.initial){we=await L(e.object.modelPath);let t=Object.values(we.modelSignature.inputs);Ct=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):0}else e.debug&&b("cached model:",we.modelUrl);return we}async function E2(e,t,o){let n=0,A=[];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)===ue.length)),y=r.squeeze(e.find(m=>m.shape[1]===d**2&&(m.shape[2]||0)(o.object.minConfidence||0)&&v!==61){let u=(.5+Math.trunc(m%d))/d,p=(.5+Math.trunc(m/d))/d,P=f[m].map(B=>B*(d/x/Ct)),[w,S]=[u-Wt/x*P[0],p-Wt/x*P[1]],[O,W]=[u+Wt/x*P[2]-w,p+Wt/x*P[3]-S],I=[w,S,O,W];I=I.map(B=>Math.max(0,Math.min(B,1)));let V=[I[0]*t[0],I[1]*t[1],I[2]*t[0],I[3]*t[1]],G={id:n++,score:Math.round(100*M)/100,class:v+1,label:ue[v].label,box:V.map(B=>Math.trunc(B)),boxRaw:I};A.push(G)}}});e.forEach(x=>r.dispose(x));let s=A.map(x=>[x.boxRaw[1],x.boxRaw[0],x.boxRaw[3],x.boxRaw[2]]),a=A.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 A=A.filter((x,d)=>i.includes(d)).sort((x,d)=>d.score-x.score),A}async function _5(e,t){let o=(t.object.skipTime||0)>g()-GA,n=Q5<(t.object.skipFrames||0);return t.skipAllowed&&o&&n&&St.length>0?(Q5++,St):(Q5=0,!R.kernels.includes("mod")||!R.kernels.includes("sparsetodense")?St:new Promise(async A=>{let s=[e.shape[2]||0,e.shape[1]||0],a=r.image.resizeBilinear(e,[Ct,Ct],!1),i=r.div(a,N.tf255),x=i.transpose([0,3,1,2]);r.dispose(i),r.dispose(a);let d;t.object.enabled&&(d=we.execute(x)),GA=g(),r.dispose(x);let l=await E2(d,s,t);St=l,A(l)}))}var Ye=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],z2=Ye.length,Je=Ye.reduce((e,t,o)=>(e[t]=o,e),{}),j2=[["leftHip","leftShoulder"],["leftElbow","leftShoulder"],["leftElbow","leftWrist"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["rightHip","rightShoulder"],["rightElbow","rightShoulder"],["rightElbow","rightWrist"],["rightHip","rightKnee"],["rightKnee","rightAnkle"],["leftShoulder","rightShoulder"],["leftHip","rightHip"]],qa=j2.map(([e,t])=>[Je[e],Je[t]]),HA=[["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 VA(e){let t=e.reduce(({maxX:o,maxY:n,minX:A,minY:s},{position:{x:a,y:i}})=>({maxX:Math.max(o,a),maxY:Math.max(n,i),minX:Math.min(A,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 ZA(e,[t,o],[n,A]){let s=t/n,a=o/A,i=(d,l)=>({id:l,score:d.score,boxRaw:[d.box[0]/A,d.box[1]/n,d.box[2]/A,d.box[3]/n],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/n,f.y/n]})),annotations:{}});return e.map((d,l)=>i(d,l))}var Ot=class{constructor(t,o){k(this,"priorityQueue");k(this,"numberOfElements");k(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 DA(e,t,o,n){let A=o-e,s=n-t;return A*A+s*s}function oo(e,t){return{x:e.x+t.x,y:e.y+t.y}}var w0,W2=["MobilenetV1/offset_2/BiasAdd","MobilenetV1/heatmap_2/BiasAdd","MobilenetV1/displacement_fwd_2/BiasAdd","MobilenetV1/displacement_bwd_2/BiasAdd"],It=1,ke=16,C2=50**2;function XA(e,t,o,n,A,s,a=2){let i=M=>({y:s.get(M.y,M.x,e),x:s.get(M.y,M.x,s.shape[2]/2+e)}),x=(M,u,p)=>({y:to(Math.round(M.y/ke),0,u-1),x:to(Math.round(M.x/ke),0,p-1)}),[d,l]=n.shape,y=x(t.position,d,l),c=i(y),h=oo(t.position,c);for(let M=0;M[Je[c],Je[f]]),a=s.map(([,c])=>c),i=s.map(([c])=>c),x=t.shape[2],d=a.length,l=new Array(x),y=eo(e.part,ke,o);l[e.part.id]={score:e.score,part:Ye[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]=XA(c,l[f],h,t,o,A))}for(let c=0;ct){i=!1;break}if(!i)break}return i}function L2(e,t){let[o,n,A]=t.shape,s=new Ot(o*n*A,({score:a})=>a);for(let a=0;a{var a;let s=(a=A[n])==null?void 0:a.position;return s?DA(o,t,s.y,s.x)<=C2:!1})}function N2(e,t){return t.reduce((n,{position:A,score:s},a)=>(qA(e,A,a)||(n+=s),n),0)/t.length}function G2(e,t,o,n,A,s){let a=[],i=L2(s,t);for(;a.lengthf.score>s);let y=N2(a,l),c=VA(l);y>s&&a.push({keypoints:l,box:c,score:Math.round(100*y)/100})}return a}async function no(e,t){let o=r.tidy(()=>{if(!w0.inputs[0].shape)return[];let a=r.image.resizeBilinear(e,[w0.inputs[0].shape[2],w0.inputs[0].shape[1]]),i=r.sub(r.div(r.cast(a,"float32"),127.5),1),d=w0.execute(i,W2).map(l=>r.squeeze(l,[0]));return d[1]=r.sigmoid(d[1]),d}),n=await Promise.all(o.map(a=>a.buffer()));for(let a of o)r.dispose(a);let A=await G2(n[0],n[1],n[2],n[3],t.body.maxDetected,t.body.minConfidence);return w0.inputs[0].shape?ZA(A,[e.shape[1],e.shape[2]],[w0.inputs[0].shape[2],w0.inputs[0].shape[1]]):[]}async function UA(e){return!w0||R.initial?w0=await L(e.body.modelPath):e.debug&&b("cached model:",w0.modelUrl),w0}var j0,Ao=!1;async function ro(e){return!j0||R.initial?j0=await L(e.segmentation.modelPath):e.debug&&b("cached model:",j0.modelUrl),j0}async function YA(e,t,o){var m,v;if(Ao)return{data:[],canvas:null,alpha:null};Ao=!0,j0||await ro(o);let n=await fe(e,o),A=((m=n.tensor)==null?void 0:m.shape[2])||0,s=((v=n.tensor)==null?void 0:v.shape[1])||0;if(!n.tensor)return{data:[],canvas:null,alpha:null};let a={};a.resize=r.image.resizeBilinear(n.tensor,[j0.inputs[0].shape?j0.inputs[0].shape[1]:0,j0.inputs[0].shape?j0.inputs[0].shape[2]:0],!1),r.dispose(n.tensor),a.norm=r.div(a.resize,N.tf255),a.res=j0.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],[A,s]),a.data=r.squeeze(a.crop,0)):a.data=r.image.resizeBilinear(a.squeeze,[s,A]);let i=Array.from(await a.data.data());if(R.node&&!R.Canvas&&typeof ImageData=="undefined")return o.debug&&b("canvas support missing"),Object.keys(a).forEach(M=>r.dispose(a[M])),{data:i,canvas:null,alpha:null};let x=a0(A,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,A,s),y=a0(A,s),c=y.getContext("2d");n.canvas&&c.drawImage(n.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,A,s);for(let M=0;Mr.dispose(a[M])),Ao=!1,{data:i,canvas:y,alpha:x}}var Ke=class{constructor(){k(this,"ssrnetage",null);k(this,"gear",null);k(this,"blazeposedetect",null);k(this,"blazepose",null);k(this,"centernet",null);k(this,"efficientpose",null);k(this,"mobilefacenet",null);k(this,"emotion",null);k(this,"facedetect",null);k(this,"faceiris",null);k(this,"facemesh",null);k(this,"faceres",null);k(this,"ssrnetgender",null);k(this,"handpose",null);k(this,"handskeleton",null);k(this,"handtrack",null);k(this,"liveness",null);k(this,"movenet",null);k(this,"nanodet",null);k(this,"posenet",null);k(this,"segmentation",null);k(this,"antispoof",null)}};function Lt(e){for(let t of Object.keys(e.models))e.models[t]=null}async function so(e){var t,o,n,A,s,a,i,x,d,l,y,c,f,h,m,v,M,u,p,P,w,S,O,W,I,V,G,B,J,z,P0;R.initial&&Lt(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 B5(e.config)),!e.models.handskeleton&&e.config.hand.landmarks&&((A=(n=e.config.hand.detector)==null?void 0:n.modelPath)==null?void 0:A.includes("handdetect"))&&([e.models.handpose,e.models.handskeleton]=await B5(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=vn(e.config)),e.config.body.enabled&&!e.models.blazeposedetect&&e.config.body.detector&&e.config.body.detector.modelPath&&(e.models.blazeposedetect=Pn(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=zn(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=LA(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=UA(e.config)),e.config.face.enabled&&!e.models.facedetect&&(e.models.facedetect=dn(e.config)),e.config.face.enabled&&((f=e.config.face.antispoof)==null?void 0:f.enabled)&&!e.models.antispoof&&(e.models.antispoof=$o(e.config)),e.config.face.enabled&&((h=e.config.face.liveness)==null?void 0:h.enabled)&&!e.models.liveness&&(e.models.liveness=jA(e.config)),e.config.face.enabled&&((m=e.config.face.description)==null?void 0:m.enabled)&&!e.models.faceres&&(e.models.faceres=$n(e.config)),e.config.face.enabled&&((v=e.config.face.emotion)==null?void 0:v.enabled)&&!e.models.emotion&&(e.models.emotion=Cn(e.config)),e.config.face.enabled&&((M=e.config.face.iris)==null?void 0:M.enabled)&&!((u=e.config.face.attention)!=null&&u.enabled)&&!e.models.faceiris&&(e.models.faceiris=Zn(e.config)),e.config.face.enabled&&((p=e.config.face.mesh)==null?void 0:p.enabled)&&!e.models.facemesh&&(e.models.facemesh=Jn(e.config)),e.config.face.enabled&&((P=e.config.face.gear)==null?void 0:P.enabled)&&!e.models.gear&&(e.models.gear=Fo(e.config)),e.config.face.enabled&&((w=e.config.face.ssrnet)==null?void 0:w.enabled)&&!e.models.ssrnetage&&(e.models.ssrnetage=Xo(e.config)),e.config.face.enabled&&((S=e.config.face.ssrnet)==null?void 0:S.enabled)&&!e.models.ssrnetgender&&(e.models.ssrnetgender=Yo(e.config)),e.config.face.enabled&&((O=e.config.face.mobilefacenet)==null?void 0:O.enabled)&&!e.models.mobilefacenet&&(e.models.mobilefacenet=Gn(e.config)),e.config.hand.enabled&&!e.models.handtrack&&((I=(W=e.config.hand.detector)==null?void 0:W.modelPath)==null?void 0:I.includes("handtrack"))&&(e.models.handtrack=RA(e.config)),e.config.hand.enabled&&e.config.hand.landmarks&&!e.models.handskeleton&&((G=(V=e.config.hand.detector)==null?void 0:V.modelPath)==null?void 0:G.includes("handtrack"))&&(e.models.handskeleton=wA(e.config)),e.config.object.enabled&&!e.models.centernet&&((J=(B=e.config.object)==null?void 0:B.modelPath)==null?void 0:J.includes("centernet"))&&(e.models.centernet=wn(e.config)),e.config.object.enabled&&!e.models.nanodet&&((P0=(z=e.config.object)==null?void 0:z.modelPath)==null?void 0:P0.includes("nanodet"))&&(e.models.nanodet=BA(e.config)),e.config.segmentation.enabled&&!e.models.segmentation&&(e.models.segmentation=ro(e.config));for await(let p0 of Object.keys(e.models))e.models[p0]&&typeof e.models[p0]!="undefined"&&(e.models[p0]=await e.models[p0])}async function ao(e){let t=["const","placeholder","noop","pad","squeeze","add","sub","mul","div"];for(let o of Object.keys(e.models)){let n=e.models[o];if(!n)continue;let A=[],s=n==null?void 0:n.executor;if(s&&s.graph.nodes)for(let i of Object.values(s.graph.nodes)){let x=i.op.toLowerCase();A.includes(x)||A.push(x)}else!s&&e.config.debug&&b("model signature not determined:",o);let a=[];for(let i of A)!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&&b("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 B2(){let e=q.gl;!e||(q.extensions=e.getSupportedExtensions())}async function QA(e){var t;if(e.config.backend==="humangl"&&(q.name in r.engine().registry&&(!q.gl||!q.gl.getParameter(q.gl.VERSION))&&(b("error: humangl backend invalid context"),Lt(e)),!r.findBackend(q.name))){try{q.canvas=await a0(100,100)}catch(n){b("error: cannot create canvas:",n);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")){b("override: using fallback webgl backend as webgl 2.0 is not detected"),e.config.backend="webgl";return}q.canvas&&(q.canvas.addEventListener("webglcontextlost",async A=>{throw b("error: humangl:",A.type),b("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",A=>{b("error: humangl context restored:",A)}),q.canvas.addEventListener("webglcontextcreationerror",A=>{b("error: humangl context create:",A)}))}catch(n){b("error: cannot get WebGL context:",n);return}try{r.setWebGLContext(2,q.gl)}catch(n){b("error: cannot set WebGL context:",n);return}try{let n=new r.GPGPUContext(q.gl);r.registerBackend(q.name,()=>new r.MathBackendWebGL(n),q.priority)}catch(n){b("error: cannot register WebGL backend:",n);return}try{r.getKernelsForBackend("webgl").forEach(A=>{let s={...A,backendName:q.name};r.registerKernel(s)})}catch(n){b("error: cannot update WebGL backend registration:",n);return}let o=r.backend().getGPGPUContext?r.backend().getGPGPUContext().gl:null;if(o)b(`humangl webgl version:${o.getParameter(o.VERSION)} renderer:${o.getParameter(o.RENDERER)}`);else{b("error: no current gl context:",o,q.gl);return}try{r.ENV.set("WEBGL_VERSION",2)}catch(n){b("error: cannot set WebGL backend flags:",n);return}B2(),b("backend registered:",q.name)}}function F2(){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 Nt(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=g();if(e.config.backend&&e.config.backend.length>0){if(typeof window=="undefined"&&typeof WorkerGlobalScope!="undefined"&&e.config.debug&&e.config.debug&&b("running inside web worker"),R.browser&&e.config.backend==="tensorflow"&&(e.config.debug&&b("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&&b(`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")b("override: backend set to webgpu but browser does not support webgpu"),e.config.backend="humangl";else{let A=await navigator.gpu.requestAdapter();e.config.debug&&b("enumerated webgpu adapter:",A)}e.config.backend==="humangl"&&await QA(e);let n=Object.keys(r.engine().registryFactory);if(e.config.debug&&b("available backends:",n),n.includes(e.config.backend)||(b(`error: backend ${e.config.backend} not found in registry`),e.config.backend=R.node?"tensorflow":"webgl",e.config.debug&&b(`override: setting backend ${e.config.backend}`)),e.config.debug&&b("setting backend:",e.config.backend),e.config.backend==="wasm"){if(e.config.debug&&b("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 A=await r.env().getAsync("WASM_HAS_SIMD_SUPPORT"),s=await r.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT");e.config.debug&&b(`wasm execution: ${A?"SIMD":"no SIMD"} ${s?"multithreaded":"singlethreaded"}`),e.config.debug&&!A&&b("warning: wasm simd support is not enabled")}try{await r.setBackend(e.config.backend),await r.ready(),Vo()}catch(A){return b("error: cannot set backend:",e.config.backend,A),!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&&(b("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",!0),r.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",0)),r.backend().getGPGPUContext)){let n=await r.backend().getGPGPUContext().gl;e.config.debug&&b(`gl version:${n.getParameter(n.VERSION)} renderer:${n.getParameter(n.RENDERER)}`)}r.getBackend(),r.enableProdMode(),await r.ready(),e.performance.initBackend=Math.trunc(g()-o),e.config.backend=r.getBackend(),await R.updateBackend(),F2()}return!0}function wt(e,t){for(let o of e){let n={kernelName:o,backendName:t.backend,kernelFunc:()=>{t.debug&&b("kernelFunc",o,t.backend)}};r.registerKernel(n)}R.kernels=r.getKernelsForBackend(r.getBackend()).map(o=>o.kernelName.toLowerCase())}var er={};ee(er,{all:()=>mo,body:()=>ze,canvas:()=>fo,face:()=>Ee,gesture:()=>We,hand:()=>je,object:()=>Se,options:()=>n0,person:()=>co});var n0={color:"rgba(173, 216, 230, 0.6)",labelColor:"rgba(173, 216, 230, 1)",shadowColor:"black",alpha:.5,font:'small-caps 16px "Segoe UI"',lineHeight:18,lineWidth:4,pointSize:2,roundRect:8,drawPoints:!1,drawLabels:!0,drawBoxes:!0,drawAttention:!0,drawGestures:!0,drawPolygons:!0,drawGaze:!0,fillPolygons:!1,useDepth:!0,useCurves:!1};var h0=e=>{if(!e)b("draw error: invalid canvas");else if(!e.getContext)b("draw error: canvas context not defined");else{let t=e.getContext("2d");if(!t)b("draw error: cannot get canvas context");else return t}return null},le=e=>Math.round(e*180/Math.PI),S0=(e,t=[!0,!0,!1])=>{let o=t[0]?127+Math.trunc(3*e):255,n=t[1]?127-Math.trunc(3*e):255,A=t[2]?127-Math.trunc(3*e):255;return`rgba(${o}, ${n}, ${A}, ${n0.alpha})`};function ye(e,t,o,n,A){n=n||0,e.fillStyle=A.useDepth&&n?S0(n,n===-255?[!0,!1,!0]:[!0,!1,!1]):A.color,e.beginPath(),e.arc(t,o,A.pointSize,0,2*Math.PI),e.fill()}function W0(e,t,o,n,A,s){if(e.beginPath(),e.lineWidth=s.lineWidth,s.useCurves){let a=(t+t+n)/2,i=(o+o+A)/2;e.ellipse(a,i,n/2,A/2,0,0,2*Math.PI)}else e.moveTo(t+s.roundRect,o),e.lineTo(t+n-s.roundRect,o),e.quadraticCurveTo(t+n,o,t+n,o+s.roundRect),e.lineTo(t+n,o+A-s.roundRect),e.quadraticCurveTo(t+n,o+A,t+n-s.roundRect,o+A),e.lineTo(t+s.roundRect,o+A),e.quadraticCurveTo(t,o+A,t,o+A-s.roundRect),e.lineTo(t,o+s.roundRect),e.quadraticCurveTo(t,o,t+s.roundRect,o),e.closePath();e.stroke()}function lo(e,t,o){if(!(t.length<2)){e.beginPath(),e.moveTo(t[0][0],t[0][1]);for(let n of t){let A=n[2]||0;e.strokeStyle=o.useDepth&&A!==0?S0(A):o.color,e.fillStyle=o.useDepth&&A!==0?S0(A):o.color,e.lineTo(n[0],Math.round(n[1]))}e.stroke(),o.fillPolygons&&(e.closePath(),e.fill())}}function $A(e,t,o){if(!(t.length<2)){if(e.lineWidth=o.lineWidth,!o.useCurves||t.length<=2){lo(e,t,o);return}e.moveTo(t[0][0],t[0][1]);for(let n=0;n0){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: ${le(l.rotation.angle.roll)}\xB0 yaw:${le(l.rotation.angle.yaw)}\xB0 pitch:${le(l.rotation.angle.pitch)}\xB0`),l.rotation.gaze.bearing&&y.push(`gaze: ${le(l.rotation.gaze.bearing)}\xB0`)),y.length===0&&y.push("face"),A.fillStyle=n.color;for(let c=y.length-1;c>=0;c--){let f=Math.max(l.box[0],0),h=c*n.lineHeight+l.box[1];n.shadowColor&&n.shadowColor!==""&&(A.fillStyle=n.shadowColor,A.fillText(y[c],f+5,h+16)),A.fillStyle=n.labelColor,A.fillText(y[c],f+4,h+15)}}if(A.lineWidth=2,l.mesh&&l.mesh.length>0){if(n.drawPoints){let y=Math.max(468,l.mesh.length);for(let c=0;c468)for(let y=468;y450)for(let y=0;yl.mesh[f]);lo(A,c,n)}if(l.annotations&&l.annotations.leftEyeIris&&l.annotations.leftEyeIris[0]){A.strokeStyle=n.useDepth?"rgba(255, 200, 255, 0.3)":n.color,A.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;A.ellipse(l.annotations.leftEyeIris[0][0],l.annotations.leftEyeIris[0][1],y,c,0,0,2*Math.PI),A.stroke(),n.fillPolygons&&(A.fillStyle=n.useDepth?"rgba(255, 255, 200, 0.3)":n.color,A.fill())}if(l.annotations&&l.annotations.rightEyeIris&&l.annotations.rightEyeIris[0]){A.strokeStyle=n.useDepth?"rgba(255, 200, 255, 0.3)":n.color,A.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;A.ellipse(l.annotations.rightEyeIris[0][0],l.annotations.rightEyeIris[0][1],y,c,0,0,2*Math.PI),A.stroke(),n.fillPolygons&&(A.fillStyle=n.useDepth?"rgba(255, 255, 200, 0.3)":n.color,A.fill())}if(n.drawGaze&&((s=l.rotation)==null?void 0:s.angle)&&typeof Path2D!="undefined"){A.strokeStyle="pink";let y=l.box[0]+l.box[2]/2-l.box[3]*le(l.rotation.angle.yaw)/90,c=l.box[1]+l.box[3]/2+l.box[2]*le(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 Ft=Object.defineProperty;var cr=Object.getOwnPropertyDescriptor;var dr=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} - `);A.stroke(h),A.stroke(f)}if(n.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]){A.strokeStyle="pink",A.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]];lo(A,[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]];lo(A,[l.annotations.rightEyeIris[0][0],l.annotations.rightEyeIris[0][1]],[c[0],c[1]],4)}}}}}async function Ee(e,t,o){var s;let n=Y(n0,o);if(!t||!e)return;let A=h0(e);if(!!A){A.lineJoin="round";for(let a=0;a0)for(let a of s.keypoints)A.fillStyle=n.useDepth?j0(a[2]||0):n.color,le(A,a[0],a[1],0,n);if(n.drawLabels&&s.annotations){let a=(i,x)=>{if(!i||i.length===0||!i[0])return;let d=i[i.length-1][2]||0;A.fillStyle=n.useDepth?j0(d):n.color,A.fillText(x,i[i.length-1][0]+4,i[i.length-1][1]+4)};A.font=n.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(n.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]),A.lineTo(i[x][0],i[x][1]),A.stroke()}};A.lineWidth=n.lineWidth,a(s.annotations.index),a(s.annotations.middle),a(s.annotations.ring),a(s.annotations.pinky),a(s.annotations.thumb)}}}}async function je(e,t,o){let n=Y(n0,o);if(!t||!e)return;let A=h0(e);if(!!A){A.lineJoin="round",A.font=n.font;for(let s of t)if(n.drawBoxes){if(A.strokeStyle=n.color,A.fillStyle=n.color,S0(A,s.box[0],s.box[1],s.box[2],s.box[3],n),n.drawLabels){let a=`${s.label} ${Math.round(100*s.score)}%`;n.shadowColor&&n.shadowColor!==""&&(A.fillStyle=n.shadowColor,A.fillText(a,s.box[0]+3,1+s.box[1]+n.lineHeight,s.box[2])),A.fillStyle=n.labelColor,A.fillText(a,s.box[0]+2,0+s.box[1]+n.lineHeight,s.box[2])}A.stroke()}}}async function Se(e,t,o){let n=Y(n0,o);if(!(!t||!e)&&n.drawGestures){let A=h0(e);if(!A)return;A.font=n.font,A.fillStyle=n.color;let s=1;for(let a=0;a1&&x[1].length>0){let d=i[1]>0?`#${i[1]}`:"",l=`${i[0]} ${d}: ${x[1]}`;n.shadowColor&&n.shadowColor!==""&&(A.fillStyle=n.shadowColor,A.fillText(l,8,2+s*n.lineHeight)),A.fillStyle=n.labelColor,A.fillText(l,6,0+s*n.lineHeight),s+=1}}}}var yo=0;async function xo(e,t,o){let n=Y(n0,o);if(!t||!e)return;let A=h0(e);if(!!A){A.lineJoin="round",A.font=n.font;for(let s=0;st!=o[A].y>t&&e<(o[A].x-o[s].x)*(t-o[s].y)/(o[A].y-o[s].y)+o[s].x&&(n=!n);return n}async function er(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,n=await e.tensor.buffer(),A=[];for(let a of M0.silhouette)A.push({x:(e.mesh[a][0]-e.box[0])/e.box[2],y:(e.mesh[a][1]-e.box[1])/e.box[3]});Ce&&Ce>0&&(A=A.map(a=>({x:a.x>.5?a.x+Ce:a.x-Ce,y:a.y>.5?a.y+Ce:a.y-Ce})));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],n=1,A=(e.mesh[33][2]||0)>(e.mesh[263][2]||0),s=A?e.mesh[473]:e.mesh[468],a=A?[(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=A?[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],n*(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}},tr=(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},n=(m,v)=>{let M=m[0]-v[0],u=m[1]-v[1],p=m[2]-v[2];return[M,u,p]},A=(m,v)=>{let M=m[1]*v[2]-m[2]*v[1],u=m[2]*v[0]-m[0]*v[2],p=m[0]*v[1]-m[1]*v[0];return[M,u,p]},s=m=>{let[v,M,u,p,P,R,S,O,C]=m,I,V,G;return p<1?p>-1?(G=Math.asin(p),V=Math.atan2(-S,v),I=Math.atan2(-R,P)):(G=-Math.PI/2,V=-Math.atan2(O,C),I=0):(G=Math.PI/2,V=Math.atan2(O,C),I=0),isNaN(I)&&(I=0),isNaN(V)&&(V=0),isNaN(G)&&(G=0),{pitch:2*-I,yaw:2*-V,roll:2*-G}},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(n(x[1],x[0])),l=o(n(x[3],x[2])),y=o(A(l,d));l=A(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?Z2(e):{bearing:0,strength:0};return{angle:f,matrix:c,gaze:h}};var po=async(e,t)=>{var f,h,m,v,M,u,p,P,R,S,O,C,I,V,G,B,J,z,p0,V0,T,e0;let o=g(),n,A,s,a,i,x,d,l,y=[];e.state="run:face";let c=await qn(t,e.config);if(e.performance.face=w.perfadd?(e.performance.face||0)+Math.trunc(g()-o):Math.trunc(g()-o),!t.shape||t.shape.length!==4)return[];if(!c)return[];for(let E=0;E200?tr(c[E],[t.shape[2],t.shape[1]]):null;e.analyze("Start Emotion:"),e.config.async?a=(h=e.config.face.emotion)!=null&&h.enabled?v5(c[E].tensor||r.tensor([]),e.config,E,c.length):[]:(e.state="run:emotion",o=g(),a=(m=e.config.face.emotion)!=null&&m.enabled?await v5(c[E].tensor||r.tensor([]),e.config,E,c.length):[],e.performance.emotion=w.perfadd?(e.performance.emotion||0)+Math.trunc(g()-o):Math.trunc(g()-o)),e.analyze("End Emotion:"),e.analyze("Start AntiSpoof:"),e.config.async?x=(v=e.config.face.antispoof)!=null&&v.enabled?o5(c[E].tensor||r.tensor([]),e.config,E,c.length):0:(e.state="run:antispoof",o=g(),x=(M=e.config.face.antispoof)!=null&&M.enabled?await o5(c[E].tensor||r.tensor([]),e.config,E,c.length):0,e.performance.antispoof=w.perfadd?(e.performance.antispoof||0)+Math.trunc(g()-o):Math.trunc(g()-o)),e.analyze("End AntiSpoof:"),e.analyze("Start Liveness:"),e.config.async?d=(u=e.config.face.liveness)!=null&&u.enabled?Z5(c[E].tensor||r.tensor([]),e.config,E,c.length):0:(e.state="run:liveness",o=g(),d=(p=e.config.face.liveness)!=null&&p.enabled?await Z5(c[E].tensor||r.tensor([]),e.config,E,c.length):0,e.performance.liveness=w.perfadd?(e.performance.antispoof||0)+Math.trunc(g()-o):Math.trunc(g()-o)),e.analyze("End Liveness:"),e.analyze("Start GEAR:"),e.config.async?A=(P=e.config.face.gear)!=null&&P.enabled?Yt(c[E].tensor||r.tensor([]),e.config,E,c.length):null:(e.state="run:gear",o=g(),A=(R=e.config.face.gear)!=null&&R.enabled?await Yt(c[E].tensor||r.tensor([]),e.config,E,c.length):null,e.performance.gear=Math.trunc(g()-o)),e.analyze("End GEAR:"),e.analyze("Start SSRNet:"),e.config.async?(n=(S=e.config.face.ssrnet)!=null&&S.enabled?Qt(c[E].tensor||r.tensor([]),e.config,E,c.length):null,s=(O=e.config.face.ssrnet)!=null&&O.enabled?e5(c[E].tensor||r.tensor([]),e.config,E,c.length):null):(e.state="run:ssrnet",o=g(),n=(C=e.config.face.ssrnet)!=null&&C.enabled?await Qt(c[E].tensor||r.tensor([]),e.config,E,c.length):null,s=(I=e.config.face.ssrnet)!=null&&I.enabled?await e5(c[E].tensor||r.tensor([]),e.config,E,c.length):null,e.performance.ssrnet=Math.trunc(g()-o)),e.analyze("End SSRNet:"),e.analyze("Start MobileFaceNet:"),e.config.async?i=(V=e.config.face.mobilefacenet)!=null&&V.enabled?w5(c[E].tensor||r.tensor([]),e.config,E,c.length):null:(e.state="run:mobilefacenet",o=g(),i=(G=e.config.face.mobilefacenet)!=null&&G.enabled?await w5(c[E].tensor||r.tensor([]),e.config,E,c.length):null,e.performance.mobilefacenet=Math.trunc(g()-o)),e.analyze("End MobileFaceNet:"),e.analyze("Start Description:"),e.config.async?l=(B=e.config.face.description)!=null&&B.enabled?S5(c[E].tensor||r.tensor([]),e.config,E,c.length):null:(e.state="run:description",o=g(),l=(J=e.config.face.description)!=null&&J.enabled?await S5(c[E].tensor||r.tensor([]),e.config,E,c.length):null,e.performance.description=w.perfadd?(e.performance.description||0)+Math.trunc(g()-o):Math.trunc(g()-o)),e.analyze("End Description:"),e.config.async&&([n,s,a,i,l,A,x,d]=await Promise.all([n,s,a,i,l,A,x,d])),e.analyze("Finish Face:"),((z=e.config.face.ssrnet)==null?void 0:z.enabled)&&n&&s&&(l={...l,age:n.age,gender:s.gender,genderScore:s.genderScore}),((p0=e.config.face.gear)==null?void 0:p0.enabled)&&A&&(l={...l,age:A.age,gender:A.gender,genderScore:A.genderScore,race:A.race}),((V0=e.config.face.mobilefacenet)==null?void 0:V0.enabled)&&i&&(l.descriptor=i),(T=e.config.face.iris)!=null&&T.enabled;let Q=c[E].annotations&&c[E].annotations.leftEyeIris&&c[E].annotations.leftEyeIris[0]&&c[E].annotations.rightEyeIris&&c[E].annotations.rightEyeIris[0]&&c[E].annotations.leftEyeIris.length>0&&c[E].annotations.rightEyeIris.length>0&&c[E].annotations.leftEyeIris[0]!==null&&c[E].annotations.rightEyeIris[0]!==null?Math.max(Math.abs(c[E].annotations.leftEyeIris[3][0]-c[E].annotations.leftEyeIris[1][0]),Math.abs(c[E].annotations.rightEyeIris[4][1]-c[E].annotations.rightEyeIris[2][1]))/t.shape[2]:0,o0=(e0=e.config.face.detector)!=null&&e0.return?r.squeeze(c[E].tensor):null;r.dispose(c[E].tensor),c[E].tensor&&delete c[E].tensor;let W={...c[E],id:E};l!=null&&l.age&&(W.age=l.age),l!=null&&l.gender&&(W.gender=l.gender),l!=null&&l.genderScore&&(W.genderScore=l==null?void 0:l.genderScore),l!=null&&l.descriptor&&(W.embedding=l==null?void 0:l.descriptor),l!=null&&l.race&&(W.race=l==null?void 0:l.race),a&&(W.emotion=a),x&&(W.real=x),d&&(W.live=d),Q&&Q!==0&&(W.iris=Math.trunc(500/Q/11.7)/100),X&&(W.rotation=X),o0&&(W.tensor=o0),y.push(W),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 or=e=>{if(!e)return[];let t=[];for(let o=0;ox.part==="leftWrist"),A=e[o].keypoints.find(x=>x.part==="rightWrist"),s=e[o].keypoints.find(x=>x.part==="nose");s&&n&&A&&n.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},nr=e=>{if(!e)return[];let t=[];for(let o=0;o450){let n=(e[o].mesh[33][2]||0)-(e[o].mesh[263][2]||0),A=e[o].mesh[33][0]-e[o].mesh[263][0];Math.abs(n/A)<=.15?t.push({face:o,gesture:"facing center"}):t.push({face:o,gesture:`facing ${n<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},Ar=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},rr=e=>{if(!e)return[];let t=[];for(let o=0;o0){let A=n.reduce((a,i)=>(a.position[2]||0)<(i.position[2]||0)?a:i);t.push({hand:o,gesture:`${A.name} forward`});let s=n.reduce((a,i)=>a.position[1]((A-1)*j.body[T].box[H]+W)/A),E=e.body[T].boxRaw.map((W,H)=>((A-1)*j.body[T].boxRaw[H]+W)/A),X=e.body[T].keypoints.map((W,H)=>{var C0,W0,Oe,Ie,ye,go,Mo,Po,vo;return{score:W.score,part:W.part,position:[j.body[T].keypoints[H]?((A-1)*(j.body[T].keypoints[H].position[0]||0)+(W.position[0]||0))/A:W.position[0],j.body[T].keypoints[H]?((A-1)*(j.body[T].keypoints[H].position[1]||0)+(W.position[1]||0))/A:W.position[1],j.body[T].keypoints[H]?((A-1)*(j.body[T].keypoints[H].position[2]||0)+(W.position[2]||0))/A:W.position[2]],positionRaw:[j.body[T].keypoints[H]?((A-1)*(j.body[T].keypoints[H].positionRaw[0]||0)+(W.positionRaw[0]||0))/A:W.positionRaw[0],j.body[T].keypoints[H]?((A-1)*(j.body[T].keypoints[H].positionRaw[1]||0)+(W.positionRaw[1]||0))/A:W.positionRaw[1],j.body[T].keypoints[H]?((A-1)*(j.body[T].keypoints[H].positionRaw[2]||0)+(W.positionRaw[2]||0))/A:W.positionRaw[2]],distance:[j.body[T].keypoints[H]?((A-1)*(((C0=j.body[T].keypoints[H].distance)==null?void 0:C0[0])||0)+(((W0=W.distance)==null?void 0:W0[0])||0))/A:(Oe=W.distance)==null?void 0:Oe[0],j.body[T].keypoints[H]?((A-1)*(((Ie=j.body[T].keypoints[H].distance)==null?void 0:Ie[1])||0)+(((ye=W.distance)==null?void 0:ye[1])||0))/A:(go=W.distance)==null?void 0:go[1],j.body[T].keypoints[H]?((A-1)*(((Mo=j.body[T].keypoints[H].distance)==null?void 0:Mo[2])||0)+(((Po=W.distance)==null?void 0:Po[2])||0))/A:(vo=W.distance)==null?void 0:vo[2]]}}),Q={},o0={connected:{}};(i=(a=t.body)==null?void 0:a.modelPath)!=null&&i.includes("efficientpose")?o0=ft:(d=(x=t.body)==null?void 0:x.modelPath)!=null&&d.includes("blazepose")?o0=lt:(y=(l=t.body)==null?void 0:l.modelPath)!=null&&y.includes("movenet")&&(o0=qe);for(let[W,H]of Object.entries(o0.connected)){let C0=[];for(let W0=0;W0ye.part===H[W0]),Ie=X.find(ye=>ye.part===H[W0+1]);Oe&&Ie&&C0.push([Oe.position,Ie.position])}Q[W]=C0}j.body[T]={...e.body[T],box:e0,boxRaw:E,keypoints:X,annotations:Q}}if(!j.hand||e.hand.length!==j.hand.length)j.hand=JSON.parse(JSON.stringify(e.hand));else for(let T=0;T((A-1)*j.hand[T].box[W]+o0)/A),E=e.hand[T].boxRaw.map((o0,W)=>((A-1)*j.hand[T].boxRaw[W]+o0)/A);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((o0,W)=>o0.map((H,C0)=>((A-1)*(j.hand[T].keypoints[W][C0]||1)+(H||0))/A)):[],Q={};if(Object.keys(j.hand[T].annotations).length!==Object.keys(e.hand[T].annotations).length)j.hand[T].annotations=e.hand[T].annotations,Q=j.hand[T].annotations;else if(e.hand[T].annotations)for(let o0 of Object.keys(e.hand[T].annotations))Q[o0]=e.hand[T].annotations[o0]&&e.hand[T].annotations[o0][0]?e.hand[T].annotations[o0].map((W,H)=>W.map((C0,W0)=>((A-1)*j.hand[T].annotations[o0][H][W0]+C0)/A)):null;j.hand[T]={...e.hand[T],box:e0,boxRaw:E,keypoints:X,annotations:Q}}if(!j.face||e.face.length!==j.face.length)j.face=JSON.parse(JSON.stringify(e.face));else for(let T=0;T((A-1)*j.face[T].box[Q]+X)/A),E=e.face[T].boxRaw.map((X,Q)=>((A-1)*j.face[T].boxRaw[Q]+X)/A);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:((A-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))/A,yaw:((A-1)*(((u=(M=j.face[T].rotation)==null?void 0:M.angle)==null?void 0:u.yaw)||0)+(((P=(p=e.face[T].rotation)==null?void 0:p.angle)==null?void 0:P.yaw)||0))/A,pitch:((A-1)*(((S=(R=j.face[T].rotation)==null?void 0:R.angle)==null?void 0:S.pitch)||0)+(((C=(O=e.face[T].rotation)==null?void 0:O.angle)==null?void 0:C.pitch)||0))/A},X.gaze={bearing:((A-1)*(((V=(I=j.face[T].rotation)==null?void 0:I.gaze)==null?void 0:V.bearing)||0)+(((B=(G=e.face[T].rotation)==null?void 0:G.gaze)==null?void 0:B.bearing)||0))/A,strength:((A-1)*(((z=(J=j.face[T].rotation)==null?void 0:J.gaze)==null?void 0:z.strength)||0)+(((V0=(p0=e.face[T].rotation)==null?void 0:p0.gaze)==null?void 0:V0.strength)||0))/A},j.face[T]={...e.face[T],rotation:X,box:e0,boxRaw:E}}j.face[T]={...e.face[T],box:e0,boxRaw:E}}if(!j.object||e.object.length!==j.object.length)j.object=JSON.parse(JSON.stringify(e.object));else for(let T=0;T((A-1)*j.object[T].box[Q]+X)/A),E=e.object[T].boxRaw.map((X,Q)=>((A-1)*j.object[T].boxRaw[Q]+X)/A);j.object[T]={...e.object[T],box:e0,boxRaw:E}}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 e0=0;e0((A-1)*j.persons[e0].box[X]+E)/A)}e.gesture&&(j.gesture=e.gesture);let s=g();return uo=w.perfadd?uo+Math.round(s-o):Math.round(s-o),e.performance&&(j.performance={...e.performance,interpolate:uo}),j}var ir={};$0(ir,{distance:()=>Ke,match:()=>bo,similarity:()=>ho});function Ke(e,t,o={order:2,multiplier:25}){let n=0;for(let A=0;A{if(e===0)return 1;let A=t===2?Math.sqrt(e):e**(1/t),s=(1-A/100-o)/(n-o);return Math.max(Math.min(s,1),0)};function ho(e,t,o={order:2,multiplier:25,min:.2,max:.8}){let n=Ke(e,t,o);return ar(n,o.order||2,o.min||0,o.max||1)}function bo(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 n=Number.MAX_SAFE_INTEGER,A=-1;for(let a=0;az.box[0]&&O.box[0]z.box[1]&&O.box[1]+O.box[3]C.body.box[0]&&z.box[0]+z.box[2]C.body.box[1]&&z.box[1]+z.box[3]C.body.box[0]&&z.box[1]+z.box[3]>C.body.box[1]&&z.box[1]+z.box[3]{z&&z.length===4&&(I.push(z[0],z[0]+z[2]),V.push(z[1],z[1]+z[3]))};G((M=C.face)==null?void 0:M.box),G((u=C.body)==null?void 0:u.box),G((P=(p=C.hands)==null?void 0:p.left)==null?void 0:P.box),G((S=(R=C.hands)==null?void 0:R.right)==null?void 0:S.box);let B=Math.min(...I),J=Math.min(...V);C.box=[B,J,Math.max(...I)-B,Math.max(...V)-J],A&&A[1]&&A[2]&&(C.boxRaw=[C.box[0]/A[2],C.box[1]/A[1],C.box[2]/A[2],C.box[3]/A[1]]),a.push(C)}return a}var Nt=` + `);A.stroke(h),A.stroke(f)}if(n.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]){A.strokeStyle="pink",A.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]];yo(A,[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]];yo(A,[l.annotations.rightEyeIris[0][0],l.annotations.rightEyeIris[0][1]],[c[0],c[1]],4)}}}}}async function ze(e,t,o){var s;let n=Y(n0,o);if(!t||!e)return;let A=h0(e);if(!!A){A.lineJoin="round";for(let a=0;a0)for(let a of s.keypoints)A.fillStyle=n.useDepth?S0(a[2]||0):n.color,ye(A,a[0],a[1],0,n);if(n.drawLabels&&s.annotations){let a=(i,x)=>{if(!i||i.length===0||!i[0])return;let d=i[i.length-1][2]||0;A.fillStyle=n.useDepth?S0(d):n.color,A.fillText(x,i[i.length-1][0]+4,i[i.length-1][1]+4)};A.font=n.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(n.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]),A.lineTo(i[x][0],i[x][1]),A.stroke()}};A.lineWidth=n.lineWidth,a(s.annotations.index),a(s.annotations.middle),a(s.annotations.ring),a(s.annotations.pinky),a(s.annotations.thumb)}}}}async function Se(e,t,o){let n=Y(n0,o);if(!t||!e)return;let A=h0(e);if(!!A){A.lineJoin="round",A.font=n.font;for(let s of t)if(n.drawBoxes){if(A.strokeStyle=n.color,A.fillStyle=n.color,W0(A,s.box[0],s.box[1],s.box[2],s.box[3],n),n.drawLabels){let a=`${s.label} ${Math.round(100*s.score)}%`;n.shadowColor&&n.shadowColor!==""&&(A.fillStyle=n.shadowColor,A.fillText(a,s.box[0]+3,1+s.box[1]+n.lineHeight,s.box[2])),A.fillStyle=n.labelColor,A.fillText(a,s.box[0]+2,0+s.box[1]+n.lineHeight,s.box[2])}A.stroke()}}}async function We(e,t,o){let n=Y(n0,o);if(!(!t||!e)&&n.drawGestures){let A=h0(e);if(!A)return;A.font=n.font,A.fillStyle=n.color;let s=1;for(let a=0;a1&&x[1].length>0){let d=i[1]>0?`#${i[1]}`:"",l=`${i[0]} ${d}: ${x[1]}`;n.shadowColor&&n.shadowColor!==""&&(A.fillStyle=n.shadowColor,A.fillText(l,8,2+s*n.lineHeight)),A.fillStyle=n.labelColor,A.fillText(l,6,0+s*n.lineHeight),s+=1}}}}var xo=0;async function co(e,t,o){let n=Y(n0,o);if(!t||!e)return;let A=h0(e);if(!!A){A.lineJoin="round",A.font=n.font;for(let s=0;st!=o[A].y>t&&e<(o[A].x-o[s].x)*(t-o[s].y)/(o[A].y-o[s].y)+o[s].x&&(n=!n);return n}async function tr(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,n=await e.tensor.buffer(),A=[];for(let a of M0.silhouette)A.push({x:(e.mesh[a][0]-e.box[0])/e.box[2],y:(e.mesh[a][1]-e.box[1])/e.box[3]});Ce&&Ce>0&&(A=A.map(a=>({x:a.x>.5?a.x+Ce:a.x-Ce,y:a.y>.5?a.y+Ce:a.y-Ce})));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],n=1,A=(e.mesh[33][2]||0)>(e.mesh[263][2]||0),s=A?e.mesh[473]:e.mesh[468],a=A?[(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=A?[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],n*(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}},or=(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},n=(m,v)=>{let M=m[0]-v[0],u=m[1]-v[1],p=m[2]-v[2];return[M,u,p]},A=(m,v)=>{let M=m[1]*v[2]-m[2]*v[1],u=m[2]*v[0]-m[0]*v[2],p=m[0]*v[1]-m[1]*v[0];return[M,u,p]},s=m=>{let[v,M,u,p,P,w,S,O,W]=m,I,V,G;return p<1?p>-1?(G=Math.asin(p),V=Math.atan2(-S,v),I=Math.atan2(-w,P)):(G=-Math.PI/2,V=-Math.atan2(O,W),I=0):(G=Math.PI/2,V=Math.atan2(O,W),I=0),isNaN(I)&&(I=0),isNaN(V)&&(V=0),isNaN(G)&&(G=0),{pitch:2*-I,yaw:2*-V,roll:2*-G}},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(n(x[1],x[0])),l=o(n(x[3],x[2])),y=o(A(l,d));l=A(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?D2(e):{bearing:0,strength:0};return{angle:f,matrix:c,gaze:h}};var uo=async(e,t)=>{var f,h,m,v,M,u,p,P,w,S,O,W,I,V,G,B,J,z,P0,p0,T,e0;let o=g(),n,A,s,a,i,x,d,l,y=[];e.state="run:face";let c=await Un(t,e.config);if(e.performance.face=R.perfadd?(e.performance.face||0)+Math.trunc(g()-o):Math.trunc(g()-o),!t.shape||t.shape.length!==4)return[];if(!c)return[];for(let E=0;E200?or(c[E],[t.shape[2],t.shape[1]]):null;e.analyze("Start Emotion:"),e.config.async?a=(h=e.config.face.emotion)!=null&&h.enabled?T5(c[E].tensor||r.tensor([]),e.config,E,c.length):[]:(e.state="run:emotion",o=g(),a=(m=e.config.face.emotion)!=null&&m.enabled?await T5(c[E].tensor||r.tensor([]),e.config,E,c.length):[],e.performance.emotion=R.perfadd?(e.performance.emotion||0)+Math.trunc(g()-o):Math.trunc(g()-o)),e.analyze("End Emotion:"),e.analyze("Start AntiSpoof:"),e.config.async?x=(v=e.config.face.antispoof)!=null&&v.enabled?n5(c[E].tensor||r.tensor([]),e.config,E,c.length):0:(e.state="run:antispoof",o=g(),x=(M=e.config.face.antispoof)!=null&&M.enabled?await n5(c[E].tensor||r.tensor([]),e.config,E,c.length):0,e.performance.antispoof=R.perfadd?(e.performance.antispoof||0)+Math.trunc(g()-o):Math.trunc(g()-o)),e.analyze("End AntiSpoof:"),e.analyze("Start Liveness:"),e.config.async?d=(u=e.config.face.liveness)!=null&&u.enabled?D5(c[E].tensor||r.tensor([]),e.config,E,c.length):0:(e.state="run:liveness",o=g(),d=(p=e.config.face.liveness)!=null&&p.enabled?await D5(c[E].tensor||r.tensor([]),e.config,E,c.length):0,e.performance.liveness=R.perfadd?(e.performance.antispoof||0)+Math.trunc(g()-o):Math.trunc(g()-o)),e.analyze("End Liveness:"),e.analyze("Start GEAR:"),e.config.async?A=(P=e.config.face.gear)!=null&&P.enabled?Kt(c[E].tensor||r.tensor([]),e.config,E,c.length):null:(e.state="run:gear",o=g(),A=(w=e.config.face.gear)!=null&&w.enabled?await Kt(c[E].tensor||r.tensor([]),e.config,E,c.length):null,e.performance.gear=Math.trunc(g()-o)),e.analyze("End GEAR:"),e.analyze("Start SSRNet:"),e.config.async?(n=(S=e.config.face.ssrnet)!=null&&S.enabled?_t(c[E].tensor||r.tensor([]),e.config,E,c.length):null,s=(O=e.config.face.ssrnet)!=null&&O.enabled?t5(c[E].tensor||r.tensor([]),e.config,E,c.length):null):(e.state="run:ssrnet",o=g(),n=(W=e.config.face.ssrnet)!=null&&W.enabled?await _t(c[E].tensor||r.tensor([]),e.config,E,c.length):null,s=(I=e.config.face.ssrnet)!=null&&I.enabled?await t5(c[E].tensor||r.tensor([]),e.config,E,c.length):null,e.performance.ssrnet=Math.trunc(g()-o)),e.analyze("End SSRNet:"),e.analyze("Start MobileFaceNet:"),e.config.async?i=(V=e.config.face.mobilefacenet)!=null&&V.enabled?w5(c[E].tensor||r.tensor([]),e.config,E,c.length):null:(e.state="run:mobilefacenet",o=g(),i=(G=e.config.face.mobilefacenet)!=null&&G.enabled?await w5(c[E].tensor||r.tensor([]),e.config,E,c.length):null,e.performance.mobilefacenet=Math.trunc(g()-o)),e.analyze("End MobileFaceNet:"),e.analyze("Start Description:"),e.config.async?l=(B=e.config.face.description)!=null&&B.enabled?W5(c[E].tensor||r.tensor([]),e.config,E,c.length):null:(e.state="run:description",o=g(),l=(J=e.config.face.description)!=null&&J.enabled?await W5(c[E].tensor||r.tensor([]),e.config,E,c.length):null,e.performance.description=R.perfadd?(e.performance.description||0)+Math.trunc(g()-o):Math.trunc(g()-o)),e.analyze("End Description:"),e.config.async&&([n,s,a,i,l,A,x,d]=await Promise.all([n,s,a,i,l,A,x,d])),e.analyze("Finish Face:"),((z=e.config.face.ssrnet)==null?void 0:z.enabled)&&n&&s&&(l={...l,age:n.age,gender:s.gender,genderScore:s.genderScore}),((P0=e.config.face.gear)==null?void 0:P0.enabled)&&A&&(l={...l,age:A.age,gender:A.gender,genderScore:A.genderScore,race:A.race}),((p0=e.config.face.mobilefacenet)==null?void 0:p0.enabled)&&i&&(l.descriptor=i),(T=e.config.face.iris)!=null&&T.enabled;let Q=c[E].annotations&&c[E].annotations.leftEyeIris&&c[E].annotations.leftEyeIris[0]&&c[E].annotations.rightEyeIris&&c[E].annotations.rightEyeIris[0]&&c[E].annotations.leftEyeIris.length>0&&c[E].annotations.rightEyeIris.length>0&&c[E].annotations.leftEyeIris[0]!==null&&c[E].annotations.rightEyeIris[0]!==null?Math.max(Math.abs(c[E].annotations.leftEyeIris[3][0]-c[E].annotations.leftEyeIris[1][0]),Math.abs(c[E].annotations.rightEyeIris[4][1]-c[E].annotations.rightEyeIris[2][1]))/t.shape[2]:0,o0=(e0=e.config.face.detector)!=null&&e0.return?r.squeeze(c[E].tensor):null;r.dispose(c[E].tensor),c[E].tensor&&delete c[E].tensor;let C={...c[E],id:E};l!=null&&l.age&&(C.age=l.age),l!=null&&l.gender&&(C.gender=l.gender),l!=null&&l.genderScore&&(C.genderScore=l==null?void 0:l.genderScore),l!=null&&l.descriptor&&(C.embedding=l==null?void 0:l.descriptor),l!=null&&l.race&&(C.race=l==null?void 0:l.race),a&&(C.emotion=a),x&&(C.real=x),d&&(C.live=d),Q&&Q!==0&&(C.iris=Math.trunc(500/Q/11.7)/100),D&&(C.rotation=D),o0&&(C.tensor=o0),y.push(C),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 nr=e=>{if(!e)return[];let t=[];for(let o=0;ox.part==="leftWrist"),A=e[o].keypoints.find(x=>x.part==="rightWrist"),s=e[o].keypoints.find(x=>x.part==="nose");s&&n&&A&&n.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},Ar=e=>{if(!e)return[];let t=[];for(let o=0;o450){let n=(e[o].mesh[33][2]||0)-(e[o].mesh[263][2]||0),A=e[o].mesh[33][0]-e[o].mesh[263][0];Math.abs(n/A)<=.15?t.push({face:o,gesture:"facing center"}):t.push({face:o,gesture:`facing ${n<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},rr=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},sr=e=>{if(!e)return[];let t=[];for(let o=0;o0){let A=n.reduce((a,i)=>(a.position[2]||0)<(i.position[2]||0)?a:i);t.push({hand:o,gesture:`${A.name} forward`});let s=n.reduce((a,i)=>a.position[1]((A-1)*j.body[T].box[H]+C)/A),E=e.body[T].boxRaw.map((C,H)=>((A-1)*j.body[T].boxRaw[H]+C)/A),D=e.body[T].keypoints.map((C,H)=>{var C0,O0,Ie,Le,xe,Mo,Po,vo,To;return{score:C.score,part:C.part,position:[j.body[T].keypoints[H]?((A-1)*(j.body[T].keypoints[H].position[0]||0)+(C.position[0]||0))/A:C.position[0],j.body[T].keypoints[H]?((A-1)*(j.body[T].keypoints[H].position[1]||0)+(C.position[1]||0))/A:C.position[1],j.body[T].keypoints[H]?((A-1)*(j.body[T].keypoints[H].position[2]||0)+(C.position[2]||0))/A:C.position[2]],positionRaw:[j.body[T].keypoints[H]?((A-1)*(j.body[T].keypoints[H].positionRaw[0]||0)+(C.positionRaw[0]||0))/A:C.positionRaw[0],j.body[T].keypoints[H]?((A-1)*(j.body[T].keypoints[H].positionRaw[1]||0)+(C.positionRaw[1]||0))/A:C.positionRaw[1],j.body[T].keypoints[H]?((A-1)*(j.body[T].keypoints[H].positionRaw[2]||0)+(C.positionRaw[2]||0))/A:C.positionRaw[2]],distance:[j.body[T].keypoints[H]?((A-1)*(((C0=j.body[T].keypoints[H].distance)==null?void 0:C0[0])||0)+(((O0=C.distance)==null?void 0:O0[0])||0))/A:(Ie=C.distance)==null?void 0:Ie[0],j.body[T].keypoints[H]?((A-1)*(((Le=j.body[T].keypoints[H].distance)==null?void 0:Le[1])||0)+(((xe=C.distance)==null?void 0:xe[1])||0))/A:(Mo=C.distance)==null?void 0:Mo[1],j.body[T].keypoints[H]?((A-1)*(((Po=j.body[T].keypoints[H].distance)==null?void 0:Po[2])||0)+(((vo=C.distance)==null?void 0:vo[2])||0))/A:(To=C.distance)==null?void 0:To[2]]}}),Q={},o0={connected:{}};(i=(a=t.body)==null?void 0:a.modelPath)!=null&&i.includes("efficientpose")?o0=mt:(d=(x=t.body)==null?void 0:x.modelPath)!=null&&d.includes("blazepose")?o0=yt:(y=(l=t.body)==null?void 0:l.modelPath)!=null&&y.includes("movenet")&&(o0=Ue);for(let[C,H]of Object.entries(o0.connected)){let C0=[];for(let O0=0;O0xe.part===H[O0]),Le=D.find(xe=>xe.part===H[O0+1]);Ie&&Le&&C0.push([Ie.position,Le.position])}Q[C]=C0}j.body[T]={...e.body[T],box:e0,boxRaw:E,keypoints:D,annotations:Q}}if(!j.hand||e.hand.length!==j.hand.length)j.hand=JSON.parse(JSON.stringify(e.hand));else for(let T=0;T((A-1)*j.hand[T].box[C]+o0)/A),E=e.hand[T].boxRaw.map((o0,C)=>((A-1)*j.hand[T].boxRaw[C]+o0)/A);j.hand[T].keypoints.length!==e.hand[T].keypoints.length&&(j.hand[T].keypoints=e.hand[T].keypoints);let D=e.hand[T].keypoints&&e.hand[T].keypoints.length>0?e.hand[T].keypoints.map((o0,C)=>o0.map((H,C0)=>((A-1)*(j.hand[T].keypoints[C][C0]||1)+(H||0))/A)):[],Q={};if(Object.keys(j.hand[T].annotations).length!==Object.keys(e.hand[T].annotations).length)j.hand[T].annotations=e.hand[T].annotations,Q=j.hand[T].annotations;else if(e.hand[T].annotations)for(let o0 of Object.keys(e.hand[T].annotations))Q[o0]=e.hand[T].annotations[o0]&&e.hand[T].annotations[o0][0]?e.hand[T].annotations[o0].map((C,H)=>C.map((C0,O0)=>((A-1)*j.hand[T].annotations[o0][H][O0]+C0)/A)):null;j.hand[T]={...e.hand[T],box:e0,boxRaw:E,keypoints:D,annotations:Q}}if(!j.face||e.face.length!==j.face.length)j.face=JSON.parse(JSON.stringify(e.face));else for(let T=0;T((A-1)*j.face[T].box[Q]+D)/A),E=e.face[T].boxRaw.map((D,Q)=>((A-1)*j.face[T].boxRaw[Q]+D)/A);if(e.face[T].rotation){let D={matrix:[0,0,0,0,0,0,0,0,0],angle:{roll:0,yaw:0,pitch:0},gaze:{bearing:0,strength:0}};D.matrix=(c=e.face[T].rotation)==null?void 0:c.matrix,D.angle={roll:((A-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))/A,yaw:((A-1)*(((u=(M=j.face[T].rotation)==null?void 0:M.angle)==null?void 0:u.yaw)||0)+(((P=(p=e.face[T].rotation)==null?void 0:p.angle)==null?void 0:P.yaw)||0))/A,pitch:((A-1)*(((S=(w=j.face[T].rotation)==null?void 0:w.angle)==null?void 0:S.pitch)||0)+(((W=(O=e.face[T].rotation)==null?void 0:O.angle)==null?void 0:W.pitch)||0))/A},D.gaze={bearing:((A-1)*(((V=(I=j.face[T].rotation)==null?void 0:I.gaze)==null?void 0:V.bearing)||0)+(((B=(G=e.face[T].rotation)==null?void 0:G.gaze)==null?void 0:B.bearing)||0))/A,strength:((A-1)*(((z=(J=j.face[T].rotation)==null?void 0:J.gaze)==null?void 0:z.strength)||0)+(((p0=(P0=e.face[T].rotation)==null?void 0:P0.gaze)==null?void 0:p0.strength)||0))/A},j.face[T]={...e.face[T],rotation:D,box:e0,boxRaw:E}}j.face[T]={...e.face[T],box:e0,boxRaw:E}}if(!j.object||e.object.length!==j.object.length)j.object=JSON.parse(JSON.stringify(e.object));else for(let T=0;T((A-1)*j.object[T].box[Q]+D)/A),E=e.object[T].boxRaw.map((D,Q)=>((A-1)*j.object[T].boxRaw[Q]+D)/A);j.object[T]={...e.object[T],box:e0,boxRaw:E}}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 e0=0;e0((A-1)*j.persons[e0].box[D]+E)/A)}e.gesture&&(j.gesture=e.gesture);let s=g();return ho=R.perfadd?ho+Math.round(s-o):Math.round(s-o),e.performance&&(j.performance={...e.performance,interpolate:ho}),j}var lr={};ee(lr,{distance:()=>Qe,match:()=>go,similarity:()=>bo});function Qe(e,t,o={order:2,multiplier:25}){let n=0;for(let A=0;A{if(e===0)return 1;let A=t===2?Math.sqrt(e):e**(1/t),s=(1-A/100-o)/(n-o);return Math.max(Math.min(s,1),0)};function bo(e,t,o={order:2,multiplier:25,min:.2,max:.8}){let n=Qe(e,t,o);return ir(n,o.order||2,o.min||0,o.max||1)}function go(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 n=Number.MAX_SAFE_INTEGER,A=-1;for(let a=0;az.box[0]&&O.box[0]z.box[1]&&O.box[1]+O.box[3]W.body.box[0]&&z.box[0]+z.box[2]W.body.box[1]&&z.box[1]+z.box[3]W.body.box[0]&&z.box[1]+z.box[3]>W.body.box[1]&&z.box[1]+z.box[3]{z&&z.length===4&&(I.push(z[0],z[0]+z[2]),V.push(z[1],z[1]+z[3]))};G((M=W.face)==null?void 0:M.box),G((u=W.body)==null?void 0:u.box),G((P=(p=W.hands)==null?void 0:p.left)==null?void 0:P.box),G((S=(w=W.hands)==null?void 0:w.right)==null?void 0:S.box);let B=Math.min(...I),J=Math.min(...V);W.box=[B,J,Math.max(...I)-B,Math.max(...V)-J],A&&A[1]&&A[2]&&(W.boxRaw=[W.box[0]/A[2],W.box[1]/A[1],W.box[2]/A[2],W.box[3]/A[1]]),a.push(W)}return a}var Gt=` /9j/4AAQSkZJRgABAQEAYABgAAD/4QBoRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUA AAABAAAARgEoAAMAAAABAAIAAAExAAIAAAARAAAATgAAAAAAAABgAAAAAQAAAGAAAAABcGFpbnQu bmV0IDQuMi4xMwAA/9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxob @@ -259,7 +259,7 @@ PQ4GJ+ashuK0MhWaoWcA0AaOmASMK7jRNPWYBmHyiuepO2x10qfcv6vYxCzYqoGK4HVYVTJrmb5l c6oaM5TUJ8EgGsG4kLNUHT0M64OaqMMikSRsuKbnFMRLG3zVehOaGNE445NNlnVFpDMu6uie9Vo1 8z5mOAOST2pDK91cNN+5tsrH3PrW54a06KxT7fdrlh/q1Pc+tJ6IUdZGvHPLezMcnBOWbsPap5r3 ylFtbdT1xUWNWzU0/Zbwlgfmx8zGsHWtRHmMqE59aAMyNifvHPc1f0gtPdqkY5JosJHeNci2tktY -euPnNY+oXWZEVJNrZ9aun8SIq/CzodHuriIokhDIR1ronbKZr0o6o8ipoz//2Q==`,Gt=` +euPnNY+oXWZEVJNrZ9aun8SIq/CzodHuriIokhDIR1ronbKZr0o6o8ipoz//2Q==`,Bt=` /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAsICAoIBwsKCQoNDAsNERwSEQ8PESIZGhQcKSQrKigk JyctMkA3LTA9MCcnOEw5PUNFSElIKzZPVU5GVEBHSEX/2wBDAQwNDREPESESEiFFLicuRUVFRUVF RUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUX/wAARCASwBLADASIA @@ -827,7 +827,7 @@ AAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA BAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2 SbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/ -2Q==`;async function Y2(e){let t=(A,s="application/octet-stream")=>fetch(`data:${s};base64,${A}`).then(a=>a.blob()),o,n;switch(e.config.warmup){case"face":o=await t(Nt);break;case"body":case"full":o=await t(Gt);break;default:o=null}if(o){let A=await createImageBitmap(o);n=await e.detect(A,e.config),A.close()}return n}async function K2(e){return new Promise(t=>{let o;switch(e.config.warmup){case"face":o="data:image/jpeg;base64,"+Nt;break;case"full":case"body":o="data:image/jpeg;base64,"+Gt;break;default:o=null}let n;if(typeof Image!="undefined")n=new Image;else if(w.Image)n=new w.Image;else return;n.onload=async()=>{let A=a0(n.naturalWidth,n.naturalHeight);if(!A)b("Warmup: Canvas not found"),t(void 0);else{let s=A.getContext("2d");s&&s.drawImage(n,0,0);let a=await e.image(A),i=await e.detect(a.tensor,e.config);t(i)}},o?n.src=o:t(void 0)})}async function Q2(e){let t=A=>Buffer.from(A,"base64"),o;e.config.warmup==="face"?o=t(Nt):o=t(Gt);let n;if("node"in r){let A=r.node.decodeJpeg(o),s=A.expandDims(0);e.tf.dispose(A),n=await e.detect(s,e.config),e.tf.dispose(s)}else e.config.debug&&b("Warmup tfjs-node not loaded");return n}async function _2(e){let t;return typeof createImageBitmap=="function"?t=await Y2(e):typeof Image!="undefined"||w.Canvas!==void 0?t=await K2(e):t=await Q2(e),t}async function yr(e,t){let o=g();return e.state="warmup",t&&(e.config=Y(e.config,t)),!e.config.warmup||e.config.warmup.length===0||e.config.warmup==="none"?{face:[],body:[],hand:[],gesture:[],object:[],performance:e.performance,timestamp:g(),persons:[],error:null}:new Promise(async n=>{let A=await _2(e),s=g();e.config.debug&&b("warmup",e.config.warmup,Math.round(s-o),"ms"),e.emit("warmup"),n(A)})}var We,Qe,_e,Bt,xr=class{constructor(t){k(this,"version");k(this,"config");k(this,"result");k(this,"state");k(this,"process");k(this,"tf");k(this,"env");k(this,"draw");k(this,"models");k(this,"events");k(this,"faceTriangulation");k(this,"faceUVMap");k(this,"performance");Ne(this,We,void 0);Ne(this,Qe,void 0);Ne(this,_e,void 0);k(this,"gl");k(this,"analyze",(...t)=>{if(!Le(this,Qe))return;let o=this.tf.engine().state.numTensors,n=Le(this,We);Ge(this,We,o);let A=o-n;A!==0&&b(...t,A)});Ne(this,Bt,t=>{if(!Le(this,_e))return null;if(!t)return"input is not defined";if(this.env.node&&!(t instanceof xe))return"input must be a tensor";try{this.tf.getBackend()}catch(o){return"backend not loaded"}return null});k(this,"similarity",ho);k(this,"distance",Ke);k(this,"match",bo);k(this,"emit",t=>{var o;this.events&&this.events.dispatchEvent&&((o=this.events)==null||o.dispatchEvent(new Event(t)))});this.env=w,ee.wasmPath=Be["tfjs-core"].includes("-")?"https://vladmandic.github.io/tfjs/dist/":`https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${r.version_core}/dist/`,ee.modelBasePath=w.browser?"../models/":"file://models/",ee.backend=w.browser?"humangl":"tensorflow",this.version=qt,Object.defineProperty(this,"version",{value:qt}),this.config=JSON.parse(JSON.stringify(ee)),Object.seal(this.config),this.config.cacheModels=typeof indexedDB!="undefined",t&&(this.config=Y(this.config,t)),Lo(this.config),this.tf=r,this.state="idle",Ge(this,We,0),Ge(this,Qe,!1),Ge(this,_e,!1),this.performance={},this.events=typeof EventTarget!="undefined"?new EventTarget:void 0,this.models=new Ye,this.draw={options:n0,canvas:(o,n)=>co(o,n),face:(o,n,A)=>ke(o,n,A),body:(o,n,A)=>Ee(o,n,A),hand:(o,n,A)=>ze(o,n,A),gesture:(o,n,A)=>Se(o,n,A),object:(o,n,A)=>je(o,n,A),person:(o,n,A)=>xo(o,n,A),all:(o,n,A)=>fo(o,n,A)},this.result={face:[],body:[],hand:[],gesture:[],object:[],performance:{},timestamp:0,persons:[],error:null},this.process={tensor:null,canvas:null},this.faceTriangulation=Jn,this.faceUVMap=Yn,this.gl=q,this.emit("create")}reset(){let t=this.config.backend;this.config=JSON.parse(JSON.stringify(ee)),this.config.backend=t}validate(t){return Ht(ee,t||this.config)}now(){return g()}image(t,o=!0){return de(t,this.config,o)}async segmentation(t,o){return JA(t,o,this.config)}enhance(t){return j5(t)}compare(t,o){return Io(this.config,t,o)}async init(){await Lt(this,!0),await this.tf.ready()}async load(t){this.state="load";let o=g(),n=Object.values(this.models).filter(a=>a).length;t&&(this.config=Y(this.config,t)),this.env.initial&&(this.config.debug&&b(`version: ${this.version}`),this.config.debug&&b(`tfjs version: ${this.tf.version["tfjs-core"]}`),await Lt(this)||b("error: backend check failed"),await r.ready(),this.env.browser&&(this.config.debug&&b("configuration:",this.config),this.config.debug&&b("environment:",this.env),this.config.debug&&b("tf flags:",this.tf.ENV.flags))),await ro(this),this.env.initial&&this.config.debug&&b("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!==n&&(await so(this),this.emit("load"));let s=Math.trunc(g()-o);s>(this.performance.loadModels||0)&&(this.performance.loadModels=this.env.perfadd?(this.performance.loadModels||0)+s:s)}next(t=this.result){return sr(t,this.config)}async warmup(t){let o=g(),n=await yr(this,t),A=g();return this.performance.warmup=Math.trunc(A-o),n}async profile(t,o){let n=await this.tf.profile(()=>this.detect(t,o)),A={};for(let i of n.kernels)A[i.name]?A[i.name]+=i.kernelTimeMs:A[i.name]=i.kernelTimeMs;let s=[];Object.entries(A).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 n=>{var v,M,u,p,P,R,S,O,C,I,V,G,B,J,z,p0,V0,T,e0,E,X,Q;this.state="config";let A;this.config=Y(this.config,o),this.state="check";let s=Le(this,Bt).call(this,t);s&&(b(s,t),this.emit("error"),n({face:[],body:[],hand:[],gesture:[],object:[],performance:this.performance,timestamp:g(),persons:[],error:s}));let a=g();await Lt(this),await this.load(),A=g(),this.state="image";let i=await de(t,this.config);if(this.process=i,this.performance.inputProcess=this.env.perfadd?(this.performance.inputProcess||0)+Math.trunc(g()-A):Math.trunc(g()-A),this.analyze("Get Image:"),!i.tensor){this.config.debug&&b("could not convert input to tensor"),this.emit("error"),n({face:[],body:[],hand:[],gesture:[],object:[],performance:this.performance,timestamp:g(),persons:[],error:"could not convert input to tensor"});return}this.emit("image"),A=g(),this.config.skipAllowed=await Oo(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(g()-A):Math.trunc(g()-A),this.analyze("Check Changed:");let x=[],d=[],l=[],y=[];this.state="detect:face",this.config.async?(x=this.config.face.enabled?po(this,i.tensor):[],this.performance.face&&delete this.performance.face):(A=g(),x=this.config.face.enabled?await po(this,i.tensor):[],this.performance.face=this.env.perfadd?(this.performance.face||0)+Math.trunc(g()-A):Math.trunc(g()-A)),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?Y(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?oo(i.tensor,c):[]:(M=this.config.body.modelPath)!=null&&M.includes("blazepose")?d=this.config.body.enabled?f5(i.tensor,c):[]:(u=this.config.body.modelPath)!=null&&u.includes("efficientpose")?d=this.config.body.enabled?M5(i.tensor,c):[]:(p=this.config.body.modelPath)!=null&&p.includes("movenet")&&(d=this.config.body.enabled?Y5(i.tensor,c):[]),this.performance.body&&delete this.performance.body):(A=g(),(P=this.config.body.modelPath)!=null&&P.includes("posenet")?d=this.config.body.enabled?await oo(i.tensor,c):[]:(R=this.config.body.modelPath)!=null&&R.includes("blazepose")?d=this.config.body.enabled?await f5(i.tensor,c):[]:(S=this.config.body.modelPath)!=null&&S.includes("efficientpose")?d=this.config.body.enabled?await M5(i.tensor,c):[]:(O=this.config.body.modelPath)!=null&&O.includes("movenet")&&(d=this.config.body.enabled?await Y5(i.tensor,c):[]),this.performance.body=this.env.perfadd?(this.performance.body||0)+Math.trunc(g()-A):Math.trunc(g()-A)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.state="detect:hand";let f=this.config.hand.maxDetected===-1?Y(this.config,{hand:{maxDetected:this.config.face.enabled?2*x.length:1}}):this.config;this.config.async?((I=(C=this.config.hand.detector)==null?void 0:C.modelPath)!=null&&I.includes("handdetect")?l=this.config.hand.enabled?N5(i.tensor,f):[]:(G=(V=this.config.hand.detector)==null?void 0:V.modelPath)!=null&&G.includes("handtrack")&&(l=this.config.hand.enabled?H5(i.tensor,f):[]),this.performance.hand&&delete this.performance.hand):(A=g(),(J=(B=this.config.hand.detector)==null?void 0:B.modelPath)!=null&&J.includes("handdetect")?l=this.config.hand.enabled?await N5(i.tensor,f):[]:(p0=(z=this.config.hand.detector)==null?void 0:z.modelPath)!=null&&p0.includes("handtrack")&&(l=this.config.hand.enabled?await H5(i.tensor,f):[]),this.performance.hand=this.env.perfadd?(this.performance.hand||0)+Math.trunc(g()-A):Math.trunc(g()-A)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.state="detect:object",this.config.async?((V0=this.config.object.modelPath)!=null&&V0.includes("nanodet")?y=this.config.object.enabled?Q5(i.tensor,this.config):[]:(T=this.config.object.modelPath)!=null&&T.includes("centernet")&&(y=this.config.object.enabled?u5(i.tensor,this.config):[]),this.performance.object&&delete this.performance.object):(A=g(),(e0=this.config.object.modelPath)!=null&&e0.includes("nanodet")?y=this.config.object.enabled?await Q5(i.tensor,this.config):[]:(E=this.config.object.modelPath)!=null&&E.includes("centernet")&&(y=this.config.object.enabled?await u5(i.tensor,this.config):[]),this.performance.object=this.env.perfadd?(this.performance.object||0)+Math.trunc(g()-A):Math.trunc(g()-A)),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&&(A=g(),h=[...nr(x),...or(d),...rr(l),...Ar(x)],this.config.async?this.performance.gesture&&delete this.performance.gesture:this.performance.gesture=this.env.perfadd?(this.performance.gesture||0)+Math.trunc(g()-A):Math.trunc(g()-A)),this.performance.total=this.env.perfadd?(this.performance.total||0)+Math.trunc(g()-a):Math.trunc(g()-a);let m=((Q=(X=this.process)==null?void 0:X.tensor)==null?void 0:Q.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 lr(x,d,l,h,m)}},r.dispose(i.tensor),this.emit("detect"),this.state="idle",n(this.result)})}};We=new WeakMap,Qe=new WeakMap,_e=new WeakMap,Bt=new WeakMap;export{xr as Human,xr as default,ee as defaults,$A as draw,w as env,ir as match,ao as models}; +2Q==`;async function K2(e){let t=(A,s="application/octet-stream")=>fetch(`data:${s};base64,${A}`).then(a=>a.blob()),o,n;switch(e.config.warmup){case"face":o=await t(Gt);break;case"body":case"full":o=await t(Bt);break;default:o=null}if(o){let A=await createImageBitmap(o);n=await e.detect(A,e.config),A.close()}return n}async function Q2(e){return new Promise(t=>{let o;switch(e.config.warmup){case"face":o="data:image/jpeg;base64,"+Gt;break;case"full":case"body":o="data:image/jpeg;base64,"+Bt;break;default:o=null}let n;if(typeof Image!="undefined")n=new Image;else if(R.Image)n=new R.Image;else return;n.onload=async()=>{let A=a0(n.naturalWidth,n.naturalHeight);if(!A)b("Warmup: Canvas not found"),t(void 0);else{let s=A.getContext("2d");s&&s.drawImage(n,0,0);let a=await e.image(A),i=await e.detect(a.tensor,e.config);t(i)}},o?n.src=o:t(void 0)})}async function _2(e){let t=A=>Buffer.from(A,"base64"),o;e.config.warmup==="face"?o=t(Gt):o=t(Bt);let n;if("node"in r){let A=r.node.decodeJpeg(o),s=A.expandDims(0);e.tf.dispose(A),n=await e.detect(s,e.config),e.tf.dispose(s)}else e.config.debug&&b("Warmup tfjs-node not loaded");return n}async function $2(e){let t;return typeof createImageBitmap=="function"?t=await K2(e):typeof Image!="undefined"||R.Canvas!==void 0?t=await Q2(e):t=await _2(e),t}async function xr(e,t){let o=g();return e.state="warmup",t&&(e.config=Y(e.config,t)),!e.config.warmup||e.config.warmup.length===0||e.config.warmup==="none"?{face:[],body:[],hand:[],gesture:[],object:[],performance:e.performance,timestamp:g(),persons:[],error:null}:new Promise(async n=>{let A=await $2(e),s=g();e.config.debug&&b("warmup",e.config.warmup,Math.round(s-o),"ms"),e.emit("warmup"),n(A)})}var Oe,_e,$e,Ft,cr=class{constructor(t){k(this,"version");k(this,"config");k(this,"result");k(this,"state");k(this,"process");k(this,"tf");k(this,"env");k(this,"draw");k(this,"models");k(this,"events");k(this,"faceTriangulation");k(this,"faceUVMap");k(this,"performance");Ge(this,Oe,void 0);Ge(this,_e,void 0);Ge(this,$e,void 0);k(this,"gl");k(this,"analyze",(...t)=>{if(!Ne(this,_e))return;let o=this.tf.engine().state.numTensors,n=Ne(this,Oe);Be(this,Oe,o);let A=o-n;A!==0&&b(...t,A)});Ge(this,Ft,t=>{if(!Ne(this,$e))return null;if(!t)return"input is not defined";if(this.env.node&&!(t instanceof ce))return"input must be a tensor";try{this.tf.getBackend()}catch(o){return"backend not loaded"}return null});k(this,"similarity",bo);k(this,"distance",Qe);k(this,"match",go);k(this,"emit",t=>{var o;this.events&&this.events.dispatchEvent&&((o=this.events)==null||o.dispatchEvent(new Event(t)))});this.env=R,te.wasmPath=Fe["tfjs-core"].includes("-")?"https://vladmandic.github.io/tfjs/dist/":`https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${r.version_core}/dist/`,te.modelBasePath=R.browser?"../models/":"file://models/",te.backend=R.browser?"humangl":"tensorflow",this.version=Ut,Object.defineProperty(this,"version",{value:Ut}),this.config=JSON.parse(JSON.stringify(te)),Object.seal(this.config),this.config.cacheModels=typeof indexedDB!="undefined",t&&(this.config=Y(this.config,t)),No(this.config),this.tf=r,this.state="idle",Be(this,Oe,0),Be(this,_e,!1),Be(this,$e,!1),this.performance={},this.events=typeof EventTarget!="undefined"?new EventTarget:void 0,this.models=new Ke,this.draw={options:n0,canvas:(o,n)=>fo(o,n),face:(o,n,A)=>Ee(o,n,A),body:(o,n,A)=>ze(o,n,A),hand:(o,n,A)=>je(o,n,A),gesture:(o,n,A)=>We(o,n,A),object:(o,n,A)=>Se(o,n,A),person:(o,n,A)=>co(o,n,A),all:(o,n,A)=>mo(o,n,A)},this.result={face:[],body:[],hand:[],gesture:[],object:[],performance:{},timestamp:0,persons:[],error:null},this.process={tensor:null,canvas:null},this.faceTriangulation=Yn,this.faceUVMap=Kn,this.gl=q,this.emit("create")}reset(){let t=this.config.backend;this.config=JSON.parse(JSON.stringify(te)),this.config.backend=t}validate(t){return Vt(te,t||this.config)}now(){return g()}image(t,o=!0){return fe(t,this.config,o)}async segmentation(t,o){return YA(t,o,this.config)}enhance(t){return S5(t)}compare(t,o){return Lo(this.config,t,o)}async init(){await Nt(this,!0),await this.tf.ready()}async load(t){this.state="load";let o=g(),n=Object.values(this.models).filter(a=>a).length;t&&(this.config=Y(this.config,t)),this.env.initial&&(this.config.debug&&b(`version: ${this.version}`),this.config.debug&&b(`tfjs version: ${this.tf.version["tfjs-core"]}`),await Nt(this)||b("error: backend check failed"),await r.ready(),this.env.browser&&(this.config.debug&&b("configuration:",this.config),this.config.debug&&b("environment:",this.env),this.config.debug&&b("tf flags:",this.tf.ENV.flags))),await so(this),this.env.initial&&this.config.debug&&b("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!==n&&(await ao(this),this.emit("load"));let s=Math.trunc(g()-o);s>(this.performance.loadModels||0)&&(this.performance.loadModels=this.env.perfadd?(this.performance.loadModels||0)+s:s)}next(t=this.result){return ar(t,this.config)}async warmup(t){let o=g(),n=await xr(this,t),A=g();return this.performance.warmup=Math.trunc(A-o),n}async profile(t,o){let n=await this.tf.profile(()=>this.detect(t,o)),A={};for(let i of n.kernels)A[i.name]?A[i.name]+=i.kernelTimeMs:A[i.name]=i.kernelTimeMs;let s=[];Object.entries(A).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 n=>{var v,M,u,p,P,w,S,O,W,I,V,G,B,J,z,P0,p0,T,e0,E,D,Q;this.state="config";let A;this.config=Y(this.config,o),this.state="check";let s=Ne(this,Ft).call(this,t);s&&(b(s,t),this.emit("error"),n({face:[],body:[],hand:[],gesture:[],object:[],performance:this.performance,timestamp:g(),persons:[],error:s}));let a=g();await Nt(this),await this.load(),A=g(),this.state="image";let i=await fe(t,this.config);if(this.process=i,this.performance.inputProcess=this.env.perfadd?(this.performance.inputProcess||0)+Math.trunc(g()-A):Math.trunc(g()-A),this.analyze("Get Image:"),!i.tensor){this.config.debug&&b("could not convert input to tensor"),this.emit("error"),n({face:[],body:[],hand:[],gesture:[],object:[],performance:this.performance,timestamp:g(),persons:[],error:"could not convert input to tensor"});return}this.emit("image"),A=g(),this.config.skipAllowed=await Io(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(g()-A):Math.trunc(g()-A),this.analyze("Check Changed:");let x=[],d=[],l=[],y=[];this.state="detect:face",this.config.async?(x=this.config.face.enabled?uo(this,i.tensor):[],this.performance.face&&delete this.performance.face):(A=g(),x=this.config.face.enabled?await uo(this,i.tensor):[],this.performance.face=this.env.perfadd?(this.performance.face||0)+Math.trunc(g()-A):Math.trunc(g()-A)),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?Y(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?no(i.tensor,c):[]:(M=this.config.body.modelPath)!=null&&M.includes("blazepose")?d=this.config.body.enabled?m5(i.tensor,c):[]:(u=this.config.body.modelPath)!=null&&u.includes("efficientpose")?d=this.config.body.enabled?P5(i.tensor,c):[]:(p=this.config.body.modelPath)!=null&&p.includes("movenet")&&(d=this.config.body.enabled?K5(i.tensor,c):[]),this.performance.body&&delete this.performance.body):(A=g(),(P=this.config.body.modelPath)!=null&&P.includes("posenet")?d=this.config.body.enabled?await no(i.tensor,c):[]:(w=this.config.body.modelPath)!=null&&w.includes("blazepose")?d=this.config.body.enabled?await m5(i.tensor,c):[]:(S=this.config.body.modelPath)!=null&&S.includes("efficientpose")?d=this.config.body.enabled?await P5(i.tensor,c):[]:(O=this.config.body.modelPath)!=null&&O.includes("movenet")&&(d=this.config.body.enabled?await K5(i.tensor,c):[]),this.performance.body=this.env.perfadd?(this.performance.body||0)+Math.trunc(g()-A):Math.trunc(g()-A)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.state="detect:hand";let f=this.config.hand.maxDetected===-1?Y(this.config,{hand:{maxDetected:this.config.face.enabled?2*x.length:1}}):this.config;this.config.async?((I=(W=this.config.hand.detector)==null?void 0:W.modelPath)!=null&&I.includes("handdetect")?l=this.config.hand.enabled?G5(i.tensor,f):[]:(G=(V=this.config.hand.detector)==null?void 0:V.modelPath)!=null&&G.includes("handtrack")&&(l=this.config.hand.enabled?V5(i.tensor,f):[]),this.performance.hand&&delete this.performance.hand):(A=g(),(J=(B=this.config.hand.detector)==null?void 0:B.modelPath)!=null&&J.includes("handdetect")?l=this.config.hand.enabled?await G5(i.tensor,f):[]:(P0=(z=this.config.hand.detector)==null?void 0:z.modelPath)!=null&&P0.includes("handtrack")&&(l=this.config.hand.enabled?await V5(i.tensor,f):[]),this.performance.hand=this.env.perfadd?(this.performance.hand||0)+Math.trunc(g()-A):Math.trunc(g()-A)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.state="detect:object",this.config.async?((p0=this.config.object.modelPath)!=null&&p0.includes("nanodet")?y=this.config.object.enabled?_5(i.tensor,this.config):[]:(T=this.config.object.modelPath)!=null&&T.includes("centernet")&&(y=this.config.object.enabled?h5(i.tensor,this.config):[]),this.performance.object&&delete this.performance.object):(A=g(),(e0=this.config.object.modelPath)!=null&&e0.includes("nanodet")?y=this.config.object.enabled?await _5(i.tensor,this.config):[]:(E=this.config.object.modelPath)!=null&&E.includes("centernet")&&(y=this.config.object.enabled?await h5(i.tensor,this.config):[]),this.performance.object=this.env.perfadd?(this.performance.object||0)+Math.trunc(g()-A):Math.trunc(g()-A)),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&&(A=g(),h=[...Ar(x),...nr(d),...sr(l),...rr(x)],this.config.async?this.performance.gesture&&delete this.performance.gesture:this.performance.gesture=this.env.perfadd?(this.performance.gesture||0)+Math.trunc(g()-A):Math.trunc(g()-A)),this.performance.total=this.env.perfadd?(this.performance.total||0)+Math.trunc(g()-a):Math.trunc(g()-a);let m=((Q=(D=this.process)==null?void 0:D.tensor)==null?void 0:Q.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 yr(x,d,l,h,m)}},r.dispose(i.tensor),this.emit("detect"),this.state="idle",n(this.result)})}};Oe=new WeakMap,_e=new WeakMap,$e=new WeakMap,Ft=new WeakMap;export{cr as Human,cr as default,te as defaults,er as draw,R as env,lr as match,io as models}; /** * Human main module * @default Human Library diff --git a/dist/human.esm-nobundle.js.map b/dist/human.esm-nobundle.js.map index 530285cb..5b30d78c 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/models.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/attention.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/tfjs/humangl.ts", "../src/tfjs/backend.ts", "../src/draw/draw.ts", "../src/draw/options.ts", "../src/draw/primitives.ts", "../src/draw/face.ts", "../src/draw/body.ts", "../src/draw/hand.ts", "../src/draw/object.ts", "../src/draw/gesture.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/** Attention part of face configuration */\nexport interface FaceAttentionConfig 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 attention: 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 attention: {\n enabled: false,\n modelPath: 'facemesh-attention.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.15.0\",a=\"3.15.0\",e=\"3.15.0\",o=\"3.15.0\",t=\"3.15.0\",s=\"3.15.0\",f=\"3.15.0\",v=\"3.15.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 if (!gl) {\n log('filter: cannot get webgl context');\n return;\n }\n // @ts-ignore used for sanity checks outside of imagefx\n this.gl = gl;\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 env.webgl.supported = false;\n config.filter.enabled = false;\n copy(inCanvas, outCanvas); // filter failed to initialize\n // return { tensor: null, canvas: inCanvas };\n } else {\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 }\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 let loaded = false;\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 loaded = true;\n } catch (err) {\n log('error loading model:', modelUrl, err);\n }\n if (loaded && 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 * 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", "/**\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.4;\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 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, false);\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", "import type { Tensor } from '../tfjs/types';\n\nexport async function augment(rawCoords, results: Tensor[]) {\n const t: Record = {\n eyeL: results[0].dataSync() as Float32Array, // 71 x 2d // output_left_eye\n eyeR: results[6].dataSync() as Float32Array, // 71 x 2d // output_right_eye\n irisL: results[3].dataSync() as Float32Array, // 5 x 2d // output_left_iris\n irisR: results[1].dataSync() as Float32Array, // 5 x 2d // output_right_iris\n lips: results[5].dataSync() as Float32Array, // 80 x 2d // output_lips\n // flag: results[4], // already processed in parent // conv_faceflag\n // mesh: results[2], // already have it in rawCoords // output_mesh_identity\n };\n for (let i = 0; i < t.lips.length / 2; i++) rawCoords.push([t.lips[2 * i + 0], t.lips[2 * i + 1], 0]);\n for (let i = 0; i < t.eyeL.length / 2; i++) rawCoords.push([t.eyeL[2 * i + 0], t.eyeL[2 * i + 1], 0]);\n for (let i = 0; i < t.eyeR.length / 2; i++) rawCoords.push([t.eyeR[2 * i + 0], t.eyeR[2 * i + 1], 0]);\n for (let i = 0; i < t.irisL.length / 2; i++) rawCoords.push([t.irisL[2 * i + 0], t.irisL[2 * i + 1], 0]);\n for (let i = 0; i < t.irisR.length / 2; i++) rawCoords.push([t.irisR[2 * i + 0], t.irisR[2 * i + 1], 0]);\n return rawCoords;\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 * as attention from './attention';\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)) {\n face.annotations[key] = [face.mesh[coords.blazeFaceLandmarks[key] as number]]; // add annotations\n }\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 results = model.execute(face.tensor as Tensor) as Array;\n const confidence = results.find((t) => t.shape[t.shape.length - 1] === 1) as Tensor;\n const contourCoords = results.find((t) => t.shape[t.shape.length - 1] === 1404) as Tensor;\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 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.attention?.enabled) {\n rawCoords = await attention.augment(rawCoords, results); // augment iris results using attention model results\n } else if (config.face.iris?.enabled) {\n rawCoords = await iris.augmentIris(rawCoords, face.tensor, config, inputSize); // run iris model and augment results\n }\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 tf.dispose([...results, coordsReshaped]);\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) {\n if (config.face.attention?.enabled) model = await loadModel(config.face.attention?.modelPath);\n else model = await loadModel(config.face.mesh?.modelPath);\n } else if (config.debug) {\n log('cached model:', model['modelUrl']);\n }\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", "/** 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 { mergeDeep, now } from '../util/util';\nimport { env } from '../util/env';\nimport { getCanvasContext, rect } from './primitives';\nimport { options } from './options';\nimport { face } from './face';\nimport { body } from './body';\nimport { hand } from './hand';\nimport { object } from './object';\nimport { gesture } from './gesture';\nimport type { Result, PersonResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\n\nlet drawTime = 0;\n\nexport { options } from './options';\nexport { face } from './face';\nexport { body } from './body';\nexport { hand } from './hand';\nexport { object } from './object';\nexport { gesture } from './gesture';\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", "/** 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 /** alpha value used for lines */\n alpha: number,\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 face attention keypoints be highlighted */\n drawAttention: 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 alpha: 0.5,\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 drawAttention: true,\n drawGestures: true,\n drawPolygons: true,\n drawGaze: true,\n fillPolygons: false,\n useDepth: true,\n useCurves: false,\n};\n", "import { log } from '../util/util';\nimport type { AnyCanvas } from '../exports';\nimport type { Point } from '../result';\nimport { options, DrawOptions } from './options';\n\nexport const 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\nexport const rad2deg = (theta: number) => Math.round((theta * 180) / Math.PI);\nexport const colorDepth = (z: number, rgb: [boolean, boolean, boolean] = [true, true, false]): string => {\n const r = rgb[0] ? 127 + Math.trunc(3 * z) : 255;\n const g = rgb[1] ? 127 - Math.trunc(3 * z) : 255;\n const b = rgb[2] ? 127 - Math.trunc(3 * z) : 255;\n return `rgba(${r}, ${g}, ${b}, ${options.alpha})`;\n};\n\nexport function point(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, x: number, y: number, z: number | undefined, localOptions: DrawOptions) {\n z = z || 0;\n ctx.fillStyle = localOptions.useDepth && z ? colorDepth(z, z === -255 ? [true, false, true] : [true, false, false]) : localOptions.color;\n ctx.beginPath();\n ctx.arc(x, y, localOptions.pointSize, 0, 2 * Math.PI);\n ctx.fill();\n}\n\nexport function 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\nexport function 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 ? colorDepth(z) : localOptions.color;\n ctx.fillStyle = localOptions.useDepth && z !== 0 ? colorDepth(z) : 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\nexport function 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\nexport function 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", "import { TRI468 as triangulation } from '../face/facemeshcoords';\nimport { mergeDeep } from '../util/util';\nimport { getCanvasContext, rad2deg, rect, point, lines, arrow } from './primitives';\nimport { options } from './options';\nimport type { FaceResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\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 const length = Math.max(468, f.mesh.length);\n for (let i = 0; i < length; i++) point(ctx, f.mesh[i][0], f.mesh[i][1], f.mesh[i][2], localOptions);\n }\n if (localOptions.drawAttention && f.mesh.length > 468) {\n for (let i = 468; i < f.mesh.length; i++) point(ctx, f.mesh[i][0], f.mesh[i][1], -255, 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", "import { mergeDeep } from '../util/util';\nimport { getCanvasContext, rect, point, curves, colorDepth } from './primitives';\nimport { options } from './options';\nimport type { BodyResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\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] ? colorDepth(result[i].keypoints[pt].position[2] || 0) : 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] ? colorDepth(pt.position[2]) : 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", "import { mergeDeep } from '../util/util';\nimport { getCanvasContext, rect, point, colorDepth } from './primitives';\nimport { options } from './options';\nimport type { HandResult } from '../result';\nimport type { AnyCanvas, DrawOptions, Point } from '../exports';\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 ? colorDepth(pt[2] || 0) : 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 ? colorDepth(z) : 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 ? colorDepth(i * z) : 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", "import { mergeDeep } from '../util/util';\nimport { getCanvasContext, rect } from './primitives';\nimport { options } from './options';\nimport type { ObjectResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\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", "import { mergeDeep } from '../util/util';\nimport { getCanvasContext } from './primitives';\nimport { options } from './options';\nimport type { GestureResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\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", "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 `similarity` method for options description\n * Returns\n * - `index` index array index where best match was found or -1 if no matches\n * - `distance` calculated `distance` of given descriptor to the best match\n * - `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 { env } from './util/env';\nimport type { Config } from './config';\nimport type { Result } from './result';\nimport type { Human, Models } from './human';\nimport type { Tensor, GraphModel } from './tfjs/types';\n\nasync function warmupBitmap(instance: Human): Promise {\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\nasync function runInference(instance: Human) {\n let res: Result | undefined;\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 return res;\n}\n\n/** Runs pre-compile on all loaded models */\nexport async function runCompile(allModels: Models) {\n const backendType = tf.getBackend();\n const webGLBackend = tf.backend();\n if ((backendType !== 'webgl' && backendType !== 'humangl') || (!webGLBackend || !webGLBackend.checkCompileCompletion)) {\n log('compile pass: skip');\n return;\n }\n const models = Object.values(allModels).filter((m) => m !== null) as GraphModel[];\n tf.env().set('ENGINE_COMPILE_ONLY', true);\n const numTensorsStart = tf.engine().state.numTensors;\n for (const model of models) {\n const shape = (model.inputs && model.inputs[0] && model.inputs[0].shape) ? [...model.inputs[0].shape] : [1, 64, 64, 3];\n const dtype = (model.inputs && model.inputs[0] && model.inputs[0].dtype) ? model.inputs[0].dtype : 'float32';\n for (let dim = 0; dim < shape.length; dim++) {\n if (shape[dim] === -1) shape[dim] = dim === 0 ? 1 : 64; // override batch number and any dynamic dimensions\n }\n const tensor = tf.zeros(shape, dtype);\n const res = await model.executeAsync(tensor);\n if (Array.isArray(res)) res.forEach((t) => tf.dispose(t));\n else tf.dispose(res);\n tf.dispose(tensor);\n }\n const kernels = await webGLBackend.checkCompileCompletionAsync();\n webGLBackend.getUniformLocations();\n log('compile pass kernels:', kernels.length);\n tf.env().set('ENGINE_COMPILE_ONLY', false);\n const numTensorsEnd = tf.engine().state.numTensors;\n if ((numTensorsEnd - numTensorsStart) > 0) log('tensor leak:', numTensorsEnd - numTensorsStart);\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 return new Promise(async (resolve) => {\n // await runCompile(instance.models);\n const res = await runInference(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 './draw/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, match, draw, models };\n"], - "mappings": "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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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,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,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EAwB1I,GAAM,IAAuB,CACtB,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/E,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAC1C,IAAK,EAAG,IAAK,EAAG,GAAI,GAAI,EAAG,IAAK,IAChC,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtD,GAAI,GAAI,GAAI,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAChD,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAC7C,EAEa,GAAuB,CAAC,GAAI,IAAK,IAAK,IAAK,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAG,EAE5K,GAAsB,CAAC,GAAI,IAAK,IAAK,IAAK,EAAG,GAAI,GAAG,EAEpD,GAAO,GAAM,IAAI,AAAC,GAAM,GAAM,EAAE,EAEhC,GAAO,GAAM,IAAI,AAAC,GAAM,GAAM,EAAE,EAEhC,GAAM,GAAK,IAAI,AAAC,GAAM,GAAM,EAAE,EC7oBpC,GAAM,IAAa,AAAC,GAA0B,CAAC,KAAK,IAAI,EAAI,SAAS,GAAK,EAAI,WAAW,EAAE,EAAG,KAAK,IAAI,EAAI,SAAS,GAAK,EAAI,WAAW,EAAE,CAAC,EAErI,GAAe,AAAC,GAAkC,CAAC,EAAI,WAAW,GAAM,GAAI,SAAS,GAAK,EAAI,WAAW,IAAM,EAAG,EAAI,WAAW,GAAM,GAAI,SAAS,GAAK,EAAI,WAAW,IAAM,EAAG,CAAC,EAElL,GAAW,CAAC,EAAK,IAAgB,EAAM,CAClD,KAAK,MAAM,KAAK,IAAI,EAAG,EAAI,WAAW,EAAE,CAAC,EACzC,KAAK,MAAM,KAAK,IAAI,EAAG,EAAI,WAAW,EAAE,CAAC,EACzC,KAAK,MAAM,KAAK,IAAK,EAAM,MAAM,IAAM,EAAI,EAAI,SAAS,EAAE,EAAI,KAAK,IAAI,EAAG,EAAI,WAAW,EAAE,CAAC,EAC5F,KAAK,MAAM,KAAK,IAAK,EAAM,MAAM,IAAM,EAAI,EAAI,SAAS,EAAE,EAAI,KAAK,IAAI,EAAG,EAAI,WAAW,EAAE,CAAC,CAC9F,EAAI,CAAC,EAAG,EAAG,EAAG,CAAC,EAEF,GAAY,CAAC,EAAK,IAAgB,EAAM,CACnD,EAAI,WAAW,GAAM,GAAM,MAAM,IAAM,GACvC,EAAI,WAAW,GAAM,GAAM,MAAM,IAAM,GACtC,GAAI,SAAS,GAAK,EAAI,WAAW,IAAO,GAAM,MAAM,IAAM,GAC1D,GAAI,SAAS,GAAK,EAAI,WAAW,IAAO,GAAM,MAAM,IAAM,EAC7D,EAAI,CAAC,EAAG,EAAG,EAAG,CAAC,EAEF,GAAsB,CAAC,EAAK,IAAW,CAClD,GAAM,GAAoB,CAAC,EAAI,WAAW,GAAK,EAAO,GAAI,EAAI,WAAW,GAAK,EAAO,EAAE,EACjF,EAAkB,CAAC,EAAI,SAAS,GAAK,EAAO,GAAI,EAAI,SAAS,GAAK,EAAO,EAAE,EACjF,MAAO,CAAE,aAAY,WAAU,UAAW,EAAI,UAAW,WAAY,EAAI,UAAW,CACtF,EAEa,GAAe,CAAC,EAAK,EAAO,IAAa,CACpD,GAAM,GAAI,EAAM,MAAM,GAChB,EAAI,EAAM,MAAM,GAChB,EAAS,CAAC,EAAI,WAAW,GAAK,EAAG,EAAI,WAAW,GAAK,EAAG,EAAI,SAAS,GAAK,EAAG,EAAI,SAAS,GAAK,CAAC,EAChG,EAAO,AAAG,QAAM,cAAc,EAAO,CAAC,CAAM,EAAG,CAAC,CAAC,EAAG,CAAQ,EAC5D,EAAO,AAAG,MAAI,EAAM,EAAU,KAAK,EACzC,MAAG,WAAQ,CAAI,EACR,CACT,EAEa,GAAa,CAAC,EAAK,IAAW,CACzC,GAAM,GAAS,GAAa,CAAG,EACzB,EAAO,GAAW,CAAG,EACrB,EAA6B,CAAC,EAAS,EAAK,GAAK,EAAG,EAAS,EAAK,GAAK,CAAC,EAC9E,MAAO,CAAE,WAAY,CAAC,EAAO,GAAK,EAAS,GAAI,EAAO,GAAK,EAAS,EAAE,EAAY,SAAU,CAAC,EAAO,GAAK,EAAS,GAAI,EAAO,GAAK,EAAS,EAAE,EAAY,UAAW,EAAI,UAAW,WAAY,EAAI,UAAW,CAChN,EAEa,GAAc,AAAC,GAAQ,CAClC,GAAM,GAAU,GAAa,CAAG,EAC1B,EAAO,GAAW,CAAG,EACrB,EAAW,KAAK,IAAI,GAAG,CAAI,EAAI,EACrC,MAAO,CAAE,WAAY,CAAC,KAAK,MAAM,EAAQ,GAAK,CAAQ,EAAG,KAAK,MAAM,EAAQ,GAAK,CAAQ,CAAC,EAAY,SAAU,CAAC,KAAK,MAAM,EAAQ,GAAK,CAAQ,EAAG,KAAK,MAAM,EAAQ,GAAK,CAAQ,CAAC,EAAY,UAAW,EAAI,UAAW,WAAY,EAAI,UAAW,CACxP,EAEa,GAAgC,AAAC,GAAc,CAC1D,GAAM,GAAI,EAAU,IAAI,AAAC,GAAM,EAAE,EAAE,EAC7B,EAAI,EAAU,IAAI,AAAC,GAAM,EAAE,EAAE,EACnC,MAAO,CAAE,WAAY,CAAC,KAAK,IAAI,GAAG,CAAC,EAAG,KAAK,IAAI,GAAG,CAAC,CAAC,EAAY,SAAU,CAAC,KAAK,IAAI,GAAG,CAAC,EAAG,KAAK,IAAI,GAAG,CAAC,CAAC,EAAY,WAAU,CACjI,EAEa,GAAsB,CAAC,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EAEtD,GAAmB,AAAC,GAAU,EAAQ,EAAI,KAAK,GAAK,KAAK,MAAO,GAAQ,KAAK,IAAO,GAAI,KAAK,GAAG,EAEhG,GAAkB,CAAC,EAAQ,IAAW,GAAiB,KAAK,GAAK,EAAI,KAAK,MAAM,CAAE,GAAO,GAAK,EAAO,IAAK,EAAO,GAAK,EAAO,EAAE,CAAC,EAItI,GAAM,IAAyB,CAAC,EAAG,IAAM,CAAC,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EAEnE,GAAM,CAAC,EAAc,IAAiB,CACjD,GAAI,GAAU,EACd,OAAS,GAAI,EAAG,EAAI,EAAG,OAAQ,IAAK,GAAW,EAAG,GAAK,EAAG,GAC1D,MAAO,EACT,EAEa,GAAqB,CAAC,EAAK,IAAgB,CACtD,GAAM,GAAwB,CAAC,EAC/B,OAAS,GAAI,EAAG,EAAI,EAAI,OAAQ,IAAK,EAAO,KAAK,EAAI,GAAG,EAAY,EACpE,MAAO,EACT,EAEa,GAA4B,CAAC,EAAM,IAAS,CACvD,GAAM,GAA2B,CAAC,EAC5B,EAAO,EAAK,OAClB,OAAS,GAAM,EAAG,EAAM,EAAM,IAAO,CACnC,EAAQ,KAAK,CAAC,CAAC,EACf,OAAS,GAAM,EAAG,EAAM,EAAM,IAAO,EAAQ,GAAK,KAAK,GAAI,EAAK,GAAM,GAAmB,EAAM,CAAG,CAAC,CAAC,CACtG,CACA,MAAO,EACT,EAEa,GAAsB,CAAC,EAAU,IAAW,CACvD,GAAM,GAAO,KAAK,IAAI,CAAQ,EACxB,EAAO,KAAK,IAAI,CAAQ,EACxB,EAAiB,CAAC,CAAC,EAAM,CAAC,EAAM,CAAC,EAAG,CAAC,EAAM,EAAM,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EAC9D,EAAoB,GAAuB,EAAO,GAAI,EAAO,EAAE,EAC/D,EAA2B,GAA0B,EAAmB,CAAc,EACtF,EAA4B,GAAuB,CAAC,EAAO,GAAI,CAAC,EAAO,EAAE,EAC/E,MAAO,IAA0B,EAA0B,CAAyB,CACtF,EAEa,GAAwB,AAAC,GAAW,CAC/C,GAAM,GAAoB,CAAC,CAAC,EAAO,GAAG,GAAI,EAAO,GAAG,EAAE,EAAG,CAAC,EAAO,GAAG,GAAI,EAAO,GAAG,EAAE,CAAC,EAC/E,EAAuB,CAAC,EAAO,GAAG,GAAI,EAAO,GAAG,EAAE,EAClD,EAAsB,CAAC,CAAC,GAAI,EAAkB,GAAI,CAAoB,EAAG,CAAC,GAAI,EAAkB,GAAI,CAAoB,CAAC,EAC/H,MAAO,CAAC,EAAkB,GAAG,OAAO,EAAoB,EAAE,EAAG,EAAkB,GAAG,OAAO,EAAoB,EAAE,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,CAC7H,EAEa,GAAc,CAAC,EAAuB,IAAmB,CAAC,GAAI,EAAuB,EAAe,EAAE,EAAG,GAAI,EAAuB,EAAe,EAAE,CAAC,EAI5J,YAAyB,EAAW,CACzC,GAAM,GAAO,CAAE,QAAS,CAAC,EAAY,GAAI,EAAY,CAAC,EAAG,QAAS,CAAC,EAAG,CAAC,CAAE,EACnE,EAAmC,CAAC,EAC1C,OAAS,GAAI,EAAG,EAAI,EAAK,QAAQ,OAAQ,IAAK,CAC5C,GAAM,GAAS,EAAK,QAAQ,GACtB,EAAW,KAAK,MAAO,GAAY,EAAS,GAAK,CAAM,EACvD,EAAW,KAAK,MAAO,GAAY,EAAS,GAAK,CAAM,EACvD,EAAa,EAAK,QAAQ,GAChC,OAAS,GAAQ,EAAG,EAAQ,EAAU,IAAS,CAC7C,GAAM,GAAU,EAAU,GAAQ,IAClC,OAAS,GAAQ,EAAG,EAAQ,EAAU,IAAS,CAC7C,GAAM,GAAU,EAAU,GAAQ,IAClC,OAAS,GAAI,EAAG,EAAI,EAAY,IAAK,EAAQ,KAAK,CAAC,EAAS,CAAO,CAAC,CACtE,CACF,CACF,CACA,MAAO,EACT,CAEO,YAA4B,EAAW,EAAK,EAAO,EAAgB,EAAW,CACnF,GAAM,GAAU,GAAW,CAAG,EACxB,EAAe,EAAU,IAAI,AAAC,GAAW,CAC5C,EAAQ,GAAK,EAAc,GAAM,GAAM,EAAY,GACnD,EAAQ,GAAK,EAAc,GAAM,GAAM,EAAY,GACnD,EAAM,IAAM,CACf,CAAE,EACI,EAAa,GAAU,IAAU,GAAO,KAAK,IAAI,CAAK,EAAI,GAC1D,EAAuB,EAAa,GAAoB,EAAO,CAAC,EAAG,CAAC,CAAC,EAAI,GACzE,EAAgB,EAAa,EAAa,IAAI,AAAC,GAAW,CAAC,GAAG,GAAY,EAAO,CAAoB,EAAG,EAAM,EAAE,CAAE,EAAI,EACtH,EAAwB,EAAa,GAAsB,CAAc,EAAI,GAC7E,EAAY,GAAa,CAAG,EAC5B,EAAU,CAAC,GAAI,EAAW,EAAsB,EAAE,EAAG,GAAI,EAAW,EAAsB,EAAE,CAAC,EACnG,MAAO,GAAc,IAAI,AAAC,GAAW,CACnC,KAAK,MAAM,EAAM,GAAK,EAAQ,EAAE,EAChC,KAAK,MAAM,EAAM,GAAK,EAAQ,EAAE,EAChC,KAAK,MAAM,EAAM,IAAM,CAAC,CAC1B,CAAE,CACJ,CAEO,YAA6B,EAAQ,EAAK,EAAO,EAAW,CACjE,GAAM,GAAgB,EAAI,UAAU,QAAU,AAAO,GAAc,MAC/D,AAAO,GAAc,aACrB,AAAO,GAAmB,aAC1B,EAAQ,EACR,EAAiB,GACjB,EAEJ,GAAI,GAAU,EAAI,QAAQ,SAAS,kBAAkB,EAGnD,GAFA,EAAQ,GAAgB,EAAI,UAAU,EAAa,IAAK,EAAI,UAAU,EAAa,GAAG,EACnE,GAAU,IAAU,GAAO,KAAK,IAAI,CAAK,EAAI,GAChD,CACd,GAAM,GAAgB,GAAa,CAAG,EAChC,EAAmB,CAAC,EAAO,GAAK,EAAM,MAAM,GAAI,EAAO,GAAK,EAAM,MAAM,EAAE,EAC1E,EAAU,AAAG,QAAM,iBAAiB,EAAO,EAAO,EAAG,CAAS,EACpE,EAAiB,GAAoB,CAAC,EAAO,CAAM,EACnD,EAAO,GAAa,EAAK,EAAS,CAAC,EAAW,CAAS,CAAC,EACxD,AAAG,UAAQ,CAAO,CACpB,KACE,GAAO,GAAa,EAAK,EAAO,CAAC,EAAW,CAAS,CAAC,MAGxD,GAAO,GAAa,EAAK,EAAO,CAAC,EAAW,CAAS,CAAC,EAExD,MAAO,CAAC,EAAO,EAAgB,CAAI,CACrC,CAEO,GAAM,IAAiB,AAAC,GAAS,CACtC,GAAM,GAAI,EAAK,IAAI,AAAC,GAAM,EAAE,EAAE,EACxB,EAAI,EAAK,IAAI,AAAC,GAAM,EAAE,EAAE,EAO9B,MAAO,CAAC,KAAK,IAAI,GAAG,CAAC,EAAK,MAAK,IAAI,GAAG,CAAC,EAAI,KAAK,IAAI,GAAG,CAAC,GAAK,EAAG,KAAK,IAAI,GAAG,CAAC,EAAK,MAAK,IAAI,GAAG,CAAC,EAAI,KAAK,IAAI,GAAG,CAAC,GAAK,CAAC,CACxH,EAEa,GAAmB,CAAC,EAAM,IAAgB,CACrD,GAAM,GAAS,GAAe,CAAI,EAC5B,EAAU,GAAW,CAAW,EAKtC,MAJsB,CACpB,WAAY,CAAC,EAAO,GAAK,EAAQ,GAAK,EAAG,EAAO,GAAK,EAAQ,GAAK,CAAC,EACnE,SAAU,CAAC,EAAO,GAAK,EAAQ,GAAK,EAAG,EAAO,GAAK,EAAQ,GAAK,CAAC,CACnE,CAEF,ECjMA,GAAM,IAAiB,EACjB,GAAqB,IACvB,GACA,GAAyB,KACzB,GAAY,EACZ,GAA4B,KAInB,GAAO,IAAM,GAE1B,kBAA2B,EAAqC,CA1BhE,MA2BE,MAAI,GAAI,SAAS,IAAQ,MACzB,AAAK,GACI,EAAO,OAAO,EAAI,gBAAiB,GAAM,QAAW,EADjD,GAAQ,KAAM,GAAU,KAAO,KAAK,WAAZ,cAAsB,SAAS,EAEnE,GAAY,GAAM,OAAO,GAAG,MAAQ,GAAM,OAAO,GAAG,MAAM,GAAK,EAC/D,GAAa,AAAG,SAAO,GAAW,OAAO,EACzC,GAAU,AAAG,WAAS,AAAK,GAAgB,EAAS,CAAC,EAC9C,EACT,CAEA,YAAsB,EAAoB,CACxC,GAAM,GAA4B,CAAC,EACnC,EAAE,UAAY,AAAG,QAAM,EAAY,CAAC,EAAG,CAAC,EAAG,CAAC,GAAI,CAAC,CAAC,EAClD,EAAE,QAAU,AAAG,MAAI,EAAE,UAAW,EAAO,EACvC,EAAE,SAAW,AAAG,QAAM,EAAY,CAAC,EAAG,CAAC,EAAG,CAAC,GAAI,CAAC,CAAC,EACjD,EAAE,mBAAqB,AAAG,MAAI,EAAE,SAAU,EAAU,EACpD,EAAE,kBAAoB,AAAG,MAAI,EAAE,QAAS,EAAU,EAClD,EAAE,YAAc,AAAG,MAAI,EAAE,mBAAoB,EAAU,GAAG,EAC1D,EAAE,OAAS,AAAG,MAAI,EAAE,kBAAmB,EAAE,WAAW,EACpD,EAAE,KAAO,AAAG,MAAI,EAAE,kBAAmB,EAAE,WAAW,EAClD,EAAE,gBAAkB,AAAG,MAAI,EAAE,OAAQ,EAAU,EAC/C,EAAE,cAAgB,AAAG,MAAI,EAAE,KAAM,EAAU,EAC3C,GAAM,GAAQ,AAAG,WAAS,CAAC,EAAE,gBAAiB,EAAE,aAAa,EAAG,CAAC,EACjE,cAAO,KAAK,CAAC,EAAE,QAAQ,AAAC,GAAW,AAAG,UAAQ,EAAE,EAAO,CAAC,EACjD,CACT,CAEA,kBAA+B,EAAoB,EAAgB,CArDnE,YAuDE,GAAK,CAAC,GAAgB,EAAW,oBAA2B,EAAW,MAAM,SAAW,GAAO,EAAW,MAAM,GAAK,GAAO,EAAW,MAAM,GAAK,EAAI,MAAO,CAAC,EAC9J,GAAM,GAA4B,CAAC,EACnC,EAAE,QAAU,AAAG,QAAM,eAAe,EAAY,CAAC,GAAW,EAAS,CAAC,EACtE,EAAE,IAAM,AAAG,MAAI,EAAE,QAAS,EAAU,KAAK,EACzC,EAAE,WAAa,AAAG,MAAI,EAAE,IAAK,EAAU,IAAI,EAC3C,GAAM,GAAM,mBAAO,QAAQ,EAAE,YAC7B,GAAI,MAAM,QAAQ,CAAG,EAAG,CACtB,GAAM,GAAS,EAAI,KAAK,CAAC,EAAG,IAAM,EAAE,KAAO,EAAE,IAAI,EACjD,EAAE,UAAY,AAAG,SAAO,CAAC,EAAO,GAAI,EAAO,EAAE,EAAG,CAAC,EACjD,EAAE,UAAY,AAAG,SAAO,CAAC,EAAO,GAAI,EAAO,EAAE,EAAG,CAAC,EACjD,EAAE,OAAS,AAAG,SAAO,CAAC,EAAE,UAAW,EAAE,SAAS,EAAG,CAAC,EAClD,EAAE,MAAQ,AAAG,UAAQ,EAAE,OAAQ,CAAC,CAClC,KACE,GAAE,MAAQ,AAAG,UAAQ,CAAG,EAE1B,AAAG,UAAQ,CAAG,EACd,EAAE,MAAQ,GAAa,EAAE,KAAK,EAC9B,EAAE,OAAS,AAAG,QAAM,EAAE,MAAO,CAAC,EAAG,CAAC,EAAG,CAAC,GAAI,CAAC,CAAC,EAC5C,EAAE,QAAU,AAAG,UAAQ,EAAE,MAAM,EAC/B,EAAE,OAAS,AAAG,UAAQ,EAAE,OAAO,EAC/B,EAAE,IAAM,KAAM,AAAG,SAAM,uBAAuB,EAAE,MAAO,EAAE,OAAS,MAAO,KAAK,WAAZ,cAAsB,cAAe,EAAK,MAAO,KAAK,WAAZ,cAAsB,eAAgB,EAAK,MAAO,KAAK,WAAZ,cAAsB,gBAAiB,CAAE,EAChM,GAAM,GAAM,KAAM,GAAE,IAAI,MAAM,EACxB,EAA0B,CAAC,EAC3B,EAAS,KAAM,GAAE,OAAO,KAAK,EACnC,OAAS,GAAI,EAAG,EAAI,EAAI,OAAQ,IAAK,CACnC,GAAM,GAAa,EAAO,EAAI,IAC9B,GAAI,EAAc,OAAO,KAAK,WAAZ,cAAsB,gBAAiB,GAAI,CAC3D,GAAM,GAA4B,CAAC,EACnC,EAAE,KAAO,AAAG,QAAM,EAAE,MAAO,CAAC,EAAI,GAAI,CAAC,EAAG,CAAC,EAAG,EAAE,CAAC,EAC/C,EAAE,MAAQ,AAAG,QAAM,EAAE,MAAO,CAAC,EAAI,GAAI,GAAiB,CAAC,EAAG,CAAC,EAAG,EAAE,CAAC,EACjE,EAAE,QAAU,AAAG,UAAQ,EAAE,KAAK,EAC9B,EAAE,UAAY,AAAG,UAAQ,EAAE,QAAS,CAAC,GAAgB,EAAE,CAAC,EACxD,GAAM,GAAS,KAAM,GAAE,KAAK,KAAK,EAC3B,EAAS,CACb,WAAY,CAAC,EAAO,GAAI,EAAO,EAAE,EACjC,SAAU,CAAC,EAAO,GAAI,EAAO,EAAE,EAC/B,UAAY,KAAM,GAAE,UAAU,MAAM,EACpC,YACF,EACM,EAAY,AAAK,GAAoB,EAAQ,CAAE,GAAW,MAAM,IAAM,GAAK,GAAY,GAAW,MAAM,IAAM,GAAK,EAAS,CAAC,EAC7H,EAAc,AAAK,GAAW,EAAW,EAAO,KAAK,OAAY,EAAkB,EACnF,EAAa,AAAK,GAAY,CAAW,EAC/C,EAAM,KAAK,CAAU,EACrB,OAAO,KAAK,CAAC,EAAE,QAAQ,AAAC,GAAW,AAAG,UAAQ,EAAE,EAAO,CAAC,CAC1D,CACF,CACA,cAAO,KAAK,CAAC,EAAE,QAAQ,AAAC,GAAW,AAAG,UAAQ,EAAE,EAAO,CAAC,EACjD,CACT,CCvGA,+CAEO,GAAM,IAAqB,CAChC,OACA,gBACA,UACA,iBACA,iBACA,WACA,kBACA,UACA,WACA,YACA,aACA,eACA,gBACA,YACA,aACA,YACA,aACA,YACA,aACA,YACA,aACA,YACA,aACA,UACA,WACA,WACA,YACA,YACA,aACA,WACA,YACA,WACA,YACA,aACA,UACA,WACA,WACA,YACA,WACF,EAEa,GAAsC,CACjD,UAAW,CAAC,eAAgB,eAAe,EAC3C,KAAM,CAAC,WAAY,SAAS,EAC5B,MAAO,CAAC,YAAa,YAAY,EACjC,aAAc,CAAC,UAAW,UAAU,EACpC,aAAc,CAAC,WAAY,WAAW,EACtC,SAAU,CAAC,YAAa,WAAY,UAAU,EAC9C,UAAW,CAAC,eAAgB,SAAS,EACrC,aAAc,CAAC,eAAgB,WAAW,EAC1C,aAAc,CAAC,YAAa,WAAW,EACvC,SAAU,CAAC,YAAa,UAAU,EAClC,cAAe,CAAC,WAAY,WAAW,EACvC,cAAe,CAAC,WAAY,WAAW,EACvC,cAAe,CAAC,WAAY,WAAW,EACvC,eAAgB,CAAC,gBAAiB,gBAAgB,EAClD,cAAe,CAAC,WAAY,WAAW,EACvC,cAAe,CAAC,YAAa,YAAY,EACzC,UAAW,CAAC,aAAc,YAAa,WAAW,EAClD,WAAY,CAAC,gBAAiB,UAAU,EACxC,cAAe,CAAC,gBAAiB,YAAY,EAC7C,cAAe,CAAC,aAAc,YAAY,EAC1C,UAAW,CAAC,aAAc,WAAW,EACrC,eAAgB,CAAC,YAAa,YAAY,EAC1C,eAAgB,CAAC,YAAa,YAAY,EAC1C,eAAgB,CAAC,YAAa,YAAY,EAC1C,gBAAiB,CAAC,iBAAkB,iBAAiB,CACvD,EC/DA,GAAM,IAAY,IACd,GACE,GAAY,EACZ,GAAU,CAAC,EAAG,GAAI,GAAI,GAAI,EAAE,EAElC,mBAAsC,CACpC,GAAM,GAA2C,CAAC,EAC9C,EAAU,EACd,KAAO,EAAU,IAAW,CAC1B,GAAI,GAAc,EACd,EAAsB,EAC1B,KAAO,EAAsB,GAAQ,QAAU,GAAQ,KAAyB,GAAQ,IACtF,GAAe,EACf,IAEF,GAAM,GAAS,GAAQ,GACjB,EAAmB,KAAK,KAAK,GAAY,CAAM,EAC/C,EAAkB,KAAK,KAAK,GAAY,CAAM,EACpD,OAAS,GAAI,EAAG,EAAI,EAAkB,EAAE,EACtC,OAAS,GAAI,EAAG,EAAI,EAAiB,EAAE,EACrC,OAAS,GAAW,EAAG,EAAW,EAAa,EAAE,EAC/C,EAAQ,KAAK,CAAE,EAAI,GAAI,IAAO,EAAiB,EAAI,GAAI,IAAO,CAAiB,CAAC,EAItF,EAAU,CACZ,CACA,GAAe,CAAE,EAAG,AAAG,WAAS,EAAQ,IAAI,AAAC,GAAM,EAAE,CAAC,CAAC,EAAG,EAAG,AAAG,WAAS,EAAQ,IAAI,AAAC,GAAM,EAAE,CAAC,CAAC,CAAE,CACpG,CCjCO,YAAc,EAAyB,EAA+B,CAAC,EAAG,CAAC,EAAG,CACnF,GAAM,GAAS,CAAC,EAAU,IAAI,AAAC,GAAO,EAAG,EAAE,EAAG,EAAU,IAAI,AAAC,GAAO,EAAG,EAAE,CAAC,EACpE,EAAM,CAAC,KAAK,IAAI,GAAG,EAAO,EAAE,EAAG,KAAK,IAAI,GAAG,EAAO,EAAE,CAAC,EACrD,EAAM,CAAC,KAAK,IAAI,GAAG,EAAO,EAAE,EAAG,KAAK,IAAI,GAAG,EAAO,EAAE,CAAC,EACrD,EAAW,CAAC,EAAI,GAAI,EAAI,GAAI,EAAI,GAAK,EAAI,GAAI,EAAI,GAAK,EAAI,EAAE,EAC5D,EAAc,CAAC,EAAI,GAAK,EAAW,GAAI,EAAI,GAAK,EAAW,GAAI,EAAI,GAAK,EAAW,GAAI,EAAI,GAAK,EAAW,EAAE,EACnH,MAAO,CAAE,MAAK,QAAO,CACvB,CAEO,YAAgB,EAAyB,EAA+B,CAAC,EAAG,CAAC,EAAG,CACrF,GAAM,GAAS,CAAC,EAAU,IAAI,AAAC,GAAO,EAAG,EAAE,EAAG,EAAU,IAAI,AAAC,GAAO,EAAG,EAAE,CAAC,EACpE,EAAM,CAAC,KAAK,IAAI,GAAG,EAAO,EAAE,EAAG,KAAK,IAAI,GAAG,EAAO,EAAE,CAAC,EACrD,EAAM,CAAC,KAAK,IAAI,GAAG,EAAO,EAAE,EAAG,KAAK,IAAI,GAAG,EAAO,EAAE,CAAC,EACrD,EAAS,CAAE,GAAI,GAAK,EAAI,IAAM,EAAI,GAAI,GAAK,EAAI,IAAM,CAAC,EACtD,EAAO,KAAK,IAAI,EAAO,GAAK,EAAI,GAAI,EAAO,GAAK,EAAI,GAAI,CAAC,EAAO,GAAK,EAAI,GAAI,CAAC,EAAO,GAAK,EAAI,EAAE,EAChG,EAAW,CAAC,KAAK,MAAM,EAAO,GAAK,CAAI,EAAG,KAAK,MAAM,EAAO,GAAK,CAAI,EAAG,KAAK,MAAM,EAAI,CAAI,EAAG,KAAK,MAAM,EAAI,CAAI,CAAC,EAClH,EAAc,CAAC,EAAI,GAAK,EAAW,GAAI,EAAI,GAAK,EAAW,GAAI,EAAI,GAAK,EAAW,GAAI,EAAI,GAAK,EAAW,EAAE,EACnH,MAAO,CAAE,MAAK,QAAO,CACvB,CAEO,YAAe,EAAU,EAAmB,CACjD,GAAM,GAAO,CAAC,EAAI,GAAK,EAAW,EAAI,GAAK,CAAS,EAOpD,MANoB,CAClB,EAAI,GAAM,GAAK,GAAK,EAAI,IAAM,EAC9B,EAAI,GAAM,GAAK,GAAK,EAAI,IAAM,EAC9B,EAAK,GACL,EAAK,EACP,CAEF,CChBA,GAAM,IAAM,CAAE,QAAS,EAAK,EAEtB,GAAwE,CAAE,SAAU,KAAM,UAAW,IAAK,EAC1G,GAAyE,CAAE,SAAU,CAAC,IAAK,GAAG,EAAG,UAAW,CAAC,IAAK,GAAG,CAAE,EACzH,GAAU,OAAO,iBACf,GAA2D,CAC/D,UAAW,CAAC,QAAS,0BAA2B,qBAAsB,WAAY,iBAAiB,EACnG,SAAU,CAAC,CACb,EAEI,GAA2B,KAC3B,GACA,GAA8B,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,CAAC,EAC7D,GAAW,EAET,GAAU,AAAC,GAAO,EAAK,EAAK,GAAI,KAAK,IAAI,CAAC,GAEhD,kBAAiC,EAAqC,CAEpE,GADI,GAAI,SAAS,IAAO,SAAW,MAC/B,CAAC,GAAO,UAAY,EAAO,KAAK,UAAe,EAAO,KAAK,SAAY,UAAoB,CAC7F,GAAO,SAAW,KAAM,GAAU,EAAO,KAAK,SAAY,SAAY,EACtE,GAAM,GAAS,OAAO,OAAO,GAAO,SAAS,eAAe,MAAS,EACrE,GAAU,SAAS,GAAK,MAAM,QAAQ,CAAM,EAAI,SAAS,EAAO,GAAG,YAAY,IAAI,GAAG,IAAI,EAAI,EAC9F,GAAU,SAAS,GAAK,MAAM,QAAQ,CAAM,EAAI,SAAS,EAAO,GAAG,YAAY,IAAI,GAAG,IAAI,EAAI,CAChG,KAAO,AAAI,GAAO,OAAS,GAAO,UAAU,EAAI,gBAAiB,GAAO,SAAS,QAAW,EAC5F,YAAM,AAAO,IAAc,EACpB,GAAO,QAChB,CAEA,kBAA+B,EAAqC,CAElE,GADI,GAAI,SAAS,IAAO,UAAY,MAC/B,GAAO,UAKL,AAAI,EAAO,OAAO,EAAI,gBAAiB,GAAO,UAAU,QAAW,MALnD,CACrB,GAAO,UAAY,KAAM,GAAU,EAAO,KAAK,SAAS,EACxD,GAAM,GAAS,OAAO,OAAO,GAAO,UAAU,eAAe,MAAS,EACtE,GAAU,UAAU,GAAK,MAAM,QAAQ,CAAM,EAAI,SAAS,EAAO,GAAG,YAAY,IAAI,GAAG,IAAI,EAAI,EAC/F,GAAU,UAAU,GAAK,MAAM,QAAQ,CAAM,EAAI,SAAS,EAAO,GAAG,YAAY,IAAI,GAAG,IAAI,EAAI,CACjG,CACA,MAAO,IAAO,SAChB,CAQA,kBAA4B,EAAe,EAA+B,CACxE,GAAM,GAA4B,CAAC,EACnC,GAAI,CAAC,EAAM,OAAS,CAAC,EAAM,MAAM,IAAM,CAAC,EAAM,MAAM,GAAI,MAAO,GAC/D,GAAI,GAIJ,GAHI,IACF,GAAE,QAAU,AAAG,QAAM,cAAc,EAAO,CAAC,EAAO,EAAG,CAAC,CAAC,EAAG,CAAC,EAAM,MAAM,GAAI,EAAM,MAAM,EAAE,CAAC,GAExF,EAAM,MAAM,KAAO,EAAM,MAAM,GAAI,CACrC,GAAM,GAA2B,CAC/B,EAAM,MAAM,GAAK,EAAM,MAAM,GAAK,KAAK,MAAO,GAAM,MAAM,GAAK,EAAM,MAAM,IAAM,CAAC,EAAI,EACtF,EAAM,MAAM,GAAK,EAAM,MAAM,GAAK,KAAK,MAAO,GAAM,MAAM,GAAK,EAAM,MAAM,IAAM,CAAC,EAAI,CACxF,EACM,EAA0B,CAC9B,EAAM,MAAM,GAAK,EAAM,MAAM,GAAK,KAAK,MAAO,GAAM,MAAM,GAAK,EAAM,MAAM,IAAM,CAAC,EAAI,EACtF,EAAM,MAAM,GAAK,EAAM,MAAM,GAAK,KAAK,MAAO,GAAM,MAAM,GAAK,EAAM,MAAM,IAAM,CAAC,EAAI,CACxF,EACA,GAAU,CACR,CAAC,EAAG,CAAC,EACL,EACA,EACA,CAAC,EAAG,CAAC,CACP,EACA,EAAE,IAAM,AAAG,MAAI,EAAE,SAAW,EAAO,EAAO,EAC1C,EAAE,OAAS,AAAG,QAAM,eAAe,EAAE,IAAK,CAAC,EAAM,CAAI,CAAC,EACtD,EAAQ,AAAG,MAAI,EAAE,OAAQ,EAAU,KAAK,CAC1C,KAAO,AAAI,GAAM,MAAM,KAAO,EAC5B,GAAE,OAAS,AAAG,QAAM,eAAe,EAAE,SAAW,EAAO,CAAC,EAAM,CAAI,CAAC,EACnE,EAAQ,AAAG,MAAI,EAAE,OAAQ,EAAU,KAAK,GAExC,EAAQ,AAAG,MAAI,EAAE,SAAW,EAAO,EAAU,KAAK,EAEpD,cAAO,KAAK,CAAC,EAAE,QAAQ,AAAC,GAAW,AAAG,UAAQ,EAAE,EAAO,CAAC,EACjD,CACT,CAEA,YAA0B,EAAgC,EAAmD,CAC3G,OAAW,KAAO,GAChB,EAAI,SAAW,CACb,KAAK,MAAM,EAAI,SAAS,GAAM,GAAW,GAAK,GAAQ,GAAG,GAAK,GAAQ,GAAG,IAAM,EAAW,GAAK,GAAQ,GAAG,EAAE,EAC5G,KAAK,MAAM,EAAI,SAAS,GAAM,GAAW,GAAK,GAAQ,GAAG,GAAK,GAAQ,GAAG,IAAM,EAAW,GAAK,GAAQ,GAAG,EAAE,EAC5G,EAAI,SAAS,EACf,EACA,EAAI,YAAc,CAAC,EAAI,SAAS,GAAK,EAAW,GAAI,EAAI,SAAS,GAAK,EAAW,GAAI,EAAK,EAAI,SAAS,GAAiB,GAAW,GAAK,EAAW,GAAG,EAExJ,GAAI,GACF,OAAW,KAAO,GAChB,EAAI,YAAc,CAChB,EAAI,YAAY,GAAK,GAAQ,GAC7B,EAAI,YAAY,GAAK,GAAQ,GAC7B,EAAI,YAAY,EAClB,EACA,EAAI,SAAW,CACb,KAAK,MAAM,EAAI,YAAY,GAAK,EAAW,EAAE,EAC7C,KAAK,MAAM,EAAI,YAAY,GAAK,EAAW,EAAE,EAC7C,EAAI,YAAY,EAClB,EAGJ,MAAO,EACT,CAEA,kBAA4B,EAAgC,CAE1D,GAAM,GAAW,EAAU,KAAK,AAAC,GAAM,EAAE,OAAS,UAAU,EACtD,EAAY,EAAU,KAAK,AAAC,GAAM,EAAE,OAAS,WAAW,EACxD,EAAY,EAAU,KAAK,AAAC,GAAM,EAAE,OAAS,WAAW,EAC9D,EAAS,SAAS,GAAO,IAAU,SAAS,IAAM,GAAM,GAAU,SAAS,IAAM,IAAM,EACvF,GAAM,GAAY,EAAU,KAAK,AAAC,GAAM,EAAE,OAAS,WAAW,EACxD,EAAa,EAAU,KAAK,AAAC,GAAM,EAAE,OAAS,YAAY,EAC1D,EAAa,EAAU,KAAK,AAAC,GAAM,EAAE,OAAS,YAAY,EAChE,EAAU,SAAS,GAAO,IAAW,SAAS,IAAM,GAAM,GAAW,SAAS,IAAM,IAAM,CAC5F,CAEA,kBAA+B,EAAe,EAAgB,EAA0D,CAtIxH,MA8IE,GAAM,GAA4B,CAAC,EACnC,CAAC,EAAE,GAAqB,EAAE,aAA+B,EAAE,QAAyB,EAAE,MAAwB,EAAE,QAAiB,EAAI,MAAO,YAAP,cAAkB,QAAQ,EAAO,GAAY,WAClL,GAAM,GAAa,MAAM,GAAE,SAAS,KAAK,GAAG,GACtC,EAAS,KAAM,GAAE,GAAG,KAAK,EACzB,EAAY,KAAM,GAAE,MAAM,KAAK,EACrC,OAAO,KAAK,CAAC,EAAE,QAAQ,AAAC,GAAW,AAAG,UAAQ,EAAE,EAAO,CAAC,EACxD,GAAM,GAAyC,CAAC,EAC1C,EAAQ,EACd,OAAS,GAAI,EAAG,EAAI,EAAO,OAAS,EAAO,IAAK,CAC9C,GAAM,GAAQ,GAAQ,EAAO,EAAQ,EAAI,EAAE,EACrC,EAAW,GAAQ,EAAO,EAAQ,EAAI,EAAE,EACxC,EAAW,KAAK,MAAM,IAAM,EAAQ,EAAW,CAAS,EAAI,IAC5D,EAAqB,CAAC,EAAO,EAAQ,EAAI,GAAK,GAAU,UAAU,GAAI,EAAO,EAAQ,EAAI,GAAK,GAAU,UAAU,GAAI,EAAO,EAAQ,EAAI,GAAK,CAAC,EAC/I,EAAkB,CAAC,KAAK,MAAM,EAAW,GAAK,EAAY,EAAE,EAAG,KAAK,MAAM,EAAW,GAAK,EAAY,EAAE,EAAG,EAAY,EAAY,EACnI,EAAkB,CAAC,EAAU,EAAQ,EAAI,GAAI,EAAU,EAAQ,EAAI,GAAI,EAAU,EAAQ,EAAI,GAAK,CAAC,EACzG,EAAkB,KAAK,CAAE,KAAM,AAAO,GAAI,GAAoB,cAAa,WAAU,WAAU,MAAO,CAAS,CAAC,CAClH,CACA,GAAI,EAAa,GAAO,KAAK,eAAiB,GAAI,MAAO,MACzD,GAAa,CAAiB,EAC9B,GAAM,GAAiC,GAAiB,EAAmB,CAAU,EAC/E,EAAO,EAAU,IAAI,AAAC,GAAM,EAAE,QAAQ,EACtC,EAAQ,AAAI,GAAK,EAAM,CAAC,EAAW,GAAI,EAAW,EAAE,CAAC,EACrD,EAAiD,CAAC,EACxD,OAAW,CAAC,EAAM,IAAY,QAAO,QAAe,EAAS,EAAG,CAC9D,GAAM,GAAqB,CAAC,EAC5B,OAAS,GAAI,EAAG,EAAI,EAAQ,OAAS,EAAG,IAAK,CAC3C,GAAM,GAAM,EAAU,KAAK,AAAC,GAAQ,EAAI,OAAS,EAAQ,EAAE,EACrD,EAAM,EAAU,KAAK,AAAC,GAAQ,EAAI,OAAS,EAAQ,EAAI,EAAE,EAC/D,AAAI,GAAO,GAAK,EAAG,KAAK,CAAC,EAAI,SAAU,EAAI,QAAQ,CAAC,CACtD,CACA,EAAY,GAAQ,CACtB,CAEA,MADa,CAAE,GAAI,EAAG,MAAO,KAAK,MAAM,IAAM,CAAS,EAAI,IAAK,IAAK,EAAM,IAAK,OAAQ,EAAM,OAAQ,YAAW,aAAY,CAE/H,CAgCA,kBAA8B,EAAe,EAAuC,CAClF,GAAM,GAA+B,CAAC,EAAM,MAAM,IAAM,EAAG,EAAM,MAAM,IAAM,CAAC,EACxE,EAAY,GAAO,KAAK,UAAY,GAAM,EAAI,EAAI,GAClD,EAAY,GAAW,GAAO,KAAK,YAAc,GACvD,GAAI,EAAO,aAAe,GAAY,GAAa,KAAU,KAC3D,SACK,CACL,GAAM,GAA4B,CAAC,EAOnC,EAAE,UAAY,KAAM,IAAa,EAAO,GAAG,EAC3C,GAAQ,KAAM,IAAgB,EAAE,UAAW,EAAQ,CAAU,EAe7D,OAAO,KAAK,CAAC,EAAE,QAAQ,AAAC,GAAW,AAAG,UAAQ,EAAE,EAAO,CAAC,EACxD,GAAW,EAAI,EACf,GAAU,CACZ,CACA,MAAO,IAAQ,CAAC,EAAK,EAAI,CAAC,CAC5B,CChPO,GAAM,IAAS,CACpB,CAAE,MAAO,EAAG,MAAO,QAAS,EAC5B,CAAE,MAAO,EAAG,MAAO,SAAU,EAC7B,CAAE,MAAO,EAAG,MAAO,KAAM,EACzB,CAAE,MAAO,EAAG,MAAO,YAAa,EAChC,CAAE,MAAO,EAAG,MAAO,UAAW,EAC9B,CAAE,MAAO,EAAG,MAAO,KAAM,EACzB,CAAE,MAAO,EAAG,MAAO,OAAQ,EAC3B,CAAE,MAAO,EAAG,MAAO,OAAQ,EAC3B,CAAE,MAAO,EAAG,MAAO,MAAO,EAC1B,CAAE,MAAO,GAAI,MAAO,eAAgB,EACpC,CAAE,MAAO,GAAI,MAAO,cAAe,EACnC,CAAE,MAAO,GAAI,MAAO,WAAY,EAChC,CAAE,MAAO,GAAI,MAAO,eAAgB,EACpC,CAAE,MAAO,GAAI,MAAO,OAAQ,EAC5B,CAAE,MAAO,GAAI,MAAO,MAAO,EAC3B,CAAE,MAAO,GAAI,MAAO,KAAM,EAC1B,CAAE,MAAO,GAAI,MAAO,KAAM,EAC1B,CAAE,MAAO,GAAI,MAAO,OAAQ,EAC5B,CAAE,MAAO,GAAI,MAAO,OAAQ,EAC5B,CAAE,MAAO,GAAI,MAAO,KAAM,EAC1B,CAAE,MAAO,GAAI,MAAO,UAAW,EAC/B,CAAE,MAAO,GAAI,MAAO,MAAO,EAC3B,CAAE,MAAO,GAAI,MAAO,OAAQ,EAC5B,CAAE,MAAO,GAAI,MAAO,SAAU,EAC9B,CAAE,MAAO,GAAI,MAAO,UAAW,EAC/B,CAAE,MAAO,GAAI,MAAO,UAAW,EAC/B,CAAE,MAAO,GAAI,MAAO,SAAU,EAC9B,CAAE,MAAO,GAAI,MAAO,KAAM,EAC1B,CAAE,MAAO,GAAI,MAAO,UAAW,EAC/B,CAAE,MAAO,GAAI,MAAO,SAAU,EAC9B,CAAE,MAAO,GAAI,MAAO,MAAO,EAC3B,CAAE,MAAO,GAAI,MAAO,WAAY,EAChC,CAAE,MAAO,GAAI,MAAO,aAAc,EAClC,CAAE,MAAO,GAAI,MAAO,MAAO,EAC3B,CAAE,MAAO,GAAI,MAAO,cAAe,EACnC,CAAE,MAAO,GAAI,MAAO,gBAAiB,EACrC,CAAE,MAAO,GAAI,MAAO,YAAa,EACjC,CAAE,MAAO,GAAI,MAAO,WAAY,EAChC,CAAE,MAAO,GAAI,MAAO,eAAgB,EACpC,CAAE,MAAO,GAAI,MAAO,QAAS,EAC7B,CAAE,MAAO,GAAI,MAAO,YAAa,EACjC,CAAE,MAAO,GAAI,MAAO,KAAM,EAC1B,CAAE,MAAO,GAAI,MAAO,MAAO,EAC3B,CAAE,MAAO,GAAI,MAAO,OAAQ,EAC5B,CAAE,MAAO,GAAI,MAAO,OAAQ,EAC5B,CAAE,MAAO,GAAI,MAAO,MAAO,EAC3B,CAAE,MAAO,GAAI,MAAO,QAAS,EAC7B,CAAE,MAAO,GAAI,MAAO,OAAQ,EAC5B,CAAE,MAAO,GAAI,MAAO,UAAW,EAC/B,CAAE,MAAO,GAAI,MAAO,QAAS,EAC7B,CAAE,MAAO,GAAI,MAAO,UAAW,EAC/B,CAAE,MAAO,GAAI,MAAO,QAAS,EAC7B,CAAE,MAAO,GAAI,MAAO,SAAU,EAC9B,CAAE,MAAO,GAAI,MAAO,OAAQ,EAC5B,CAAE,MAAO,GAAI,MAAO,OAAQ,EAC5B,CAAE,MAAO,GAAI,MAAO,MAAO,EAC3B,CAAE,MAAO,GAAI,MAAO,OAAQ,EAC5B,CAAE,MAAO,GAAI,MAAO,OAAQ,EAC5B,CAAE,MAAO,GAAI,MAAO,cAAe,EACnC,CAAE,MAAO,GAAI,MAAO,KAAM,EAC1B,CAAE,MAAO,GAAI,MAAO,cAAe,EACnC,CAAE,MAAO,GAAI,MAAO,QAAS,EAC7B,CAAE,MAAO,GAAI,MAAO,IAAK,EACzB,CAAE,MAAO,GAAI,MAAO,QAAS,EAC7B,CAAE,MAAO,GAAI,MAAO,OAAQ,EAC5B,CAAE,MAAO,GAAI,MAAO,QAAS,EAC7B,CAAE,MAAO,GAAI,MAAO,UAAW,EAC/B,CAAE,MAAO,GAAI,MAAO,YAAa,EACjC,CAAE,MAAO,GAAI,MAAO,WAAY,EAChC,CAAE,MAAO,GAAI,MAAO,MAAO,EAC3B,CAAE,MAAO,GAAI,MAAO,SAAU,EAC9B,CAAE,MAAO,GAAI,MAAO,MAAO,EAC3B,CAAE,MAAO,GAAI,MAAO,cAAe,EACnC,CAAE,MAAO,GAAI,MAAO,MAAO,EAC3B,CAAE,MAAO,GAAI,MAAO,OAAQ,EAC5B,CAAE,MAAO,GAAI,MAAO,MAAO,EAC3B,CAAE,MAAO,GAAI,MAAO,UAAW,EAC/B,CAAE,MAAO,GAAI,MAAO,YAAa,EACjC,CAAE,MAAO,GAAI,MAAO,YAAa,EACjC,CAAE,MAAO,GAAI,MAAO,YAAa,CACnC,ECrEA,GAAI,IACA,GAAY,EACZ,GAAuB,CAAC,EACxB,GAAW,EACX,GAAU,OAAO,iBAErB,kBAA2B,EAAqC,CAE9D,GADI,EAAI,SAAS,IAAQ,MACpB,GAKE,AAAI,EAAO,OAAO,EAAI,gBAAiB,GAAM,QAAW,MALnD,CAEV,GAAQ,KAAM,GAAU,EAAO,OAAO,SAAS,EAC/C,GAAM,GAAS,OAAO,OAAO,GAAM,eAAe,MAAS,EAC3D,GAAY,MAAM,QAAQ,CAAM,EAAI,SAAS,EAAO,GAAG,YAAY,IAAI,GAAG,IAAI,EAAI,CACpF,CACA,MAAO,GACT,CAEA,kBAAuB,EAAoB,EAA+B,EAAgB,CACxF,GAAI,CAAC,EAAK,MAAO,CAAC,EAClB,GAAM,GAA4B,CAAC,EAC7B,EAA+B,CAAC,EAChC,EAAa,KAAM,GAAI,MAAM,EACnC,EAAE,QAAU,AAAG,UAAQ,CAAG,EAC1B,GAAM,GAAM,AAAG,QAAM,EAAE,QAAS,EAAG,CAAC,EACpC,EAAE,MAAQ,AAAG,QAAM,CAAC,EAAI,GAAI,EAAI,GAAI,EAAI,GAAI,EAAI,EAAE,EAAG,CAAC,EACtD,EAAE,MAAQ,AAAG,UAAQ,EAAE,KAAK,EAC5B,EAAE,OAAS,AAAG,UAAQ,EAAI,EAAE,EAC5B,EAAE,QAAU,AAAG,UAAQ,EAAI,EAAE,EAC7B,AAAG,UAAQ,CAAC,EAAK,GAAG,CAAG,CAAC,EACxB,EAAE,IAAM,KAAM,AAAG,SAAM,uBAAuB,EAAE,MAAO,EAAE,OAAQ,EAAO,OAAO,YAAa,EAAO,OAAO,aAAe,EAAO,OAAO,eAAiB,CAAE,EAC1J,GAAM,GAAM,KAAM,GAAE,IAAI,KAAK,EACzB,EAAI,EACR,OAAW,KAAM,OAAM,KAAK,CAAG,EAAG,CAChC,GAAM,GAAQ,KAAK,MAAM,IAAM,EAAW,GAAG,GAAI,EAAE,EAAI,IACjD,EAAW,EAAW,GAAG,GAAI,GAC7B,EAAQ,GAAO,GAAU,MACzB,CAAC,EAAG,GAAK,CACb,EAAW,GAAG,GAAI,GAAK,GACvB,EAAW,GAAG,GAAI,GAAK,EACzB,EACM,EAAc,CAClB,EACA,EACA,EAAW,GAAG,GAAI,GAAK,GAAY,EACnC,EAAW,GAAG,GAAI,GAAK,GAAY,CACrC,EACM,EAAW,CACf,KAAK,MAAM,EAAO,GAAK,EAAY,EAAE,EACrC,KAAK,MAAM,EAAO,GAAK,EAAY,EAAE,EACrC,KAAK,MAAM,EAAO,GAAK,EAAY,EAAE,EACrC,KAAK,MAAM,EAAO,GAAK,EAAY,EAAE,CACvC,EACA,EAAQ,KAAK,CAAE,GAAI,IAAK,QAAO,MAAO,EAAU,QAAO,MAAK,QAAO,CAAC,CACtE,CACA,cAAO,KAAK,CAAC,EAAE,QAAQ,AAAC,GAAW,AAAG,UAAQ,EAAE,EAAO,CAAC,EACjD,CACT,CAEA,kBAA8B,EAAe,EAAyC,CACpF,GAAM,GAAY,GAAO,OAAO,UAAY,GAAM,EAAI,EAAI,GACpD,EAAY,GAAW,GAAO,OAAO,YAAc,GACzD,MAAI,GAAO,aAAe,GAAY,GAAc,GAAK,OAAS,EAChE,MACO,IAET,IAAU,EACH,GAAI,SAAQ,KAAO,IAAY,CACpC,GAAM,GAAa,CAAC,EAAM,MAAM,IAAM,EAAG,EAAM,MAAM,IAAM,CAAC,EACtD,EAAS,AAAG,QAAM,eAAe,EAAO,CAAC,GAAW,EAAS,CAAC,EAC9D,EAAU,EAAO,OAAO,QAAU,mBAAO,QAAQ,EAAQ,CAAC,oBAAoB,GAAe,KACnG,GAAW,EAAI,EACf,AAAG,UAAQ,CAAM,EAEjB,GAAM,GAAM,KAAM,IAAQ,EAAS,EAAY,CAAM,EACrD,GAAO,EAEP,EAAQ,CAAG,CACb,CAAC,EACH,CC7FA,+CAAO,GAAM,IAAqB,CAChC,OACA,OACA,gBACA,aACA,aACA,QACA,eACA,YACA,YACA,aACA,WACA,YACA,aACA,UACA,WACA,WACF,EAEa,GAAsC,CACjD,QAAS,CAAC,UAAW,WAAY,WAAW,EAC5C,SAAU,CAAC,WAAY,YAAa,YAAY,EAChD,MAAO,CAAC,eAAgB,gBAAiB,WAAY,UAAW,cAAc,EAC9E,QAAS,CAAC,eAAgB,YAAa,WAAW,EAClD,SAAU,CAAC,gBAAiB,aAAc,YAAY,EACtD,KAAM,CAAC,CACT,ECVA,GAAI,IACA,GAAW,EACT,GAAoB,CAAE,GAAI,EAAG,UAAW,CAAC,EAAG,IAAK,CAAC,EAAG,EAAG,EAAG,CAAC,EAAG,OAAQ,CAAC,EAAG,EAAG,EAAG,CAAC,EAAG,MAAO,EAAG,YAAa,CAAC,CAAuC,EAMtJ,GAAU,OAAO,iBAErB,kBAA2B,EAAqC,CAC9D,MAAI,GAAI,SAAS,IAAQ,MACzB,AAAK,GACI,EAAO,OAAO,EAAI,gBAAiB,GAAM,QAAW,EADjD,GAAQ,KAAM,GAAU,EAAO,KAAK,SAAS,EAElD,EACT,CAGA,kBAAqB,EAAQ,EAAU,CACrC,GAAM,CAAC,EAAO,GAAU,EAAO,MACzB,EAAW,AAAG,UAAQ,EAAQ,CAAC,EAAS,CAAK,CAAC,EAC9C,EAAM,AAAG,MAAI,EAAU,CAAC,EACxB,EAAY,MAAM,GAAI,KAAK,GAAG,GAEpC,GADA,AAAG,UAAQ,CAAC,EAAU,CAAG,CAAC,EACtB,EAAW,EAAU,CACvB,GAAM,GAAc,AAAG,SAAO,EAAU,CAAC,EACnC,EAAM,AAAG,MAAI,EAAa,CAAK,EAC/B,EAAK,MAAM,GAAI,KAAK,GAAG,GACvB,EAAM,AAAG,MAAI,EAAa,AAAG,SAAO,EAAO,OAAO,CAAC,EACnD,EAAK,MAAM,GAAI,KAAK,GAAG,GAC7B,MAAG,WAAQ,CAAC,EAAK,CAAG,CAAC,EACd,CAAC,EAAG,EAAG,CAAQ,CACxB,CACA,MAAO,CAAC,EAAG,EAAG,CAAQ,CACxB,CAEA,kBAA8B,EAAe,EAAuC,CAClF,GAAM,GAAY,GAAO,KAAK,UAAY,GAAM,EAAI,EAAI,GAClD,EAAY,GAAW,GAAO,KAAK,YAAc,GACvD,MAAI,GAAO,aAAe,GAAY,GAAa,OAAO,KAAK,GAAM,SAAS,EAAE,OAAS,EACvF,MACO,CAAC,EAAK,GAEf,IAAU,EACH,GAAI,SAAQ,KAAO,IAAY,CA5DxC,MA6DI,GAAM,GAAS,AAAG,OAAK,IAAM,CAC3B,GAAI,CAAC,cAAO,OAAO,GAAG,OAAO,MAAO,MACpC,GAAM,GAAS,AAAG,QAAM,eAAe,EAAO,CAAC,GAAM,OAAO,GAAG,MAAM,GAAI,GAAM,OAAO,GAAG,MAAM,EAAE,EAAG,EAAK,EACnG,EAAU,AAAG,MAAI,EAAQ,EAAU,GAAG,EAE5C,MADa,AAAG,OAAI,EAAS,EAAU,GAAG,CAE5C,CAAC,EAEG,EAKJ,GAJI,EAAO,KAAK,SAAS,GAAO,mBAAO,QAAQ,IAC/C,GAAW,EAAI,EACf,AAAG,UAAQ,CAAM,EAEb,EAAM,CACR,GAAM,UAAU,OAAS,EACzB,GAAM,GAAU,EAAK,QAAQ,EAC7B,AAAG,UAAQ,CAAI,EAEf,GAAM,GAAQ,EAAQ,QAAQ,CAAC,EAC/B,AAAG,UAAQ,CAAO,EAElB,OAAS,GAAK,EAAG,EAAK,EAAM,OAAQ,IAAM,CAExC,GAAM,CAAC,EAAG,EAAG,GAAa,KAAM,IAAM,EAAM,GAAK,EAAO,KAAK,aAAa,EAC1E,AAAI,EAAa,OAAO,OAAP,cAAa,gBAAiB,IAC7C,GAAM,UAAU,KAAK,CACnB,MAAO,KAAK,MAAM,IAAM,CAAS,EAAI,IACrC,KAAM,AAAO,GAAI,GACjB,YAAa,CAEX,EAAI,GAAM,OAAO,GAAG,MAAM,GAAI,EAAI,GAAM,OAAO,GAAG,MAAM,EAC1D,EACA,SAAU,CAER,KAAK,MAAM,EAAM,MAAM,GAAK,EAAI,GAAM,OAAO,GAAG,MAAM,EAAE,EAAG,KAAK,MAAM,EAAM,MAAM,GAAK,EAAI,GAAM,OAAO,GAAG,MAAM,EAAE,CACrH,CACF,CAAC,CAEL,CACA,EAAM,QAAQ,AAAC,GAAM,AAAG,UAAQ,CAAC,CAAC,CACpC,CACA,GAAM,MAAQ,GAAM,UAAU,OAAO,CAAC,EAAM,IAAU,EAAK,MAAQ,EAAO,EAAK,MAAQ,EAAO,CAAC,EAC/F,GAAM,GAAI,GAAM,UAAU,IAAI,AAAC,GAAM,EAAE,SAAS,EAAE,EAC5C,EAAI,GAAM,UAAU,IAAI,AAAC,GAAM,EAAE,SAAS,EAAE,EAClD,GAAM,IAAM,CACV,KAAK,IAAI,GAAG,CAAC,EACb,KAAK,IAAI,GAAG,CAAC,EACb,KAAK,IAAI,GAAG,CAAC,EAAI,KAAK,IAAI,GAAG,CAAC,EAC9B,KAAK,IAAI,GAAG,CAAC,EAAI,KAAK,IAAI,GAAG,CAAC,CAChC,EACA,GAAM,GAAO,GAAM,UAAU,IAAI,AAAC,GAAM,EAAE,YAAY,EAAE,EAClD,EAAO,GAAM,UAAU,IAAI,AAAC,GAAM,EAAE,YAAY,EAAE,EACxD,GAAM,OAAS,CACb,KAAK,IAAI,GAAG,CAAI,EAChB,KAAK,IAAI,GAAG,CAAI,EAChB,KAAK,IAAI,GAAG,CAAI,EAAI,KAAK,IAAI,GAAG,CAAI,EACpC,KAAK,IAAI,GAAG,CAAI,EAAI,KAAK,IAAI,GAAG,CAAI,CACtC,EACA,OAAW,CAAC,EAAM,IAAY,QAAO,QAAe,EAAS,EAAG,CAC9D,GAAM,GAAqB,CAAC,EAC5B,OAAS,GAAI,EAAG,EAAI,EAAQ,OAAS,EAAG,IAAK,CAC3C,GAAM,GAAM,GAAM,UAAU,KAAK,AAAC,GAAQ,EAAI,OAAS,EAAQ,EAAE,EAC3D,EAAM,GAAM,UAAU,KAAK,AAAC,GAAQ,EAAI,OAAS,EAAQ,EAAI,EAAE,EACrE,AAAI,GAAO,GAAO,EAAI,MAAS,GAAO,KAAK,eAAiB,IAAM,EAAI,MAAS,GAAO,KAAK,eAAiB,IAAI,EAAG,KAAK,CAAC,EAAI,SAAU,EAAI,QAAQ,CAAC,CACtJ,CACA,GAAM,YAAY,GAAQ,CAC5B,CACA,EAAQ,CAAC,EAAK,CAAC,CACjB,CAAC,EACH,CCnHA,GAAM,IAAc,CAAC,QAAS,UAAW,OAAQ,QAAS,MAAO,WAAY,SAAS,EAClF,GACE,GAA0D,CAAC,EAC7D,GAAY,EACZ,GAAW,EACX,GAAU,OAAO,iBAErB,kBAA2B,EAAqC,CAtBhE,MAuBE,MAAI,GAAI,SAAS,IAAQ,MACzB,AAAK,GACI,EAAO,OAAO,EAAI,gBAAiB,GAAM,QAAW,EADjD,GAAQ,KAAM,GAAU,KAAO,KAAK,UAAZ,cAAqB,SAAS,EAE3D,EACT,CAEA,kBAA8B,EAAe,EAAgB,EAAa,EAAoE,CA7B9I,QA8BE,GAAI,CAAC,GAAO,MAAO,CAAC,EACpB,GAAM,GAAY,GAAW,OAAO,KAAK,UAAZ,cAAqB,aAAc,GAC1D,EAAY,OAAO,KAAK,UAAZ,cAAqB,WAAY,GAAM,EAAI,EAAI,GACjE,MAAI,GAAO,aAAe,GAAY,GAAc,KAAc,GAAU,GAAK,IAAS,GAAK,GAAK,OAAS,EAC3G,MACO,GAAK,IAEd,IAAU,EACH,GAAI,SAAQ,KAAO,IAAY,CAtCxC,QAuCI,GAAM,GAAkD,CAAC,EACzD,GAAI,KAAO,KAAK,UAAZ,QAAqB,QAAS,CAChC,GAAM,GAA4B,CAAC,EAC7B,EAAY,aAAO,OAAO,GAAG,MAAQ,GAAM,OAAO,GAAG,MAAM,GAAK,EACtE,EAAE,OAAS,AAAG,QAAM,eAAe,EAAO,CAAC,EAAW,CAAS,EAAG,EAAK,EASvE,EAAE,SAAW,AAAG,MAAI,EAAE,OAAQ,EAAU,GAAG,EAC3C,EAAE,UAAY,AAAG,MAAI,EAAE,SAAU,EAAG,EAAI,EACxC,EAAE,aAAe,AAAG,MAAI,EAAE,UAAW,EAAU,IAAI,EACnD,EAAE,aAAe,AAAG,MAAI,EAAE,aAAc,EAAU,GAAG,EACrD,EAAE,QAAU,mBAAO,QAAQ,EAAE,cAC7B,GAAW,EAAI,EACf,GAAM,GAAO,KAAM,GAAE,QAAQ,KAAK,EAClC,OAAS,GAAI,EAAG,EAAI,EAAK,OAAQ,IAC/B,AAAI,EAAK,GAAM,OAAO,KAAK,UAAZ,cAAqB,gBAAiB,IAAI,EAAI,KAAK,CAAE,MAAO,KAAK,IAAI,IAAM,KAAK,MAAM,IAAM,EAAK,EAAE,EAAI,GAAG,EAAG,QAAS,GAAY,EAAc,CAAC,EAElK,EAAI,KAAK,CAAC,EAAG,IAAM,EAAE,MAAQ,EAAE,KAAK,EACpC,OAAO,KAAK,CAAC,EAAE,QAAQ,AAAC,GAAW,AAAG,UAAQ,EAAE,EAAO,CAAC,CAC1D,CACA,GAAK,GAAO,EACZ,GAAY,EACZ,EAAQ,CAAG,CACb,CAAC,EACH,CCtDA,GAAI,IACE,GAAwB,CAAC,EAC3B,GAAY,EACZ,GAAW,EACX,GAAU,OAAO,iBAErB,kBAA2B,EAAqC,CAC9D,MAAI,GAAI,SAAS,IAAQ,MACzB,AAAK,GACI,EAAO,OAAO,EAAI,gBAAiB,GAAM,QAAW,EADjD,GAAQ,KAAM,GAAU,EAAO,KAAK,cAAiB,SAAS,EAEnE,EACT,CAoBA,kBAA8B,EAAe,EAAgB,EAAK,EAA0B,CA9C5F,QA+CE,GAAI,CAAC,GAAO,MAAO,CAAC,EACpB,GAAM,GAAY,GAAW,OAAO,KAAK,YAAZ,cAA0B,aAAc,GAC/D,EAAY,OAAO,KAAK,YAAZ,cAA0B,WAAY,GAAM,EAAI,EAAI,GACtE,MAAI,GAAO,aAAe,GAAY,GAAc,KAAc,GAAU,GAAK,GAC/E,MACO,GAAK,IAEP,GAAI,SAAQ,KAAO,IAAY,CAtDxC,MAuDI,GAAI,GAAsB,CAAC,EAC3B,GAAI,MAAO,KAAK,YAAZ,cAA0B,UAAW,oBAAO,OAAO,GAAG,OAAO,CAC/D,GAAM,GAA4B,CAAC,EACnC,EAAE,KAAO,AAAG,QAAM,eAAe,EAAO,CAAC,GAAM,OAAO,GAAG,MAAM,GAAI,GAAM,OAAO,GAAG,MAAM,EAAE,EAAG,EAAK,EAInG,EAAE,KAAO,mBAAO,QAAQ,EAAE,MAa1B,GAAM,GAAS,KAAM,GAAE,KAAK,KAAK,EACjC,EAAO,MAAM,KAAK,CAAM,CAC1B,CACA,GAAK,GAAO,EACZ,GAAY,EACZ,GAAW,EAAI,EACf,EAAQ,CAAI,CACd,CAAC,CACH,CCzEA,GAAI,IACA,GAAY,EAEV,GAAc,IAEd,GAAc,AAAO,GAAgB,cACrC,GAAe,AAAO,GAAgB,eAEtC,GAAe,CACnB,WAAY,CAAC,GAAY,GAAI,GAAY,GAAY,OAAS,EAAE,EAChE,YAAa,CAAC,GAAa,GAAI,GAAa,GAAa,OAAS,EAAE,CACtE,EAEM,GAAgB,CACpB,YAAa,EACb,YAAa,EACb,MAAO,GACP,eAAgB,EAClB,EAEA,kBAA2B,EAAqC,CA9BhE,MA+BE,MAAI,GAAI,SAAS,IAAQ,MACzB,AAAK,GACI,EAAO,OAAO,EAAI,gBAAiB,GAAM,QAAW,EADjD,GAAQ,KAAM,GAAU,KAAO,KAAK,OAAZ,cAAkB,SAAS,EAE/D,GAAY,GAAM,OAAO,GAAG,MAAQ,GAAM,OAAO,GAAG,MAAM,GAAK,EAC3D,KAAc,IAAI,IAAY,IAC3B,EACT,CAIA,YAA+B,EAAW,EAAW,EAAQ,EAAM,CACjE,OAAS,GAAI,EAAG,EAAI,AAAO,GAAyB,OAAQ,IAAK,CAC/D,GAAM,CAAE,MAAK,WAAY,AAAO,GAAyB,GACnD,EAAkB,AAAO,GAAgB,GAAG,IAAS,KAC3D,GAAI,CAAC,GAAQ,EAAK,SAAS,CAAG,EAC5B,OAAS,GAAI,EAAG,EAAI,EAAQ,OAAQ,IAAK,CACvC,GAAM,GAAQ,EAAQ,GACtB,EAAU,EAAgB,IAAM,CAC9B,EAAU,GAAO,GAAI,EAAU,GAAO,GACrC,GAAU,GAAO,GAAK,EAAU,EAAgB,IAAI,IAAM,CAC7D,CACF,CAEJ,CACF,CAGO,GAAM,IAAmC,AAAC,GAAc,CAC7D,GAAM,GAAW,EAAU,GAAa,WAAW,IAAI,GACjD,EAAY,EAAU,GAAa,YAAY,IAAI,GACzD,MAAO,GAAW,CACpB,EAGa,GAAY,CAAC,EAAW,EAAM,EAAqB,EAAqB,EAAU,EAAO,KAAU,CAC9G,GAAM,GAAM,AAAK,GAAY,AAAK,GAAW,AAAK,GAA8B,CAAC,EAAU,GAAsB,EAAU,EAAoB,CAAC,EAAG,EAAW,CAAC,EACzJ,EAAU,AAAK,GAAW,CAAG,EAC/B,EAAO,AAAG,QAAM,cAAc,EAAM,CAAC,CACvC,EAAI,WAAW,GAAK,EACpB,EAAI,WAAW,GAAK,EAAU,EAAI,SAAS,GAAK,EAChD,EAAI,SAAS,GAAK,CACpB,CAAC,EAAG,CAAC,CAAC,EAAG,CAAC,GAAW,EAAS,CAAC,EAC/B,GAAI,GAAQ,EAAI,QAAQ,SAAS,eAAe,EAAG,CACjD,GAAM,GAAU,AAAG,QAAM,cAAc,CAAI,EAC3C,AAAG,UAAQ,CAAI,EACf,EAAO,CACT,CACA,MAAO,CAAE,MAAK,UAAS,MAAK,CAC9B,EAGa,GAAe,CAAC,EAAS,EAAQ,EAAY,EAAO,KAAU,CACzE,GAAM,GAA6B,CAAC,EACpC,OAAS,GAAI,EAAG,EAAI,GAAc,eAAgB,IAAK,CACrD,GAAM,GAAI,EAAQ,EAAI,GAChB,EAAI,EAAQ,EAAI,EAAI,GACpB,EAAI,EAAQ,EAAI,EAAI,GAC1B,EAAa,KAAK,CACf,GAAQ,EAAK,EAAI,GAAe,EAAI,IAAc,EAAW,GAAK,EAAO,WAAW,GACpF,EAAI,GAAa,EAAW,GAAK,EAAO,WAAW,GAAI,CAC1D,CAAC,CACH,CACA,MAAO,CAAE,UAAW,EAAc,KAAM,EAAa,MAAM,GAAc,KAAK,CAAE,CAClF,EAIa,GAAwB,CAAC,EAAW,EAAY,IAAc,CACzE,GAAM,GAAe,EAAU,AAAO,GAAgB,GAAG,cAAsB,GAAc,cAAc,GACrG,EAAe,EAAU,AAAO,GAAgB,GAAG,cAAsB,GAAc,cAAc,GACrG,EAAY,GAAe,GAAgB,EAEjD,MAAO,GAAW,IAAI,CAAC,EAAO,IAAM,CAClC,GAAI,GAAI,EACR,MAAI,KAAM,EACR,EAAI,EACK,IAAM,GACf,GAAI,GAEC,CAAC,EAAM,GAAI,EAAM,GAAI,CAAC,CAC/B,CAAC,CACH,EAEA,kBAAkC,EAAW,EAAM,EAAQ,EAAU,CACnE,GAAI,CAAC,GACH,MAAI,GAAO,OAAO,EAAI,6DAA6D,EAC5E,EAET,GAAM,CAAE,IAAK,EAAY,QAAS,EAAgB,KAAM,GAAgB,GAAU,EAAW,EAAM,GAAa,WAAW,GAAI,GAAa,WAAW,GAAI,EAAU,EAAI,EACnK,CAAE,IAAK,EAAa,QAAS,EAAiB,KAAM,GAAiB,GAAU,EAAW,EAAM,GAAa,YAAY,GAAI,GAAa,YAAY,GAAI,EAAU,EAAI,EACxK,EAAW,AAAG,SAAO,CAAC,EAAa,CAAY,CAAC,EACtD,AAAG,UAAQ,CAAW,EACtB,AAAG,UAAQ,CAAY,EACvB,GAAM,GAAiB,GAAM,QAAQ,CAAQ,EAC7C,AAAG,UAAQ,CAAQ,EACnB,GAAM,GAAqB,KAAM,GAAe,KAAK,EACrD,AAAG,UAAQ,CAAc,EACzB,GAAM,GAAc,EAAmB,MAAM,EAAG,GAAc,eAAiB,CAAC,EAC1E,CAAE,UAAW,EAAkB,KAAM,GAAsB,GAAa,EAAa,EAAY,EAAgB,EAAI,EACrH,EAAe,EAAmB,MAAM,GAAc,eAAiB,CAAC,EACxE,CAAE,UAAW,EAAmB,KAAM,GAAuB,GAAa,EAAc,EAAa,EAAiB,EAAK,EAC3H,EAAgC,GAAiC,CAAS,EAChF,AAAI,KAAK,IAAI,CAA6B,EAAI,GAC5C,IAAsB,EAAW,EAAkB,OAAQ,IAAI,EAC/D,GAAsB,EAAW,EAAmB,QAAS,IAAI,GAG5D,AAAI,EAAgC,EACzC,GAAsB,EAAW,EAAkB,OAAQ,CAAC,YAAa,WAAW,CAAC,EAErF,GAAsB,EAAW,EAAmB,QAAS,CAAC,YAAa,WAAW,CAAC,EAEzF,GAAM,GAAyB,GAAsB,EAAW,EAAmB,MAAM,EACnF,EAA0B,GAAsB,EAAW,EAAoB,OAAO,EAE5F,MADkB,GAAU,OAAO,CAAsB,EAAE,OAAO,CAAuB,CAE3F,CCjJA,kBAA8B,EAAW,EAAmB,CAC1D,GAAM,GAAkC,CACtC,KAAM,EAAQ,GAAG,SAAS,EAC1B,KAAM,EAAQ,GAAG,SAAS,EAC1B,MAAO,EAAQ,GAAG,SAAS,EAC3B,MAAO,EAAQ,GAAG,SAAS,EAC3B,KAAM,EAAQ,GAAG,SAAS,CAG5B,EACA,OAAS,GAAI,EAAG,EAAI,EAAE,KAAK,OAAS,EAAG,IAAK,EAAU,KAAK,CAAC,EAAE,KAAK,EAAI,EAAI,GAAI,EAAE,KAAK,EAAI,EAAI,GAAI,CAAC,CAAC,EACpG,OAAS,GAAI,EAAG,EAAI,EAAE,KAAK,OAAS,EAAG,IAAK,EAAU,KAAK,CAAC,EAAE,KAAK,EAAI,EAAI,GAAI,EAAE,KAAK,EAAI,EAAI,GAAI,CAAC,CAAC,EACpG,OAAS,GAAI,EAAG,EAAI,EAAE,KAAK,OAAS,EAAG,IAAK,EAAU,KAAK,CAAC,EAAE,KAAK,EAAI,EAAI,GAAI,EAAE,KAAK,EAAI,EAAI,GAAI,CAAC,CAAC,EACpG,OAAS,GAAI,EAAG,EAAI,EAAE,MAAM,OAAS,EAAG,IAAK,EAAU,KAAK,CAAC,EAAE,MAAM,EAAI,EAAI,GAAI,EAAE,MAAM,EAAI,EAAI,GAAI,CAAC,CAAC,EACvG,OAAS,GAAI,EAAG,EAAI,EAAE,MAAM,OAAS,EAAG,IAAK,EAAU,KAAK,CAAC,EAAE,MAAM,EAAI,EAAI,GAAI,EAAE,MAAM,EAAI,EAAI,GAAI,CAAC,CAAC,EACvG,MAAO,EACT,CCOA,GAAM,IAAQ,CACZ,MAAO,CAAC,EACR,QAAS,OAAO,iBAChB,UAAW,CACb,EAEI,GAA2B,KAC3B,GAAY,EAEhB,kBAA8B,EAAe,EAAuC,CAlCpF,wBAoCE,GAAM,GAAY,OAAO,KAAK,WAAZ,cAAsB,WAAY,GAAM,EAAI,EAAI,GAAM,UAClE,EAAY,GAAM,QAAW,OAAO,KAAK,WAAZ,cAAsB,aAAc,GACvE,AAAI,CAAC,EAAO,aAAe,CAAC,GAAY,CAAC,GAAa,GAAM,MAAM,SAAW,EAC3E,IAAM,MAAQ,KAAM,AAAU,IAAS,EAAO,CAAM,EACpD,GAAM,UAAY,EAAI,EACtB,GAAM,QAAU,GAEhB,GAAM,UAER,GAAM,GAA2B,CAAC,EAC5B,EAA6B,CAAC,EAChC,EAAK,EACT,OAAS,GAAI,EAAG,EAAI,GAAM,MAAM,OAAQ,IAAK,CAC3C,GAAM,GAAM,GAAM,MAAM,GACpB,EAAQ,EACR,EACE,EAAmB,CACvB,GAAI,IACJ,KAAM,CAAC,EACP,QAAS,CAAC,EACV,IAAK,CAAC,EAAG,EAAG,EAAG,CAAC,EAChB,OAAQ,CAAC,EAAG,EAAG,EAAG,CAAC,EACnB,MAAO,EACP,SAAU,EACV,UAAW,EACX,YAAa,CAAC,CAChB,EAIA,GADA,CAAC,EAAO,EAAgB,EAAK,MAAM,EAAI,AAAK,GAAoB,KAAO,KAAK,WAAZ,cAAsB,SAAU,EAAK,EAAO,KAAO,KAAK,OAAZ,QAAkB,QAAU,GAAY,AAAU,GAAK,CAAC,EAChK,oBAAQ,SAAR,QAAgB,aAAc,CAChC,GAAM,GAAY,KAAM,IAAsB,EAAK,MAAgB,EACnE,AAAG,UAAQ,EAAK,MAAM,EACtB,EAAK,OAAS,CAChB,CAEA,GADA,EAAK,SAAW,KAAK,MAAM,IAAM,EAAI,UAAU,EAAI,IAC9C,KAAO,KAAK,OAAZ,QAAkB,QAYhB,GAAI,CAAC,GACV,AAAI,EAAO,OAAO,EAAI,wDAAwD,MACzE,CACL,GAAM,GAAU,GAAM,QAAQ,EAAK,MAAgB,EAC7C,EAAa,EAAQ,KAAK,AAAC,GAAM,EAAE,MAAM,EAAE,MAAM,OAAS,KAAO,CAAC,EAClE,EAAgB,EAAQ,KAAK,AAAC,GAAM,EAAE,MAAM,EAAE,MAAM,OAAS,KAAO,IAAI,EACxE,EAAiB,KAAM,GAAW,KAAK,EAC7C,EAAK,UAAY,KAAK,MAAM,IAAM,EAAe,EAAE,EAAI,IACvD,GAAM,GAAiB,AAAG,UAAQ,EAAe,CAAC,GAAI,CAAC,CAAC,EACpD,EAAY,KAAM,GAAe,MAAM,EAC3C,GAAI,EAAK,UAAa,OAAO,KAAK,WAAZ,cAAsB,gBAAiB,GAC3D,EAAI,WAAa,EAAK,cACjB,CACL,AAAI,KAAO,KAAK,YAAZ,QAAuB,QACzB,EAAY,KAAM,AAAU,IAAQ,EAAW,CAAO,EAC7C,KAAO,KAAK,OAAZ,QAAkB,SAC3B,GAAY,KAAM,AAAK,IAAY,EAAW,EAAK,OAAQ,EAAQ,EAAS,GAE9E,EAAK,KAAO,AAAK,GAAmB,EAAW,EAAK,EAAO,EAAgB,EAAS,EACpF,EAAK,QAAU,EAAK,KAAK,IAAI,AAAC,GAAO,CAAC,EAAG,GAAM,GAAM,MAAM,IAAM,GAAI,EAAG,GAAM,GAAM,MAAM,IAAM,GAAK,GAAG,IAAM,GAAK,EAAS,CAAC,EAC7H,OAAW,KAAO,QAAO,KAAY,EAAe,EAAG,EAAK,YAAY,GAAO,AAAO,GAAgB,GAAK,IAAI,AAAC,GAAU,EAAK,KAAK,EAAM,EAC1I,EAAK,MAAQ,EAAK,UAClB,GAAM,GAAgB,IAAK,AAAK,GAAiB,EAAK,KAAM,CAAG,EAAG,WAAY,EAAI,WAAY,UAAW,EAAI,SAAU,EACvH,EAAK,IAAM,AAAK,GAAS,EAAe,CAAK,EAC7C,EAAK,OAAS,AAAK,GAAU,EAAe,CAAK,EACjD,EAAS,KAAK,CAAa,CAC7B,CACA,AAAG,UAAQ,CAAC,GAAG,EAAS,CAAc,CAAC,CACzC,KAxCgC,CAC9B,EAAK,IAAM,AAAK,GAAS,EAAK,CAAK,EACnC,EAAK,OAAS,AAAK,GAAU,EAAK,CAAK,EACvC,EAAK,MAAQ,EAAK,SAClB,EAAK,KAAO,EAAI,UAAU,IAAI,AAAC,GAAO,CAClC,GAAI,WAAW,GAAK,EAAI,SAAS,IAAO,EAAM,GAAI,SAAS,GAAK,EAAI,WAAW,IAAM,EAAG,GAAK,AAAU,GAAK,EAC5G,GAAI,WAAW,GAAK,EAAI,SAAS,IAAO,EAAM,GAAI,SAAS,GAAK,EAAI,WAAW,IAAM,EAAG,GAAK,AAAU,GAAK,CAChH,CAAC,EACD,EAAK,QAAU,EAAK,KAAK,IAAI,AAAC,GAAO,CAAC,EAAG,GAAM,GAAM,MAAM,IAAM,GAAI,EAAG,GAAM,GAAM,MAAM,IAAM,GAAK,GAAG,IAAM,GAAK,EAAS,CAAC,EAC7H,OAAW,KAAO,QAAO,KAAY,EAAkB,EACrD,EAAK,YAAY,GAAO,CAAC,EAAK,KAAK,AAAO,GAAmB,GAAe,CAEhF,CA6BA,AAAI,EAAK,MAAS,OAAO,KAAK,WAAZ,cAAsB,gBAAiB,GAAI,EAAM,KAAK,CAAI,EACvE,AAAG,UAAQ,EAAK,MAAM,CAC7B,CACA,UAAM,MAAQ,EACP,CACT,CAEA,kBAA2B,EAAqC,CAxHhE,UAyHE,MAAI,GAAI,SAAS,IAAQ,MACzB,AAAK,GAGM,EAAO,OAChB,EAAI,gBAAiB,GAAM,QAAW,EAHtC,AAAI,KAAO,KAAK,YAAZ,QAAuB,QAAS,GAAQ,KAAM,GAAU,KAAO,KAAK,YAAZ,cAAuB,SAAS,EACvF,GAAQ,KAAM,GAAU,KAAO,KAAK,OAAZ,cAAkB,SAAS,EAI1D,GAAY,GAAM,OAAO,GAAG,MAAQ,GAAM,OAAO,GAAG,MAAM,GAAK,EACxD,EACT,CAEO,GAAM,IAAuB,GACvB,GAAe,GCjH5B,GAAI,IACE,GAKD,CAAC,EAEF,GAAW,EACX,GAAY,EACZ,GAAU,OAAO,iBAErB,kBAA2B,EAAqC,CAhChE,MAiCE,MAAI,GAAI,SAAS,IAAQ,MACzB,AAAK,GACI,EAAO,OAAO,EAAI,gBAAiB,GAAM,QAAW,EADjD,GAAQ,KAAM,GAAU,KAAO,KAAK,cAAZ,cAAyB,SAAS,EAE/D,EACT,CAEO,YAAiB,EAAe,CACrC,GAAM,GAAU,EAAM,OAAS,EAAM,QAAU,EAC/C,GAAI,CAAC,cAAO,OAAO,GAAG,OAAO,MAAO,GACpC,GAAM,GAAO,AAAG,QAAM,eAAe,EAAQ,CAAC,GAAM,OAAO,GAAG,MAAM,GAAI,GAAM,OAAO,GAAG,MAAM,EAAE,EAAG,EAAK,EAClG,EAAO,AAAG,MAAI,EAAM,EAAU,KAAK,EACzC,MAAG,WAAQ,CAAI,EACR,CAkBT,CAEA,kBAA8B,EAAe,EAAgB,EAAa,EAAiC,CAjE3G,YAkEE,GAAI,CAAC,GAAO,MAAO,CAAE,IAAK,EAAG,OAAQ,UAAW,YAAa,EAAG,WAAY,CAAC,CAAE,EAC/E,GAAM,GAAY,GAAW,OAAO,KAAK,cAAZ,cAAyB,aAAc,GAC9D,EAAY,OAAO,KAAK,cAAZ,cAAyB,WAAY,GAAM,EAAI,EAAI,GACrE,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,CA1ExC,QA2EI,GAAM,GAAM,CACV,IAAa,EACb,OAAgB,UAChB,YAAqB,EACrB,WAAsB,CAAC,CACzB,EAEA,GAAI,KAAO,KAAK,cAAZ,QAAyB,QAAS,CACpC,GAAM,GAAW,GAAQ,CAAK,EACxB,EAAO,mBAAO,QAAQ,GAC5B,GAAW,EAAI,EACf,AAAG,UAAQ,CAAQ,EAEnB,GAAM,GAAS,KAAM,AADL,MAAM,GAAK,KAAK,AAAC,GAAM,EAAE,MAAM,KAAO,CAAC,GAC1B,KAAK,EAC5B,EAAa,KAAK,MAAM,IAAM,KAAK,IAAK,EAAO,GAAK,EAAI,CAAC,EAAI,IACnE,AAAI,EAAc,OAAO,KAAK,cAAZ,cAAyB,gBAAiB,IAC1D,GAAI,OAAS,EAAO,IAAM,GAAM,SAAW,OAC3C,EAAI,YAAc,KAAK,IAAI,IAAM,CAAU,GAE7C,GAAM,GAAS,AAAG,SAAO,EAAK,KAAK,AAAC,GAAM,EAAE,MAAM,KAAO,GAAG,EAAG,CAAC,EAC1D,EAAO,MAAM,GAAO,KAAK,GAAG,GAClC,AAAG,UAAQ,CAAM,EAEjB,GAAM,GAAM,KAAM,AADL,GAAK,KAAK,AAAC,GAAM,EAAE,MAAM,KAAO,GAAG,EACzB,KAAK,EAC5B,EAAI,IAAM,KAAK,MAAM,EAAI,EAAM,GAAK,EAAI,EAAM,GAAK,GAAK,EAAM,IAAM,EAAI,EAAM,GAAK,GAAK,EAAM,IAAM,EAAI,EAAM,EAAE,EAAI,GAEpH,GAAM,GAAO,EAAK,KAAK,AAAC,GAAM,EAAE,MAAM,KAAO,IAAI,EAG3C,EAAa,EAAO,KAAM,GAAK,KAAK,EAAc,CAAC,EACzD,EAAI,WAAa,MAAM,KAAK,CAAU,EACtC,EAAK,QAAQ,AAAC,GAAM,AAAG,UAAQ,CAAC,CAAC,CACnC,CACA,GAAK,GAAO,EACZ,GAAY,EACZ,EAAQ,CAAG,CACb,CAAC,EACH,CC7GO,YAAoB,EAAK,CAC9B,MAAO,CACL,KAAK,IAAI,EAAI,SAAS,GAAK,EAAI,WAAW,EAAE,EAC5C,KAAK,IAAI,EAAI,SAAS,GAAK,EAAI,WAAW,EAAE,CAC9C,CACF,CAEO,YAAsB,EAAK,CAChC,MAAO,CACL,EAAI,WAAW,GAAM,GAAI,SAAS,GAAK,EAAI,WAAW,IAAM,EAC5D,EAAI,WAAW,GAAM,GAAI,SAAS,GAAK,EAAI,WAAW,IAAM,CAC9D,CACF,CAEO,YAAkC,EAAK,EAAO,EAAU,CAC7D,GAAM,GAAI,EAAM,MAAM,GAChB,EAAI,EAAM,MAAM,GAChB,EAAQ,CAAC,CACb,EAAI,WAAW,GAAK,EACpB,EAAI,WAAW,GAAK,EACpB,EAAI,SAAS,GAAK,EAClB,EAAI,SAAS,GAAK,CACpB,CAAC,EACD,MAAO,AAAG,SAAM,cAAc,EAAO,EAAO,CAAC,CAAC,EAAG,CAAQ,CAC3D,CAEO,YAA6B,EAAK,EAAQ,CAC/C,GAAM,GAAa,CAAC,EAAI,WAAW,GAAK,EAAO,GAAI,EAAI,WAAW,GAAK,EAAO,EAAE,EAC1E,EAAW,CAAC,EAAI,SAAS,GAAK,EAAO,GAAI,EAAI,SAAS,GAAK,EAAO,EAAE,EACpE,EAAgB,EAAI,cAAc,IAAI,AAAC,GACvB,CAAC,EAAM,GAAK,EAAO,GAAI,EAAM,GAAK,EAAO,EAAE,CAEhE,EACD,MAAO,CAAE,aAAY,WAAU,gBAAe,WAAY,EAAI,UAAW,CAC3E,CAEO,YAAoB,EAAK,EAAS,IAAK,CAC5C,GAAM,GAAS,GAAa,CAAG,EACzB,EAAO,GAAW,CAAG,EACrB,EAAc,CAAC,EAAS,EAAK,GAAK,EAAG,EAAS,EAAK,GAAK,CAAC,EACzD,EAAa,CAAC,EAAO,GAAK,EAAY,GAAI,EAAO,GAAK,EAAY,EAAE,EACpE,EAAW,CAAC,EAAO,GAAK,EAAY,GAAI,EAAO,GAAK,EAAY,EAAE,EACxE,MAAO,CAAE,aAAY,WAAU,cAAe,EAAI,aAAc,CAClE,CAEO,YAAqB,EAAK,CAC/B,GAAM,GAAU,GAAa,CAAG,EAC1B,EAAO,GAAW,CAAG,EAErB,EAAW,AADD,KAAK,IAAI,GAAG,CAAI,EACL,EACrB,EAAa,CAAC,EAAQ,GAAK,EAAU,EAAQ,GAAK,CAAQ,EAC1D,EAAW,CAAC,EAAQ,GAAK,EAAU,EAAQ,GAAK,CAAQ,EAC9D,MAAO,CAAE,aAAY,WAAU,cAAe,EAAI,aAAc,CAClE,CAaO,YAA0B,EAAO,CACtC,MAAO,GAAQ,EAAI,KAAK,GAAK,KAAK,MAAO,GAAQ,KAAK,IAAO,GAAI,KAAK,GAAG,CAC3E,CAEO,YAAyB,EAAQ,EAAQ,CAC9C,GAAM,GAAU,KAAK,GAAK,EAAI,KAAK,MAAM,CAAE,GAAO,GAAK,EAAO,IAAK,EAAO,GAAK,EAAO,EAAE,EACxF,MAAO,IAAiB,CAAO,CACjC,CAEO,GAAM,IAAyB,CAAC,EAAG,IAAM,CAAC,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EAEzE,YAAa,EAAI,EAAI,CAC1B,GAAI,GAAU,EACd,OAAS,GAAI,EAAG,EAAI,EAAG,OAAQ,IAC7B,GAAW,EAAG,GAAK,EAAG,GAExB,MAAO,EACT,CAEO,YAA4B,EAAK,EAAa,CACnD,GAAM,GAAwB,CAAC,EAC/B,OAAS,GAAI,EAAG,EAAI,EAAI,OAAQ,IAC9B,EAAO,KAAK,EAAI,GAAG,EAAY,EAEjC,MAAO,EACT,CAEO,YAAmC,EAAM,EAAM,CACpD,GAAM,GAA2B,CAAC,EAC5B,EAAO,EAAK,OAClB,OAAS,GAAM,EAAG,EAAM,EAAM,IAAO,CACnC,EAAQ,KAAK,CAAC,CAAC,EACf,OAAS,GAAM,EAAG,EAAM,EAAM,IAC5B,EAAQ,GAAK,KAAK,GAAI,EAAK,GAAM,GAAmB,EAAM,CAAG,CAAC,CAAC,CAEnE,CACA,MAAO,EACT,CAEO,YAA6B,EAAU,EAAQ,CACpD,GAAM,GAAO,KAAK,IAAI,CAAQ,EACxB,EAAO,KAAK,IAAI,CAAQ,EACxB,EAAiB,CAAC,CAAC,EAAM,CAAC,EAAM,CAAC,EAAG,CAAC,EAAM,EAAM,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EAC9D,EAAoB,GAAuB,EAAO,GAAI,EAAO,EAAE,EAC/D,EAA2B,GAA0B,EAAmB,CAAc,EACtF,EAA4B,GAAuB,CAAC,EAAO,GAAI,CAAC,EAAO,EAAE,EAC/E,MAAO,IAA0B,EAA0B,CAAyB,CACtF,CAEO,YAA+B,EAAQ,CAC5C,GAAM,GAAoB,CAAC,CAAC,EAAO,GAAG,GAAI,EAAO,GAAG,EAAE,EAAG,CAAC,EAAO,GAAG,GAAI,EAAO,GAAG,EAAE,CAAC,EAC/E,EAAuB,CAAC,EAAO,GAAG,GAAI,EAAO,GAAG,EAAE,EAClD,EAAsB,CAC1B,CAAC,GAAI,EAAkB,GAAI,CAAoB,EAC/C,CAAC,GAAI,EAAkB,GAAI,CAAoB,CACjD,EACA,MAAO,CACL,EAAkB,GAAG,OAAO,EAAoB,EAAE,EAClD,EAAkB,GAAG,OAAO,EAAoB,EAAE,EAClD,CAAC,EAAG,EAAG,CAAC,CACV,CACF,CAEO,YAAqB,EAAuB,EAAgB,CACjE,MAAO,CACL,GAAI,EAAuB,EAAe,EAAE,EAC5C,GAAI,EAAuB,EAAe,EAAE,CAC9C,CACF,CCpIO,GAAM,IAAU,CACrB,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,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,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KA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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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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/** Attention part of face configuration */\nexport interface FaceAttentionConfig 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 attention: 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 attention: {\n enabled: false,\n modelPath: 'facemesh-attention.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.15.0\",a=\"3.15.0\",e=\"3.15.0\",o=\"3.15.0\",t=\"3.15.0\",s=\"3.15.0\",f=\"3.15.0\",v=\"3.15.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 if (!gl) {\n log('filter: cannot get webgl context');\n return;\n }\n // @ts-ignore used for sanity checks outside of imagefx\n this.gl = gl;\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 env.webgl.supported = false;\n config.filter.enabled = false;\n copy(inCanvas, outCanvas); // filter failed to initialize\n // return { tensor: null, canvas: inCanvas };\n } else {\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 }\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 let loaded = false;\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 loaded = true;\n } catch (err) {\n log('error loading model:', modelUrl, err);\n }\n if (loaded && 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 * 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.config.face.attention?.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", "/**\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], // 11\n lipsLowerOuter: [146, 91, 181, 84, 17, 314, 405, 321, 375, 291], // 10\n lipsUpperInner: [78, 191, 80, 81, 82, 13, 312, 311, 310, 415, 308], // 11\n lipsLowerInner: [78, 95, 88, 178, 87, 14, 317, 402, 318, 324, 308], // 11\n rightEyeUpper0: [246, 161, 160, 159, 158, 157, 173], // 7\n rightEyeLower0: [33, 7, 163, 144, 145, 153, 154, 155, 133], // 9\n rightEyeUpper1: [247, 30, 29, 27, 28, 56, 190], // 7\n rightEyeLower1: [130, 25, 110, 24, 23, 22, 26, 112, 243], // 9\n rightEyeUpper2: [113, 225, 224, 223, 222, 221, 189], // 7\n rightEyeLower2: [226, 31, 228, 229, 230, 231, 232, 233, 244], // 9\n rightEyeLower3: [143, 111, 117, 118, 119, 120, 121, 128, 245], // 9\n rightEyebrowUpper: [156, 70, 63, 105, 66, 107, 55, 193], // 8\n rightEyebrowLower: [35, 124, 46, 53, 52, 65], // 6\n rightEyeIris: [473, 474, 475, 476, 477], // 5\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] }, // 7 x 3d\n { key: 'EyeUpper1', indices: [25, 26, 27, 28, 29, 30, 31] }, // 7 x 3d\n { key: 'EyeUpper2', indices: [41, 42, 43, 44, 45, 46, 47] }, // 7 x 3d\n { key: 'EyeLower0', indices: [0, 1, 2, 3, 4, 5, 6, 7, 8] }, // 7 x 3d\n { key: 'EyeLower1', indices: [16, 17, 18, 19, 20, 21, 22, 23, 24] }, // 9 x 3d\n { key: 'EyeLower2', indices: [32, 33, 34, 35, 36, 37, 38, 39, 40] }, // 9 x 3d\n { key: 'EyeLower3', indices: [54, 55, 56, 57, 58, 59, 60, 61, 62] }, // 9 x 3d\n { key: 'EyebrowUpper', indices: [63, 64, 65, 66, 67, 68, 69, 70] }, // 8 x 3d\n { key: 'EyebrowLower', indices: [48, 49, 50, 51, 52, 53] }, // 6 x 3d\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.4;\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 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.\nexport function replaceIrisCoords(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],\n 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, false);\n const leftToRightEyeDepthDifference = getLeftToRightEyeDepthDifference(rawCoords);\n if (Math.abs(leftToRightEyeDepthDifference) < 30) { // User is looking straight ahead.\n replaceIrisCoords(rawCoords, leftEyeRawCoords, 'left', null);\n replaceIrisCoords(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 replaceIrisCoords(rawCoords, leftEyeRawCoords, 'left', ['EyeUpper0', 'EyeLower0']);\n } else { // User is looking towards the left.\n replaceIrisCoords(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", "import type { Tensor } from '../tfjs/types';\n\nconst attentionDefinitions = {\n eyeLLower: [33, 7, 163, 144, 145, 153, 154, 155, 133], // 9\n eyeRLower: [263, 249, 390, 373, 374, 380, 381, 382, 362], // 9\n // eslint-disable-next-line max-len\n lips: [61, 76, 91, 181, 84, 17, 314, 405, 321, 291, 291, 185, 40, 39, 37, 0, 267, 269, 270, 291, 62, 183, 88, 178, 87, 14, 268, 303, 304, 408, 291, 184, 42, 178, 87, 14, 268, 303, 304, 408, 61, 62, 90, 180, 85, 16, 315, 404, 307, 308, 291, 185, 40, 73, 72, 0, 302, 269, 270, 409, 61, 184, 95, 179, 86, 15, 316, 403, 324, 408, 291, 184, 74, 41, 38, 11, 268, 303, 304, 408],\n // eslint-disable-next-line max-len\n eyeL: [33, 7, 163, 144, 145, 153, 154, 155, 133, 246, 161, 160, 159, 158, 157, 173, 130, 25, 110, 24, 23, 22, 26, 112, 243, 247, 30, 29, 27, 28, 56, 190, 226, 31, 228, 229, 230, 231, 232, 233, 244, 113, 225, 224, 223, 222, 221, 189, 35, 124, 46, 53, 52, 65, 143, 111, 117, 118, 119, 120, 121, 128, 245, 156, 70, 63, 105, 66, 107, 55, 193],\n // eslint-disable-next-line max-len\n eyeR: [263, 249, 390, 373, 374, 380, 381, 382, 362, 466, 388, 387, 386, 385, 384, 398, 359, 255, 339, 254, 253, 252, 256, 341, 463, 467, 260, 259, 257, 258, 286, 414, 446, 261, 448, 449, 450, 451, 452, 453, 464, 342, 445, 444, 443, 442, 441, 413, 265, 353, 276, 283, 282, 295, 372, 340, 346, 347, 348, 349, 350, 357, 465, 383, 300, 293, 334, 296, 336, 285, 417],\n};\n\n/*\n// function used to determine heuristic mapping\n// values in attentionDefinitions are based on top values from 200 iterations\nfunction replaceClosestPoint(rawCoords, newCoords) {\n const res: number[] = [];\n for (let i = 0; i < newCoords.length / 2; i++) {\n let minDist = Number.MAX_VALUE;\n let minDistIdx = -1;\n const pts = rawCoords.map((r) => [r[0], r[1]]);\n for (let j = 0; j < rawCoords.length; j++) {\n const x = pts[j][0] - newCoords[2 * i + 0];\n const y = pts[j][1] - newCoords[2 * i + 1];\n const dist = (x * x) + (y * y);\n if (dist < minDist) {\n minDist = dist;\n minDistIdx = j;\n }\n }\n res.push(minDistIdx);\n rawCoords[minDistIdx] = [newCoords[2 * i + 0], newCoords[2 * i + 1], rawCoords[minDistIdx][2]];\n }\n return rawCoords;\n}\n*/\n\nexport async function augment(rawCoords, results: Tensor[]) {\n const t: Record = { // all attention models produce 2d results so it needs to be later augmented with correct z-coords\n irisL: results[3].dataSync() as Float32Array, // 5 x 2d // output_left_iris\n irisR: results[1].dataSync() as Float32Array, // 5 x 2d // output_right_iris\n eyeL: results[0].dataSync() as Float32Array, // 71 x 2d // output_left_eye\n eyeR: results[6].dataSync() as Float32Array, // 71 x 2d // output_right_eye\n lips: results[5].dataSync() as Float32Array, // 80 x 2d // output_lips\n // flag: results[4], // already processed in parent // conv_faceflag\n // mesh: results[2], // already have it in rawCoords // output_mesh_identity\n };\n\n // rawCoords = replaceClosestPoint(rawCoords, t.eyeL);\n // rawCoords = replaceClosestPoint(rawCoords, t.eyeR);\n // rawCoords = replaceClosestPoint(rawCoords, t.lips);\n\n // augment iris: adds additional 5 keypoints per eye\n const irisRDepth = attentionDefinitions.eyeRLower.reduce((prev, curr) => prev += rawCoords[curr][2], 0) / attentionDefinitions.eyeRLower.length; // get average z-coord for iris\n for (let i = 0; i < t.irisR.length / 2; i++) rawCoords.push([t.irisR[2 * i + 0], t.irisR[2 * i + 1], irisRDepth]);\n const irisLDepth = attentionDefinitions.eyeLLower.reduce((prev, curr) => prev += rawCoords[curr][2], 0) / attentionDefinitions.eyeLLower.length; // get average z-coord for iris\n for (let i = 0; i < t.irisL.length / 2; i++) rawCoords.push([t.irisL[2 * i + 0], t.irisL[2 * i + 1], irisLDepth]);\n\n // augment eyes: replaces eye keypoints based on heuristic mapping\n for (let i = 0; i < t.eyeL.length / 2; i++) rawCoords[attentionDefinitions.eyeL[i]] = [t.eyeL[2 * i + 0], t.eyeL[2 * i + 1], rawCoords[attentionDefinitions.eyeL[i]][2]];\n // for (let i = 0; i < t.eyeL.length / 2; i++) rawCoords.push([t.eyeL[2 * i + 0], t.eyeL[2 * i + 1], 0]);\n for (let i = 0; i < t.eyeR.length / 2; i++) rawCoords[attentionDefinitions.eyeR[i]] = [t.eyeR[2 * i + 0], t.eyeR[2 * i + 1], rawCoords[attentionDefinitions.eyeR[i]][2]];\n // for (let i = 0; i < t.eyeR.length / 2; i++) rawCoords.push([t.eyeR[2 * i + 0], t.eyeR[2 * i + 1], 0]);\n\n // augment lips: replaces eye keypoints based on heuristic mapping\n // for (let i = 0; i < t.lips.length / 2; i++) rawCoords[attentionDefinitions.lips[i]] = [t.lips[2 * i + 0], t.lips[2 * i + 1], rawCoords[attentionDefinitions.lips[i]][2]];\n // for (let i = 0; i < t.lips.length / 2; i++) rawCoords.push([t.lips[2 * i + 0], t.lips[2 * i + 1], 0]);\n\n return rawCoords;\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 * as attention from './attention';\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)) {\n face.annotations[key] = [face.mesh[coords.blazeFaceLandmarks[key] as number]]; // add annotations\n }\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 results = model.execute(face.tensor as Tensor) as Array;\n const confidence = results.find((t) => t.shape[t.shape.length - 1] === 1) as Tensor;\n const contourCoords = results.find((t) => t.shape[t.shape.length - 1] === 1404) as Tensor;\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 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.attention?.enabled) {\n rawCoords = await attention.augment(rawCoords, results); // augment iris results using attention model results\n } else if (config.face.iris?.enabled) {\n rawCoords = await iris.augmentIris(rawCoords, face.tensor, config, inputSize); // run iris model and augment results\n }\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 tf.dispose([...results, coordsReshaped]);\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) {\n if (config.face.attention?.enabled) model = await loadModel(config.face.attention?.modelPath);\n else model = await loadModel(config.face.mesh?.modelPath);\n } else if (config.debug) {\n log('cached model:', model['modelUrl']);\n }\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", "/** 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 { mergeDeep, now } from '../util/util';\nimport { env } from '../util/env';\nimport { getCanvasContext, rect } from './primitives';\nimport { options } from './options';\nimport { face } from './face';\nimport { body } from './body';\nimport { hand } from './hand';\nimport { object } from './object';\nimport { gesture } from './gesture';\nimport type { Result, PersonResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\n\nlet drawTime = 0;\n\nexport { options } from './options';\nexport { face } from './face';\nexport { body } from './body';\nexport { hand } from './hand';\nexport { object } from './object';\nexport { gesture } from './gesture';\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", "/** 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 /** alpha value used for lines */\n alpha: number,\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 face attention keypoints be highlighted */\n drawAttention: 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 alpha: 0.5,\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 drawAttention: true,\n drawGestures: true,\n drawPolygons: true,\n drawGaze: true,\n fillPolygons: false,\n useDepth: true,\n useCurves: false,\n};\n", "import { log } from '../util/util';\nimport type { AnyCanvas } from '../exports';\nimport type { Point } from '../result';\nimport { options, DrawOptions } from './options';\n\nexport const 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\nexport const rad2deg = (theta: number) => Math.round((theta * 180) / Math.PI);\nexport const colorDepth = (z: number, rgb: [boolean, boolean, boolean] = [true, true, false]): string => {\n const r = rgb[0] ? 127 + Math.trunc(3 * z) : 255;\n const g = rgb[1] ? 127 - Math.trunc(3 * z) : 255;\n const b = rgb[2] ? 127 - Math.trunc(3 * z) : 255;\n return `rgba(${r}, ${g}, ${b}, ${options.alpha})`;\n};\n\nexport function point(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, x: number, y: number, z: number | undefined, localOptions: DrawOptions) {\n z = z || 0;\n ctx.fillStyle = localOptions.useDepth && z ? colorDepth(z, z === -255 ? [true, false, true] : [true, false, false]) : localOptions.color;\n ctx.beginPath();\n ctx.arc(x, y, localOptions.pointSize, 0, 2 * Math.PI);\n ctx.fill();\n}\n\nexport function 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\nexport function 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 ? colorDepth(z) : localOptions.color;\n ctx.fillStyle = localOptions.useDepth && z !== 0 ? colorDepth(z) : 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\nexport function 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\nexport function 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", "import { TRI468 as triangulation } from '../face/facemeshcoords';\nimport { mergeDeep } from '../util/util';\nimport { getCanvasContext, rad2deg, rect, point, lines, arrow } from './primitives';\nimport { options } from './options';\nimport type { FaceResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\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 const length = Math.max(468, f.mesh.length);\n for (let i = 0; i < length; i++) point(ctx, f.mesh[i][0], f.mesh[i][1], f.mesh[i][2], localOptions);\n }\n if (localOptions.drawAttention && f.mesh.length > 468) {\n for (let i = 468; i < f.mesh.length; i++) point(ctx, f.mesh[i][0], f.mesh[i][1], -255, 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", "import { mergeDeep } from '../util/util';\nimport { getCanvasContext, rect, point, curves, colorDepth } from './primitives';\nimport { options } from './options';\nimport type { BodyResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\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] ? colorDepth(result[i].keypoints[pt].position[2] || 0) : 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] ? colorDepth(pt.position[2]) : 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", "import { mergeDeep } from '../util/util';\nimport { getCanvasContext, rect, point, colorDepth } from './primitives';\nimport { options } from './options';\nimport type { HandResult } from '../result';\nimport type { AnyCanvas, DrawOptions, Point } from '../exports';\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 ? colorDepth(pt[2] || 0) : 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 ? colorDepth(z) : 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 ? colorDepth(i * z) : 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", "import { mergeDeep } from '../util/util';\nimport { getCanvasContext, rect } from './primitives';\nimport { options } from './options';\nimport type { ObjectResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\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", "import { mergeDeep } from '../util/util';\nimport { getCanvasContext } from './primitives';\nimport { options } from './options';\nimport type { GestureResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\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", "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 `similarity` method for options description\n * Returns\n * - `index` index array index where best match was found or -1 if no matches\n * - `distance` calculated `distance` of given descriptor to the best match\n * - `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 { env } from './util/env';\nimport type { Config } from './config';\nimport type { Result } from './result';\nimport type { Human, Models } from './human';\nimport type { Tensor, GraphModel } from './tfjs/types';\n\nasync function warmupBitmap(instance: Human): Promise {\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\nasync function runInference(instance: Human) {\n let res: Result | undefined;\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 return res;\n}\n\n/** Runs pre-compile on all loaded models */\nexport async function runCompile(allModels: Models) {\n const backendType = tf.getBackend();\n const webGLBackend = tf.backend();\n if ((backendType !== 'webgl' && backendType !== 'humangl') || (!webGLBackend || !webGLBackend.checkCompileCompletion)) {\n log('compile pass: skip');\n return;\n }\n const models = Object.values(allModels).filter((m) => m !== null) as GraphModel[];\n tf.env().set('ENGINE_COMPILE_ONLY', true);\n const numTensorsStart = tf.engine().state.numTensors;\n for (const model of models) {\n const shape = (model.inputs && model.inputs[0] && model.inputs[0].shape) ? [...model.inputs[0].shape] : [1, 64, 64, 3];\n const dtype = (model.inputs && model.inputs[0] && model.inputs[0].dtype) ? model.inputs[0].dtype : 'float32';\n for (let dim = 0; dim < shape.length; dim++) {\n if (shape[dim] === -1) shape[dim] = dim === 0 ? 1 : 64; // override batch number and any dynamic dimensions\n }\n const tensor = tf.zeros(shape, dtype);\n const res = await model.executeAsync(tensor);\n if (Array.isArray(res)) res.forEach((t) => tf.dispose(t));\n else tf.dispose(res);\n tf.dispose(tensor);\n }\n const kernels = await webGLBackend.checkCompileCompletionAsync();\n webGLBackend.getUniformLocations();\n log('compile pass kernels:', kernels.length);\n tf.env().set('ENGINE_COMPILE_ONLY', false);\n const numTensorsEnd = tf.engine().state.numTensors;\n if ((numTensorsEnd - numTensorsStart) > 0) log('tensor leak:', numTensorsEnd - numTensorsStart);\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 return new Promise(async (resolve) => {\n // await runCompile(instance.models);\n const res = await runInference(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 './draw/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, match, draw, models };\n"], + "mappings": "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mB,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,IA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,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,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,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,E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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kEA0JP,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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", "names": [] } diff --git a/dist/human.esm.d.ts b/dist/human.esm.d.ts index d965b941..d82c1c15 100644 --- a/dist/human.esm.d.ts +++ b/dist/human.esm.d.ts @@ -1,3 +1,5 @@ +/// + /** meta-function that performs draw for: canvas, face, body, hand */ declare function all(inCanvas: AnyCanvas, result: Result, drawOptions?: Partial): Promise<[void, void, void, void, void] | null>; diff --git a/dist/human.esm.js b/dist/human.esm.js index bf0d3965..35382d2b 100644 --- a/dist/human.esm.js +++ b/dist/human.esm.js @@ -39245,7 +39245,9 @@ var MESH_TO_IRIS_INDICES_MAP = [ { 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] } + { key: "EyeLower3", indices: [54, 55, 56, 57, 58, 59, 60, 61, 62] }, + { key: "EyebrowUpper", indices: [63, 64, 65, 66, 67, 68, 69, 70] }, + { key: "EyebrowLower", indices: [48, 49, 50, 51, 52, 53] } ]; var UV468 = [ [0.499976992607117, 0.652534008026123], @@ -43420,7 +43422,7 @@ async function load10(config3) { inputSize5 = 64; return model10; } -function replaceRawCoordinates(rawCoords, newCoords, prefix, keys) { +function replaceIrisCoords(rawCoords, newCoords, prefix, keys) { for (let i = 0; i < MESH_TO_IRIS_INDICES_MAP.length; i++) { const { key, indices } = MESH_TO_IRIS_INDICES_MAP[i]; const originalIndices = meshAnnotations[`${prefix}${key}`]; @@ -43506,12 +43508,12 @@ async function augmentIris(rawCoords, face4, config3, meshSize) { const { rawCoords: rightEyeRawCoords, iris: rightIrisRawCoords } = getEyeCoords(rightEyeData, rightEyeBox, rightEyeBoxSize, false); const leftToRightEyeDepthDifference = getLeftToRightEyeDepthDifference(rawCoords); if (Math.abs(leftToRightEyeDepthDifference) < 30) { - replaceRawCoordinates(rawCoords, leftEyeRawCoords, "left", null); - replaceRawCoordinates(rawCoords, rightEyeRawCoords, "right", null); + replaceIrisCoords(rawCoords, leftEyeRawCoords, "left", null); + replaceIrisCoords(rawCoords, rightEyeRawCoords, "right", null); } else if (leftToRightEyeDepthDifference < 1) { - replaceRawCoordinates(rawCoords, leftEyeRawCoords, "left", ["EyeUpper0", "EyeLower0"]); + replaceIrisCoords(rawCoords, leftEyeRawCoords, "left", ["EyeUpper0", "EyeLower0"]); } else { - replaceRawCoordinates(rawCoords, rightEyeRawCoords, "right", ["EyeUpper0", "EyeLower0"]); + replaceIrisCoords(rawCoords, rightEyeRawCoords, "right", ["EyeUpper0", "EyeLower0"]); } const adjustedLeftIrisCoords = getAdjustedIrisCoords(rawCoords, leftIrisRawCoords, "left"); const adjustedRightIrisCoords = getAdjustedIrisCoords(rawCoords, rightIrisRawCoords, "right"); @@ -43520,24 +43522,31 @@ async function augmentIris(rawCoords, face4, config3, meshSize) { } // src/face/attention.ts +var attentionDefinitions = { + eyeLLower: [33, 7, 163, 144, 145, 153, 154, 155, 133], + eyeRLower: [263, 249, 390, 373, 374, 380, 381, 382, 362], + lips: [61, 76, 91, 181, 84, 17, 314, 405, 321, 291, 291, 185, 40, 39, 37, 0, 267, 269, 270, 291, 62, 183, 88, 178, 87, 14, 268, 303, 304, 408, 291, 184, 42, 178, 87, 14, 268, 303, 304, 408, 61, 62, 90, 180, 85, 16, 315, 404, 307, 308, 291, 185, 40, 73, 72, 0, 302, 269, 270, 409, 61, 184, 95, 179, 86, 15, 316, 403, 324, 408, 291, 184, 74, 41, 38, 11, 268, 303, 304, 408], + eyeL: [33, 7, 163, 144, 145, 153, 154, 155, 133, 246, 161, 160, 159, 158, 157, 173, 130, 25, 110, 24, 23, 22, 26, 112, 243, 247, 30, 29, 27, 28, 56, 190, 226, 31, 228, 229, 230, 231, 232, 233, 244, 113, 225, 224, 223, 222, 221, 189, 35, 124, 46, 53, 52, 65, 143, 111, 117, 118, 119, 120, 121, 128, 245, 156, 70, 63, 105, 66, 107, 55, 193], + eyeR: [263, 249, 390, 373, 374, 380, 381, 382, 362, 466, 388, 387, 386, 385, 384, 398, 359, 255, 339, 254, 253, 252, 256, 341, 463, 467, 260, 259, 257, 258, 286, 414, 446, 261, 448, 449, 450, 451, 452, 453, 464, 342, 445, 444, 443, 442, 441, 413, 265, 353, 276, 283, 282, 295, 372, 340, 346, 347, 348, 349, 350, 357, 465, 383, 300, 293, 334, 296, 336, 285, 417] +}; async function augment(rawCoords, results) { const t = { - eyeL: results[0].dataSync(), - eyeR: results[6].dataSync(), irisL: results[3].dataSync(), irisR: results[1].dataSync(), + eyeL: results[0].dataSync(), + eyeR: results[6].dataSync(), lips: results[5].dataSync() }; - for (let i = 0; i < t.lips.length / 2; i++) - rawCoords.push([t.lips[2 * i + 0], t.lips[2 * i + 1], 0]); - for (let i = 0; i < t.eyeL.length / 2; i++) - rawCoords.push([t.eyeL[2 * i + 0], t.eyeL[2 * i + 1], 0]); - for (let i = 0; i < t.eyeR.length / 2; i++) - rawCoords.push([t.eyeR[2 * i + 0], t.eyeR[2 * i + 1], 0]); - for (let i = 0; i < t.irisL.length / 2; i++) - rawCoords.push([t.irisL[2 * i + 0], t.irisL[2 * i + 1], 0]); + const irisRDepth = attentionDefinitions.eyeRLower.reduce((prev, curr) => prev += rawCoords[curr][2], 0) / attentionDefinitions.eyeRLower.length; for (let i = 0; i < t.irisR.length / 2; i++) - rawCoords.push([t.irisR[2 * i + 0], t.irisR[2 * i + 1], 0]); + rawCoords.push([t.irisR[2 * i + 0], t.irisR[2 * i + 1], irisRDepth]); + const irisLDepth = attentionDefinitions.eyeLLower.reduce((prev, curr) => prev += rawCoords[curr][2], 0) / attentionDefinitions.eyeLLower.length; + for (let i = 0; i < t.irisL.length / 2; i++) + rawCoords.push([t.irisL[2 * i + 0], t.irisL[2 * i + 1], irisLDepth]); + for (let i = 0; i < t.eyeL.length / 2; i++) + rawCoords[attentionDefinitions.eyeL[i]] = [t.eyeL[2 * i + 0], t.eyeL[2 * i + 1], rawCoords[attentionDefinitions.eyeL[i]][2]]; + for (let i = 0; i < t.eyeR.length / 2; i++) + rawCoords[attentionDefinitions.eyeR[i]] = [t.eyeR[2 * i + 0], t.eyeR[2 * i + 1], rawCoords[attentionDefinitions.eyeR[i]][2]]; return rawCoords; } @@ -48558,7 +48567,7 @@ function reset(instance) { instance.models[model18] = null; } async function load19(instance) { - var _a2, _b2, _c, _d2, _e2, _f, _g2, _h, _i, _j2, _k2, _l2, _m2, _n2, _o2, _p2, _q2, _r2, _s2, _t2, _u2, _v2, _w2, _x2, _y2, _z2, _A2, _B2, _C2, _D2; + var _a2, _b2, _c, _d2, _e2, _f, _g2, _h, _i, _j2, _k2, _l2, _m2, _n2, _o2, _p2, _q2, _r2, _s2, _t2, _u2, _v2, _w2, _x2, _y2, _z2, _A2, _B2, _C2, _D2, _E2; if (env.initial) reset(instance); if (instance.config.hand.enabled) { @@ -48587,25 +48596,25 @@ async function load19(instance) { instance.models.faceres = load12(instance.config); if (instance.config.face.enabled && ((_p2 = instance.config.face.emotion) == null ? void 0 : _p2.enabled) && !instance.models.emotion) instance.models.emotion = load8(instance.config); - if (instance.config.face.enabled && ((_q2 = instance.config.face.iris) == null ? void 0 : _q2.enabled) && !instance.models.faceiris) + if (instance.config.face.enabled && ((_q2 = instance.config.face.iris) == null ? void 0 : _q2.enabled) && !((_r2 = instance.config.face.attention) == null ? void 0 : _r2.enabled) && !instance.models.faceiris) instance.models.faceiris = load10(instance.config); - if (instance.config.face.enabled && ((_r2 = instance.config.face.mesh) == null ? void 0 : _r2.enabled) && !instance.models.facemesh) + if (instance.config.face.enabled && ((_s2 = instance.config.face.mesh) == null ? void 0 : _s2.enabled) && !instance.models.facemesh) instance.models.facemesh = load11(instance.config); - if (instance.config.face.enabled && ((_s2 = instance.config.face["gear"]) == null ? void 0 : _s2.enabled) && !instance.models.gear) + if (instance.config.face.enabled && ((_t2 = instance.config.face["gear"]) == null ? void 0 : _t2.enabled) && !instance.models.gear) instance.models.gear = load(instance.config); - if (instance.config.face.enabled && ((_t2 = instance.config.face["ssrnet"]) == null ? void 0 : _t2.enabled) && !instance.models.ssrnetage) + if (instance.config.face.enabled && ((_u2 = instance.config.face["ssrnet"]) == null ? void 0 : _u2.enabled) && !instance.models.ssrnetage) instance.models.ssrnetage = load2(instance.config); - if (instance.config.face.enabled && ((_u2 = instance.config.face["ssrnet"]) == null ? void 0 : _u2.enabled) && !instance.models.ssrnetgender) + if (instance.config.face.enabled && ((_v2 = instance.config.face["ssrnet"]) == null ? void 0 : _v2.enabled) && !instance.models.ssrnetgender) instance.models.ssrnetgender = load3(instance.config); - if (instance.config.face.enabled && ((_v2 = instance.config.face["mobilefacenet"]) == null ? void 0 : _v2.enabled) && !instance.models.mobilefacenet) + if (instance.config.face.enabled && ((_w2 = instance.config.face["mobilefacenet"]) == null ? void 0 : _w2.enabled) && !instance.models.mobilefacenet) instance.models.mobilefacenet = load9(instance.config); - if (instance.config.hand.enabled && !instance.models.handtrack && ((_x2 = (_w2 = instance.config.hand.detector) == null ? void 0 : _w2.modelPath) == null ? void 0 : _x2.includes("handtrack"))) + if (instance.config.hand.enabled && !instance.models.handtrack && ((_y2 = (_x2 = instance.config.hand.detector) == null ? void 0 : _x2.modelPath) == null ? void 0 : _y2.includes("handtrack"))) instance.models.handtrack = loadDetect2(instance.config); - if (instance.config.hand.enabled && instance.config.hand.landmarks && !instance.models.handskeleton && ((_z2 = (_y2 = instance.config.hand.detector) == null ? void 0 : _y2.modelPath) == null ? void 0 : _z2.includes("handtrack"))) + if (instance.config.hand.enabled && instance.config.hand.landmarks && !instance.models.handskeleton && ((_A2 = (_z2 = instance.config.hand.detector) == null ? void 0 : _z2.modelPath) == null ? void 0 : _A2.includes("handtrack"))) instance.models.handskeleton = loadSkeleton(instance.config); - if (instance.config.object.enabled && !instance.models.centernet && ((_B2 = (_A2 = instance.config.object) == null ? void 0 : _A2.modelPath) == null ? void 0 : _B2.includes("centernet"))) + if (instance.config.object.enabled && !instance.models.centernet && ((_C2 = (_B2 = instance.config.object) == null ? void 0 : _B2.modelPath) == null ? void 0 : _C2.includes("centernet"))) instance.models.centernet = load6(instance.config); - if (instance.config.object.enabled && !instance.models.nanodet && ((_D2 = (_C2 = instance.config.object) == null ? void 0 : _C2.modelPath) == null ? void 0 : _D2.includes("nanodet"))) + if (instance.config.object.enabled && !instance.models.nanodet && ((_E2 = (_D2 = instance.config.object) == null ? void 0 : _D2.modelPath) == null ? void 0 : _E2.includes("nanodet"))) instance.models.nanodet = load16(instance.config); if (instance.config.segmentation.enabled && !instance.models.segmentation) instance.models.segmentation = load18(instance.config); diff --git a/dist/human.esm.js.map b/dist/human.esm.js.map index d05533fd..21a53d5b 100644 --- a/dist/human.esm.js.map +++ b/dist/human.esm.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/models.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/attention.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/tfjs/humangl.ts", "../src/tfjs/backend.ts", "../src/draw/draw.ts", "../src/draw/options.ts", "../src/draw/primitives.ts", "../src/draw/face.ts", "../src/draw/body.ts", "../src/draw/hand.ts", "../src/draw/object.ts", "../src/draw/gesture.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/** Attention part of face configuration */\nexport interface FaceAttentionConfig 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 attention: 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 attention: {\n enabled: false,\n modelPath: 'facemesh-attention.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\nvar LT=Object.create,Vd=Object.defineProperty,BT=Object.getOwnPropertyDescriptor,Vw=Object.getOwnPropertyNames,VT=Object.getPrototypeOf,WT=Object.prototype.hasOwnProperty,UT=e=>Vd(e,\"__esModule\",{value:!0}),zt=(e,t)=>function(){return t||(0,e[Vw(e)[0]])((t={exports:{}}).exports,t),t.exports},Ae=(e,t)=>{for(var n in t)Vd(e,n,{get:t[n],enumerable:!0})},GT=(e,t,n,s)=>{if(t&&typeof t==\"object\"||typeof t==\"function\")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},xa=(e,t)=>GT(UT(Vd(e!=null?LT(VT(e)):{},\"default\",!t&&e&&e.__esModule?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e),HT=zt({\"src/node_modules/long/src/long.js\"(e,t){t.exports=s;var n=null;try{n=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch(F){}function s(F,$,z){this.low=F|0,this.high=$|0,this.unsigned=!!z}s.prototype.__isLong__,Object.defineProperty(s.prototype,\"__isLong__\",{value:!0});function r(F){return(F&&F.__isLong__)===!0}s.isLong=r;var a={},i={};function o(F,$){var z,W,q;return $?(F>>>=0,(q=0<=F&&F<256)&&(W=i[F],W)?W:(z=l(F,(F|0)<0?-1:0,!0),q&&(i[F]=z),z)):(F|=0,(q=-128<=F&&F<128)&&(W=a[F],W)?W:(z=l(F,F<0?-1:0,!1),q&&(a[F]=z),z))}s.fromInt=o;function u(F,$){if(isNaN(F))return $?x:v;if($){if(F<0)return x;if(F>=g)return A}else{if(F<=-b)return P;if(F+1>=b)return E}return F<0?u(-F,$).neg():l(F%m|0,F/m|0,$)}s.fromNumber=u;function l(F,$,z){return new s(F,$,z)}s.fromBits=l;var c=Math.pow;function p(F,$,z){if(F.length===0)throw Error(\"empty string\");if(F===\"NaN\"||F===\"Infinity\"||F===\"+Infinity\"||F===\"-Infinity\")return v;if(typeof $==\"number\"?(z=$,$=!1):$=!!$,z=z||10,z<2||360)throw Error(\"interior hyphen\");if(W===0)return p(F.substring(1),$,z).neg();for(var q=u(c(z,8)),K=v,Y=0;Y>>0:this.low},R.toNumber=function(){return this.unsigned?(this.high>>>0)*m+(this.low>>>0):this.high*m+(this.low>>>0)},R.toString=function($){if($=$||10,$<2||36<$)throw RangeError(\"radix\");if(this.isZero())return\"0\";if(this.isNegative())if(this.eq(P)){var z=u($),W=this.div(z),q=W.mul(z).sub(this);return W.toString($)+q.toInt().toString($)}else return\"-\"+this.neg().toString($);for(var K=u(c($,6),this.unsigned),Y=this,Z=\"\";;){var te=Y.div(K),ee=Y.sub(te.mul(K)).toInt()>>>0,se=ee.toString($);if(Y=te,Y.isZero())return se+Z;for(;se.length<6;)se=\"0\"+se;Z=\"\"+se+Z}},R.getHighBits=function(){return this.high},R.getHighBitsUnsigned=function(){return this.high>>>0},R.getLowBits=function(){return this.low},R.getLowBitsUnsigned=function(){return this.low>>>0},R.getNumBitsAbs=function(){if(this.isNegative())return this.eq(P)?64:this.neg().getNumBitsAbs();for(var $=this.high!=0?this.high:this.low,z=31;z>0&&($&1<=0},R.isOdd=function(){return(this.low&1)===1},R.isEven=function(){return(this.low&1)===0},R.equals=function($){return r($)||($=d($)),this.unsigned!==$.unsigned&&this.high>>>31===1&&$.high>>>31===1?!1:this.high===$.high&&this.low===$.low},R.eq=R.equals,R.notEquals=function($){return!this.eq($)},R.neq=R.notEquals,R.ne=R.notEquals,R.lessThan=function($){return this.comp($)<0},R.lt=R.lessThan,R.lessThanOrEqual=function($){return this.comp($)<=0},R.lte=R.lessThanOrEqual,R.le=R.lessThanOrEqual,R.greaterThan=function($){return this.comp($)>0},R.gt=R.greaterThan,R.greaterThanOrEqual=function($){return this.comp($)>=0},R.gte=R.greaterThanOrEqual,R.ge=R.greaterThanOrEqual,R.compare=function($){if(r($)||($=d($)),this.eq($))return 0;var z=this.isNegative(),W=$.isNegative();return z&&!W?-1:!z&&W?1:this.unsigned?$.high>>>0>this.high>>>0||$.high===this.high&&$.low>>>0>this.low>>>0?-1:1:this.sub($).isNegative()?-1:1},R.comp=R.compare,R.negate=function(){return!this.unsigned&&this.eq(P)?P:this.not().add(k)},R.neg=R.negate,R.add=function($){r($)||($=d($));var z=this.high>>>16,W=this.high&65535,q=this.low>>>16,K=this.low&65535,Y=$.high>>>16,Z=$.high&65535,te=$.low>>>16,ee=$.low&65535,se=0,ne=0,oe=0,re=0;return re+=K+ee,oe+=re>>>16,re&=65535,oe+=q+te,ne+=oe>>>16,oe&=65535,ne+=W+Z,se+=ne>>>16,ne&=65535,se+=z+Y,se&=65535,l(oe<<16|re,se<<16|ne,this.unsigned)},R.subtract=function($){return r($)||($=d($)),this.add($.neg())},R.sub=R.subtract,R.multiply=function($){if(this.isZero())return v;if(r($)||($=d($)),n){var z=n.mul(this.low,this.high,$.low,$.high);return l(z,n.get_high(),this.unsigned)}if($.isZero())return v;if(this.eq(P))return $.isOdd()?P:v;if($.eq(P))return this.isOdd()?P:v;if(this.isNegative())return $.isNegative()?this.neg().mul($.neg()):this.neg().mul($).neg();if($.isNegative())return this.mul($.neg()).neg();if(this.lt(y)&&$.lt(y))return u(this.toNumber()*$.toNumber(),this.unsigned);var W=this.high>>>16,q=this.high&65535,K=this.low>>>16,Y=this.low&65535,Z=$.high>>>16,te=$.high&65535,ee=$.low>>>16,se=$.low&65535,ne=0,oe=0,re=0,le=0;return le+=Y*se,re+=le>>>16,le&=65535,re+=K*se,oe+=re>>>16,re&=65535,re+=Y*ee,oe+=re>>>16,re&=65535,oe+=q*se,ne+=oe>>>16,oe&=65535,oe+=K*ee,ne+=oe>>>16,oe&=65535,oe+=Y*te,ne+=oe>>>16,oe&=65535,ne+=W*se+q*ee+K*te+Y*Z,ne&=65535,l(re<<16|le,ne<<16|oe,this.unsigned)},R.mul=R.multiply,R.divide=function($){if(r($)||($=d($)),$.isZero())throw Error(\"division by zero\");if(n){if(!this.unsigned&&this.high===-2147483648&&$.low===-1&&$.high===-1)return this;var z=(this.unsigned?n.div_u:n.div_s)(this.low,this.high,$.low,$.high);return l(z,n.get_high(),this.unsigned)}if(this.isZero())return this.unsigned?x:v;var W,q,K;if(this.unsigned){if($.unsigned||($=$.toUnsigned()),$.gt(this))return x;if($.gt(this.shru(1)))return T;K=x}else{if(this.eq(P)){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:N:(q=this.sub($.mul(W)),K=W.add(q.div($)),K)}else if($.eq(P))return this.unsigned?x:v;if(this.isNegative())return $.isNegative()?this.neg().div($.neg()):this.neg().div($).neg();if($.isNegative())return this.div($.neg()).neg();K=v}for(q=this;q.gte($);){W=Math.max(1,Math.floor(q.toNumber()/$.toNumber()));for(var Z=Math.ceil(Math.log(W)/Math.LN2),te=Z<=48?1:c(2,Z-48),ee=u(W),se=ee.mul($);se.isNegative()||se.gt(q);)W-=te,ee=u(W,this.unsigned),se=ee.mul($);ee.isZero()&&(ee=k),K=K.add(ee),q=q.sub(se)}return K},R.div=R.divide,R.modulo=function($){if(r($)||($=d($)),n){var z=(this.unsigned?n.rem_u:n.rem_s)(this.low,this.high,$.low,$.high);return l(z,n.get_high(),this.unsigned)}return this.sub(this.div($).mul($))},R.mod=R.modulo,R.rem=R.modulo,R.not=function(){return l(~this.low,~this.high,this.unsigned)},R.and=function($){return r($)||($=d($)),l(this.low&$.low,this.high&$.high,this.unsigned)},R.or=function($){return r($)||($=d($)),l(this.low|$.low,this.high|$.high,this.unsigned)},R.xor=function($){return r($)||($=d($)),l(this.low^$.low,this.high^$.high,this.unsigned)},R.shiftLeft=function($){return r($)&&($=$.toInt()),($&=63)===0?this:$<32?l(this.low<<$,this.high<<$|this.low>>>32-$,this.unsigned):l(0,this.low<<$-32,this.unsigned)},R.shl=R.shiftLeft,R.shiftRight=function($){return r($)&&($=$.toInt()),($&=63)===0?this:$<32?l(this.low>>>$|this.high<<32-$,this.high>>$,this.unsigned):l(this.high>>$-32,this.high>=0?0:-1,this.unsigned)},R.shr=R.shiftRight,R.shiftRightUnsigned=function($){if(r($)&&($=$.toInt()),$&=63,$===0)return this;var z=this.high;if($<32){var W=this.low;return l(W>>>$|z<<32-$,z>>>$,this.unsigned)}else return $===32?l(z,0,this.unsigned):l(z>>>$-32,0,this.unsigned)},R.shru=R.shiftRightUnsigned,R.shr_u=R.shiftRightUnsigned,R.toSigned=function(){return this.unsigned?l(this.low,this.high,!1):this},R.toUnsigned=function(){return this.unsigned?this:l(this.low,this.high,!0)},R.toBytes=function($){return $?this.toBytesLE():this.toBytesBE()},R.toBytesLE=function(){var $=this.high,z=this.low;return[z&255,z>>>8&255,z>>>16&255,z>>>24,$&255,$>>>8&255,$>>>16&255,$>>>24]},R.toBytesBE=function(){var $=this.high,z=this.low;return[$>>>24,$>>>16&255,$>>>8&255,$&255,z>>>24,z>>>16&255,z>>>8&255,z&255]},s.fromBytes=function($,z,W){return W?s.fromBytesLE($,z):s.fromBytesBE($,z)},s.fromBytesLE=function($,z){return new s($[0]|$[1]<<8|$[2]<<16|$[3]<<24,$[4]|$[5]<<8|$[6]<<16|$[7]<<24,z)},s.fromBytesBE=function($,z){return new s($[4]<<24|$[5]<<16|$[6]<<8|$[7],$[0]<<24|$[1]<<16|$[2]<<8|$[3],z)}}}),qT=zt({\"(disabled):src/node_modules/node-fetch/browser.js\"(){}}),jT=zt({\"(disabled):util\"(){}}),KT=zt({\"src/node_modules/seedrandom/lib/alea.js\"(e,t){(function(n,s,r){function a(l){var c=this,p=u();c.next=function(){var d=2091639*c.s0+c.c*23283064365386963e-26;return c.s0=c.s1,c.s1=c.s2,c.s2=d-(c.c=d|0)},c.c=1,c.s0=p(\" \"),c.s1=p(\" \"),c.s2=p(\" \"),c.s0-=p(l),c.s0<0&&(c.s0+=1),c.s1-=p(l),c.s1<0&&(c.s1+=1),c.s2-=p(l),c.s2<0&&(c.s2+=1),p=null}function i(l,c){return c.c=l.c,c.s0=l.s0,c.s1=l.s1,c.s2=l.s2,c}function o(l,c){var p=new a(l),d=c&&c.state,h=p.next;return h.int32=function(){return p.next()*4294967296|0},h.double=function(){return h()+(h()*2097152|0)*11102230246251565e-32},h.quick=h,d&&(typeof d==\"object\"&&i(d,p),h.state=function(){return i(p,{})}),h}function u(){var l=4022871197,c=function(p){p=String(p);for(var d=0;d>>0,h-=l,h*=l,l=h>>>0,h-=l,l+=h*4294967296}return(l>>>0)*23283064365386963e-26};return c}s&&s.exports?s.exports=o:r&&r.amd?r(function(){return o}):this.alea=o})(e,typeof t==\"object\"&&t,typeof define==\"function\"&&define)}}),XT=zt({\"src/node_modules/seedrandom/lib/xor128.js\"(e,t){(function(n,s,r){function a(u){var l=this,c=\"\";l.x=0,l.y=0,l.z=0,l.w=0,l.next=function(){var d=l.x^l.x<<11;return l.x=l.y,l.y=l.z,l.z=l.w,l.w^=l.w>>>19^d^d>>>8},u===(u|0)?l.x=u:c+=u;for(var p=0;p>>0)/4294967296};return d.double=function(){do var h=c.next()>>>11,f=(c.next()>>>0)/4294967296,m=(h+f)/(1<<21);while(m===0);return m},d.int32=c.next,d.quick=d,p&&(typeof p==\"object\"&&i(p,c),d.state=function(){return i(c,{})}),d}s&&s.exports?s.exports=o:r&&r.amd?r(function(){return o}):this.xor128=o})(e,typeof t==\"object\"&&t,typeof define==\"function\"&&define)}}),YT=zt({\"src/node_modules/seedrandom/lib/xorwow.js\"(e,t){(function(n,s,r){function a(u){var l=this,c=\"\";l.next=function(){var d=l.x^l.x>>>2;return l.x=l.y,l.y=l.z,l.z=l.w,l.w=l.v,(l.d=l.d+362437|0)+(l.v=l.v^l.v<<4^(d^d<<1))|0},l.x=0,l.y=0,l.z=0,l.w=0,l.v=0,u===(u|0)?l.x=u:c+=u;for(var p=0;p>>4),l.next()}function i(u,l){return l.x=u.x,l.y=u.y,l.z=u.z,l.w=u.w,l.v=u.v,l.d=u.d,l}function o(u,l){var c=new a(u),p=l&&l.state,d=function(){return(c.next()>>>0)/4294967296};return d.double=function(){do var h=c.next()>>>11,f=(c.next()>>>0)/4294967296,m=(h+f)/(1<<21);while(m===0);return m},d.int32=c.next,d.quick=d,p&&(typeof p==\"object\"&&i(p,c),d.state=function(){return i(c,{})}),d}s&&s.exports?s.exports=o:r&&r.amd?r(function(){return o}):this.xorwow=o})(e,typeof t==\"object\"&&t,typeof define==\"function\"&&define)}}),QT=zt({\"src/node_modules/seedrandom/lib/xorshift7.js\"(e,t){(function(n,s,r){function a(u){var l=this;l.next=function(){var p=l.x,d=l.i,h,f,m;return h=p[d],h^=h>>>7,f=h^h<<24,h=p[d+1&7],f^=h^h>>>10,h=p[d+3&7],f^=h^h>>>3,h=p[d+4&7],f^=h^h<<7,h=p[d+7&7],h=h^h<<13,f^=h^h<<9,p[d]=f,l.i=d+1&7,f};function c(p,d){var h,f,m=[];if(d===(d|0))f=m[0]=d;else for(d=\"\"+d,h=0;h0;--h)p.next()}c(l,u)}function i(u,l){return l.x=u.x.slice(),l.i=u.i,l}function o(u,l){u==null&&(u=+new Date);var c=new a(u),p=l&&l.state,d=function(){return(c.next()>>>0)/4294967296};return d.double=function(){do var h=c.next()>>>11,f=(c.next()>>>0)/4294967296,m=(h+f)/(1<<21);while(m===0);return m},d.int32=c.next,d.quick=d,p&&(p.x&&i(p,c),d.state=function(){return i(c,{})}),d}s&&s.exports?s.exports=o:r&&r.amd?r(function(){return o}):this.xorshift7=o})(e,typeof t==\"object\"&&t,typeof define==\"function\"&&define)}}),ZT=zt({\"src/node_modules/seedrandom/lib/xor4096.js\"(e,t){(function(n,s,r){function a(u){var l=this;l.next=function(){var p=l.w,d=l.X,h=l.i,f,m;return l.w=p=p+1640531527|0,m=d[h+34&127],f=d[h=h+1&127],m^=m<<13,f^=f<<17,m^=m>>>15,f^=f>>>12,m=d[h]=m^f,l.i=h,m+(p^p>>>16)|0};function c(p,d){var h,f,m,g,b,y=[],v=128;for(d===(d|0)?(f=d,d=null):(d=d+\"\\0\",f=0,v=Math.max(v,d.length)),m=0,g=-32;g>>15,f^=f<<4,f^=f>>>13,g>=0&&(b=b+1640531527|0,h=y[g&127]^=f+b,m=h==0?m+1:0);for(m>=128&&(y[(d&&d.length||0)&127]=-1),m=127,g=4*128;g>0;--g)f=y[m+34&127],h=y[m=m+1&127],f^=f<<13,h^=h<<17,f^=f>>>15,h^=h>>>12,y[m]=f^h;p.w=b,p.X=y,p.i=m}c(l,u)}function i(u,l){return l.i=u.i,l.w=u.w,l.X=u.X.slice(),l}function o(u,l){u==null&&(u=+new Date);var c=new a(u),p=l&&l.state,d=function(){return(c.next()>>>0)/4294967296};return d.double=function(){do var h=c.next()>>>11,f=(c.next()>>>0)/4294967296,m=(h+f)/(1<<21);while(m===0);return m},d.int32=c.next,d.quick=d,p&&(p.X&&i(p,c),d.state=function(){return i(c,{})}),d}s&&s.exports?s.exports=o:r&&r.amd?r(function(){return o}):this.xor4096=o})(e,typeof t==\"object\"&&t,typeof define==\"function\"&&define)}}),JT=zt({\"src/node_modules/seedrandom/lib/tychei.js\"(e,t){(function(n,s,r){function a(u){var l=this,c=\"\";l.next=function(){var d=l.b,h=l.c,f=l.d,m=l.a;return d=d<<25^d>>>7^h,h=h-f|0,f=f<<24^f>>>8^m,m=m-d|0,l.b=d=d<<20^d>>>12^h,l.c=h=h-f|0,l.d=f<<16^h>>>16^m,l.a=m-d|0},l.a=0,l.b=0,l.c=-1640531527,l.d=1367130551,u===Math.floor(u)?(l.a=u/4294967296|0,l.b=u|0):c+=u;for(var p=0;p>>0)/4294967296};return d.double=function(){do var h=c.next()>>>11,f=(c.next()>>>0)/4294967296,m=(h+f)/(1<<21);while(m===0);return m},d.int32=c.next,d.quick=d,p&&(typeof p==\"object\"&&i(p,c),d.state=function(){return i(c,{})}),d}s&&s.exports?s.exports=o:r&&r.amd?r(function(){return o}):this.tychei=o})(e,typeof t==\"object\"&&t,typeof define==\"function\"&&define)}}),e$=zt({\"(disabled):crypto\"(){}}),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,T,N){var E=[];T=T==!0?{entropy:!0}:T||{};var A=y(b(T.entropy?[k,x(s)]:k==null?v():k,3),E),P=new m(E),R=function(){for(var F=P.g(i),$=l,z=0;F=p;)F/=2,$/=2,z>>>=1;return(F+z)/$};return R.int32=function(){return P.g(4)|0},R.quick=function(){return P.g(4)/4294967296},R.double=R,y(x(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 T?T.global:this==r,T.state)}function m(k){var T,N=k.length,E=this,A=0,P=E.i=E.j=0,R=E.S=[];for(N||(k=[N++]);A{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!=nn&&rs(Ce.buffer),ic}function i(){return Ce.buffer!=nn&&rs(Ce.buffer),oc}function o(){return Ce.buffer!=nn&&rs(Ce.buffer),hu}function u(){return Ce.buffer!=nn&&rs(Ce.buffer),uc}function l(){return Ce.buffer!=nn&&rs(Ce.buffer),lc}function c(){return Ce.buffer!=nn&&rs(Ce.buffer),cc}function p(){return Ce.buffer!=nn&&rs(Ce.buffer),dc}var d=typeof r!=\"undefined\"?r:{},h,f;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=(C,D)=>{throw D},x=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||!1,E=\"\";function A(C){return d.locateFile?d.locateFile(C,E):E+C}var P,R,F,$;function z(C){if(C instanceof ku)return;ee(\"exiting due to exception: \"+C)}var W,q,K;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=>{var B=P(D,!0);return B.buffer||(B=new Uint8Array(B)),B},R=(D,B,Q)=>{K(),D=q.normalize(D),W.readFile(D,function(ue,pe){ue?Q(ue):B(pe.buffer)})},process.argv.length>1&&(y=process.argv[1].replace(/\\\\/g,\"/\")),b=process.argv.slice(2),process.on(\"uncaughtException\",function(D){if(!(D instanceof ku))throw D}),process.on(\"unhandledRejection\",function(D){throw D}),v=(D,B)=>{if(Pr())throw process.exitCode=D,B;z(B),process.exit(D)},d.inspect=function(){return\"[Emscripten Module object]\"};let C;try{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=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=\"\",T||(P=C=>{var D=new XMLHttpRequest;return D.open(\"GET\",C,!1),D.send(null),D.responseText},k&&(F=C=>{var D=new XMLHttpRequest;return D.open(\"GET\",C,!1),D.responseType=\"arraybuffer\",D.send(null),new Uint8Array(D.response)}),R=(C,D,B)=>{var Q=new XMLHttpRequest;Q.open(\"GET\",C,!0),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)}),$=C=>document.title=C);T&&typeof performance==\"undefined\"&&(global.performance=s$().performance);var Y=console.log.bind(console),Z=console.warn.bind(console);T&&(K(),Y=C=>W.writeSync(1,C+`\n`),Z=C=>W.writeSync(2,C+`\n`));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(C){ne.shown||(ne.shown={}),ne.shown[C]||(ne.shown[C]=1,ee(C))}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{Se=C},Pe=Atomics.load,Xe=Atomics.store,Je=Atomics.compareExchange,Ye;d.wasmBinary&&(Ye=d.wasmBinary);var tt=d.noExitRuntime||!0;typeof WebAssembly!=\"object\"&&Ci(\"no native wasm support detected\");var Ce,ut,at=!1,Jt;function Nt(C,D){C||Ci(D)}function Cn(C){var D=d[\"_\"+C];return D}function Et(C,D,B,Q,ue){var pe={string:function($n){var Oi=0;if($n!=null&&$n!==0){var ex=($n.length<<2)+1;Oi=Fi(ex),Ls($n,Oi,ex)}return Oi},array:function($n){var Oi=Fi($n.length);return Bs($n,Oi),Oi}};function ye($n){return D===\"string\"?tn($n):D===\"boolean\"?Boolean($n):$n}var Te=Cn(C),bt=[],us=0;if(Q)for(var ls=0;ls(B.buffer instanceof SharedArrayBuffer&&(B=new Uint8Array(B)),D.decode.call(D,B))}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&&C.subarray&&Yt)return Yt.decode(C.subarray(D,ue));for(var pe=\"\";D>10,56320|us&1023)}}return pe}function tn(C,D){return C?Dn(i(),C,D):\"\"}function Ms(C,D,B,Q){if(!(Q>0))return 0;for(var ue=B,pe=B+Q-1,ye=0;ye=55296&&Te<=57343){var bt=C.charCodeAt(++ye);Te=65536+((Te&1023)<<10)|bt&1023}if(Te<=127){if(B>=pe)break;D[B++]=Te}else if(Te<=2047){if(B+1>=pe)break;D[B++]=192|Te>>6,D[B++]=128|Te&63}else if(Te<=65535){if(B+2>=pe)break;D[B++]=224|Te>>12,D[B++]=128|Te>>6&63,D[B++]=128|Te&63}else{if(B+3>=pe)break;D[B++]=240|Te>>18,D[B++]=128|Te>>12&63,D[B++]=128|Te>>6&63,D[B++]=128|Te&63}}return D[B]=0,B-ue}function Ls(C,D,B){return Ms(C,i(),D,B)}function ki(C){for(var D=0,B=0;B=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 Tn(\"utf-16le\"):void 0;function Bs(C,D){a().set(C,D)}function pu(C,D,B){for(var Q=0;Q>0]=C.charCodeAt(Q);B||(a()[D>>0]=0)}function Ii(C,D){return C%D>0&&(C+=D-C%D),C}var nn,ic,oc,hu,uc,lc,Fv,cc,dc;N&&(nn=d.buffer);function rs(C){nn=C,d.HEAP8=ic=new Int8Array(C),d.HEAP16=hu=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 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:pc/65536,maximum:32768,shared:!0}),!(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,Si=[],er=[],th=[],hc=[],Or=!1,nh=!1,fc=0;function Pr(){return tt||fc>0}function sn(){if(d.preRun)for(typeof d.preRun==\"function\"&&(d.preRun=[d.preRun]);d.preRun.length;)Ov(d.preRun.shift());vc(Si)}function fu(){Or=!0,!N&&vc(er)}function sh(){N||($e.terminateAllThreads(),nh=!0)}function rh(){if(!N){if(d.postRun)for(typeof d.postRun==\"function\"&&(d.postRun=[d.postRun]);d.postRun.length;)mu(d.postRun.shift());vc(hc)}}function Ov(C){Si.unshift(C)}function Pv(C){er.unshift(C)}function mu(C){hc.unshift(C)}var tr=0,mc=null,as=null;function gu(C){tr++,d.monitorRunDependencies&&d.monitorRunDependencies(tr)}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 Ci(C){N?postMessage({cmd:\"onAbort\",arg:C}):d.onAbort&&d.onAbort(C),C=\"Aborted(\"+C+\")\",ee(C),at=!0,Jt=1,C+=\". Build with -s ASSERTIONS=1 for more info.\";var D=new WebAssembly.RuntimeError(C);throw f(D),D}var ah=\"data:application/octet-stream;base64,\";function gc(C){return C.startsWith(ah)}function bc(C){return C.startsWith(\"file://\")}var rn;rn=\"tfjs-backend-wasm-threaded-simd.wasm\",gc(rn)||(rn=A(rn));function yc(C){try{if(C==rn&&Ye)return new Uint8Array(Ye);if(F)return F(C);throw\"both async and sync fetching of the wasm failed\"}catch(D){Ci(D)}}function Ni(){if(!Ye&&(x||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 yc(rn)});if(R)return new Promise(function(C,D){R(rn,function(B){C(new Uint8Array(B))},D)})}return Promise.resolve().then(function(){return yc(rn)})}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\")})})}}N||gu(\"wasm-instantiate\");function B(ye){D(ye.instance,ye.module)}function Q(ye){return Ni().then(function(Te){return WebAssembly.instantiate(Te,C)}).then(function(Te){return Te}).then(ye,function(Te){ee(\"failed to asynchronously prepare wasm: \"+Te),Ci(Te)})}function ue(){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)})}):Q(B)}if(d.instantiateWasm)try{var pe=d.instantiateWasm(C,D);return pe}catch(ye){return ee(\"Module.instantiateWasm callback failed with error: \"+ye),!1}return ue().catch(f),{}}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?$i(B)():$i(B)(D.arg):B(D.arg===void 0?null:D.arg)}}function Ti(C){var D=Ef(),B=C();return Pc(D),B}function qN(C){return C}function Bv(C){var D=/\\b_Z[\\w\\d_]+/g;return C.replace(D,function(B){var Q=B;return B===Q?B:Q+\" [\"+B+\"]\"})}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 lh(C){var D=$e.pthreads[C];D.worker.postMessage({cmd:\"cancel\"})}function xc(C){var D=$e.pthreads[C];if(D){l()[C>>2]=0;var B=D.worker;$e.returnWorkerToPool(B)}}function wc(C){OT(C)}function ch(C){if(C instanceof ku||C==\"unwind\")return Jt;v(1,C)}var $e={unusedWorkers:[],runningWorkers:[],tlsInitFunctions:[],init:function(){N?$e.initWorker():$e.initMainThread()},initMainThread:function(){for(var C=8,D=0;D>2]=0;try{C()}finally{l()[Jv>>2]=1}},receiveObjectTransfer:function(C){},threadInit:function(){for(var C in $e.tlsInitFunctions)$e.tlsInitFunctions[C]()},loadWasmModuleToWorker:function(C,D){C.onmessage=B=>{var Q=B.data,ue=Q.cmd;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\"?Kv():ue===\"spawnThread\"?Ic(Q):ue===\"cleanupThread\"?xc(Q.thread):ue===\"killThread\"?uh(Q.thread):ue===\"cancelThread\"?lh(Q.thread):ue===\"loaded\"?(C.loaded=!0,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},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 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 dh(){var C=Oc(),D=l()[C+44>>2],B=l()[C+48>>2],Q=D-B;Zv(D,Q),Pc(D)}d.establishStackSpace=dh;function kc(C){if(N)return Lr(1,0,C);try{wc(C)}catch(D){ch(D)}}var zr=[];function $i(C){var D=zr[C];return D||(C>=zr.length&&(zr.length=C+1),zr[C]=D=Fn.get(C)),D}function ph(C,D){return $i(C)(D)}d.invokeEntryPoint=ph;function Vv(){var C=new Error;if(!C.stack){try{throw new Error}catch(D){C=D}if(!C.stack)return\"(no stack trace available)\"}return C.stack.toString()}function hh(C,D,B){$e.tlsInitFunctions.push(C)}function Wv(C,D){Fn.set(C,D),zr[C]=D}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=!0;function mh(C){return l()[jv()>>2]=C,C}function gh(C,D){var B;if(C===0)B=Date.now();else if((C===1||C===4)&&fh)B=Mr();else return mh(28),-1;return l()[D>>2]=B/1e3|0,l()[D+4>>2]=B%1e3*1e3*1e3|0,0}function bh(C,D){return gh(C,D)}function yh(C){Xv(C,!k,1,!x),$e.threadInit()}function vh(C){N?postMessage({cmd:\"cleanupThread\",thread:C}):xc(C)}function Ic(C){var D=$e.getNewWorker();if(!D)return 6;$e.runningWorkers.push(D);var B=$e.pthreads[C.pthread_ptr]={worker:D,threadInfoStruct:C.pthread_ptr};D.pthread=B;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,C.transferList)},D.loaded&&(D.runPthread(),delete D.runPthread),0}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(N&&(ue.length===0||pe))return Yv(687865856,C,D,B,Q);if(pe)return pe;var ye={startRoutine:B,pthread_ptr:C,arg:Q,transferList:ue};return N?(ye.cmd=\"spawnThread\",postMessage(ye,ue),0):Ic(ye)}function wh(){return 2097152}function kh(C,D){if(C==D)postMessage({cmd:\"processQueuedMainThreadWork\"});else if(N)postMessage({targetThread:C,cmd:\"processThreadQueue\"});else{var B=$e.pthreads[C],Q=B&&B.worker;if(!Q)return;Q.postMessage({cmd:\"processThreadQueue\"})}return 1}function Ih(){Ci(\"\")}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 Ch(C,D,B){i().copyWithin(C,D,D+B)}function Nh(){return T?r$().cpus().length:navigator.hardwareConcurrency}function Lr(C,D){var B=arguments.length-2,Q=arguments;return Ti(function(){for(var ue=B,pe=Fi(ue*8),ye=pe>>3,Te=0;Te>3,ue=0;ue>>16),rs(Ce.buffer),1}catch(D){}}function _h(C){var D=i().length;if(C=C>>>0,C<=D)return!1;var B=Sc();if(C>B)return!1;for(var Q=1;Q<=4;Q*=2){var ue=D*(1+.2/Q);ue=Math.min(ue,C+100663296);var pe=Math.min(B,Ii(Math.max(C,ue),65536)),ye=$h(pe);if(ye)return!0}return!1}var Le={inEventHandler:0,removeAllEventListeners:function(){for(var C=Le.eventHandlers.length-1;C>=0;--C)Le._removeHandler(C);Le.eventHandlers=[],Le.deferredCalls=[]},registerRemoveEventListeners:function(){Le.removeEventListenersRegistered||(th.push(Le.removeAllEventListeners),Le.removeEventListenersRegistered=!0)},deferredCalls:[],deferCall:function(C,D,B){function Q(ye,Te){if(ye.length!=Te.length)return!1;for(var bt in ye)if(ye[bt]!=Te[bt])return!1;return!0}for(var ue in Le.deferredCalls){var pe=Le.deferredCalls[ue];if(pe.targetFunction==C&&Q(pe.argsList,B))return}Le.deferredCalls.push({targetFunction:C,precedence:D,argsList:B}),Le.deferredCalls.sort(function(ye,Te){return ye.precedence>2]=B,l()[pe+4>>2]=Q,l()[pe+8>>2]=ue,_f(C,637534208,D,Q,pe)})},getTargetThreadForEventCallback:function(C){switch(C){case 1:return 0;case 2:return $e.currentProxiedOperationCallerThread;default:return C}},getNodeNameForTarget:function(C){return C?C==window?\"#window\":C==screen?\"#screen\":C&&C.nodeName?C.nodeName:\"\":\"\"},fullscreenEnabled:function(){return document.fullscreenEnabled||document.webkitFullscreenEnabled}};function Ah(C){var D=ki(C)+1,B=$f(D);return Ls(C,B,D),B}function Eh(C,D,B,Q){Ti(function(){var ue=Fi(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 Rh(C,D,B,Q){D=D?tn(D):\"\",Eh(C,D,B,Q)}function Dh(C){return C>2?tn(C):C}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 yu(C){return Oh(C)}function Cc(C,D,B){var Q=yu(C);if(!Q)return-4;if(Q.canvasSharedPtr&&(l()[Q.canvasSharedPtr>>2]=D,l()[Q.canvasSharedPtr+4>>2]=B),Q.offscreenCanvas||!Q.controlTransferredOffscreen){Q.offscreenCanvas&&(Q=Q.offscreenCanvas);var ue=!1;if(Q.GLctxObject&&Q.GLctxObject.GLctx){var pe=Q.GLctxObject.GLctx.getParameter(2978);ue=pe[0]===0&&pe[1]===0&&pe[2]===Q.width&&pe[3]===Q.height}Q.width=D,Q.height=B,ue&&Q.GLctxObject.GLctx.viewport(0,0,D,B)}else if(Q.canvasSharedPtr){var ye=l()[Q.canvasSharedPtr+8>>2];return Rh(ye,C,D,B),1}else return-4;return 0}function Nc(C,D,B){return N?Lr(2,1,C,D,B):Cc(C,D,B)}function Ph(C,D,B){var Q=yu(C);return Q?Cc(C,D,B):Nc(C,D,B)}function zh(){throw\"unwind\"}function Mh(C){var D=C.getExtension(\"ANGLE_instanced_arrays\");if(D)return C.vertexAttribDivisor=function(B,Q){D.vertexAttribDivisorANGLE(B,Q)},C.drawArraysInstanced=function(B,Q,ue,pe){D.drawArraysInstancedANGLE(B,Q,ue,pe)},C.drawElementsInstanced=function(B,Q,ue,pe,ye){D.drawElementsInstancedANGLE(B,Q,ue,pe,ye)},1}function Lh(C){var D=C.getExtension(\"OES_vertex_array_object\");if(D)return C.createVertexArray=function(){return D.createVertexArrayOES()},C.deleteVertexArray=function(B){D.deleteVertexArrayOES(B)},C.bindVertexArray=function(B){D.bindVertexArrayOES(B)},C.isVertexArray=function(B){return D.isVertexArrayOES(B)},1}function Bh(C){var D=C.getExtension(\"WEBGL_draw_buffers\");if(D)return C.drawBuffers=function(B,Q){D.drawBuffersWEBGL(B,Q)},1}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(C){for(var D=gt.counter++,B=C.length;B>2]:-1;ue+=tn(l()[B+pe*4>>2],ye<0?void 0:ye)}return ue},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=C.getContext(\"webgl\",D);if(!B)return 0;var Q=gt.registerContext(B,D);return Q},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)&>.initExtensions(Q),B},makeContextCurrent:function(C){return gt.currentContext=gt.contexts[C],d.ctx=Ac=gt.currentContext&>.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]&>.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=!0;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)})}}},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=yu(C);if(!pe||ue.explicitSwapControl)return 0;var ye=gt.createContext(pe,ue);return ye}function Gh(C,D){return Uh(C,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(){_i.varargs+=4;var C=l()[_i.varargs-4>>2];return C},getStr:function(C){var D=tn(C);return D},get64:function(C,D){return C}};function Tc(C){return N?Lr(3,1,C):0}function $c(C,D,B,Q,ue){if(N)return Lr(4,1,C,D,B,Q,ue)}function _c(C,D,B,Q){if(N)return Lr(5,1,C,D,B,Q);for(var ue=0,pe=0;pe>2],Te=l()[D+4>>2];D+=8;for(var bt=0;bt>2]=ue,0}function Hh(C){Ee(C)}$e.init();var Ac,qh=[null,kc,Nc,Tc,$c,_c],Uv=!1,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)},vu=d._FusedBatchNorm=function(){return(vu=d._FusedBatchNorm=d.asm.FusedBatchNorm).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)},Ai=d._Gather=function(){return(Ai=d._Gather=d.asm.Gather).apply(null,arguments)},xu=d._GatherNd=function(){return(xu=d._GatherNd=d.asm.GatherNd).apply(null,arguments)},wu=d._Greater=function(){return(wu=d._Greater=d.asm.Greater).apply(null,arguments)},Hv=d._GreaterEqual=function(){return(Hv=d._GreaterEqual=d.asm.GreaterEqual).apply(null,arguments)},Ei=d._LeakyRelu=function(){return(Ei=d._LeakyRelu=d.asm.LeakyRelu).apply(null,arguments)},Ri=d._Less=function(){return(Ri=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(){return(J=d._LogicalAnd=d.asm.LogicalAnd).apply(null,arguments)},de=d._Max=function(){return(de=d._Max=d.asm.Max).apply(null,arguments)},Ie=d._MaxPool=function(){return(Ie=d._MaxPool=d.asm.MaxPool).apply(null,arguments)},Qe=d._Maximum=function(){return(Qe=d._Maximum=d.asm.Maximum).apply(null,arguments)},Ze=d._Mean=function(){return(Ze=d._Mean=d.asm.Mean).apply(null,arguments)},Ve=d._Min=function(){return(Ve=d._Min=d.asm.Min).apply(null,arguments)},ze=d._Minimum=function(){return(ze=d._Minimum=d.asm.Minimum).apply(null,arguments)},Tt=d._MirrorPad=function(){return(Tt=d._MirrorPad=d.asm.MirrorPad).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)},Di=d._NonMaxSuppressionV3=function(){return(Di=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)},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)},Fi=d.stackAlloc=function(){return(Fi=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=ku;var zc;function ku(C){this.name=\"ExitStatus\",this.message=\"Program terminated with exit(\"+C+\")\",this.status=C}as=function C(){zc||Rf(),zc||(as=C)};function Rf(C){if(C=C||b,tr>0)return;if(N){h(d),fu(),postMessage({cmd:\"loaded\"});return}if(sn(),tr>0)return;function D(){zc||(zc=!0,d.calledRun=!0,!at&&(fu(),h(d),d.onRuntimeInitialized&&d.onRuntimeInitialized(),rh()))}d.setStatus?(d.setStatus(\"Running...\"),setTimeout(function(){setTimeout(function(){d.setStatus(\"\")},1),D()},1)):D()}d.run=Rf;function OT(C,D){if(Jt=C,!D&&N)throw kc(C),\"unwind\";Pr()||sh(),PT(C)}function PT(C){Jt=C,Pr()||($e.terminateAllThreads(),d.onExit&&d.onExit(C),at=!0),v(C,new ku(C))}if(d.preInit)for(typeof d.preInit==\"function\"&&(d.preInit=[d.preInit]);d.preInit.length>0;)d.preInit.pop()();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\")Lc=WasmBackendModule;else if(typeof r!=\"undefined\")Lc=r;else throw new Error(\"Could not find wasm module in post.js\");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)})}}return r.ready}})();typeof e==\"object\"&&typeof t==\"object\"?t.exports=n:typeof define==\"function\"&&define.amd?define([],function(){return n}):typeof e==\"object\"&&(e.WasmBackendModuleThreadedSimd=n)}}),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){r=r||{};var a=typeof r!=\"undefined\"?r:{},i,o;a.ready=new Promise(function(H,J){i=H,o=J});var u;typeof process!=\"undefined\"&&process.listeners&&(u={uncaughtException:process.listeners(\"uncaughtException\"),unhandledRejection:process.listeners(\"unhandledRejection\")});var l=Object.assign({},a),c=[],p=\"./this.program\",d=(H,J)=>{throw J},h=typeof window==\"object\",f=typeof importScripts==\"function\",m=typeof process==\"object\"&&typeof process.versions==\"object\"&&typeof process.versions.node==\"string\",g=\"\";function b(H){return a.locateFile?a.locateFile(H,g):g+H}var y,v,x,k;function T(H){if(H instanceof xu)return;R(\"exiting due to exception: \"+H)}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),N.readFileSync(J,de?void 0:\"utf8\")},x=H=>{var J=y(H,!0);return J.buffer||(J=new Uint8Array(J)),J},v=(H,J,de)=>{A(),H=E.normalize(H),N.readFile(H,function(Ie,Qe){Ie?de(Ie):J(Qe.buffer)})},process.argv.length>1&&(p=process.argv[1].replace(/\\\\/g,\"/\")),c=process.argv.slice(2),process.on(\"uncaughtException\",function(H){if(!(H instanceof xu))throw H}),process.on(\"unhandledRejection\",function(H){throw H}),d=(H,J)=>{if(hu())throw process.exitCode=H,J;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,!1),J.send(null),J.responseText},f&&(x=H=>{var J=new XMLHttpRequest;return J.open(\"GET\",H,!1),J.responseType=\"arraybuffer\",J.send(null),new Uint8Array(J.response)}),v=(H,J,de)=>{var Ie=new XMLHttpRequest;Ie.open(\"GET\",H,!0),Ie.responseType=\"arraybuffer\",Ie.onload=()=>{if(Ie.status==200||Ie.status==0&&Ie.response){J(Ie.response);return}de()},Ie.onerror=de,Ie.send(null)},k=H=>document.title=H);var P=a.print||console.log.bind(console),R=a.printErr||console.warn.bind(console);Object.assign(a,l),l=null,a.arguments&&(c=a.arguments),a.thisProgram&&(p=a.thisProgram),a.quit&&(d=a.quit);var F=4;function $(H){$.shown||($.shown={}),$.shown[H]||($.shown[H]=1,R(H))}function z(H,J){if(typeof WebAssembly.Function==\"function\"){for(var de={i:\"i32\",j:\"i64\",f:\"f32\",d:\"f64\"},Ie={parameters:[],results:J[0]==\"v\"?[]:[de[J[0]]]},Qe=1;Qe{Z=H},ee;a.wasmBinary&&(ee=a.wasmBinary);var se=a.noExitRuntime||!0;typeof WebAssembly!=\"object\"&&Or(\"no native wasm support detected\");var ne,oe=!1,re;function le(H,J){H||Or(J)}function me(H){var J=a[\"_\"+H];return J}function ke(H,J,de,Ie,Qe){var Ze={string:function(an){var nr=0;if(an!=null&&an!==0){var Fc=(an.length<<2)+1;nr=vu(Fc),tt(an,nr,Fc)}return nr},array:function(an){var nr=vu(an.length);return at(an,nr),nr}};function Ve(an){return J===\"string\"?Je(an):J===\"boolean\"?Boolean(an):an}var ze=me(H),Tt=[],is=0;if(Ie)for(var os=0;os=Ie);)++Qe;if(Qe-J>16&&H.subarray&&Pe)return Pe.decode(H.subarray(J,Qe));for(var Ze=\"\";J>10,56320|is&1023)}}return Ze}function Je(H,J){return H?Xe(en,H,J):\"\"}function Ye(H,J,de,Ie){if(!(Ie>0))return 0;for(var Qe=de,Ze=de+Ie-1,Ve=0;Ve=55296&&ze<=57343){var Tt=H.charCodeAt(++Ve);ze=65536+((ze&1023)<<10)|Tt&1023}if(ze<=127){if(de>=Ze)break;J[de++]=ze}else if(ze<=2047){if(de+1>=Ze)break;J[de++]=192|ze>>6,J[de++]=128|ze&63}else if(ze<=65535){if(de+2>=Ze)break;J[de++]=224|ze>>12,J[de++]=128|ze>>6&63,J[de++]=128|ze&63}else{if(de+3>=Ze)break;J[de++]=240|ze>>18,J[de++]=128|ze>>12&63,J[de++]=128|ze>>6&63,J[de++]=128|ze&63}}return J[de]=0,de-Qe}function tt(H,J,de){return Ye(H,en,J,de)}function Ce(H){for(var J=0,de=0;de=55296&&Ie<=57343&&(Ie=65536+((Ie&1023)<<10)|H.charCodeAt(++de)&1023),Ie<=127?++J:Ie<=2047?J+=2:Ie<=65535?J+=3:J+=4}return J}var ut=typeof TextDecoder!=\"undefined\"?new TextDecoder(\"utf-16le\"):void 0;function at(H,J){Et.set(H,J)}function Jt(H,J,de){for(var Ie=0;Ie>0]=H.charCodeAt(Ie);de||(Et[J>>0]=0)}function Nt(H,J){return H%J>0&&(H+=J-H%J),H}var Cn,Et,en,Nn,Tn,Yt,Dn,tn,Ms;function Ls(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 ki=a.INITIAL_MEMORY||16777216,Js,Bs=[],pu=[],Ii=[],nn=!1,ic=!1,oc=0;function hu(){return se||oc>0}function uc(){if(a.preRun)for(typeof a.preRun==\"function\"&&(a.preRun=[a.preRun]);a.preRun.length;)dc(a.preRun.shift());mu(Bs)}function lc(){nn=!0,mu(pu)}function Fv(){ic=!0}function cc(){if(a.postRun)for(typeof a.postRun==\"function\"&&(a.postRun=[a.postRun]);a.postRun.length;)pc(a.postRun.shift());mu(Ii)}function dc(H){Bs.unshift(H)}function rs(H){pu.unshift(H)}function pc(H){Ii.unshift(H)}var Fn=0,Si=null,er=null;function th(H){Fn++,a.monitorRunDependencies&&a.monitorRunDependencies(Fn)}function hc(H){if(Fn--,a.monitorRunDependencies&&a.monitorRunDependencies(Fn),Fn==0&&(Si!==null&&(clearInterval(Si),Si=null),er)){var J=er;er=null,J()}}a.preloadedImages={},a.preloadedAudios={};function Or(H){a.onAbort&&a.onAbort(H),H=\"Aborted(\"+H+\")\",R(H),oe=!0,re=1,H+=\". Build with -s ASSERTIONS=1 for more info.\";var J=new WebAssembly.RuntimeError(H);throw o(J),J}var nh=\"data:application/octet-stream;base64,\";function fc(H){return H.startsWith(nh)}function Pr(H){return H.startsWith(\"file://\")}var sn;sn=\"tfjs-backend-wasm.wasm\",fc(sn)||(sn=b(sn));function fu(H){try{if(H==sn&&ee)return new Uint8Array(ee);if(x)return x(H);throw\"both async and sync fetching of the wasm failed\"}catch(J){Or(J)}}function sh(){if(!ee&&(h||f)){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 '\"+sn+\"'\";return H.arrayBuffer()}).catch(function(){return fu(sn)});if(v)return new Promise(function(H,J){v(sn,function(de){H(new Uint8Array(de))},J)})}return Promise.resolve().then(function(){return fu(sn)})}function rh(){var H={env:Ti,wasi_snapshot_preview1:Ti};function J(Ve,ze){var Tt=Ve.exports;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\")}th(\"wasm-instantiate\");function de(Ve){J(Ve.instance)}function Ie(Ve){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),Or(ze)})}function Qe(){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\"),Ie(de)})}):Ie(de)}if(a.instantiateWasm)try{var Ze=a.instantiateWasm(H,J);return Ze}catch(Ve){return R(\"Module.instantiateWasm callback failed with error: \"+Ve),!1}return Qe().catch(o),{}}var Ov,Pv;function mu(H){for(;H.length>0;){var J=H.shift();if(typeof J==\"function\"){J(a);continue}var de=J.func;typeof de==\"number\"?J.arg===void 0?gu(de)():gu(de)(J.arg):de(J.arg===void 0?null:J.arg)}}function tr(H){return H}function mc(H){var J=/\\b_Z[\\w\\d_]+/g;return H.replace(J,function(de){var Ie=de;return de===Ie?de:Ie+\" [\"+de+\"]\"})}var as=[];function gu(H){var J=as[H];return J||(H>=as.length&&(as.length=H+1),as[H]=J=Js.get(H)),J}function zv(){var H=new Error;if(!H.stack){try{throw new Error}catch(J){H=J}if(!H.stack)return\"(no stack trace available)\"}return H.stack.toString()}function Ci(H,J){Js.set(H,J),as[H]=J}function ah(){Or(\"\")}function gc(H,J,de){en.copyWithin(H,J,J+de)}function bc(){return 2147483648}function rn(H){try{return ne.grow(H-Cn.byteLength+65535>>>16),Ls(ne.buffer),1}catch(J){}}function yc(H){var J=en.length;H=H>>>0;var de=bc();if(H>de)return!1;for(var Ie=1;Ie<=4;Ie*=2){var Qe=J*(1+.2/Ie);Qe=Math.min(Qe,H+100663296);var Ze=Math.min(de,Nt(Math.max(H,Qe),65536)),Ve=rn(Ze);if(Ve)return!0}return!1}var Ni={mappings:{},buffers:[null,[],[]],printChar:function(H,J){var de=Ni.buffers[H];J===0||J===10?((H===1?P:R)(Xe(de,0)),de.length=0):de.push(J)},varargs:void 0,get:function(){Ni.varargs+=4;var H=Yt[Ni.varargs-4>>2];return H},getStr:function(H){var J=Je(H);return J},get64:function(H,J){return H}};function ih(H){return 0}function Mv(H,J,de,Ie,Qe){}function Lv(H,J,de,Ie){for(var Qe=0,Ze=0;Ze>2],ze=Yt[J+4>>2];J+=8;for(var Tt=0;Tt>2]=Qe,0}function oh(H){te(H)}var vc=!1,Ti={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)},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)},$i=a._All=function(){return($i=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)},bu=a._FusedBatchNorm=function(){return(bu=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)},yu=a._LogicalAnd=function(){return(yu=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)},vu=a.stackAlloc=function(){return(vu=a.stackAlloc=a.asm.stackAlloc).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 Ai;function xu(H){this.name=\"ExitStatus\",this.message=\"Program terminated with exit(\"+H+\")\",this.status=H}er=function H(){Ai||wu(),Ai||(er=H)};function wu(H){if(H=H||c,Fn>0||(uc(),Fn>0))return;function J(){Ai||(Ai=!0,a.calledRun=!0,!oe&&(lc(),i(a),a.onRuntimeInitialized&&a.onRuntimeInitialized(),cc()))}a.setStatus?(a.setStatus(\"Running...\"),setTimeout(function(){setTimeout(function(){a.setStatus(\"\")},1),J()},1)):J()}a.run=wu;function Hv(H){re=H,hu()||(a.onExit&&a.onExit(H),oe=!0),d(H,new xu(H))}if(a.preInit)for(typeof a.preInit==\"function\"&&(a.preInit=[a.preInit]);a.preInit.length>0;)a.preInit.pop()();wu();var Ei;u&&(Ei={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 Ri;if(typeof r!=\"undefined\")Ri=r;else if(typeof WasmBackendModuleThreadedSimd!=\"undefined\")Ri=WasmBackendModuleThreadedSimd;else throw new Error(\"Could not find wasm module in post.js\");if(Ei){var Nf=Ri._dispose;Ri._dispose=function(){Nf(),Ei.uncaughtException.forEach(function(H){process.removeListener(\"uncaughtException\",H)}),Ei.unhandledRejection.forEach(function(H){process.removeListener(\"unhandledRejection\",H)})}}return r.ready}})();typeof e==\"object\"&&typeof t==\"object\"?t.exports=n:typeof define==\"function\"&&define.amd?define([],function(){return n}):typeof e==\"object\"&&(e.WasmBackendModule=n)}}),o$=1e-7,u$=1e-4,Ud=class{constructor(e,t){this.backend=e,this.dataMover=t,this.data=new WeakMap,this.dataIdsCount=0}get(e){return this.data.has(e)||this.dataMover.moveData(this.backend,e),this.data.get(e)}set(e,t){this.dataIdsCount++,this.data.set(e,t)}has(e){return this.data.has(e)}delete(e){return this.dataIdsCount--,this.data.delete(e)}numDataIds(){return this.dataIdsCount}},nl=class{refCount(e){return On(\"refCount\")}incRef(e){return On(\"incRef\")}timerAvailable(){return!0}time(e){return On(\"time\")}read(e){return On(\"read\")}readSync(e){return On(\"readSync\")}readToGPU(e,t){return On(\"readToGPU\")}numDataIds(){return On(\"numDataIds\")}disposeData(e,t){return On(\"disposeData\")}write(e,t,n){return On(\"write\")}move(e,t,n,s,r){return On(\"move\")}memory(){return On(\"memory\")}floatPrecision(){return On(\"floatPrecision\")}epsilon(){return this.floatPrecision()===32?o$:u$}dispose(){return On(\"dispose\")}};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 Uw(e){let t=e.length,n=0;for(;t>0;)n=Math.random()*t|0,t--,pd(e,t,n)}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--,pd(e,n,s),pd(t,n,s)}function Vu(e,t,n){return Math.max(e,Math.min(t,n))}function c$(e){return e%2===0?e:e+1}function pd(e,t,n){let s=e[t];e[t]=e[n],e[n]=s}function d$(e){let t=0;for(let n=0;nn+` Shapes ${e} and ${t} must match`)}function wa(e){O(e!=null,()=>\"The input to the tensor constructor must be a non-null value.\")}function sa(e,t=[],n=!1){if(t==null&&(t=[]),Array.isArray(e)||Qt(e)&&!n)for(let s=0;s0,n){return new Promise((s,r)=>{let a=0,i=()=>{if(e()){s();return}a++;let o=t(a);if(n!=null&&a>=n){r();return}setTimeout(i,o)};i()})}function v$(e,t){let n=1,s=-1;for(let a=0;a=0)n*=e[a];else if(e[a]===-1){if(s!==-1)throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${s} and dim ${a}`);s=a}else if(e[a]<0)throw Error(`Shapes can not be < 0. Found ${e[a]} at dim ${a}`);if(s===-1){if(t>0&&t!==n)throw Error(`Size(${t}) must match the product of shape ${e}`);return e}if(n===0)throw Error(`Cannot infer the missing size in [${e}] when there are 0 elements`);if(t%n!==0)throw Error(`The implicit shape can't be a fractional number. Got ${t} / ${n}`);let r=e.slice();return r[s]=t/n,r}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`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 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;oo)&&e[o]===1&&(n.push(e[o]),s.push(o)),a[i]<=o&&i++}e[o]!==1&&(n.push(e[o]),s.push(o))}return{newShape:n,keptDims:s}}function Hw(e,t){let n=null;if(e==null||e===\"float32\")n=new Float32Array(t);else if(e===\"int32\")n=new Int32Array(t);else if(e===\"bool\")n=new Uint8Array(t);else throw new Error(`Unknown data type ${e}`);return n}function qw(e,t){let n=null;if(e==null||e===\"float32\")n=new Float32Array(t);else if(e===\"int32\")n=new Int32Array(t);else if(e===\"bool\")n=new Uint8Array(t);else if(e===\"string\")n=new Array(t);else throw new Error(`Unknown data type ${e}`);return n}function jw(e,t){for(let n=0;nt+=n.length),t}function ir(e){return typeof e==\"string\"||e instanceof String}function Yw(e){return typeof e==\"boolean\"}function Qw(e){return typeof e==\"number\"}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 hd(e,t){for(let n=t;n=0;--s)n[s]=n[s+1]*e[s+1];return n}function Zw(e,t,n,s=!1){let r=new Array;if(t.length===1){let a=t[0]*(s?2:1);for(let i=0;iu*l)*(s?2:1);for(let u=0;ur*a)*(n?2:1);if(s===0)return[];if(s!==t.length)throw new Error(`[${e}] does not match the input size ${t.length}${n?\" for a complex tensor\":\"\"}.`);return Zw(0,e,t,n)}function ng(e,t){let n=Hd(e,t);for(let s=0;ss*r,1);if(t==null||t===\"float32\")return Hi(e,new Float32Array(n));if(t===\"int32\")return Hi(e,new Int32Array(n));if(t===\"bool\")return Hi(e,new Uint8Array(n));throw new Error(`Unknown data type ${t}`)}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 k$(e,t,n){if(t===0)return 0;if(t===1)return e[0];let s=e[e.length-1];for(let r=0;r{let[s,r]=n.split(\":\");this.urlFlags[s]=T$(s,r)})}};function C$(e){let t={};return e.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g,(n,...s)=>(N$(t,s[0],s[1]),s.join(\"=\"))),t}function N$(e,t,n){e[decodeURIComponent(t)]=decodeURIComponent(n||\"\")}function T$(e,t){if(t=t.toLowerCase(),t===\"true\"||t===\"false\")return t===\"true\";if(`${+t}`===t)return+t;throw new Error(`Could not parse value flag value ${t} for flag ${e}.`)}function X(){return Jw}var Jw=null;function $$(e){Jw=e}var Df;function ek(){if(Df==null){let e;if(typeof window!=\"undefined\")e=window;else if(typeof global!=\"undefined\")e=global;else if(typeof process!=\"undefined\")e=process;else if(typeof self!=\"undefined\")e=self;else throw new Error(\"Could not find a global object\");Df=e}return Df}function _$(){let e=ek();return e._tfGlobals==null&&(e._tfGlobals=new Map),e._tfGlobals}function ag(e,t){let n=_$();if(n.has(e))return n.get(e);{let s=t();return n.set(e,s),n.get(e)}}var io=\"Abs\",sl=\"Acos\",rl=\"Acosh\",Ir=\"Add\",ka=\"AddN\",al=\"All\",il=\"Any\",Ia=\"ArgMax\",ol=\"ArgMin\",ul=\"Asin\",ll=\"Asinh\",cl=\"Atan\",dl=\"Atanh\",pl=\"Atan2\",Sa=\"AvgPool\",ig=\"AvgPoolGrad\",qd=\"AvgPool3D\",og=\"AvgPool3DGrad\",Ca=\"BatchMatMul\",oo=\"BatchToSpaceND\",ug=\"Bincount\",A$=\"BroadcastTo\",lg=\"BroadcastArgs\",Na=\"Cast\",Ta=\"Ceil\",Sr=\"ClipByValue\",jd=\"Complex\",Kd=\"ComplexAbs\",uo=\"Concat\",$a=\"Conv2D\",cg=\"Conv2DBackpropFilter\",_a=\"Conv2DBackpropInput\",Xd=\"Conv3D\",dg=\"Conv3DBackpropFilterV2\",pg=\"Conv3DBackpropInputV2\",Aa=\"Cos\",Ea=\"Cosh\",hl=\"Cumprod\",lo=\"Cumsum\",co=\"CropAndResize\",hg=\"DenseBincount\",po=\"DepthToSpace\",Ra=\"DepthwiseConv2dNative\",fg=\"DepthwiseConv2dNativeBackpropFilter\",mg=\"DepthwiseConv2dNativeBackpropInput\",gg=\"Diag\",Yd=\"Dilation2D\",Yf=\"Dilation2DBackpropInput\",Qf=\"Dilation2DBackpropFilter\",Da=\"RealDiv\",Qd=\"Einsum\",Fa=\"Elu\",bg=\"EluGrad\",fl=\"Erf\",ho=\"Equal\",Oa=\"Exp\",fo=\"ExpandDims\",mo=\"Expm1\",yg=\"FFT\",ml=\"Fill\",go=\"FlipLeftRight\",Pa=\"Floor\",za=\"FloorDiv\",Ma=\"FusedBatchNorm\",bo=\"GatherV2\",yo=\"GatherNd\",vo=\"Greater\",La=\"GreaterEqual\",Ba=\"Identity\",vg=\"IFFT\",Zd=\"Imag\",gl=\"IsFinite\",bl=\"IsInf\",yl=\"IsNan\",Va=\"LeakyRelu\",xo=\"Less\",wo=\"LessEqual\",xg=\"LinSpace\",Wa=\"Log\",vl=\"Log1p\",ko=\"LogicalAnd\",xl=\"LogicalNot\",Jd=\"LogicalOr\",E$=\"LogSoftmax\",ep=\"LRN\",wg=\"LRNGrad\",Ua=\"Max\",Ga=\"Maximum\",Ha=\"MaxPool\",kg=\"MaxPoolGrad\",tp=\"MaxPool3D\",Ig=\"MaxPool3DGrad\",Sg=\"MaxPoolWithArgmax\",qa=\"Mean\",ja=\"Min\",Ka=\"Minimum\",Xa=\"MirrorPad\",wl=\"Mod\",Cg=\"Multinomial\",Ya=\"Multiply\",Io=\"Neg\",So=\"NotEqual\",Co=\"NonMaxSuppressionV3\",kl=\"NonMaxSuppressionV4\",No=\"NonMaxSuppressionV5\",To=\"OnesLike\",$o=\"OneHot\",_o=\"Pack\",Qa=\"PadV2\",$de=\"Pool\",Za=\"Pow\",Ja=\"Prelu\",Ao=\"Prod\",Il=\"Range\",np=\"Real\",Sl=\"Reciprocal\",ei=\"Relu\",Eo=\"Reshape\",Cl=\"ResizeNearestNeighbor\",Ng=\"ResizeNearestNeighborGrad\",ti=\"ResizeBilinear\",Tg=\"ResizeBilinearGrad\",ni=\"Relu6\",Ro=\"Reverse\",Do=\"Round\",si=\"Rsqrt\",Fo=\"ScatterNd\",Oo=\"Select\",Nl=\"Selu\",Po=\"Slice\",ri=\"Sin\",zo=\"Sinh\",Tl=\"Sign\",ai=\"Sigmoid\",$l=\"Softplus\",ii=\"Sqrt\",oi=\"Sum\",Mo=\"SpaceToBatchND\",Lo=\"SplitV\",ui=\"Softmax\",sp=\"SparseFillEmptyRows\",_l=\"SparseReshape\",rp=\"SparseSegmentMean\",ap=\"SparseSegmentSum\",ip=\"SparseToDense\",li=\"SquaredDifference\",Al=\"Square\",Bo=\"StridedSlice\",op=\"StringNGrams\",$g=\"StringSplit\",_g=\"StringToHashBucketFast\",ci=\"Sub\",Vo=\"Tan\",di=\"Tanh\",Cr=\"Tile\",Wo=\"TopK\",Uo=\"Transform\",pi=\"Transpose\",Ag=\"Unique\",Go=\"Unpack\",up=\"UnsortedSegmentSum\",Ho=\"ZerosLike\",hi=\"Step\",fd=\"FromPixels\",qo=\"RotateWithOffset\",ra=\"_FusedMatMul\",aa=\"FusedConv2D\",ia=\"FusedDepthwiseConv2D\";function ar(...e){X().getBool(\"IS_TEST\")||X().getBool(\"PROD\")||console.warn(...e)}function R$(...e){X().getBool(\"IS_TEST\")||X().getBool(\"PROD\")||console.log(...e)}var Qi=ag(\"kernelRegistry\",()=>new Map),Wu=ag(\"gradRegistry\",()=>new Map);function Zf(e,t){let n=Eg(e,t);return Qi.get(n)}function nx(e){return Wu.get(e)}function Jf(e){let t=Qi.entries(),n=[];for(;;){let{done:s,value:r}=t.next();if(s)break;let[a,i]=r,[o]=a.split(\"_\");o===e&&n.push(i)}return n}function El(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 D$(e){let{kernelName:t}=e;Wu.has(t)&&X().getBool(\"DEBUG\")&&ar(`Overriding the gradient for '${t}'`),Wu.set(t,e)}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`);Qi.delete(n)}function Ade(e){if(!Wu.has(e))throw new Error(`The gradient '${e}' for backend is not registered`);Wu.delete(e)}function Ede(e,t){Jf(e).forEach(s=>{let r=Object.assign({},s,{backendName:t});El(r)})}function Eg(e,t){return`${t}_${e}`}var w={};Ae(w,{arraysEqual:()=>kr,assert:()=>O,assertNonNegativeIntegerDimensions:()=>sg,assertNonNull:()=>wa,assertShapesMatch:()=>pn,bytesFromStringArray:()=>Xw,bytesPerElement:()=>Xf,checkConversionForErrors:()=>jw,clamp:()=>Vu,computeStrides:()=>ao,createScalarValue:()=>L$,createShuffledIndices:()=>b$,decodeString:()=>md,distSquared:()=>h$,encodeString:()=>Dl,fetch:()=>V$,fingerPrint64:()=>M$,flatten:()=>sa,getArrayFromDType:()=>qw,getTypedArrayFromDType:()=>Hw,hasEncodingLoss:()=>x$,hexToLong:()=>Rl,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:()=>Uu,parseAxisParam:()=>ts,randUniform:()=>p$,repeatedTry:()=>y$,rightPad:()=>zu,shuffle:()=>Uw,shuffleCombo:()=>l$,sizeFromShape:()=>pt,sizeToSquarishShape:()=>g$,squeezeShape:()=>Gw,sum:()=>d$,swap:()=>pd,tanh:()=>m$,toNestedArray:()=>Hi,toTypedArray:()=>lp});var sx=xa(HT()),qr=sx.default||sx;function Rl(e){return qr.fromString(e,!0,16)}var tk=Rl(\"c3a5c85c97cb3127\"),Gr=Rl(\"b492b66fbe98f273\"),on=Rl(\"9ae16a3b2f90404f\");function em(e){return e.xor(e.shru(47))}function nk(e,t,n){let s=e.slice(t,t+n);return qr.fromBytes(Array.from(s),!0,!0)}function lt(e,t){return nk(e,t,8)}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=Rl(\"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 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 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 O$(e,t=e.length){if(t>=8){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=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 em(on.mul(a).xor(tk.mul(i))).mul(on)}return on}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 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 M$(e,t=e.length){let n=qr.fromNumber(81,!0);if(t<=32)return t<=16?O$(e,t):P$(e,t);if(t<=64)return z$(e,t);let s=n,r=n.mul(Gr).add(113),a=em(r.mul(on).add(113)).mul(on),i=[qr.UZERO,qr.UZERO],o=[qr.UZERO,qr.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(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=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 L$(e,t){return t===\"string\"?Dl(e):lp([e],t)}function B$(e,t){return e instanceof Float32Array&&t===\"float32\"||e instanceof Int32Array&&t===\"int32\"||e instanceof Uint8Array&&t===\"bool\"}function lp(e,t){if(t===\"string\")throw new Error(\"Cannot convert a string[] to a TypedArray\");if(Array.isArray(e)&&(e=sa(e)),X().getBool(\"DEBUG\")&&jw(e,t),B$(e,t))return e;if(t==null||t===\"float32\"||t===\"complex64\")return new Float32Array(e);if(t===\"int32\")return new Int32Array(e);if(t===\"bool\"){let n=new Uint8Array(e.length);for(let s=0;s{s=n()},a,i=Uu();if(this.backendTimer.timerAvailable())a=this.backendTimer.time(r);else{r();for(let u of s)u.dataSync();a=Promise.resolve({kernelMs:Uu()-i})}if(X().getBool(\"CHECK_COMPUTATION_FOR_ERRORS\"))for(let u=0;u{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():\"\")}}logKernelProfile(e){let{kernelName:t,outputs:n,timeMs:s,inputs:r,extraInfo:a}=e;n.forEach(i=>{Promise.all([i.data(),s,a]).then(o=>{this.logger.logKernelProfile(t,i,o[0],o[1],r,o[2])})})}};function U$(e,t,n){if(t!==\"float32\")return!1;for(let s=0;s0?f:\"\"} `}}console.log(`%c${o}\t%c${i}\t%c${u}D ${c}\t%c${l}\t%c${p}\t%c${a}`,\"font-weight:bold\",\"color:red\",\"color:blue\",\"color: orange\",\"color: green\",\"color: steelblue\")}};function H$(e,t,n){let s={},r={};for(let u=0;us[m.id]=!0),h=!0,r[l.id]=!0;break}if(h)break}}let a={};a[n.id]=!0;let i={};for(let u=e.length-1;u>=0;u--){let l=e[u],c=l.inputs;for(let p=0;p=0;r--){let a=t[r],i=[];if(a.outputs.forEach(u=>{let l=e[u.id];l!=null?i.push(l):i.push(null)}),a.gradient==null)throw new Error(`Cannot compute gradient: gradient function not found for ${a.kernelName}.`);let o=a.gradient(i);for(let u in a.inputs){if(!(u in o))throw new Error(`Cannot backprop through input ${u}. Available gradients found: ${Object.keys(o)}.`);let l=n(()=>o[u]());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(!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;else{let p=e[c.id];e[c.id]=s(p,l),p.dispose()}}}}var ax=20,Su=3,Ff=7;function j$(e,t,n,s){let r=ao(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(`\n`)),u.join(`\n`)}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;lax){let g=Su*i,b=Array.from(e.slice(0,g)),y=Array.from(e.slice((o-Su)*i,o*i));return n===\"complex64\"&&(b=_u(b),y=_u(y)),[\"[\"+b.map((v,x)=>$u(v,r[x],n)).join(\", \")+\", ..., \"+y.map((v,x)=>$u(v,r[o-Su+x],n)).join(\", \")+\"]\"]}let m=n===\"complex64\"?_u(e):Array.from(e);return[\"[\"+m.map((g,b)=>$u(g,r[b],n)).join(\", \")+\"]\"]}let l=t.slice(1),c=s.slice(1),p=s[0]*i,d=[];if(o>ax){for(let m=0;m`Length of values '${s}' does not match the size inferred by the shape '${this.size}'.`)}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||qw(t,this.size),this.strides=ao(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})`);let n=this.locToIndex(t);this.values[n]=e}get(...e){e.length===0&&(e=[0]);let t=0;for(let s of e){if(s<0||s>=this.shape[t]){let r=`Requested out of range element at ${e}. Buffer shape=${this.shape}`;throw new Error(r)}t++}let n=e[e.length-1];for(let s=0;smd(n))}catch(n){throw new Error(\"Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().\")}}return e}dataToGPU(e){return this.throwIfDisposed(),cs().readToGPU(this.dataId,e)}dataSync(){this.throwIfDisposed();let e=cs().readSync(this.dataId);if(this.dtype===\"string\")try{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().\")}return e}async bytes(){this.throwIfDisposed();let e=await cs().read(this.dataId);return this.dtype===\"string\"?e:new Uint8Array(e.buffer)}dispose(){this.isDisposed||(cs().disposeTensor(this),this.isDisposedInternal=!0)}get isDisposed(){return this.isDisposedInternal}throwIfDisposed(){if(this.isDisposed)throw new Error(\"Tensor is disposed.\")}print(e=!1){return Wi.print(this,e)}clone(){return this.throwIfDisposed(),Wi.clone(this)}toString(e=!1){let t=this.dataSync();return j$(t,this.shape,this.dtype,e)}cast(e){return this.throwIfDisposed(),Wi.cast(this,e)}variable(e=!0,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 J$(){return ag(\"Tensor\",()=>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}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(!kr(e.shape,this.shape))throw new Error(`shape of the new value (${e.shape}) and previous value (${this.shape}) must match`);cs().disposeTensor(this),this.dataId=e.dataId,cs().incRef(this,null)}dispose(){cs().disposeVariable(this),this.isDisposedInternal=!0}};Object.defineProperty(gd,Symbol.hasInstance,{value:e=>e instanceof et&&e.assign!=null&&e.assign instanceof Function});var _s={};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_||{}),rk=(e=>(e.float32=\"float32\",e.int32=\"int32\",e.bool=\"int32\",e.complex64=\"complex64\",e))(rk||{}),ak=(e=>(e.float32=\"float32\",e.int32=\"int32\",e.bool=\"bool\",e.complex64=\"complex64\",e))(ak||{}),ik=(e=>(e.float32=\"float32\",e.int32=\"float32\",e.bool=\"float32\",e.complex64=\"complex64\",e))(ik||{}),ok=(e=>(e.float32=\"complex64\",e.int32=\"complex64\",e.bool=\"complex64\",e.complex64=\"complex64\",e))(ok||{}),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 t_[e][t]}function cp(e){return cn(e,\"int32\")}function vt(e,t){if(e.dtype===t.dtype)return[e,t];let n=cn(e.dtype,t.dtype);return[e.cast(n),t.cast(n)]}function uk(e,t){O(e.dtype===t.dtype,()=>`The dtypes of the first(${e.dtype}) and second(${t.dtype}) input must match`)}function n_(e,t){return t.some(n=>n.id===e.id)}function Rg(e){let t=[];return lk(e,t,new Set),t}function lk(e,t,n){if(e==null)return;if(e instanceof et){t.push(e);return}if(!s_(e))return;let s=e;for(let r in s){let a=s[r];n.has(a)||(n.add(a),lk(a,t,n))}}function s_(e){return Array.isArray(e)||typeof e==\"object\"}function Of(e){return e.kernelName!=null}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=new WeakMap,this.profiling=!1,this.activeProfile={newBytes:0,newTensors:0,peakBytes:0,kernels:[],result:null,get kernelNames(){return Array.from(new Set(this.kernels.map(e=>e.name)))}}}dispose(){for(let e in this.registeredVariables)this.registeredVariables[e].dispose()}},tm=class{constructor(e){this.ENV=e,this.registry={},this.registryFactory={},this.pendingBackendInitId=0,this.state=new ix}async ready(){if(this.pendingBackendInit!=null)return this.pendingBackendInit.then(()=>{});if(this.backendInstance!=null)return;let e=this.getSortedBackends();for(let t=0;t{t.setupFunc!=null&&t.setupFunc(this.backendInstance)})}disposeRegisteredKernels(e){Jf(e).forEach(n=>{n.disposeFunc!=null&&n.disposeFunc(this.registry[e])})}initializeBackend(e){let t=this.registryFactory[e];if(t==null)throw new Error(`Cannot initialize backend ${e}, no registration found.`);try{let n=t.factory();if(n&&!(n instanceof nl)&&typeof n.then==\"function\"){let s=++this.pendingBackendInitId,r=n.then(a=>s(sthis.registryFactory[t].priority-this.registryFactory[e].priority)}initializeBackendsAndReturnBest(){let e=this.getSortedBackends();for(let t=0;tthis.startScope(n),()=>this.endScope(s),()=>(s=t(),s instanceof Promise&&console.error(\"Cannot return a Promise inside of tidy.\"),s))}scopedRun(e,t,n){e();try{let s=n();return t(),s}catch(s){throw t(),s}}nextTensorId(){return tm.nextTensorId++}nextVariableId(){return tm.nextVariableId++}clone(e){let t=M.runKernel(Ba,{x:e}),n={x:e},s=a=>({x:()=>{let i=\"float32\",o={x:a},u={dtype:i};return M.runKernel(Na,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,!(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})}shouldCheckForMemLeaks(){return this.ENV.getBool(\"IS_TEST\")}checkKernelForMemLeak(e,t,n){let s=this.backend.numDataIds(),r=0;n.forEach(o=>{r+=o.dtype===\"complex64\"?3:1});let a=this.state.numDataMovesStack[this.state.numDataMovesStack.length-1],i=s-t-r-a;if(i>0)throw new Error(`Backend '${this.backendName}' has an internal memory leak (${i} data ids) after running '${e}'`)}runKernelFunc(e){let t,n=[],s=this.isTapeOn(),r=this.state.numBytes,a=this.state.numTensors;this.shouldCheckForMemLeaks()&&this.state.numDataMovesStack.push(0);let i;this.backendName==null&&this.backend;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=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:T,dtype:N}=x;return this.makeTensorFromDataId(k,T,N)});if(s){let x=this.getTensorsForGradient(h,f,v);n=this.saveTensorsForBackwardMode(x)}return v}}else{let{forwardFunc:h}=e,f=m=>{!s||(n=m.map(g=>this.keep(this.clone(g))))};i=()=>{let m=this.backend.numDataIds();o=this.tidy(()=>h(this.backend,f));let g=Array.isArray(o)?o:[o];return this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(u,m,g),g}}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]}saveTensorsForBackwardMode(e){return e.map(n=>this.keep(this.clone(n)))}getTensorsForGradient(e,t,n){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]);let o=n.filter((u,l)=>a[l]);return i.concat(o)}return[]}makeTensor(e,t,n,s){if(e==null)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=>Dl(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=Xw(r);this.state.numBytes+=u-o.bytes,o.bytes=u}return i}makeTensorFromDataId(e,t,n,s){n=n||\"float32\";let r=new et(t,n,e,this.nextTensorId());return this.trackTensor(r,s),r}makeVariable(e,t=!0,n,s){n=n||this.nextVariableId().toString(),s!=null&&s!==e.dtype&&(e=e.cast(s));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}trackTensor(e,t){this.state.numTensors++,e.dtype===\"string\"&&this.state.numStringTensors++;let n=0;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)}removeDataId(e,t){this.state.tensorInfo.has(e)&&this.state.tensorInfo.get(e).backend===t&&(this.state.tensorInfo.delete(e),this.state.numDataBuffers--)}disposeTensor(e){if(!this.state.tensorInfo.has(e.dataId))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*Xf(e.dtype);this.state.numBytes-=n}t.backend.disposeData(e.dataId)&&this.removeDataId(e.dataId,t.backend)}disposeVariables(){for(let e in this.state.registeredVariables){let t=this.state.registeredVariables[e];this.disposeVariable(t)}}disposeVariable(e){this.disposeTensor(e),this.state.registeredVariables[e.name]!=null&&delete this.state.registeredVariables[e.name]}memory(){let e=this.backend.memory();return e.numTensors=this.state.numTensors,e.numDataBuffers=this.state.numDataBuffers,e.numBytes=this.state.numBytes,this.state.numStringTensors>0&&(e.unreliable=!0,e.reasons==null&&(e.reasons=[]),e.reasons.push(\"Memory usage by string tensors is approximate (2 bytes per character)\")),e}async profile(e){this.state.profiling=!0;let t=this.state.numBytes,n=this.state.numTensors;this.state.activeProfile.kernels=[],this.state.activeProfile.result=await e(),this.state.profiling=!1,this.state.activeProfile.peakBytes=Math.max(...this.state.activeProfile.kernels.map(s=>s.totalBytesSnapshot)),this.state.activeProfile.newBytes=this.state.numBytes-t,this.state.activeProfile.newTensors=this.state.numTensors-n;for(let s of this.state.activeProfile.kernels)s.kernelTimeMs=await s.kernelTimeMs,s.extraInfo=await s.extraInfo;return this.state.activeProfile}isTapeOn(){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=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=Hd(p.size,p.dtype);return this.makeTensor(d,p.shape,p.dtype)}return l}),s(u.length>1?u:u[0],r,a))),this.state.activeTape.push(i)}keep(e){return e.kept=!0,e}startTape(){this.state.gradientDepth===0&&(this.state.activeTape=[]),this.state.gradientDepth++}endTape(){this.state.gradientDepth--}startScope(e){let t={track:[],name:\"unnamed scope\",id:this.state.nextScopeId++};e&&(t.name=e),this.state.scopeStack.push(t),this.state.activeScope=t}endScope(e){let t=Rg(e),n=new Set(t.map(r=>r.id));for(let r=0;r{!r.kept&&r.scopeId===s.id&&this.track(r)})}gradients(e,t,n,s=!1){if(O(t.length>0,()=>\"gradients() received an empty list of xs.\"),n!=null&&n.dtype!==\"float32\")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=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?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)l.dispose()}),this.state.activeTape=null),{value:r,grads:o}})}customGrad(e){return O(hr(e),()=>\"The f passed in customGrad(f) must be a function.\"),(...t)=>{O(t.every(i=>i instanceof et),()=>\"The args passed in customGrad(f)(x1, x2,...) must all be tensors\");let n,s={};t.forEach((i,o)=>{s[o]=i});let r=(i,o)=>(n=e(...t,o),O(n.value instanceof et,()=>\"The function f passed in customGrad(f) must return an object where `obj.value` is a tensor\"),O(hr(n.gradFunc),()=>\"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function.\"),n.value),a=(i,o)=>{let u=n.gradFunc(i,o),l=Array.isArray(u)?u:[u];O(l.length===t.length,()=>\"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns the same number of tensors as inputs passed to f(...).\"),O(l.every(p=>p instanceof et),()=>\"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors.\");let c={};return l.forEach((p,d)=>{c[d]=()=>p}),c};return this.runKernelFunc({forwardFunc:r,backwardsFunc:a,inputs:s})}}readSync(e){return this.state.tensorInfo.get(e).backend.readSync(e)}read(e){return this.state.tensorInfo.get(e).backend.read(e)}readToGPU(e,t){return this.state.tensorInfo.get(e).backend.readToGPU(e,t)}async time(e){let t=Uu(),n=await this.backend.time(e);return n.wallMs=Uu()-t,n}track(e){return this.state.activeScope!=null&&(e.scopeId=this.state.activeScope.id,this.state.activeScope.track.push(e)),e}get registeredVariables(){return this.state.registeredVariables}reset(){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}},Dg=tm;Dg.nextTensorId=0;Dg.nextVariableId=0;function r_(e){let t=ng(pt(e),\"float32\");return M.makeTensor(t,e,\"float32\")}function ck(){let e=ek();if(e._tfengine==null){let t=new S$(e);e._tfengine=new Dg(t)}return $$(e._tfengine.ENV),Y$(()=>e._tfengine),e._tfengine}var M=ck();function a_(e,t){let n={a:e,b:t};return M.runKernel(Ir,n)}var dp={};Ae(dp,{isBrowser:()=>dk,isMobile:()=>u_,mockIsMobile:()=>o_});function i_(){return typeof navigator!=\"undefined\"&&navigator!=null}var nm;function o_(e){nm=e}function u_(e){if(nm!==void 0)return nm;if(e||i_()){if(e||(e=navigator),e.product===\"ReactNative\")return!0;let t=e.userAgent||e.vendor||(typeof window!=\"undefined\"?window.opera:\"\");if(!t){let n=e;return n.userAgentData&&n.userAgentData.mobile}return/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(t)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(t.substr(0,4))}return!1}function dk(){return typeof window!=\"undefined\"&&window.document!=null||typeof WorkerGlobalScope!=\"undefined\"}var jn=X();jn.registerFlag(\"DEBUG\",()=>!1,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.\")});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\",()=>!1);jn.registerFlag(\"TENSORLIKE_CHECK_SHAPE_CONSISTENCY\",()=>jn.getBool(\"DEBUG\"));jn.registerFlag(\"DEPRECATION_WARNINGS_ENABLED\",()=>!0);jn.registerFlag(\"IS_TEST\",()=>!1);jn.registerFlag(\"CHECK_COMPUTATION_FOR_ERRORS\",()=>!0);jn.registerFlag(\"WRAP_TO_IMAGEBITMAP\",()=>!1);jn.registerFlag(\"ENGINE_COMPILE_ONLY\",()=>!1);function Rs(e,t){let n=e;if(Qt(e))return t===\"string\"?[]:[e.length];if(!Array.isArray(e))return[];let s=[];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\")&&pk(e,s,[]),s}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=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);!Qt(e)&&!Array.isArray(e)&&(e=[e]);let o=r!==\"string\"?lp(e,r):sa(e,[],!0);return M.makeTensor(o,a,r)}function Gu(e,t,n,s=\"numeric\"){if(!Array.isArray(e))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 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+l_;let r=(...a)=>{M.startScope(n);try{let i=s(...a);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:!0}),r}function c_(e,t){let n=_(e,\"real\",\"complex\"),s=_(t,\"imag\",\"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(jd,r)}var oa=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(!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){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`Error creating a new Tensor. Inferred shape (${n}) does not match the provided shape (${t}). `)}}return!Qt(e)&&!Array.isArray(e)&&(e=[e]),t=t||n,e=s!==\"string\"?lp(e,s):sa(e,[],!0),M.makeTensor(e,t,s)}function fs(e,t,n){let s=Rs(e,n);return Nr(e,t,s,n)}var sm={float32:4,float16:2,int32:4,uint16:2,uint8:1,bool:1,complex64:8},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{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{if(t+=a.byteLength,n.push(a.byteLength===a.buffer.byteLength?a:new a.constructor(a)),!(a instanceof Float32Array||a instanceof Int32Array||a instanceof Uint8Array))throw new Error(`Unsupported TypedArray subtype: ${a.constructor.name}`)});let s=new Uint8Array(t),r=0;return n.forEach(a=>{s.set(new Uint8Array(a.buffer),r),r+=a.byteLength}),s.buffer}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 h_(e){if(Fg)return Buffer.from(e).toString(\"base64\");let t=new Uint8Array(e),n=\"\";for(let s=0,r=t.length;s{t+=r.byteLength});let n=new Uint8Array(t),s=0;return e.forEach(r=>{n.set(new Uint8Array(r),s),s+=r.byteLength}),n.buffer}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 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 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);n.weightSpecs=s,n.weightData=r}return e.signature!=null&&(n.signature=e.signature),e.userDefinedMetadata!=null&&(n.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(n.modelInitializer=e.modelInitializer),n}function Fl(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:ux(JSON.stringify(e.modelTopology)),weightSpecsBytes:e.weightSpecs==null?0:ux(JSON.stringify(e.weightSpecs)),weightDataBytes:e.weightData==null?0:e.weightData.byteLength}}function m_(){let e=n=>{let s=n<<13,r=0;for(;(s&8388608)===0;)r-=8388608,s<<=1;return s&=-8388609,r+=947912704,s|r},t=new Uint32Array(2048);t[0]=0;for(let n=1;n<1024;n++)t[n]=e(n);for(let n=1024;n<2048;n++)t[n]=939524096+(n-1024<<13);return t}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++)e[t]=t<<23;for(let t=33;t<63;t++)e[t]=2147483648+(t-32<<23);return e}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 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>10]+(o&1023)]+t[o>>10];a[i]=u}return new Float32Array(r)}}var xt=class{constructor(){this.saveRouters=[],this.loadRouters=[]}static getInstance(){return xt.instance==null&&(xt.instance=new xt),xt.instance}static registerSaveRouter(e){xt.getInstance().saveRouters.push(e)}static registerLoadRouter(e){xt.getInstance().loadRouters.push(e)}static getSaveHandlers(e){return xt.getHandlers(e,\"save\")}static getLoadHandlers(e,t){return xt.getHandlers(e,\"load\",t)}static getHandlers(e,t,n){let s=[];return(t===\"load\"?xt.getInstance().loadRouters:xt.getInstance().saveRouters).forEach(a=>{let i=a(e,n);i!==null&&s.push(i)}),s}},v_=e=>xt.registerSaveRouter(e),x_=e=>xt.registerLoadRouter(e),w_=e=>xt.getSaveHandlers(e),k_=(e,t)=>xt.getLoadHandlers(e,t),rm=\"tensorflowjs\",am=1,Yr=\"models_store\",or=\"model_info_store\";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;if(t==null)throw new Error(\"The current browser does not appear to support IndexedDB.\");return t}function im(e){let t=e.result;t.createObjectStore(Yr,{keyPath:\"modelPath\"}),t.createObjectStore(or,{keyPath:\"modelPath\"})}var ua=class{constructor(e){if(this.indexedDB=mk(),e==null||!e)throw new Error(\"For IndexedDB, modelPath must not be null, undefined or empty.\");this.modelPath=e}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error(\"BrowserLocalStorage.save() does not support saving model topology in binary formats yet.\");return this.databaseAction(this.modelPath,e)}async load(){return this.databaseAction(this.modelPath)}databaseAction(e,t){return new Promise((n,s)=>{let r=this.indexedDB.open(rm,am);r.onupgradeneeded=()=>im(r),r.onsuccess=()=>{let a=r.result;if(t==null){let i=a.transaction(Yr,\"readonly\"),u=i.objectStore(Yr).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=Fl(t),o=a.transaction(or,\"readwrite\"),u=o.objectStore(or),l=u.put({modelPath:this.modelPath,modelArtifactsInfo:i}),c;l.onsuccess=()=>{c=a.transaction(Yr,\"readwrite\");let d=c.objectStore(Yr).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);f.onsuccess=()=>(a.close(),s(d.error)),f.onerror=m=>(a.close(),s(d.error))}},l.onerror=p=>(a.close(),s(l.error)),o.oncomplete=()=>{c==null?a.close():c.oncomplete=()=>a.close()}}},r.onerror=a=>s(r.error)})}};ua.URL_SCHEME=\"indexeddb://\";var gk=e=>X().getBool(\"IS_BROWSER\")&&!Array.isArray(e)&&e.startsWith(ua.URL_SCHEME)?I_(e.slice(ua.URL_SCHEME.length)):null;xt.registerSaveRouter(gk);xt.registerLoadRouter(gk);function I_(e){return new ua(e)}function S_(e){return e.startsWith(ua.URL_SCHEME)?e.slice(ua.URL_SCHEME.length):e}var C_=class{constructor(){this.indexedDB=mk()}async listModels(){return new Promise((e,t)=>{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={};for(let u of i.result)o[u.modelPath]=u.modelArtifactsInfo;e(o)},i.onerror=o=>(s.close(),t(i.error)),r.oncomplete=()=>s.close()},n.onerror=s=>t(n.error)})}async removeModel(e){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(Yr,\"readwrite\");let d=u.objectStore(Yr).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))}},o.onerror=l=>(r.close(),n(o.error)),a.oncomplete=()=>{u==null?r.close():u.oncomplete=()=>r.close()}},s.onerror=r=>n(s.error)})}},Gs=\"/\",Ui=\"tensorflowjs_models\",bk=\"info\",N_=\"model_topology\",T_=\"weight_specs\",$_=\"weight_data\",__=\"model_metadata\";function yk(e){return{info:[Ui,e,bk].join(Gs),topology:[Ui,e,N_].join(Gs),weightSpecs:[Ui,e,T_].join(Gs),weightData:[Ui,e,$_].join(Gs),modelMetadata:[Ui,e,__].join(Gs)}}function vk(e){for(let t of Object.values(e))window.localStorage.removeItem(t)}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 E_(e){return e.startsWith(la.URL_SCHEME)?e.slice(la.URL_SCHEME.length):e}var la=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=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=Fl(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,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 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}.`)}}}async load(){let e=JSON.parse(this.LS.getItem(this.keys.info));if(e==null)throw new Error(`In local storage, there is no model with name '${this.modelPath}'`);if(e.modelTopologyType!==\"JSON\")throw new Error(\"BrowserLocalStorage does not support loading non-JSON model topology yet.\");let t={},n=JSON.parse(this.LS.getItem(this.keys.topology));if(n==null)throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`);t.modelTopology=n;let s=JSON.parse(this.LS.getItem(this.keys.weightSpecs));if(s==null)throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`);t.weightSpecs=s;let r=this.LS.getItem(this.keys.modelMetadata);if(r!=null){let i=JSON.parse(r);t.format=i.format,t.generatedBy=i.generatedBy,t.convertedBy=i.convertedBy,i.signature!=null&&(t.signature=i.signature),i.userDefinedMetadata!=null&&(t.userDefinedMetadata=i.userDefinedMetadata),i.modelInitializer!=null&&(t.modelInitializer=i.modelInitializer),i.trainingConfig!=null&&(t.trainingConfig=i.trainingConfig)}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=f_(a),t}};la.URL_SCHEME=\"localstorage://\";var xk=e=>X().getBool(\"IS_BROWSER\")&&!Array.isArray(e)&&e.startsWith(la.URL_SCHEME)?R_(e.slice(la.URL_SCHEME.length)):null;xt.registerSaveRouter(xk);xt.registerLoadRouter(xk);function R_(e){return new la(e)}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=Ui+Gs,n=Gs+bk;for(let s=0;s\"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){let t=this.getInstance().managers[e];if(t==null)throw new Error(`Cannot find model manager for scheme '${e}'`);return t}static getSchemes(){return Object.keys(this.getInstance().managers)}};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 wk(e,t,n=!1){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=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 zn.getManager(o).removeModel(u),p.modelArtifactsInfo}async function F_(){let e=zn.getSchemes(),t={};for(let n of e){let s=await zn.getManager(n).listModels();for(let r in s){let a=n+qi+r;t[a]=s[r]}}return t}async function O_(e){let t=td(e);return zn.getManager(t.scheme).removeModel(t.path)}async function P_(e,t){return wk(e,t,!1)}async function z_(e,t){return wk(e,t,!0)}var M_=class{fetch(e,t){return fetch(e,t)}now(){return performance.now()}encode(e,t){if(t!==\"utf-8\"&&t!==\"utf8\")throw new Error(`Browser's encoder only supports utf-8, but got ${t}`);return this.textEncoder==null&&(this.textEncoder=new TextEncoder),this.textEncoder.encode(e)}decode(e,t){return new TextDecoder(t).decode(e)}};if(X().get(\"IS_BROWSER\")){X().setPlatform(\"browser\",new M_);try{zn.registerManager(la.URL_SCHEME,new D_)}catch(e){}try{zn.registerManager(ua.URL_SCHEME,new C_)}catch(e){}}var L_={importFetch:()=>qT()},Pf,B_=class{constructor(){this.util=jT(),this.textEncoder=new this.util.TextEncoder}fetch(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();return e[0]*1e3+e[1]/1e6}encode(e,t){if(t!==\"utf-8\"&&t!==\"utf8\")throw new Error(`Node built-in encoder only supports utf-8, but got ${t}`);return this.textEncoder.encode(e)}decode(e,t){return e.length===0?\"\":new this.util.TextDecoder(t).decode(e)}};X().get(\"IS_NODE\")&&!X().get(\"IS_BROWSER\")&&X().setPlatform(\"node\",new B_);function De(e,t=\"float32\",n){return t=t||\"float32\",sg(e),new Vt(e,t,n)}function V_(e,t){let n=_(e,\"x\",\"cast\");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(Na,s,r)}var ce=L({cast_:V_});function W_(e){let n={x:_(e,\"x\",\"clone\",\"string_or_numeric\")};return M.runKernel(Ba,n)}var lr=L({clone_:W_});function U_(e,t=!1){console.log(e.toString(t))}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:()=>Fl,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\",q_=\".json\",j_=\".weights.bin\";function cx(e){return new Promise(t=>setTimeout(t)).then(e)}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(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\")throw new Error(\"Browser downloads are not supported in this environment since `document` is not present\");let t=window.URL.createObjectURL(new Blob([e.weightData],{type:\"application/octet-stream\"}));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=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 cx(()=>i.dispatchEvent(new MouseEvent(\"click\")))}return{modelArtifactsInfo:Fl(e)}}}},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}`);this.jsonFile=e[0],this.weightsFiles=e.slice(1)}async load(){return new Promise((e,t)=>{let n=new FileReader;n.onload=s=>{let r=JSON.parse(s.target.result),a=r.modelTopology;if(a==null){t(new Error(`modelTopology field is missing from file ${this.jsonFile.name}`));return}if(r.weightsManifest==null){t(new Error(`weightManifest field is missing from file ${this.jsonFile.name}`));return}if(this.weightsFiles.length===0){e({modelTopology:a});return}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)})}loadWeights(e){let t=[],n=[];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,Og(a)])}loadWeightsFile(e,t){return new Promise((n,s)=>{let r=new FileReader;r.onload=a=>{let i=a.target.result;n(i)},r.onerror=a=>s(`Failed to weights data from file of path '${e}'.`),r.readAsArrayBuffer(t)})}checkManifestAndWeightFiles(e){let t=[],n=this.weightsFiles.map(r=>lx(r.name)),s={};for(let r of e)r.paths.forEach(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)throw new Error(`Weight file with basename '${i}' is not provided.`);s[a]=this.weightsFiles[n.indexOf(i)]});if(t.length!==this.weightsFiles.length)throw new Error(`Mismatch in the number of files in weights manifest (${t.length}) and the number of weight files provided (${this.weightsFiles.length}).`);return s}},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 Q_(e){return new K_(e)}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);return t(c),l}),u);function i(u){O(u!=null&&Array.isArray(u)&&u.length>0,()=>\"promises must be a none empty array\")}function o(u,l){O(u>=0&&u<=1,()=>`Progress fraction must be in range [0, 1], but got startFraction ${u}`),O(l>=0&&l<=1,()=>`Progress fraction must be in range [0, 1], but got endFraction ${l}`),O(l>=u,()=>`startFraction must be no more than endFraction, but got startFraction ${u} and endFraction ${l}`)}return Promise.all(e.map(a))}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:!0})),r=0,a=.5,o=(t.onProgress==null?await Promise.all(s):await dx(s,t.onProgress,r,a)).map(p=>p.arrayBuffer()),u=.5,l=1;return t.onProgress==null?await Promise.all(o):await dx(o,t.onProgress,u,l)}async function Z_(e,t=\"\",n,s){return Ik(i=>kk(i,{requestInit:s}))(e,t,n)}function Ik(e){return async(t,n=\"\",s)=>{let r=t.map(()=>!1),a={},i=s!=null?s.map(()=>!1):[],o=[];if(t.forEach((h,f)=>{let m=0;h.weights.forEach(g=>{let b=\"quantization\"in g?g.quantization.dtype:g.dtype,y=sm[b]*pt(g.shape),v=()=>{r[f]=!0,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]=!0)}):v(),o.push(g.name),m+=y})}),!i.every(h=>h)){let h=s.filter((f,m)=>!i[m]);throw new Error(`Could not find weights in manifest with names: ${h.join(\", \")}. \nManifest JSON has weights with names: ${o.join(\", \")}.`)}let u=r.reduce((h,f,m)=>(f&&h.push(m),h),[]),l=[];u.forEach(h=>{t[h].paths.forEach(f=>{let m=n+(n.endsWith(\"/\")?\"\":\"/\")+f;l.push(m)})});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{let k=g.slice(x.groupOffset,x.groupOffset+x.sizeBytes),T=hk(k,[x.manifestEntry]);for(let N in T)p[N]=T[N]}),d+=f}),p}}var J_=\"application/octet-stream\",eA=\"application/json\",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.\");this.requestInit=t.requestInit||{}}async save(e){if(e.modelTopology instanceof ArrayBuffer)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=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:Fl(e),responses:[r]};throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${r.status}.`)}async load(){let e=await this.fetch(this.path,this.requestInit);if(!e.ok)throw new Error(`Request to ${this.path} failed with status code ${e.status}. Please verify this URL points to the model JSON of the model to load.`);let t;try{t=await e.json()}catch(r){let a=`Failed to parse model JSON of response from ${this.path}.`;throw this.path.endsWith(\".pb\")?a+=\" Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository.\":a+=\" Please make sure the server is serving valid JSON for this request.\",new Error(a)}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 Pg(t,r=>this.loadWeights(r))}async loadWeights(e){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=[];for(let l of e)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 kk(i,{requestInit:this.requestInit,fetchFunc:this.fetch,onProgress:this.onProgress});return[a,Og(u)]}};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 um(e){return e.match(zg.URL_SCHEME_REGEX)!=null}var Sk=(e,t)=>{if(typeof fetch==\"undefined\"&&(t==null||t.fetchFunc==null))return null;{let n=!0;if(Array.isArray(e)?n=e.every(s=>um(s)):n=um(e),n)return Mg(e,t)}return null};xt.registerSaveRouter(Sk);xt.registerLoadRouter(Sk);function Mg(e,t){return new zg(e,t)}function nA(e,t){return Mg(e,t)}var zf=class{constructor(e){this.modelArtifacts=e}async load(){return this.modelArtifacts}},sA=class{constructor(e){this.saveHandler=e}async save(e){return this.saveHandler(e)}};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 aA(e){return new sA(e)}var iA={};Ae(iA,{confusionMatrix:()=>dA});function oA(e,t,n=!1,s=!1){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(Ca,i,o)}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($o,a,i)}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`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(pi,s,r)}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=vd(ce(s,\"int32\"),n),i=vd(ce(r,\"int32\"),n),o=qe(a),u=We(o,i);return ce(u,\"int32\")}var dA=L({confusionMatrix_:cA}),jo={};Ae(jo,{assertAndGetBroadcastShape:()=>ot,getBroadcastDims:()=>Ck,getReductionAxes:()=>_t});function Ck(e,t){let n=e.length,s=[];for(let r=0;r1&&i===1&&s.unshift(a)}return s}function _t(e,t){let n=[];for(let s=0;s1)&&n.unshift(a)}return n}function ot(e,t){let n=[],s=Math.max(e.length,t.length);for(let r=0;rvA,fromPixelsAsync:()=>bA,toPixels:()=>yA});function pA(e,t,n){if(wa(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 Nr(e,t,s,n)}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)throw new Error(\"pixels passed to tf.browser.fromPixels() can not be null\");let n=!1,s=!1,r=!1,a=!1,i=!1,o=!1;if(e.data instanceof Uint8Array)n=!0;else if(typeof ImageData!=\"undefined\"&&e instanceof ImageData)s=!0;else if(typeof HTMLVideoElement!=\"undefined\"&&e instanceof HTMLVideoElement)r=!0;else if(typeof HTMLImageElement!=\"undefined\"&&e instanceof HTMLImageElement)a=!0;else if(e.getContext!=null)i=!0;else if(typeof ImageBitmap!=\"undefined\"&&e instanceof ImageBitmap)o=!0;else 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