From 748540a0ccb76279b272c57bfca169b6576c8d01 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 3 Jun 2021 09:53:11 -0400 Subject: [PATCH] update gaze strength calculations --- dist/human.esm-nobundle.js | 10916 ++++- dist/human.esm-nobundle.js.map | 4 +- dist/human.esm.js | 67549 +++++++++++++++++++++++++++++- dist/human.esm.js.map | 4 +- dist/human.js | 67575 ++++++++++++++++++++++++++++++- dist/human.node-gpu.js | 22 +- dist/human.node-wasm.js | 22 +- dist/human.node.js | 22 +- dist/tfjs.esm.js | 59265 ++++++++++++++++++++++++++- dist/tfjs.esm.js.map | 2 +- src/config.ts | 8 +- src/face.ts | 18 +- 12 files changed, 200892 insertions(+), 4515 deletions(-) diff --git a/dist/human.esm-nobundle.js b/dist/human.esm-nobundle.js index dea382a3..61612c10 100644 --- a/dist/human.esm-nobundle.js +++ b/dist/human.esm-nobundle.js @@ -5,14 +5,10419 @@ author: ' */ -var fA=Object.defineProperty;var Me=Object.getOwnPropertyDescriptor;var Te=Object.getOwnPropertyNames;var Pe=Object.prototype.hasOwnProperty;var e0=(A,e)=>{for(var t in e)fA(A,t,{get:e[t],enumerable:!0})},h=(A,e,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Te(e))!Pe.call(A,o)&&o!=="default"&&fA(A,o,{get:()=>e[o],enumerable:!(t=Me(e,o))||t.enumerable});return A};var mA=(A,e,t)=>{if(!e.has(A))throw TypeError("Cannot "+t)};var q=(A,e,t)=>(mA(A,e,"read from private field"),t?t.call(A):e.get(A)),D=(A,e,t)=>{if(e.has(A))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(A):e.set(A,t)},Q=(A,e,t,o)=>(mA(A,e,"write to private field"),o?o.call(A,t):e.set(A,t),t);function Z(A,e){let t=A.endsWith("/")?"":"/",n=e.startsWith(".")||e.startsWith("/")||e.startsWith("http:")||e.startsWith("https:")||e.startsWith("file:")?`${e}`:`${A}${t}${e}`;if(!n.toLocaleLowerCase().includes(".json"))throw new Error(`Human: ModelPath Error: ${n} Expecting JSON file`);return n}function g(...A){let e=new Date,t=`${e.getHours().toString().padStart(2,"0")}:${e.getMinutes().toString().padStart(2,"0")}:${e.getSeconds().toString().padStart(2,"0")}.${e.getMilliseconds().toString().padStart(3,"0")}`;A&&console.log(t,"Human:",...A)}var N=()=>typeof performance!="undefined"?performance.now():parseInt((Number(process.hrtime.bigint())/1e3/1e3).toString());function U(...A){let e=t=>t&&typeof t=="object";return A.reduce((t,o)=>(Object.keys(o||{}).forEach(n=>{let x=t[n],a=o[n];Array.isArray(x)&&Array.isArray(a)?t[n]=x.concat(...a):e(x)&&e(a)?t[n]=U(x,a):t[n]=a}),t),{})}var hA={backend:"webgl",modelBasePath:"../models/",wasmPath:"../node_modules/@tensorflow/tfjs-backend-wasm/dist/",debug:!0,async:!0,warmup:"full",cacheSensitivity:.75,skipFrame:!1,filter:{enabled:!0,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:15,skipFrames:15,minConfidence:.2,iouThreshold:.1,return:!1},mesh:{enabled:!0,modelPath:"facemesh.json"},iris:{enabled:!0,modelPath:"iris.json"},description:{enabled:!0,modelPath:"faceres.json",skipFrames:16,minConfidence:.1},emotion:{enabled:!0,minConfidence:.1,skipFrames:17,modelPath:"emotion.json"}},body:{enabled:!0,modelPath:"movenet-lightning.json",maxDetected:1,minConfidence:.2,skipFrames:16},hand:{enabled:!0,rotation:!0,skipFrames:19,minConfidence:.1,iouThreshold:.1,maxDetected:2,landmarks:!0,detector:{modelPath:"handdetect.json"},skeleton:{modelPath:"handskeleton.json"}},object:{enabled:!1,modelPath:"mb3-centernet.json",minConfidence:.2,iouThreshold:.4,maxDetected:10,skipFrames:20}};function uA(){let A,e;if(typeof navigator!="undefined"){let t=navigator.userAgent.match(/\(([^()]+)\)/g);if(t&&t[0]){let o=t[0].match(/\(([^()]+)\)/g);A=o?o[0].replace(/\(|\)/g,""):"",e=navigator.userAgent.replace(t[0],""),A[1]&&(e=e.replace(t[1],"")),e=e.replace(/ /g," ")}}else typeof process!="undefined"&&(A=`${process.platform} ${process.arch}`,e=`NodeJS ${process.version}`);return{platform:A,agent:e}}var r={};e0(r,{data:()=>Re,version:()=>je});h(r,m2);h(r,h2);h(r,u2);h(r,p2);h(r,b2);h(r,g2);import*as pA from"@tensorflow/tfjs/package.json";import*as bA from"@tensorflow/tfjs-core/package.json";import*as gA from"@tensorflow/tfjs-data/package.json";import*as MA from"@tensorflow/tfjs-layers/package.json";import*as TA from"@tensorflow/tfjs-converter/package.json";import{version_cpu as ze}from"@tensorflow/tfjs-backend-cpu/dist/index.js";import{version_webgl as ve}from"@tensorflow/tfjs-backend-webgl/dist/index.js";import{version_wasm as Ee}from"@tensorflow/tfjs-backend-wasm/dist/index.js";import*as m2 from"@tensorflow/tfjs-core/dist/index.js";import*as h2 from"@tensorflow/tfjs-layers/dist/index.js";import*as u2 from"@tensorflow/tfjs-converter/dist/index.js";import*as Re from"@tensorflow/tfjs-data/dist/index.js";import*as p2 from"@tensorflow/tfjs-backend-cpu/dist/index.js";import*as b2 from"@tensorflow/tfjs-backend-webgl/dist/index.js";import*as g2 from"@tensorflow/tfjs-backend-wasm/dist/index.js";var je={tfjs:(pA==null?void 0:pA.version)||void 0,"tfjs-core":(bA==null?void 0:bA.version)||void 0,"tfjs-data":(gA==null?void 0:gA.version)||void 0,"tfjs-layers":(MA==null?void 0:MA.version)||void 0,"tfjs-converter":(TA==null?void 0:TA.version)||void 0,"tfjs-backend-cpu":ze||void 0,"tfjs-backend-webgl":ve||void 0,"tfjs-backend-wasm":Ee||void 0};var J={name:"humangl",priority:99,canvas:null,gl:null,width:1024,height:1024,webGLattr:{alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!1,desynchronized:!0}};function PA(){if(!r.findBackend(J.name)){g("backend registration:",J.name);try{J.canvas=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(J.width,J.height):document.createElement("canvas")}catch(A){g("error: cannot create canvas:",A);return}try{J.gl=J.canvas.getContext("webgl2",J.webGLattr)}catch(A){g("error: cannot get WebGL2 context:",A);return}try{r.setWebGLContext(2,J.gl)}catch(A){g("error: cannot set WebGL2 context:",A);return}try{let A=new r.GPGPUContext(J.gl);r.registerBackend(J.name,()=>new r.MathBackendWebGL(A),J.priority)}catch(A){g("error: cannot register WebGL backend:",A);return}try{r.getKernelsForBackend("webgl").forEach(e=>{let t={...e,backendName:J.name};r.registerKernel(t)})}catch(A){g("error: cannot update WebGL backend registration:",A);return}try{r.ENV.set("WEBGL_VERSION",2)}catch(A){g("error: cannot set WebGL backend flags:",A);return}g("backend registered:",J.name)}}var u5={};e0(u5,{load:()=>h5,predict:()=>m5,triangulation:()=>OA,uvmap:()=>LA});function zA(A,e){let t=[A.startPoint[0]*e[0],A.startPoint[1]*e[1]],o=[A.endPoint[0]*e[0],A.endPoint[1]*e[1]];return{startPoint:t,endPoint:o}}function v0(A){return[Math.abs(A.endPoint[0]-A.startPoint[0]),Math.abs(A.endPoint[1]-A.startPoint[1])]}function m0(A){return[A.startPoint[0]+(A.endPoint[0]-A.startPoint[0])/2,A.startPoint[1]+(A.endPoint[1]-A.startPoint[1])/2]}function h0(A,e,t){let o=e.shape[1],n=e.shape[2],x=[[A.startPoint[1]/o,A.startPoint[0]/n,A.endPoint[1]/o,A.endPoint[0]/n]];return r.image.cropAndResize(e,x,[0],t)}function O0(A,e=1.5){let t=m0(A),o=v0(A),n=[e*o[0]/2,e*o[1]/2],x=[t[0]-n[0],t[1]-n[1]],a=[t[0]+n[0],t[1]+n[1]];return{startPoint:x,endPoint:a,landmarks:A.landmarks}}function L0(A){let e=m0(A),t=v0(A),n=Math.max(...t)/2,x=[Math.round(e[0]-n),Math.round(e[1]-n)],a=[Math.round(e[0]+n),Math.round(e[1]+n)];return{startPoint:x,endPoint:a,landmarks:A.landmarks}}function a5(A){let e=A.map(x=>x[0]),t=A.map(x=>x[1]),o=[Math.min(...e),Math.min(...t)],n=[Math.max(...e),Math.max(...t)];return{startPoint:o,endPoint:n,landmarks:A}}var vA=A=>({startPoint:r.slice(A,[0,0],[-1,2]),endPoint:r.slice(A,[0,2],[-1,2])});var Z0=[[1,0,0],[0,1,0],[0,0,1]];function Se(A){return A-2*Math.PI*Math.floor((A+Math.PI)/(2*Math.PI))}function x5(A,e){let t=Math.PI/2-Math.atan2(-(e[1]-A[1]),e[0]-A[0]);return Se(t)}function EA(A,e){return[[1,0,A],[0,1,e],[0,0,1]]}function r0(A,e){let t=0;for(let o=0;o{let i=e.resizeBilinear([this.inputSize,this.inputSize]).div(127.5).sub(.5),c=this.model.execute(i),l;if(Array.isArray(c)){let d=c.sort((j,W)=>j.size-W.size),m=r.concat([d[0],d[2]],2),v=r.concat([d[1],d[3]],2);l=r.concat([v,m],1).squeeze(0)}else l=c.squeeze();let f=We(l,this.anchors,[this.inputSize,this.inputSize]),p=r.slice(l,[0,0],[-1,1]),E=r.sigmoid(p).squeeze().dataSync();return[l,f,E]}),x=await r.image.nonMaxSuppressionAsync(o,n,this.config.face.detector.maxDetected,this.config.face.detector.iouThreshold,this.config.face.detector.minConfidence),a=x.arraySync();x.dispose();let s=[];for(let y=0;ythis.config.face.detector.minConfidence){let c=r.slice(o,[a[y],0],[1,-1]),l=vA(c);c.dispose();let f=this.anchorsData[a[y]],p=r.tidy(()=>r.slice(t,[a[y],WA-1],[1,-1]).squeeze().reshape([WA,-1]));s.push({box:l,landmarks:p,anchor:f,confidence:i})}}return t.dispose(),o.dispose(),{boxes:s,scaleFactor:[e.shape[2]/this.inputSize,e.shape[1]/this.inputSize]}}};async function NA(A){let e=await r.loadGraphModel(Z(A.modelBasePath,A.face.detector.modelPath),{fromTFHub:A.face.detector.modelPath.includes("tfhub.dev")}),t=new kA(e,A);return!e||!e.modelUrl?g("load model failed:",A.face.detector.modelPath):A.debug&&g("load model:",e.modelUrl),t}var t0={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]},y5=[{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]}],E0=[[.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]],l0=[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 ke=[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],Ne=[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],Ie=[33,133,362,263,1,78,308],k2=ke.map(A=>E0[A]),N2=Ne.map(A=>E0[A]),I2=Ie.map(A=>E0[A]);var l5=t0.leftEyeLower0,c5=t0.rightEyeLower0,u0={leftBounds:[l5[0],l5[l5.length-1]],rightBounds:[c5[0],c5[c5.length-1]]},V0={count:468,mouth:13,symmetryLine:[13,t0.midwayBetweenEyes[0]]},IA={leftEye:0,rightEye:1,nose:2,mouth:3,leftEar:4,rightEar:5,symmetryLine:[3,2]},p0={upperCenter:3,lowerCenter:4,index:71,numCoordinates:76};function X0(A,e,t,o){for(let n=0;n[x[0]/this.meshSize*(l[0]-this.meshSize/2),x[1]/this.meshSize*(l[1]-this.meshSize/2),l[2]]),s=o!==0?H0(o,[0,0]):Z0,y=o!==0?a.map(l=>[...SA(l,s),l[2]]):a,i=o!==0?jA(n):Z0,c=[...m0({startPoint:t.startPoint,endPoint:t.endPoint}),1];return y.map(l=>[Math.round(l[0]+r0(c,i[0])),Math.round(l[1]+r0(c,i[1])),Math.round(l[2])])}getLeftToRightEyeDepthDifference(e){let t=e[u0.leftBounds[0]][2],o=e[u0.rightBounds[0]][2];return t-o}getEyeBox(e,t,o,n,x=!1){let a=L0(O0(a5([e[o],e[n]]),this.irisEnlarge)),s=v0(a),y=r.image.cropAndResize(t,[[a.startPoint[1]/this.meshSize,a.startPoint[0]/this.meshSize,a.endPoint[1]/this.meshSize,a.endPoint[0]/this.meshSize]],[0],[this.irisSize,this.irisSize]);return x&&r.ENV.flags.IS_BROWSER&&(y=r.image.flipLeftRight(y)),{box:a,boxSize:s,crop:y}}getEyeCoords(e,t,o,n=!1){let x=[];for(let a=0;a{let i=a;return y===2?i=n:y===4&&(i=x),[s[0],s[1],i]})}async predict(e,t){let o=!1,n;if((this.skipped===0||this.skipped>t.face.detector.skipFrames||!t.face.mesh.enabled||!t.skipFrame)&&(n=await this.boundingBoxDetector.getBoundingBoxes(e),this.skipped=0),t.skipFrame&&this.skipped++,!t.skipFrame||n&&n.boxes&&(!t.face.mesh.enabled||n.boxes.length!==this.detectedFaces&&this.detectedFaces!==t.face.detector.maxDetected)){this.storedBoxes=[],this.detectedFaces=0;for(let a of n.boxes)this.storedBoxes.push({startPoint:a.box.startPoint.dataSync(),endPoint:a.box.endPoint.dataSync(),landmarks:a.landmarks.arraySync(),confidence:a.confidence});this.storedBoxes.length>0&&(o=!0)}if(o){if(!n||!n.boxes||n.boxes.length===0)return this.storedBoxes=[],this.detectedFaces=0,null;for(let a=0;a{a.box.startPoint.dispose(),a.box.endPoint.dispose(),a.landmarks.dispose()});let x=r.tidy(()=>this.storedBoxes.map((a,s)=>{let y,i=0,c;if(t.face.detector.rotation&&t.face.mesh.enabled&&r.ENV.flags.IS_BROWSER){let[j,W]=a.landmarks.length>=V0.count?V0.symmetryLine:IA.symmetryLine;i=x5(a.landmarks[j],a.landmarks[W]);let P=m0({startPoint:a.startPoint,endPoint:a.endPoint}),u=[P[0]/e.shape[2],P[1]/e.shape[1]],M=r.image.rotateWithOffset(e,i,0,u);c=H0(-i,P),t.face.mesh.enabled?y=h0({startPoint:a.startPoint,endPoint:a.endPoint},M,[this.meshSize,this.meshSize]).div(255):y=h0({startPoint:a.startPoint,endPoint:a.endPoint},M,[this.boxSize,this.boxSize]).div(255)}else{c=Z0;let j=e.clone();t.face.mesh.enabled?y=h0({startPoint:a.startPoint,endPoint:a.endPoint},j,[this.meshSize,this.meshSize]).div(255):y=h0({startPoint:a.startPoint,endPoint:a.endPoint},j,[this.boxSize,this.boxSize]).div(255)}if(!t.face.mesh.enabled)return{mesh:[],box:a,faceConfidence:null,boxConfidence:a.confidence,confidence:a.confidence,image:y};let[,l,f]=this.meshDetector.execute(y),p=l.dataSync()[0];if(p=V0.count?V0.symmetryLine:IA.symmetryLine;i=x5(a.landmarks[j],a.landmarks[W]);let P=m0({startPoint:a.startPoint,endPoint:a.endPoint}),u=[P[0]/e.shape[2],P[1]/e.shape[1]],M=r.image.rotateWithOffset(e.toFloat(),i,0,u);c=H0(-i,P),y=h0({startPoint:a.startPoint,endPoint:a.endPoint},M,[this.meshSize,this.meshSize]).div(255)}let S={mesh:m,box:a,faceConfidence:p,boxConfidence:a.confidence,image:y};return this.storedBoxes[s]={...L0(a),confidence:a.confidence,faceConfidence:p},S}));return t.face.mesh.enabled&&(this.storedBoxes=this.storedBoxes.filter(a=>a.confidence>t.face.detector.minConfidence)),this.detectedFaces=x.length,x}};var V=[null,null,null],f5;async function m5(A,e){let t=await f5.predict(A,e),o=[],n=0;for(let x of t||[]){if(!x||x.isDisposedInternal)continue;let a=x.mesh.map(c=>[c[0]/(A.shape[2]||0),c[1]/(A.shape[1]||0),c[2]/f5.meshSize]),s={};if(x.mesh&&x.mesh.length>0)for(let c of Object.keys(t0))s[c]=t0[c].map(l=>x.mesh[l]);let y=x.box?[Math.trunc(Math.max(0,x.box.startPoint[0])),Math.trunc(Math.max(0,x.box.startPoint[1])),Math.trunc(Math.min(A.shape[2]||0,x.box.endPoint[0])-Math.max(0,x.box.startPoint[0])),Math.trunc(Math.min(A.shape[1]||0,x.box.endPoint[1])-Math.max(0,x.box.startPoint[1]))]:[0,0,0,0],i=x.box?[x.box.startPoint[0]/(A.shape[2]||0),x.box.startPoint[1]/(A.shape[1]||0),(x.box.endPoint[0]-x.box.startPoint[0])/(A.shape[2]||0),(x.box.endPoint[1]-x.box.startPoint[1])/(A.shape[1]||0)]:[0,0,0,0];o.push({id:n++,score:Math.round(100*x.faceConfidence||100*x.boxConfidence||0)/100,boxScore:Math.round(100*x.boxConfidence)/100,faceScore:Math.round(100*x.faceConfidence)/100,box:y,boxRaw:i,mesh:x.mesh,meshRaw:a,annotations:s,image:x.image,tensor:x.image}),x.coords&&x.coords.dispose()}return o}async function h5(A){return!V[0]&&A.face.enabled||!V[1]&&A.face.mesh.enabled||!V[2]&&A.face.iris.enabled?(V=await Promise.all([!V[0]&&A.face.enabled?NA(A):null,!V[1]&&A.face.mesh.enabled?r.loadGraphModel(Z(A.modelBasePath,A.face.mesh.modelPath),{fromTFHub:A.face.mesh.modelPath.includes("tfhub.dev")}):null,!V[2]&&A.face.iris.enabled?r.loadGraphModel(Z(A.modelBasePath,A.face.iris.modelPath),{fromTFHub:A.face.iris.modelPath.includes("tfhub.dev")}):null]),A.face.mesh.enabled&&(!V[1]||!V[1].modelUrl?g("load model failed:",A.face.mesh.modelPath):A.debug&&g("load model:",V[1].modelUrl)),A.face.iris.enabled&&(!V[2]||!V[2].modelUrl?g("load model failed:",A.face.iris.modelPath):A.debug&&g("load model:",V[2].modelUrl))):A.debug&&(V[0]&&g("cached model:",V[0].model.modelUrl),V[1]&&g("cached model:",V[1].modelUrl),V[2]&&g("cached model:",V[2].modelUrl)),f5=new d5(V[0],V[1],V[2]),V}var OA=l0,LA=E0;var M5={};e0(M5,{load:()=>g5,predict:()=>q0});var Oe=["angry","disgust","fear","happy","sad","surprise","neutral"],_,F0=[],ZA=0,p5=Number.MAX_SAFE_INTEGER,b5=[.2989,.587,.114];async function g5(A){return _?A.debug&&g("cached model:",_.modelUrl):(_=await r.loadGraphModel(Z(A.modelBasePath,A.face.emotion.modelPath)),!_||!_.modelUrl?g("load model failed:",A.face.emotion.modelPath):A.debug&&g("load model:",_.modelUrl)),_}async function q0(A,e,t,o){return _?p50?(p5++,F0[t]):(p5=0,new Promise(async n=>{let x=r.image.resizeBilinear(A,[_.inputs[0].shape[2],_.inputs[0].shape[1]],!1),[a,s,y]=r.split(x,3,3);x.dispose();let i=r.mul(a,b5[0]),c=r.mul(s,b5[1]),l=r.mul(y,b5[2]);a.dispose(),s.dispose(),y.dispose();let f=r.addN([i,c,l]);i.dispose(),c.dispose(),l.dispose();let p=r.tidy(()=>f.sub(.5).mul(2));f.dispose();let E=[];if(e.face.emotion.enabled){let d=await _.predict(p),m=d.dataSync();r.dispose(d);for(let v=0;ve.face.emotion.minConfidence&&E.push({score:Math.min(.99,Math.trunc(100*m[v])/100),emotion:Oe[v]});E.sort((v,S)=>S.score-v.score)}p.dispose(),F0[t]=E,ZA=o,n(E)})):null}var E5={};e0(E5,{enhance:()=>v5,load:()=>P5,match:()=>VA,predict:()=>B0,similarity:()=>z5});var $,C0=[],HA=0,T5=Number.MAX_SAFE_INTEGER;async function P5(A){let e=Z(A.modelBasePath,A.face.description.modelPath);return $?A.debug&&g("cached model:",e):($=await r.loadGraphModel(e),$?A.debug&&g("load model:",e):g("load model failed:",A.face.description.modelPath)),$}function z5(A,e,t=2){if(!A||!e||(A==null?void 0:A.length)===0||(e==null?void 0:e.length)===0||(A==null?void 0:A.length)!==(e==null?void 0:e.length))return 0;let o=5*A.map((x,a)=>Math.abs(A[a]-e[a])**t).reduce((x,a)=>x+a,0)**(1/t);return Math.max(0,100-o)/100}function VA(A,e,t=0){let o={similarity:0,name:"",source:"",embedding:[]};if(!A||!e||!Array.isArray(A)||!Array.isArray(e))return o;for(let n of e)if(n.embedding&&n.name){let x=z5(A,n.embedding);x>t&&x>o.similarity&&(o={...n,similarity:x})}return o}function v5(A){return r.tidy(()=>{let t=A.image||A.tensor||A;if(!(t instanceof r.Tensor))return null;let o=[[.05,.15,.85,.85]];return $.inputs[0].shape?(t.shape.length===3?r.image.cropAndResize(r.expandDims(t,0),o,[0],[$.inputs[0].shape[2],$.inputs[0].shape[1]]):r.image.cropAndResize(t,o,[0],[$.inputs[0].shape[2],$.inputs[0].shape[1]])).mul(255):null})}async function B0(A,e,t,o){var n,x;return $?T50?(T5++,C0[t]):(T5=0,new Promise(async a=>{let s=v5(A),y,i={age:0,gender:"unknown",genderScore:0,descriptor:[]};e.face.description.enabled&&(y=await $.predict(s)),r.dispose(s),y&&(r.tidy(()=>{let c=y.find(d=>d.shape[1]===1).dataSync(),l=Math.trunc(200*Math.abs(c[0]-.5))/100;l>e.face.description.minConfidence&&(i.gender=c[0]<=.5?"female":"male",i.genderScore=Math.min(.99,l));let f=y.find(d=>d.shape[1]===100).argMax(1).dataSync()[0],p=y.find(d=>d.shape[1]===100).dataSync();i.age=Math.round(p[f-1]>p[f+1]?10*f-100*p[f-1]:10*f+100*p[f+1])/10;let E=y.find(d=>d.shape[1]===1024);i.descriptor=[...E.dataSync()]}),y.forEach(c=>r.dispose(c))),C0[t]=i,HA=o,a(i)})):null}var Le=(A,e)=>{let t=(f,p)=>Math.atan2(f[1]-p[1],f[0]-p[0]),o=[0,-.1],n=1,x=A[33][2]>A[263][2],a=x?A[473]:A[468],s=x?[(A[133][0]+A[33][0])/2,(A[133][1]+A[33][1])/2]:[(A[263][0]+A[362][0])/2,(A[263][1]+A[362][1])/2],y=x?[A[133][0]-A[33][0],A[23][1]-A[27][1]]:[A[263][0]-A[362][0],A[253][1]-A[257][1]],i=[(s[0]-a[0])/y[0]-o[0],n*(a[1]-s[1])/y[1]-o[1]],c=Math.sqrt(i[0]**2+i[1]**2);return c=Math.min(c,e[2]/2,e[3]/2),{bearing:(t([0,0],i)+Math.PI/2)%Math.PI,strength:c}},Ze=(A,e)=>{let t=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},o=(m,v)=>{let S=m[0]-v[0],j=m[1]-v[1],W=m[2]-v[2];return[S,j,W]},n=(m,v)=>{let S=m[1]*v[2]-m[2]*v[1],j=m[2]*v[0]-m[0]*v[2],W=m[0]*v[1]-m[1]*v[0];return[S,j,W]},x=m=>{let[v,S,j,W,P,u,M,T,b]=m,k,H,I;return W<1?W>-1?(I=Math.asin(W),H=Math.atan2(-M,v),k=Math.atan2(-u,P)):(I=-Math.PI/2,H=-Math.atan2(T,b),k=0):(I=Math.PI/2,H=Math.atan2(T,b),k=0),{pitch:2*-k,yaw:2*-H,roll:2*-I}},a=m=>{let v=(j,W,P,u)=>Math.atan2(u-W,P-j);return{pitch:v(m[10][1],m[10][2],m[152][1],m[152][2]),yaw:v(m[33][0],m[33][2],m[263][0],m[263][2]),roll:v(m[33][0],m[33][1],m[263][0],m[263][1])}},s=A.meshRaw;if(!s||s.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 y=Math.max(A.boxRaw[2]*e[0],A.boxRaw[3]*e[1])/1.5,i=[s[10],s[152],s[234],s[454]].map(m=>[m[0]*e[0]/y,m[1]*e[1]/y,m[2]]),c=t(o(i[1],i[0])),l=t(o(i[3],i[2])),f=t(n(l,c));l=n(c,f);let p=[l[0],l[1],l[2],c[0],c[1],c[2],f[0],f[1],f[2]],E=x(p),d=s.length===478?Le(s,A.box):{bearing:0,strength:0};return{angle:E,matrix:p,gaze:d}},R5=async(A,e)=>{var c,l,f,p,E,d;let t,o,n,x,a,s,y=[];A.state="run:face",t=N();let i=await m5(e,A.config);if(A.performance.face=Math.trunc(N()-t),!e.shape||e.shape.length!==4)return[];if(!i)return[];for(let m=0;mI5,predict:()=>N5});var R0=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],XA=R0.length,j0=R0.reduce((A,e,t)=>(A[e]=t,A),{}),He=[["leftHip","leftShoulder"],["leftElbow","leftShoulder"],["leftElbow","leftWrist"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["rightHip","rightShoulder"],["rightElbow","rightShoulder"],["rightElbow","rightWrist"],["rightHip","rightKnee"],["rightKnee","rightAnkle"],["leftShoulder","rightShoulder"],["leftHip","rightHip"]],Ve=He.map(([A,e])=>[j0[A],j0[e]]),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 qA(A){let e=A.reduce(({maxX:t,maxY:o,minX:n,minY:x},{position:{x:a,y:s}})=>({maxX:Math.max(t,a),maxY:Math.max(o,s),minX:Math.min(n,a),minY:Math.min(x,s)}),{maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY});return[e.minX,e.minY,e.maxX-e.minX,e.maxY-e.minY]}function CA(A,[e,t],[o,n]){let x=e/o,a=t/n,s=(i,c)=>({id:c,score:i.score,boxRaw:[i.box[0]/n,i.box[1]/o,i.box[2]/n,i.box[3]/o],box:[Math.trunc(i.box[0]*a),Math.trunc(i.box[1]*x),Math.trunc(i.box[2]*a),Math.trunc(i.box[3]*x)],keypoints:i.keypoints.map(({score:l,part:f,position:p})=>({score:l,part:f,position:[Math.trunc(p.x*a),Math.trunc(p.y*x)],positionRaw:[p.x/o,p.y/o]}))});return A.map((i,c)=>s(i,c))}var j5=class{constructor(e,t){this.priorityQueue=new Array(e),this.numberOfElements=-1,this.getElementValue=t}enqueue(e){this.priorityQueue[++this.numberOfElements]=e,this.swim(this.numberOfElements)}dequeue(){let e=this.priorityQueue[0];return this.exchange(0,this.numberOfElements--),this.sink(0),this.priorityQueue[this.numberOfElements+1]=null,e}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(e){for(;e>0&&this.less(Math.floor(e/2),e);)this.exchange(e,Math.floor(e/2)),e=Math.floor(e/2)}sink(e){for(;2*e<=this.numberOfElements;){let t=2*e;if(tt?t:A}function BA(A,e,t,o){let n=t-A,x=o-e;return n*n+x*x}function k5(A,e){return{x:A.x+e.x,y:A.y+e.y}}var U0=1,b0=16,Xe=50**2;function UA(A,e,t,o,n,x,a=2){let s=v=>({y:x.get(v.y,v.x,A),x:x.get(v.y,v.x,x.shape[2]/2+A)}),y=(v,S,j)=>({y:W5(Math.round(v.y/b0),0,S-1),x:W5(Math.round(v.x/b0),0,j-1)}),[i,c]=o.shape,l=y(e.position,i,c),f=s(l),E=k5(e.position,f);for(let v=0;v[j0[f],j0[p]]),a=x.map(([,f])=>f),s=x.map(([f])=>f),y=e.shape[2],i=a.length,c=new Array(y),l=w5(A.part,b0,t);c[A.part.id]={score:A.score,part:R0[A.part.id],position:l};for(let f=i-1;f>=0;--f){let p=a[f],E=s[f];c[p]&&!c[E]&&(c[E]=UA(f,c[p],E,e,t,n))}for(let f=0;fe){s=!1;break}if(!s)break}return s}function Ce(A,e){let[t,o,n]=e.shape,x=new j5(t*o*n,({score:a})=>a);for(let a=0;a{var a;let x=(a=n[o])==null?void 0:a.position;return x?BA(t,e,x.y,x.x)<=Xe:!1})}function Be(A,e){return e.reduce((o,{position:n,score:x},a)=>(JA(A,n,a)||(o+=x),o),0)/e.length}function YA(A,e,t,o,n,x){let a=[],s=Ce(x,e);for(;a.lengthp.score>x);let l=Be(a,c),f=qA(c);l>x&&a.push({keypoints:c,box:f,score:Math.round(100*l)/100})}return a}var Y,Ue=["MobilenetV1/offset_2/BiasAdd","MobilenetV1/heatmap_2/BiasAdd","MobilenetV1/displacement_fwd_2/BiasAdd","MobilenetV1/displacement_bwd_2/BiasAdd"];async function N5(A,e){let t=r.tidy(()=>{if(!Y.inputs[0].shape)return[];let s=A.resizeBilinear([Y.inputs[0].shape[2],Y.inputs[0].shape[1]]).toFloat().div(127.5).sub(1),i=Y.execute(s,Ue).map(c=>c.squeeze([0]));return i[1]=i[1].sigmoid(),i}),o=await Promise.all(t.map(a=>a.buffer()));for(let a of t)a.dispose();let n=await YA(o[0],o[1],o[2],o[3],e.body.maxDetected,e.body.minConfidence);return Y.inputs[0].shape?CA(n,[A.shape[1],A.shape[2]],[Y.inputs[0].shape[2],Y.inputs[0].shape[1]]):[]}async function I5(A){return Y?A.debug&&g("cached model:",Y.modelUrl):(Y=await r.loadGraphModel(Z(A.modelBasePath,A.body.modelPath)),!Y||!Y.modelUrl?g("load model failed:",A.body.modelPath):A.debug&&g("load model:",Y.modelUrl)),Y}var q5={};e0(q5,{load:()=>F5,predict:()=>X5});function J0(A){return[Math.abs(A.endPoint[0]-A.startPoint[0]),Math.abs(A.endPoint[1]-A.startPoint[1])]}function S0(A){return[A.startPoint[0]+(A.endPoint[0]-A.startPoint[0])/2,A.startPoint[1]+(A.endPoint[1]-A.startPoint[1])/2]}function GA(A,e,t){let o=e.shape[1],n=e.shape[2],x=[[A.startPoint[1]/o,A.startPoint[0]/n,A.endPoint[1]/o,A.endPoint[0]/n]];return r.image.cropAndResize(e,x,[0],t)}function KA(A,e){let t=[A.startPoint[0]*e[0],A.startPoint[1]*e[1]],o=[A.endPoint[0]*e[0],A.endPoint[1]*e[1]],n=A.palmLandmarks.map(x=>[x[0]*e[0],x[1]*e[1]]);return{startPoint:t,endPoint:o,palmLandmarks:n,confidence:A.confidence}}function Y0(A,e=1.5){let t=S0(A),o=J0(A),n=[e*o[0]/2,e*o[1]/2],x=[t[0]-n[0],t[1]-n[1]],a=[t[0]+n[0],t[1]+n[1]];return{startPoint:x,endPoint:a,palmLandmarks:A.palmLandmarks}}function G0(A){let e=S0(A),t=J0(A),n=Math.max(...t)/2,x=[e[0]-n,e[1]-n],a=[e[0]+n,e[1]+n];return{startPoint:x,endPoint:a,palmLandmarks:A.palmLandmarks}}var DA=[{x:.015625,y:.015625},{x:.015625,y:.015625},{x:.046875,y:.015625},{x:.046875,y:.015625},{x:.078125,y:.015625},{x:.078125,y:.015625},{x:.109375,y:.015625},{x:.109375,y:.015625},{x:.140625,y:.015625},{x:.140625,y:.015625},{x:.171875,y:.015625},{x:.171875,y:.015625},{x:.203125,y:.015625},{x:.203125,y:.015625},{x:.234375,y:.015625},{x:.234375,y:.015625},{x:.265625,y:.015625},{x:.265625,y:.015625},{x:.296875,y:.015625},{x:.296875,y:.015625},{x:.328125,y:.015625},{x:.328125,y:.015625},{x:.359375,y:.015625},{x:.359375,y:.015625},{x:.390625,y:.015625},{x:.390625,y:.015625},{x:.421875,y:.015625},{x:.421875,y:.015625},{x:.453125,y:.015625},{x:.453125,y:.015625},{x:.484375,y:.015625},{x:.484375,y:.015625},{x:.515625,y:.015625},{x:.515625,y:.015625},{x:.546875,y:.015625},{x:.546875,y:.015625},{x:.578125,y:.015625},{x:.578125,y:.015625},{x:.609375,y:.015625},{x:.609375,y:.015625},{x:.640625,y:.015625},{x:.640625,y:.015625},{x:.671875,y:.015625},{x:.671875,y:.015625},{x:.703125,y:.015625},{x:.703125,y:.015625},{x:.734375,y:.015625},{x:.734375,y:.015625},{x:.765625,y:.015625},{x:.765625,y:.015625},{x:.796875,y:.015625},{x:.796875,y:.015625},{x:.828125,y:.015625},{x:.828125,y:.015625},{x:.859375,y:.015625},{x:.859375,y:.015625},{x:.890625,y:.015625},{x:.890625,y:.015625},{x:.921875,y:.015625},{x:.921875,y:.015625},{x:.953125,y:.015625},{x:.953125,y:.015625},{x:.984375,y:.015625},{x:.984375,y:.015625},{x:.015625,y:.046875},{x:.015625,y:.046875},{x:.046875,y:.046875},{x:.046875,y:.046875},{x:.078125,y:.046875},{x:.078125,y:.046875},{x:.109375,y:.046875},{x:.109375,y:.046875},{x:.140625,y:.046875},{x:.140625,y:.046875},{x:.171875,y:.046875},{x:.171875,y:.046875},{x:.203125,y:.046875},{x:.203125,y:.046875},{x:.234375,y:.046875},{x:.234375,y:.046875},{x:.265625,y:.046875},{x:.265625,y:.046875},{x:.296875,y:.046875},{x:.296875,y:.046875},{x:.328125,y:.046875},{x:.328125,y:.046875},{x:.359375,y:.046875},{x:.359375,y:.046875},{x:.390625,y:.046875},{x:.390625,y:.046875},{x:.421875,y:.046875},{x:.421875,y:.046875},{x:.453125,y:.046875},{x:.453125,y:.046875},{x:.484375,y:.046875},{x:.484375,y:.046875},{x:.515625,y:.046875},{x:.515625,y:.046875},{x:.546875,y:.046875},{x:.546875,y:.046875},{x:.578125,y:.046875},{x:.578125,y:.046875},{x:.609375,y:.046875},{x:.609375,y:.046875},{x:.640625,y:.046875},{x:.640625,y:.046875},{x:.671875,y:.046875},{x:.671875,y:.046875},{x:.703125,y:.046875},{x:.703125,y:.046875},{x:.734375,y:.046875},{x:.734375,y:.046875},{x:.765625,y:.046875},{x:.765625,y:.046875},{x:.796875,y:.046875},{x:.796875,y:.046875},{x:.828125,y:.046875},{x:.828125,y:.046875},{x:.859375,y:.046875},{x:.859375,y:.046875},{x:.890625,y:.046875},{x:.890625,y:.046875},{x:.921875,y:.046875},{x:.921875,y:.046875},{x:.953125,y:.046875},{x:.953125,y:.046875},{x:.984375,y:.046875},{x:.984375,y:.046875},{x:.015625,y:.078125},{x:.015625,y:.078125},{x:.046875,y:.078125},{x:.046875,y:.078125},{x:.078125,y:.078125},{x:.078125,y:.078125},{x:.109375,y:.078125},{x:.109375,y:.078125},{x:.140625,y:.078125},{x:.140625,y:.078125},{x:.171875,y:.078125},{x:.171875,y:.078125},{x:.203125,y:.078125},{x:.203125,y:.078125},{x:.234375,y:.078125},{x:.234375,y:.078125},{x:.265625,y:.078125},{x:.265625,y:.078125},{x:.296875,y:.078125},{x:.296875,y:.078125},{x:.328125,y:.078125},{x:.328125,y:.078125},{x:.359375,y:.078125},{x:.359375,y:.078125},{x:.390625,y:.078125},{x:.390625,y:.078125},{x:.421875,y:.078125},{x:.421875,y:.078125},{x:.453125,y:.078125},{x:.453125,y:.078125},{x:.484375,y:.078125},{x:.484375,y:.078125},{x:.515625,y:.078125},{x:.515625,y:.078125},{x:.546875,y:.078125},{x:.546875,y:.078125},{x:.578125,y:.078125},{x:.578125,y:.078125},{x:.609375,y:.078125},{x:.609375,y:.078125},{x:.640625,y:.078125},{x:.640625,y:.078125},{x:.671875,y:.078125},{x:.671875,y:.078125},{x:.703125,y:.078125},{x:.703125,y:.078125},{x:.734375,y:.078125},{x:.734375,y:.078125},{x:.765625,y:.078125},{x:.765625,y:.078125},{x:.796875,y:.078125},{x:.796875,y:.078125},{x:.828125,y:.078125},{x:.828125,y:.078125},{x:.859375,y:.078125},{x:.859375,y:.078125},{x:.890625,y:.078125},{x:.890625,y:.078125},{x:.921875,y:.078125},{x:.921875,y:.078125},{x:.953125,y:.078125},{x:.953125,y:.078125},{x:.984375,y:.078125},{x:.984375,y:.078125},{x:.015625,y:.109375},{x:.015625,y:.109375},{x:.046875,y:.109375},{x:.046875,y:.109375},{x:.078125,y:.109375},{x:.078125,y:.109375},{x:.109375,y:.109375},{x:.109375,y:.109375},{x:.140625,y:.109375},{x:.140625,y:.109375},{x:.171875,y:.109375},{x:.171875,y:.109375},{x:.203125,y:.109375},{x:.203125,y:.109375},{x:.234375,y:.109375},{x:.234375,y:.109375},{x:.265625,y:.109375},{x:.265625,y:.109375},{x:.296875,y:.109375},{x:.296875,y:.109375},{x:.328125,y:.109375},{x:.328125,y:.109375},{x:.359375,y:.109375},{x:.359375,y:.109375},{x:.390625,y:.109375},{x:.390625,y:.109375},{x:.421875,y:.109375},{x:.421875,y:.109375},{x:.453125,y:.109375},{x:.453125,y:.109375},{x:.484375,y:.109375},{x:.484375,y:.109375},{x:.515625,y:.109375},{x:.515625,y:.109375},{x:.546875,y:.109375},{x:.546875,y:.109375},{x:.578125,y:.109375},{x:.578125,y:.109375},{x:.609375,y:.109375},{x:.609375,y:.109375},{x:.640625,y:.109375},{x:.640625,y:.109375},{x:.671875,y:.109375},{x:.671875,y:.109375},{x:.703125,y:.109375},{x:.703125,y:.109375},{x:.734375,y:.109375},{x:.734375,y:.109375},{x:.765625,y:.109375},{x:.765625,y:.109375},{x:.796875,y:.109375},{x:.796875,y:.109375},{x:.828125,y:.109375},{x:.828125,y:.109375},{x:.859375,y:.109375},{x:.859375,y:.109375},{x:.890625,y:.109375},{x:.890625,y:.109375},{x:.921875,y:.109375},{x:.921875,y:.109375},{x:.953125,y:.109375},{x:.953125,y:.109375},{x:.984375,y:.109375},{x:.984375,y:.109375},{x:.015625,y:.140625},{x:.015625,y:.140625},{x:.046875,y:.140625},{x:.046875,y:.140625},{x:.078125,y:.140625},{x:.078125,y:.140625},{x:.109375,y:.140625},{x:.109375,y:.140625},{x:.140625,y:.140625},{x:.140625,y:.140625},{x:.171875,y:.140625},{x:.171875,y:.140625},{x:.203125,y:.140625},{x:.203125,y:.140625},{x:.234375,y:.140625},{x:.234375,y:.140625},{x:.265625,y:.140625},{x:.265625,y:.140625},{x:.296875,y:.140625},{x:.296875,y:.140625},{x:.328125,y:.140625},{x:.328125,y:.140625},{x:.359375,y:.140625},{x:.359375,y:.140625},{x:.390625,y:.140625},{x:.390625,y:.140625},{x:.421875,y:.140625},{x:.421875,y:.140625},{x:.453125,y:.140625},{x:.453125,y:.140625},{x:.484375,y:.140625},{x:.484375,y:.140625},{x:.515625,y:.140625},{x:.515625,y:.140625},{x:.546875,y:.140625},{x:.546875,y:.140625},{x:.578125,y:.140625},{x:.578125,y:.140625},{x:.609375,y:.140625},{x:.609375,y:.140625},{x:.640625,y:.140625},{x:.640625,y:.140625},{x:.671875,y:.140625},{x:.671875,y:.140625},{x:.703125,y:.140625},{x:.703125,y:.140625},{x:.734375,y:.140625},{x:.734375,y:.140625},{x:.765625,y:.140625},{x:.765625,y:.140625},{x:.796875,y:.140625},{x:.796875,y:.140625},{x:.828125,y:.140625},{x:.828125,y:.140625},{x:.859375,y:.140625},{x:.859375,y:.140625},{x:.890625,y:.140625},{x:.890625,y:.140625},{x:.921875,y:.140625},{x:.921875,y:.140625},{x:.953125,y:.140625},{x:.953125,y:.140625},{x:.984375,y:.140625},{x:.984375,y:.140625},{x:.015625,y:.171875},{x:.015625,y:.171875},{x:.046875,y:.171875},{x:.046875,y:.171875},{x:.078125,y:.171875},{x:.078125,y:.171875},{x:.109375,y:.171875},{x:.109375,y:.171875},{x:.140625,y:.171875},{x:.140625,y:.171875},{x:.171875,y:.171875},{x:.171875,y:.171875},{x:.203125,y:.171875},{x:.203125,y:.171875},{x:.234375,y:.171875},{x:.234375,y:.171875},{x:.265625,y:.171875},{x:.265625,y:.171875},{x:.296875,y:.171875},{x:.296875,y:.171875},{x:.328125,y:.171875},{x:.328125,y:.171875},{x:.359375,y:.171875},{x:.359375,y:.171875},{x:.390625,y:.171875},{x:.390625,y:.171875},{x:.421875,y:.171875},{x:.421875,y:.171875},{x:.453125,y:.171875},{x:.453125,y:.171875},{x:.484375,y:.171875},{x:.484375,y:.171875},{x:.515625,y:.171875},{x:.515625,y:.171875},{x:.546875,y:.171875},{x:.546875,y:.171875},{x:.578125,y:.171875},{x:.578125,y:.171875},{x:.609375,y:.171875},{x:.609375,y:.171875},{x:.640625,y:.171875},{x:.640625,y:.171875},{x:.671875,y:.171875},{x:.671875,y:.171875},{x:.703125,y:.171875},{x:.703125,y:.171875},{x:.734375,y:.171875},{x:.734375,y:.171875},{x:.765625,y:.171875},{x:.765625,y:.171875},{x:.796875,y:.171875},{x:.796875,y:.171875},{x:.828125,y:.171875},{x:.828125,y:.171875},{x:.859375,y:.171875},{x:.859375,y:.171875},{x:.890625,y:.171875},{x:.890625,y:.171875},{x:.921875,y:.171875},{x:.921875,y:.171875},{x:.953125,y:.171875},{x:.953125,y:.171875},{x:.984375,y:.171875},{x:.984375,y:.171875},{x:.015625,y:.203125},{x:.015625,y:.203125},{x:.046875,y:.203125},{x:.046875,y:.203125},{x:.078125,y:.203125},{x:.078125,y:.203125},{x:.109375,y:.203125},{x:.109375,y:.203125},{x:.140625,y:.203125},{x:.140625,y:.203125},{x:.171875,y:.203125},{x:.171875,y:.203125},{x:.203125,y:.203125},{x:.203125,y:.203125},{x:.234375,y:.203125},{x:.234375,y:.203125},{x:.265625,y:.203125},{x:.265625,y:.203125},{x:.296875,y:.203125},{x:.296875,y:.203125},{x:.328125,y:.203125},{x:.328125,y:.203125},{x:.359375,y:.203125},{x:.359375,y:.203125},{x:.390625,y:.203125},{x:.390625,y:.203125},{x:.421875,y:.203125},{x:.421875,y:.203125},{x:.453125,y:.203125},{x:.453125,y:.203125},{x:.484375,y:.203125},{x:.484375,y:.203125},{x:.515625,y:.203125},{x:.515625,y:.203125},{x:.546875,y:.203125},{x:.546875,y:.203125},{x:.578125,y:.203125},{x:.578125,y:.203125},{x:.609375,y:.203125},{x:.609375,y:.203125},{x:.640625,y:.203125},{x:.640625,y:.203125},{x:.671875,y:.203125},{x:.671875,y:.203125},{x:.703125,y:.203125},{x:.703125,y:.203125},{x:.734375,y:.203125},{x:.734375,y:.203125},{x:.765625,y:.203125},{x:.765625,y:.203125},{x:.796875,y:.203125},{x:.796875,y:.203125},{x:.828125,y:.203125},{x:.828125,y:.203125},{x:.859375,y:.203125},{x:.859375,y:.203125},{x:.890625,y:.203125},{x:.890625,y:.203125},{x:.921875,y:.203125},{x:.921875,y:.203125},{x:.953125,y:.203125},{x:.953125,y:.203125},{x:.984375,y:.203125},{x:.984375,y:.203125},{x:.015625,y:.234375},{x:.015625,y:.234375},{x:.046875,y:.234375},{x:.046875,y:.234375},{x:.078125,y:.234375},{x:.078125,y:.234375},{x:.109375,y:.234375},{x:.109375,y:.234375},{x:.140625,y:.234375},{x:.140625,y:.234375},{x:.171875,y:.234375},{x:.171875,y:.234375},{x:.203125,y:.234375},{x:.203125,y:.234375},{x:.234375,y:.234375},{x:.234375,y:.234375},{x:.265625,y:.234375},{x:.265625,y:.234375},{x:.296875,y:.234375},{x:.296875,y:.234375},{x:.328125,y:.234375},{x:.328125,y:.234375},{x:.359375,y:.234375},{x:.359375,y:.234375},{x:.390625,y:.234375},{x:.390625,y:.234375},{x:.421875,y:.234375},{x:.421875,y:.234375},{x:.453125,y:.234375},{x:.453125,y:.234375},{x:.484375,y:.234375},{x:.484375,y:.234375},{x:.515625,y:.234375},{x:.515625,y:.234375},{x:.546875,y:.234375},{x:.546875,y:.234375},{x:.578125,y:.234375},{x:.578125,y:.234375},{x:.609375,y:.234375},{x:.609375,y:.234375},{x:.640625,y:.234375},{x:.640625,y:.234375},{x:.671875,y:.234375},{x:.671875,y:.234375},{x:.703125,y:.234375},{x:.703125,y:.234375},{x:.734375,y:.234375},{x:.734375,y:.234375},{x:.765625,y:.234375},{x:.765625,y:.234375},{x:.796875,y:.234375},{x:.796875,y:.234375},{x:.828125,y:.234375},{x:.828125,y:.234375},{x:.859375,y:.234375},{x:.859375,y:.234375},{x:.890625,y:.234375},{x:.890625,y:.234375},{x:.921875,y:.234375},{x:.921875,y:.234375},{x:.953125,y:.234375},{x:.953125,y:.234375},{x:.984375,y:.234375},{x:.984375,y:.234375},{x:.015625,y:.265625},{x:.015625,y:.265625},{x:.046875,y:.265625},{x:.046875,y:.265625},{x:.078125,y:.265625},{x:.078125,y:.265625},{x:.109375,y:.265625},{x:.109375,y:.265625},{x:.140625,y:.265625},{x:.140625,y:.265625},{x:.171875,y:.265625},{x:.171875,y:.265625},{x:.203125,y:.265625},{x:.203125,y:.265625},{x:.234375,y:.265625},{x:.234375,y:.265625},{x:.265625,y:.265625},{x:.265625,y:.265625},{x:.296875,y:.265625},{x:.296875,y:.265625},{x:.328125,y:.265625},{x:.328125,y:.265625},{x:.359375,y:.265625},{x:.359375,y:.265625},{x:.390625,y:.265625},{x:.390625,y:.265625},{x:.421875,y:.265625},{x:.421875,y:.265625},{x:.453125,y:.265625},{x:.453125,y:.265625},{x:.484375,y:.265625},{x:.484375,y:.265625},{x:.515625,y:.265625},{x:.515625,y:.265625},{x:.546875,y:.265625},{x:.546875,y:.265625},{x:.578125,y:.265625},{x:.578125,y:.265625},{x:.609375,y:.265625},{x:.609375,y:.265625},{x:.640625,y:.265625},{x:.640625,y:.265625},{x:.671875,y:.265625},{x:.671875,y:.265625},{x:.703125,y:.265625},{x:.703125,y:.265625},{x:.734375,y:.265625},{x:.734375,y:.265625},{x:.765625,y:.265625},{x:.765625,y:.265625},{x:.796875,y:.265625},{x:.796875,y:.265625},{x:.828125,y:.265625},{x:.828125,y:.265625},{x:.859375,y:.265625},{x:.859375,y:.265625},{x:.890625,y:.265625},{x:.890625,y:.265625},{x:.921875,y:.265625},{x:.921875,y:.265625},{x:.953125,y:.265625},{x:.953125,y:.265625},{x:.984375,y:.265625},{x:.984375,y:.265625},{x:.015625,y:.296875},{x:.015625,y:.296875},{x:.046875,y:.296875},{x:.046875,y:.296875},{x:.078125,y:.296875},{x:.078125,y:.296875},{x:.109375,y:.296875},{x:.109375,y:.296875},{x:.140625,y:.296875},{x:.140625,y:.296875},{x:.171875,y:.296875},{x:.171875,y:.296875},{x:.203125,y:.296875},{x:.203125,y:.296875},{x:.234375,y:.296875},{x:.234375,y:.296875},{x:.265625,y:.296875},{x:.265625,y:.296875},{x:.296875,y:.296875},{x:.296875,y:.296875},{x:.328125,y:.296875},{x:.328125,y:.296875},{x:.359375,y:.296875},{x:.359375,y:.296875},{x:.390625,y:.296875},{x:.390625,y:.296875},{x:.421875,y:.296875},{x:.421875,y:.296875},{x:.453125,y:.296875},{x:.453125,y:.296875},{x:.484375,y:.296875},{x:.484375,y:.296875},{x:.515625,y:.296875},{x:.515625,y:.296875},{x:.546875,y:.296875},{x:.546875,y:.296875},{x:.578125,y:.296875},{x:.578125,y:.296875},{x:.609375,y:.296875},{x:.609375,y:.296875},{x:.640625,y:.296875},{x:.640625,y:.296875},{x:.671875,y:.296875},{x:.671875,y:.296875},{x:.703125,y:.296875},{x:.703125,y:.296875},{x:.734375,y:.296875},{x:.734375,y:.296875},{x:.765625,y:.296875},{x:.765625,y:.296875},{x:.796875,y:.296875},{x:.796875,y:.296875},{x:.828125,y:.296875},{x:.828125,y:.296875},{x:.859375,y:.296875},{x:.859375,y:.296875},{x:.890625,y:.296875},{x:.890625,y:.296875},{x:.921875,y:.296875},{x:.921875,y:.296875},{x:.953125,y:.296875},{x:.953125,y:.296875},{x:.984375,y:.296875},{x:.984375,y:.296875},{x:.015625,y:.328125},{x:.015625,y:.328125},{x:.046875,y:.328125},{x:.046875,y:.328125},{x:.078125,y:.328125},{x:.078125,y:.328125},{x:.109375,y:.328125},{x:.109375,y:.328125},{x:.140625,y:.328125},{x:.140625,y:.328125},{x:.171875,y:.328125},{x:.171875,y:.328125},{x:.203125,y:.328125},{x:.203125,y:.328125},{x:.234375,y:.328125},{x:.234375,y:.328125},{x:.265625,y:.328125},{x:.265625,y:.328125},{x:.296875,y:.328125},{x:.296875,y:.328125},{x:.328125,y:.328125},{x:.328125,y:.328125},{x:.359375,y:.328125},{x:.359375,y:.328125},{x:.390625,y:.328125},{x:.390625,y:.328125},{x:.421875,y:.328125},{x:.421875,y:.328125},{x:.453125,y:.328125},{x:.453125,y:.328125},{x:.484375,y:.328125},{x:.484375,y:.328125},{x:.515625,y:.328125},{x:.515625,y:.328125},{x:.546875,y:.328125},{x:.546875,y:.328125},{x:.578125,y:.328125},{x:.578125,y:.328125},{x:.609375,y:.328125},{x:.609375,y:.328125},{x:.640625,y:.328125},{x:.640625,y:.328125},{x:.671875,y:.328125},{x:.671875,y:.328125},{x:.703125,y:.328125},{x:.703125,y:.328125},{x:.734375,y:.328125},{x:.734375,y:.328125},{x:.765625,y:.328125},{x:.765625,y:.328125},{x:.796875,y:.328125},{x:.796875,y:.328125},{x:.828125,y:.328125},{x:.828125,y:.328125},{x:.859375,y:.328125},{x:.859375,y:.328125},{x:.890625,y:.328125},{x:.890625,y:.328125},{x:.921875,y:.328125},{x:.921875,y:.328125},{x:.953125,y:.328125},{x:.953125,y:.328125},{x:.984375,y:.328125},{x:.984375,y:.328125},{x:.015625,y:.359375},{x:.015625,y:.359375},{x:.046875,y:.359375},{x:.046875,y:.359375},{x:.078125,y:.359375},{x:.078125,y:.359375},{x:.109375,y:.359375},{x:.109375,y:.359375},{x:.140625,y:.359375},{x:.140625,y:.359375},{x:.171875,y:.359375},{x:.171875,y:.359375},{x:.203125,y:.359375},{x:.203125,y:.359375},{x:.234375,y:.359375},{x:.234375,y:.359375},{x:.265625,y:.359375},{x:.265625,y:.359375},{x:.296875,y:.359375},{x:.296875,y:.359375},{x:.328125,y:.359375},{x:.328125,y:.359375},{x:.359375,y:.359375},{x:.359375,y:.359375},{x:.390625,y:.359375},{x:.390625,y:.359375},{x:.421875,y:.359375},{x:.421875,y:.359375},{x:.453125,y:.359375},{x:.453125,y:.359375},{x:.484375,y:.359375},{x:.484375,y:.359375},{x:.515625,y:.359375},{x:.515625,y:.359375},{x:.546875,y:.359375},{x:.546875,y:.359375},{x:.578125,y:.359375},{x:.578125,y:.359375},{x:.609375,y:.359375},{x:.609375,y:.359375},{x:.640625,y:.359375},{x:.640625,y:.359375},{x:.671875,y:.359375},{x:.671875,y:.359375},{x:.703125,y:.359375},{x:.703125,y:.359375},{x:.734375,y:.359375},{x:.734375,y:.359375},{x:.765625,y:.359375},{x:.765625,y:.359375},{x:.796875,y:.359375},{x:.796875,y:.359375},{x:.828125,y:.359375},{x:.828125,y:.359375},{x:.859375,y:.359375},{x:.859375,y:.359375},{x:.890625,y:.359375},{x:.890625,y:.359375},{x:.921875,y:.359375},{x:.921875,y:.359375},{x:.953125,y:.359375},{x:.953125,y:.359375},{x:.984375,y:.359375},{x:.984375,y:.359375},{x:.015625,y:.390625},{x:.015625,y:.390625},{x:.046875,y:.390625},{x:.046875,y:.390625},{x:.078125,y:.390625},{x:.078125,y:.390625},{x:.109375,y:.390625},{x:.109375,y:.390625},{x:.140625,y:.390625},{x:.140625,y:.390625},{x:.171875,y:.390625},{x:.171875,y:.390625},{x:.203125,y:.390625},{x:.203125,y:.390625},{x:.234375,y:.390625},{x:.234375,y:.390625},{x:.265625,y:.390625},{x:.265625,y:.390625},{x:.296875,y:.390625},{x:.296875,y:.390625},{x:.328125,y:.390625},{x:.328125,y:.390625},{x:.359375,y:.390625},{x:.359375,y:.390625},{x:.390625,y:.390625},{x:.390625,y:.390625},{x:.421875,y:.390625},{x:.421875,y:.390625},{x:.453125,y:.390625},{x:.453125,y:.390625},{x:.484375,y:.390625},{x:.484375,y:.390625},{x:.515625,y:.390625},{x:.515625,y:.390625},{x:.546875,y:.390625},{x:.546875,y:.390625},{x:.578125,y:.390625},{x:.578125,y:.390625},{x:.609375,y:.390625},{x:.609375,y:.390625},{x:.640625,y:.390625},{x:.640625,y:.390625},{x:.671875,y:.390625},{x:.671875,y:.390625},{x:.703125,y:.390625},{x:.703125,y:.390625},{x:.734375,y:.390625},{x:.734375,y:.390625},{x:.765625,y:.390625},{x:.765625,y:.390625},{x:.796875,y:.390625},{x:.796875,y:.390625},{x:.828125,y:.390625},{x:.828125,y:.390625},{x:.859375,y:.390625},{x:.859375,y:.390625},{x:.890625,y:.390625},{x:.890625,y:.390625},{x:.921875,y:.390625},{x:.921875,y:.390625},{x:.953125,y:.390625},{x:.953125,y:.390625},{x:.984375,y:.390625},{x:.984375,y:.390625},{x:.015625,y:.421875},{x:.015625,y:.421875},{x:.046875,y:.421875},{x:.046875,y:.421875},{x:.078125,y:.421875},{x:.078125,y:.421875},{x:.109375,y:.421875},{x:.109375,y:.421875},{x:.140625,y:.421875},{x:.140625,y:.421875},{x:.171875,y:.421875},{x:.171875,y:.421875},{x:.203125,y:.421875},{x:.203125,y:.421875},{x:.234375,y:.421875},{x:.234375,y:.421875},{x:.265625,y:.421875},{x:.265625,y:.421875},{x:.296875,y:.421875},{x:.296875,y:.421875},{x:.328125,y:.421875},{x:.328125,y:.421875},{x:.359375,y:.421875},{x:.359375,y:.421875},{x:.390625,y:.421875},{x:.390625,y:.421875},{x:.421875,y:.421875},{x:.421875,y:.421875},{x:.453125,y:.421875},{x:.453125,y:.421875},{x:.484375,y:.421875},{x:.484375,y:.421875},{x:.515625,y:.421875},{x:.515625,y:.421875},{x:.546875,y:.421875},{x:.546875,y:.421875},{x:.578125,y:.421875},{x:.578125,y:.421875},{x:.609375,y:.421875},{x:.609375,y:.421875},{x:.640625,y:.421875},{x:.640625,y:.421875},{x:.671875,y:.421875},{x:.671875,y:.421875},{x:.703125,y:.421875},{x:.703125,y:.421875},{x:.734375,y:.421875},{x:.734375,y:.421875},{x:.765625,y:.421875},{x:.765625,y:.421875},{x:.796875,y:.421875},{x:.796875,y:.421875},{x:.828125,y:.421875},{x:.828125,y:.421875},{x:.859375,y:.421875},{x:.859375,y:.421875},{x:.890625,y:.421875},{x:.890625,y:.421875},{x:.921875,y:.421875},{x:.921875,y:.421875},{x:.953125,y:.421875},{x:.953125,y:.421875},{x:.984375,y:.421875},{x:.984375,y:.421875},{x:.015625,y:.453125},{x:.015625,y:.453125},{x:.046875,y:.453125},{x:.046875,y:.453125},{x:.078125,y:.453125},{x:.078125,y:.453125},{x:.109375,y:.453125},{x:.109375,y:.453125},{x:.140625,y:.453125},{x:.140625,y:.453125},{x:.171875,y:.453125},{x:.171875,y:.453125},{x:.203125,y:.453125},{x:.203125,y:.453125},{x:.234375,y:.453125},{x:.234375,y:.453125},{x:.265625,y:.453125},{x:.265625,y:.453125},{x:.296875,y:.453125},{x:.296875,y:.453125},{x:.328125,y:.453125},{x:.328125,y:.453125},{x:.359375,y:.453125},{x:.359375,y:.453125},{x:.390625,y:.453125},{x:.390625,y:.453125},{x:.421875,y:.453125},{x:.421875,y:.453125},{x:.453125,y:.453125},{x:.453125,y:.453125},{x:.484375,y:.453125},{x:.484375,y:.453125},{x:.515625,y:.453125},{x:.515625,y:.453125},{x:.546875,y:.453125},{x:.546875,y:.453125},{x:.578125,y:.453125},{x:.578125,y:.453125},{x:.609375,y:.453125},{x:.609375,y:.453125},{x:.640625,y:.453125},{x:.640625,y:.453125},{x:.671875,y:.453125},{x:.671875,y:.453125},{x:.703125,y:.453125},{x:.703125,y:.453125},{x:.734375,y:.453125},{x:.734375,y:.453125},{x:.765625,y:.453125},{x:.765625,y:.453125},{x:.796875,y:.453125},{x:.796875,y:.453125},{x:.828125,y:.453125},{x:.828125,y:.453125},{x:.859375,y:.453125},{x:.859375,y:.453125},{x:.890625,y:.453125},{x:.890625,y:.453125},{x:.921875,y:.453125},{x:.921875,y:.453125},{x:.953125,y:.453125},{x:.953125,y:.453125},{x:.984375,y:.453125},{x:.984375,y:.453125},{x:.015625,y:.484375},{x:.015625,y:.484375},{x:.046875,y:.484375},{x:.046875,y:.484375},{x:.078125,y:.484375},{x:.078125,y:.484375},{x:.109375,y:.484375},{x:.109375,y:.484375},{x:.140625,y:.484375},{x:.140625,y:.484375},{x:.171875,y:.484375},{x:.171875,y:.484375},{x:.203125,y:.484375},{x:.203125,y:.484375},{x:.234375,y:.484375},{x:.234375,y:.484375},{x:.265625,y:.484375},{x:.265625,y:.484375},{x:.296875,y:.484375},{x:.296875,y:.484375},{x:.328125,y:.484375},{x:.328125,y:.484375},{x:.359375,y:.484375},{x:.359375,y:.484375},{x:.390625,y:.484375},{x:.390625,y:.484375},{x:.421875,y:.484375},{x:.421875,y:.484375},{x:.453125,y:.484375},{x:.453125,y:.484375},{x:.484375,y:.484375},{x:.484375,y:.484375},{x:.515625,y:.484375},{x:.515625,y:.484375},{x:.546875,y:.484375},{x:.546875,y:.484375},{x:.578125,y:.484375},{x:.578125,y:.484375},{x:.609375,y:.484375},{x:.609375,y:.484375},{x:.640625,y:.484375},{x:.640625,y:.484375},{x:.671875,y:.484375},{x:.671875,y:.484375},{x:.703125,y:.484375},{x:.703125,y:.484375},{x:.734375,y:.484375},{x:.734375,y:.484375},{x:.765625,y:.484375},{x:.765625,y:.484375},{x:.796875,y:.484375},{x:.796875,y:.484375},{x:.828125,y:.484375},{x:.828125,y:.484375},{x:.859375,y:.484375},{x:.859375,y:.484375},{x:.890625,y:.484375},{x:.890625,y:.484375},{x:.921875,y:.484375},{x:.921875,y:.484375},{x:.953125,y:.484375},{x:.953125,y:.484375},{x:.984375,y:.484375},{x:.984375,y:.484375},{x:.015625,y:.515625},{x:.015625,y:.515625},{x:.046875,y:.515625},{x:.046875,y:.515625},{x:.078125,y:.515625},{x:.078125,y:.515625},{x:.109375,y:.515625},{x:.109375,y:.515625},{x:.140625,y:.515625},{x:.140625,y:.515625},{x:.171875,y:.515625},{x:.171875,y:.515625},{x:.203125,y:.515625},{x:.203125,y:.515625},{x:.234375,y:.515625},{x:.234375,y:.515625},{x:.265625,y:.515625},{x:.265625,y:.515625},{x:.296875,y:.515625},{x:.296875,y:.515625},{x:.328125,y:.515625},{x:.328125,y:.515625},{x:.359375,y:.515625},{x:.359375,y:.515625},{x:.390625,y:.515625},{x:.390625,y:.515625},{x:.421875,y:.515625},{x:.421875,y:.515625},{x:.453125,y:.515625},{x:.453125,y:.515625},{x:.484375,y:.515625},{x:.484375,y:.515625},{x:.515625,y:.515625},{x:.515625,y:.515625},{x:.546875,y:.515625},{x:.546875,y:.515625},{x:.578125,y:.515625},{x:.578125,y:.515625},{x:.609375,y:.515625},{x:.609375,y:.515625},{x:.640625,y:.515625},{x:.640625,y:.515625},{x:.671875,y:.515625},{x:.671875,y:.515625},{x:.703125,y:.515625},{x:.703125,y:.515625},{x:.734375,y:.515625},{x:.734375,y:.515625},{x:.765625,y:.515625},{x:.765625,y:.515625},{x:.796875,y:.515625},{x:.796875,y:.515625},{x:.828125,y:.515625},{x:.828125,y:.515625},{x:.859375,y:.515625},{x:.859375,y:.515625},{x:.890625,y:.515625},{x:.890625,y:.515625},{x:.921875,y:.515625},{x:.921875,y:.515625},{x:.953125,y:.515625},{x:.953125,y:.515625},{x:.984375,y:.515625},{x:.984375,y:.515625},{x:.015625,y:.546875},{x:.015625,y:.546875},{x:.046875,y:.546875},{x:.046875,y:.546875},{x:.078125,y:.546875},{x:.078125,y:.546875},{x:.109375,y:.546875},{x:.109375,y:.546875},{x:.140625,y:.546875},{x:.140625,y:.546875},{x:.171875,y:.546875},{x:.171875,y:.546875},{x:.203125,y:.546875},{x:.203125,y:.546875},{x:.234375,y:.546875},{x:.234375,y:.546875},{x:.265625,y:.546875},{x:.265625,y:.546875},{x:.296875,y:.546875},{x:.296875,y:.546875},{x:.328125,y:.546875},{x:.328125,y:.546875},{x:.359375,y:.546875},{x:.359375,y:.546875},{x:.390625,y:.546875},{x:.390625,y:.546875},{x:.421875,y:.546875},{x:.421875,y:.546875},{x:.453125,y:.546875},{x:.453125,y:.546875},{x:.484375,y:.546875},{x:.484375,y:.546875},{x:.515625,y:.546875},{x:.515625,y:.546875},{x:.546875,y:.546875},{x:.546875,y:.546875},{x:.578125,y:.546875},{x:.578125,y:.546875},{x:.609375,y:.546875},{x:.609375,y:.546875},{x:.640625,y:.546875},{x:.640625,y:.546875},{x:.671875,y:.546875},{x:.671875,y:.546875},{x:.703125,y:.546875},{x:.703125,y:.546875},{x:.734375,y:.546875},{x:.734375,y:.546875},{x:.765625,y:.546875},{x:.765625,y:.546875},{x:.796875,y:.546875},{x:.796875,y:.546875},{x:.828125,y:.546875},{x:.828125,y:.546875},{x:.859375,y:.546875},{x:.859375,y:.546875},{x:.890625,y:.546875},{x:.890625,y:.546875},{x:.921875,y:.546875},{x:.921875,y:.546875},{x:.953125,y:.546875},{x:.953125,y:.546875},{x:.984375,y:.546875},{x:.984375,y:.546875},{x:.015625,y:.578125},{x:.015625,y:.578125},{x:.046875,y:.578125},{x:.046875,y:.578125},{x:.078125,y:.578125},{x:.078125,y:.578125},{x:.109375,y:.578125},{x:.109375,y:.578125},{x:.140625,y:.578125},{x:.140625,y:.578125},{x:.171875,y:.578125},{x:.171875,y:.578125},{x:.203125,y:.578125},{x:.203125,y:.578125},{x:.234375,y:.578125},{x:.234375,y:.578125},{x:.265625,y:.578125},{x:.265625,y:.578125},{x:.296875,y:.578125},{x:.296875,y:.578125},{x:.328125,y:.578125},{x:.328125,y:.578125},{x:.359375,y:.578125},{x:.359375,y:.578125},{x:.390625,y:.578125},{x:.390625,y:.578125},{x:.421875,y:.578125},{x:.421875,y:.578125},{x:.453125,y:.578125},{x:.453125,y:.578125},{x:.484375,y:.578125},{x:.484375,y:.578125},{x:.515625,y:.578125},{x:.515625,y:.578125},{x:.546875,y:.578125},{x:.546875,y:.578125},{x:.578125,y:.578125},{x:.578125,y:.578125},{x:.609375,y:.578125},{x:.609375,y:.578125},{x:.640625,y:.578125},{x:.640625,y:.578125},{x:.671875,y:.578125},{x:.671875,y:.578125},{x:.703125,y:.578125},{x:.703125,y:.578125},{x:.734375,y:.578125},{x:.734375,y:.578125},{x:.765625,y:.578125},{x:.765625,y:.578125},{x:.796875,y:.578125},{x:.796875,y:.578125},{x:.828125,y:.578125},{x:.828125,y:.578125},{x:.859375,y:.578125},{x:.859375,y:.578125},{x:.890625,y:.578125},{x:.890625,y:.578125},{x:.921875,y:.578125},{x:.921875,y:.578125},{x:.953125,y:.578125},{x:.953125,y:.578125},{x:.984375,y:.578125},{x:.984375,y:.578125},{x:.015625,y:.609375},{x:.015625,y:.609375},{x:.046875,y:.609375},{x:.046875,y:.609375},{x:.078125,y:.609375},{x:.078125,y:.609375},{x:.109375,y:.609375},{x:.109375,y:.609375},{x:.140625,y:.609375},{x:.140625,y:.609375},{x:.171875,y:.609375},{x:.171875,y:.609375},{x:.203125,y:.609375},{x:.203125,y:.609375},{x:.234375,y:.609375},{x:.234375,y:.609375},{x:.265625,y:.609375},{x:.265625,y:.609375},{x:.296875,y:.609375},{x:.296875,y:.609375},{x:.328125,y:.609375},{x:.328125,y:.609375},{x:.359375,y:.609375},{x:.359375,y:.609375},{x:.390625,y:.609375},{x:.390625,y:.609375},{x:.421875,y:.609375},{x:.421875,y:.609375},{x:.453125,y:.609375},{x:.453125,y:.609375},{x:.484375,y:.609375},{x:.484375,y:.609375},{x:.515625,y:.609375},{x:.515625,y:.609375},{x:.546875,y:.609375},{x:.546875,y:.609375},{x:.578125,y:.609375},{x:.578125,y:.609375},{x:.609375,y:.609375},{x:.609375,y:.609375},{x:.640625,y:.609375},{x:.640625,y:.609375},{x:.671875,y:.609375},{x:.671875,y:.609375},{x:.703125,y:.609375},{x:.703125,y:.609375},{x:.734375,y:.609375},{x:.734375,y:.609375},{x:.765625,y:.609375},{x:.765625,y:.609375},{x:.796875,y:.609375},{x:.796875,y:.609375},{x:.828125,y:.609375},{x:.828125,y:.609375},{x:.859375,y:.609375},{x:.859375,y:.609375},{x:.890625,y:.609375},{x:.890625,y:.609375},{x:.921875,y:.609375},{x:.921875,y:.609375},{x:.953125,y:.609375},{x:.953125,y:.609375},{x:.984375,y:.609375},{x:.984375,y:.609375},{x:.015625,y:.640625},{x:.015625,y:.640625},{x:.046875,y:.640625},{x:.046875,y:.640625},{x:.078125,y:.640625},{x:.078125,y:.640625},{x:.109375,y:.640625},{x:.109375,y:.640625},{x:.140625,y:.640625},{x:.140625,y:.640625},{x:.171875,y:.640625},{x:.171875,y:.640625},{x:.203125,y:.640625},{x:.203125,y:.640625},{x:.234375,y:.640625},{x:.234375,y:.640625},{x:.265625,y:.640625},{x:.265625,y:.640625},{x:.296875,y:.640625},{x:.296875,y:.640625},{x:.328125,y:.640625},{x:.328125,y:.640625},{x:.359375,y:.640625},{x:.359375,y:.640625},{x:.390625,y:.640625},{x:.390625,y:.640625},{x:.421875,y:.640625},{x:.421875,y:.640625},{x:.453125,y:.640625},{x:.453125,y:.640625},{x:.484375,y:.640625},{x:.484375,y:.640625},{x:.515625,y:.640625},{x:.515625,y:.640625},{x:.546875,y:.640625},{x:.546875,y:.640625},{x:.578125,y:.640625},{x:.578125,y:.640625},{x:.609375,y:.640625},{x:.609375,y:.640625},{x:.640625,y:.640625},{x:.640625,y:.640625},{x:.671875,y:.640625},{x:.671875,y:.640625},{x:.703125,y:.640625},{x:.703125,y:.640625},{x:.734375,y:.640625},{x:.734375,y:.640625},{x:.765625,y:.640625},{x:.765625,y:.640625},{x:.796875,y:.640625},{x:.796875,y:.640625},{x:.828125,y:.640625},{x:.828125,y:.640625},{x:.859375,y:.640625},{x:.859375,y:.640625},{x:.890625,y:.640625},{x:.890625,y:.640625},{x:.921875,y:.640625},{x:.921875,y:.640625},{x:.953125,y:.640625},{x:.953125,y:.640625},{x:.984375,y:.640625},{x:.984375,y:.640625},{x:.015625,y:.671875},{x:.015625,y:.671875},{x:.046875,y:.671875},{x:.046875,y:.671875},{x:.078125,y:.671875},{x:.078125,y:.671875},{x:.109375,y:.671875},{x:.109375,y:.671875},{x:.140625,y:.671875},{x:.140625,y:.671875},{x:.171875,y:.671875},{x:.171875,y:.671875},{x:.203125,y:.671875},{x:.203125,y:.671875},{x:.234375,y:.671875},{x:.234375,y:.671875},{x:.265625,y:.671875},{x:.265625,y:.671875},{x:.296875,y:.671875},{x:.296875,y:.671875},{x:.328125,y:.671875},{x:.328125,y:.671875},{x:.359375,y:.671875},{x:.359375,y:.671875},{x:.390625,y:.671875},{x:.390625,y:.671875},{x:.421875,y:.671875},{x:.421875,y:.671875},{x:.453125,y:.671875},{x:.453125,y:.671875},{x:.484375,y:.671875},{x:.484375,y:.671875},{x:.515625,y:.671875},{x:.515625,y:.671875},{x:.546875,y:.671875},{x:.546875,y:.671875},{x:.578125,y:.671875},{x:.578125,y:.671875},{x:.609375,y:.671875},{x:.609375,y:.671875},{x:.640625,y:.671875},{x:.640625,y:.671875},{x:.671875,y:.671875},{x:.671875,y:.671875},{x:.703125,y:.671875},{x:.703125,y:.671875},{x:.734375,y:.671875},{x:.734375,y:.671875},{x:.765625,y:.671875},{x:.765625,y:.671875},{x:.796875,y:.671875},{x:.796875,y:.671875},{x:.828125,y:.671875},{x:.828125,y:.671875},{x:.859375,y:.671875},{x:.859375,y:.671875},{x:.890625,y:.671875},{x:.890625,y:.671875},{x:.921875,y:.671875},{x:.921875,y:.671875},{x:.953125,y:.671875},{x:.953125,y:.671875},{x:.984375,y:.671875},{x:.984375,y:.671875},{x:.015625,y:.703125},{x:.015625,y:.703125},{x:.046875,y:.703125},{x:.046875,y:.703125},{x:.078125,y:.703125},{x:.078125,y:.703125},{x:.109375,y:.703125},{x:.109375,y:.703125},{x:.140625,y:.703125},{x:.140625,y:.703125},{x:.171875,y:.703125},{x:.171875,y:.703125},{x:.203125,y:.703125},{x:.203125,y:.703125},{x:.234375,y:.703125},{x:.234375,y:.703125},{x:.265625,y:.703125},{x:.265625,y:.703125},{x:.296875,y:.703125},{x:.296875,y:.703125},{x:.328125,y:.703125},{x:.328125,y:.703125},{x:.359375,y:.703125},{x:.359375,y:.703125},{x:.390625,y:.703125},{x:.390625,y:.703125},{x:.421875,y:.703125},{x:.421875,y:.703125},{x:.453125,y:.703125},{x:.453125,y:.703125},{x:.484375,y:.703125},{x:.484375,y:.703125},{x:.515625,y:.703125},{x:.515625,y:.703125},{x:.546875,y:.703125},{x:.546875,y:.703125},{x:.578125,y:.703125},{x:.578125,y:.703125},{x:.609375,y:.703125},{x:.609375,y:.703125},{x:.640625,y:.703125},{x:.640625,y:.703125},{x:.671875,y:.703125},{x:.671875,y:.703125},{x:.703125,y:.703125},{x:.703125,y:.703125},{x:.734375,y:.703125},{x:.734375,y:.703125},{x:.765625,y:.703125},{x:.765625,y:.703125},{x:.796875,y:.703125},{x:.796875,y:.703125},{x:.828125,y:.703125},{x:.828125,y:.703125},{x:.859375,y:.703125},{x:.859375,y:.703125},{x:.890625,y:.703125},{x:.890625,y:.703125},{x:.921875,y:.703125},{x:.921875,y:.703125},{x:.953125,y:.703125},{x:.953125,y:.703125},{x:.984375,y:.703125},{x:.984375,y:.703125},{x:.015625,y:.734375},{x:.015625,y:.734375},{x:.046875,y:.734375},{x:.046875,y:.734375},{x:.078125,y:.734375},{x:.078125,y:.734375},{x:.109375,y:.734375},{x:.109375,y:.734375},{x:.140625,y:.734375},{x:.140625,y:.734375},{x:.171875,y:.734375},{x:.171875,y:.734375},{x:.203125,y:.734375},{x:.203125,y:.734375},{x:.234375,y:.734375},{x:.234375,y:.734375},{x:.265625,y:.734375},{x:.265625,y:.734375},{x:.296875,y:.734375},{x:.296875,y:.734375},{x:.328125,y:.734375},{x:.328125,y:.734375},{x:.359375,y:.734375},{x:.359375,y:.734375},{x:.390625,y:.734375},{x:.390625,y:.734375},{x:.421875,y:.734375},{x:.421875,y:.734375},{x:.453125,y:.734375},{x:.453125,y:.734375},{x:.484375,y:.734375},{x:.484375,y:.734375},{x:.515625,y:.734375},{x:.515625,y:.734375},{x:.546875,y:.734375},{x:.546875,y:.734375},{x:.578125,y:.734375},{x:.578125,y:.734375},{x:.609375,y:.734375},{x:.609375,y:.734375},{x:.640625,y:.734375},{x:.640625,y:.734375},{x:.671875,y:.734375},{x:.671875,y:.734375},{x:.703125,y:.734375},{x:.703125,y:.734375},{x:.734375,y:.734375},{x:.734375,y:.734375},{x:.765625,y:.734375},{x:.765625,y:.734375},{x:.796875,y:.734375},{x:.796875,y:.734375},{x:.828125,y:.734375},{x:.828125,y:.734375},{x:.859375,y:.734375},{x:.859375,y:.734375},{x:.890625,y:.734375},{x:.890625,y:.734375},{x:.921875,y:.734375},{x:.921875,y:.734375},{x:.953125,y:.734375},{x:.953125,y:.734375},{x:.984375,y:.734375},{x:.984375,y:.734375},{x:.015625,y:.765625},{x:.015625,y:.765625},{x:.046875,y:.765625},{x:.046875,y:.765625},{x:.078125,y:.765625},{x:.078125,y:.765625},{x:.109375,y:.765625},{x:.109375,y:.765625},{x:.140625,y:.765625},{x:.140625,y:.765625},{x:.171875,y:.765625},{x:.171875,y:.765625},{x:.203125,y:.765625},{x:.203125,y:.765625},{x:.234375,y:.765625},{x:.234375,y:.765625},{x:.265625,y:.765625},{x:.265625,y:.765625},{x:.296875,y:.765625},{x:.296875,y:.765625},{x:.328125,y:.765625},{x:.328125,y:.765625},{x:.359375,y:.765625},{x:.359375,y:.765625},{x:.390625,y:.765625},{x:.390625,y:.765625},{x:.421875,y:.765625},{x:.421875,y:.765625},{x:.453125,y:.765625},{x:.453125,y:.765625},{x:.484375,y:.765625},{x:.484375,y:.765625},{x:.515625,y:.765625},{x:.515625,y:.765625},{x:.546875,y:.765625},{x:.546875,y:.765625},{x:.578125,y:.765625},{x:.578125,y:.765625},{x:.609375,y:.765625},{x:.609375,y:.765625},{x:.640625,y:.765625},{x:.640625,y:.765625},{x:.671875,y:.765625},{x:.671875,y:.765625},{x:.703125,y:.765625},{x:.703125,y:.765625},{x:.734375,y:.765625},{x:.734375,y:.765625},{x:.765625,y:.765625},{x:.765625,y:.765625},{x:.796875,y:.765625},{x:.796875,y:.765625},{x:.828125,y:.765625},{x:.828125,y:.765625},{x:.859375,y:.765625},{x:.859375,y:.765625},{x:.890625,y:.765625},{x:.890625,y:.765625},{x:.921875,y:.765625},{x:.921875,y:.765625},{x:.953125,y:.765625},{x:.953125,y:.765625},{x:.984375,y:.765625},{x:.984375,y:.765625},{x:.015625,y:.796875},{x:.015625,y:.796875},{x:.046875,y:.796875},{x:.046875,y:.796875},{x:.078125,y:.796875},{x:.078125,y:.796875},{x:.109375,y:.796875},{x:.109375,y:.796875},{x:.140625,y:.796875},{x:.140625,y:.796875},{x:.171875,y:.796875},{x:.171875,y:.796875},{x:.203125,y:.796875},{x:.203125,y:.796875},{x:.234375,y:.796875},{x:.234375,y:.796875},{x:.265625,y:.796875},{x:.265625,y:.796875},{x:.296875,y:.796875},{x:.296875,y:.796875},{x:.328125,y:.796875},{x:.328125,y:.796875},{x:.359375,y:.796875},{x:.359375,y:.796875},{x:.390625,y:.796875},{x:.390625,y:.796875},{x:.421875,y:.796875},{x:.421875,y:.796875},{x:.453125,y:.796875},{x:.453125,y:.796875},{x:.484375,y:.796875},{x:.484375,y:.796875},{x:.515625,y:.796875},{x:.515625,y:.796875},{x:.546875,y:.796875},{x:.546875,y:.796875},{x:.578125,y:.796875},{x:.578125,y:.796875},{x:.609375,y:.796875},{x:.609375,y:.796875},{x:.640625,y:.796875},{x:.640625,y:.796875},{x:.671875,y:.796875},{x:.671875,y:.796875},{x:.703125,y:.796875},{x:.703125,y:.796875},{x:.734375,y:.796875},{x:.734375,y:.796875},{x:.765625,y:.796875},{x:.765625,y:.796875},{x:.796875,y:.796875},{x:.796875,y:.796875},{x:.828125,y:.796875},{x:.828125,y:.796875},{x:.859375,y:.796875},{x:.859375,y:.796875},{x:.890625,y:.796875},{x:.890625,y:.796875},{x:.921875,y:.796875},{x:.921875,y:.796875},{x:.953125,y:.796875},{x:.953125,y:.796875},{x:.984375,y:.796875},{x:.984375,y:.796875},{x:.015625,y:.828125},{x:.015625,y:.828125},{x:.046875,y:.828125},{x:.046875,y:.828125},{x:.078125,y:.828125},{x:.078125,y:.828125},{x:.109375,y:.828125},{x:.109375,y:.828125},{x:.140625,y:.828125},{x:.140625,y:.828125},{x:.171875,y:.828125},{x:.171875,y:.828125},{x:.203125,y:.828125},{x:.203125,y:.828125},{x:.234375,y:.828125},{x:.234375,y:.828125},{x:.265625,y:.828125},{x:.265625,y:.828125},{x:.296875,y:.828125},{x:.296875,y:.828125},{x:.328125,y:.828125},{x:.328125,y:.828125},{x:.359375,y:.828125},{x:.359375,y:.828125},{x:.390625,y:.828125},{x:.390625,y:.828125},{x:.421875,y:.828125},{x:.421875,y:.828125},{x:.453125,y:.828125},{x:.453125,y:.828125},{x:.484375,y:.828125},{x:.484375,y:.828125},{x:.515625,y:.828125},{x:.515625,y:.828125},{x:.546875,y:.828125},{x:.546875,y:.828125},{x:.578125,y:.828125},{x:.578125,y:.828125},{x:.609375,y:.828125},{x:.609375,y:.828125},{x:.640625,y:.828125},{x:.640625,y:.828125},{x:.671875,y:.828125},{x:.671875,y:.828125},{x:.703125,y:.828125},{x:.703125,y:.828125},{x:.734375,y:.828125},{x:.734375,y:.828125},{x:.765625,y:.828125},{x:.765625,y:.828125},{x:.796875,y:.828125},{x:.796875,y:.828125},{x:.828125,y:.828125},{x:.828125,y:.828125},{x:.859375,y:.828125},{x:.859375,y:.828125},{x:.890625,y:.828125},{x:.890625,y:.828125},{x:.921875,y:.828125},{x:.921875,y:.828125},{x:.953125,y:.828125},{x:.953125,y:.828125},{x:.984375,y:.828125},{x:.984375,y:.828125},{x:.015625,y:.859375},{x:.015625,y:.859375},{x:.046875,y:.859375},{x:.046875,y:.859375},{x:.078125,y:.859375},{x:.078125,y:.859375},{x:.109375,y:.859375},{x:.109375,y:.859375},{x:.140625,y:.859375},{x:.140625,y:.859375},{x:.171875,y:.859375},{x:.171875,y:.859375},{x:.203125,y:.859375},{x:.203125,y:.859375},{x:.234375,y:.859375},{x:.234375,y:.859375},{x:.265625,y:.859375},{x:.265625,y:.859375},{x:.296875,y:.859375},{x:.296875,y:.859375},{x:.328125,y:.859375},{x:.328125,y:.859375},{x:.359375,y:.859375},{x:.359375,y:.859375},{x:.390625,y:.859375},{x:.390625,y:.859375},{x:.421875,y:.859375},{x:.421875,y:.859375},{x:.453125,y:.859375},{x:.453125,y:.859375},{x:.484375,y:.859375},{x:.484375,y:.859375},{x:.515625,y:.859375},{x:.515625,y:.859375},{x:.546875,y:.859375},{x:.546875,y:.859375},{x:.578125,y:.859375},{x:.578125,y:.859375},{x:.609375,y:.859375},{x:.609375,y:.859375},{x:.640625,y:.859375},{x:.640625,y:.859375},{x:.671875,y:.859375},{x:.671875,y:.859375},{x:.703125,y:.859375},{x:.703125,y:.859375},{x:.734375,y:.859375},{x:.734375,y:.859375},{x:.765625,y:.859375},{x:.765625,y:.859375},{x:.796875,y:.859375},{x:.796875,y:.859375},{x:.828125,y:.859375},{x:.828125,y:.859375},{x:.859375,y:.859375},{x:.859375,y:.859375},{x:.890625,y:.859375},{x:.890625,y:.859375},{x:.921875,y:.859375},{x:.921875,y:.859375},{x:.953125,y:.859375},{x:.953125,y:.859375},{x:.984375,y:.859375},{x:.984375,y:.859375},{x:.015625,y:.890625},{x:.015625,y:.890625},{x:.046875,y:.890625},{x:.046875,y:.890625},{x:.078125,y:.890625},{x:.078125,y:.890625},{x:.109375,y:.890625},{x:.109375,y:.890625},{x:.140625,y:.890625},{x:.140625,y:.890625},{x:.171875,y:.890625},{x:.171875,y:.890625},{x:.203125,y:.890625},{x:.203125,y:.890625},{x:.234375,y:.890625},{x:.234375,y:.890625},{x:.265625,y:.890625},{x:.265625,y:.890625},{x:.296875,y:.890625},{x:.296875,y:.890625},{x:.328125,y:.890625},{x:.328125,y:.890625},{x:.359375,y:.890625},{x:.359375,y:.890625},{x:.390625,y:.890625},{x:.390625,y:.890625},{x:.421875,y:.890625},{x:.421875,y:.890625},{x:.453125,y:.890625},{x:.453125,y:.890625},{x:.484375,y:.890625},{x:.484375,y:.890625},{x:.515625,y:.890625},{x:.515625,y:.890625},{x:.546875,y:.890625},{x:.546875,y:.890625},{x:.578125,y:.890625},{x:.578125,y:.890625},{x:.609375,y:.890625},{x:.609375,y:.890625},{x:.640625,y:.890625},{x:.640625,y:.890625},{x:.671875,y:.890625},{x:.671875,y:.890625},{x:.703125,y:.890625},{x:.703125,y:.890625},{x:.734375,y:.890625},{x:.734375,y:.890625},{x:.765625,y:.890625},{x:.765625,y:.890625},{x:.796875,y:.890625},{x:.796875,y:.890625},{x:.828125,y:.890625},{x:.828125,y:.890625},{x:.859375,y:.890625},{x:.859375,y:.890625},{x:.890625,y:.890625},{x:.890625,y:.890625},{x:.921875,y:.890625},{x:.921875,y:.890625},{x:.953125,y:.890625},{x:.953125,y:.890625},{x:.984375,y:.890625},{x:.984375,y:.890625},{x:.015625,y:.921875},{x:.015625,y:.921875},{x:.046875,y:.921875},{x:.046875,y:.921875},{x:.078125,y:.921875},{x:.078125,y:.921875},{x:.109375,y:.921875},{x:.109375,y:.921875},{x:.140625,y:.921875},{x:.140625,y:.921875},{x:.171875,y:.921875},{x:.171875,y:.921875},{x:.203125,y:.921875},{x:.203125,y:.921875},{x:.234375,y:.921875},{x:.234375,y:.921875},{x:.265625,y:.921875},{x:.265625,y:.921875},{x:.296875,y:.921875},{x:.296875,y:.921875},{x:.328125,y:.921875},{x:.328125,y:.921875},{x:.359375,y:.921875},{x:.359375,y:.921875},{x:.390625,y:.921875},{x:.390625,y:.921875},{x:.421875,y:.921875},{x:.421875,y:.921875},{x:.453125,y:.921875},{x:.453125,y:.921875},{x:.484375,y:.921875},{x:.484375,y:.921875},{x:.515625,y:.921875},{x:.515625,y:.921875},{x:.546875,y:.921875},{x:.546875,y:.921875},{x:.578125,y:.921875},{x:.578125,y:.921875},{x:.609375,y:.921875},{x:.609375,y:.921875},{x:.640625,y:.921875},{x:.640625,y:.921875},{x:.671875,y:.921875},{x:.671875,y:.921875},{x:.703125,y:.921875},{x:.703125,y:.921875},{x:.734375,y:.921875},{x:.734375,y:.921875},{x:.765625,y:.921875},{x:.765625,y:.921875},{x:.796875,y:.921875},{x:.796875,y:.921875},{x:.828125,y:.921875},{x:.828125,y:.921875},{x:.859375,y:.921875},{x:.859375,y:.921875},{x:.890625,y:.921875},{x:.890625,y:.921875},{x:.921875,y:.921875},{x:.921875,y:.921875},{x:.953125,y:.921875},{x:.953125,y:.921875},{x:.984375,y:.921875},{x:.984375,y:.921875},{x:.015625,y:.953125},{x:.015625,y:.953125},{x:.046875,y:.953125},{x:.046875,y:.953125},{x:.078125,y:.953125},{x:.078125,y:.953125},{x:.109375,y:.953125},{x:.109375,y:.953125},{x:.140625,y:.953125},{x:.140625,y:.953125},{x:.171875,y:.953125},{x:.171875,y:.953125},{x:.203125,y:.953125},{x:.203125,y:.953125},{x:.234375,y:.953125},{x:.234375,y:.953125},{x:.265625,y:.953125},{x:.265625,y:.953125},{x:.296875,y:.953125},{x:.296875,y:.953125},{x:.328125,y:.953125},{x:.328125,y:.953125},{x:.359375,y:.953125},{x:.359375,y:.953125},{x:.390625,y:.953125},{x:.390625,y:.953125},{x:.421875,y:.953125},{x:.421875,y:.953125},{x:.453125,y:.953125},{x:.453125,y:.953125},{x:.484375,y:.953125},{x:.484375,y:.953125},{x:.515625,y:.953125},{x:.515625,y:.953125},{x:.546875,y:.953125},{x:.546875,y:.953125},{x:.578125,y:.953125},{x:.578125,y:.953125},{x:.609375,y:.953125},{x:.609375,y:.953125},{x:.640625,y:.953125},{x:.640625,y:.953125},{x:.671875,y:.953125},{x:.671875,y:.953125},{x:.703125,y:.953125},{x:.703125,y:.953125},{x:.734375,y:.953125},{x:.734375,y:.953125},{x:.765625,y:.953125},{x:.765625,y:.953125},{x:.796875,y:.953125},{x:.796875,y:.953125},{x:.828125,y:.953125},{x:.828125,y:.953125},{x:.859375,y:.953125},{x:.859375,y:.953125},{x:.890625,y:.953125},{x:.890625,y:.953125},{x:.921875,y:.953125},{x:.921875,y:.953125},{x:.953125,y:.953125},{x:.953125,y:.953125},{x:.984375,y:.953125},{x:.984375,y:.953125},{x:.015625,y:.984375},{x:.015625,y:.984375},{x:.046875,y:.984375},{x:.046875,y:.984375},{x:.078125,y:.984375},{x:.078125,y:.984375},{x:.109375,y:.984375},{x:.109375,y:.984375},{x:.140625,y:.984375},{x:.140625,y:.984375},{x:.171875,y:.984375},{x:.171875,y:.984375},{x:.203125,y:.984375},{x:.203125,y:.984375},{x:.234375,y:.984375},{x:.234375,y:.984375},{x:.265625,y:.984375},{x:.265625,y:.984375},{x:.296875,y:.984375},{x:.296875,y:.984375},{x:.328125,y:.984375},{x:.328125,y:.984375},{x:.359375,y:.984375},{x:.359375,y:.984375},{x:.390625,y:.984375},{x:.390625,y:.984375},{x:.421875,y:.984375},{x:.421875,y:.984375},{x:.453125,y:.984375},{x:.453125,y:.984375},{x:.484375,y:.984375},{x:.484375,y:.984375},{x:.515625,y:.984375},{x:.515625,y:.984375},{x:.546875,y:.984375},{x:.546875,y:.984375},{x:.578125,y:.984375},{x:.578125,y:.984375},{x:.609375,y:.984375},{x:.609375,y:.984375},{x:.640625,y:.984375},{x:.640625,y:.984375},{x:.671875,y:.984375},{x:.671875,y:.984375},{x:.703125,y:.984375},{x:.703125,y:.984375},{x:.734375,y:.984375},{x:.734375,y:.984375},{x:.765625,y:.984375},{x:.765625,y:.984375},{x:.796875,y:.984375},{x:.796875,y:.984375},{x:.828125,y:.984375},{x:.828125,y:.984375},{x:.859375,y:.984375},{x:.859375,y:.984375},{x:.890625,y:.984375},{x:.890625,y:.984375},{x:.921875,y:.984375},{x:.921875,y:.984375},{x:.953125,y:.984375},{x:.953125,y:.984375},{x:.984375,y:.984375},{x:.984375,y:.984375},{x:.03125,y:.03125},{x:.03125,y:.03125},{x:.09375,y:.03125},{x:.09375,y:.03125},{x:.15625,y:.03125},{x:.15625,y:.03125},{x:.21875,y:.03125},{x:.21875,y:.03125},{x:.28125,y:.03125},{x:.28125,y:.03125},{x:.34375,y:.03125},{x:.34375,y:.03125},{x:.40625,y:.03125},{x:.40625,y:.03125},{x:.46875,y:.03125},{x:.46875,y:.03125},{x:.53125,y:.03125},{x:.53125,y:.03125},{x:.59375,y:.03125},{x:.59375,y:.03125},{x:.65625,y:.03125},{x:.65625,y:.03125},{x:.71875,y:.03125},{x:.71875,y:.03125},{x:.78125,y:.03125},{x:.78125,y:.03125},{x:.84375,y:.03125},{x:.84375,y:.03125},{x:.90625,y:.03125},{x:.90625,y:.03125},{x:.96875,y:.03125},{x:.96875,y:.03125},{x:.03125,y:.09375},{x:.03125,y:.09375},{x:.09375,y:.09375},{x:.09375,y:.09375},{x:.15625,y:.09375},{x:.15625,y:.09375},{x:.21875,y:.09375},{x:.21875,y:.09375},{x:.28125,y:.09375},{x:.28125,y:.09375},{x:.34375,y:.09375},{x:.34375,y:.09375},{x:.40625,y:.09375},{x:.40625,y:.09375},{x:.46875,y:.09375},{x:.46875,y:.09375},{x:.53125,y:.09375},{x:.53125,y:.09375},{x:.59375,y:.09375},{x:.59375,y:.09375},{x:.65625,y:.09375},{x:.65625,y:.09375},{x:.71875,y:.09375},{x:.71875,y:.09375},{x:.78125,y:.09375},{x:.78125,y:.09375},{x:.84375,y:.09375},{x:.84375,y:.09375},{x:.90625,y:.09375},{x:.90625,y:.09375},{x:.96875,y:.09375},{x:.96875,y:.09375},{x:.03125,y:.15625},{x:.03125,y:.15625},{x:.09375,y:.15625},{x:.09375,y:.15625},{x:.15625,y:.15625},{x:.15625,y:.15625},{x:.21875,y:.15625},{x:.21875,y:.15625},{x:.28125,y:.15625},{x:.28125,y:.15625},{x:.34375,y:.15625},{x:.34375,y:.15625},{x:.40625,y:.15625},{x:.40625,y:.15625},{x:.46875,y:.15625},{x:.46875,y:.15625},{x:.53125,y:.15625},{x:.53125,y:.15625},{x:.59375,y:.15625},{x:.59375,y:.15625},{x:.65625,y:.15625},{x:.65625,y:.15625},{x:.71875,y:.15625},{x:.71875,y:.15625},{x:.78125,y:.15625},{x:.78125,y:.15625},{x:.84375,y:.15625},{x:.84375,y:.15625},{x:.90625,y:.15625},{x:.90625,y:.15625},{x:.96875,y:.15625},{x:.96875,y:.15625},{x:.03125,y:.21875},{x:.03125,y:.21875},{x:.09375,y:.21875},{x:.09375,y:.21875},{x:.15625,y:.21875},{x:.15625,y:.21875},{x:.21875,y:.21875},{x:.21875,y:.21875},{x:.28125,y:.21875},{x:.28125,y:.21875},{x:.34375,y:.21875},{x:.34375,y:.21875},{x:.40625,y:.21875},{x:.40625,y:.21875},{x:.46875,y:.21875},{x:.46875,y:.21875},{x:.53125,y:.21875},{x:.53125,y:.21875},{x:.59375,y:.21875},{x:.59375,y:.21875},{x:.65625,y:.21875},{x:.65625,y:.21875},{x:.71875,y:.21875},{x:.71875,y:.21875},{x:.78125,y:.21875},{x:.78125,y:.21875},{x:.84375,y:.21875},{x:.84375,y:.21875},{x:.90625,y:.21875},{x:.90625,y:.21875},{x:.96875,y:.21875},{x:.96875,y:.21875},{x:.03125,y:.28125},{x:.03125,y:.28125},{x:.09375,y:.28125},{x:.09375,y:.28125},{x:.15625,y:.28125},{x:.15625,y:.28125},{x:.21875,y:.28125},{x:.21875,y:.28125},{x:.28125,y:.28125},{x:.28125,y:.28125},{x:.34375,y:.28125},{x:.34375,y:.28125},{x:.40625,y:.28125},{x:.40625,y:.28125},{x:.46875,y:.28125},{x:.46875,y:.28125},{x:.53125,y:.28125},{x:.53125,y:.28125},{x:.59375,y:.28125},{x:.59375,y:.28125},{x:.65625,y:.28125},{x:.65625,y:.28125},{x:.71875,y:.28125},{x:.71875,y:.28125},{x:.78125,y:.28125},{x:.78125,y:.28125},{x:.84375,y:.28125},{x:.84375,y:.28125},{x:.90625,y:.28125},{x:.90625,y:.28125},{x:.96875,y:.28125},{x:.96875,y:.28125},{x:.03125,y:.34375},{x:.03125,y:.34375},{x:.09375,y:.34375},{x:.09375,y:.34375},{x:.15625,y:.34375},{x:.15625,y:.34375},{x:.21875,y:.34375},{x:.21875,y:.34375},{x:.28125,y:.34375},{x:.28125,y:.34375},{x:.34375,y:.34375},{x:.34375,y:.34375},{x:.40625,y:.34375},{x:.40625,y:.34375},{x:.46875,y:.34375},{x:.46875,y:.34375},{x:.53125,y:.34375},{x:.53125,y:.34375},{x:.59375,y:.34375},{x:.59375,y:.34375},{x:.65625,y:.34375},{x:.65625,y:.34375},{x:.71875,y:.34375},{x:.71875,y:.34375},{x:.78125,y:.34375},{x:.78125,y:.34375},{x:.84375,y:.34375},{x:.84375,y:.34375},{x:.90625,y:.34375},{x:.90625,y:.34375},{x:.96875,y:.34375},{x:.96875,y:.34375},{x:.03125,y:.40625},{x:.03125,y:.40625},{x:.09375,y:.40625},{x:.09375,y:.40625},{x:.15625,y:.40625},{x:.15625,y:.40625},{x:.21875,y:.40625},{x:.21875,y:.40625},{x:.28125,y:.40625},{x:.28125,y:.40625},{x:.34375,y:.40625},{x:.34375,y:.40625},{x:.40625,y:.40625},{x:.40625,y:.40625},{x:.46875,y:.40625},{x:.46875,y:.40625},{x:.53125,y:.40625},{x:.53125,y:.40625},{x:.59375,y:.40625},{x:.59375,y:.40625},{x:.65625,y:.40625},{x:.65625,y:.40625},{x:.71875,y:.40625},{x:.71875,y:.40625},{x:.78125,y:.40625},{x:.78125,y:.40625},{x:.84375,y:.40625},{x:.84375,y:.40625},{x:.90625,y:.40625},{x:.90625,y:.40625},{x:.96875,y:.40625},{x:.96875,y:.40625},{x:.03125,y:.46875},{x:.03125,y:.46875},{x:.09375,y:.46875},{x:.09375,y:.46875},{x:.15625,y:.46875},{x:.15625,y:.46875},{x:.21875,y:.46875},{x:.21875,y:.46875},{x:.28125,y:.46875},{x:.28125,y:.46875},{x:.34375,y:.46875},{x:.34375,y:.46875},{x:.40625,y:.46875},{x:.40625,y:.46875},{x:.46875,y:.46875},{x:.46875,y:.46875},{x:.53125,y:.46875},{x:.53125,y:.46875},{x:.59375,y:.46875},{x:.59375,y:.46875},{x:.65625,y:.46875},{x:.65625,y:.46875},{x:.71875,y:.46875},{x:.71875,y:.46875},{x:.78125,y:.46875},{x:.78125,y:.46875},{x:.84375,y:.46875},{x:.84375,y:.46875},{x:.90625,y:.46875},{x:.90625,y:.46875},{x:.96875,y:.46875},{x:.96875,y:.46875},{x:.03125,y:.53125},{x:.03125,y:.53125},{x:.09375,y:.53125},{x:.09375,y:.53125},{x:.15625,y:.53125},{x:.15625,y:.53125},{x:.21875,y:.53125},{x:.21875,y:.53125},{x:.28125,y:.53125},{x:.28125,y:.53125},{x:.34375,y:.53125},{x:.34375,y:.53125},{x:.40625,y:.53125},{x:.40625,y:.53125},{x:.46875,y:.53125},{x:.46875,y:.53125},{x:.53125,y:.53125},{x:.53125,y:.53125},{x:.59375,y:.53125},{x:.59375,y:.53125},{x:.65625,y:.53125},{x:.65625,y:.53125},{x:.71875,y:.53125},{x:.71875,y:.53125},{x:.78125,y:.53125},{x:.78125,y:.53125},{x:.84375,y:.53125},{x:.84375,y:.53125},{x:.90625,y:.53125},{x:.90625,y:.53125},{x:.96875,y:.53125},{x:.96875,y:.53125},{x:.03125,y:.59375},{x:.03125,y:.59375},{x:.09375,y:.59375},{x:.09375,y:.59375},{x:.15625,y:.59375},{x:.15625,y:.59375},{x:.21875,y:.59375},{x:.21875,y:.59375},{x:.28125,y:.59375},{x:.28125,y:.59375},{x:.34375,y:.59375},{x:.34375,y:.59375},{x:.40625,y:.59375},{x:.40625,y:.59375},{x:.46875,y:.59375},{x:.46875,y:.59375},{x:.53125,y:.59375},{x:.53125,y:.59375},{x:.59375,y:.59375},{x:.59375,y:.59375},{x:.65625,y:.59375},{x:.65625,y:.59375},{x:.71875,y:.59375},{x:.71875,y:.59375},{x:.78125,y:.59375},{x:.78125,y:.59375},{x:.84375,y:.59375},{x:.84375,y:.59375},{x:.90625,y:.59375},{x:.90625,y:.59375},{x:.96875,y:.59375},{x:.96875,y:.59375},{x:.03125,y:.65625},{x:.03125,y:.65625},{x:.09375,y:.65625},{x:.09375,y:.65625},{x:.15625,y:.65625},{x:.15625,y:.65625},{x:.21875,y:.65625},{x:.21875,y:.65625},{x:.28125,y:.65625},{x:.28125,y:.65625},{x:.34375,y:.65625},{x:.34375,y:.65625},{x:.40625,y:.65625},{x:.40625,y:.65625},{x:.46875,y:.65625},{x:.46875,y:.65625},{x:.53125,y:.65625},{x:.53125,y:.65625},{x:.59375,y:.65625},{x:.59375,y:.65625},{x:.65625,y:.65625},{x:.65625,y:.65625},{x:.71875,y:.65625},{x:.71875,y:.65625},{x:.78125,y:.65625},{x:.78125,y:.65625},{x:.84375,y:.65625},{x:.84375,y:.65625},{x:.90625,y:.65625},{x:.90625,y:.65625},{x:.96875,y:.65625},{x:.96875,y:.65625},{x:.03125,y:.71875},{x:.03125,y:.71875},{x:.09375,y:.71875},{x:.09375,y:.71875},{x:.15625,y:.71875},{x:.15625,y:.71875},{x:.21875,y:.71875},{x:.21875,y:.71875},{x:.28125,y:.71875},{x:.28125,y:.71875},{x:.34375,y:.71875},{x:.34375,y:.71875},{x:.40625,y:.71875},{x:.40625,y:.71875},{x:.46875,y:.71875},{x:.46875,y:.71875},{x:.53125,y:.71875},{x:.53125,y:.71875},{x:.59375,y:.71875},{x:.59375,y:.71875},{x:.65625,y:.71875},{x:.65625,y:.71875},{x:.71875,y:.71875},{x:.71875,y:.71875},{x:.78125,y:.71875},{x:.78125,y:.71875},{x:.84375,y:.71875},{x:.84375,y:.71875},{x:.90625,y:.71875},{x:.90625,y:.71875},{x:.96875,y:.71875},{x:.96875,y:.71875},{x:.03125,y:.78125},{x:.03125,y:.78125},{x:.09375,y:.78125},{x:.09375,y:.78125},{x:.15625,y:.78125},{x:.15625,y:.78125},{x:.21875,y:.78125},{x:.21875,y:.78125},{x:.28125,y:.78125},{x:.28125,y:.78125},{x:.34375,y:.78125},{x:.34375,y:.78125},{x:.40625,y:.78125},{x:.40625,y:.78125},{x:.46875,y:.78125},{x:.46875,y:.78125},{x:.53125,y:.78125},{x:.53125,y:.78125},{x:.59375,y:.78125},{x:.59375,y:.78125},{x:.65625,y:.78125},{x:.65625,y:.78125},{x:.71875,y:.78125},{x:.71875,y:.78125},{x:.78125,y:.78125},{x:.78125,y:.78125},{x:.84375,y:.78125},{x:.84375,y:.78125},{x:.90625,y:.78125},{x:.90625,y:.78125},{x:.96875,y:.78125},{x:.96875,y:.78125},{x:.03125,y:.84375},{x:.03125,y:.84375},{x:.09375,y:.84375},{x:.09375,y:.84375},{x:.15625,y:.84375},{x:.15625,y:.84375},{x:.21875,y:.84375},{x:.21875,y:.84375},{x:.28125,y:.84375},{x:.28125,y:.84375},{x:.34375,y:.84375},{x:.34375,y:.84375},{x:.40625,y:.84375},{x:.40625,y:.84375},{x:.46875,y:.84375},{x:.46875,y:.84375},{x:.53125,y:.84375},{x:.53125,y:.84375},{x:.59375,y:.84375},{x:.59375,y:.84375},{x:.65625,y:.84375},{x:.65625,y:.84375},{x:.71875,y:.84375},{x:.71875,y:.84375},{x:.78125,y:.84375},{x:.78125,y:.84375},{x:.84375,y:.84375},{x:.84375,y:.84375},{x:.90625,y:.84375},{x:.90625,y:.84375},{x:.96875,y:.84375},{x:.96875,y:.84375},{x:.03125,y:.90625},{x:.03125,y:.90625},{x:.09375,y:.90625},{x:.09375,y:.90625},{x:.15625,y:.90625},{x:.15625,y:.90625},{x:.21875,y:.90625},{x:.21875,y:.90625},{x:.28125,y:.90625},{x:.28125,y:.90625},{x:.34375,y:.90625},{x:.34375,y:.90625},{x:.40625,y:.90625},{x:.40625,y:.90625},{x:.46875,y:.90625},{x:.46875,y:.90625},{x:.53125,y:.90625},{x:.53125,y:.90625},{x:.59375,y:.90625},{x:.59375,y:.90625},{x:.65625,y:.90625},{x:.65625,y:.90625},{x:.71875,y:.90625},{x:.71875,y:.90625},{x:.78125,y:.90625},{x:.78125,y:.90625},{x:.84375,y:.90625},{x:.84375,y:.90625},{x:.90625,y:.90625},{x:.90625,y:.90625},{x:.96875,y:.90625},{x:.96875,y:.90625},{x:.03125,y:.96875},{x:.03125,y:.96875},{x:.09375,y:.96875},{x:.09375,y:.96875},{x:.15625,y:.96875},{x:.15625,y:.96875},{x:.21875,y:.96875},{x:.21875,y:.96875},{x:.28125,y:.96875},{x:.28125,y:.96875},{x:.34375,y:.96875},{x:.34375,y:.96875},{x:.40625,y:.96875},{x:.40625,y:.96875},{x:.46875,y:.96875},{x:.46875,y:.96875},{x:.53125,y:.96875},{x:.53125,y:.96875},{x:.59375,y:.96875},{x:.59375,y:.96875},{x:.65625,y:.96875},{x:.65625,y:.96875},{x:.71875,y:.96875},{x:.71875,y:.96875},{x:.78125,y:.96875},{x:.78125,y:.96875},{x:.84375,y:.96875},{x:.84375,y:.96875},{x:.90625,y:.96875},{x:.90625,y:.96875},{x:.96875,y:.96875},{x:.96875,y:.96875},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375}];var L5=class{constructor(e){var t;this.model=e,this.anchors=DA.map(o=>[o.x,o.y]),this.anchorsTensor=r.tensor2d(this.anchors),this.inputSize=(t=this.model)==null?void 0:t.inputs[0].shape[2],this.inputSizeTensor=r.tensor1d([this.inputSize,this.inputSize]),this.doubleInputSizeTensor=r.tensor1d([this.inputSize*2,this.inputSize*2])}normalizeBoxes(e){return r.tidy(()=>{let t=r.slice(e,[0,0],[-1,2]),o=r.slice(e,[0,2],[-1,2]),n=r.add(r.div(t,this.inputSizeTensor),this.anchorsTensor),x=r.div(o,this.doubleInputSizeTensor),a=r.mul(r.sub(n,x),this.inputSizeTensor),s=r.mul(r.add(n,x),this.inputSizeTensor);return r.concat2d([a,s],1)})}normalizeLandmarks(e,t){return r.tidy(()=>{let o=r.add(r.div(e.reshape([-1,7,2]),this.inputSizeTensor),this.anchors[t]);return r.mul(o,this.inputSizeTensor)})}async getBoxes(e,t){let o=this.model.predict(e),n=o.squeeze();o.dispose();let x=r.tidy(()=>r.sigmoid(r.slice(n,[0,0],[-1,1])).squeeze()),a=x.dataSync(),s=r.slice(n,[0,1],[-1,4]),y=this.normalizeBoxes(s);s.dispose();let i=await r.image.nonMaxSuppressionAsync(y,a,t.hand.maxDetected,t.hand.iouThreshold,t.hand.minConfidence),c=i.arraySync();x.dispose(),i.dispose();let l=[];for(let f of c)if(a[f]>=t.hand.minConfidence){let p=r.slice(y,[f,0],[1,-1]),E=r.slice(n,[f,5],[1,14]),d=r.tidy(()=>this.normalizeLandmarks(E,f).reshape([-1,2]));E.dispose(),l.push({box:p,palmLandmarks:d,confidence:a[f]})}return n.dispose(),y.dispose(),l}async estimateHandBounds(e,t){let o=e.shape[1],n=e.shape[2],x=r.tidy(()=>e.resizeBilinear([this.inputSize,this.inputSize]).div(127.5).sub(1)),a=await this.getBoxes(x,t);x.dispose();let s=[];if(!a||a.length===0)return s;for(let y of a){let i=y.box.dataSync(),c=i.slice(0,2),l=i.slice(2,4),f=y.palmLandmarks.arraySync();y.box.dispose(),y.palmLandmarks.dispose(),s.push(KA({startPoint:c,endPoint:l,palmLandmarks:f,confidence:y.confidence},[n/this.inputSize,o/this.inputSize]))}return s}};function Je(A){return A-2*Math.PI*Math.floor((A+Math.PI)/(2*Math.PI))}function QA(A,e){let t=Math.PI/2-Math.atan2(-(e[1]-A[1]),e[0]-A[0]);return Je(t)}var _A=(A,e)=>[[1,0,A],[0,1,e],[0,0,1]];function i0(A,e){let t=0;for(let o=0;oa[0]),o=e.map(a=>a[1]),n=[Math.min(...t),Math.min(...o)],x=[Math.max(...t),Math.max(...o)];return{startPoint:n,endPoint:x}}getBoxForPalmLandmarks(e,t){let o=e.map(x=>H5([...x,1],t)),n=this.calculateLandmarksBoundingBox(o);return Y0(G0(n),Ge)}getBoxForHandLandmarks(e){let t=this.calculateLandmarksBoundingBox(e),o=Y0(G0(t),ee);o.palmLandmarks=[];for(let n=0;n[a[0]*(p[0]-this.inputSize/2),a[1]*(p[1]-this.inputSize/2),a[2]*p[2]]),y=Z5(o,[0,0]),i=s.map(p=>[...H5(p,y),p[2]]),c=Ae(n),l=[...S0(t),1],f=[i0(l,c[0]),i0(l,c[1])];return i.map(p=>[Math.trunc(p[0]+f[0]),Math.trunc(p[1]+f[1]),Math.trunc(p[2])])}async estimateHands(e,t){let o=!1,n;(this.skipped===0||this.skipped>t.hand.skipFrames||!t.hand.landmarks||!t.skipFrame)&&(n=await this.handDetector.estimateHandBounds(e,t),this.skipped=0),t.skipFrame&&this.skipped++,n&&n.length>0&&(n.length!==this.detectedHands&&this.detectedHands!==t.hand.maxDetected||!t.hand.landmarks)&&(this.detectedHands=0,this.storedBoxes=[...n],this.storedBoxes.length>0&&(o=!0));let x=[];for(let a=0;a=t.hand.minConfidence){let j=r.reshape(v,[-1,3]),W=j.arraySync();v.dispose(),j.dispose();let P=this.transformRawCoords(W,p,y,f),u=this.getBoxForHandLandmarks(P);this.storedBoxes[a]={...u,confidence:S};let M={landmarks:P,confidence:S,box:{topLeft:u.startPoint,bottomRight:u.endPoint}};x.push(M)}else this.storedBoxes[a]=null;v.dispose()}else{let y=Y0(G0(s),ee),i={confidence:s.confidence,box:{topLeft:y.startPoint,bottomRight:y.endPoint}};x.push(i)}}return this.storedBoxes=this.storedBoxes.filter(a=>a!==null),this.detectedHands=x.length,x}};var ne={thumb:[1,2,3,4],indexFinger:[5,6,7,8],middleFinger:[9,10,11,12],ringFinger:[13,14,15,16],pinky:[17,18,19,20],palmBase:[0]},a0,x0,oe;async function X5(A,e){let t=await oe.estimateHands(A,e);if(!t)return[];let o=[];for(let n=0;nt[n].landmarks[c]);let a=t[n].landmarks,s=[Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER,0,0],y=[0,0,0,0];if(a&&a.length>0){for(let i of a)i[0]s[2]&&(s[2]=i[0]),i[1]>s[3]&&(s[3]=i[1]);s[2]-=s[0],s[3]-=s[1],y=[s[0]/(A.shape[2]||0),s[1]/(A.shape[1]||0),s[2]/(A.shape[2]||0),s[3]/(A.shape[1]||0)]}else s=t[n].box?[Math.trunc(Math.max(0,t[n].box.topLeft[0])),Math.trunc(Math.max(0,t[n].box.topLeft[1])),Math.trunc(Math.min(A.shape[2]||0,t[n].box.bottomRight[0])-Math.max(0,t[n].box.topLeft[0])),Math.trunc(Math.min(A.shape[1]||0,t[n].box.bottomRight[1])-Math.max(0,t[n].box.topLeft[1]))]:[0,0,0,0],y=[t[n].box.topLeft[0]/(A.shape[2]||0),t[n].box.topLeft[1]/(A.shape[1]||0),(t[n].box.bottomRight[0]-t[n].box.topLeft[0])/(A.shape[2]||0),(t[n].box.bottomRight[1]-t[n].box.topLeft[1])/(A.shape[1]||0)];o.push({id:n,score:Math.round(100*t[n].confidence)/100,box:s,boxRaw:y,keypoints:a,annotations:x})}return o}async function F5(A){!a0||!x0?([a0,x0]=await Promise.all([A.hand.enabled?r.loadGraphModel(Z(A.modelBasePath,A.hand.detector.modelPath),{fromTFHub:A.hand.detector.modelPath.includes("tfhub.dev")}):null,A.hand.landmarks?r.loadGraphModel(Z(A.modelBasePath,A.hand.skeleton.modelPath),{fromTFHub:A.hand.skeleton.modelPath.includes("tfhub.dev")}):null]),A.hand.enabled&&(!a0||!a0.modelUrl?g("load model failed:",A.hand.detector.modelPath):A.debug&&g("load model:",a0.modelUrl),!x0||!x0.modelUrl?g("load model failed:",A.hand.skeleton.modelPath):A.debug&&g("load model:",x0.modelUrl))):(A.debug&&g("cached model:",a0.modelUrl),A.debug&&g("cached model:",x0.modelUrl));let e=new L5(a0);return oe=new V5(e,x0),[a0,x0]}var B5={};e0(B5,{load:()=>K0,predict:()=>C5});var se=["nose","leftEyeInside","leftEye","leftEyeOutside","rightEyeInside","rightEye","rightEyeOutside","leftEar","rightEar","leftMouth","rightMouth","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftPalm","rightPalm","leftIndex","rightIndex","leftPinky","rightPinky","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle","leftHeel","rightHeel","leftFoot","rightFoot","midHip","forehead","leftThumb","leftHand","rightThumb","rightHand"],re=["nose","leftEyeInside","leftEye","leftEyeOutside","rightEyeInside","rightEye","rightEyeOutside","leftEar","rightEar","leftMouth","rightMouth","leftShoulder","rightShoulder","leftElbow","rightElbow","left:15","right:16","left:17","right:18","left:19","right:20","left:21","right:22","leftChest","rightChest","neck","forehead","left:27","right:28","left:29","right:30"];var C;async function K0(A){return C?A.debug&&g("cached model:",C.modelUrl):(C=await r.loadGraphModel(Z(A.modelBasePath,A.body.modelPath)),C.width=parseInt(C.signature.inputs["input_1:0"].tensorShape.dim[2].size),C.height=parseInt(C.signature.inputs["input_1:0"].tensorShape.dim[1].size),!C||!C.modelUrl?g("load model failed:",A.body.modelPath):A.debug&&g("load model:",C.modelUrl)),C}async function C5(A,e){var d;if(!C)return[];if(!e.body.enabled)return[];let t={width:A.shape[2]||0,height:A.shape[1]||0},o=r.image.resizeBilinear(A,[C.width,C.height],!1),n=r.div(o,[255]);o.dispose();let x=await C.predict(n),a=((d=x.find(m=>m.size===195||m.size===155))==null?void 0:d.dataSync())||[];x.forEach(m=>m.dispose()),n.dispose();let s=[],y=(a==null?void 0:a.length)===195?se:re,i=5;for(let m=0;mm.position[0]),l=s.map(m=>m.position[1]),f=[Math.min(...c),Math.min(...l),Math.max(...c)-Math.min(...c),Math.max(...l)-Math.min(...c)],p=[0,0,0,0],E=s.reduce((m,v)=>v.score>m?v.score:m,0);return[{id:0,score:E,box:f,boxRaw:p,keypoints:s}]}var B,n0=[],U5=[0,0,0,0],J5=[0,0,0,0],D0=0,Y5=Number.MAX_SAFE_INTEGER,Qe=["head","neck","rightShoulder","rightElbow","rightWrist","chest","leftShoulder","leftElbow","leftWrist","pelvis","rightHip","rightKnee","rightAnkle","leftHip","leftKnee","leftAnkle"];async function ie(A){return B?A.debug&&g("cached model:",B.modelUrl):(B=await r.loadGraphModel(Z(A.modelBasePath,A.body.modelPath)),!B||!B.modelUrl?g("load model failed:",A.body.modelPath):A.debug&&g("load model:",B.modelUrl)),B}function _e(A,e){let[t,o]=A.shape;return r.tidy(()=>{let n=(s,y)=>r.sub(s,r.mul(r.div(s,r.scalar(y,"int32")),r.scalar(y,"int32"))),x=r.reshape(A,[o*t]),a=r.max(x,0).dataSync()[0];if(a>e){let s=r.argMax(x,0),y=n(s,t).dataSync()[0],i=r.div(s,r.scalar(t,"int32")).dataSync()[0];return[y,i,a]}return[0,0,a]})}async function G5(A,e){return Y50?(Y5++,[{id:0,score:D0,box:U5,boxRaw:J5,keypoints:n0}]):(Y5=0,new Promise(async t=>{let o=r.tidy(()=>{if(!B.inputs[0].shape)return null;let i=r.image.resizeBilinear(A,[B.inputs[0].shape[2],B.inputs[0].shape[1]],!1);return r.mul(i,2).sub(1)}),n;if(e.body.enabled&&(n=await B.predict(o)),o.dispose(),n){n0.length=0;let i=n.squeeze();r.dispose(n);let c=i.unstack(2);r.dispose(i);for(let l=0;le.body.minConfidence&&n0.push({score:Math.round(100*E)/100,part:Qe[l],positionRaw:[f/B.inputs[0].shape[2],p/B.inputs[0].shape[1]],position:[Math.round(A.shape[2]*f/B.inputs[0].shape[2]),Math.round(A.shape[1]*p/B.inputs[0].shape[1])]})}c.forEach(l=>r.dispose(l))}D0=n0.reduce((i,c)=>c.score>i?c.score:i,0);let x=n0.map(i=>i.position[0]),a=n0.map(i=>i.position[1]);U5=[Math.min(...x),Math.min(...a),Math.max(...x)-Math.min(...x),Math.max(...a)-Math.min(...a)];let s=n0.map(i=>i.positionRaw[0]),y=n0.map(i=>i.positionRaw[1]);J5=[Math.min(...s),Math.min(...y),Math.max(...s)-Math.min(...s),Math.max(...y)-Math.min(...y)],t([{id:0,score:D0,box:U5,boxRaw:J5,keypoints:n0}])}))}var A0,o0=[],K5=[0,0,0,0],D5=[0,0,0,0],g0=0,Q5=Number.MAX_SAFE_INTEGER,$e=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"];async function _5(A){return A0?A.debug&&g("cached model:",A0.modelUrl):(A0=await r.loadGraphModel(Z(A.modelBasePath,A.body.modelPath)),!A0||!A0.modelUrl?g("load model failed:",A.body.modelPath):A.debug&&g("load model:",A0.modelUrl)),A0}async function $5(A,e){return Q50?(Q5++,[{id:0,score:g0,box:K5,boxRaw:D5,keypoints:o0}]):(Q5=0,new Promise(async t=>{let o=r.tidy(()=>{if(!A0.inputs[0].shape)return null;let i=r.image.resizeBilinear(A,[A0.inputs[0].shape[2],A0.inputs[0].shape[1]],!1);return r.cast(i,"int32")}),n;if(e.body.enabled&&(n=await A0.predict(o)),o.dispose(),n){o0.length=0;let i=n.arraySync();r.dispose(n);let c=i[0][0];for(let l=0;le.body.minConfidence&&o0.push({score:Math.round(100*g0)/100,part:$e[l],positionRaw:[c[l][1],c[l][0]],position:[Math.round((A.shape[2]||0)*c[l][1]),Math.round((A.shape[1]||0)*c[l][0])]})}g0=o0.reduce((i,c)=>c.score>i?c.score:i,0);let x=o0.map(i=>i.position[0]),a=o0.map(i=>i.position[1]);K5=[Math.min(...x),Math.min(...a),Math.max(...x)-Math.min(...x),Math.max(...a)-Math.min(...a)];let s=o0.map(i=>i.positionRaw[0]),y=o0.map(i=>i.positionRaw[1]);D5=[Math.min(...s),Math.min(...y),Math.max(...s)-Math.min(...s),Math.max(...y)-Math.min(...y)],t([{id:0,score:g0,box:K5,boxRaw:D5,keypoints:o0}])}))}var oA={};e0(oA,{load:()=>tA,predict:()=>nA});var M0=[{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 G,AA=[],eA=Number.MAX_SAFE_INTEGER,Q0=2.5;async function tA(A){if(G)A.debug&&g("cached model:",G.modelUrl);else{G=await r.loadGraphModel(Z(A.modelBasePath,A.object.modelPath));let e=Object.values(G.modelSignature.inputs);if(G.inputSize=Array.isArray(e)?parseInt(e[0].tensorShape.dim[2].size):null,!G.inputSize)throw new Error(`Human: Cannot determine model inputSize: ${A.object.modelPath}`);!G||!G.modelUrl?g("load model failed:",A.object.modelPath):A.debug&&g("load model:",G.modelUrl)}return G}async function A2(A,e,t,o){let n=0,x=[];for(let i of[1,2,4])r.tidy(()=>{var m,v;let c=i*13,l=(m=A.find(S=>S.shape[1]===c**2&&S.shape[2]===M0.length))==null?void 0:m.squeeze(),f=(v=A.find(S=>S.shape[1]===c**2&&S.shape[2]o.object.minConfidence&&j!==61){let P=(.5+Math.trunc(S%c))/c,u=(.5+Math.trunc(S/c))/c,M=E[S].map(F=>F*(c/i/e)),[T,b]=[P-Q0/i*M[0],u-Q0/i*M[1]],[k,H]=[P+Q0/i*M[2]-T,u+Q0/i*M[3]-b],I=[T,b,k,H];I=I.map(F=>Math.max(0,Math.min(F,1)));let O=[I[0]*t[0],I[1]*t[1],I[2]*t[0],I[3]*t[1]],z={id:n++,score:Math.round(100*W)/100,class:j+1,label:M0[j].label,box:O.map(F=>Math.trunc(F)),boxRaw:I};x.push(z)}}});A.forEach(i=>r.dispose(i));let a=x.map(i=>[i.boxRaw[1],i.boxRaw[0],i.boxRaw[3],i.boxRaw[2]]),s=x.map(i=>i.score),y=[];if(a&&a.length>0){let i=await r.image.nonMaxSuppressionAsync(a,s,o.object.maxDetected,o.object.iouThreshold,o.object.minConfidence);y=i.dataSync(),r.dispose(i)}return x=x.filter((i,c)=>y.includes(c)).sort((i,c)=>c.score-i.score),x}async function nA(A,e){return eA0?(eA++,AA):(eA=0,new Promise(async t=>{let o=[A.shape[2],A.shape[1]],n=r.image.resizeBilinear(A,[G.inputSize,G.inputSize],!1),x=n.div(255),a=x.transpose([0,3,1,2]);x.dispose(),n.dispose();let s;e.object.enabled&&(s=await G.predict(a)),a.dispose();let y=await A2(s,G.inputSize,o,e);AA=y,t(y)}))}var xA={};e0(xA,{load:()=>iA,predict:()=>aA});var K,sA=[],rA=Number.MAX_SAFE_INTEGER;async function iA(A){if(K)A.debug&&g("cached model:",K.modelUrl);else{K=await r.loadGraphModel(Z(A.modelBasePath,A.object.modelPath));let e=Object.values(K.modelSignature.inputs);if(K.inputSize=Array.isArray(e)?parseInt(e[0].tensorShape.dim[2].size):null,!K.inputSize)throw new Error(`Human: Cannot determine model inputSize: ${A.object.modelPath}`);!K||!K.modelUrl?g("load model failed:",A.object.modelPath):A.debug&&g("load model:",K.modelUrl)}return K}async function e2(A,e,t,o){if(!A)return[];let n=[],x=A.arraySync(),a=r.squeeze(A);A.dispose();let s=r.split(a,6,1);a.dispose();let i=r.stack([s[1],s[0],s[3],s[2]],1).squeeze(),c=s[4].squeeze(),l=s[5].squeeze();s.forEach(d=>d.dispose());let f=await r.image.nonMaxSuppressionAsync(i,c,o.object.maxDetected,o.object.iouThreshold,o.object.minConfidence);i.dispose(),c.dispose(),l.dispose();let p=f.dataSync();f.dispose();let E=0;for(let d of p){let m=Math.trunc(100*x[0][d][4])/100,v=x[0][d][5],S=M0[v].label,j=[x[0][d][0]/e,x[0][d][1]/e,x[0][d][2]/e,x[0][d][3]/e],W=[Math.trunc(j[0]*t[0]),Math.trunc(j[1]*t[1]),Math.trunc(j[2]*t[0]),Math.trunc(j[3]*t[1])];n.push({id:E++,score:m,class:v,label:S,box:W,boxRaw:j})}return n}async function aA(A,e){return rA0?(rA++,sA):(rA=0,new Promise(async t=>{let o=[A.shape[2],A.shape[1]],n=r.image.resizeBilinear(A,[K.inputSize,K.inputSize]),x=e.object.enabled?K.execute(n,["tower_0/detections"]):null;n.dispose();let a=await e2(x,K.inputSize,o,e);sA=a,t(a)}))}var ae=A=>{if(!A)return[];let e=[];for(let t=0;ty.part==="leftWrist"),n=A[t].keypoints.find(y=>y.part==="rightWrist"),x=A[t].keypoints.find(y=>y.part==="nose");x&&o&&n&&o.position.yy.part==="leftShoulder"),s=A[t].keypoints.find(y=>y.part==="rightShoulder");a&&s&&e.push({body:t,gesture:`leaning ${a.position.y>s.position.y?"left":"right"}`})}return e},xe=A=>{if(!A)return[];let e=[];for(let t=0;t0){let o=A[t].mesh[33][2]-A[t].mesh[263][2];Math.abs(o)<10?e.push({face:t,gesture:"facing center"}):e.push({face:t,gesture:`facing ${o<0?"left":"right"}`}),Math.abs(A[t].mesh[374][1]-A[t].mesh[386][1])/Math.abs(A[t].mesh[443][1]-A[t].mesh[450][1])<.2&&e.push({face:t,gesture:"blink left eye"}),Math.abs(A[t].mesh[145][1]-A[t].mesh[159][1])/Math.abs(A[t].mesh[223][1]-A[t].mesh[230][1])<.2&&e.push({face:t,gesture:"blink right eye"});let a=Math.min(100,500*Math.abs(A[t].mesh[13][1]-A[t].mesh[14][1])/Math.abs(A[t].mesh[10][1]-A[t].mesh[152][1]));a>10&&e.push({face:t,gesture:`mouth ${Math.trunc(a)}% open`});let s=A[t].mesh[152][2];Math.abs(s)>10&&e.push({face:t,gesture:`head ${s<0?"up":"down"}`})}return e},ye=A=>{if(!A)return[];let e=[];for(let t=0;t.06||l>.06)&&(i=!1),f>.06&&e.push({iris:t,gesture:"looking right"}),l>.06&&e.push({iris:t,gesture:"looking left"});let p=Math.abs(A[t].mesh[145][1]-A[t].annotations.rightEyeIris[0][1])/A[t].box[3],E=Math.abs(A[t].mesh[374][1]-A[t].annotations.leftEyeIris[0][1])/A[t].box[3];(E<.01||p<.01||E>.022||p>.022)&&(i=!1),(E<.01||p<.01)&&e.push({iris:t,gesture:"looking down"}),(E>.022||p>.022)&&e.push({iris:t,gesture:"looking up"}),i&&e.push({iris:t,gesture:"looking center"})}return e},le=A=>{if(!A)return[];let e=[];for(let t=0;t0){let n=o.reduce((a,s)=>a.position[2]a.position[1](i[f]=0,l))},n=function(s,y){let i=A.createShader(y);if(A.shaderSource(i,s),A.compileShader(i),!A.getShaderParameter(i,A.COMPILE_STATUS))throw new Error("Filter: GL compile failed",A.getShaderInfoLog(i));return i};this.uniform={},this.attribute={};let x=n(e,A.VERTEX_SHADER),a=n(t,A.FRAGMENT_SHADER);if(this.id=A.createProgram(),A.attachShader(this.id,x),A.attachShader(this.id,a),A.linkProgram(this.id),!A.getProgramParameter(this.id,A.LINK_STATUS))throw new Error("Filter: GL link failed",A.getProgramInfoLog(this.id));A.useProgram(this.id),o(e,"attribute",this.attribute);for(let s in this.attribute)this.attribute[s]=A.getAttribLocation(this.id,s);o(e,"uniform",this.uniform),o(t,"uniform",this.uniform);for(let s in this.uniform)this.uniform[s]=A.getUniformLocation(this.id,s)}function ce(A){A||(A={});let e=0,t=null,o=!1,n=-1,x=[null,null],a=[],s=-1,y=-1,i=null,c=null,l={},f=A.canvas||document.createElement("canvas"),p={},E={INTERMEDIATE:1},d=f.getContext("webgl");if(!d)throw new Error("Filter: getContext() failed");this.addFilter=function(P){let u=Array.prototype.slice.call(arguments,1),M=l[P];a.push({func:M,args:u})},this.reset=function(){a=[]};let m=function(P,u){if(!(P===s&&u===y)){if(f.width=P,s=P,f.height=u,y=u,!i){let M=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]);i=d.createBuffer(),d.bindBuffer(d.ARRAY_BUFFER,i),d.bufferData(d.ARRAY_BUFFER,M,d.STATIC_DRAW),d.pixelStorei(d.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0)}d.viewport(0,0,s,y),x=[null,null]}},v=function(P,u){let M=d.createFramebuffer();d.bindFramebuffer(d.FRAMEBUFFER,M);let T=d.createRenderbuffer();d.bindRenderbuffer(d.RENDERBUFFER,T);let b=d.createTexture();return d.bindTexture(d.TEXTURE_2D,b),d.texImage2D(d.TEXTURE_2D,0,d.RGBA,P,u,0,d.RGBA,d.UNSIGNED_BYTE,null),d.texParameteri(d.TEXTURE_2D,d.TEXTURE_MAG_FILTER,d.LINEAR),d.texParameteri(d.TEXTURE_2D,d.TEXTURE_MIN_FILTER,d.LINEAR),d.texParameteri(d.TEXTURE_2D,d.TEXTURE_WRAP_S,d.CLAMP_TO_EDGE),d.texParameteri(d.TEXTURE_2D,d.TEXTURE_WRAP_T,d.CLAMP_TO_EDGE),d.framebufferTexture2D(d.FRAMEBUFFER,d.COLOR_ATTACHMENT0,d.TEXTURE_2D,b,0),d.bindTexture(d.TEXTURE_2D,null),d.bindFramebuffer(d.FRAMEBUFFER,null),{fbo:M,texture:b}},S=function(P){return x[P]=x[P]||v(s,y),x[P]},j=function(P=null){var b,k;let u=null,M=null,T=!1;e===0?u=t:u=(b=S(n))==null?void 0:b.texture,e++,o&&!(P&E.INTERMEDIATE)?(M=null,T=e%2==0):(n=(n+1)%2,M=(k=S(n))==null?void 0:k.fbo),d.bindTexture(d.TEXTURE_2D,u),d.bindFramebuffer(d.FRAMEBUFFER,M),d.uniform1f(c.uniform.flipY,T?-1:1),d.drawArrays(d.TRIANGLES,0,6)};this.apply=function(P){if(m(P.width,P.height),e=0,t||(t=d.createTexture()),d.bindTexture(d.TEXTURE_2D,t),d.texParameteri(d.TEXTURE_2D,d.TEXTURE_WRAP_S,d.CLAMP_TO_EDGE),d.texParameteri(d.TEXTURE_2D,d.TEXTURE_WRAP_T,d.CLAMP_TO_EDGE),d.texParameteri(d.TEXTURE_2D,d.TEXTURE_MIN_FILTER,d.NEAREST),d.texParameteri(d.TEXTURE_2D,d.TEXTURE_MAG_FILTER,d.NEAREST),d.texImage2D(d.TEXTURE_2D,0,d.RGBA,d.RGBA,d.UNSIGNED_BYTE,P),a.length===0)return j(),f;for(let u=0;u0,x=A.naturalHeight||A.videoHeight||A.height||A.shape&&A.shape[2]>0;if(!n||!x)return{tensor:null,canvas:R};let a=n,s=x;if(a>_0&&(a=_0,s=a*x/n),s>_0&&(s=_0,a=s*n/x),e.filter.width>0?a=e.filter.width:e.filter.height>0&&(a=n*(e.filter.height/x)),e.filter.height>0?s=e.filter.height:e.filter.width>0&&(s=x*(e.filter.width/n)),!a||!s)throw new Error("Human: Input cannot determine dimension");(!R||(R==null?void 0:R.width)!==a||(R==null?void 0:R.height)!==s)&&(R=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(a,s):document.createElement("canvas"),(R==null?void 0:R.width)!==a&&(R.width=a),(R==null?void 0:R.height)!==s&&(R.height=s));let y=R.getContext("2d");if(A instanceof ImageData?y.putImageData(A,0,0):e.filter.flip&&typeof y.translate!="undefined"?(y.translate(n,0),y.scale(-1,1),y.drawImage(A,0,0,n,x,0,0,R==null?void 0:R.width,R==null?void 0:R.height),y.setTransform(1,0,0,1,0,0)):y.drawImage(A,0,0,n,x,0,0,R==null?void 0:R.width,R==null?void 0:R.height),e.filter.enabled){if((!X||!L||R.width!==L.width||(R==null?void 0:R.height)!==(L==null?void 0:L.height))&&(L=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(R==null?void 0:R.width,R==null?void 0:R.height):document.createElement("canvas"),(L==null?void 0:L.width)!==(R==null?void 0:R.width)&&(L.width=R==null?void 0:R.width),(L==null?void 0:L.height)!==(R==null?void 0:R.height)&&(L.height=R==null?void 0:R.height),X=r.ENV.flags.IS_BROWSER?new ce({canvas:L}):null),!X)return{tensor:null,canvas:R};X.reset(),X.addFilter("brightness",e.filter.brightness),e.filter.contrast!==0&&X.addFilter("contrast",e.filter.contrast),e.filter.sharpness!==0&&X.addFilter("sharpen",e.filter.sharpness),e.filter.blur!==0&&X.addFilter("blur",e.filter.blur),e.filter.saturation!==0&&X.addFilter("saturation",e.filter.saturation),e.filter.hue!==0&&X.addFilter("hue",e.filter.hue),e.filter.negative&&X.addFilter("negative"),e.filter.sepia&&X.addFilter("sepia"),e.filter.vintage&&X.addFilter("brownie"),e.filter.sepia&&X.addFilter("sepia"),e.filter.kodachrome&&X.addFilter("kodachrome"),e.filter.technicolor&&X.addFilter("technicolor"),e.filter.polaroid&&X.addFilter("polaroid"),e.filter.pixelate!==0&&X.addFilter("pixelate",e.filter.pixelate),X.apply(R)}else L=R,X&&(X=null);let i;if(L.data){let l=[L.height,L.width,3];i=r.tensor3d(L.data,l,"int32")}else if(L instanceof ImageData)i=r.browser.fromPixels(L);else if(e.backend==="webgl"||e.backend==="humangl"){let l=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(a,s):document.createElement("canvas");l.width=a,l.height=s;let f=l.getContext("2d");f==null||f.drawImage(L,0,0),i=r.browser.fromPixels(l)}else{let l=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(a,s):document.createElement("canvas");l.width=a,l.height=s;let f=l.getContext("2d");f==null||f.drawImage(L,0,0);let p=f==null?void 0:f.getImageData(0,0,a,s);i=r.browser.fromPixels(p)}let c=i.toFloat();t=c.expandDims(0),i.dispose(),c.dispose()}let o=e.filter.return?L:null;return{tensor:t,canvas:o}}var dA={};e0(dA,{all:()=>s2,body:()=>me,canvas:()=>o2,face:()=>fe,gesture:()=>de,hand:()=>he,object:()=>ue,options:()=>y0,person:()=>n2});var y0={color:"rgba(173, 216, 230, 0.6)",labelColor:"rgba(173, 216, 230, 1)",shadowColor:"black",font:'small-caps 14px "Segoe UI"',lineHeight:24,lineWidth:6,pointSize:2,roundRect:28,drawPoints:!1,drawLabels:!0,drawBoxes:!0,drawPolygons:!0,drawGaze:!0,fillPolygons:!1,useDepth:!0,useCurves:!1,bufferedOutput:!0},$0=A=>Math.round(A*180/Math.PI);function lA(A,e,t,o=0,n){A.fillStyle=n.useDepth&&o?`rgba(${127.5+2*o}, ${127.5-2*o}, 255, 0.3)`:n.color,A.beginPath(),A.arc(e,t,n.pointSize,0,2*Math.PI),A.fill()}function w0(A,e,t,o,n,x){if(A.beginPath(),x.useCurves){let a=(e+e+o)/2,s=(t+t+n)/2;A.ellipse(a,s,o/2,n/2,0,0,2*Math.PI)}else A.lineWidth=x.lineWidth,A.moveTo(e+x.roundRect,t),A.lineTo(e+o-x.roundRect,t),A.quadraticCurveTo(e+o,t,e+o,t+x.roundRect),A.lineTo(e+o,t+n-x.roundRect),A.quadraticCurveTo(e+o,t+n,e+o-x.roundRect,t+n),A.lineTo(e+x.roundRect,t+n),A.quadraticCurveTo(e,t+n,e,t+n-x.roundRect),A.lineTo(e,t+x.roundRect),A.quadraticCurveTo(e,t,e+x.roundRect,t),A.closePath();A.stroke()}function cA(A,e=[],t){if(!(e===void 0||e.length===0)){A.beginPath(),A.moveTo(e[0][0],e[0][1]);for(let o of e){let n=o[2]||0;A.strokeStyle=t.useDepth&&n?`rgba(${127.5+2*n}, ${127.5-2*n}, 255, 0.3)`:t.color,A.fillStyle=t.useDepth&&n?`rgba(${127.5+2*n}, ${127.5-2*n}, 255, 0.3)`:t.color,A.lineTo(o[0],Math.round(o[1]))}A.stroke(),t.fillPolygons&&(A.closePath(),A.fill())}}function W0(A,e=[],t){if(!(e===void 0||e.length===0)){if(!t.useCurves||e.length<=2){cA(A,e,t);return}A.moveTo(e[0][0],e[0][1]);for(let o=0;o1&&y[1].length>0){let i=s[1]>0?`#${s[1]}`:"",c=`${s[0]} ${i}: ${y[1]}`;o.shadowColor&&o.shadowColor!==""&&(n.fillStyle=o.shadowColor,n.fillText(c,8,2+x*o.lineHeight)),n.fillStyle=o.labelColor,n.fillText(c,6,0+x*o.lineHeight),x+=1}}}async function fe(A,e,t){var x,a,s,y;let o=U(y0,t);if(!e||!A||!(A instanceof HTMLCanvasElement))return;let n=A.getContext("2d");if(!!n)for(let i of e){n.font=o.font,n.strokeStyle=o.color,n.fillStyle=o.color,o.drawBoxes&&w0(n,i.box[0],i.box[1],i.box[2],i.box[3],o);let c=[];if(c.push(`face: ${Math.trunc(100*i.score)}%`),i.genderScore&&c.push(`${i.gender||""} ${Math.trunc(100*i.genderScore)}%`),i.age&&c.push(`age: ${i.age||""}`),i.iris&&c.push(`distance: ${i.iris}`),i.emotion&&i.emotion.length>0){let l=i.emotion.map(f=>`${Math.trunc(100*f.score)}% ${f.emotion}`);l.length>3&&(l.length=3),c.push(l.join(" "))}i.rotation&&i.rotation.angle&&i.rotation.gaze&&(i.rotation.angle.roll&&c.push(`roll: ${$0(i.rotation.angle.roll)}\xB0 yaw:${$0(i.rotation.angle.yaw)}\xB0 pitch:${$0(i.rotation.angle.pitch)}\xB0`),i.rotation.gaze.bearing&&c.push(`gaze: ${$0(i.rotation.gaze.bearing)}\xB0`)),c.length===0&&c.push("face"),n.fillStyle=o.color;for(let l=c.length-1;l>=0;l--){let f=Math.max(i.box[0],0),p=l*o.lineHeight+i.box[1];o.shadowColor&&o.shadowColor!==""&&(n.fillStyle=o.shadowColor,n.fillText(c[l],f+5,p+16)),n.fillStyle=o.labelColor,n.fillText(c[l],f+4,p+15)}if(n.lineWidth=1,i.mesh&&i.mesh.length>0){if(o.drawPoints)for(let l of i.mesh)lA(n,l[0],l[1],l[2],o);if(o.drawPolygons){n.lineWidth=1;for(let l=0;li.mesh[p]);cA(n,f,o)}if(i.annotations&&i.annotations.leftEyeIris){n.strokeStyle=o.useDepth?"rgba(255, 200, 255, 0.3)":o.color,n.beginPath();let l=Math.abs(i.annotations.leftEyeIris[3][0]-i.annotations.leftEyeIris[1][0])/2,f=Math.abs(i.annotations.leftEyeIris[4][1]-i.annotations.leftEyeIris[2][1])/2;n.ellipse(i.annotations.leftEyeIris[0][0],i.annotations.leftEyeIris[0][1],l,f,0,0,2*Math.PI),n.stroke(),o.fillPolygons&&(n.fillStyle=o.useDepth?"rgba(255, 255, 200, 0.3)":o.color,n.fill())}if(i.annotations&&i.annotations.rightEyeIris){n.strokeStyle=o.useDepth?"rgba(255, 200, 255, 0.3)":o.color,n.beginPath();let l=Math.abs(i.annotations.rightEyeIris[3][0]-i.annotations.rightEyeIris[1][0])/2,f=Math.abs(i.annotations.rightEyeIris[4][1]-i.annotations.rightEyeIris[2][1])/2;n.ellipse(i.annotations.rightEyeIris[0][0],i.annotations.rightEyeIris[0][1],l,f,0,0,2*Math.PI),n.stroke(),o.fillPolygons&&(n.fillStyle=o.useDepth?"rgba(255, 255, 200, 0.3)":o.color,n.fill())}if(o.drawGaze&&((a=(x=i.rotation)==null?void 0:x.gaze)==null?void 0:a.strength)&&((y=(s=i.rotation)==null?void 0:s.gaze)==null?void 0:y.bearing)){n.strokeStyle="pink",n.beginPath();let l=[i.annotations.leftEyeIris[0][0]+Math.sin(i.rotation.gaze.bearing)*i.rotation.gaze.strength*i.box[3],i.annotations.leftEyeIris[0][1]+Math.cos(i.rotation.gaze.bearing)*i.rotation.gaze.strength*i.box[2]];n.moveTo(i.annotations.leftEyeIris[0][0],i.annotations.leftEyeIris[0][1]),n.lineTo(l[0],l[1]);let f=[i.annotations.rightEyeIris[0][0]+Math.sin(i.rotation.gaze.bearing)*i.rotation.gaze.strength*i.box[3],i.annotations.rightEyeIris[0][1]+Math.cos(i.rotation.gaze.bearing)*i.rotation.gaze.strength*i.box[2]];n.moveTo(i.annotations.rightEyeIris[0][0],i.annotations.rightEyeIris[0][1]),n.lineTo(f[0],f[1]),n.stroke()}}}}}async function me(A,e,t){var x;let o=U(y0,t);if(!e||!A||!(A instanceof HTMLCanvasElement))return;let n=A.getContext("2d");if(!!n){n.lineJoin="round";for(let a=0;ai.part==="leftShoulder"),s&&y.push([s.position[0],s.position[1]]),s=e[a].keypoints.find(i=>i.part==="rightShoulder"),s&&y.push([s.position[0],s.position[1]]),W0(n,y,o),y.length=0,s=e[a].keypoints.find(i=>i.part==="rightShoulder"),s&&y.push([s.position[0],s.position[1]]),s=e[a].keypoints.find(i=>i.part==="rightHip"),s&&y.push([s.position[0],s.position[1]]),s=e[a].keypoints.find(i=>i.part==="leftHip"),s&&y.push([s.position[0],s.position[1]]),s=e[a].keypoints.find(i=>i.part==="leftShoulder"),s&&y.push([s.position[0],s.position[1]]),y.length===4&&cA(n,y,o),y.length=0,s=e[a].keypoints.find(i=>i.part==="leftHip"),s&&y.push([s.position[0],s.position[1]]),s=e[a].keypoints.find(i=>i.part==="leftKnee"),s&&y.push([s.position[0],s.position[1]]),s=e[a].keypoints.find(i=>i.part==="leftAnkle"),s&&y.push([s.position[0],s.position[1]]),s=e[a].keypoints.find(i=>i.part==="leftHeel"),s&&y.push([s.position[0],s.position[1]]),s=e[a].keypoints.find(i=>i.part==="leftFoot"),s&&y.push([s.position[0],s.position[1]]),W0(n,y,o),y.length=0,s=e[a].keypoints.find(i=>i.part==="rightHip"),s&&y.push([s.position[0],s.position[1]]),s=e[a].keypoints.find(i=>i.part==="rightKnee"),s&&y.push([s.position[0],s.position[1]]),s=e[a].keypoints.find(i=>i.part==="rightAnkle"),s&&y.push([s.position[0],s.position[1]]),s=e[a].keypoints.find(i=>i.part==="rightHeel"),s&&y.push([s.position[0],s.position[1]]),s=e[a].keypoints.find(i=>i.part==="rightFoot"),s&&y.push([s.position[0],s.position[1]]),W0(n,y,o),y.length=0,s=e[a].keypoints.find(i=>i.part==="leftShoulder"),s&&y.push([s.position[0],s.position[1]]),s=e[a].keypoints.find(i=>i.part==="leftElbow"),s&&y.push([s.position[0],s.position[1]]),s=e[a].keypoints.find(i=>i.part==="leftWrist"),s&&y.push([s.position[0],s.position[1]]),s=e[a].keypoints.find(i=>i.part==="leftPalm"),s&&y.push([s.position[0],s.position[1]]),W0(n,y,o),y.length=0,s=e[a].keypoints.find(i=>i.part==="rightShoulder"),s&&y.push([s.position[0],s.position[1]]),s=e[a].keypoints.find(i=>i.part==="rightElbow"),s&&y.push([s.position[0],s.position[1]]),s=e[a].keypoints.find(i=>i.part==="rightWrist"),s&&y.push([s.position[0],s.position[1]]),s=e[a].keypoints.find(i=>i.part==="rightPalm"),s&&y.push([s.position[0],s.position[1]]),W0(n,y,o)}}}}async function he(A,e,t){let o=U(y0,t);if(!e||!A||!(A instanceof HTMLCanvasElement))return;let n=A.getContext("2d");if(!!n){n.lineJoin="round",n.font=o.font;for(let x of e){if(o.drawBoxes&&(n.strokeStyle=o.color,n.fillStyle=o.color,w0(n,x.box[0],x.box[1],x.box[2],x.box[3],o),o.drawLabels&&(o.shadowColor&&o.shadowColor!==""&&(n.fillStyle=o.shadowColor,n.fillText("hand",x.box[0]+3,1+x.box[1]+o.lineHeight,x.box[2])),n.fillStyle=o.labelColor,n.fillText("hand",x.box[0]+2,0+x.box[1]+o.lineHeight,x.box[2])),n.stroke()),o.drawPoints&&x.keypoints&&x.keypoints.length>0)for(let a of x.keypoints)n.fillStyle=o.useDepth?`rgba(${127.5+2*a[2]}, ${127.5-2*a[2]}, 255, 0.5)`:o.color,lA(n,a[0],a[1],0,o);if(o.drawLabels){let a=(s,y)=>{n.fillStyle=o.useDepth?`rgba(${127.5+2*s[s.length-1][2]}, ${127.5-2*s[s.length-1][2]}, 255, 0.5)`:o.color,n.fillText(y,s[s.length-1][0]+4,s[s.length-1][1]+4)};n.font=o.font,a(x.annotations.indexFinger,"index"),a(x.annotations.middleFinger,"middle"),a(x.annotations.ringFinger,"ring"),a(x.annotations.pinky,"pinky"),a(x.annotations.thumb,"thumb"),a(x.annotations.palmBase,"palm")}if(o.drawPolygons){let a=s=>{if(!!s)for(let y=0;y0?y-1:0][0],s[y>0?y-1:0][1]),n.lineTo(s[y][0],s[y][1]),n.stroke()};n.lineWidth=o.lineWidth,a(x.annotations.indexFinger),a(x.annotations.middleFinger),a(x.annotations.ringFinger),a(x.annotations.pinky),a(x.annotations.thumb)}}}}async function ue(A,e,t){let o=U(y0,t);if(!e||!A||!(A instanceof HTMLCanvasElement))return;let n=A.getContext("2d");if(!!n){n.lineJoin="round",n.font=o.font;for(let x of e)if(o.drawBoxes){if(n.strokeStyle=o.color,n.fillStyle=o.color,w0(n,x.box[0],x.box[1],x.box[2],x.box[3],o),o.drawLabels){let a=`${Math.round(100*x.score)}% ${x.label}`;o.shadowColor&&o.shadowColor!==""&&(n.fillStyle=o.shadowColor,n.fillText(a,x.box[0]+3,1+x.box[1]+o.lineHeight,x.box[2])),n.fillStyle=o.labelColor,n.fillText(a,x.box[0]+2,0+x.box[1]+o.lineHeight,x.box[2])}n.stroke()}}}async function n2(A,e,t){let o=U(y0,t);if(!e||!A||!(A instanceof HTMLCanvasElement))return;let n=A.getContext("2d");if(!!n){n.lineJoin="round",n.font=o.font;for(let x=0;xz.box[0]&&M.box[0]z.box[1]&&M.box[1]+M.box[3]T.body.box[0]&&z.box[0]+z.box[2]T.body.box[1]&&z.box[1]+z.box[3]T.body.box[0]&&z.box[1]+z.box[3]>T.body.box[1]&&z.box[1]+z.box[3]{z&&z.length===4&&(b.push(z[0],z[0]+z[2]),k.push(z[1],z[1]+z[3]))};H((v=T.face)==null?void 0:v.box),H((S=T.body)==null?void 0:S.box),H((W=(j=T.hands)==null?void 0:j.left)==null?void 0:W.box),H((u=(P=T.hands)==null?void 0:P.right)==null?void 0:u.box);let I=Math.min(...b),O=Math.min(...k);T.box=[I,O,Math.max(...b)-I,Math.max(...k)-O],n&&n.length===4&&(T.boxRaw=[T.box[0]/n[2],T.box[1]/n[1],T.box[2]/n[2],T.box[3]/n[1]]),a.push(T)}return a}var w={face:[],body:[],hand:[],gesture:[],object:[],persons:[],performance:{},timestamp:0};function be(A){var n,x,a,s,y,i,c,l,f,p,E,d,m,v,S,j,W,P,u,M,T;let e=Date.now()-A.timestamp,t=e<1e3?8-Math.log(e):1;if(!w.body||A.body.length!==w.body.length)w.body=JSON.parse(JSON.stringify(A.body));else for(let b=0;b((t-1)*w.body[b].box[z]+O)/t),H=A.body[b].boxRaw.map((O,z)=>((t-1)*w.body[b].boxRaw[z]+O)/t),I=A.body[b].keypoints.map((O,z)=>({score:O.score,part:O.part,position:[w.body[b].keypoints[z]?((t-1)*w.body[b].keypoints[z].position[0]+O.position[0])/t:O.position[0],w.body[b].keypoints[z]?((t-1)*w.body[b].keypoints[z].position[1]+O.position[1])/t:O.position[1]],positionRaw:[w.body[b].keypoints[z]?((t-1)*w.body[b].keypoints[z].positionRaw[0]+O.positionRaw[0])/t:O.position[0],w.body[b].keypoints[z]?((t-1)*w.body[b].keypoints[z].positionRaw[1]+O.positionRaw[1])/t:O.position[1]]}));w.body[b]={...A.body[b],box:k,boxRaw:H,keypoints:I}}if(!w.hand||A.hand.length!==w.hand.length)w.hand=JSON.parse(JSON.stringify(A.hand));else for(let b=0;b((t-1)*w.hand[b].box[s0]+F)/t),H=A.hand[b].boxRaw.map((F,s0)=>((t-1)*w.hand[b].boxRaw[s0]+F)/t),I=A.hand[b].keypoints.map((F,s0)=>F.map((f0,z0)=>((t-1)*w.hand[b].keypoints[s0][z0]+f0)/t)),O=Object.keys(A.hand[b].annotations),z={};for(let F of O)z[F]=A.hand[b].annotations[F].map((s0,f0)=>s0.map((z0,i5)=>((t-1)*w.hand[b].annotations[F][f0][i5]+z0)/t));w.hand[b]={...A.hand[b],box:k,boxRaw:H,keypoints:I,annotations:z}}if(!w.face||A.face.length!==w.face.length)w.face=JSON.parse(JSON.stringify(A.face));else for(let b=0;b((t-1)*w.face[b].box[z]+O)/t),H=A.face[b].boxRaw.map((O,z)=>((t-1)*w.face[b].boxRaw[z]+O)/t),I={matrix:[0,0,0,0,0,0,0,0,0],angle:{roll:0,yaw:0,pitch:0},gaze:{bearing:0,strength:0}};I.matrix=(n=A.face[b].rotation)==null?void 0:n.matrix,I.angle={roll:((t-1)*(((a=(x=w.face[b].rotation)==null?void 0:x.angle)==null?void 0:a.roll)||0)+(((y=(s=A.face[b].rotation)==null?void 0:s.angle)==null?void 0:y.roll)||0))/t,yaw:((t-1)*(((c=(i=w.face[b].rotation)==null?void 0:i.angle)==null?void 0:c.yaw)||0)+(((f=(l=A.face[b].rotation)==null?void 0:l.angle)==null?void 0:f.yaw)||0))/t,pitch:((t-1)*(((E=(p=w.face[b].rotation)==null?void 0:p.angle)==null?void 0:E.pitch)||0)+(((m=(d=A.face[b].rotation)==null?void 0:d.angle)==null?void 0:m.pitch)||0))/t},I.gaze={bearing:((t-1)*(((S=(v=w.face[b].rotation)==null?void 0:v.gaze)==null?void 0:S.bearing)||0)+(((W=(j=A.face[b].rotation)==null?void 0:j.gaze)==null?void 0:W.bearing)||0))/t,strength:((t-1)*(((u=(P=w.face[b].rotation)==null?void 0:P.gaze)==null?void 0:u.strength)||0)+(((T=(M=A.face[b].rotation)==null?void 0:M.gaze)==null?void 0:T.strength)||0))/t},w.face[b]={...A.face[b],rotation:I,box:k,boxRaw:H}}if(!w.object||A.object.length!==w.object.length)w.object=JSON.parse(JSON.stringify(A.object));else for(let b=0;b((t-1)*w.object[b].box[O]+I)/t),H=A.object[b].boxRaw.map((I,O)=>((t-1)*w.object[b].boxRaw[O]+I)/t);w.object[b]={...A.object[b],box:k,boxRaw:H}}let o=A.persons;if(!w.persons||o.length!==w.persons.length)w.persons=JSON.parse(JSON.stringify(o));else for(let b=0;b((t-1)*w.persons[b].box[H]+k)/t);return w.gesture=A.gesture,w.performance=A.performance,w}var A5=` +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all2) => { + for (var name in all2) + __defProp(target, name, { get: all2[name], enumerable: true }); +}; +var __reExport = (target, module, desc) => { + if (module && typeof module === "object" || typeof module === "function") { + for (let key of __getOwnPropNames(module)) + if (!__hasOwnProp.call(target, key) && key !== "default") + __defProp(target, key, { get: () => module[key], enumerable: !(desc = __getOwnPropDesc(module, key)) || desc.enumerable }); + } + return target; +}; +var __accessCheck = (obj, member, msg) => { + if (!member.has(obj)) + throw TypeError("Cannot " + msg); +}; +var __privateGet = (obj, member, getter) => { + __accessCheck(obj, member, "read from private field"); + return getter ? getter.call(obj) : member.get(obj); +}; +var __privateAdd = (obj, member, value) => { + if (member.has(obj)) + throw TypeError("Cannot add the same private member more than once"); + member instanceof WeakSet ? member.add(obj) : member.set(obj, value); +}; +var __privateSet = (obj, member, value, setter) => { + __accessCheck(obj, member, "write to private field"); + setter ? setter.call(obj, value) : member.set(obj, value); + return value; +}; + +// src/helpers.ts +function join(folder, file) { + const separator = folder.endsWith("/") ? "" : "/"; + const skipJoin = file.startsWith(".") || file.startsWith("/") || file.startsWith("http:") || file.startsWith("https:") || file.startsWith("file:"); + const path = skipJoin ? `${file}` : `${folder}${separator}${file}`; + if (!path.toLocaleLowerCase().includes(".json")) + throw new Error(`Human: ModelPath Error: ${path} Expecting JSON file`); + return path; +} +function log(...msg) { + const dt = new Date(); + 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")}`; + if (msg) + console.log(ts, "Human:", ...msg); +} +var now = () => { + if (typeof performance !== "undefined") + return performance.now(); + return parseInt((Number(process.hrtime.bigint()) / 1e3 / 1e3).toString()); +}; +function mergeDeep(...objects) { + const isObject = (obj) => obj && typeof obj === "object"; + return objects.reduce((prev, obj) => { + Object.keys(obj || {}).forEach((key) => { + const pVal = prev[key]; + const oVal = obj[key]; + if (Array.isArray(pVal) && Array.isArray(oVal)) + prev[key] = pVal.concat(...oVal); + else if (isObject(pVal) && isObject(oVal)) + prev[key] = mergeDeep(pVal, oVal); + else + prev[key] = oVal; + }); + return prev; + }, {}); +} + +// src/config.ts +var config = { + backend: "webgl", + modelBasePath: "../models/", + wasmPath: "../node_modules/@tensorflow/tfjs-backend-wasm/dist/", + debug: true, + async: true, + warmup: "full", + cacheSensitivity: 0.75, + skipFrame: false, + filter: { + enabled: true, + width: 0, + height: 0, + flip: false, + return: true, + brightness: 0, + contrast: 0, + sharpness: 0, + blur: 0, + saturation: 0, + hue: 0, + negative: false, + sepia: false, + vintage: false, + kodachrome: false, + technicolor: false, + polaroid: false, + pixelate: 0 + }, + gesture: { + enabled: true + }, + face: { + enabled: true, + detector: { + modelPath: "blazeface.json", + rotation: true, + maxDetected: 15, + skipFrames: 15, + minConfidence: 0.2, + iouThreshold: 0.1, + return: false + }, + mesh: { + enabled: true, + modelPath: "facemesh.json" + }, + iris: { + enabled: true, + modelPath: "iris.json" + }, + description: { + enabled: true, + modelPath: "faceres.json", + skipFrames: 11, + minConfidence: 0.1 + }, + emotion: { + enabled: true, + minConfidence: 0.1, + skipFrames: 17, + modelPath: "emotion.json" + } + }, + body: { + enabled: true, + modelPath: "movenet-lightning.json", + maxDetected: 1, + minConfidence: 0.2, + skipFrames: 1 + }, + hand: { + enabled: true, + rotation: true, + skipFrames: 18, + minConfidence: 0.1, + iouThreshold: 0.1, + maxDetected: 2, + landmarks: true, + detector: { + modelPath: "handdetect.json" + }, + skeleton: { + modelPath: "handskeleton.json" + } + }, + object: { + enabled: false, + modelPath: "mb3-centernet.json", + minConfidence: 0.2, + iouThreshold: 0.4, + maxDetected: 10, + skipFrames: 19 + } +}; + +// src/sysinfo.ts +function info() { + let platform; + let agent; + if (typeof navigator !== "undefined") { + const raw = navigator.userAgent.match(/\(([^()]+)\)/g); + if (raw && raw[0]) { + const platformMatch = raw[0].match(/\(([^()]+)\)/g); + platform = platformMatch ? platformMatch[0].replace(/\(|\)/g, "") : ""; + agent = navigator.userAgent.replace(raw[0], ""); + if (platform[1]) + agent = agent.replace(raw[1], ""); + agent = agent.replace(/ /g, " "); + } + } else if (typeof process !== "undefined") { + platform = `${process.platform} ${process.arch}`; + agent = `NodeJS ${process.version}`; + } + return { platform, agent }; +} + +// dist/tfjs.esm.js +var tfjs_esm_exports = {}; +__export(tfjs_esm_exports, { + data: () => data, + version: () => version +}); +__reExport(tfjs_esm_exports, dist_star); +__reExport(tfjs_esm_exports, dist_star2); +__reExport(tfjs_esm_exports, dist_star3); +__reExport(tfjs_esm_exports, dist_star4); +__reExport(tfjs_esm_exports, dist_star5); +__reExport(tfjs_esm_exports, dist_star6); +import * as packageBundle from "@tensorflow/tfjs/package.json"; +import * as packageCore from "@tensorflow/tfjs-core/package.json"; +import * as packageData from "@tensorflow/tfjs-data/package.json"; +import * as packageLayers from "@tensorflow/tfjs-layers/package.json"; +import * as packageConverter from "@tensorflow/tfjs-converter/package.json"; +import { version_cpu } from "@tensorflow/tfjs-backend-cpu/dist/index.js"; +import { version_webgl } from "@tensorflow/tfjs-backend-webgl/dist/index.js"; +import { version_wasm } from "@tensorflow/tfjs-backend-wasm/dist/index.js"; +import * as dist_star from "@tensorflow/tfjs-core/dist/index.js"; +import * as dist_star2 from "@tensorflow/tfjs-layers/dist/index.js"; +import * as dist_star3 from "@tensorflow/tfjs-converter/dist/index.js"; +import * as data from "@tensorflow/tfjs-data/dist/index.js"; +import * as dist_star4 from "@tensorflow/tfjs-backend-cpu/dist/index.js"; +import * as dist_star5 from "@tensorflow/tfjs-backend-webgl/dist/index.js"; +import * as dist_star6 from "@tensorflow/tfjs-backend-wasm/dist/index.js"; +var version = { + tfjs: (packageBundle == null ? void 0 : packageBundle.version) || void 0, + "tfjs-core": (packageCore == null ? void 0 : packageCore.version) || void 0, + "tfjs-data": (packageData == null ? void 0 : packageData.version) || void 0, + "tfjs-layers": (packageLayers == null ? void 0 : packageLayers.version) || void 0, + "tfjs-converter": (packageConverter == null ? void 0 : packageConverter.version) || void 0, + "tfjs-backend-cpu": version_cpu || void 0, + "tfjs-backend-webgl": version_webgl || void 0, + "tfjs-backend-wasm": version_wasm || void 0 +}; + +// src/tfjs/backend.ts +var config2 = { + name: "humangl", + priority: 99, + canvas: null, + gl: null, + width: 1024, + height: 1024, + webGLattr: { + alpha: false, + antialias: false, + premultipliedAlpha: false, + preserveDrawingBuffer: false, + depth: false, + stencil: false, + failIfMajorPerformanceCaveat: false, + desynchronized: true + } +}; +function register() { + if (!tfjs_esm_exports.findBackend(config2.name)) { + log("backend registration:", config2.name); + try { + config2.canvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(config2.width, config2.height) : document.createElement("canvas"); + } catch (err) { + log("error: cannot create canvas:", err); + return; + } + try { + config2.gl = config2.canvas.getContext("webgl2", config2.webGLattr); + } catch (err) { + log("error: cannot get WebGL2 context:", err); + return; + } + try { + tfjs_esm_exports.setWebGLContext(2, config2.gl); + } catch (err) { + log("error: cannot set WebGL2 context:", err); + return; + } + try { + const ctx = new tfjs_esm_exports.GPGPUContext(config2.gl); + tfjs_esm_exports.registerBackend(config2.name, () => new tfjs_esm_exports.MathBackendWebGL(ctx), config2.priority); + } catch (err) { + log("error: cannot register WebGL backend:", err); + return; + } + try { + const kernels = tfjs_esm_exports.getKernelsForBackend("webgl"); + kernels.forEach((kernelConfig) => { + const newKernelConfig = { ...kernelConfig, backendName: config2.name }; + tfjs_esm_exports.registerKernel(newKernelConfig); + }); + } catch (err) { + log("error: cannot update WebGL backend registration:", err); + return; + } + try { + tfjs_esm_exports.ENV.set("WEBGL_VERSION", 2); + } catch (err) { + log("error: cannot set WebGL backend flags:", err); + return; + } + log("backend registered:", config2.name); + } +} + +// src/blazeface/facemesh.ts +var facemesh_exports = {}; +__export(facemesh_exports, { + load: () => load2, + predict: () => predict, + triangulation: () => triangulation, + uvmap: () => uvmap +}); + +// src/blazeface/box.ts +function scaleBoxCoordinates(box6, factor) { + const startPoint = [box6.startPoint[0] * factor[0], box6.startPoint[1] * factor[1]]; + const endPoint = [box6.endPoint[0] * factor[0], box6.endPoint[1] * factor[1]]; + return { startPoint, endPoint }; +} +function getBoxSize(box6) { + return [ + Math.abs(box6.endPoint[0] - box6.startPoint[0]), + Math.abs(box6.endPoint[1] - box6.startPoint[1]) + ]; +} +function getBoxCenter(box6) { + return [ + box6.startPoint[0] + (box6.endPoint[0] - box6.startPoint[0]) / 2, + box6.startPoint[1] + (box6.endPoint[1] - box6.startPoint[1]) / 2 + ]; +} +function cutBoxFromImageAndResize(box6, image15, cropSize) { + const h = image15.shape[1]; + const w = image15.shape[2]; + const boxes = [[ + box6.startPoint[1] / h, + box6.startPoint[0] / w, + box6.endPoint[1] / h, + box6.endPoint[0] / w + ]]; + return tfjs_esm_exports.image.cropAndResize(image15, boxes, [0], cropSize); +} +function enlargeBox(box6, factor = 1.5) { + const center = getBoxCenter(box6); + const size = getBoxSize(box6); + const newHalfSize = [factor * size[0] / 2, factor * size[1] / 2]; + const startPoint = [center[0] - newHalfSize[0], center[1] - newHalfSize[1]]; + const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]]; + return { startPoint, endPoint, landmarks: box6.landmarks }; +} +function squarifyBox(box6) { + const centers = getBoxCenter(box6); + const size = getBoxSize(box6); + const maxEdge = Math.max(...size); + const halfSize = maxEdge / 2; + const startPoint = [Math.round(centers[0] - halfSize), Math.round(centers[1] - halfSize)]; + const endPoint = [Math.round(centers[0] + halfSize), Math.round(centers[1] + halfSize)]; + return { startPoint, endPoint, landmarks: box6.landmarks }; +} +function calculateLandmarksBoundingBox(landmarks) { + const xs = landmarks.map((d) => d[0]); + const ys = landmarks.map((d) => d[1]); + const startPoint = [Math.min(...xs), Math.min(...ys)]; + const endPoint = [Math.max(...xs), Math.max(...ys)]; + return { startPoint, endPoint, landmarks }; +} +var createBox = (startEndTensor) => ({ + startPoint: tfjs_esm_exports.slice(startEndTensor, [0, 0], [-1, 2]), + endPoint: tfjs_esm_exports.slice(startEndTensor, [0, 2], [-1, 2]) +}); + +// src/blazeface/util.ts +var IDENTITY_MATRIX = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]; +function normalizeRadians(angle) { + return angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI)); +} +function computeRotation(point1, point2) { + const radians = Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]); + return normalizeRadians(radians); +} +function buildTranslationMatrix(x, y) { + return [[1, 0, x], [0, 1, y], [0, 0, 1]]; +} +function dot(v1, v2) { + let product = 0; + for (let i = 0; i < v1.length; i++) { + product += v1[i] * v2[i]; + } + return product; +} +function getColumnFrom2DArr(arr, columnIndex) { + const column = []; + for (let i = 0; i < arr.length; i++) { + column.push(arr[i][columnIndex]); + } + return column; +} +function multiplyTransformMatrices(mat1, mat2) { + const product = []; + const size = mat1.length; + for (let row = 0; row < size; row++) { + product.push([]); + for (let col = 0; col < size; col++) { + product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col))); + } + } + return product; +} +function buildRotationMatrix(rotation, center) { + const cosA = Math.cos(rotation); + const sinA = Math.sin(rotation); + const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]]; + const translationMatrix = buildTranslationMatrix(center[0], center[1]); + const translationTimesRotation = multiplyTransformMatrices(translationMatrix, rotationMatrix); + const negativeTranslationMatrix = buildTranslationMatrix(-center[0], -center[1]); + return multiplyTransformMatrices(translationTimesRotation, negativeTranslationMatrix); +} +function invertTransformMatrix(matrix) { + const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]]; + const translationComponent = [matrix[0][2], matrix[1][2]]; + const invertedTranslation = [ + -dot(rotationComponent[0], translationComponent), + -dot(rotationComponent[1], translationComponent) + ]; + return [ + rotationComponent[0].concat(invertedTranslation[0]), + rotationComponent[1].concat(invertedTranslation[1]), + [0, 0, 1] + ]; +} +function rotatePoint(homogeneousCoordinate, rotationMatrix) { + return [ + dot(homogeneousCoordinate, rotationMatrix[0]), + dot(homogeneousCoordinate, rotationMatrix[1]) + ]; +} +function generateAnchors(inputSize) { + const spec = { strides: [inputSize / 16, inputSize / 8], anchors: [2, 6] }; + const anchors3 = []; + for (let i = 0; i < spec.strides.length; i++) { + const stride = spec.strides[i]; + const gridRows = Math.floor((inputSize + stride - 1) / stride); + const gridCols = Math.floor((inputSize + stride - 1) / stride); + const anchorsNum = spec.anchors[i]; + for (let gridY = 0; gridY < gridRows; gridY++) { + const anchorY = stride * (gridY + 0.5); + for (let gridX = 0; gridX < gridCols; gridX++) { + const anchorX = stride * (gridX + 0.5); + for (let n = 0; n < anchorsNum; n++) { + anchors3.push([anchorX, anchorY]); + } + } + } + } + return anchors3; +} + +// src/blazeface/blazeface.ts +var keypointsCount = 6; +function decodeBounds(boxOutputs, anchors3, inputSize) { + const boxStarts = tfjs_esm_exports.slice(boxOutputs, [0, 1], [-1, 2]); + const centers = tfjs_esm_exports.add(boxStarts, anchors3); + const boxSizes = tfjs_esm_exports.slice(boxOutputs, [0, 3], [-1, 2]); + const boxSizesNormalized = tfjs_esm_exports.div(boxSizes, inputSize); + const centersNormalized = tfjs_esm_exports.div(centers, inputSize); + const halfBoxSize = tfjs_esm_exports.div(boxSizesNormalized, 2); + const starts = tfjs_esm_exports.sub(centersNormalized, halfBoxSize); + const ends = tfjs_esm_exports.add(centersNormalized, halfBoxSize); + const startNormalized = tfjs_esm_exports.mul(starts, inputSize); + const endNormalized = tfjs_esm_exports.mul(ends, inputSize); + const concatAxis = 1; + return tfjs_esm_exports.concat2d([startNormalized, endNormalized], concatAxis); +} +var BlazeFaceModel = class { + constructor(model9, config3) { + this.model = model9; + this.anchorsData = generateAnchors(model9.inputs[0].shape[1]); + this.anchors = tfjs_esm_exports.tensor2d(this.anchorsData); + this.inputSize = model9.inputs[0].shape[2]; + this.config = config3; + } + async getBoundingBoxes(inputImage) { + if (!inputImage || inputImage.isDisposedInternal || inputImage.shape.length !== 4 || inputImage.shape[1] < 1 || inputImage.shape[2] < 1) + return null; + const [batch, boxes, scores] = tfjs_esm_exports.tidy(() => { + const resizedImage = inputImage.resizeBilinear([this.inputSize, this.inputSize]); + const normalizedImage = resizedImage.div(127.5).sub(0.5); + const res = this.model.execute(normalizedImage); + let batchOut; + if (Array.isArray(res)) { + const sorted = res.sort((a, b) => a.size - b.size); + const concat384 = tfjs_esm_exports.concat([sorted[0], sorted[2]], 2); + const concat512 = tfjs_esm_exports.concat([sorted[1], sorted[3]], 2); + const concat3 = tfjs_esm_exports.concat([concat512, concat384], 1); + batchOut = concat3.squeeze(0); + } else { + batchOut = res.squeeze(); + } + const boxesOut = decodeBounds(batchOut, this.anchors, [this.inputSize, this.inputSize]); + const logits = tfjs_esm_exports.slice(batchOut, [0, 0], [-1, 1]); + const scoresOut = tfjs_esm_exports.sigmoid(logits).squeeze().dataSync(); + return [batchOut, boxesOut, scoresOut]; + }); + const nmsTensor = await tfjs_esm_exports.image.nonMaxSuppressionAsync(boxes, scores, this.config.face.detector.maxDetected, this.config.face.detector.iouThreshold, this.config.face.detector.minConfidence); + const nms = nmsTensor.arraySync(); + nmsTensor.dispose(); + const annotatedBoxes = []; + for (let i = 0; i < nms.length; i++) { + const confidence = scores[nms[i]]; + if (confidence > this.config.face.detector.minConfidence) { + const boundingBox = tfjs_esm_exports.slice(boxes, [nms[i], 0], [1, -1]); + const localBox = createBox(boundingBox); + boundingBox.dispose(); + const anchor = this.anchorsData[nms[i]]; + const landmarks = tfjs_esm_exports.tidy(() => tfjs_esm_exports.slice(batch, [nms[i], keypointsCount - 1], [1, -1]).squeeze().reshape([keypointsCount, -1])); + annotatedBoxes.push({ box: localBox, landmarks, anchor, confidence }); + } + } + batch.dispose(); + boxes.dispose(); + return { + boxes: annotatedBoxes, + scaleFactor: [inputImage.shape[2] / this.inputSize, inputImage.shape[1] / this.inputSize] + }; + } +}; +async function load(config3) { + const model9 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.face.detector.modelPath), { fromTFHub: config3.face.detector.modelPath.includes("tfhub.dev") }); + const blazeFace = new BlazeFaceModel(model9, config3); + if (!model9 || !model9.modelUrl) + log("load model failed:", config3.face.detector.modelPath); + else if (config3.debug) + log("load model:", model9.modelUrl); + return blazeFace; +} + +// src/blazeface/coords.ts +var MESH_ANNOTATIONS = { + 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] +}; +var MESH_TO_IRIS_INDICES_MAP = [ + { 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] } +]; +var UV468 = [ + [0.499976992607117, 0.652534008026123], + [0.500025987625122, 0.547487020492554], + [0.499974012374878, 0.602371990680695], + [0.482113003730774, 0.471979022026062], + [0.500150978565216, 0.527155995368958], + [0.499909996986389, 0.498252987861633], + [0.499523013830185, 0.40106201171875], + [0.289712011814117, 0.380764007568359], + [0.499954998493195, 0.312398016452789], + [0.499987006187439, 0.269918978214264], + [0.500023007392883, 0.107050001621246], + [0.500023007392883, 0.666234016418457], + [0.5000159740448, 0.679224014282227], + [0.500023007392883, 0.692348003387451], + [0.499976992607117, 0.695277988910675], + [0.499976992607117, 0.70593398809433], + [0.499976992607117, 0.719385027885437], + [0.499976992607117, 0.737019002437592], + [0.499967992305756, 0.781370997428894], + [0.499816000461578, 0.562981009483337], + [0.473773002624512, 0.573909997940063], + [0.104906998574734, 0.254140973091125], + [0.365929991006851, 0.409575998783112], + [0.338757991790771, 0.41302502155304], + [0.311120003461838, 0.409460008144379], + [0.274657994508743, 0.389131009578705], + [0.393361985683441, 0.403706014156342], + [0.345234006643295, 0.344011008739471], + [0.370094001293182, 0.346076011657715], + [0.319321990013123, 0.347265005111694], + [0.297903001308441, 0.353591024875641], + [0.24779200553894, 0.410809993743896], + [0.396889001131058, 0.842755019664764], + [0.280097991228104, 0.375599980354309], + [0.106310002505779, 0.399955987930298], + [0.2099249958992, 0.391353011131287], + [0.355807989835739, 0.534406006336212], + [0.471751004457474, 0.65040397644043], + [0.474155008792877, 0.680191993713379], + [0.439785003662109, 0.657229006290436], + [0.414617002010345, 0.66654098033905], + [0.450374007225037, 0.680860996246338], + [0.428770989179611, 0.682690978050232], + [0.374971002340317, 0.727805018424988], + [0.486716985702515, 0.547628998756409], + [0.485300987958908, 0.527395009994507], + [0.257764995098114, 0.314490020275116], + [0.401223003864288, 0.455172002315521], + [0.429818987846375, 0.548614978790283], + [0.421351999044418, 0.533740997314453], + [0.276895999908447, 0.532056987285614], + [0.483370006084442, 0.499586999416351], + [0.33721199631691, 0.282882988452911], + [0.296391993761063, 0.293242990970612], + [0.169294998049736, 0.193813979625702], + [0.447580009698868, 0.302609980106354], + [0.392390012741089, 0.353887975215912], + [0.354490011930466, 0.696784019470215], + [0.067304998636246, 0.730105042457581], + [0.442739009857178, 0.572826027870178], + [0.457098007202148, 0.584792017936707], + [0.381974011659622, 0.694710969924927], + [0.392388999462128, 0.694203019142151], + [0.277076005935669, 0.271932005882263], + [0.422551989555359, 0.563233017921448], + [0.385919004678726, 0.281364023685455], + [0.383103013038635, 0.255840003490448], + [0.331431001424789, 0.119714021682739], + [0.229923993349075, 0.232002973556519], + [0.364500999450684, 0.189113974571228], + [0.229622006416321, 0.299540996551514], + [0.173287004232407, 0.278747975826263], + [0.472878992557526, 0.666198015213013], + [0.446828007698059, 0.668527007102966], + [0.422762006521225, 0.673889994621277], + [0.445307999849319, 0.580065965652466], + [0.388103008270264, 0.693961024284363], + [0.403039008378983, 0.706539988517761], + [0.403629004955292, 0.693953037261963], + [0.460041999816895, 0.557139039039612], + [0.431158006191254, 0.692366003990173], + [0.452181994915009, 0.692366003990173], + [0.475387006998062, 0.692366003990173], + [0.465828001499176, 0.779190003871918], + [0.472328990697861, 0.736225962638855], + [0.473087012767792, 0.717857003211975], + [0.473122000694275, 0.704625964164734], + [0.473033010959625, 0.695277988910675], + [0.427942007780075, 0.695277988910675], + [0.426479011774063, 0.703539967536926], + [0.423162013292313, 0.711845993995667], + [0.4183090031147, 0.720062971115112], + [0.390094995498657, 0.639572978019714], + [0.013953999616206, 0.560034036636353], + [0.499913990497589, 0.58014702796936], + [0.413199990987778, 0.69539999961853], + [0.409626007080078, 0.701822996139526], + [0.468080013990402, 0.601534962654114], + [0.422728985548019, 0.585985004901886], + [0.463079988956451, 0.593783974647522], + [0.37211999297142, 0.47341400384903], + [0.334562003612518, 0.496073007583618], + [0.411671012639999, 0.546965003013611], + [0.242175996303558, 0.14767599105835], + [0.290776997804642, 0.201445996761322], + [0.327338010072708, 0.256527006626129], + [0.399509996175766, 0.748921036720276], + [0.441727995872498, 0.261676013469696], + [0.429764986038208, 0.187834024429321], + [0.412198007106781, 0.108901023864746], + [0.288955003023148, 0.398952007293701], + [0.218936994671822, 0.435410976409912], + [0.41278201341629, 0.398970007896423], + [0.257135003805161, 0.355440020561218], + [0.427684992551804, 0.437960982322693], + [0.448339998722076, 0.536936044692993], + [0.178560003638268, 0.45755398273468], + [0.247308000922203, 0.457193970680237], + [0.286267012357712, 0.467674970626831], + [0.332827985286713, 0.460712015628815], + [0.368755996227264, 0.447206974029541], + [0.398963987827301, 0.432654976844788], + [0.476410001516342, 0.405806005001068], + [0.189241006970406, 0.523923993110657], + [0.228962004184723, 0.348950982093811], + [0.490725994110107, 0.562400996685028], + [0.404670000076294, 0.485132992267609], + [0.019469000399113, 0.401564002037048], + [0.426243007183075, 0.420431017875671], + [0.396993011236191, 0.548797011375427], + [0.266469985246658, 0.376977026462555], + [0.439121007919312, 0.51895797252655], + [0.032313998788595, 0.644356966018677], + [0.419054001569748, 0.387154996395111], + [0.462783008813858, 0.505746960639954], + [0.238978996872902, 0.779744982719421], + [0.198220998048782, 0.831938028335571], + [0.107550002634525, 0.540755033493042], + [0.183610007166862, 0.740257024765015], + [0.134409993886948, 0.333683013916016], + [0.385764002799988, 0.883153975009918], + [0.490967005491257, 0.579378008842468], + [0.382384985685349, 0.508572995662689], + [0.174399003386497, 0.397670984268188], + [0.318785011768341, 0.39623498916626], + [0.343364000320435, 0.400596976280212], + [0.396100014448166, 0.710216999053955], + [0.187885001301765, 0.588537991046906], + [0.430987000465393, 0.944064974784851], + [0.318993002176285, 0.898285031318665], + [0.266247987747192, 0.869701027870178], + [0.500023007392883, 0.190576016902924], + [0.499976992607117, 0.954452991485596], + [0.366169989109039, 0.398822009563446], + [0.393207013607025, 0.39553701877594], + [0.410373002290726, 0.391080021858215], + [0.194993004202843, 0.342101991176605], + [0.388664990663528, 0.362284004688263], + [0.365961998701096, 0.355970978736877], + [0.343364000320435, 0.355356991291046], + [0.318785011768341, 0.35834002494812], + [0.301414996385574, 0.363156020641327], + [0.058132998645306, 0.319076001644135], + [0.301414996385574, 0.387449026107788], + [0.499987989664078, 0.618434011936188], + [0.415838003158569, 0.624195992946625], + [0.445681989192963, 0.566076993942261], + [0.465844005346298, 0.620640993118286], + [0.49992299079895, 0.351523995399475], + [0.288718998432159, 0.819945991039276], + [0.335278987884521, 0.852819979190826], + [0.440512001514435, 0.902418971061707], + [0.128294005990028, 0.791940987110138], + [0.408771991729736, 0.373893976211548], + [0.455606997013092, 0.451801002025604], + [0.499877005815506, 0.908990025520325], + [0.375436991453171, 0.924192011356354], + [0.11421000212431, 0.615022003650665], + [0.448662012815475, 0.695277988910675], + [0.4480200111866, 0.704632043838501], + [0.447111994028091, 0.715808033943176], + [0.444831997156143, 0.730794012546539], + [0.430011987686157, 0.766808986663818], + [0.406787008047104, 0.685672998428345], + [0.400738000869751, 0.681069016456604], + [0.392399996519089, 0.677703022956848], + [0.367855995893478, 0.663918972015381], + [0.247923001646996, 0.601333022117615], + [0.452769994735718, 0.420849978923798], + [0.43639200925827, 0.359887003898621], + [0.416164010763168, 0.368713974952698], + [0.413385987281799, 0.692366003990173], + [0.228018000721931, 0.683571994304657], + [0.468268007040024, 0.352671027183533], + [0.411361992359161, 0.804327011108398], + [0.499989002943039, 0.469825029373169], + [0.479153990745544, 0.442654013633728], + [0.499974012374878, 0.439637005329132], + [0.432112008333206, 0.493588984012604], + [0.499886006116867, 0.866917014122009], + [0.49991300702095, 0.821729004383087], + [0.456548988819122, 0.819200992584229], + [0.344549000263214, 0.745438992977142], + [0.37890899181366, 0.574010014533997], + [0.374292999505997, 0.780184984207153], + [0.319687992334366, 0.570737957954407], + [0.357154995203018, 0.604269981384277], + [0.295284003019333, 0.621580958366394], + [0.447750002145767, 0.862477004528046], + [0.410986006259918, 0.508723020553589], + [0.31395098567009, 0.775308012962341], + [0.354128003120422, 0.812552988529205], + [0.324548006057739, 0.703992962837219], + [0.189096003770828, 0.646299958229065], + [0.279776990413666, 0.71465802192688], + [0.1338230073452, 0.682700991630554], + [0.336768001317978, 0.644733011722565], + [0.429883986711502, 0.466521978378296], + [0.455527991056442, 0.548622965812683], + [0.437114000320435, 0.558896005153656], + [0.467287987470627, 0.529924988746643], + [0.414712011814117, 0.335219979286194], + [0.37704598903656, 0.322777986526489], + [0.344107985496521, 0.320150971412659], + [0.312875986099243, 0.32233202457428], + [0.283526003360748, 0.333190023899078], + [0.241245999932289, 0.382785975933075], + [0.102986000478268, 0.468762993812561], + [0.267612010240555, 0.424560010433197], + [0.297879010438919, 0.433175981044769], + [0.333433985710144, 0.433878004550934], + [0.366427004337311, 0.426115989685059], + [0.396012008190155, 0.416696012020111], + [0.420121014118195, 0.41022801399231], + [0.007561000064015, 0.480777025222778], + [0.432949006557465, 0.569517970085144], + [0.458638995885849, 0.479089021682739], + [0.473466008901596, 0.545744001865387], + [0.476087987422943, 0.563830018043518], + [0.468472003936768, 0.555056989192963], + [0.433990985155106, 0.582361996173859], + [0.483518004417419, 0.562983989715576], + [0.482482999563217, 0.57784903049469], + [0.42645001411438, 0.389798998832703], + [0.438998997211456, 0.39649498462677], + [0.450067013502121, 0.400434017181396], + [0.289712011814117, 0.368252992630005], + [0.276670008897781, 0.363372981548309], + [0.517862021923065, 0.471948027610779], + [0.710287988185883, 0.380764007568359], + [0.526226997375488, 0.573909997940063], + [0.895093023777008, 0.254140973091125], + [0.634069979190826, 0.409575998783112], + [0.661242008209229, 0.41302502155304], + [0.688880026340485, 0.409460008144379], + [0.725341975688934, 0.389131009578705], + [0.606630027294159, 0.40370500087738], + [0.654766023159027, 0.344011008739471], + [0.629905998706818, 0.346076011657715], + [0.680678009986877, 0.347265005111694], + [0.702096998691559, 0.353591024875641], + [0.75221198797226, 0.410804986953735], + [0.602918028831482, 0.842862963676453], + [0.719901978969574, 0.375599980354309], + [0.893692970275879, 0.399959981441498], + [0.790081977844238, 0.391354024410248], + [0.643998026847839, 0.534487962722778], + [0.528249025344849, 0.65040397644043], + [0.525849997997284, 0.680191040039062], + [0.560214996337891, 0.657229006290436], + [0.585384011268616, 0.66654098033905], + [0.549625992774963, 0.680860996246338], + [0.57122802734375, 0.682691991329193], + [0.624852001667023, 0.72809898853302], + [0.513050019741058, 0.547281980514526], + [0.51509702205658, 0.527251958847046], + [0.742246985435486, 0.314507007598877], + [0.598631024360657, 0.454979002475739], + [0.570338010787964, 0.548575043678284], + [0.578631997108459, 0.533622980117798], + [0.723087012767792, 0.532054007053375], + [0.516445994377136, 0.499638974666595], + [0.662801027297974, 0.282917976379395], + [0.70362401008606, 0.293271005153656], + [0.830704987049103, 0.193813979625702], + [0.552385985851288, 0.302568018436432], + [0.607609987258911, 0.353887975215912], + [0.645429015159607, 0.696707010269165], + [0.932694971561432, 0.730105042457581], + [0.557260990142822, 0.572826027870178], + [0.542901992797852, 0.584792017936707], + [0.6180260181427, 0.694710969924927], + [0.607590973377228, 0.694203019142151], + [0.722943007946014, 0.271963000297546], + [0.577413976192474, 0.563166975975037], + [0.614082992076874, 0.281386971473694], + [0.616907000541687, 0.255886018276215], + [0.668509006500244, 0.119913995265961], + [0.770092010498047, 0.232020974159241], + [0.635536015033722, 0.189248979091644], + [0.77039098739624, 0.299556016921997], + [0.826722025871277, 0.278755009174347], + [0.527121007442474, 0.666198015213013], + [0.553171992301941, 0.668527007102966], + [0.577238023281097, 0.673889994621277], + [0.554691970348358, 0.580065965652466], + [0.611896991729736, 0.693961024284363], + [0.59696102142334, 0.706539988517761], + [0.596370995044708, 0.693953037261963], + [0.539958000183105, 0.557139039039612], + [0.568841993808746, 0.692366003990173], + [0.547818005084991, 0.692366003990173], + [0.52461302280426, 0.692366003990173], + [0.534089982509613, 0.779141008853912], + [0.527670979499817, 0.736225962638855], + [0.526912987232208, 0.717857003211975], + [0.526877999305725, 0.704625964164734], + [0.526966989040375, 0.695277988910675], + [0.572058022022247, 0.695277988910675], + [0.573521018028259, 0.703539967536926], + [0.57683801651001, 0.711845993995667], + [0.581691026687622, 0.720062971115112], + [0.609944999217987, 0.639909982681274], + [0.986046016216278, 0.560034036636353], + [0.5867999792099, 0.69539999961853], + [0.590372025966644, 0.701822996139526], + [0.531915009021759, 0.601536989212036], + [0.577268004417419, 0.585934996604919], + [0.536915004253387, 0.593786001205444], + [0.627542972564697, 0.473352015018463], + [0.665585994720459, 0.495950996875763], + [0.588353991508484, 0.546862006187439], + [0.757824003696442, 0.14767599105835], + [0.709249973297119, 0.201507985591888], + [0.672684013843536, 0.256581008434296], + [0.600408971309662, 0.74900496006012], + [0.55826598405838, 0.261672019958496], + [0.570303976535797, 0.187870979309082], + [0.588165998458862, 0.109044015407562], + [0.711045026779175, 0.398952007293701], + [0.781069993972778, 0.435405015945435], + [0.587247014045715, 0.398931980133057], + [0.742869973182678, 0.355445981025696], + [0.572156012058258, 0.437651991844177], + [0.55186802148819, 0.536570012569427], + [0.821442008018494, 0.457556009292603], + [0.752701997756958, 0.457181990146637], + [0.71375697851181, 0.467626988887787], + [0.66711300611496, 0.460672974586487], + [0.631101012229919, 0.447153985500336], + [0.6008620262146, 0.432473003864288], + [0.523481011390686, 0.405627012252808], + [0.810747981071472, 0.523926019668579], + [0.771045982837677, 0.348959028720856], + [0.509127020835876, 0.562718033790588], + [0.595292985439301, 0.485023975372314], + [0.980530977249146, 0.401564002037048], + [0.573499977588654, 0.420000016689301], + [0.602994978427887, 0.548687994480133], + [0.733529984951019, 0.376977026462555], + [0.560611009597778, 0.519016981124878], + [0.967685997486115, 0.644356966018677], + [0.580985009670258, 0.387160003185272], + [0.537728011608124, 0.505385041236877], + [0.760966002941132, 0.779752969741821], + [0.801778972148895, 0.831938028335571], + [0.892440974712372, 0.54076099395752], + [0.816350996494293, 0.740260004997253], + [0.865594983100891, 0.333687007427216], + [0.614073991775513, 0.883246004581451], + [0.508952975273132, 0.579437971115112], + [0.617941975593567, 0.508316040039062], + [0.825608015060425, 0.397674977779388], + [0.681214988231659, 0.39623498916626], + [0.656635999679565, 0.400596976280212], + [0.603900015354156, 0.710216999053955], + [0.81208598613739, 0.588539004325867], + [0.56801301240921, 0.944564998149872], + [0.681007981300354, 0.898285031318665], + [0.733752012252808, 0.869701027870178], + [0.633830010890961, 0.398822009563446], + [0.606792986392975, 0.39553701877594], + [0.589659988880157, 0.391062021255493], + [0.805015981197357, 0.342108011245728], + [0.611334979534149, 0.362284004688263], + [0.634037971496582, 0.355970978736877], + [0.656635999679565, 0.355356991291046], + [0.681214988231659, 0.35834002494812], + [0.698584973812103, 0.363156020641327], + [0.941866993904114, 0.319076001644135], + [0.698584973812103, 0.387449026107788], + [0.584177017211914, 0.624107003211975], + [0.554318010807037, 0.566076993942261], + [0.534153997898102, 0.62064003944397], + [0.711217999458313, 0.819975018501282], + [0.664629995822906, 0.852871000766754], + [0.559099972248077, 0.902631998062134], + [0.871706008911133, 0.791940987110138], + [0.591234028339386, 0.373893976211548], + [0.544341027736664, 0.451583981513977], + [0.624562978744507, 0.924192011356354], + [0.88577002286911, 0.615028977394104], + [0.551338016986847, 0.695277988910675], + [0.551980018615723, 0.704632043838501], + [0.552887976169586, 0.715808033943176], + [0.555167973041534, 0.730794012546539], + [0.569944024085999, 0.767035007476807], + [0.593203008174896, 0.685675978660583], + [0.599261999130249, 0.681069016456604], + [0.607599973678589, 0.677703022956848], + [0.631937980651855, 0.663500010967255], + [0.752032995223999, 0.601315021514893], + [0.547226011753082, 0.420395016670227], + [0.563543975353241, 0.359827995300293], + [0.583841025829315, 0.368713974952698], + [0.586614012718201, 0.692366003990173], + [0.771915018558502, 0.683578014373779], + [0.531597018241882, 0.352482974529266], + [0.588370978832245, 0.804440975189209], + [0.52079701423645, 0.442565023899078], + [0.567984998226166, 0.493479013442993], + [0.543282985687256, 0.819254994392395], + [0.655317008495331, 0.745514988899231], + [0.621008992195129, 0.574018001556396], + [0.625559985637665, 0.78031200170517], + [0.680198013782501, 0.570719003677368], + [0.64276397228241, 0.604337990283966], + [0.704662978649139, 0.621529996395111], + [0.552012026309967, 0.862591981887817], + [0.589071989059448, 0.508637011051178], + [0.685944974422455, 0.775357007980347], + [0.645735025405884, 0.812640011310577], + [0.675342977046967, 0.703978002071381], + [0.810858011245728, 0.646304965019226], + [0.72012197971344, 0.714666962623596], + [0.866151988506317, 0.682704985141754], + [0.663187026977539, 0.644596993923187], + [0.570082008838654, 0.466325998306274], + [0.544561982154846, 0.548375964164734], + [0.562758982181549, 0.558784961700439], + [0.531987011432648, 0.530140042304993], + [0.585271000862122, 0.335177004337311], + [0.622952997684479, 0.32277899980545], + [0.655896008014679, 0.320163011550903], + [0.687132000923157, 0.322345972061157], + [0.716481983661652, 0.333200991153717], + [0.758756995201111, 0.382786989212036], + [0.897013008594513, 0.468769013881683], + [0.732392013072968, 0.424547016620636], + [0.70211398601532, 0.433162987232208], + [0.66652500629425, 0.433866024017334], + [0.633504986763, 0.426087975502014], + [0.603875994682312, 0.416586995124817], + [0.579657971858978, 0.409945011138916], + [0.992439985275269, 0.480777025222778], + [0.567192018032074, 0.569419980049133], + [0.54136598110199, 0.478899002075195], + [0.526564002037048, 0.546118021011353], + [0.523913025856018, 0.563830018043518], + [0.531529009342194, 0.555056989192963], + [0.566035985946655, 0.582329034805298], + [0.51631098985672, 0.563053965568542], + [0.5174720287323, 0.577877044677734], + [0.573594987392426, 0.389806985855103], + [0.560697972774506, 0.395331978797913], + [0.549755990505219, 0.399751007556915], + [0.710287988185883, 0.368252992630005], + [0.723330020904541, 0.363372981548309] +]; +var TRI468 = [ + 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 VTX68 = [ + 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 +]; +var VTX33 = [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]; +var VTX7 = [33, 133, 362, 263, 1, 78, 308]; +var UV68 = VTX68.map((x) => UV468[x]); +var UV33 = VTX33.map((x) => UV468[x]); +var UV7 = VTX7.map((x) => UV468[x]); + +// src/blazeface/facepipeline.ts +var leftOutline = MESH_ANNOTATIONS["leftEyeLower0"]; +var rightOutline = MESH_ANNOTATIONS["rightEyeLower0"]; +var eyeLandmarks = { + leftBounds: [leftOutline[0], leftOutline[leftOutline.length - 1]], + rightBounds: [rightOutline[0], rightOutline[rightOutline.length - 1]] +}; +var meshLandmarks = { + count: 468, + mouth: 13, + symmetryLine: [13, MESH_ANNOTATIONS["midwayBetweenEyes"][0]] +}; +var blazeFaceLandmarks = { + leftEye: 0, + rightEye: 1, + nose: 2, + mouth: 3, + leftEar: 4, + rightEar: 5, + symmetryLine: [3, 2] +}; +var irisLandmarks = { + upperCenter: 3, + lowerCenter: 4, + index: 71, + numCoordinates: 76 +}; +function replaceRawCoordinates(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 = MESH_ANNOTATIONS[`${prefix}${key}`]; + if (!keys || keys.includes(key)) { + for (let j = 0; j < indices.length; j++) { + const index = indices[j]; + rawCoords[originalIndices[j]] = [ + newCoords[index][0], + newCoords[index][1], + (newCoords[index][2] + rawCoords[originalIndices[j]][2]) / 2 + ]; + } + } + } +} +var Pipeline = class { + constructor(boundingBoxDetector, meshDetector, irisModel) { + var _a, _b; + this.storedBoxes = []; + this.boundingBoxDetector = boundingBoxDetector; + this.meshDetector = meshDetector; + this.irisModel = irisModel; + this.boxSize = ((_a = boundingBoxDetector == null ? void 0 : boundingBoxDetector.model) == null ? void 0 : _a.inputs[0].shape[2]) || 0; + this.meshSize = (meshDetector == null ? void 0 : meshDetector.inputs[0].shape[2]) || ((_b = boundingBoxDetector == null ? void 0 : boundingBoxDetector.model) == null ? void 0 : _b.inputs[0].shape[2]); + this.irisSize = (irisModel == null ? void 0 : irisModel.inputs[0].shape[1]) || 0; + this.irisEnlarge = 2.3; + this.skipped = 0; + this.detectedFaces = 0; + } + transformRawCoords(rawCoords, box6, angle, rotationMatrix) { + const boxSize = getBoxSize({ startPoint: box6.startPoint, endPoint: box6.endPoint }); + const coordsScaled = rawCoords.map((coord) => [ + boxSize[0] / this.meshSize * (coord[0] - this.meshSize / 2), + boxSize[1] / this.meshSize * (coord[1] - this.meshSize / 2), + coord[2] + ]); + const coordsRotationMatrix = angle !== 0 ? buildRotationMatrix(angle, [0, 0]) : IDENTITY_MATRIX; + const coordsRotated = angle !== 0 ? coordsScaled.map((coord) => [...rotatePoint(coord, coordsRotationMatrix), coord[2]]) : coordsScaled; + const inverseRotationMatrix = angle !== 0 ? invertTransformMatrix(rotationMatrix) : IDENTITY_MATRIX; + const boxCenter = [...getBoxCenter({ startPoint: box6.startPoint, endPoint: box6.endPoint }), 1]; + return coordsRotated.map((coord) => [ + Math.round(coord[0] + dot(boxCenter, inverseRotationMatrix[0])), + Math.round(coord[1] + dot(boxCenter, inverseRotationMatrix[1])), + Math.round(coord[2]) + ]); + } + getLeftToRightEyeDepthDifference(rawCoords) { + const leftEyeZ = rawCoords[eyeLandmarks.leftBounds[0]][2]; + const rightEyeZ = rawCoords[eyeLandmarks.rightBounds[0]][2]; + return leftEyeZ - rightEyeZ; + } + getEyeBox(rawCoords, face5, eyeInnerCornerIndex, eyeOuterCornerIndex, flip = false) { + const box6 = squarifyBox(enlargeBox(calculateLandmarksBoundingBox([rawCoords[eyeInnerCornerIndex], rawCoords[eyeOuterCornerIndex]]), this.irisEnlarge)); + const boxSize = getBoxSize(box6); + let crop = tfjs_esm_exports.image.cropAndResize(face5, [[ + box6.startPoint[1] / this.meshSize, + box6.startPoint[0] / this.meshSize, + box6.endPoint[1] / this.meshSize, + box6.endPoint[0] / this.meshSize + ]], [0], [this.irisSize, this.irisSize]); + if (flip && tfjs_esm_exports.ENV.flags.IS_BROWSER) { + crop = tfjs_esm_exports.image.flipLeftRight(crop); + } + return { box: box6, boxSize, crop }; + } + getEyeCoords(eyeData, eyeBox, eyeBoxSize, flip = false) { + const eyeRawCoords = []; + for (let i = 0; i < irisLandmarks.numCoordinates; i++) { + const x = eyeData[i * 3]; + const y = eyeData[i * 3 + 1]; + const z = eyeData[i * 3 + 2]; + eyeRawCoords.push([ + (flip ? 1 - x / this.irisSize : x / this.irisSize) * eyeBoxSize[0] + eyeBox.startPoint[0], + y / this.irisSize * eyeBoxSize[1] + eyeBox.startPoint[1], + z + ]); + } + return { rawCoords: eyeRawCoords, iris: eyeRawCoords.slice(irisLandmarks.index) }; + } + getAdjustedIrisCoords(rawCoords, irisCoords, direction) { + const upperCenterZ = rawCoords[MESH_ANNOTATIONS[`${direction}EyeUpper0`][irisLandmarks.upperCenter]][2]; + const lowerCenterZ = rawCoords[MESH_ANNOTATIONS[`${direction}EyeLower0`][irisLandmarks.lowerCenter]][2]; + const averageZ = (upperCenterZ + lowerCenterZ) / 2; + return irisCoords.map((coord, i) => { + let z = averageZ; + if (i === 2) { + z = upperCenterZ; + } else if (i === 4) { + z = lowerCenterZ; + } + return [coord[0], coord[1], z]; + }); + } + async predict(input, config3) { + let useFreshBox = false; + let detector; + if (this.skipped === 0 || this.skipped > config3.face.detector.skipFrames || !config3.face.mesh.enabled || !config3.skipFrame) { + detector = await this.boundingBoxDetector.getBoundingBoxes(input); + this.skipped = 0; + } + if (config3.skipFrame) + this.skipped++; + if (!config3.skipFrame || detector && detector.boxes && (!config3.face.mesh.enabled || detector.boxes.length !== this.detectedFaces && this.detectedFaces !== config3.face.detector.maxDetected)) { + this.storedBoxes = []; + this.detectedFaces = 0; + for (const possible of detector.boxes) { + this.storedBoxes.push({ startPoint: possible.box.startPoint.dataSync(), endPoint: possible.box.endPoint.dataSync(), landmarks: possible.landmarks.arraySync(), confidence: possible.confidence }); + } + if (this.storedBoxes.length > 0) + useFreshBox = true; + } + if (useFreshBox) { + if (!detector || !detector.boxes || detector.boxes.length === 0) { + this.storedBoxes = []; + this.detectedFaces = 0; + return null; + } + for (let i = 0; i < this.storedBoxes.length; i++) { + const scaledBox = scaleBoxCoordinates({ startPoint: this.storedBoxes[i].startPoint, endPoint: this.storedBoxes[i].endPoint }, detector.scaleFactor); + const enlargedBox = enlargeBox(scaledBox); + const squarifiedBox = squarifyBox(enlargedBox); + const landmarks = this.storedBoxes[i].landmarks; + const confidence = this.storedBoxes[i].confidence; + this.storedBoxes[i] = { ...squarifiedBox, confidence, landmarks }; + } + } + if (detector && detector.boxes) { + detector.boxes.forEach((prediction) => { + prediction.box.startPoint.dispose(); + prediction.box.endPoint.dispose(); + prediction.landmarks.dispose(); + }); + } + const results = tfjs_esm_exports.tidy(() => this.storedBoxes.map((box6, i) => { + let face5; + let angle = 0; + let rotationMatrix; + if (config3.face.detector.rotation && config3.face.mesh.enabled && tfjs_esm_exports.ENV.flags.IS_BROWSER) { + const [indexOfMouth, indexOfForehead] = box6.landmarks.length >= meshLandmarks.count ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine; + angle = computeRotation(box6.landmarks[indexOfMouth], box6.landmarks[indexOfForehead]); + const faceCenter = getBoxCenter({ startPoint: box6.startPoint, endPoint: box6.endPoint }); + const faceCenterNormalized = [faceCenter[0] / input.shape[2], faceCenter[1] / input.shape[1]]; + const rotatedImage = tfjs_esm_exports.image.rotateWithOffset(input, angle, 0, faceCenterNormalized); + rotationMatrix = buildRotationMatrix(-angle, faceCenter); + if (config3.face.mesh.enabled) + face5 = cutBoxFromImageAndResize({ startPoint: box6.startPoint, endPoint: box6.endPoint }, rotatedImage, [this.meshSize, this.meshSize]).div(255); + else + face5 = cutBoxFromImageAndResize({ startPoint: box6.startPoint, endPoint: box6.endPoint }, rotatedImage, [this.boxSize, this.boxSize]).div(255); + } else { + rotationMatrix = IDENTITY_MATRIX; + const clonedImage = input.clone(); + if (config3.face.mesh.enabled) + face5 = cutBoxFromImageAndResize({ startPoint: box6.startPoint, endPoint: box6.endPoint }, clonedImage, [this.meshSize, this.meshSize]).div(255); + else + face5 = cutBoxFromImageAndResize({ startPoint: box6.startPoint, endPoint: box6.endPoint }, clonedImage, [this.boxSize, this.boxSize]).div(255); + } + if (!config3.face.mesh.enabled) { + const prediction2 = { + mesh: [], + box: box6, + faceConfidence: null, + boxConfidence: box6.confidence, + confidence: box6.confidence, + image: face5 + }; + return prediction2; + } + const [, confidence, contourCoords] = this.meshDetector.execute(face5); + const faceConfidence = confidence.dataSync()[0]; + if (faceConfidence < config3.face.detector.minConfidence) { + this.storedBoxes[i].confidence = faceConfidence; + return null; + } + const coordsReshaped = tfjs_esm_exports.reshape(contourCoords, [-1, 3]); + let rawCoords = coordsReshaped.arraySync(); + if (config3.face.iris.enabled) { + const { box: leftEyeBox, boxSize: leftEyeBoxSize, crop: leftEyeCrop } = this.getEyeBox(rawCoords, face5, eyeLandmarks.leftBounds[0], eyeLandmarks.leftBounds[1], true); + const { box: rightEyeBox, boxSize: rightEyeBoxSize, crop: rightEyeCrop } = this.getEyeBox(rawCoords, face5, eyeLandmarks.rightBounds[0], eyeLandmarks.rightBounds[1]); + const eyePredictions = this.irisModel.predict(tfjs_esm_exports.concat([leftEyeCrop, rightEyeCrop])); + const eyePredictionsData = eyePredictions.dataSync(); + const leftEyeData = eyePredictionsData.slice(0, irisLandmarks.numCoordinates * 3); + const { rawCoords: leftEyeRawCoords, iris: leftIrisRawCoords } = this.getEyeCoords(leftEyeData, leftEyeBox, leftEyeBoxSize, true); + const rightEyeData = eyePredictionsData.slice(irisLandmarks.numCoordinates * 3); + const { rawCoords: rightEyeRawCoords, iris: rightIrisRawCoords } = this.getEyeCoords(rightEyeData, rightEyeBox, rightEyeBoxSize); + const leftToRightEyeDepthDifference = this.getLeftToRightEyeDepthDifference(rawCoords); + if (Math.abs(leftToRightEyeDepthDifference) < 30) { + replaceRawCoordinates(rawCoords, leftEyeRawCoords, "left", null); + replaceRawCoordinates(rawCoords, rightEyeRawCoords, "right", null); + } else if (leftToRightEyeDepthDifference < 1) { + replaceRawCoordinates(rawCoords, leftEyeRawCoords, "left", ["EyeUpper0", "EyeLower0"]); + } else { + replaceRawCoordinates(rawCoords, rightEyeRawCoords, "right", ["EyeUpper0", "EyeLower0"]); + } + const adjustedLeftIrisCoords = this.getAdjustedIrisCoords(rawCoords, leftIrisRawCoords, "left"); + const adjustedRightIrisCoords = this.getAdjustedIrisCoords(rawCoords, rightIrisRawCoords, "right"); + rawCoords = rawCoords.concat(adjustedLeftIrisCoords).concat(adjustedRightIrisCoords); + } + const mesh = this.transformRawCoords(rawCoords, box6, angle, rotationMatrix); + const storeConfidence = box6.confidence; + box6 = enlargeBox(calculateLandmarksBoundingBox(mesh), 1.5); + box6.confidence = storeConfidence; + if (config3.face.detector.rotation && config3.face.mesh.enabled && config3.face.description.enabled && tfjs_esm_exports.ENV.flags.IS_BROWSER) { + const [indexOfMouth, indexOfForehead] = box6.landmarks.length >= meshLandmarks.count ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine; + angle = computeRotation(box6.landmarks[indexOfMouth], box6.landmarks[indexOfForehead]); + const faceCenter = getBoxCenter({ startPoint: box6.startPoint, endPoint: box6.endPoint }); + const faceCenterNormalized = [faceCenter[0] / input.shape[2], faceCenter[1] / input.shape[1]]; + const rotatedImage = tfjs_esm_exports.image.rotateWithOffset(input.toFloat(), angle, 0, faceCenterNormalized); + rotationMatrix = buildRotationMatrix(-angle, faceCenter); + face5 = cutBoxFromImageAndResize({ startPoint: box6.startPoint, endPoint: box6.endPoint }, rotatedImage, [this.meshSize, this.meshSize]).div(255); + } + const prediction = { + mesh, + box: box6, + faceConfidence, + boxConfidence: box6.confidence, + image: face5 + }; + this.storedBoxes[i] = { ...squarifyBox(box6), confidence: box6.confidence, faceConfidence }; + return prediction; + })); + if (config3.face.mesh.enabled) + this.storedBoxes = this.storedBoxes.filter((a) => a.confidence > config3.face.detector.minConfidence); + this.detectedFaces = results.length; + return results; + } +}; + +// src/blazeface/facemesh.ts +var faceModels = [null, null, null]; +var facePipeline; +async function predict(input, config3) { + const predictions = await facePipeline.predict(input, config3); + const results = []; + let id = 0; + for (const prediction of predictions || []) { + if (!prediction || prediction.isDisposedInternal) + continue; + const meshRaw = prediction.mesh.map((pt) => [ + pt[0] / (input.shape[2] || 0), + pt[1] / (input.shape[1] || 0), + pt[2] / facePipeline.meshSize + ]); + const annotations3 = {}; + if (prediction.mesh && prediction.mesh.length > 0) { + for (const key of Object.keys(MESH_ANNOTATIONS)) + annotations3[key] = MESH_ANNOTATIONS[key].map((index) => prediction.mesh[index]); + } + const clampedBox = prediction.box ? [ + Math.trunc(Math.max(0, prediction.box.startPoint[0])), + Math.trunc(Math.max(0, prediction.box.startPoint[1])), + Math.trunc(Math.min(input.shape[2] || 0, prediction.box.endPoint[0]) - Math.max(0, prediction.box.startPoint[0])), + Math.trunc(Math.min(input.shape[1] || 0, prediction.box.endPoint[1]) - Math.max(0, prediction.box.startPoint[1])) + ] : [0, 0, 0, 0]; + const boxRaw3 = prediction.box ? [ + prediction.box.startPoint[0] / (input.shape[2] || 0), + prediction.box.startPoint[1] / (input.shape[1] || 0), + (prediction.box.endPoint[0] - prediction.box.startPoint[0]) / (input.shape[2] || 0), + (prediction.box.endPoint[1] - prediction.box.startPoint[1]) / (input.shape[1] || 0) + ] : [0, 0, 0, 0]; + results.push({ + id: id++, + score: Math.round(100 * prediction.faceConfidence || 100 * prediction.boxConfidence || 0) / 100, + boxScore: Math.round(100 * prediction.boxConfidence) / 100, + faceScore: Math.round(100 * prediction.faceConfidence) / 100, + box: clampedBox, + boxRaw: boxRaw3, + mesh: prediction.mesh, + meshRaw, + annotations: annotations3, + image: prediction.image, + tensor: prediction.image + }); + if (prediction.coords) + prediction.coords.dispose(); + } + return results; +} +async function load2(config3) { + if (!faceModels[0] && config3.face.enabled || !faceModels[1] && config3.face.mesh.enabled || !faceModels[2] && config3.face.iris.enabled) { + faceModels = await Promise.all([ + !faceModels[0] && config3.face.enabled ? load(config3) : null, + !faceModels[1] && config3.face.mesh.enabled ? tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.face.mesh.modelPath), { fromTFHub: config3.face.mesh.modelPath.includes("tfhub.dev") }) : null, + !faceModels[2] && config3.face.iris.enabled ? tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.face.iris.modelPath), { fromTFHub: config3.face.iris.modelPath.includes("tfhub.dev") }) : null + ]); + if (config3.face.mesh.enabled) { + if (!faceModels[1] || !faceModels[1]["modelUrl"]) + log("load model failed:", config3.face.mesh.modelPath); + else if (config3.debug) + log("load model:", faceModels[1]["modelUrl"]); + } + if (config3.face.iris.enabled) { + if (!faceModels[2] || !faceModels[2]["modelUrl"]) + log("load model failed:", config3.face.iris.modelPath); + else if (config3.debug) + log("load model:", faceModels[2]["modelUrl"]); + } + } else if (config3.debug) { + if (faceModels[0]) + log("cached model:", faceModels[0].model["modelUrl"]); + if (faceModels[1]) + log("cached model:", faceModels[1]["modelUrl"]); + if (faceModels[2]) + log("cached model:", faceModels[2]["modelUrl"]); + } + facePipeline = new Pipeline(faceModels[0], faceModels[1], faceModels[2]); + return faceModels; +} +var triangulation = TRI468; +var uvmap = UV468; + +// src/emotion/emotion.ts +var emotion_exports = {}; +__export(emotion_exports, { + load: () => load3, + predict: () => predict2 +}); +var annotations = ["angry", "disgust", "fear", "happy", "sad", "surprise", "neutral"]; +var model; +var last = []; +var lastCount = 0; +var skipped = Number.MAX_SAFE_INTEGER; +var rgb = [0.2989, 0.587, 0.114]; +async function load3(config3) { + if (!model) { + model = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.face.emotion.modelPath)); + if (!model || !model.modelUrl) + log("load model failed:", config3.face.emotion.modelPath); + else if (config3.debug) + log("load model:", model.modelUrl); + } else if (config3.debug) + log("cached model:", model.modelUrl); + return model; +} +async function predict2(image15, config3, idx, count2) { + if (!model) + return null; + if (skipped < config3.face.emotion.skipFrames && config3.skipFrame && lastCount === count2 && last[idx] && last[idx].length > 0) { + skipped++; + return last[idx]; + } + skipped = 0; + return new Promise(async (resolve) => { + const resize = tfjs_esm_exports.image.resizeBilinear(image15, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false); + const [red, green, blue] = tfjs_esm_exports.split(resize, 3, 3); + resize.dispose(); + const redNorm = tfjs_esm_exports.mul(red, rgb[0]); + const greenNorm = tfjs_esm_exports.mul(green, rgb[1]); + const blueNorm = tfjs_esm_exports.mul(blue, rgb[2]); + red.dispose(); + green.dispose(); + blue.dispose(); + const grayscale = tfjs_esm_exports.addN([redNorm, greenNorm, blueNorm]); + redNorm.dispose(); + greenNorm.dispose(); + blueNorm.dispose(); + const normalize = tfjs_esm_exports.tidy(() => grayscale.sub(0.5).mul(2)); + grayscale.dispose(); + const obj = []; + if (config3.face.emotion.enabled) { + const emotionT = await model.predict(normalize); + const data2 = emotionT.dataSync(); + tfjs_esm_exports.dispose(emotionT); + for (let i = 0; i < data2.length; i++) { + if (data2[i] > config3.face.emotion.minConfidence) + obj.push({ score: Math.min(0.99, Math.trunc(100 * data2[i]) / 100), emotion: annotations[i] }); + } + obj.sort((a, b) => b.score - a.score); + } + normalize.dispose(); + last[idx] = obj; + lastCount = count2; + resolve(obj); + }); +} + +// src/faceres/faceres.ts +var faceres_exports = {}; +__export(faceres_exports, { + enhance: () => enhance, + load: () => load4, + match: () => match, + predict: () => predict3, + similarity: () => similarity +}); +var model2; +var last2 = []; +var lastCount2 = 0; +var skipped2 = Number.MAX_SAFE_INTEGER; +async function load4(config3) { + const modelUrl = join(config3.modelBasePath, config3.face.description.modelPath); + if (!model2) { + model2 = await tfjs_esm_exports.loadGraphModel(modelUrl); + if (!model2) + log("load model failed:", config3.face.description.modelPath); + else if (config3.debug) + log("load model:", modelUrl); + } else if (config3.debug) + log("cached model:", modelUrl); + return model2; +} +function similarity(embedding1, embedding2, order = 2) { + if (!embedding1 || !embedding2) + return 0; + if ((embedding1 == null ? void 0 : embedding1.length) === 0 || (embedding2 == null ? void 0 : embedding2.length) === 0) + return 0; + if ((embedding1 == null ? void 0 : embedding1.length) !== (embedding2 == null ? void 0 : embedding2.length)) + return 0; + const distance = 5 * embedding1.map((val, i) => Math.abs(embedding1[i] - embedding2[i]) ** order).reduce((sum, now2) => sum + now2, 0) ** (1 / order); + const res = Math.max(0, 100 - distance) / 100; + return res; +} +function match(embedding, db, threshold = 0) { + let best = { similarity: 0, name: "", source: "", embedding: [] }; + if (!embedding || !db || !Array.isArray(embedding) || !Array.isArray(db)) + return best; + for (const f of db) { + if (f.embedding && f.name) { + const perc = similarity(embedding, f.embedding); + if (perc > threshold && perc > best.similarity) + best = { ...f, similarity: perc }; + } + } + return best; +} +function enhance(input) { + const image15 = tfjs_esm_exports.tidy(() => { + const tensor2 = input.image || input.tensor || input; + if (!(tensor2 instanceof tfjs_esm_exports.Tensor)) + return null; + const box6 = [[0.05, 0.15, 0.85, 0.85]]; + if (!model2.inputs[0].shape) + return null; + const crop = tensor2.shape.length === 3 ? tfjs_esm_exports.image.cropAndResize(tfjs_esm_exports.expandDims(tensor2, 0), box6, [0], [model2.inputs[0].shape[2], model2.inputs[0].shape[1]]) : tfjs_esm_exports.image.cropAndResize(tensor2, box6, [0], [model2.inputs[0].shape[2], model2.inputs[0].shape[1]]); + const norm = crop.mul(255); + return norm; + }); + return image15; +} +async function predict3(image15, config3, idx, count2) { + var _a, _b; + if (!model2) + return null; + if (skipped2 < config3.face.description.skipFrames && config3.skipFrame && lastCount2 === count2 && ((_a = last2[idx]) == null ? void 0 : _a.age) && ((_b = last2[idx]) == null ? void 0 : _b.age) > 0) { + skipped2++; + return last2[idx]; + } + skipped2 = 0; + return new Promise(async (resolve) => { + const enhanced = enhance(image15); + let resT; + const obj = { + age: 0, + gender: "unknown", + genderScore: 0, + descriptor: [] + }; + if (config3.face.description.enabled) + resT = await model2.predict(enhanced); + tfjs_esm_exports.dispose(enhanced); + if (resT) { + tfjs_esm_exports.tidy(() => { + const gender = resT.find((t) => t.shape[1] === 1).dataSync(); + const confidence = Math.trunc(200 * Math.abs(gender[0] - 0.5)) / 100; + if (confidence > config3.face.description.minConfidence) { + obj.gender = gender[0] <= 0.5 ? "female" : "male"; + obj.genderScore = Math.min(0.99, confidence); + } + const age = resT.find((t) => t.shape[1] === 100).argMax(1).dataSync()[0]; + const all2 = resT.find((t) => t.shape[1] === 100).dataSync(); + obj.age = Math.round(all2[age - 1] > all2[age + 1] ? 10 * age - 100 * all2[age - 1] : 10 * age + 100 * all2[age + 1]) / 10; + const desc = resT.find((t) => t.shape[1] === 1024); + obj.descriptor = [...desc.dataSync()]; + }); + resT.forEach((t) => tfjs_esm_exports.dispose(t)); + } + last2[idx] = obj; + lastCount2 = count2; + resolve(obj); + }); +} + +// src/face.ts +var calculateGaze = (face5) => { + const radians = (pt1, pt2) => Math.atan2(pt1[1] - pt2[1], pt1[0] - pt2[0]); + const offsetIris = [0, -0.1]; + const eyeRatio = 1; + const left = face5.mesh[33][2] > face5.mesh[263][2]; + const irisCenter = left ? face5.mesh[473] : face5.mesh[468]; + const eyeCenter = left ? [(face5.mesh[133][0] + face5.mesh[33][0]) / 2, (face5.mesh[133][1] + face5.mesh[33][1]) / 2] : [(face5.mesh[263][0] + face5.mesh[362][0]) / 2, (face5.mesh[263][1] + face5.mesh[362][1]) / 2]; + const eyeSize = left ? [face5.mesh[133][0] - face5.mesh[33][0], face5.mesh[23][1] - face5.mesh[27][1]] : [face5.mesh[263][0] - face5.mesh[362][0], face5.mesh[253][1] - face5.mesh[257][1]]; + const eyeDiff = [ + (eyeCenter[0] - irisCenter[0]) / eyeSize[0] - offsetIris[0], + eyeRatio * (irisCenter[1] - eyeCenter[1]) / eyeSize[1] - offsetIris[1] + ]; + let strength = Math.sqrt(eyeDiff[0] ** 2 + eyeDiff[1] ** 2); + strength = Math.min(strength, face5.boxRaw[2] / 2, face5.boxRaw[3] / 2); + const bearing = (radians([0, 0], eyeDiff) + Math.PI / 2) % Math.PI; + return { bearing, strength }; +}; +var calculateFaceAngle = (face5, imageSize) => { + const normalize = (v) => { + const length = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); + v[0] /= length; + v[1] /= length; + v[2] /= length; + return v; + }; + const subVectors = (a, b) => { + const x = a[0] - b[0]; + const y = a[1] - b[1]; + const z = a[2] - b[2]; + return [x, y, z]; + }; + const crossVectors = (a, b) => { + const x = a[1] * b[2] - a[2] * b[1]; + const y = a[2] * b[0] - a[0] * b[2]; + const z = a[0] * b[1] - a[1] * b[0]; + return [x, y, z]; + }; + const rotationMatrixToEulerAngle = (r) => { + const [r00, r01, r02, r10, r11, r12, r20, r21, r22] = r; + let thetaX; + let thetaY; + let thetaZ; + if (r10 < 1) { + if (r10 > -1) { + thetaZ = Math.asin(r10); + thetaY = Math.atan2(-r20, r00); + thetaX = Math.atan2(-r12, r11); + } else { + thetaZ = -Math.PI / 2; + thetaY = -Math.atan2(r21, r22); + thetaX = 0; + } + } else { + thetaZ = Math.PI / 2; + thetaY = Math.atan2(r21, r22); + thetaX = 0; + } + return { pitch: 2 * -thetaX, yaw: 2 * -thetaY, roll: 2 * -thetaZ }; + }; + const meshToEulerAngle = (mesh2) => { + const radians = (a1, a2, b1, b2) => Math.atan2(b2 - a2, b1 - a1); + const angle2 = { + pitch: radians(mesh2[10][1], mesh2[10][2], mesh2[152][1], mesh2[152][2]), + yaw: radians(mesh2[33][0], mesh2[33][2], mesh2[263][0], mesh2[263][2]), + roll: radians(mesh2[33][0], mesh2[33][1], mesh2[263][0], mesh2[263][1]) + }; + return angle2; + }; + const mesh = face5.meshRaw; + 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 } }; + const size = Math.max(face5.boxRaw[2] * imageSize[0], face5.boxRaw[3] * imageSize[1]) / 1.5; + const pts = [mesh[10], mesh[152], mesh[234], mesh[454]].map((pt) => [ + pt[0] * imageSize[0] / size, + pt[1] * imageSize[1] / size, + pt[2] + ]); + const y_axis = normalize(subVectors(pts[1], pts[0])); + let x_axis = normalize(subVectors(pts[3], pts[2])); + const z_axis = normalize(crossVectors(x_axis, y_axis)); + x_axis = crossVectors(y_axis, z_axis); + const matrix = [ + x_axis[0], + x_axis[1], + x_axis[2], + y_axis[0], + y_axis[1], + y_axis[2], + z_axis[0], + z_axis[1], + z_axis[2] + ]; + const angle = rotationMatrixToEulerAngle(matrix); + const gaze = mesh.length === 478 ? calculateGaze(face5) : { bearing: 0, strength: 0 }; + return { angle, matrix, gaze }; +}; +var detectFace = async (parent, input) => { + var _a, _b, _c, _d, _e, _f; + let timeStamp; + let ageRes; + let genderRes; + let emotionRes; + let embeddingRes; + let descRes; + const faceRes = []; + parent.state = "run:face"; + timeStamp = now(); + const faces = await predict(input, parent.config); + parent.performance.face = Math.trunc(now() - timeStamp); + if (!input.shape || input.shape.length !== 4) + return []; + if (!faces) + return []; + for (let i = 0; i < faces.length; i++) { + parent.analyze("Get Face"); + if (!faces[i].image || faces[i].image["isDisposedInternal"]) { + log("Face object is disposed:", faces[i].image); + continue; + } + const rotation = calculateFaceAngle(faces[i], [input.shape[2], input.shape[1]]); + parent.analyze("Start Emotion:"); + if (parent.config.async) { + emotionRes = parent.config.face.emotion.enabled ? predict2(faces[i].image || tfjs_esm_exports.tensor([]), parent.config, i, faces.length) : {}; + } else { + parent.state = "run:emotion"; + timeStamp = now(); + emotionRes = parent.config.face.emotion.enabled ? await predict2(faces[i].image || tfjs_esm_exports.tensor([]), parent.config, i, faces.length) : {}; + parent.performance.emotion = Math.trunc(now() - timeStamp); + } + parent.analyze("End Emotion:"); + parent.analyze("Start Description:"); + if (parent.config.async) { + descRes = parent.config.face.description.enabled ? predict3(faces[i].image || tfjs_esm_exports.tensor([]), parent.config, i, faces.length) : []; + } else { + parent.state = "run:description"; + timeStamp = now(); + descRes = parent.config.face.description.enabled ? await predict3(faces[i].image || tfjs_esm_exports.tensor([]), parent.config, i, faces.length) : []; + parent.performance.embedding = Math.trunc(now() - timeStamp); + } + parent.analyze("End Description:"); + if (parent.config.async) { + [ageRes, genderRes, emotionRes, embeddingRes, descRes] = await Promise.all([ageRes, genderRes, emotionRes, embeddingRes, descRes]); + } + parent.analyze("Finish Face:"); + if (!parent.config.face.iris.enabled && ((_b = (_a = faces[i]) == null ? void 0 : _a.annotations) == null ? void 0 : _b.leftEyeIris) && ((_d = (_c = faces[i]) == null ? void 0 : _c.annotations) == null ? void 0 : _d.rightEyeIris)) { + delete faces[i].annotations.leftEyeIris; + delete faces[i].annotations.rightEyeIris; + } + const irisSize = ((_e = faces[i].annotations) == null ? void 0 : _e.leftEyeIris) && ((_f = faces[i].annotations) == null ? void 0 : _f.rightEyeIris) ? 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] : 0; + faceRes.push({ + ...faces[i], + id: i, + age: descRes.age, + gender: descRes.gender, + genderScore: descRes.genderScore, + embedding: descRes.descriptor, + emotion: emotionRes, + iris: irisSize !== 0 ? Math.trunc(500 / irisSize / 11.7) / 100 : 0, + rotation, + tensor: parent.config.face.detector.return ? tfjs_esm_exports.squeeze(faces[i].image) : null + }); + tfjs_esm_exports.dispose(faces[i].image); + if (faces[i].image) + delete faces[i].image; + parent.analyze("End Face"); + } + parent.analyze("End FaceMesh:"); + if (parent.config.async) { + if (parent.performance.face) + delete parent.performance.face; + if (parent.performance.age) + delete parent.performance.age; + if (parent.performance.gender) + delete parent.performance.gender; + if (parent.performance.emotion) + delete parent.performance.emotion; + } + return faceRes; +}; + +// src/posenet/posenet.ts +var posenet_exports = {}; +__export(posenet_exports, { + load: () => load5, + predict: () => predict4 +}); + +// src/posenet/keypoints.ts +var partNames = [ + "nose", + "leftEye", + "rightEye", + "leftEar", + "rightEar", + "leftShoulder", + "rightShoulder", + "leftElbow", + "rightElbow", + "leftWrist", + "rightWrist", + "leftHip", + "rightHip", + "leftKnee", + "rightKnee", + "leftAnkle", + "rightAnkle" +]; +var count = partNames.length; +var partIds = partNames.reduce((result, jointName, i) => { + result[jointName] = i; + return result; +}, {}); +var connectedPartNames = [ + ["leftHip", "leftShoulder"], + ["leftElbow", "leftShoulder"], + ["leftElbow", "leftWrist"], + ["leftHip", "leftKnee"], + ["leftKnee", "leftAnkle"], + ["rightHip", "rightShoulder"], + ["rightElbow", "rightShoulder"], + ["rightElbow", "rightWrist"], + ["rightHip", "rightKnee"], + ["rightKnee", "rightAnkle"], + ["leftShoulder", "rightShoulder"], + ["leftHip", "rightHip"] +]; +var connectedPartIndices = connectedPartNames.map(([jointNameA, jointNameB]) => [partIds[jointNameA], partIds[jointNameB]]); +var poseChain = [ + ["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"] +]; + +// src/posenet/utils.ts +function getBoundingBox(keypoints3) { + const coord = keypoints3.reduce(({ maxX, maxY, minX, minY }, { position: { x, y } }) => ({ + maxX: Math.max(maxX, x), + maxY: Math.max(maxY, y), + minX: Math.min(minX, x), + minY: Math.min(minY, y) + }), { + maxX: Number.NEGATIVE_INFINITY, + maxY: Number.NEGATIVE_INFINITY, + minX: Number.POSITIVE_INFINITY, + minY: Number.POSITIVE_INFINITY + }); + return [coord.minX, coord.minY, coord.maxX - coord.minX, coord.maxY - coord.minY]; +} +function scalePoses(poses2, [height, width], [inputResolutionHeight, inputResolutionWidth]) { + const scaleY = height / inputResolutionHeight; + const scaleX = width / inputResolutionWidth; + const scalePose = (pose, i) => ({ + id: i, + score: pose.score, + boxRaw: [pose.box[0] / inputResolutionWidth, pose.box[1] / inputResolutionHeight, pose.box[2] / inputResolutionWidth, pose.box[3] / inputResolutionHeight], + 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)], + keypoints: pose.keypoints.map(({ score: score3, part, position }) => ({ + score: score3, + part, + position: [Math.trunc(position.x * scaleX), Math.trunc(position.y * scaleY)], + positionRaw: [position.x / inputResolutionHeight, position.y / inputResolutionHeight] + })) + }); + const scaledPoses = poses2.map((pose, i) => scalePose(pose, i)); + return scaledPoses; +} +var MaxHeap = class { + constructor(maxSize2, getElementValue) { + this.priorityQueue = new Array(maxSize2); + this.numberOfElements = -1; + this.getElementValue = getElementValue; + } + enqueue(x) { + this.priorityQueue[++this.numberOfElements] = x; + this.swim(this.numberOfElements); + } + dequeue() { + const max2 = this.priorityQueue[0]; + this.exchange(0, this.numberOfElements--); + this.sink(0); + this.priorityQueue[this.numberOfElements + 1] = null; + return max2; + } + 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(k) { + while (k > 0 && this.less(Math.floor(k / 2), k)) { + this.exchange(k, Math.floor(k / 2)); + k = Math.floor(k / 2); + } + } + sink(k) { + while (2 * k <= this.numberOfElements) { + let j = 2 * k; + if (j < this.numberOfElements && this.less(j, j + 1)) + j++; + if (!this.less(k, j)) + break; + this.exchange(k, j); + k = j; + } + } + getValueAt(i) { + return this.getElementValue(this.priorityQueue[i]); + } + less(i, j) { + return this.getValueAt(i) < this.getValueAt(j); + } + exchange(i, j) { + const t = this.priorityQueue[i]; + this.priorityQueue[i] = this.priorityQueue[j]; + this.priorityQueue[j] = t; + } +}; +function getOffsetPoint(y, x, keypoint, offsets) { + return { + y: offsets.get(y, x, keypoint), + x: offsets.get(y, x, keypoint + count) + }; +} +function getImageCoords(part, outputStride2, offsets) { + const { heatmapY, heatmapX, id: keypoint } = part; + const { y, x } = getOffsetPoint(heatmapY, heatmapX, keypoint, offsets); + return { + x: part.heatmapX * outputStride2 + x, + y: part.heatmapY * outputStride2 + y + }; +} +function clamp(a, min, max2) { + if (a < min) + return min; + if (a > max2) + return max2; + return a; +} +function squaredDistance(y1, x1, y2, x2) { + const dy = y2 - y1; + const dx = x2 - x1; + return dy * dy + dx * dx; +} +function addVectors(a, b) { + return { x: a.x + b.x, y: a.y + b.y }; +} + +// src/posenet/poses.ts +var localMaximumRadius = 1; +var outputStride = 16; +var squaredNmsRadius = 50 ** 2; +function traverse(edgeId, sourceKeypoint, targetId, scores, offsets, displacements, offsetRefineStep = 2) { + const getDisplacement = (point2) => ({ + y: displacements.get(point2.y, point2.x, edgeId), + x: displacements.get(point2.y, point2.x, displacements.shape[2] / 2 + edgeId) + }); + const getStridedIndexNearPoint = (point2, height2, width2) => ({ + y: clamp(Math.round(point2.y / outputStride), 0, height2 - 1), + x: clamp(Math.round(point2.x / outputStride), 0, width2 - 1) + }); + const [height, width] = scores.shape; + const sourceKeypointIndices = getStridedIndexNearPoint(sourceKeypoint.position, height, width); + const displacement = getDisplacement(sourceKeypointIndices); + const displacedPoint = addVectors(sourceKeypoint.position, displacement); + let targetKeypoint = displacedPoint; + for (let i = 0; i < offsetRefineStep; i++) { + const targetKeypointIndices = getStridedIndexNearPoint(targetKeypoint, height, width); + const offsetPoint = getOffsetPoint(targetKeypointIndices.y, targetKeypointIndices.x, targetId, offsets); + targetKeypoint = addVectors({ x: targetKeypointIndices.x * outputStride, y: targetKeypointIndices.y * outputStride }, { x: offsetPoint.x, y: offsetPoint.y }); + } + const targetKeyPointIndices = getStridedIndexNearPoint(targetKeypoint, height, width); + const score3 = scores.get(targetKeyPointIndices.y, targetKeyPointIndices.x, targetId); + return { position: targetKeypoint, part: partNames[targetId], score: score3 }; +} +function decodePose(root, scores, offsets, displacementsFwd, displacementsBwd) { + const tuples = poseChain.map(([parentJoinName, childJoinName]) => [partIds[parentJoinName], partIds[childJoinName]]); + const edgesFwd = tuples.map(([, childJointId]) => childJointId); + const edgesBwd = tuples.map(([parentJointId]) => parentJointId); + const numParts = scores.shape[2]; + const numEdges = edgesFwd.length; + const keypoints3 = new Array(numParts); + const rootPoint = getImageCoords(root.part, outputStride, offsets); + keypoints3[root.part.id] = { + score: root.score, + part: partNames[root.part.id], + position: rootPoint + }; + for (let edge = numEdges - 1; edge >= 0; --edge) { + const sourceId = edgesFwd[edge]; + const targetId = edgesBwd[edge]; + if (keypoints3[sourceId] && !keypoints3[targetId]) { + keypoints3[targetId] = traverse(edge, keypoints3[sourceId], targetId, scores, offsets, displacementsBwd); + } + } + for (let edge = 0; edge < numEdges; ++edge) { + const sourceId = edgesBwd[edge]; + const targetId = edgesFwd[edge]; + if (keypoints3[sourceId] && !keypoints3[targetId]) { + keypoints3[targetId] = traverse(edge, keypoints3[sourceId], targetId, scores, offsets, displacementsFwd); + } + } + return keypoints3; +} +function scoreIsMaximumInLocalWindow(keypointId, score3, heatmapY, heatmapX, scores) { + const [height, width] = scores.shape; + let localMaximum = true; + const yStart = Math.max(heatmapY - localMaximumRadius, 0); + const yEnd = Math.min(heatmapY + localMaximumRadius + 1, height); + for (let yCurrent = yStart; yCurrent < yEnd; ++yCurrent) { + const xStart = Math.max(heatmapX - localMaximumRadius, 0); + const xEnd = Math.min(heatmapX + localMaximumRadius + 1, width); + for (let xCurrent = xStart; xCurrent < xEnd; ++xCurrent) { + if (scores.get(yCurrent, xCurrent, keypointId) > score3) { + localMaximum = false; + break; + } + } + if (!localMaximum) + break; + } + return localMaximum; +} +function buildPartWithScoreQueue(minConfidence, scores) { + const [height, width, numKeypoints] = scores.shape; + const queue = new MaxHeap(height * width * numKeypoints, ({ score: score3 }) => score3); + for (let heatmapY = 0; heatmapY < height; ++heatmapY) { + for (let heatmapX = 0; heatmapX < width; ++heatmapX) { + for (let keypointId = 0; keypointId < numKeypoints; ++keypointId) { + const score3 = scores.get(heatmapY, heatmapX, keypointId); + if (score3 < minConfidence) + continue; + if (scoreIsMaximumInLocalWindow(keypointId, score3, heatmapY, heatmapX, scores)) + queue.enqueue({ score: score3, part: { heatmapY, heatmapX, id: keypointId } }); + } + } + } + return queue; +} +function withinRadius(poses2, { x, y }, keypointId) { + return poses2.some(({ keypoints: keypoints3 }) => { + var _a; + const correspondingKeypoint = (_a = keypoints3[keypointId]) == null ? void 0 : _a.position; + if (!correspondingKeypoint) + return false; + return squaredDistance(y, x, correspondingKeypoint.y, correspondingKeypoint.x) <= squaredNmsRadius; + }); +} +function getInstanceScore(existingPoses, keypoints3) { + const notOverlappedKeypointScores = keypoints3.reduce((result, { position, score: score3 }, keypointId) => { + if (!withinRadius(existingPoses, position, keypointId)) + result += score3; + return result; + }, 0); + return notOverlappedKeypointScores / keypoints3.length; +} +function decode(offsets, scores, displacementsFwd, displacementsBwd, maxDetected, minConfidence) { + const poses2 = []; + const queue = buildPartWithScoreQueue(minConfidence, scores); + while (poses2.length < maxDetected && !queue.empty()) { + const root = queue.dequeue(); + const rootImageCoords = getImageCoords(root.part, outputStride, offsets); + if (withinRadius(poses2, rootImageCoords, root.part.id)) + continue; + let keypoints3 = decodePose(root, scores, offsets, displacementsFwd, displacementsBwd); + keypoints3 = keypoints3.filter((a) => a.score > minConfidence); + const score3 = getInstanceScore(poses2, keypoints3); + const box6 = getBoundingBox(keypoints3); + if (score3 > minConfidence) + poses2.push({ keypoints: keypoints3, box: box6, score: Math.round(100 * score3) / 100 }); + } + return poses2; +} + +// src/posenet/posenet.ts +var model3; +var poseNetOutputs = ["MobilenetV1/offset_2/BiasAdd", "MobilenetV1/heatmap_2/BiasAdd", "MobilenetV1/displacement_fwd_2/BiasAdd", "MobilenetV1/displacement_bwd_2/BiasAdd"]; +async function predict4(input, config3) { + const res = tfjs_esm_exports.tidy(() => { + if (!model3.inputs[0].shape) + return []; + const resized = input.resizeBilinear([model3.inputs[0].shape[2], model3.inputs[0].shape[1]]); + const normalized = resized.toFloat().div(127.5).sub(1); + const results = model3.execute(normalized, poseNetOutputs); + const results3d = results.map((y) => y.squeeze([0])); + results3d[1] = results3d[1].sigmoid(); + return results3d; + }); + const buffers = await Promise.all(res.map((tensor2) => tensor2.buffer())); + for (const t of res) + t.dispose(); + const decoded = await decode(buffers[0], buffers[1], buffers[2], buffers[3], config3.body.maxDetected, config3.body.minConfidence); + if (!model3.inputs[0].shape) + return []; + const scaled = scalePoses(decoded, [input.shape[1], input.shape[2]], [model3.inputs[0].shape[2], model3.inputs[0].shape[1]]); + return scaled; +} +async function load5(config3) { + if (!model3) { + model3 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.body.modelPath)); + if (!model3 || !model3["modelUrl"]) + log("load model failed:", config3.body.modelPath); + else if (config3.debug) + log("load model:", model3["modelUrl"]); + } else if (config3.debug) + log("cached model:", model3["modelUrl"]); + return model3; +} + +// src/handpose/handpose.ts +var handpose_exports = {}; +__export(handpose_exports, { + load: () => load6, + predict: () => predict5 +}); + +// src/handpose/box.ts +function getBoxSize2(box6) { + return [ + Math.abs(box6.endPoint[0] - box6.startPoint[0]), + Math.abs(box6.endPoint[1] - box6.startPoint[1]) + ]; +} +function getBoxCenter2(box6) { + return [ + box6.startPoint[0] + (box6.endPoint[0] - box6.startPoint[0]) / 2, + box6.startPoint[1] + (box6.endPoint[1] - box6.startPoint[1]) / 2 + ]; +} +function cutBoxFromImageAndResize2(box6, image15, cropSize) { + const h = image15.shape[1]; + const w = image15.shape[2]; + const boxes = [[ + box6.startPoint[1] / h, + box6.startPoint[0] / w, + box6.endPoint[1] / h, + box6.endPoint[0] / w + ]]; + return tfjs_esm_exports.image.cropAndResize(image15, boxes, [0], cropSize); +} +function scaleBoxCoordinates2(box6, factor) { + const startPoint = [box6.startPoint[0] * factor[0], box6.startPoint[1] * factor[1]]; + const endPoint = [box6.endPoint[0] * factor[0], box6.endPoint[1] * factor[1]]; + const palmLandmarks = box6.palmLandmarks.map((coord) => { + const scaledCoord = [coord[0] * factor[0], coord[1] * factor[1]]; + return scaledCoord; + }); + return { startPoint, endPoint, palmLandmarks, confidence: box6.confidence }; +} +function enlargeBox2(box6, factor = 1.5) { + const center = getBoxCenter2(box6); + const size = getBoxSize2(box6); + const newHalfSize = [factor * size[0] / 2, factor * size[1] / 2]; + const startPoint = [center[0] - newHalfSize[0], center[1] - newHalfSize[1]]; + const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]]; + return { startPoint, endPoint, palmLandmarks: box6.palmLandmarks }; +} +function squarifyBox2(box6) { + const centers = getBoxCenter2(box6); + const size = getBoxSize2(box6); + const maxEdge = Math.max(...size); + const halfSize = maxEdge / 2; + const startPoint = [centers[0] - halfSize, centers[1] - halfSize]; + const endPoint = [centers[0] + halfSize, centers[1] + halfSize]; + return { startPoint, endPoint, palmLandmarks: box6.palmLandmarks }; +} + +// src/handpose/anchors.ts +var anchors = [ + { x: 0.015625, y: 0.015625 }, + { x: 0.015625, y: 0.015625 }, + { x: 0.046875, y: 0.015625 }, + { x: 0.046875, y: 0.015625 }, + { x: 0.078125, y: 0.015625 }, + { x: 0.078125, y: 0.015625 }, + { x: 0.109375, y: 0.015625 }, + { x: 0.109375, y: 0.015625 }, + { x: 0.140625, y: 0.015625 }, + { x: 0.140625, y: 0.015625 }, + { x: 0.171875, y: 0.015625 }, + { x: 0.171875, y: 0.015625 }, + { x: 0.203125, y: 0.015625 }, + { x: 0.203125, y: 0.015625 }, + { x: 0.234375, y: 0.015625 }, + { x: 0.234375, y: 0.015625 }, + { x: 0.265625, y: 0.015625 }, + { x: 0.265625, y: 0.015625 }, + { x: 0.296875, y: 0.015625 }, + { x: 0.296875, y: 0.015625 }, + { x: 0.328125, y: 0.015625 }, + { x: 0.328125, y: 0.015625 }, + { x: 0.359375, y: 0.015625 }, + { x: 0.359375, y: 0.015625 }, + { x: 0.390625, y: 0.015625 }, + { x: 0.390625, y: 0.015625 }, + { x: 0.421875, y: 0.015625 }, + { x: 0.421875, y: 0.015625 }, + { x: 0.453125, y: 0.015625 }, + { x: 0.453125, y: 0.015625 }, + { x: 0.484375, y: 0.015625 }, + { x: 0.484375, y: 0.015625 }, + { x: 0.515625, y: 0.015625 }, + { x: 0.515625, y: 0.015625 }, + { x: 0.546875, y: 0.015625 }, + { x: 0.546875, y: 0.015625 }, + { x: 0.578125, y: 0.015625 }, + { x: 0.578125, y: 0.015625 }, + { x: 0.609375, y: 0.015625 }, + { x: 0.609375, y: 0.015625 }, + { x: 0.640625, y: 0.015625 }, + { x: 0.640625, y: 0.015625 }, + { x: 0.671875, y: 0.015625 }, + { x: 0.671875, y: 0.015625 }, + { x: 0.703125, y: 0.015625 }, + { x: 0.703125, y: 0.015625 }, + { x: 0.734375, y: 0.015625 }, + { x: 0.734375, y: 0.015625 }, + { x: 0.765625, y: 0.015625 }, + { x: 0.765625, y: 0.015625 }, + { x: 0.796875, y: 0.015625 }, + { x: 0.796875, y: 0.015625 }, + { x: 0.828125, y: 0.015625 }, + { x: 0.828125, y: 0.015625 }, + { x: 0.859375, y: 0.015625 }, + { x: 0.859375, y: 0.015625 }, + { x: 0.890625, y: 0.015625 }, + { x: 0.890625, y: 0.015625 }, + { x: 0.921875, y: 0.015625 }, + { x: 0.921875, y: 0.015625 }, + { x: 0.953125, y: 0.015625 }, + { x: 0.953125, y: 0.015625 }, + { x: 0.984375, y: 0.015625 }, + { x: 0.984375, y: 0.015625 }, + { x: 0.015625, y: 0.046875 }, + { x: 0.015625, y: 0.046875 }, + { x: 0.046875, y: 0.046875 }, + { x: 0.046875, y: 0.046875 }, + { x: 0.078125, y: 0.046875 }, + { x: 0.078125, y: 0.046875 }, + { x: 0.109375, y: 0.046875 }, + { x: 0.109375, y: 0.046875 }, + { x: 0.140625, y: 0.046875 }, + { x: 0.140625, y: 0.046875 }, + { x: 0.171875, y: 0.046875 }, + { x: 0.171875, y: 0.046875 }, + { x: 0.203125, y: 0.046875 }, + { x: 0.203125, y: 0.046875 }, + { x: 0.234375, y: 0.046875 }, + { x: 0.234375, y: 0.046875 }, + { x: 0.265625, y: 0.046875 }, + { x: 0.265625, y: 0.046875 }, + { x: 0.296875, y: 0.046875 }, + { x: 0.296875, y: 0.046875 }, + { x: 0.328125, y: 0.046875 }, + { x: 0.328125, y: 0.046875 }, + { x: 0.359375, y: 0.046875 }, + { x: 0.359375, y: 0.046875 }, + { x: 0.390625, y: 0.046875 }, + { x: 0.390625, y: 0.046875 }, + { x: 0.421875, y: 0.046875 }, + { x: 0.421875, y: 0.046875 }, + { x: 0.453125, y: 0.046875 }, + { x: 0.453125, y: 0.046875 }, + { x: 0.484375, y: 0.046875 }, + { x: 0.484375, y: 0.046875 }, + { x: 0.515625, y: 0.046875 }, + { x: 0.515625, y: 0.046875 }, + { x: 0.546875, y: 0.046875 }, + { x: 0.546875, y: 0.046875 }, + { x: 0.578125, y: 0.046875 }, + { x: 0.578125, y: 0.046875 }, + { x: 0.609375, y: 0.046875 }, + { x: 0.609375, y: 0.046875 }, + { x: 0.640625, y: 0.046875 }, + { x: 0.640625, y: 0.046875 }, + { x: 0.671875, y: 0.046875 }, + { x: 0.671875, y: 0.046875 }, + { x: 0.703125, y: 0.046875 }, + { x: 0.703125, y: 0.046875 }, + { x: 0.734375, y: 0.046875 }, + { x: 0.734375, y: 0.046875 }, + { x: 0.765625, y: 0.046875 }, + { x: 0.765625, y: 0.046875 }, + { x: 0.796875, y: 0.046875 }, + { x: 0.796875, y: 0.046875 }, + { x: 0.828125, y: 0.046875 }, + { x: 0.828125, y: 0.046875 }, + { x: 0.859375, y: 0.046875 }, + { x: 0.859375, y: 0.046875 }, + { x: 0.890625, y: 0.046875 }, + { x: 0.890625, y: 0.046875 }, + { x: 0.921875, y: 0.046875 }, + { x: 0.921875, y: 0.046875 }, + { x: 0.953125, y: 0.046875 }, + { x: 0.953125, y: 0.046875 }, + { x: 0.984375, y: 0.046875 }, + { x: 0.984375, y: 0.046875 }, + { x: 0.015625, y: 0.078125 }, + { x: 0.015625, y: 0.078125 }, + { x: 0.046875, y: 0.078125 }, + { x: 0.046875, y: 0.078125 }, + { x: 0.078125, y: 0.078125 }, + { x: 0.078125, y: 0.078125 }, + { x: 0.109375, y: 0.078125 }, + { x: 0.109375, y: 0.078125 }, + { x: 0.140625, y: 0.078125 }, + { x: 0.140625, y: 0.078125 }, + { x: 0.171875, y: 0.078125 }, + { x: 0.171875, y: 0.078125 }, + { x: 0.203125, y: 0.078125 }, + { x: 0.203125, y: 0.078125 }, + { x: 0.234375, y: 0.078125 }, + { x: 0.234375, y: 0.078125 }, + { x: 0.265625, y: 0.078125 }, + { x: 0.265625, y: 0.078125 }, + { x: 0.296875, y: 0.078125 }, + { x: 0.296875, y: 0.078125 }, + { x: 0.328125, y: 0.078125 }, + { x: 0.328125, y: 0.078125 }, + { x: 0.359375, y: 0.078125 }, + { x: 0.359375, y: 0.078125 }, + { x: 0.390625, y: 0.078125 }, + { x: 0.390625, y: 0.078125 }, + { x: 0.421875, y: 0.078125 }, + { x: 0.421875, y: 0.078125 }, + { x: 0.453125, y: 0.078125 }, + { x: 0.453125, y: 0.078125 }, + { x: 0.484375, y: 0.078125 }, + { x: 0.484375, y: 0.078125 }, + { x: 0.515625, y: 0.078125 }, + { x: 0.515625, y: 0.078125 }, + { x: 0.546875, y: 0.078125 }, + { x: 0.546875, y: 0.078125 }, + { x: 0.578125, y: 0.078125 }, + { x: 0.578125, y: 0.078125 }, + { x: 0.609375, y: 0.078125 }, + { x: 0.609375, y: 0.078125 }, + { x: 0.640625, y: 0.078125 }, + { x: 0.640625, y: 0.078125 }, + { x: 0.671875, y: 0.078125 }, + { x: 0.671875, y: 0.078125 }, + { x: 0.703125, y: 0.078125 }, + { x: 0.703125, y: 0.078125 }, + { x: 0.734375, y: 0.078125 }, + { x: 0.734375, y: 0.078125 }, + { x: 0.765625, y: 0.078125 }, + { x: 0.765625, y: 0.078125 }, + { x: 0.796875, y: 0.078125 }, + { x: 0.796875, y: 0.078125 }, + { x: 0.828125, y: 0.078125 }, + { x: 0.828125, y: 0.078125 }, + { x: 0.859375, y: 0.078125 }, + { x: 0.859375, y: 0.078125 }, + { x: 0.890625, y: 0.078125 }, + { x: 0.890625, y: 0.078125 }, + { x: 0.921875, y: 0.078125 }, + { x: 0.921875, y: 0.078125 }, + { x: 0.953125, y: 0.078125 }, + { x: 0.953125, y: 0.078125 }, + { x: 0.984375, y: 0.078125 }, + { x: 0.984375, y: 0.078125 }, + { x: 0.015625, y: 0.109375 }, + { x: 0.015625, y: 0.109375 }, + { x: 0.046875, y: 0.109375 }, + { x: 0.046875, y: 0.109375 }, + { x: 0.078125, y: 0.109375 }, + { x: 0.078125, y: 0.109375 }, + { x: 0.109375, y: 0.109375 }, + { x: 0.109375, y: 0.109375 }, + { x: 0.140625, y: 0.109375 }, + { x: 0.140625, y: 0.109375 }, + { x: 0.171875, y: 0.109375 }, + { x: 0.171875, y: 0.109375 }, + { x: 0.203125, y: 0.109375 }, + { x: 0.203125, y: 0.109375 }, + { x: 0.234375, y: 0.109375 }, + { x: 0.234375, y: 0.109375 }, + { x: 0.265625, y: 0.109375 }, + { x: 0.265625, y: 0.109375 }, + { x: 0.296875, y: 0.109375 }, + { x: 0.296875, y: 0.109375 }, + { x: 0.328125, y: 0.109375 }, + { x: 0.328125, y: 0.109375 }, + { x: 0.359375, y: 0.109375 }, + { x: 0.359375, y: 0.109375 }, + { x: 0.390625, y: 0.109375 }, + { x: 0.390625, y: 0.109375 }, + { x: 0.421875, y: 0.109375 }, + { x: 0.421875, y: 0.109375 }, + { x: 0.453125, y: 0.109375 }, + { x: 0.453125, y: 0.109375 }, + { x: 0.484375, y: 0.109375 }, + { x: 0.484375, y: 0.109375 }, + { x: 0.515625, y: 0.109375 }, + { x: 0.515625, y: 0.109375 }, + { x: 0.546875, y: 0.109375 }, + { x: 0.546875, y: 0.109375 }, + { x: 0.578125, y: 0.109375 }, + { x: 0.578125, y: 0.109375 }, + { x: 0.609375, y: 0.109375 }, + { x: 0.609375, y: 0.109375 }, + { x: 0.640625, y: 0.109375 }, + { x: 0.640625, y: 0.109375 }, + { x: 0.671875, y: 0.109375 }, + { x: 0.671875, y: 0.109375 }, + { x: 0.703125, y: 0.109375 }, + { x: 0.703125, y: 0.109375 }, + { x: 0.734375, y: 0.109375 }, + { x: 0.734375, y: 0.109375 }, + { x: 0.765625, y: 0.109375 }, + { x: 0.765625, y: 0.109375 }, + { x: 0.796875, y: 0.109375 }, + { x: 0.796875, y: 0.109375 }, + { x: 0.828125, y: 0.109375 }, + { x: 0.828125, y: 0.109375 }, + { x: 0.859375, y: 0.109375 }, + { x: 0.859375, y: 0.109375 }, + { x: 0.890625, y: 0.109375 }, + { x: 0.890625, y: 0.109375 }, + { x: 0.921875, y: 0.109375 }, + { x: 0.921875, y: 0.109375 }, + { x: 0.953125, y: 0.109375 }, + { x: 0.953125, y: 0.109375 }, + { x: 0.984375, y: 0.109375 }, + { x: 0.984375, y: 0.109375 }, + { x: 0.015625, y: 0.140625 }, + { x: 0.015625, y: 0.140625 }, + { x: 0.046875, y: 0.140625 }, + { x: 0.046875, y: 0.140625 }, + { x: 0.078125, y: 0.140625 }, + { x: 0.078125, y: 0.140625 }, + { x: 0.109375, y: 0.140625 }, + { x: 0.109375, y: 0.140625 }, + { x: 0.140625, y: 0.140625 }, + { x: 0.140625, y: 0.140625 }, + { x: 0.171875, y: 0.140625 }, + { x: 0.171875, y: 0.140625 }, + { x: 0.203125, y: 0.140625 }, + { x: 0.203125, y: 0.140625 }, + { x: 0.234375, y: 0.140625 }, + { x: 0.234375, y: 0.140625 }, + { x: 0.265625, y: 0.140625 }, + { x: 0.265625, y: 0.140625 }, + { x: 0.296875, y: 0.140625 }, + { x: 0.296875, y: 0.140625 }, + { x: 0.328125, y: 0.140625 }, + { x: 0.328125, y: 0.140625 }, + { x: 0.359375, y: 0.140625 }, + { x: 0.359375, y: 0.140625 }, + { x: 0.390625, y: 0.140625 }, + { x: 0.390625, y: 0.140625 }, + { x: 0.421875, y: 0.140625 }, + { x: 0.421875, y: 0.140625 }, + { x: 0.453125, y: 0.140625 }, + { x: 0.453125, y: 0.140625 }, + { x: 0.484375, y: 0.140625 }, + { x: 0.484375, y: 0.140625 }, + { x: 0.515625, y: 0.140625 }, + { x: 0.515625, y: 0.140625 }, + { x: 0.546875, y: 0.140625 }, + { x: 0.546875, y: 0.140625 }, + { x: 0.578125, y: 0.140625 }, + { x: 0.578125, y: 0.140625 }, + { x: 0.609375, y: 0.140625 }, + { x: 0.609375, y: 0.140625 }, + { x: 0.640625, y: 0.140625 }, + { x: 0.640625, y: 0.140625 }, + { x: 0.671875, y: 0.140625 }, + { x: 0.671875, y: 0.140625 }, + { x: 0.703125, y: 0.140625 }, + { x: 0.703125, y: 0.140625 }, + { x: 0.734375, y: 0.140625 }, + { x: 0.734375, y: 0.140625 }, + { x: 0.765625, y: 0.140625 }, + { x: 0.765625, y: 0.140625 }, + { x: 0.796875, y: 0.140625 }, + { x: 0.796875, y: 0.140625 }, + { x: 0.828125, y: 0.140625 }, + { x: 0.828125, y: 0.140625 }, + { x: 0.859375, y: 0.140625 }, + { x: 0.859375, y: 0.140625 }, + { x: 0.890625, y: 0.140625 }, + { x: 0.890625, y: 0.140625 }, + { x: 0.921875, y: 0.140625 }, + { x: 0.921875, y: 0.140625 }, + { x: 0.953125, y: 0.140625 }, + { x: 0.953125, y: 0.140625 }, + { x: 0.984375, y: 0.140625 }, + { x: 0.984375, y: 0.140625 }, + { x: 0.015625, y: 0.171875 }, + { x: 0.015625, y: 0.171875 }, + { x: 0.046875, y: 0.171875 }, + { x: 0.046875, y: 0.171875 }, + { x: 0.078125, y: 0.171875 }, + { x: 0.078125, y: 0.171875 }, + { x: 0.109375, y: 0.171875 }, + { x: 0.109375, y: 0.171875 }, + { x: 0.140625, y: 0.171875 }, + { x: 0.140625, y: 0.171875 }, + { x: 0.171875, y: 0.171875 }, + { x: 0.171875, y: 0.171875 }, + { x: 0.203125, y: 0.171875 }, + { x: 0.203125, y: 0.171875 }, + { x: 0.234375, y: 0.171875 }, + { x: 0.234375, y: 0.171875 }, + { x: 0.265625, y: 0.171875 }, + { x: 0.265625, y: 0.171875 }, + { x: 0.296875, y: 0.171875 }, + { x: 0.296875, y: 0.171875 }, + { x: 0.328125, y: 0.171875 }, + { x: 0.328125, y: 0.171875 }, + { x: 0.359375, y: 0.171875 }, + { x: 0.359375, y: 0.171875 }, + { x: 0.390625, y: 0.171875 }, + { x: 0.390625, y: 0.171875 }, + { x: 0.421875, y: 0.171875 }, + { x: 0.421875, y: 0.171875 }, + { x: 0.453125, y: 0.171875 }, + { x: 0.453125, y: 0.171875 }, + { x: 0.484375, y: 0.171875 }, + { x: 0.484375, y: 0.171875 }, + { x: 0.515625, y: 0.171875 }, + { x: 0.515625, y: 0.171875 }, + { x: 0.546875, y: 0.171875 }, + { x: 0.546875, y: 0.171875 }, + { x: 0.578125, y: 0.171875 }, + { x: 0.578125, y: 0.171875 }, + { x: 0.609375, y: 0.171875 }, + { x: 0.609375, y: 0.171875 }, + { x: 0.640625, y: 0.171875 }, + { x: 0.640625, y: 0.171875 }, + { x: 0.671875, y: 0.171875 }, + { x: 0.671875, y: 0.171875 }, + { x: 0.703125, y: 0.171875 }, + { x: 0.703125, y: 0.171875 }, + { x: 0.734375, y: 0.171875 }, + { x: 0.734375, y: 0.171875 }, + { x: 0.765625, y: 0.171875 }, + { x: 0.765625, y: 0.171875 }, + { x: 0.796875, y: 0.171875 }, + { x: 0.796875, y: 0.171875 }, + { x: 0.828125, y: 0.171875 }, + { x: 0.828125, y: 0.171875 }, + { x: 0.859375, y: 0.171875 }, + { x: 0.859375, y: 0.171875 }, + { x: 0.890625, y: 0.171875 }, + { x: 0.890625, y: 0.171875 }, + { x: 0.921875, y: 0.171875 }, + { x: 0.921875, y: 0.171875 }, + { x: 0.953125, y: 0.171875 }, + { x: 0.953125, y: 0.171875 }, + { x: 0.984375, y: 0.171875 }, + { x: 0.984375, y: 0.171875 }, + { x: 0.015625, y: 0.203125 }, + { x: 0.015625, y: 0.203125 }, + { x: 0.046875, y: 0.203125 }, + { x: 0.046875, y: 0.203125 }, + { x: 0.078125, y: 0.203125 }, + { x: 0.078125, y: 0.203125 }, + { x: 0.109375, y: 0.203125 }, + { x: 0.109375, y: 0.203125 }, + { x: 0.140625, y: 0.203125 }, + { x: 0.140625, y: 0.203125 }, + { x: 0.171875, y: 0.203125 }, + { x: 0.171875, y: 0.203125 }, + { x: 0.203125, y: 0.203125 }, + { x: 0.203125, y: 0.203125 }, + { x: 0.234375, y: 0.203125 }, + { x: 0.234375, y: 0.203125 }, + { x: 0.265625, y: 0.203125 }, + { x: 0.265625, y: 0.203125 }, + { x: 0.296875, y: 0.203125 }, + { x: 0.296875, y: 0.203125 }, + { x: 0.328125, y: 0.203125 }, + { x: 0.328125, y: 0.203125 }, + { x: 0.359375, y: 0.203125 }, + { x: 0.359375, y: 0.203125 }, + { x: 0.390625, y: 0.203125 }, + { x: 0.390625, y: 0.203125 }, + { x: 0.421875, y: 0.203125 }, + { x: 0.421875, y: 0.203125 }, + { x: 0.453125, y: 0.203125 }, + { x: 0.453125, y: 0.203125 }, + { x: 0.484375, y: 0.203125 }, + { x: 0.484375, y: 0.203125 }, + { x: 0.515625, y: 0.203125 }, + { x: 0.515625, y: 0.203125 }, + { x: 0.546875, y: 0.203125 }, + { x: 0.546875, y: 0.203125 }, + { x: 0.578125, y: 0.203125 }, + { x: 0.578125, y: 0.203125 }, + { x: 0.609375, y: 0.203125 }, + { x: 0.609375, y: 0.203125 }, + { x: 0.640625, y: 0.203125 }, + { x: 0.640625, y: 0.203125 }, + { x: 0.671875, y: 0.203125 }, + { x: 0.671875, y: 0.203125 }, + { x: 0.703125, y: 0.203125 }, + { x: 0.703125, y: 0.203125 }, + { x: 0.734375, y: 0.203125 }, + { x: 0.734375, y: 0.203125 }, + { x: 0.765625, y: 0.203125 }, + { x: 0.765625, y: 0.203125 }, + { x: 0.796875, y: 0.203125 }, + { x: 0.796875, y: 0.203125 }, + { x: 0.828125, y: 0.203125 }, + { x: 0.828125, y: 0.203125 }, + { x: 0.859375, y: 0.203125 }, + { x: 0.859375, y: 0.203125 }, + { x: 0.890625, y: 0.203125 }, + { x: 0.890625, y: 0.203125 }, + { x: 0.921875, y: 0.203125 }, + { x: 0.921875, y: 0.203125 }, + { x: 0.953125, y: 0.203125 }, + { x: 0.953125, y: 0.203125 }, + { x: 0.984375, y: 0.203125 }, + { x: 0.984375, y: 0.203125 }, + { x: 0.015625, y: 0.234375 }, + { x: 0.015625, y: 0.234375 }, + { x: 0.046875, y: 0.234375 }, + { x: 0.046875, y: 0.234375 }, + { x: 0.078125, y: 0.234375 }, + { x: 0.078125, y: 0.234375 }, + { x: 0.109375, y: 0.234375 }, + { x: 0.109375, y: 0.234375 }, + { x: 0.140625, y: 0.234375 }, + { x: 0.140625, y: 0.234375 }, + { x: 0.171875, y: 0.234375 }, + { x: 0.171875, y: 0.234375 }, + { x: 0.203125, y: 0.234375 }, + { x: 0.203125, y: 0.234375 }, + { x: 0.234375, y: 0.234375 }, + { x: 0.234375, y: 0.234375 }, + { x: 0.265625, y: 0.234375 }, + { x: 0.265625, y: 0.234375 }, + { x: 0.296875, y: 0.234375 }, + { x: 0.296875, y: 0.234375 }, + { x: 0.328125, y: 0.234375 }, + { x: 0.328125, y: 0.234375 }, + { x: 0.359375, y: 0.234375 }, + { x: 0.359375, y: 0.234375 }, + { x: 0.390625, y: 0.234375 }, + { x: 0.390625, y: 0.234375 }, + { x: 0.421875, y: 0.234375 }, + { x: 0.421875, y: 0.234375 }, + { x: 0.453125, y: 0.234375 }, + { x: 0.453125, y: 0.234375 }, + { x: 0.484375, y: 0.234375 }, + { x: 0.484375, y: 0.234375 }, + { x: 0.515625, y: 0.234375 }, + { x: 0.515625, y: 0.234375 }, + { x: 0.546875, y: 0.234375 }, + { x: 0.546875, y: 0.234375 }, + { x: 0.578125, y: 0.234375 }, + { x: 0.578125, y: 0.234375 }, + { x: 0.609375, y: 0.234375 }, + { x: 0.609375, y: 0.234375 }, + { x: 0.640625, y: 0.234375 }, + { x: 0.640625, y: 0.234375 }, + { x: 0.671875, y: 0.234375 }, + { x: 0.671875, y: 0.234375 }, + { x: 0.703125, y: 0.234375 }, + { x: 0.703125, y: 0.234375 }, + { x: 0.734375, y: 0.234375 }, + { x: 0.734375, y: 0.234375 }, + { x: 0.765625, y: 0.234375 }, + { x: 0.765625, y: 0.234375 }, + { x: 0.796875, y: 0.234375 }, + { x: 0.796875, y: 0.234375 }, + { x: 0.828125, y: 0.234375 }, + { x: 0.828125, y: 0.234375 }, + { x: 0.859375, y: 0.234375 }, + { x: 0.859375, y: 0.234375 }, + { x: 0.890625, y: 0.234375 }, + { x: 0.890625, y: 0.234375 }, + { x: 0.921875, y: 0.234375 }, + { x: 0.921875, y: 0.234375 }, + { x: 0.953125, y: 0.234375 }, + { x: 0.953125, y: 0.234375 }, + { x: 0.984375, y: 0.234375 }, + { x: 0.984375, y: 0.234375 }, + { x: 0.015625, y: 0.265625 }, + { x: 0.015625, y: 0.265625 }, + { x: 0.046875, y: 0.265625 }, + { x: 0.046875, y: 0.265625 }, + { x: 0.078125, y: 0.265625 }, + { x: 0.078125, y: 0.265625 }, + { x: 0.109375, y: 0.265625 }, + { x: 0.109375, y: 0.265625 }, + { x: 0.140625, y: 0.265625 }, + { x: 0.140625, y: 0.265625 }, + { x: 0.171875, y: 0.265625 }, + { x: 0.171875, y: 0.265625 }, + { x: 0.203125, y: 0.265625 }, + { x: 0.203125, y: 0.265625 }, + { x: 0.234375, y: 0.265625 }, + { x: 0.234375, y: 0.265625 }, + { x: 0.265625, y: 0.265625 }, + { x: 0.265625, y: 0.265625 }, + { x: 0.296875, y: 0.265625 }, + { x: 0.296875, y: 0.265625 }, + { x: 0.328125, y: 0.265625 }, + { x: 0.328125, y: 0.265625 }, + { x: 0.359375, y: 0.265625 }, + { x: 0.359375, y: 0.265625 }, + { x: 0.390625, y: 0.265625 }, + { x: 0.390625, y: 0.265625 }, + { x: 0.421875, y: 0.265625 }, + { x: 0.421875, y: 0.265625 }, + { x: 0.453125, y: 0.265625 }, + { x: 0.453125, y: 0.265625 }, + { x: 0.484375, y: 0.265625 }, + { x: 0.484375, y: 0.265625 }, + { x: 0.515625, y: 0.265625 }, + { x: 0.515625, y: 0.265625 }, + { x: 0.546875, y: 0.265625 }, + { x: 0.546875, y: 0.265625 }, + { x: 0.578125, y: 0.265625 }, + { x: 0.578125, y: 0.265625 }, + { x: 0.609375, y: 0.265625 }, + { x: 0.609375, y: 0.265625 }, + { x: 0.640625, y: 0.265625 }, + { x: 0.640625, y: 0.265625 }, + { x: 0.671875, y: 0.265625 }, + { x: 0.671875, y: 0.265625 }, + { x: 0.703125, y: 0.265625 }, + { x: 0.703125, y: 0.265625 }, + { x: 0.734375, y: 0.265625 }, + { x: 0.734375, y: 0.265625 }, + { x: 0.765625, y: 0.265625 }, + { x: 0.765625, y: 0.265625 }, + { x: 0.796875, y: 0.265625 }, + { x: 0.796875, y: 0.265625 }, + { x: 0.828125, y: 0.265625 }, + { x: 0.828125, y: 0.265625 }, + { x: 0.859375, y: 0.265625 }, + { x: 0.859375, y: 0.265625 }, + { x: 0.890625, y: 0.265625 }, + { x: 0.890625, y: 0.265625 }, + { x: 0.921875, y: 0.265625 }, + { x: 0.921875, y: 0.265625 }, + { x: 0.953125, y: 0.265625 }, + { x: 0.953125, y: 0.265625 }, + { x: 0.984375, y: 0.265625 }, + { x: 0.984375, y: 0.265625 }, + { x: 0.015625, y: 0.296875 }, + { x: 0.015625, y: 0.296875 }, + { x: 0.046875, y: 0.296875 }, + { x: 0.046875, y: 0.296875 }, + { x: 0.078125, y: 0.296875 }, + { x: 0.078125, y: 0.296875 }, + { x: 0.109375, y: 0.296875 }, + { x: 0.109375, y: 0.296875 }, + { x: 0.140625, y: 0.296875 }, + { x: 0.140625, y: 0.296875 }, + { x: 0.171875, y: 0.296875 }, + { x: 0.171875, y: 0.296875 }, + { x: 0.203125, y: 0.296875 }, + { x: 0.203125, y: 0.296875 }, + { x: 0.234375, y: 0.296875 }, + { x: 0.234375, y: 0.296875 }, + { x: 0.265625, y: 0.296875 }, + { x: 0.265625, y: 0.296875 }, + { x: 0.296875, y: 0.296875 }, + { x: 0.296875, y: 0.296875 }, + { x: 0.328125, y: 0.296875 }, + { x: 0.328125, y: 0.296875 }, + { x: 0.359375, y: 0.296875 }, + { x: 0.359375, y: 0.296875 }, + { x: 0.390625, y: 0.296875 }, + { x: 0.390625, y: 0.296875 }, + { x: 0.421875, y: 0.296875 }, + { x: 0.421875, y: 0.296875 }, + { x: 0.453125, y: 0.296875 }, + { x: 0.453125, y: 0.296875 }, + { x: 0.484375, y: 0.296875 }, + { x: 0.484375, y: 0.296875 }, + { x: 0.515625, y: 0.296875 }, + { x: 0.515625, y: 0.296875 }, + { x: 0.546875, y: 0.296875 }, + { x: 0.546875, y: 0.296875 }, + { x: 0.578125, y: 0.296875 }, + { x: 0.578125, y: 0.296875 }, + { x: 0.609375, y: 0.296875 }, + { x: 0.609375, y: 0.296875 }, + { x: 0.640625, y: 0.296875 }, + { x: 0.640625, y: 0.296875 }, + { x: 0.671875, y: 0.296875 }, + { x: 0.671875, y: 0.296875 }, + { x: 0.703125, y: 0.296875 }, + { x: 0.703125, y: 0.296875 }, + { x: 0.734375, y: 0.296875 }, + { x: 0.734375, y: 0.296875 }, + { x: 0.765625, y: 0.296875 }, + { x: 0.765625, y: 0.296875 }, + { x: 0.796875, y: 0.296875 }, + { x: 0.796875, y: 0.296875 }, + { x: 0.828125, y: 0.296875 }, + { x: 0.828125, y: 0.296875 }, + { x: 0.859375, y: 0.296875 }, + { x: 0.859375, y: 0.296875 }, + { x: 0.890625, y: 0.296875 }, + { x: 0.890625, y: 0.296875 }, + { x: 0.921875, y: 0.296875 }, + { x: 0.921875, y: 0.296875 }, + { x: 0.953125, y: 0.296875 }, + { x: 0.953125, y: 0.296875 }, + { x: 0.984375, y: 0.296875 }, + { x: 0.984375, y: 0.296875 }, + { x: 0.015625, y: 0.328125 }, + { x: 0.015625, y: 0.328125 }, + { x: 0.046875, y: 0.328125 }, + { x: 0.046875, y: 0.328125 }, + { x: 0.078125, y: 0.328125 }, + { x: 0.078125, y: 0.328125 }, + { x: 0.109375, y: 0.328125 }, + { x: 0.109375, y: 0.328125 }, + { x: 0.140625, y: 0.328125 }, + { x: 0.140625, y: 0.328125 }, + { x: 0.171875, y: 0.328125 }, + { x: 0.171875, y: 0.328125 }, + { x: 0.203125, y: 0.328125 }, + { x: 0.203125, y: 0.328125 }, + { x: 0.234375, y: 0.328125 }, + { x: 0.234375, y: 0.328125 }, + { x: 0.265625, y: 0.328125 }, + { x: 0.265625, y: 0.328125 }, + { x: 0.296875, y: 0.328125 }, + { x: 0.296875, y: 0.328125 }, + { x: 0.328125, y: 0.328125 }, + { x: 0.328125, y: 0.328125 }, + { x: 0.359375, y: 0.328125 }, + { x: 0.359375, y: 0.328125 }, + { x: 0.390625, y: 0.328125 }, + { x: 0.390625, y: 0.328125 }, + { x: 0.421875, y: 0.328125 }, + { x: 0.421875, y: 0.328125 }, + { x: 0.453125, y: 0.328125 }, + { x: 0.453125, y: 0.328125 }, + { x: 0.484375, y: 0.328125 }, + { x: 0.484375, y: 0.328125 }, + { x: 0.515625, y: 0.328125 }, + { x: 0.515625, y: 0.328125 }, + { x: 0.546875, y: 0.328125 }, + { x: 0.546875, y: 0.328125 }, + { x: 0.578125, y: 0.328125 }, + { x: 0.578125, y: 0.328125 }, + { x: 0.609375, y: 0.328125 }, + { x: 0.609375, y: 0.328125 }, + { x: 0.640625, y: 0.328125 }, + { x: 0.640625, y: 0.328125 }, + { x: 0.671875, y: 0.328125 }, + { x: 0.671875, y: 0.328125 }, + { x: 0.703125, y: 0.328125 }, + { x: 0.703125, y: 0.328125 }, + { x: 0.734375, y: 0.328125 }, + { x: 0.734375, y: 0.328125 }, + { x: 0.765625, y: 0.328125 }, + { x: 0.765625, y: 0.328125 }, + { x: 0.796875, y: 0.328125 }, + { x: 0.796875, y: 0.328125 }, + { x: 0.828125, y: 0.328125 }, + { x: 0.828125, y: 0.328125 }, + { x: 0.859375, y: 0.328125 }, + { x: 0.859375, y: 0.328125 }, + { x: 0.890625, y: 0.328125 }, + { x: 0.890625, y: 0.328125 }, + { x: 0.921875, y: 0.328125 }, + { x: 0.921875, y: 0.328125 }, + { x: 0.953125, y: 0.328125 }, + { x: 0.953125, y: 0.328125 }, + { x: 0.984375, y: 0.328125 }, + { x: 0.984375, y: 0.328125 }, + { x: 0.015625, y: 0.359375 }, + { x: 0.015625, y: 0.359375 }, + { x: 0.046875, y: 0.359375 }, + { x: 0.046875, y: 0.359375 }, + { x: 0.078125, y: 0.359375 }, + { x: 0.078125, y: 0.359375 }, + { x: 0.109375, y: 0.359375 }, + { x: 0.109375, y: 0.359375 }, + { x: 0.140625, y: 0.359375 }, + { x: 0.140625, y: 0.359375 }, + { x: 0.171875, y: 0.359375 }, + { x: 0.171875, y: 0.359375 }, + { x: 0.203125, y: 0.359375 }, + { x: 0.203125, y: 0.359375 }, + { x: 0.234375, y: 0.359375 }, + { x: 0.234375, y: 0.359375 }, + { x: 0.265625, y: 0.359375 }, + { x: 0.265625, y: 0.359375 }, + { x: 0.296875, y: 0.359375 }, + { x: 0.296875, y: 0.359375 }, + { x: 0.328125, y: 0.359375 }, + { x: 0.328125, y: 0.359375 }, + { x: 0.359375, y: 0.359375 }, + { x: 0.359375, y: 0.359375 }, + { x: 0.390625, y: 0.359375 }, + { x: 0.390625, y: 0.359375 }, + { x: 0.421875, y: 0.359375 }, + { x: 0.421875, y: 0.359375 }, + { x: 0.453125, y: 0.359375 }, + { x: 0.453125, y: 0.359375 }, + { x: 0.484375, y: 0.359375 }, + { x: 0.484375, y: 0.359375 }, + { x: 0.515625, y: 0.359375 }, + { x: 0.515625, y: 0.359375 }, + { x: 0.546875, y: 0.359375 }, + { x: 0.546875, y: 0.359375 }, + { x: 0.578125, y: 0.359375 }, + { x: 0.578125, y: 0.359375 }, + { x: 0.609375, y: 0.359375 }, + { x: 0.609375, y: 0.359375 }, + { x: 0.640625, y: 0.359375 }, + { x: 0.640625, y: 0.359375 }, + { x: 0.671875, y: 0.359375 }, + { x: 0.671875, y: 0.359375 }, + { x: 0.703125, y: 0.359375 }, + { x: 0.703125, y: 0.359375 }, + { x: 0.734375, y: 0.359375 }, + { x: 0.734375, y: 0.359375 }, + { x: 0.765625, y: 0.359375 }, + { x: 0.765625, y: 0.359375 }, + { x: 0.796875, y: 0.359375 }, + { x: 0.796875, y: 0.359375 }, + { x: 0.828125, y: 0.359375 }, + { x: 0.828125, y: 0.359375 }, + { x: 0.859375, y: 0.359375 }, + { x: 0.859375, y: 0.359375 }, + { x: 0.890625, y: 0.359375 }, + { x: 0.890625, y: 0.359375 }, + { x: 0.921875, y: 0.359375 }, + { x: 0.921875, y: 0.359375 }, + { x: 0.953125, y: 0.359375 }, + { x: 0.953125, y: 0.359375 }, + { x: 0.984375, y: 0.359375 }, + { x: 0.984375, y: 0.359375 }, + { x: 0.015625, y: 0.390625 }, + { x: 0.015625, y: 0.390625 }, + { x: 0.046875, y: 0.390625 }, + { x: 0.046875, y: 0.390625 }, + { x: 0.078125, y: 0.390625 }, + { x: 0.078125, y: 0.390625 }, + { x: 0.109375, y: 0.390625 }, + { x: 0.109375, y: 0.390625 }, + { x: 0.140625, y: 0.390625 }, + { x: 0.140625, y: 0.390625 }, + { x: 0.171875, y: 0.390625 }, + { x: 0.171875, y: 0.390625 }, + { x: 0.203125, y: 0.390625 }, + { x: 0.203125, y: 0.390625 }, + { x: 0.234375, y: 0.390625 }, + { x: 0.234375, y: 0.390625 }, + { x: 0.265625, y: 0.390625 }, + { x: 0.265625, y: 0.390625 }, + { x: 0.296875, y: 0.390625 }, + { x: 0.296875, y: 0.390625 }, + { x: 0.328125, y: 0.390625 }, + { x: 0.328125, y: 0.390625 }, + { x: 0.359375, y: 0.390625 }, + { x: 0.359375, y: 0.390625 }, + { x: 0.390625, y: 0.390625 }, + { x: 0.390625, y: 0.390625 }, + { x: 0.421875, y: 0.390625 }, + { x: 0.421875, y: 0.390625 }, + { x: 0.453125, y: 0.390625 }, + { x: 0.453125, y: 0.390625 }, + { x: 0.484375, y: 0.390625 }, + { x: 0.484375, y: 0.390625 }, + { x: 0.515625, y: 0.390625 }, + { x: 0.515625, y: 0.390625 }, + { x: 0.546875, y: 0.390625 }, + { x: 0.546875, y: 0.390625 }, + { x: 0.578125, y: 0.390625 }, + { x: 0.578125, y: 0.390625 }, + { x: 0.609375, y: 0.390625 }, + { x: 0.609375, y: 0.390625 }, + { x: 0.640625, y: 0.390625 }, + { x: 0.640625, y: 0.390625 }, + { x: 0.671875, y: 0.390625 }, + { x: 0.671875, y: 0.390625 }, + { x: 0.703125, y: 0.390625 }, + { x: 0.703125, y: 0.390625 }, + { x: 0.734375, y: 0.390625 }, + { x: 0.734375, y: 0.390625 }, + { x: 0.765625, y: 0.390625 }, + { x: 0.765625, y: 0.390625 }, + { x: 0.796875, y: 0.390625 }, + { x: 0.796875, y: 0.390625 }, + { x: 0.828125, y: 0.390625 }, + { x: 0.828125, y: 0.390625 }, + { x: 0.859375, y: 0.390625 }, + { x: 0.859375, y: 0.390625 }, + { x: 0.890625, y: 0.390625 }, + { x: 0.890625, y: 0.390625 }, + { x: 0.921875, y: 0.390625 }, + { x: 0.921875, y: 0.390625 }, + { x: 0.953125, y: 0.390625 }, + { x: 0.953125, y: 0.390625 }, + { x: 0.984375, y: 0.390625 }, + { x: 0.984375, y: 0.390625 }, + { x: 0.015625, y: 0.421875 }, + { x: 0.015625, y: 0.421875 }, + { x: 0.046875, y: 0.421875 }, + { x: 0.046875, y: 0.421875 }, + { x: 0.078125, y: 0.421875 }, + { x: 0.078125, y: 0.421875 }, + { x: 0.109375, y: 0.421875 }, + { x: 0.109375, y: 0.421875 }, + { x: 0.140625, y: 0.421875 }, + { x: 0.140625, y: 0.421875 }, + { x: 0.171875, y: 0.421875 }, + { x: 0.171875, y: 0.421875 }, + { x: 0.203125, y: 0.421875 }, + { x: 0.203125, y: 0.421875 }, + { x: 0.234375, y: 0.421875 }, + { x: 0.234375, y: 0.421875 }, + { x: 0.265625, y: 0.421875 }, + { x: 0.265625, y: 0.421875 }, + { x: 0.296875, y: 0.421875 }, + { x: 0.296875, y: 0.421875 }, + { x: 0.328125, y: 0.421875 }, + { x: 0.328125, y: 0.421875 }, + { x: 0.359375, y: 0.421875 }, + { x: 0.359375, y: 0.421875 }, + { x: 0.390625, y: 0.421875 }, + { x: 0.390625, y: 0.421875 }, + { x: 0.421875, y: 0.421875 }, + { x: 0.421875, y: 0.421875 }, + { x: 0.453125, y: 0.421875 }, + { x: 0.453125, y: 0.421875 }, + { x: 0.484375, y: 0.421875 }, + { x: 0.484375, y: 0.421875 }, + { x: 0.515625, y: 0.421875 }, + { x: 0.515625, y: 0.421875 }, + { x: 0.546875, y: 0.421875 }, + { x: 0.546875, y: 0.421875 }, + { x: 0.578125, y: 0.421875 }, + { x: 0.578125, y: 0.421875 }, + { x: 0.609375, y: 0.421875 }, + { x: 0.609375, y: 0.421875 }, + { x: 0.640625, y: 0.421875 }, + { x: 0.640625, y: 0.421875 }, + { x: 0.671875, y: 0.421875 }, + { x: 0.671875, y: 0.421875 }, + { x: 0.703125, y: 0.421875 }, + { x: 0.703125, y: 0.421875 }, + { x: 0.734375, y: 0.421875 }, + { x: 0.734375, y: 0.421875 }, + { x: 0.765625, y: 0.421875 }, + { x: 0.765625, y: 0.421875 }, + { x: 0.796875, y: 0.421875 }, + { x: 0.796875, y: 0.421875 }, + { x: 0.828125, y: 0.421875 }, + { x: 0.828125, y: 0.421875 }, + { x: 0.859375, y: 0.421875 }, + { x: 0.859375, y: 0.421875 }, + { x: 0.890625, y: 0.421875 }, + { x: 0.890625, y: 0.421875 }, + { x: 0.921875, y: 0.421875 }, + { x: 0.921875, y: 0.421875 }, + { x: 0.953125, y: 0.421875 }, + { x: 0.953125, y: 0.421875 }, + { x: 0.984375, y: 0.421875 }, + { x: 0.984375, y: 0.421875 }, + { x: 0.015625, y: 0.453125 }, + { x: 0.015625, y: 0.453125 }, + { x: 0.046875, y: 0.453125 }, + { x: 0.046875, y: 0.453125 }, + { x: 0.078125, y: 0.453125 }, + { x: 0.078125, y: 0.453125 }, + { x: 0.109375, y: 0.453125 }, + { x: 0.109375, y: 0.453125 }, + { x: 0.140625, y: 0.453125 }, + { x: 0.140625, y: 0.453125 }, + { x: 0.171875, y: 0.453125 }, + { x: 0.171875, y: 0.453125 }, + { x: 0.203125, y: 0.453125 }, + { x: 0.203125, y: 0.453125 }, + { x: 0.234375, y: 0.453125 }, + { x: 0.234375, y: 0.453125 }, + { x: 0.265625, y: 0.453125 }, + { x: 0.265625, y: 0.453125 }, + { x: 0.296875, y: 0.453125 }, + { x: 0.296875, y: 0.453125 }, + { x: 0.328125, y: 0.453125 }, + { x: 0.328125, y: 0.453125 }, + { x: 0.359375, y: 0.453125 }, + { x: 0.359375, y: 0.453125 }, + { x: 0.390625, y: 0.453125 }, + { x: 0.390625, y: 0.453125 }, + { x: 0.421875, y: 0.453125 }, + { x: 0.421875, y: 0.453125 }, + { x: 0.453125, y: 0.453125 }, + { x: 0.453125, y: 0.453125 }, + { x: 0.484375, y: 0.453125 }, + { x: 0.484375, y: 0.453125 }, + { x: 0.515625, y: 0.453125 }, + { x: 0.515625, y: 0.453125 }, + { x: 0.546875, y: 0.453125 }, + { x: 0.546875, y: 0.453125 }, + { x: 0.578125, y: 0.453125 }, + { x: 0.578125, y: 0.453125 }, + { x: 0.609375, y: 0.453125 }, + { x: 0.609375, y: 0.453125 }, + { x: 0.640625, y: 0.453125 }, + { x: 0.640625, y: 0.453125 }, + { x: 0.671875, y: 0.453125 }, + { x: 0.671875, y: 0.453125 }, + { x: 0.703125, y: 0.453125 }, + { x: 0.703125, y: 0.453125 }, + { x: 0.734375, y: 0.453125 }, + { x: 0.734375, y: 0.453125 }, + { x: 0.765625, y: 0.453125 }, + { x: 0.765625, y: 0.453125 }, + { x: 0.796875, y: 0.453125 }, + { x: 0.796875, y: 0.453125 }, + { x: 0.828125, y: 0.453125 }, + { x: 0.828125, y: 0.453125 }, + { x: 0.859375, y: 0.453125 }, + { x: 0.859375, y: 0.453125 }, + { x: 0.890625, y: 0.453125 }, + { x: 0.890625, y: 0.453125 }, + { x: 0.921875, y: 0.453125 }, + { x: 0.921875, y: 0.453125 }, + { x: 0.953125, y: 0.453125 }, + { x: 0.953125, y: 0.453125 }, + { x: 0.984375, y: 0.453125 }, + { x: 0.984375, y: 0.453125 }, + { x: 0.015625, y: 0.484375 }, + { x: 0.015625, y: 0.484375 }, + { x: 0.046875, y: 0.484375 }, + { x: 0.046875, y: 0.484375 }, + { x: 0.078125, y: 0.484375 }, + { x: 0.078125, y: 0.484375 }, + { x: 0.109375, y: 0.484375 }, + { x: 0.109375, y: 0.484375 }, + { x: 0.140625, y: 0.484375 }, + { x: 0.140625, y: 0.484375 }, + { x: 0.171875, y: 0.484375 }, + { x: 0.171875, y: 0.484375 }, + { x: 0.203125, y: 0.484375 }, + { x: 0.203125, y: 0.484375 }, + { x: 0.234375, y: 0.484375 }, + { x: 0.234375, y: 0.484375 }, + { x: 0.265625, y: 0.484375 }, + { x: 0.265625, y: 0.484375 }, + { x: 0.296875, y: 0.484375 }, + { x: 0.296875, y: 0.484375 }, + { x: 0.328125, y: 0.484375 }, + { x: 0.328125, y: 0.484375 }, + { x: 0.359375, y: 0.484375 }, + { x: 0.359375, y: 0.484375 }, + { x: 0.390625, y: 0.484375 }, + { x: 0.390625, y: 0.484375 }, + { x: 0.421875, y: 0.484375 }, + { x: 0.421875, y: 0.484375 }, + { x: 0.453125, y: 0.484375 }, + { x: 0.453125, y: 0.484375 }, + { x: 0.484375, y: 0.484375 }, + { x: 0.484375, y: 0.484375 }, + { x: 0.515625, y: 0.484375 }, + { x: 0.515625, y: 0.484375 }, + { x: 0.546875, y: 0.484375 }, + { x: 0.546875, y: 0.484375 }, + { x: 0.578125, y: 0.484375 }, + { x: 0.578125, y: 0.484375 }, + { x: 0.609375, y: 0.484375 }, + { x: 0.609375, y: 0.484375 }, + { x: 0.640625, y: 0.484375 }, + { x: 0.640625, y: 0.484375 }, + { x: 0.671875, y: 0.484375 }, + { x: 0.671875, y: 0.484375 }, + { x: 0.703125, y: 0.484375 }, + { x: 0.703125, y: 0.484375 }, + { x: 0.734375, y: 0.484375 }, + { x: 0.734375, y: 0.484375 }, + { x: 0.765625, y: 0.484375 }, + { x: 0.765625, y: 0.484375 }, + { x: 0.796875, y: 0.484375 }, + { x: 0.796875, y: 0.484375 }, + { x: 0.828125, y: 0.484375 }, + { x: 0.828125, y: 0.484375 }, + { x: 0.859375, y: 0.484375 }, + { x: 0.859375, y: 0.484375 }, + { x: 0.890625, y: 0.484375 }, + { x: 0.890625, y: 0.484375 }, + { x: 0.921875, y: 0.484375 }, + { x: 0.921875, y: 0.484375 }, + { x: 0.953125, y: 0.484375 }, + { x: 0.953125, y: 0.484375 }, + { x: 0.984375, y: 0.484375 }, + { x: 0.984375, y: 0.484375 }, + { x: 0.015625, y: 0.515625 }, + { x: 0.015625, y: 0.515625 }, + { x: 0.046875, y: 0.515625 }, + { x: 0.046875, y: 0.515625 }, + { x: 0.078125, y: 0.515625 }, + { x: 0.078125, y: 0.515625 }, + { x: 0.109375, y: 0.515625 }, + { x: 0.109375, y: 0.515625 }, + { x: 0.140625, y: 0.515625 }, + { x: 0.140625, y: 0.515625 }, + { x: 0.171875, y: 0.515625 }, + { x: 0.171875, y: 0.515625 }, + { x: 0.203125, y: 0.515625 }, + { x: 0.203125, y: 0.515625 }, + { x: 0.234375, y: 0.515625 }, + { x: 0.234375, y: 0.515625 }, + { x: 0.265625, y: 0.515625 }, + { x: 0.265625, y: 0.515625 }, + { x: 0.296875, y: 0.515625 }, + { x: 0.296875, y: 0.515625 }, + { x: 0.328125, y: 0.515625 }, + { x: 0.328125, y: 0.515625 }, + { x: 0.359375, y: 0.515625 }, + { x: 0.359375, y: 0.515625 }, + { x: 0.390625, y: 0.515625 }, + { x: 0.390625, y: 0.515625 }, + { x: 0.421875, y: 0.515625 }, + { x: 0.421875, y: 0.515625 }, + { x: 0.453125, y: 0.515625 }, + { x: 0.453125, y: 0.515625 }, + { x: 0.484375, y: 0.515625 }, + { x: 0.484375, y: 0.515625 }, + { x: 0.515625, y: 0.515625 }, + { x: 0.515625, y: 0.515625 }, + { x: 0.546875, y: 0.515625 }, + { x: 0.546875, y: 0.515625 }, + { x: 0.578125, y: 0.515625 }, + { x: 0.578125, y: 0.515625 }, + { x: 0.609375, y: 0.515625 }, + { x: 0.609375, y: 0.515625 }, + { x: 0.640625, y: 0.515625 }, + { x: 0.640625, y: 0.515625 }, + { x: 0.671875, y: 0.515625 }, + { x: 0.671875, y: 0.515625 }, + { x: 0.703125, y: 0.515625 }, + { x: 0.703125, y: 0.515625 }, + { x: 0.734375, y: 0.515625 }, + { x: 0.734375, y: 0.515625 }, + { x: 0.765625, y: 0.515625 }, + { x: 0.765625, y: 0.515625 }, + { x: 0.796875, y: 0.515625 }, + { x: 0.796875, y: 0.515625 }, + { x: 0.828125, y: 0.515625 }, + { x: 0.828125, y: 0.515625 }, + { x: 0.859375, y: 0.515625 }, + { x: 0.859375, y: 0.515625 }, + { x: 0.890625, y: 0.515625 }, + { x: 0.890625, y: 0.515625 }, + { x: 0.921875, y: 0.515625 }, + { x: 0.921875, y: 0.515625 }, + { x: 0.953125, y: 0.515625 }, + { x: 0.953125, y: 0.515625 }, + { x: 0.984375, y: 0.515625 }, + { x: 0.984375, y: 0.515625 }, + { x: 0.015625, y: 0.546875 }, + { x: 0.015625, y: 0.546875 }, + { x: 0.046875, y: 0.546875 }, + { x: 0.046875, y: 0.546875 }, + { x: 0.078125, y: 0.546875 }, + { x: 0.078125, y: 0.546875 }, + { x: 0.109375, y: 0.546875 }, + { x: 0.109375, y: 0.546875 }, + { x: 0.140625, y: 0.546875 }, + { x: 0.140625, y: 0.546875 }, + { x: 0.171875, y: 0.546875 }, + { x: 0.171875, y: 0.546875 }, + { x: 0.203125, y: 0.546875 }, + { x: 0.203125, y: 0.546875 }, + { x: 0.234375, y: 0.546875 }, + { x: 0.234375, y: 0.546875 }, + { x: 0.265625, y: 0.546875 }, + { x: 0.265625, y: 0.546875 }, + { x: 0.296875, y: 0.546875 }, + { x: 0.296875, y: 0.546875 }, + { x: 0.328125, y: 0.546875 }, + { x: 0.328125, y: 0.546875 }, + { x: 0.359375, y: 0.546875 }, + { x: 0.359375, y: 0.546875 }, + { x: 0.390625, y: 0.546875 }, + { x: 0.390625, y: 0.546875 }, + { x: 0.421875, y: 0.546875 }, + { x: 0.421875, y: 0.546875 }, + { x: 0.453125, y: 0.546875 }, + { x: 0.453125, y: 0.546875 }, + { x: 0.484375, y: 0.546875 }, + { x: 0.484375, y: 0.546875 }, + { x: 0.515625, y: 0.546875 }, + { x: 0.515625, y: 0.546875 }, + { x: 0.546875, y: 0.546875 }, + { x: 0.546875, y: 0.546875 }, + { x: 0.578125, y: 0.546875 }, + { x: 0.578125, y: 0.546875 }, + { x: 0.609375, y: 0.546875 }, + { x: 0.609375, y: 0.546875 }, + { x: 0.640625, y: 0.546875 }, + { x: 0.640625, y: 0.546875 }, + { x: 0.671875, y: 0.546875 }, + { x: 0.671875, y: 0.546875 }, + { x: 0.703125, y: 0.546875 }, + { x: 0.703125, y: 0.546875 }, + { x: 0.734375, y: 0.546875 }, + { x: 0.734375, y: 0.546875 }, + { x: 0.765625, y: 0.546875 }, + { x: 0.765625, y: 0.546875 }, + { x: 0.796875, y: 0.546875 }, + { x: 0.796875, y: 0.546875 }, + { x: 0.828125, y: 0.546875 }, + { x: 0.828125, y: 0.546875 }, + { x: 0.859375, y: 0.546875 }, + { x: 0.859375, y: 0.546875 }, + { x: 0.890625, y: 0.546875 }, + { x: 0.890625, y: 0.546875 }, + { x: 0.921875, y: 0.546875 }, + { x: 0.921875, y: 0.546875 }, + { x: 0.953125, y: 0.546875 }, + { x: 0.953125, y: 0.546875 }, + { x: 0.984375, y: 0.546875 }, + { x: 0.984375, y: 0.546875 }, + { x: 0.015625, y: 0.578125 }, + { x: 0.015625, y: 0.578125 }, + { x: 0.046875, y: 0.578125 }, + { x: 0.046875, y: 0.578125 }, + { x: 0.078125, y: 0.578125 }, + { x: 0.078125, y: 0.578125 }, + { x: 0.109375, y: 0.578125 }, + { x: 0.109375, y: 0.578125 }, + { x: 0.140625, y: 0.578125 }, + { x: 0.140625, y: 0.578125 }, + { x: 0.171875, y: 0.578125 }, + { x: 0.171875, y: 0.578125 }, + { x: 0.203125, y: 0.578125 }, + { x: 0.203125, y: 0.578125 }, + { x: 0.234375, y: 0.578125 }, + { x: 0.234375, y: 0.578125 }, + { x: 0.265625, y: 0.578125 }, + { x: 0.265625, y: 0.578125 }, + { x: 0.296875, y: 0.578125 }, + { x: 0.296875, y: 0.578125 }, + { x: 0.328125, y: 0.578125 }, + { x: 0.328125, y: 0.578125 }, + { x: 0.359375, y: 0.578125 }, + { x: 0.359375, y: 0.578125 }, + { x: 0.390625, y: 0.578125 }, + { x: 0.390625, y: 0.578125 }, + { x: 0.421875, y: 0.578125 }, + { x: 0.421875, y: 0.578125 }, + { x: 0.453125, y: 0.578125 }, + { x: 0.453125, y: 0.578125 }, + { x: 0.484375, y: 0.578125 }, + { x: 0.484375, y: 0.578125 }, + { x: 0.515625, y: 0.578125 }, + { x: 0.515625, y: 0.578125 }, + { x: 0.546875, y: 0.578125 }, + { x: 0.546875, y: 0.578125 }, + { x: 0.578125, y: 0.578125 }, + { x: 0.578125, y: 0.578125 }, + { x: 0.609375, y: 0.578125 }, + { x: 0.609375, y: 0.578125 }, + { x: 0.640625, y: 0.578125 }, + { x: 0.640625, y: 0.578125 }, + { x: 0.671875, y: 0.578125 }, + { x: 0.671875, y: 0.578125 }, + { x: 0.703125, y: 0.578125 }, + { x: 0.703125, y: 0.578125 }, + { x: 0.734375, y: 0.578125 }, + { x: 0.734375, y: 0.578125 }, + { x: 0.765625, y: 0.578125 }, + { x: 0.765625, y: 0.578125 }, + { x: 0.796875, y: 0.578125 }, + { x: 0.796875, y: 0.578125 }, + { x: 0.828125, y: 0.578125 }, + { x: 0.828125, y: 0.578125 }, + { x: 0.859375, y: 0.578125 }, + { x: 0.859375, y: 0.578125 }, + { x: 0.890625, y: 0.578125 }, + { x: 0.890625, y: 0.578125 }, + { x: 0.921875, y: 0.578125 }, + { x: 0.921875, y: 0.578125 }, + { x: 0.953125, y: 0.578125 }, + { x: 0.953125, y: 0.578125 }, + { x: 0.984375, y: 0.578125 }, + { x: 0.984375, y: 0.578125 }, + { x: 0.015625, y: 0.609375 }, + { x: 0.015625, y: 0.609375 }, + { x: 0.046875, y: 0.609375 }, + { x: 0.046875, y: 0.609375 }, + { x: 0.078125, y: 0.609375 }, + { x: 0.078125, y: 0.609375 }, + { x: 0.109375, y: 0.609375 }, + { x: 0.109375, y: 0.609375 }, + { x: 0.140625, y: 0.609375 }, + { x: 0.140625, y: 0.609375 }, + { x: 0.171875, y: 0.609375 }, + { x: 0.171875, y: 0.609375 }, + { x: 0.203125, y: 0.609375 }, + { x: 0.203125, y: 0.609375 }, + { x: 0.234375, y: 0.609375 }, + { x: 0.234375, y: 0.609375 }, + { x: 0.265625, y: 0.609375 }, + { x: 0.265625, y: 0.609375 }, + { x: 0.296875, y: 0.609375 }, + { x: 0.296875, y: 0.609375 }, + { x: 0.328125, y: 0.609375 }, + { x: 0.328125, y: 0.609375 }, + { x: 0.359375, y: 0.609375 }, + { x: 0.359375, y: 0.609375 }, + { x: 0.390625, y: 0.609375 }, + { x: 0.390625, y: 0.609375 }, + { x: 0.421875, y: 0.609375 }, + { x: 0.421875, y: 0.609375 }, + { x: 0.453125, y: 0.609375 }, + { x: 0.453125, y: 0.609375 }, + { x: 0.484375, y: 0.609375 }, + { x: 0.484375, y: 0.609375 }, + { x: 0.515625, y: 0.609375 }, + { x: 0.515625, y: 0.609375 }, + { x: 0.546875, y: 0.609375 }, + { x: 0.546875, y: 0.609375 }, + { x: 0.578125, y: 0.609375 }, + { x: 0.578125, y: 0.609375 }, + { x: 0.609375, y: 0.609375 }, + { x: 0.609375, y: 0.609375 }, + { x: 0.640625, y: 0.609375 }, + { x: 0.640625, y: 0.609375 }, + { x: 0.671875, y: 0.609375 }, + { x: 0.671875, y: 0.609375 }, + { x: 0.703125, y: 0.609375 }, + { x: 0.703125, y: 0.609375 }, + { x: 0.734375, y: 0.609375 }, + { x: 0.734375, y: 0.609375 }, + { x: 0.765625, y: 0.609375 }, + { x: 0.765625, y: 0.609375 }, + { x: 0.796875, y: 0.609375 }, + { x: 0.796875, y: 0.609375 }, + { x: 0.828125, y: 0.609375 }, + { x: 0.828125, y: 0.609375 }, + { x: 0.859375, y: 0.609375 }, + { x: 0.859375, y: 0.609375 }, + { x: 0.890625, y: 0.609375 }, + { x: 0.890625, y: 0.609375 }, + { x: 0.921875, y: 0.609375 }, + { x: 0.921875, y: 0.609375 }, + { x: 0.953125, y: 0.609375 }, + { x: 0.953125, y: 0.609375 }, + { x: 0.984375, y: 0.609375 }, + { x: 0.984375, y: 0.609375 }, + { x: 0.015625, y: 0.640625 }, + { x: 0.015625, y: 0.640625 }, + { x: 0.046875, y: 0.640625 }, + { x: 0.046875, y: 0.640625 }, + { x: 0.078125, y: 0.640625 }, + { x: 0.078125, y: 0.640625 }, + { x: 0.109375, y: 0.640625 }, + { x: 0.109375, y: 0.640625 }, + { x: 0.140625, y: 0.640625 }, + { x: 0.140625, y: 0.640625 }, + { x: 0.171875, y: 0.640625 }, + { x: 0.171875, y: 0.640625 }, + { x: 0.203125, y: 0.640625 }, + { x: 0.203125, y: 0.640625 }, + { x: 0.234375, y: 0.640625 }, + { x: 0.234375, y: 0.640625 }, + { x: 0.265625, y: 0.640625 }, + { x: 0.265625, y: 0.640625 }, + { x: 0.296875, y: 0.640625 }, + { x: 0.296875, y: 0.640625 }, + { x: 0.328125, y: 0.640625 }, + { x: 0.328125, y: 0.640625 }, + { x: 0.359375, y: 0.640625 }, + { x: 0.359375, y: 0.640625 }, + { x: 0.390625, y: 0.640625 }, + { x: 0.390625, y: 0.640625 }, + { x: 0.421875, y: 0.640625 }, + { x: 0.421875, y: 0.640625 }, + { x: 0.453125, y: 0.640625 }, + { x: 0.453125, y: 0.640625 }, + { x: 0.484375, y: 0.640625 }, + { x: 0.484375, y: 0.640625 }, + { x: 0.515625, y: 0.640625 }, + { x: 0.515625, y: 0.640625 }, + { x: 0.546875, y: 0.640625 }, + { x: 0.546875, y: 0.640625 }, + { x: 0.578125, y: 0.640625 }, + { x: 0.578125, y: 0.640625 }, + { x: 0.609375, y: 0.640625 }, + { x: 0.609375, y: 0.640625 }, + { x: 0.640625, y: 0.640625 }, + { x: 0.640625, y: 0.640625 }, + { x: 0.671875, y: 0.640625 }, + { x: 0.671875, y: 0.640625 }, + { x: 0.703125, y: 0.640625 }, + { x: 0.703125, y: 0.640625 }, + { x: 0.734375, y: 0.640625 }, + { x: 0.734375, y: 0.640625 }, + { x: 0.765625, y: 0.640625 }, + { x: 0.765625, y: 0.640625 }, + { x: 0.796875, y: 0.640625 }, + { x: 0.796875, y: 0.640625 }, + { x: 0.828125, y: 0.640625 }, + { x: 0.828125, y: 0.640625 }, + { x: 0.859375, y: 0.640625 }, + { x: 0.859375, y: 0.640625 }, + { x: 0.890625, y: 0.640625 }, + { x: 0.890625, y: 0.640625 }, + { x: 0.921875, y: 0.640625 }, + { x: 0.921875, y: 0.640625 }, + { x: 0.953125, y: 0.640625 }, + { x: 0.953125, y: 0.640625 }, + { x: 0.984375, y: 0.640625 }, + { x: 0.984375, y: 0.640625 }, + { x: 0.015625, y: 0.671875 }, + { x: 0.015625, y: 0.671875 }, + { x: 0.046875, y: 0.671875 }, + { x: 0.046875, y: 0.671875 }, + { x: 0.078125, y: 0.671875 }, + { x: 0.078125, y: 0.671875 }, + { x: 0.109375, y: 0.671875 }, + { x: 0.109375, y: 0.671875 }, + { x: 0.140625, y: 0.671875 }, + { x: 0.140625, y: 0.671875 }, + { x: 0.171875, y: 0.671875 }, + { x: 0.171875, y: 0.671875 }, + { x: 0.203125, y: 0.671875 }, + { x: 0.203125, y: 0.671875 }, + { x: 0.234375, y: 0.671875 }, + { x: 0.234375, y: 0.671875 }, + { x: 0.265625, y: 0.671875 }, + { x: 0.265625, y: 0.671875 }, + { x: 0.296875, y: 0.671875 }, + { x: 0.296875, y: 0.671875 }, + { x: 0.328125, y: 0.671875 }, + { x: 0.328125, y: 0.671875 }, + { x: 0.359375, y: 0.671875 }, + { x: 0.359375, y: 0.671875 }, + { x: 0.390625, y: 0.671875 }, + { x: 0.390625, y: 0.671875 }, + { x: 0.421875, y: 0.671875 }, + { x: 0.421875, y: 0.671875 }, + { x: 0.453125, y: 0.671875 }, + { x: 0.453125, y: 0.671875 }, + { x: 0.484375, y: 0.671875 }, + { x: 0.484375, y: 0.671875 }, + { x: 0.515625, y: 0.671875 }, + { x: 0.515625, y: 0.671875 }, + { x: 0.546875, y: 0.671875 }, + { x: 0.546875, y: 0.671875 }, + { x: 0.578125, y: 0.671875 }, + { x: 0.578125, y: 0.671875 }, + { x: 0.609375, y: 0.671875 }, + { x: 0.609375, y: 0.671875 }, + { x: 0.640625, y: 0.671875 }, + { x: 0.640625, y: 0.671875 }, + { x: 0.671875, y: 0.671875 }, + { x: 0.671875, y: 0.671875 }, + { x: 0.703125, y: 0.671875 }, + { x: 0.703125, y: 0.671875 }, + { x: 0.734375, y: 0.671875 }, + { x: 0.734375, y: 0.671875 }, + { x: 0.765625, y: 0.671875 }, + { x: 0.765625, y: 0.671875 }, + { x: 0.796875, y: 0.671875 }, + { x: 0.796875, y: 0.671875 }, + { x: 0.828125, y: 0.671875 }, + { x: 0.828125, y: 0.671875 }, + { x: 0.859375, y: 0.671875 }, + { x: 0.859375, y: 0.671875 }, + { x: 0.890625, y: 0.671875 }, + { x: 0.890625, y: 0.671875 }, + { x: 0.921875, y: 0.671875 }, + { x: 0.921875, y: 0.671875 }, + { x: 0.953125, y: 0.671875 }, + { x: 0.953125, y: 0.671875 }, + { x: 0.984375, y: 0.671875 }, + { x: 0.984375, y: 0.671875 }, + { x: 0.015625, y: 0.703125 }, + { x: 0.015625, y: 0.703125 }, + { x: 0.046875, y: 0.703125 }, + { x: 0.046875, y: 0.703125 }, + { x: 0.078125, y: 0.703125 }, + { x: 0.078125, y: 0.703125 }, + { x: 0.109375, y: 0.703125 }, + { x: 0.109375, y: 0.703125 }, + { x: 0.140625, y: 0.703125 }, + { x: 0.140625, y: 0.703125 }, + { x: 0.171875, y: 0.703125 }, + { x: 0.171875, y: 0.703125 }, + { x: 0.203125, y: 0.703125 }, + { x: 0.203125, y: 0.703125 }, + { x: 0.234375, y: 0.703125 }, + { x: 0.234375, y: 0.703125 }, + { x: 0.265625, y: 0.703125 }, + { x: 0.265625, y: 0.703125 }, + { x: 0.296875, y: 0.703125 }, + { x: 0.296875, y: 0.703125 }, + { x: 0.328125, y: 0.703125 }, + { x: 0.328125, y: 0.703125 }, + { x: 0.359375, y: 0.703125 }, + { x: 0.359375, y: 0.703125 }, + { x: 0.390625, y: 0.703125 }, + { x: 0.390625, y: 0.703125 }, + { x: 0.421875, y: 0.703125 }, + { x: 0.421875, y: 0.703125 }, + { x: 0.453125, y: 0.703125 }, + { x: 0.453125, y: 0.703125 }, + { x: 0.484375, y: 0.703125 }, + { x: 0.484375, y: 0.703125 }, + { x: 0.515625, y: 0.703125 }, + { x: 0.515625, y: 0.703125 }, + { x: 0.546875, y: 0.703125 }, + { x: 0.546875, y: 0.703125 }, + { x: 0.578125, y: 0.703125 }, + { x: 0.578125, y: 0.703125 }, + { x: 0.609375, y: 0.703125 }, + { x: 0.609375, y: 0.703125 }, + { x: 0.640625, y: 0.703125 }, + { x: 0.640625, y: 0.703125 }, + { x: 0.671875, y: 0.703125 }, + { x: 0.671875, y: 0.703125 }, + { x: 0.703125, y: 0.703125 }, + { x: 0.703125, y: 0.703125 }, + { x: 0.734375, y: 0.703125 }, + { x: 0.734375, y: 0.703125 }, + { x: 0.765625, y: 0.703125 }, + { x: 0.765625, y: 0.703125 }, + { x: 0.796875, y: 0.703125 }, + { x: 0.796875, y: 0.703125 }, + { x: 0.828125, y: 0.703125 }, + { x: 0.828125, y: 0.703125 }, + { x: 0.859375, y: 0.703125 }, + { x: 0.859375, y: 0.703125 }, + { x: 0.890625, y: 0.703125 }, + { x: 0.890625, y: 0.703125 }, + { x: 0.921875, y: 0.703125 }, + { x: 0.921875, y: 0.703125 }, + { x: 0.953125, y: 0.703125 }, + { x: 0.953125, y: 0.703125 }, + { x: 0.984375, y: 0.703125 }, + { x: 0.984375, y: 0.703125 }, + { x: 0.015625, y: 0.734375 }, + { x: 0.015625, y: 0.734375 }, + { x: 0.046875, y: 0.734375 }, + { x: 0.046875, y: 0.734375 }, + { x: 0.078125, y: 0.734375 }, + { x: 0.078125, y: 0.734375 }, + { x: 0.109375, y: 0.734375 }, + { x: 0.109375, y: 0.734375 }, + { x: 0.140625, y: 0.734375 }, + { x: 0.140625, y: 0.734375 }, + { x: 0.171875, y: 0.734375 }, + { x: 0.171875, y: 0.734375 }, + { x: 0.203125, y: 0.734375 }, + { x: 0.203125, y: 0.734375 }, + { x: 0.234375, y: 0.734375 }, + { x: 0.234375, y: 0.734375 }, + { x: 0.265625, y: 0.734375 }, + { x: 0.265625, y: 0.734375 }, + { x: 0.296875, y: 0.734375 }, + { x: 0.296875, y: 0.734375 }, + { x: 0.328125, y: 0.734375 }, + { x: 0.328125, y: 0.734375 }, + { x: 0.359375, y: 0.734375 }, + { x: 0.359375, y: 0.734375 }, + { x: 0.390625, y: 0.734375 }, + { x: 0.390625, y: 0.734375 }, + { x: 0.421875, y: 0.734375 }, + { x: 0.421875, y: 0.734375 }, + { x: 0.453125, y: 0.734375 }, + { x: 0.453125, y: 0.734375 }, + { x: 0.484375, y: 0.734375 }, + { x: 0.484375, y: 0.734375 }, + { x: 0.515625, y: 0.734375 }, + { x: 0.515625, y: 0.734375 }, + { x: 0.546875, y: 0.734375 }, + { x: 0.546875, y: 0.734375 }, + { x: 0.578125, y: 0.734375 }, + { x: 0.578125, y: 0.734375 }, + { x: 0.609375, y: 0.734375 }, + { x: 0.609375, y: 0.734375 }, + { x: 0.640625, y: 0.734375 }, + { x: 0.640625, y: 0.734375 }, + { x: 0.671875, y: 0.734375 }, + { x: 0.671875, y: 0.734375 }, + { x: 0.703125, y: 0.734375 }, + { x: 0.703125, y: 0.734375 }, + { x: 0.734375, y: 0.734375 }, + { x: 0.734375, y: 0.734375 }, + { x: 0.765625, y: 0.734375 }, + { x: 0.765625, y: 0.734375 }, + { x: 0.796875, y: 0.734375 }, + { x: 0.796875, y: 0.734375 }, + { x: 0.828125, y: 0.734375 }, + { x: 0.828125, y: 0.734375 }, + { x: 0.859375, y: 0.734375 }, + { x: 0.859375, y: 0.734375 }, + { x: 0.890625, y: 0.734375 }, + { x: 0.890625, y: 0.734375 }, + { x: 0.921875, y: 0.734375 }, + { x: 0.921875, y: 0.734375 }, + { x: 0.953125, y: 0.734375 }, + { x: 0.953125, y: 0.734375 }, + { x: 0.984375, y: 0.734375 }, + { x: 0.984375, y: 0.734375 }, + { x: 0.015625, y: 0.765625 }, + { x: 0.015625, y: 0.765625 }, + { x: 0.046875, y: 0.765625 }, + { x: 0.046875, y: 0.765625 }, + { x: 0.078125, y: 0.765625 }, + { x: 0.078125, y: 0.765625 }, + { x: 0.109375, y: 0.765625 }, + { x: 0.109375, y: 0.765625 }, + { x: 0.140625, y: 0.765625 }, + { x: 0.140625, y: 0.765625 }, + { x: 0.171875, y: 0.765625 }, + { x: 0.171875, y: 0.765625 }, + { x: 0.203125, y: 0.765625 }, + { x: 0.203125, y: 0.765625 }, + { x: 0.234375, y: 0.765625 }, + { x: 0.234375, y: 0.765625 }, + { x: 0.265625, y: 0.765625 }, + { x: 0.265625, y: 0.765625 }, + { x: 0.296875, y: 0.765625 }, + { x: 0.296875, y: 0.765625 }, + { x: 0.328125, y: 0.765625 }, + { x: 0.328125, y: 0.765625 }, + { x: 0.359375, y: 0.765625 }, + { x: 0.359375, y: 0.765625 }, + { x: 0.390625, y: 0.765625 }, + { x: 0.390625, y: 0.765625 }, + { x: 0.421875, y: 0.765625 }, + { x: 0.421875, y: 0.765625 }, + { x: 0.453125, y: 0.765625 }, + { x: 0.453125, y: 0.765625 }, + { x: 0.484375, y: 0.765625 }, + { x: 0.484375, y: 0.765625 }, + { x: 0.515625, y: 0.765625 }, + { x: 0.515625, y: 0.765625 }, + { x: 0.546875, y: 0.765625 }, + { x: 0.546875, y: 0.765625 }, + { x: 0.578125, y: 0.765625 }, + { x: 0.578125, y: 0.765625 }, + { x: 0.609375, y: 0.765625 }, + { x: 0.609375, y: 0.765625 }, + { x: 0.640625, y: 0.765625 }, + { x: 0.640625, y: 0.765625 }, + { x: 0.671875, y: 0.765625 }, + { x: 0.671875, y: 0.765625 }, + { x: 0.703125, y: 0.765625 }, + { x: 0.703125, y: 0.765625 }, + { x: 0.734375, y: 0.765625 }, + { x: 0.734375, y: 0.765625 }, + { x: 0.765625, y: 0.765625 }, + { x: 0.765625, y: 0.765625 }, + { x: 0.796875, y: 0.765625 }, + { x: 0.796875, y: 0.765625 }, + { x: 0.828125, y: 0.765625 }, + { x: 0.828125, y: 0.765625 }, + { x: 0.859375, y: 0.765625 }, + { x: 0.859375, y: 0.765625 }, + { x: 0.890625, y: 0.765625 }, + { x: 0.890625, y: 0.765625 }, + { x: 0.921875, y: 0.765625 }, + { x: 0.921875, y: 0.765625 }, + { x: 0.953125, y: 0.765625 }, + { x: 0.953125, y: 0.765625 }, + { x: 0.984375, y: 0.765625 }, + { x: 0.984375, y: 0.765625 }, + { x: 0.015625, y: 0.796875 }, + { x: 0.015625, y: 0.796875 }, + { x: 0.046875, y: 0.796875 }, + { x: 0.046875, y: 0.796875 }, + { x: 0.078125, y: 0.796875 }, + { x: 0.078125, y: 0.796875 }, + { x: 0.109375, y: 0.796875 }, + { x: 0.109375, y: 0.796875 }, + { x: 0.140625, y: 0.796875 }, + { x: 0.140625, y: 0.796875 }, + { x: 0.171875, y: 0.796875 }, + { x: 0.171875, y: 0.796875 }, + { x: 0.203125, y: 0.796875 }, + { x: 0.203125, y: 0.796875 }, + { x: 0.234375, y: 0.796875 }, + { x: 0.234375, y: 0.796875 }, + { x: 0.265625, y: 0.796875 }, + { x: 0.265625, y: 0.796875 }, + { x: 0.296875, y: 0.796875 }, + { x: 0.296875, y: 0.796875 }, + { x: 0.328125, y: 0.796875 }, + { x: 0.328125, y: 0.796875 }, + { x: 0.359375, y: 0.796875 }, + { x: 0.359375, y: 0.796875 }, + { x: 0.390625, y: 0.796875 }, + { x: 0.390625, y: 0.796875 }, + { x: 0.421875, y: 0.796875 }, + { x: 0.421875, y: 0.796875 }, + { x: 0.453125, y: 0.796875 }, + { x: 0.453125, y: 0.796875 }, + { x: 0.484375, y: 0.796875 }, + { x: 0.484375, y: 0.796875 }, + { x: 0.515625, y: 0.796875 }, + { x: 0.515625, y: 0.796875 }, + { x: 0.546875, y: 0.796875 }, + { x: 0.546875, y: 0.796875 }, + { x: 0.578125, y: 0.796875 }, + { x: 0.578125, y: 0.796875 }, + { x: 0.609375, y: 0.796875 }, + { x: 0.609375, y: 0.796875 }, + { x: 0.640625, y: 0.796875 }, + { x: 0.640625, y: 0.796875 }, + { x: 0.671875, y: 0.796875 }, + { x: 0.671875, y: 0.796875 }, + { x: 0.703125, y: 0.796875 }, + { x: 0.703125, y: 0.796875 }, + { x: 0.734375, y: 0.796875 }, + { x: 0.734375, y: 0.796875 }, + { x: 0.765625, y: 0.796875 }, + { x: 0.765625, y: 0.796875 }, + { x: 0.796875, y: 0.796875 }, + { x: 0.796875, y: 0.796875 }, + { x: 0.828125, y: 0.796875 }, + { x: 0.828125, y: 0.796875 }, + { x: 0.859375, y: 0.796875 }, + { x: 0.859375, y: 0.796875 }, + { x: 0.890625, y: 0.796875 }, + { x: 0.890625, y: 0.796875 }, + { x: 0.921875, y: 0.796875 }, + { x: 0.921875, y: 0.796875 }, + { x: 0.953125, y: 0.796875 }, + { x: 0.953125, y: 0.796875 }, + { x: 0.984375, y: 0.796875 }, + { x: 0.984375, y: 0.796875 }, + { x: 0.015625, y: 0.828125 }, + { x: 0.015625, y: 0.828125 }, + { x: 0.046875, y: 0.828125 }, + { x: 0.046875, y: 0.828125 }, + { x: 0.078125, y: 0.828125 }, + { x: 0.078125, y: 0.828125 }, + { x: 0.109375, y: 0.828125 }, + { x: 0.109375, y: 0.828125 }, + { x: 0.140625, y: 0.828125 }, + { x: 0.140625, y: 0.828125 }, + { x: 0.171875, y: 0.828125 }, + { x: 0.171875, y: 0.828125 }, + { x: 0.203125, y: 0.828125 }, + { x: 0.203125, y: 0.828125 }, + { x: 0.234375, y: 0.828125 }, + { x: 0.234375, y: 0.828125 }, + { x: 0.265625, y: 0.828125 }, + { x: 0.265625, y: 0.828125 }, + { x: 0.296875, y: 0.828125 }, + { x: 0.296875, y: 0.828125 }, + { x: 0.328125, y: 0.828125 }, + { x: 0.328125, y: 0.828125 }, + { x: 0.359375, y: 0.828125 }, + { x: 0.359375, y: 0.828125 }, + { x: 0.390625, y: 0.828125 }, + { x: 0.390625, y: 0.828125 }, + { x: 0.421875, y: 0.828125 }, + { x: 0.421875, y: 0.828125 }, + { x: 0.453125, y: 0.828125 }, + { x: 0.453125, y: 0.828125 }, + { x: 0.484375, y: 0.828125 }, + { x: 0.484375, y: 0.828125 }, + { x: 0.515625, y: 0.828125 }, + { x: 0.515625, y: 0.828125 }, + { x: 0.546875, y: 0.828125 }, + { x: 0.546875, y: 0.828125 }, + { x: 0.578125, y: 0.828125 }, + { x: 0.578125, y: 0.828125 }, + { x: 0.609375, y: 0.828125 }, + { x: 0.609375, y: 0.828125 }, + { x: 0.640625, y: 0.828125 }, + { x: 0.640625, y: 0.828125 }, + { x: 0.671875, y: 0.828125 }, + { x: 0.671875, y: 0.828125 }, + { x: 0.703125, y: 0.828125 }, + { x: 0.703125, y: 0.828125 }, + { x: 0.734375, y: 0.828125 }, + { x: 0.734375, y: 0.828125 }, + { x: 0.765625, y: 0.828125 }, + { x: 0.765625, y: 0.828125 }, + { x: 0.796875, y: 0.828125 }, + { x: 0.796875, y: 0.828125 }, + { x: 0.828125, y: 0.828125 }, + { x: 0.828125, y: 0.828125 }, + { x: 0.859375, y: 0.828125 }, + { x: 0.859375, y: 0.828125 }, + { x: 0.890625, y: 0.828125 }, + { x: 0.890625, y: 0.828125 }, + { x: 0.921875, y: 0.828125 }, + { x: 0.921875, y: 0.828125 }, + { x: 0.953125, y: 0.828125 }, + { x: 0.953125, y: 0.828125 }, + { x: 0.984375, y: 0.828125 }, + { x: 0.984375, y: 0.828125 }, + { x: 0.015625, y: 0.859375 }, + { x: 0.015625, y: 0.859375 }, + { x: 0.046875, y: 0.859375 }, + { x: 0.046875, y: 0.859375 }, + { x: 0.078125, y: 0.859375 }, + { x: 0.078125, y: 0.859375 }, + { x: 0.109375, y: 0.859375 }, + { x: 0.109375, y: 0.859375 }, + { x: 0.140625, y: 0.859375 }, + { x: 0.140625, y: 0.859375 }, + { x: 0.171875, y: 0.859375 }, + { x: 0.171875, y: 0.859375 }, + { x: 0.203125, y: 0.859375 }, + { x: 0.203125, y: 0.859375 }, + { x: 0.234375, y: 0.859375 }, + { x: 0.234375, y: 0.859375 }, + { x: 0.265625, y: 0.859375 }, + { x: 0.265625, y: 0.859375 }, + { x: 0.296875, y: 0.859375 }, + { x: 0.296875, y: 0.859375 }, + { x: 0.328125, y: 0.859375 }, + { x: 0.328125, y: 0.859375 }, + { x: 0.359375, y: 0.859375 }, + { x: 0.359375, y: 0.859375 }, + { x: 0.390625, y: 0.859375 }, + { x: 0.390625, y: 0.859375 }, + { x: 0.421875, y: 0.859375 }, + { x: 0.421875, y: 0.859375 }, + { x: 0.453125, y: 0.859375 }, + { x: 0.453125, y: 0.859375 }, + { x: 0.484375, y: 0.859375 }, + { x: 0.484375, y: 0.859375 }, + { x: 0.515625, y: 0.859375 }, + { x: 0.515625, y: 0.859375 }, + { x: 0.546875, y: 0.859375 }, + { x: 0.546875, y: 0.859375 }, + { x: 0.578125, y: 0.859375 }, + { x: 0.578125, y: 0.859375 }, + { x: 0.609375, y: 0.859375 }, + { x: 0.609375, y: 0.859375 }, + { x: 0.640625, y: 0.859375 }, + { x: 0.640625, y: 0.859375 }, + { x: 0.671875, y: 0.859375 }, + { x: 0.671875, y: 0.859375 }, + { x: 0.703125, y: 0.859375 }, + { x: 0.703125, y: 0.859375 }, + { x: 0.734375, y: 0.859375 }, + { x: 0.734375, y: 0.859375 }, + { x: 0.765625, y: 0.859375 }, + { x: 0.765625, y: 0.859375 }, + { x: 0.796875, y: 0.859375 }, + { x: 0.796875, y: 0.859375 }, + { x: 0.828125, y: 0.859375 }, + { x: 0.828125, y: 0.859375 }, + { x: 0.859375, y: 0.859375 }, + { x: 0.859375, y: 0.859375 }, + { x: 0.890625, y: 0.859375 }, + { x: 0.890625, y: 0.859375 }, + { x: 0.921875, y: 0.859375 }, + { x: 0.921875, y: 0.859375 }, + { x: 0.953125, y: 0.859375 }, + { x: 0.953125, y: 0.859375 }, + { x: 0.984375, y: 0.859375 }, + { x: 0.984375, y: 0.859375 }, + { x: 0.015625, y: 0.890625 }, + { x: 0.015625, y: 0.890625 }, + { x: 0.046875, y: 0.890625 }, + { x: 0.046875, y: 0.890625 }, + { x: 0.078125, y: 0.890625 }, + { x: 0.078125, y: 0.890625 }, + { x: 0.109375, y: 0.890625 }, + { x: 0.109375, y: 0.890625 }, + { x: 0.140625, y: 0.890625 }, + { x: 0.140625, y: 0.890625 }, + { x: 0.171875, y: 0.890625 }, + { x: 0.171875, y: 0.890625 }, + { x: 0.203125, y: 0.890625 }, + { x: 0.203125, y: 0.890625 }, + { x: 0.234375, y: 0.890625 }, + { x: 0.234375, y: 0.890625 }, + { x: 0.265625, y: 0.890625 }, + { x: 0.265625, y: 0.890625 }, + { x: 0.296875, y: 0.890625 }, + { x: 0.296875, y: 0.890625 }, + { x: 0.328125, y: 0.890625 }, + { x: 0.328125, y: 0.890625 }, + { x: 0.359375, y: 0.890625 }, + { x: 0.359375, y: 0.890625 }, + { x: 0.390625, y: 0.890625 }, + { x: 0.390625, y: 0.890625 }, + { x: 0.421875, y: 0.890625 }, + { x: 0.421875, y: 0.890625 }, + { x: 0.453125, y: 0.890625 }, + { x: 0.453125, y: 0.890625 }, + { x: 0.484375, y: 0.890625 }, + { x: 0.484375, y: 0.890625 }, + { x: 0.515625, y: 0.890625 }, + { x: 0.515625, y: 0.890625 }, + { x: 0.546875, y: 0.890625 }, + { x: 0.546875, y: 0.890625 }, + { x: 0.578125, y: 0.890625 }, + { x: 0.578125, y: 0.890625 }, + { x: 0.609375, y: 0.890625 }, + { x: 0.609375, y: 0.890625 }, + { x: 0.640625, y: 0.890625 }, + { x: 0.640625, y: 0.890625 }, + { x: 0.671875, y: 0.890625 }, + { x: 0.671875, y: 0.890625 }, + { x: 0.703125, y: 0.890625 }, + { x: 0.703125, y: 0.890625 }, + { x: 0.734375, y: 0.890625 }, + { x: 0.734375, y: 0.890625 }, + { x: 0.765625, y: 0.890625 }, + { x: 0.765625, y: 0.890625 }, + { x: 0.796875, y: 0.890625 }, + { x: 0.796875, y: 0.890625 }, + { x: 0.828125, y: 0.890625 }, + { x: 0.828125, y: 0.890625 }, + { x: 0.859375, y: 0.890625 }, + { x: 0.859375, y: 0.890625 }, + { x: 0.890625, y: 0.890625 }, + { x: 0.890625, y: 0.890625 }, + { x: 0.921875, y: 0.890625 }, + { x: 0.921875, y: 0.890625 }, + { x: 0.953125, y: 0.890625 }, + { x: 0.953125, y: 0.890625 }, + { x: 0.984375, y: 0.890625 }, + { x: 0.984375, y: 0.890625 }, + { x: 0.015625, y: 0.921875 }, + { x: 0.015625, y: 0.921875 }, + { x: 0.046875, y: 0.921875 }, + { x: 0.046875, y: 0.921875 }, + { x: 0.078125, y: 0.921875 }, + { x: 0.078125, y: 0.921875 }, + { x: 0.109375, y: 0.921875 }, + { x: 0.109375, y: 0.921875 }, + { x: 0.140625, y: 0.921875 }, + { x: 0.140625, y: 0.921875 }, + { x: 0.171875, y: 0.921875 }, + { x: 0.171875, y: 0.921875 }, + { x: 0.203125, y: 0.921875 }, + { x: 0.203125, y: 0.921875 }, + { x: 0.234375, y: 0.921875 }, + { x: 0.234375, y: 0.921875 }, + { x: 0.265625, y: 0.921875 }, + { x: 0.265625, y: 0.921875 }, + { x: 0.296875, y: 0.921875 }, + { x: 0.296875, y: 0.921875 }, + { x: 0.328125, y: 0.921875 }, + { x: 0.328125, y: 0.921875 }, + { x: 0.359375, y: 0.921875 }, + { x: 0.359375, y: 0.921875 }, + { x: 0.390625, y: 0.921875 }, + { x: 0.390625, y: 0.921875 }, + { x: 0.421875, y: 0.921875 }, + { x: 0.421875, y: 0.921875 }, + { x: 0.453125, y: 0.921875 }, + { x: 0.453125, y: 0.921875 }, + { x: 0.484375, y: 0.921875 }, + { x: 0.484375, y: 0.921875 }, + { x: 0.515625, y: 0.921875 }, + { x: 0.515625, y: 0.921875 }, + { x: 0.546875, y: 0.921875 }, + { x: 0.546875, y: 0.921875 }, + { x: 0.578125, y: 0.921875 }, + { x: 0.578125, y: 0.921875 }, + { x: 0.609375, y: 0.921875 }, + { x: 0.609375, y: 0.921875 }, + { x: 0.640625, y: 0.921875 }, + { x: 0.640625, y: 0.921875 }, + { x: 0.671875, y: 0.921875 }, + { x: 0.671875, y: 0.921875 }, + { x: 0.703125, y: 0.921875 }, + { x: 0.703125, y: 0.921875 }, + { x: 0.734375, y: 0.921875 }, + { x: 0.734375, y: 0.921875 }, + { x: 0.765625, y: 0.921875 }, + { x: 0.765625, y: 0.921875 }, + { x: 0.796875, y: 0.921875 }, + { x: 0.796875, y: 0.921875 }, + { x: 0.828125, y: 0.921875 }, + { x: 0.828125, y: 0.921875 }, + { x: 0.859375, y: 0.921875 }, + { x: 0.859375, y: 0.921875 }, + { x: 0.890625, y: 0.921875 }, + { x: 0.890625, y: 0.921875 }, + { x: 0.921875, y: 0.921875 }, + { x: 0.921875, y: 0.921875 }, + { x: 0.953125, y: 0.921875 }, + { x: 0.953125, y: 0.921875 }, + { x: 0.984375, y: 0.921875 }, + { x: 0.984375, y: 0.921875 }, + { x: 0.015625, y: 0.953125 }, + { x: 0.015625, y: 0.953125 }, + { x: 0.046875, y: 0.953125 }, + { x: 0.046875, y: 0.953125 }, + { x: 0.078125, y: 0.953125 }, + { x: 0.078125, y: 0.953125 }, + { x: 0.109375, y: 0.953125 }, + { x: 0.109375, y: 0.953125 }, + { x: 0.140625, y: 0.953125 }, + { x: 0.140625, y: 0.953125 }, + { x: 0.171875, y: 0.953125 }, + { x: 0.171875, y: 0.953125 }, + { x: 0.203125, y: 0.953125 }, + { x: 0.203125, y: 0.953125 }, + { x: 0.234375, y: 0.953125 }, + { x: 0.234375, y: 0.953125 }, + { x: 0.265625, y: 0.953125 }, + { x: 0.265625, y: 0.953125 }, + { x: 0.296875, y: 0.953125 }, + { x: 0.296875, y: 0.953125 }, + { x: 0.328125, y: 0.953125 }, + { x: 0.328125, y: 0.953125 }, + { x: 0.359375, y: 0.953125 }, + { x: 0.359375, y: 0.953125 }, + { x: 0.390625, y: 0.953125 }, + { x: 0.390625, y: 0.953125 }, + { x: 0.421875, y: 0.953125 }, + { x: 0.421875, y: 0.953125 }, + { x: 0.453125, y: 0.953125 }, + { x: 0.453125, y: 0.953125 }, + { x: 0.484375, y: 0.953125 }, + { x: 0.484375, y: 0.953125 }, + { x: 0.515625, y: 0.953125 }, + { x: 0.515625, y: 0.953125 }, + { x: 0.546875, y: 0.953125 }, + { x: 0.546875, y: 0.953125 }, + { x: 0.578125, y: 0.953125 }, + { x: 0.578125, y: 0.953125 }, + { x: 0.609375, y: 0.953125 }, + { x: 0.609375, y: 0.953125 }, + { x: 0.640625, y: 0.953125 }, + { x: 0.640625, y: 0.953125 }, + { x: 0.671875, y: 0.953125 }, + { x: 0.671875, y: 0.953125 }, + { x: 0.703125, y: 0.953125 }, + { x: 0.703125, y: 0.953125 }, + { x: 0.734375, y: 0.953125 }, + { x: 0.734375, y: 0.953125 }, + { x: 0.765625, y: 0.953125 }, + { x: 0.765625, y: 0.953125 }, + { x: 0.796875, y: 0.953125 }, + { x: 0.796875, y: 0.953125 }, + { x: 0.828125, y: 0.953125 }, + { x: 0.828125, y: 0.953125 }, + { x: 0.859375, y: 0.953125 }, + { x: 0.859375, y: 0.953125 }, + { x: 0.890625, y: 0.953125 }, + { x: 0.890625, y: 0.953125 }, + { x: 0.921875, y: 0.953125 }, + { x: 0.921875, y: 0.953125 }, + { x: 0.953125, y: 0.953125 }, + { x: 0.953125, y: 0.953125 }, + { x: 0.984375, y: 0.953125 }, + { x: 0.984375, y: 0.953125 }, + { x: 0.015625, y: 0.984375 }, + { x: 0.015625, y: 0.984375 }, + { x: 0.046875, y: 0.984375 }, + { x: 0.046875, y: 0.984375 }, + { x: 0.078125, y: 0.984375 }, + { x: 0.078125, y: 0.984375 }, + { x: 0.109375, y: 0.984375 }, + { x: 0.109375, y: 0.984375 }, + { x: 0.140625, y: 0.984375 }, + { x: 0.140625, y: 0.984375 }, + { x: 0.171875, y: 0.984375 }, + { x: 0.171875, y: 0.984375 }, + { x: 0.203125, y: 0.984375 }, + { x: 0.203125, y: 0.984375 }, + { x: 0.234375, y: 0.984375 }, + { x: 0.234375, y: 0.984375 }, + { x: 0.265625, y: 0.984375 }, + { x: 0.265625, y: 0.984375 }, + { x: 0.296875, y: 0.984375 }, + { x: 0.296875, y: 0.984375 }, + { x: 0.328125, y: 0.984375 }, + { x: 0.328125, y: 0.984375 }, + { x: 0.359375, y: 0.984375 }, + { x: 0.359375, y: 0.984375 }, + { x: 0.390625, y: 0.984375 }, + { x: 0.390625, y: 0.984375 }, + { x: 0.421875, y: 0.984375 }, + { x: 0.421875, y: 0.984375 }, + { x: 0.453125, y: 0.984375 }, + { x: 0.453125, y: 0.984375 }, + { x: 0.484375, y: 0.984375 }, + { x: 0.484375, y: 0.984375 }, + { x: 0.515625, y: 0.984375 }, + { x: 0.515625, y: 0.984375 }, + { x: 0.546875, y: 0.984375 }, + { x: 0.546875, y: 0.984375 }, + { x: 0.578125, y: 0.984375 }, + { x: 0.578125, y: 0.984375 }, + { x: 0.609375, y: 0.984375 }, + { x: 0.609375, y: 0.984375 }, + { x: 0.640625, y: 0.984375 }, + { x: 0.640625, y: 0.984375 }, + { x: 0.671875, y: 0.984375 }, + { x: 0.671875, y: 0.984375 }, + { x: 0.703125, y: 0.984375 }, + { x: 0.703125, y: 0.984375 }, + { x: 0.734375, y: 0.984375 }, + { x: 0.734375, y: 0.984375 }, + { x: 0.765625, y: 0.984375 }, + { x: 0.765625, y: 0.984375 }, + { x: 0.796875, y: 0.984375 }, + { x: 0.796875, y: 0.984375 }, + { x: 0.828125, y: 0.984375 }, + { x: 0.828125, y: 0.984375 }, + { x: 0.859375, y: 0.984375 }, + { x: 0.859375, y: 0.984375 }, + { x: 0.890625, y: 0.984375 }, + { x: 0.890625, y: 0.984375 }, + { x: 0.921875, y: 0.984375 }, + { x: 0.921875, y: 0.984375 }, + { x: 0.953125, y: 0.984375 }, + { x: 0.953125, y: 0.984375 }, + { x: 0.984375, y: 0.984375 }, + { x: 0.984375, y: 0.984375 }, + { x: 0.03125, y: 0.03125 }, + { x: 0.03125, y: 0.03125 }, + { x: 0.09375, y: 0.03125 }, + { x: 0.09375, y: 0.03125 }, + { x: 0.15625, y: 0.03125 }, + { x: 0.15625, y: 0.03125 }, + { x: 0.21875, y: 0.03125 }, + { x: 0.21875, y: 0.03125 }, + { x: 0.28125, y: 0.03125 }, + { x: 0.28125, y: 0.03125 }, + { x: 0.34375, y: 0.03125 }, + { x: 0.34375, y: 0.03125 }, + { x: 0.40625, y: 0.03125 }, + { x: 0.40625, y: 0.03125 }, + { x: 0.46875, y: 0.03125 }, + { x: 0.46875, y: 0.03125 }, + { x: 0.53125, y: 0.03125 }, + { x: 0.53125, y: 0.03125 }, + { x: 0.59375, y: 0.03125 }, + { x: 0.59375, y: 0.03125 }, + { x: 0.65625, y: 0.03125 }, + { x: 0.65625, y: 0.03125 }, + { x: 0.71875, y: 0.03125 }, + { x: 0.71875, y: 0.03125 }, + { x: 0.78125, y: 0.03125 }, + { x: 0.78125, y: 0.03125 }, + { x: 0.84375, y: 0.03125 }, + { x: 0.84375, y: 0.03125 }, + { x: 0.90625, y: 0.03125 }, + { x: 0.90625, y: 0.03125 }, + { x: 0.96875, y: 0.03125 }, + { x: 0.96875, y: 0.03125 }, + { x: 0.03125, y: 0.09375 }, + { x: 0.03125, y: 0.09375 }, + { x: 0.09375, y: 0.09375 }, + { x: 0.09375, y: 0.09375 }, + { x: 0.15625, y: 0.09375 }, + { x: 0.15625, y: 0.09375 }, + { x: 0.21875, y: 0.09375 }, + { x: 0.21875, y: 0.09375 }, + { x: 0.28125, y: 0.09375 }, + { x: 0.28125, y: 0.09375 }, + { x: 0.34375, y: 0.09375 }, + { x: 0.34375, y: 0.09375 }, + { x: 0.40625, y: 0.09375 }, + { x: 0.40625, y: 0.09375 }, + { x: 0.46875, y: 0.09375 }, + { x: 0.46875, y: 0.09375 }, + { x: 0.53125, y: 0.09375 }, + { x: 0.53125, y: 0.09375 }, + { x: 0.59375, y: 0.09375 }, + { x: 0.59375, y: 0.09375 }, + { x: 0.65625, y: 0.09375 }, + { x: 0.65625, y: 0.09375 }, + { x: 0.71875, y: 0.09375 }, + { x: 0.71875, y: 0.09375 }, + { x: 0.78125, y: 0.09375 }, + { x: 0.78125, y: 0.09375 }, + { x: 0.84375, y: 0.09375 }, + { x: 0.84375, y: 0.09375 }, + { x: 0.90625, y: 0.09375 }, + { x: 0.90625, y: 0.09375 }, + { x: 0.96875, y: 0.09375 }, + { x: 0.96875, y: 0.09375 }, + { x: 0.03125, y: 0.15625 }, + { x: 0.03125, y: 0.15625 }, + { x: 0.09375, y: 0.15625 }, + { x: 0.09375, y: 0.15625 }, + { x: 0.15625, y: 0.15625 }, + { x: 0.15625, y: 0.15625 }, + { x: 0.21875, y: 0.15625 }, + { x: 0.21875, y: 0.15625 }, + { x: 0.28125, y: 0.15625 }, + { x: 0.28125, y: 0.15625 }, + { x: 0.34375, y: 0.15625 }, + { x: 0.34375, y: 0.15625 }, + { x: 0.40625, y: 0.15625 }, + { x: 0.40625, y: 0.15625 }, + { x: 0.46875, y: 0.15625 }, + { x: 0.46875, y: 0.15625 }, + { x: 0.53125, y: 0.15625 }, + { x: 0.53125, y: 0.15625 }, + { x: 0.59375, y: 0.15625 }, + { x: 0.59375, y: 0.15625 }, + { x: 0.65625, y: 0.15625 }, + { x: 0.65625, y: 0.15625 }, + { x: 0.71875, y: 0.15625 }, + { x: 0.71875, y: 0.15625 }, + { x: 0.78125, y: 0.15625 }, + { x: 0.78125, y: 0.15625 }, + { x: 0.84375, y: 0.15625 }, + { x: 0.84375, y: 0.15625 }, + { x: 0.90625, y: 0.15625 }, + { x: 0.90625, y: 0.15625 }, + { x: 0.96875, y: 0.15625 }, + { x: 0.96875, y: 0.15625 }, + { x: 0.03125, y: 0.21875 }, + { x: 0.03125, y: 0.21875 }, + { x: 0.09375, y: 0.21875 }, + { x: 0.09375, y: 0.21875 }, + { x: 0.15625, y: 0.21875 }, + { x: 0.15625, y: 0.21875 }, + { x: 0.21875, y: 0.21875 }, + { x: 0.21875, y: 0.21875 }, + { x: 0.28125, y: 0.21875 }, + { x: 0.28125, y: 0.21875 }, + { x: 0.34375, y: 0.21875 }, + { x: 0.34375, y: 0.21875 }, + { x: 0.40625, y: 0.21875 }, + { x: 0.40625, y: 0.21875 }, + { x: 0.46875, y: 0.21875 }, + { x: 0.46875, y: 0.21875 }, + { x: 0.53125, y: 0.21875 }, + { x: 0.53125, y: 0.21875 }, + { x: 0.59375, y: 0.21875 }, + { x: 0.59375, y: 0.21875 }, + { x: 0.65625, y: 0.21875 }, + { x: 0.65625, y: 0.21875 }, + { x: 0.71875, y: 0.21875 }, + { x: 0.71875, y: 0.21875 }, + { x: 0.78125, y: 0.21875 }, + { x: 0.78125, y: 0.21875 }, + { x: 0.84375, y: 0.21875 }, + { x: 0.84375, y: 0.21875 }, + { x: 0.90625, y: 0.21875 }, + { x: 0.90625, y: 0.21875 }, + { x: 0.96875, y: 0.21875 }, + { x: 0.96875, y: 0.21875 }, + { x: 0.03125, y: 0.28125 }, + { x: 0.03125, y: 0.28125 }, + { x: 0.09375, y: 0.28125 }, + { x: 0.09375, y: 0.28125 }, + { x: 0.15625, y: 0.28125 }, + { x: 0.15625, y: 0.28125 }, + { x: 0.21875, y: 0.28125 }, + { x: 0.21875, y: 0.28125 }, + { x: 0.28125, y: 0.28125 }, + { x: 0.28125, y: 0.28125 }, + { x: 0.34375, y: 0.28125 }, + { x: 0.34375, y: 0.28125 }, + { x: 0.40625, y: 0.28125 }, + { x: 0.40625, y: 0.28125 }, + { x: 0.46875, y: 0.28125 }, + { x: 0.46875, y: 0.28125 }, + { x: 0.53125, y: 0.28125 }, + { x: 0.53125, y: 0.28125 }, + { x: 0.59375, y: 0.28125 }, + { x: 0.59375, y: 0.28125 }, + { x: 0.65625, y: 0.28125 }, + { x: 0.65625, y: 0.28125 }, + { x: 0.71875, y: 0.28125 }, + { x: 0.71875, y: 0.28125 }, + { x: 0.78125, y: 0.28125 }, + { x: 0.78125, y: 0.28125 }, + { x: 0.84375, y: 0.28125 }, + { x: 0.84375, y: 0.28125 }, + { x: 0.90625, y: 0.28125 }, + { x: 0.90625, y: 0.28125 }, + { x: 0.96875, y: 0.28125 }, + { x: 0.96875, y: 0.28125 }, + { x: 0.03125, y: 0.34375 }, + { x: 0.03125, y: 0.34375 }, + { x: 0.09375, y: 0.34375 }, + { x: 0.09375, y: 0.34375 }, + { x: 0.15625, y: 0.34375 }, + { x: 0.15625, y: 0.34375 }, + { x: 0.21875, y: 0.34375 }, + { x: 0.21875, y: 0.34375 }, + { x: 0.28125, y: 0.34375 }, + { x: 0.28125, y: 0.34375 }, + { x: 0.34375, y: 0.34375 }, + { x: 0.34375, y: 0.34375 }, + { x: 0.40625, y: 0.34375 }, + { x: 0.40625, y: 0.34375 }, + { x: 0.46875, y: 0.34375 }, + { x: 0.46875, y: 0.34375 }, + { x: 0.53125, y: 0.34375 }, + { x: 0.53125, y: 0.34375 }, + { x: 0.59375, y: 0.34375 }, + { x: 0.59375, y: 0.34375 }, + { x: 0.65625, y: 0.34375 }, + { x: 0.65625, y: 0.34375 }, + { x: 0.71875, y: 0.34375 }, + { x: 0.71875, y: 0.34375 }, + { x: 0.78125, y: 0.34375 }, + { x: 0.78125, y: 0.34375 }, + { x: 0.84375, y: 0.34375 }, + { x: 0.84375, y: 0.34375 }, + { x: 0.90625, y: 0.34375 }, + { x: 0.90625, y: 0.34375 }, + { x: 0.96875, y: 0.34375 }, + { x: 0.96875, y: 0.34375 }, + { x: 0.03125, y: 0.40625 }, + { x: 0.03125, y: 0.40625 }, + { x: 0.09375, y: 0.40625 }, + { x: 0.09375, y: 0.40625 }, + { x: 0.15625, y: 0.40625 }, + { x: 0.15625, y: 0.40625 }, + { x: 0.21875, y: 0.40625 }, + { x: 0.21875, y: 0.40625 }, + { x: 0.28125, y: 0.40625 }, + { x: 0.28125, y: 0.40625 }, + { x: 0.34375, y: 0.40625 }, + { x: 0.34375, y: 0.40625 }, + { x: 0.40625, y: 0.40625 }, + { x: 0.40625, y: 0.40625 }, + { x: 0.46875, y: 0.40625 }, + { x: 0.46875, y: 0.40625 }, + { x: 0.53125, y: 0.40625 }, + { x: 0.53125, y: 0.40625 }, + { x: 0.59375, y: 0.40625 }, + { x: 0.59375, y: 0.40625 }, + { x: 0.65625, y: 0.40625 }, + { x: 0.65625, y: 0.40625 }, + { x: 0.71875, y: 0.40625 }, + { x: 0.71875, y: 0.40625 }, + { x: 0.78125, y: 0.40625 }, + { x: 0.78125, y: 0.40625 }, + { x: 0.84375, y: 0.40625 }, + { x: 0.84375, y: 0.40625 }, + { x: 0.90625, y: 0.40625 }, + { x: 0.90625, y: 0.40625 }, + { x: 0.96875, y: 0.40625 }, + { x: 0.96875, y: 0.40625 }, + { x: 0.03125, y: 0.46875 }, + { x: 0.03125, y: 0.46875 }, + { x: 0.09375, y: 0.46875 }, + { x: 0.09375, y: 0.46875 }, + { x: 0.15625, y: 0.46875 }, + { x: 0.15625, y: 0.46875 }, + { x: 0.21875, y: 0.46875 }, + { x: 0.21875, y: 0.46875 }, + { x: 0.28125, y: 0.46875 }, + { x: 0.28125, y: 0.46875 }, + { x: 0.34375, y: 0.46875 }, + { x: 0.34375, y: 0.46875 }, + { x: 0.40625, y: 0.46875 }, + { x: 0.40625, y: 0.46875 }, + { x: 0.46875, y: 0.46875 }, + { x: 0.46875, y: 0.46875 }, + { x: 0.53125, y: 0.46875 }, + { x: 0.53125, y: 0.46875 }, + { x: 0.59375, y: 0.46875 }, + { x: 0.59375, y: 0.46875 }, + { x: 0.65625, y: 0.46875 }, + { x: 0.65625, y: 0.46875 }, + { x: 0.71875, y: 0.46875 }, + { x: 0.71875, y: 0.46875 }, + { x: 0.78125, y: 0.46875 }, + { x: 0.78125, y: 0.46875 }, + { x: 0.84375, y: 0.46875 }, + { x: 0.84375, y: 0.46875 }, + { x: 0.90625, y: 0.46875 }, + { x: 0.90625, y: 0.46875 }, + { x: 0.96875, y: 0.46875 }, + { x: 0.96875, y: 0.46875 }, + { x: 0.03125, y: 0.53125 }, + { x: 0.03125, y: 0.53125 }, + { x: 0.09375, y: 0.53125 }, + { x: 0.09375, y: 0.53125 }, + { x: 0.15625, y: 0.53125 }, + { x: 0.15625, y: 0.53125 }, + { x: 0.21875, y: 0.53125 }, + { x: 0.21875, y: 0.53125 }, + { x: 0.28125, y: 0.53125 }, + { x: 0.28125, y: 0.53125 }, + { x: 0.34375, y: 0.53125 }, + { x: 0.34375, y: 0.53125 }, + { x: 0.40625, y: 0.53125 }, + { x: 0.40625, y: 0.53125 }, + { x: 0.46875, y: 0.53125 }, + { x: 0.46875, y: 0.53125 }, + { x: 0.53125, y: 0.53125 }, + { x: 0.53125, y: 0.53125 }, + { x: 0.59375, y: 0.53125 }, + { x: 0.59375, y: 0.53125 }, + { x: 0.65625, y: 0.53125 }, + { x: 0.65625, y: 0.53125 }, + { x: 0.71875, y: 0.53125 }, + { x: 0.71875, y: 0.53125 }, + { x: 0.78125, y: 0.53125 }, + { x: 0.78125, y: 0.53125 }, + { x: 0.84375, y: 0.53125 }, + { x: 0.84375, y: 0.53125 }, + { x: 0.90625, y: 0.53125 }, + { x: 0.90625, y: 0.53125 }, + { x: 0.96875, y: 0.53125 }, + { x: 0.96875, y: 0.53125 }, + { x: 0.03125, y: 0.59375 }, + { x: 0.03125, y: 0.59375 }, + { x: 0.09375, y: 0.59375 }, + { x: 0.09375, y: 0.59375 }, + { x: 0.15625, y: 0.59375 }, + { x: 0.15625, y: 0.59375 }, + { x: 0.21875, y: 0.59375 }, + { x: 0.21875, y: 0.59375 }, + { x: 0.28125, y: 0.59375 }, + { x: 0.28125, y: 0.59375 }, + { x: 0.34375, y: 0.59375 }, + { x: 0.34375, y: 0.59375 }, + { x: 0.40625, y: 0.59375 }, + { x: 0.40625, y: 0.59375 }, + { x: 0.46875, y: 0.59375 }, + { x: 0.46875, y: 0.59375 }, + { x: 0.53125, y: 0.59375 }, + { x: 0.53125, y: 0.59375 }, + { x: 0.59375, y: 0.59375 }, + { x: 0.59375, y: 0.59375 }, + { x: 0.65625, y: 0.59375 }, + { x: 0.65625, y: 0.59375 }, + { x: 0.71875, y: 0.59375 }, + { x: 0.71875, y: 0.59375 }, + { x: 0.78125, y: 0.59375 }, + { x: 0.78125, y: 0.59375 }, + { x: 0.84375, y: 0.59375 }, + { x: 0.84375, y: 0.59375 }, + { x: 0.90625, y: 0.59375 }, + { x: 0.90625, y: 0.59375 }, + { x: 0.96875, y: 0.59375 }, + { x: 0.96875, y: 0.59375 }, + { x: 0.03125, y: 0.65625 }, + { x: 0.03125, y: 0.65625 }, + { x: 0.09375, y: 0.65625 }, + { x: 0.09375, y: 0.65625 }, + { x: 0.15625, y: 0.65625 }, + { x: 0.15625, y: 0.65625 }, + { x: 0.21875, y: 0.65625 }, + { x: 0.21875, y: 0.65625 }, + { x: 0.28125, y: 0.65625 }, + { x: 0.28125, y: 0.65625 }, + { x: 0.34375, y: 0.65625 }, + { x: 0.34375, y: 0.65625 }, + { x: 0.40625, y: 0.65625 }, + { x: 0.40625, y: 0.65625 }, + { x: 0.46875, y: 0.65625 }, + { x: 0.46875, y: 0.65625 }, + { x: 0.53125, y: 0.65625 }, + { x: 0.53125, y: 0.65625 }, + { x: 0.59375, y: 0.65625 }, + { x: 0.59375, y: 0.65625 }, + { x: 0.65625, y: 0.65625 }, + { x: 0.65625, y: 0.65625 }, + { x: 0.71875, y: 0.65625 }, + { x: 0.71875, y: 0.65625 }, + { x: 0.78125, y: 0.65625 }, + { x: 0.78125, y: 0.65625 }, + { x: 0.84375, y: 0.65625 }, + { x: 0.84375, y: 0.65625 }, + { x: 0.90625, y: 0.65625 }, + { x: 0.90625, y: 0.65625 }, + { x: 0.96875, y: 0.65625 }, + { x: 0.96875, y: 0.65625 }, + { x: 0.03125, y: 0.71875 }, + { x: 0.03125, y: 0.71875 }, + { x: 0.09375, y: 0.71875 }, + { x: 0.09375, y: 0.71875 }, + { x: 0.15625, y: 0.71875 }, + { x: 0.15625, y: 0.71875 }, + { x: 0.21875, y: 0.71875 }, + { x: 0.21875, y: 0.71875 }, + { x: 0.28125, y: 0.71875 }, + { x: 0.28125, y: 0.71875 }, + { x: 0.34375, y: 0.71875 }, + { x: 0.34375, y: 0.71875 }, + { x: 0.40625, y: 0.71875 }, + { x: 0.40625, y: 0.71875 }, + { x: 0.46875, y: 0.71875 }, + { x: 0.46875, y: 0.71875 }, + { x: 0.53125, y: 0.71875 }, + { x: 0.53125, y: 0.71875 }, + { x: 0.59375, y: 0.71875 }, + { x: 0.59375, y: 0.71875 }, + { x: 0.65625, y: 0.71875 }, + { x: 0.65625, y: 0.71875 }, + { x: 0.71875, y: 0.71875 }, + { x: 0.71875, y: 0.71875 }, + { x: 0.78125, y: 0.71875 }, + { x: 0.78125, y: 0.71875 }, + { x: 0.84375, y: 0.71875 }, + { x: 0.84375, y: 0.71875 }, + { x: 0.90625, y: 0.71875 }, + { x: 0.90625, y: 0.71875 }, + { x: 0.96875, y: 0.71875 }, + { x: 0.96875, y: 0.71875 }, + { x: 0.03125, y: 0.78125 }, + { x: 0.03125, y: 0.78125 }, + { x: 0.09375, y: 0.78125 }, + { x: 0.09375, y: 0.78125 }, + { x: 0.15625, y: 0.78125 }, + { x: 0.15625, y: 0.78125 }, + { x: 0.21875, y: 0.78125 }, + { x: 0.21875, y: 0.78125 }, + { x: 0.28125, y: 0.78125 }, + { x: 0.28125, y: 0.78125 }, + { x: 0.34375, y: 0.78125 }, + { x: 0.34375, y: 0.78125 }, + { x: 0.40625, y: 0.78125 }, + { x: 0.40625, y: 0.78125 }, + { x: 0.46875, y: 0.78125 }, + { x: 0.46875, y: 0.78125 }, + { x: 0.53125, y: 0.78125 }, + { x: 0.53125, y: 0.78125 }, + { x: 0.59375, y: 0.78125 }, + { x: 0.59375, y: 0.78125 }, + { x: 0.65625, y: 0.78125 }, + { x: 0.65625, y: 0.78125 }, + { x: 0.71875, y: 0.78125 }, + { x: 0.71875, y: 0.78125 }, + { x: 0.78125, y: 0.78125 }, + { x: 0.78125, y: 0.78125 }, + { x: 0.84375, y: 0.78125 }, + { x: 0.84375, y: 0.78125 }, + { x: 0.90625, y: 0.78125 }, + { x: 0.90625, y: 0.78125 }, + { x: 0.96875, y: 0.78125 }, + { x: 0.96875, y: 0.78125 }, + { x: 0.03125, y: 0.84375 }, + { x: 0.03125, y: 0.84375 }, + { x: 0.09375, y: 0.84375 }, + { x: 0.09375, y: 0.84375 }, + { x: 0.15625, y: 0.84375 }, + { x: 0.15625, y: 0.84375 }, + { x: 0.21875, y: 0.84375 }, + { x: 0.21875, y: 0.84375 }, + { x: 0.28125, y: 0.84375 }, + { x: 0.28125, y: 0.84375 }, + { x: 0.34375, y: 0.84375 }, + { x: 0.34375, y: 0.84375 }, + { x: 0.40625, y: 0.84375 }, + { x: 0.40625, y: 0.84375 }, + { x: 0.46875, y: 0.84375 }, + { x: 0.46875, y: 0.84375 }, + { x: 0.53125, y: 0.84375 }, + { x: 0.53125, y: 0.84375 }, + { x: 0.59375, y: 0.84375 }, + { x: 0.59375, y: 0.84375 }, + { x: 0.65625, y: 0.84375 }, + { x: 0.65625, y: 0.84375 }, + { x: 0.71875, y: 0.84375 }, + { x: 0.71875, y: 0.84375 }, + { x: 0.78125, y: 0.84375 }, + { x: 0.78125, y: 0.84375 }, + { x: 0.84375, y: 0.84375 }, + { x: 0.84375, y: 0.84375 }, + { x: 0.90625, y: 0.84375 }, + { x: 0.90625, y: 0.84375 }, + { x: 0.96875, y: 0.84375 }, + { x: 0.96875, y: 0.84375 }, + { x: 0.03125, y: 0.90625 }, + { x: 0.03125, y: 0.90625 }, + { x: 0.09375, y: 0.90625 }, + { x: 0.09375, y: 0.90625 }, + { x: 0.15625, y: 0.90625 }, + { x: 0.15625, y: 0.90625 }, + { x: 0.21875, y: 0.90625 }, + { x: 0.21875, y: 0.90625 }, + { x: 0.28125, y: 0.90625 }, + { x: 0.28125, y: 0.90625 }, + { x: 0.34375, y: 0.90625 }, + { x: 0.34375, y: 0.90625 }, + { x: 0.40625, y: 0.90625 }, + { x: 0.40625, y: 0.90625 }, + { x: 0.46875, y: 0.90625 }, + { x: 0.46875, y: 0.90625 }, + { x: 0.53125, y: 0.90625 }, + { x: 0.53125, y: 0.90625 }, + { x: 0.59375, y: 0.90625 }, + { x: 0.59375, y: 0.90625 }, + { x: 0.65625, y: 0.90625 }, + { x: 0.65625, y: 0.90625 }, + { x: 0.71875, y: 0.90625 }, + { x: 0.71875, y: 0.90625 }, + { x: 0.78125, y: 0.90625 }, + { x: 0.78125, y: 0.90625 }, + { x: 0.84375, y: 0.90625 }, + { x: 0.84375, y: 0.90625 }, + { x: 0.90625, y: 0.90625 }, + { x: 0.90625, y: 0.90625 }, + { x: 0.96875, y: 0.90625 }, + { x: 0.96875, y: 0.90625 }, + { x: 0.03125, y: 0.96875 }, + { x: 0.03125, y: 0.96875 }, + { x: 0.09375, y: 0.96875 }, + { x: 0.09375, y: 0.96875 }, + { x: 0.15625, y: 0.96875 }, + { x: 0.15625, y: 0.96875 }, + { x: 0.21875, y: 0.96875 }, + { x: 0.21875, y: 0.96875 }, + { x: 0.28125, y: 0.96875 }, + { x: 0.28125, y: 0.96875 }, + { x: 0.34375, y: 0.96875 }, + { x: 0.34375, y: 0.96875 }, + { x: 0.40625, y: 0.96875 }, + { x: 0.40625, y: 0.96875 }, + { x: 0.46875, y: 0.96875 }, + { x: 0.46875, y: 0.96875 }, + { x: 0.53125, y: 0.96875 }, + { x: 0.53125, y: 0.96875 }, + { x: 0.59375, y: 0.96875 }, + { x: 0.59375, y: 0.96875 }, + { x: 0.65625, y: 0.96875 }, + { x: 0.65625, y: 0.96875 }, + { x: 0.71875, y: 0.96875 }, + { x: 0.71875, y: 0.96875 }, + { x: 0.78125, y: 0.96875 }, + { x: 0.78125, y: 0.96875 }, + { x: 0.84375, y: 0.96875 }, + { x: 0.84375, y: 0.96875 }, + { x: 0.90625, y: 0.96875 }, + { x: 0.90625, y: 0.96875 }, + { x: 0.96875, y: 0.96875 }, + { x: 0.96875, y: 0.96875 }, + { x: 0.0625, y: 0.0625 }, + { x: 0.0625, y: 0.0625 }, + { x: 0.0625, y: 0.0625 }, + { x: 0.0625, y: 0.0625 }, + { x: 0.0625, y: 0.0625 }, + { x: 0.0625, y: 0.0625 }, + { x: 0.1875, y: 0.0625 }, + { x: 0.1875, y: 0.0625 }, + { x: 0.1875, y: 0.0625 }, + { x: 0.1875, y: 0.0625 }, + { x: 0.1875, y: 0.0625 }, + { x: 0.1875, y: 0.0625 }, + { x: 0.3125, y: 0.0625 }, + { x: 0.3125, y: 0.0625 }, + { x: 0.3125, y: 0.0625 }, + { x: 0.3125, y: 0.0625 }, + { x: 0.3125, y: 0.0625 }, + { x: 0.3125, y: 0.0625 }, + { x: 0.4375, y: 0.0625 }, + { x: 0.4375, y: 0.0625 }, + { x: 0.4375, y: 0.0625 }, + { x: 0.4375, y: 0.0625 }, + { x: 0.4375, y: 0.0625 }, + { x: 0.4375, y: 0.0625 }, + { x: 0.5625, y: 0.0625 }, + { x: 0.5625, y: 0.0625 }, + { x: 0.5625, y: 0.0625 }, + { x: 0.5625, y: 0.0625 }, + { x: 0.5625, y: 0.0625 }, + { x: 0.5625, y: 0.0625 }, + { x: 0.6875, y: 0.0625 }, + { x: 0.6875, y: 0.0625 }, + { x: 0.6875, y: 0.0625 }, + { x: 0.6875, y: 0.0625 }, + { x: 0.6875, y: 0.0625 }, + { x: 0.6875, y: 0.0625 }, + { x: 0.8125, y: 0.0625 }, + { x: 0.8125, y: 0.0625 }, + { x: 0.8125, y: 0.0625 }, + { x: 0.8125, y: 0.0625 }, + { x: 0.8125, y: 0.0625 }, + { x: 0.8125, y: 0.0625 }, + { x: 0.9375, y: 0.0625 }, + { x: 0.9375, y: 0.0625 }, + { x: 0.9375, y: 0.0625 }, + { x: 0.9375, y: 0.0625 }, + { x: 0.9375, y: 0.0625 }, + { x: 0.9375, y: 0.0625 }, + { x: 0.0625, y: 0.1875 }, + { x: 0.0625, y: 0.1875 }, + { x: 0.0625, y: 0.1875 }, + { x: 0.0625, y: 0.1875 }, + { x: 0.0625, y: 0.1875 }, + { x: 0.0625, y: 0.1875 }, + { x: 0.1875, y: 0.1875 }, + { x: 0.1875, y: 0.1875 }, + { x: 0.1875, y: 0.1875 }, + { x: 0.1875, y: 0.1875 }, + { x: 0.1875, y: 0.1875 }, + { x: 0.1875, y: 0.1875 }, + { x: 0.3125, y: 0.1875 }, + { x: 0.3125, y: 0.1875 }, + { x: 0.3125, y: 0.1875 }, + { x: 0.3125, y: 0.1875 }, + { x: 0.3125, y: 0.1875 }, + { x: 0.3125, y: 0.1875 }, + { x: 0.4375, y: 0.1875 }, + { x: 0.4375, y: 0.1875 }, + { x: 0.4375, y: 0.1875 }, + { x: 0.4375, y: 0.1875 }, + { x: 0.4375, y: 0.1875 }, + { x: 0.4375, y: 0.1875 }, + { x: 0.5625, y: 0.1875 }, + { x: 0.5625, y: 0.1875 }, + { x: 0.5625, y: 0.1875 }, + { x: 0.5625, y: 0.1875 }, + { x: 0.5625, y: 0.1875 }, + { x: 0.5625, y: 0.1875 }, + { x: 0.6875, y: 0.1875 }, + { x: 0.6875, y: 0.1875 }, + { x: 0.6875, y: 0.1875 }, + { x: 0.6875, y: 0.1875 }, + { x: 0.6875, y: 0.1875 }, + { x: 0.6875, y: 0.1875 }, + { x: 0.8125, y: 0.1875 }, + { x: 0.8125, y: 0.1875 }, + { x: 0.8125, y: 0.1875 }, + { x: 0.8125, y: 0.1875 }, + { x: 0.8125, y: 0.1875 }, + { x: 0.8125, y: 0.1875 }, + { x: 0.9375, y: 0.1875 }, + { x: 0.9375, y: 0.1875 }, + { x: 0.9375, y: 0.1875 }, + { x: 0.9375, y: 0.1875 }, + { x: 0.9375, y: 0.1875 }, + { x: 0.9375, y: 0.1875 }, + { x: 0.0625, y: 0.3125 }, + { x: 0.0625, y: 0.3125 }, + { x: 0.0625, y: 0.3125 }, + { x: 0.0625, y: 0.3125 }, + { x: 0.0625, y: 0.3125 }, + { x: 0.0625, y: 0.3125 }, + { x: 0.1875, y: 0.3125 }, + { x: 0.1875, y: 0.3125 }, + { x: 0.1875, y: 0.3125 }, + { x: 0.1875, y: 0.3125 }, + { x: 0.1875, y: 0.3125 }, + { x: 0.1875, y: 0.3125 }, + { x: 0.3125, y: 0.3125 }, + { x: 0.3125, y: 0.3125 }, + { x: 0.3125, y: 0.3125 }, + { x: 0.3125, y: 0.3125 }, + { x: 0.3125, y: 0.3125 }, + { x: 0.3125, y: 0.3125 }, + { x: 0.4375, y: 0.3125 }, + { x: 0.4375, y: 0.3125 }, + { x: 0.4375, y: 0.3125 }, + { x: 0.4375, y: 0.3125 }, + { x: 0.4375, y: 0.3125 }, + { x: 0.4375, y: 0.3125 }, + { x: 0.5625, y: 0.3125 }, + { x: 0.5625, y: 0.3125 }, + { x: 0.5625, y: 0.3125 }, + { x: 0.5625, y: 0.3125 }, + { x: 0.5625, y: 0.3125 }, + { x: 0.5625, y: 0.3125 }, + { x: 0.6875, y: 0.3125 }, + { x: 0.6875, y: 0.3125 }, + { x: 0.6875, y: 0.3125 }, + { x: 0.6875, y: 0.3125 }, + { x: 0.6875, y: 0.3125 }, + { x: 0.6875, y: 0.3125 }, + { x: 0.8125, y: 0.3125 }, + { x: 0.8125, y: 0.3125 }, + { x: 0.8125, y: 0.3125 }, + { x: 0.8125, y: 0.3125 }, + { x: 0.8125, y: 0.3125 }, + { x: 0.8125, y: 0.3125 }, + { x: 0.9375, y: 0.3125 }, + { x: 0.9375, y: 0.3125 }, + { x: 0.9375, y: 0.3125 }, + { x: 0.9375, y: 0.3125 }, + { x: 0.9375, y: 0.3125 }, + { x: 0.9375, y: 0.3125 }, + { x: 0.0625, y: 0.4375 }, + { x: 0.0625, y: 0.4375 }, + { x: 0.0625, y: 0.4375 }, + { x: 0.0625, y: 0.4375 }, + { x: 0.0625, y: 0.4375 }, + { x: 0.0625, y: 0.4375 }, + { x: 0.1875, y: 0.4375 }, + { x: 0.1875, y: 0.4375 }, + { x: 0.1875, y: 0.4375 }, + { x: 0.1875, y: 0.4375 }, + { x: 0.1875, y: 0.4375 }, + { x: 0.1875, y: 0.4375 }, + { x: 0.3125, y: 0.4375 }, + { x: 0.3125, y: 0.4375 }, + { x: 0.3125, y: 0.4375 }, + { x: 0.3125, y: 0.4375 }, + { x: 0.3125, y: 0.4375 }, + { x: 0.3125, y: 0.4375 }, + { x: 0.4375, y: 0.4375 }, + { x: 0.4375, y: 0.4375 }, + { x: 0.4375, y: 0.4375 }, + { x: 0.4375, y: 0.4375 }, + { x: 0.4375, y: 0.4375 }, + { x: 0.4375, y: 0.4375 }, + { x: 0.5625, y: 0.4375 }, + { x: 0.5625, y: 0.4375 }, + { x: 0.5625, y: 0.4375 }, + { x: 0.5625, y: 0.4375 }, + { x: 0.5625, y: 0.4375 }, + { x: 0.5625, y: 0.4375 }, + { x: 0.6875, y: 0.4375 }, + { x: 0.6875, y: 0.4375 }, + { x: 0.6875, y: 0.4375 }, + { x: 0.6875, y: 0.4375 }, + { x: 0.6875, y: 0.4375 }, + { x: 0.6875, y: 0.4375 }, + { x: 0.8125, y: 0.4375 }, + { x: 0.8125, y: 0.4375 }, + { x: 0.8125, y: 0.4375 }, + { x: 0.8125, y: 0.4375 }, + { x: 0.8125, y: 0.4375 }, + { x: 0.8125, y: 0.4375 }, + { x: 0.9375, y: 0.4375 }, + { x: 0.9375, y: 0.4375 }, + { x: 0.9375, y: 0.4375 }, + { x: 0.9375, y: 0.4375 }, + { x: 0.9375, y: 0.4375 }, + { x: 0.9375, y: 0.4375 }, + { x: 0.0625, y: 0.5625 }, + { x: 0.0625, y: 0.5625 }, + { x: 0.0625, y: 0.5625 }, + { x: 0.0625, y: 0.5625 }, + { x: 0.0625, y: 0.5625 }, + { x: 0.0625, y: 0.5625 }, + { x: 0.1875, y: 0.5625 }, + { x: 0.1875, y: 0.5625 }, + { x: 0.1875, y: 0.5625 }, + { x: 0.1875, y: 0.5625 }, + { x: 0.1875, y: 0.5625 }, + { x: 0.1875, y: 0.5625 }, + { x: 0.3125, y: 0.5625 }, + { x: 0.3125, y: 0.5625 }, + { x: 0.3125, y: 0.5625 }, + { x: 0.3125, y: 0.5625 }, + { x: 0.3125, y: 0.5625 }, + { x: 0.3125, y: 0.5625 }, + { x: 0.4375, y: 0.5625 }, + { x: 0.4375, y: 0.5625 }, + { x: 0.4375, y: 0.5625 }, + { x: 0.4375, y: 0.5625 }, + { x: 0.4375, y: 0.5625 }, + { x: 0.4375, y: 0.5625 }, + { x: 0.5625, y: 0.5625 }, + { x: 0.5625, y: 0.5625 }, + { x: 0.5625, y: 0.5625 }, + { x: 0.5625, y: 0.5625 }, + { x: 0.5625, y: 0.5625 }, + { x: 0.5625, y: 0.5625 }, + { x: 0.6875, y: 0.5625 }, + { x: 0.6875, y: 0.5625 }, + { x: 0.6875, y: 0.5625 }, + { x: 0.6875, y: 0.5625 }, + { x: 0.6875, y: 0.5625 }, + { x: 0.6875, y: 0.5625 }, + { x: 0.8125, y: 0.5625 }, + { x: 0.8125, y: 0.5625 }, + { x: 0.8125, y: 0.5625 }, + { x: 0.8125, y: 0.5625 }, + { x: 0.8125, y: 0.5625 }, + { x: 0.8125, y: 0.5625 }, + { x: 0.9375, y: 0.5625 }, + { x: 0.9375, y: 0.5625 }, + { x: 0.9375, y: 0.5625 }, + { x: 0.9375, y: 0.5625 }, + { x: 0.9375, y: 0.5625 }, + { x: 0.9375, y: 0.5625 }, + { x: 0.0625, y: 0.6875 }, + { x: 0.0625, y: 0.6875 }, + { x: 0.0625, y: 0.6875 }, + { x: 0.0625, y: 0.6875 }, + { x: 0.0625, y: 0.6875 }, + { x: 0.0625, y: 0.6875 }, + { x: 0.1875, y: 0.6875 }, + { x: 0.1875, y: 0.6875 }, + { x: 0.1875, y: 0.6875 }, + { x: 0.1875, y: 0.6875 }, + { x: 0.1875, y: 0.6875 }, + { x: 0.1875, y: 0.6875 }, + { x: 0.3125, y: 0.6875 }, + { x: 0.3125, y: 0.6875 }, + { x: 0.3125, y: 0.6875 }, + { x: 0.3125, y: 0.6875 }, + { x: 0.3125, y: 0.6875 }, + { x: 0.3125, y: 0.6875 }, + { x: 0.4375, y: 0.6875 }, + { x: 0.4375, y: 0.6875 }, + { x: 0.4375, y: 0.6875 }, + { x: 0.4375, y: 0.6875 }, + { x: 0.4375, y: 0.6875 }, + { x: 0.4375, y: 0.6875 }, + { x: 0.5625, y: 0.6875 }, + { x: 0.5625, y: 0.6875 }, + { x: 0.5625, y: 0.6875 }, + { x: 0.5625, y: 0.6875 }, + { x: 0.5625, y: 0.6875 }, + { x: 0.5625, y: 0.6875 }, + { x: 0.6875, y: 0.6875 }, + { x: 0.6875, y: 0.6875 }, + { x: 0.6875, y: 0.6875 }, + { x: 0.6875, y: 0.6875 }, + { x: 0.6875, y: 0.6875 }, + { x: 0.6875, y: 0.6875 }, + { x: 0.8125, y: 0.6875 }, + { x: 0.8125, y: 0.6875 }, + { x: 0.8125, y: 0.6875 }, + { x: 0.8125, y: 0.6875 }, + { x: 0.8125, y: 0.6875 }, + { x: 0.8125, y: 0.6875 }, + { x: 0.9375, y: 0.6875 }, + { x: 0.9375, y: 0.6875 }, + { x: 0.9375, y: 0.6875 }, + { x: 0.9375, y: 0.6875 }, + { x: 0.9375, y: 0.6875 }, + { x: 0.9375, y: 0.6875 }, + { x: 0.0625, y: 0.8125 }, + { x: 0.0625, y: 0.8125 }, + { x: 0.0625, y: 0.8125 }, + { x: 0.0625, y: 0.8125 }, + { x: 0.0625, y: 0.8125 }, + { x: 0.0625, y: 0.8125 }, + { x: 0.1875, y: 0.8125 }, + { x: 0.1875, y: 0.8125 }, + { x: 0.1875, y: 0.8125 }, + { x: 0.1875, y: 0.8125 }, + { x: 0.1875, y: 0.8125 }, + { x: 0.1875, y: 0.8125 }, + { x: 0.3125, y: 0.8125 }, + { x: 0.3125, y: 0.8125 }, + { x: 0.3125, y: 0.8125 }, + { x: 0.3125, y: 0.8125 }, + { x: 0.3125, y: 0.8125 }, + { x: 0.3125, y: 0.8125 }, + { x: 0.4375, y: 0.8125 }, + { x: 0.4375, y: 0.8125 }, + { x: 0.4375, y: 0.8125 }, + { x: 0.4375, y: 0.8125 }, + { x: 0.4375, y: 0.8125 }, + { x: 0.4375, y: 0.8125 }, + { x: 0.5625, y: 0.8125 }, + { x: 0.5625, y: 0.8125 }, + { x: 0.5625, y: 0.8125 }, + { x: 0.5625, y: 0.8125 }, + { x: 0.5625, y: 0.8125 }, + { x: 0.5625, y: 0.8125 }, + { x: 0.6875, y: 0.8125 }, + { x: 0.6875, y: 0.8125 }, + { x: 0.6875, y: 0.8125 }, + { x: 0.6875, y: 0.8125 }, + { x: 0.6875, y: 0.8125 }, + { x: 0.6875, y: 0.8125 }, + { x: 0.8125, y: 0.8125 }, + { x: 0.8125, y: 0.8125 }, + { x: 0.8125, y: 0.8125 }, + { x: 0.8125, y: 0.8125 }, + { x: 0.8125, y: 0.8125 }, + { x: 0.8125, y: 0.8125 }, + { x: 0.9375, y: 0.8125 }, + { x: 0.9375, y: 0.8125 }, + { x: 0.9375, y: 0.8125 }, + { x: 0.9375, y: 0.8125 }, + { x: 0.9375, y: 0.8125 }, + { x: 0.9375, y: 0.8125 }, + { x: 0.0625, y: 0.9375 }, + { x: 0.0625, y: 0.9375 }, + { x: 0.0625, y: 0.9375 }, + { x: 0.0625, y: 0.9375 }, + { x: 0.0625, y: 0.9375 }, + { x: 0.0625, y: 0.9375 }, + { x: 0.1875, y: 0.9375 }, + { x: 0.1875, y: 0.9375 }, + { x: 0.1875, y: 0.9375 }, + { x: 0.1875, y: 0.9375 }, + { x: 0.1875, y: 0.9375 }, + { x: 0.1875, y: 0.9375 }, + { x: 0.3125, y: 0.9375 }, + { x: 0.3125, y: 0.9375 }, + { x: 0.3125, y: 0.9375 }, + { x: 0.3125, y: 0.9375 }, + { x: 0.3125, y: 0.9375 }, + { x: 0.3125, y: 0.9375 }, + { x: 0.4375, y: 0.9375 }, + { x: 0.4375, y: 0.9375 }, + { x: 0.4375, y: 0.9375 }, + { x: 0.4375, y: 0.9375 }, + { x: 0.4375, y: 0.9375 }, + { x: 0.4375, y: 0.9375 }, + { x: 0.5625, y: 0.9375 }, + { x: 0.5625, y: 0.9375 }, + { x: 0.5625, y: 0.9375 }, + { x: 0.5625, y: 0.9375 }, + { x: 0.5625, y: 0.9375 }, + { x: 0.5625, y: 0.9375 }, + { x: 0.6875, y: 0.9375 }, + { x: 0.6875, y: 0.9375 }, + { x: 0.6875, y: 0.9375 }, + { x: 0.6875, y: 0.9375 }, + { x: 0.6875, y: 0.9375 }, + { x: 0.6875, y: 0.9375 }, + { x: 0.8125, y: 0.9375 }, + { x: 0.8125, y: 0.9375 }, + { x: 0.8125, y: 0.9375 }, + { x: 0.8125, y: 0.9375 }, + { x: 0.8125, y: 0.9375 }, + { x: 0.8125, y: 0.9375 }, + { x: 0.9375, y: 0.9375 }, + { x: 0.9375, y: 0.9375 }, + { x: 0.9375, y: 0.9375 }, + { x: 0.9375, y: 0.9375 }, + { x: 0.9375, y: 0.9375 }, + { x: 0.9375, y: 0.9375 } +]; + +// src/handpose/handdetector.ts +var HandDetector = class { + constructor(model9) { + var _a; + this.model = model9; + this.anchors = anchors.map((anchor) => [anchor.x, anchor.y]); + this.anchorsTensor = tfjs_esm_exports.tensor2d(this.anchors); + this.inputSize = (_a = this.model) == null ? void 0 : _a.inputs[0].shape[2]; + this.inputSizeTensor = tfjs_esm_exports.tensor1d([this.inputSize, this.inputSize]); + this.doubleInputSizeTensor = tfjs_esm_exports.tensor1d([this.inputSize * 2, this.inputSize * 2]); + } + normalizeBoxes(boxes) { + return tfjs_esm_exports.tidy(() => { + const boxOffsets = tfjs_esm_exports.slice(boxes, [0, 0], [-1, 2]); + const boxSizes = tfjs_esm_exports.slice(boxes, [0, 2], [-1, 2]); + const boxCenterPoints = tfjs_esm_exports.add(tfjs_esm_exports.div(boxOffsets, this.inputSizeTensor), this.anchorsTensor); + const halfBoxSizes = tfjs_esm_exports.div(boxSizes, this.doubleInputSizeTensor); + const startPoints = tfjs_esm_exports.mul(tfjs_esm_exports.sub(boxCenterPoints, halfBoxSizes), this.inputSizeTensor); + const endPoints = tfjs_esm_exports.mul(tfjs_esm_exports.add(boxCenterPoints, halfBoxSizes), this.inputSizeTensor); + return tfjs_esm_exports.concat2d([startPoints, endPoints], 1); + }); + } + normalizeLandmarks(rawPalmLandmarks, index) { + return tfjs_esm_exports.tidy(() => { + const landmarks = tfjs_esm_exports.add(tfjs_esm_exports.div(rawPalmLandmarks.reshape([-1, 7, 2]), this.inputSizeTensor), this.anchors[index]); + return tfjs_esm_exports.mul(landmarks, this.inputSizeTensor); + }); + } + async getBoxes(input, config3) { + const batched = this.model.predict(input); + const predictions = batched.squeeze(); + batched.dispose(); + const scoresT = tfjs_esm_exports.tidy(() => tfjs_esm_exports.sigmoid(tfjs_esm_exports.slice(predictions, [0, 0], [-1, 1])).squeeze()); + const scores = scoresT.dataSync(); + const rawBoxes = tfjs_esm_exports.slice(predictions, [0, 1], [-1, 4]); + const boxes = this.normalizeBoxes(rawBoxes); + rawBoxes.dispose(); + const filteredT = await tfjs_esm_exports.image.nonMaxSuppressionAsync(boxes, scores, config3.hand.maxDetected, config3.hand.iouThreshold, config3.hand.minConfidence); + const filtered = filteredT.arraySync(); + scoresT.dispose(); + filteredT.dispose(); + const hands = []; + for (const index of filtered) { + if (scores[index] >= config3.hand.minConfidence) { + const matchingBox = tfjs_esm_exports.slice(boxes, [index, 0], [1, -1]); + const rawPalmLandmarks = tfjs_esm_exports.slice(predictions, [index, 5], [1, 14]); + const palmLandmarks = tfjs_esm_exports.tidy(() => this.normalizeLandmarks(rawPalmLandmarks, index).reshape([-1, 2])); + rawPalmLandmarks.dispose(); + hands.push({ box: matchingBox, palmLandmarks, confidence: scores[index] }); + } + } + predictions.dispose(); + boxes.dispose(); + return hands; + } + async estimateHandBounds(input, config3) { + const inputHeight = input.shape[1]; + const inputWidth = input.shape[2]; + const image15 = tfjs_esm_exports.tidy(() => input.resizeBilinear([this.inputSize, this.inputSize]).div(127.5).sub(1)); + const predictions = await this.getBoxes(image15, config3); + image15.dispose(); + const hands = []; + if (!predictions || predictions.length === 0) + return hands; + for (const prediction of predictions) { + const boxes = prediction.box.dataSync(); + const startPoint = boxes.slice(0, 2); + const endPoint = boxes.slice(2, 4); + const palmLandmarks = prediction.palmLandmarks.arraySync(); + prediction.box.dispose(); + prediction.palmLandmarks.dispose(); + hands.push(scaleBoxCoordinates2({ startPoint, endPoint, palmLandmarks, confidence: prediction.confidence }, [inputWidth / this.inputSize, inputHeight / this.inputSize])); + } + return hands; + } +}; + +// src/handpose/util.ts +function normalizeRadians2(angle) { + return angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI)); +} +function computeRotation2(point1, point2) { + const radians = Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]); + return normalizeRadians2(radians); +} +var buildTranslationMatrix2 = (x, y) => [[1, 0, x], [0, 1, y], [0, 0, 1]]; +function dot2(v1, v2) { + let product = 0; + for (let i = 0; i < v1.length; i++) { + product += v1[i] * v2[i]; + } + return product; +} +function getColumnFrom2DArr2(arr, columnIndex) { + const column = []; + for (let i = 0; i < arr.length; i++) { + column.push(arr[i][columnIndex]); + } + return column; +} +function multiplyTransformMatrices2(mat1, mat2) { + const product = []; + const size = mat1.length; + for (let row = 0; row < size; row++) { + product.push([]); + for (let col = 0; col < size; col++) { + product[row].push(dot2(mat1[row], getColumnFrom2DArr2(mat2, col))); + } + } + return product; +} +function buildRotationMatrix2(rotation, center) { + const cosA = Math.cos(rotation); + const sinA = Math.sin(rotation); + const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]]; + const translationMatrix = buildTranslationMatrix2(center[0], center[1]); + const translationTimesRotation = multiplyTransformMatrices2(translationMatrix, rotationMatrix); + const negativeTranslationMatrix = buildTranslationMatrix2(-center[0], -center[1]); + return multiplyTransformMatrices2(translationTimesRotation, negativeTranslationMatrix); +} +function invertTransformMatrix2(matrix) { + const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]]; + const translationComponent = [matrix[0][2], matrix[1][2]]; + const invertedTranslation = [ + -dot2(rotationComponent[0], translationComponent), + -dot2(rotationComponent[1], translationComponent) + ]; + return [ + rotationComponent[0].concat(invertedTranslation[0]), + rotationComponent[1].concat(invertedTranslation[1]), + [0, 0, 1] + ]; +} +function rotatePoint2(homogeneousCoordinate, rotationMatrix) { + return [ + dot2(homogeneousCoordinate, rotationMatrix[0]), + dot2(homogeneousCoordinate, rotationMatrix[1]) + ]; +} + +// src/handpose/handpipeline.ts +var palmBoxEnlargeFactor = 5; +var handBoxEnlargeFactor = 1.65; +var palmLandmarkIds = [0, 5, 9, 13, 17, 1, 2]; +var palmLandmarksPalmBase = 0; +var palmLandmarksMiddleFingerBase = 2; +var HandPipeline = class { + constructor(handDetector, handPoseModel2) { + var _a; + this.handDetector = handDetector; + this.handPoseModel = handPoseModel2; + this.inputSize = (_a = this.handPoseModel) == null ? void 0 : _a.inputs[0].shape[2]; + this.storedBoxes = []; + this.skipped = 0; + this.detectedHands = 0; + } + calculateLandmarksBoundingBox(landmarks) { + const xs = landmarks.map((d) => d[0]); + const ys = landmarks.map((d) => d[1]); + const startPoint = [Math.min(...xs), Math.min(...ys)]; + const endPoint = [Math.max(...xs), Math.max(...ys)]; + return { startPoint, endPoint }; + } + getBoxForPalmLandmarks(palmLandmarks, rotationMatrix) { + const rotatedPalmLandmarks = palmLandmarks.map((coord) => rotatePoint2([...coord, 1], rotationMatrix)); + const boxAroundPalm = this.calculateLandmarksBoundingBox(rotatedPalmLandmarks); + return enlargeBox2(squarifyBox2(boxAroundPalm), palmBoxEnlargeFactor); + } + getBoxForHandLandmarks(landmarks) { + const boundingBox = this.calculateLandmarksBoundingBox(landmarks); + const boxAroundHand = enlargeBox2(squarifyBox2(boundingBox), handBoxEnlargeFactor); + boxAroundHand.palmLandmarks = []; + for (let i = 0; i < palmLandmarkIds.length; i++) { + boxAroundHand.palmLandmarks.push(landmarks[palmLandmarkIds[i]].slice(0, 2)); + } + return boxAroundHand; + } + transformRawCoords(rawCoords, box22, angle, rotationMatrix) { + const boxSize = getBoxSize2(box22); + const scaleFactor = [boxSize[0] / this.inputSize, boxSize[1] / this.inputSize, (boxSize[0] + boxSize[1]) / this.inputSize / 2]; + const coordsScaled = rawCoords.map((coord) => [ + scaleFactor[0] * (coord[0] - this.inputSize / 2), + scaleFactor[1] * (coord[1] - this.inputSize / 2), + scaleFactor[2] * coord[2] + ]); + const coordsRotationMatrix = buildRotationMatrix2(angle, [0, 0]); + const coordsRotated = coordsScaled.map((coord) => { + const rotated = rotatePoint2(coord, coordsRotationMatrix); + return [...rotated, coord[2]]; + }); + const inverseRotationMatrix = invertTransformMatrix2(rotationMatrix); + const boxCenter = [...getBoxCenter2(box22), 1]; + const originalBoxCenter = [ + dot2(boxCenter, inverseRotationMatrix[0]), + dot2(boxCenter, inverseRotationMatrix[1]) + ]; + return coordsRotated.map((coord) => [ + Math.trunc(coord[0] + originalBoxCenter[0]), + Math.trunc(coord[1] + originalBoxCenter[1]), + Math.trunc(coord[2]) + ]); + } + async estimateHands(image15, config3) { + let useFreshBox = false; + let boxes; + if (this.skipped === 0 || this.skipped > config3.hand.skipFrames || !config3.hand.landmarks || !config3.skipFrame) { + boxes = await this.handDetector.estimateHandBounds(image15, config3); + this.skipped = 0; + } + if (config3.skipFrame) + this.skipped++; + if (boxes && boxes.length > 0 && (boxes.length !== this.detectedHands && this.detectedHands !== config3.hand.maxDetected || !config3.hand.landmarks)) { + this.detectedHands = 0; + this.storedBoxes = [...boxes]; + if (this.storedBoxes.length > 0) + useFreshBox = true; + } + const hands = []; + for (let i = 0; i < this.storedBoxes.length; i++) { + const currentBox = this.storedBoxes[i]; + if (!currentBox) + continue; + if (config3.hand.landmarks) { + const angle = config3.hand.rotation ? computeRotation2(currentBox.palmLandmarks[palmLandmarksPalmBase], currentBox.palmLandmarks[palmLandmarksMiddleFingerBase]) : 0; + const palmCenter = getBoxCenter2(currentBox); + const palmCenterNormalized = [palmCenter[0] / image15.shape[2], palmCenter[1] / image15.shape[1]]; + const rotatedImage = config3.hand.rotation && tfjs_esm_exports.ENV.flags.IS_BROWSER ? tfjs_esm_exports.image.rotateWithOffset(image15, angle, 0, palmCenterNormalized) : image15.clone(); + const rotationMatrix = buildRotationMatrix2(-angle, palmCenter); + const newBox = useFreshBox ? this.getBoxForPalmLandmarks(currentBox.palmLandmarks, rotationMatrix) : currentBox; + const croppedInput = cutBoxFromImageAndResize2(newBox, rotatedImage, [this.inputSize, this.inputSize]); + const handImage = croppedInput.div(255); + croppedInput.dispose(); + rotatedImage.dispose(); + const [confidenceT, keypoints3] = await this.handPoseModel.predict(handImage); + handImage.dispose(); + const confidence = confidenceT.dataSync()[0]; + confidenceT.dispose(); + if (confidence >= config3.hand.minConfidence) { + const keypointsReshaped = tfjs_esm_exports.reshape(keypoints3, [-1, 3]); + const rawCoords = keypointsReshaped.arraySync(); + keypoints3.dispose(); + keypointsReshaped.dispose(); + const coords3 = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix); + const nextBoundingBox = this.getBoxForHandLandmarks(coords3); + this.storedBoxes[i] = { ...nextBoundingBox, confidence }; + const result = { + landmarks: coords3, + confidence, + box: { topLeft: nextBoundingBox.startPoint, bottomRight: nextBoundingBox.endPoint } + }; + hands.push(result); + } else { + this.storedBoxes[i] = null; + } + keypoints3.dispose(); + } else { + const enlarged = enlargeBox2(squarifyBox2(currentBox), handBoxEnlargeFactor); + const result = { + confidence: currentBox.confidence, + box: { topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint } + }; + hands.push(result); + } + } + this.storedBoxes = this.storedBoxes.filter((a) => a !== null); + this.detectedHands = hands.length; + return hands; + } +}; + +// src/handpose/handpose.ts +var meshAnnotations = { + thumb: [1, 2, 3, 4], + indexFinger: [5, 6, 7, 8], + middleFinger: [9, 10, 11, 12], + ringFinger: [13, 14, 15, 16], + pinky: [17, 18, 19, 20], + palmBase: [0] +}; +var handDetectorModel; +var handPoseModel; +var handPipeline; +async function predict5(input, config3) { + const predictions = await handPipeline.estimateHands(input, config3); + if (!predictions) + return []; + const hands = []; + for (let i = 0; i < predictions.length; i++) { + const annotations3 = {}; + if (predictions[i].landmarks) { + for (const key of Object.keys(meshAnnotations)) { + annotations3[key] = meshAnnotations[key].map((index) => predictions[i].landmarks[index]); + } + } + const keypoints3 = predictions[i].landmarks; + let box6 = [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, 0, 0]; + let boxRaw3 = [0, 0, 0, 0]; + if (keypoints3 && keypoints3.length > 0) { + for (const pt of keypoints3) { + if (pt[0] < box6[0]) + box6[0] = pt[0]; + if (pt[1] < box6[1]) + box6[1] = pt[1]; + if (pt[0] > box6[2]) + box6[2] = pt[0]; + if (pt[1] > box6[3]) + box6[3] = pt[1]; + } + box6[2] -= box6[0]; + box6[3] -= box6[1]; + boxRaw3 = [box6[0] / (input.shape[2] || 0), box6[1] / (input.shape[1] || 0), box6[2] / (input.shape[2] || 0), box6[3] / (input.shape[1] || 0)]; + } else { + box6 = predictions[i].box ? [ + Math.trunc(Math.max(0, predictions[i].box.topLeft[0])), + Math.trunc(Math.max(0, predictions[i].box.topLeft[1])), + Math.trunc(Math.min(input.shape[2] || 0, predictions[i].box.bottomRight[0]) - Math.max(0, predictions[i].box.topLeft[0])), + Math.trunc(Math.min(input.shape[1] || 0, predictions[i].box.bottomRight[1]) - Math.max(0, predictions[i].box.topLeft[1])) + ] : [0, 0, 0, 0]; + boxRaw3 = [ + predictions[i].box.topLeft[0] / (input.shape[2] || 0), + predictions[i].box.topLeft[1] / (input.shape[1] || 0), + (predictions[i].box.bottomRight[0] - predictions[i].box.topLeft[0]) / (input.shape[2] || 0), + (predictions[i].box.bottomRight[1] - predictions[i].box.topLeft[1]) / (input.shape[1] || 0) + ]; + } + hands.push({ id: i, score: Math.round(100 * predictions[i].confidence) / 100, box: box6, boxRaw: boxRaw3, keypoints: keypoints3, annotations: annotations3 }); + } + return hands; +} +async function load6(config3) { + if (!handDetectorModel || !handPoseModel) { + [handDetectorModel, handPoseModel] = await Promise.all([ + config3.hand.enabled ? tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.hand.detector.modelPath), { fromTFHub: config3.hand.detector.modelPath.includes("tfhub.dev") }) : null, + config3.hand.landmarks ? tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.hand.skeleton.modelPath), { fromTFHub: config3.hand.skeleton.modelPath.includes("tfhub.dev") }) : null + ]); + if (config3.hand.enabled) { + if (!handDetectorModel || !handDetectorModel["modelUrl"]) + log("load model failed:", config3.hand.detector.modelPath); + else if (config3.debug) + log("load model:", handDetectorModel["modelUrl"]); + if (!handPoseModel || !handPoseModel["modelUrl"]) + log("load model failed:", config3.hand.skeleton.modelPath); + else if (config3.debug) + log("load model:", handPoseModel["modelUrl"]); + } + } else { + if (config3.debug) + log("cached model:", handDetectorModel["modelUrl"]); + if (config3.debug) + log("cached model:", handPoseModel["modelUrl"]); + } + const handDetector = new HandDetector(handDetectorModel); + handPipeline = new HandPipeline(handDetector, handPoseModel); + return [handDetectorModel, handPoseModel]; +} + +// src/blazepose/blazepose.ts +var blazepose_exports = {}; +__export(blazepose_exports, { + load: () => load7, + predict: () => predict6 +}); + +// src/blazepose/annotations.ts +var full = [ + "nose", + "leftEyeInside", + "leftEye", + "leftEyeOutside", + "rightEyeInside", + "rightEye", + "rightEyeOutside", + "leftEar", + "rightEar", + "leftMouth", + "rightMouth", + "leftShoulder", + "rightShoulder", + "leftElbow", + "rightElbow", + "leftWrist", + "rightWrist", + "leftPalm", + "rightPalm", + "leftIndex", + "rightIndex", + "leftPinky", + "rightPinky", + "leftHip", + "rightHip", + "leftKnee", + "rightKnee", + "leftAnkle", + "rightAnkle", + "leftHeel", + "rightHeel", + "leftFoot", + "rightFoot", + "midHip", + "forehead", + "leftThumb", + "leftHand", + "rightThumb", + "rightHand" +]; +var upper = [ + "nose", + "leftEyeInside", + "leftEye", + "leftEyeOutside", + "rightEyeInside", + "rightEye", + "rightEyeOutside", + "leftEar", + "rightEar", + "leftMouth", + "rightMouth", + "leftShoulder", + "rightShoulder", + "leftElbow", + "rightElbow", + "left:15", + "right:16", + "left:17", + "right:18", + "left:19", + "right:20", + "left:21", + "right:22", + "leftChest", + "rightChest", + "neck", + "forehead", + "left:27", + "right:28", + "left:29", + "right:30" +]; + +// src/blazepose/blazepose.ts +var model4; +async function load7(config3) { + if (!model4) { + model4 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.body.modelPath)); + model4["width"] = parseInt(model4["signature"].inputs["input_1:0"].tensorShape.dim[2].size); + model4["height"] = parseInt(model4["signature"].inputs["input_1:0"].tensorShape.dim[1].size); + if (!model4 || !model4["modelUrl"]) + log("load model failed:", config3.body.modelPath); + else if (config3.debug) + log("load model:", model4["modelUrl"]); + } else if (config3.debug) + log("cached model:", model4["modelUrl"]); + return model4; +} +async function predict6(image15, config3) { + var _a; + if (!model4) + return []; + if (!config3.body.enabled) + return []; + const imgSize = { width: image15.shape[2] || 0, height: image15.shape[1] || 0 }; + const resize = tfjs_esm_exports.image.resizeBilinear(image15, [model4["width"], model4["height"]], false); + const normalize = tfjs_esm_exports.div(resize, [255]); + resize.dispose(); + const resT = await model4.predict(normalize); + const points = ((_a = resT.find((t) => t.size === 195 || t.size === 155)) == null ? void 0 : _a.dataSync()) || []; + resT.forEach((t) => t.dispose()); + normalize.dispose(); + const keypoints3 = []; + const labels2 = (points == null ? void 0 : points.length) === 195 ? full : upper; + const depth = 5; + for (let i = 0; i < points.length / depth; i++) { + keypoints3.push({ + id: i, + part: labels2[i], + position: [ + Math.trunc(imgSize.width * points[depth * i + 0] / 255), + Math.trunc(imgSize.height * points[depth * i + 1] / 255), + Math.trunc(points[depth * i + 2]) + 0 + ], + positionRaw: [ + points[depth * i + 0] / 255, + points[depth * i + 1] / 255, + points[depth * i + 2] + 0 + ], + score: (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 3])))) / 100, + presence: (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 4])))) / 100 + }); + } + const x = keypoints3.map((a) => a.position[0]); + const y = keypoints3.map((a) => a.position[1]); + const box6 = [ + Math.min(...x), + Math.min(...y), + Math.max(...x) - Math.min(...x), + Math.max(...y) - Math.min(...x) + ]; + const boxRaw3 = [0, 0, 0, 0]; + const score3 = keypoints3.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0); + return [{ id: 0, score: score3, box: box6, boxRaw: boxRaw3, keypoints: keypoints3 }]; +} + +// src/efficientpose/efficientpose.ts +var model5; +var keypoints = []; +var box4 = [0, 0, 0, 0]; +var boxRaw = [0, 0, 0, 0]; +var score = 0; +var skipped3 = Number.MAX_SAFE_INTEGER; +var bodyParts = ["head", "neck", "rightShoulder", "rightElbow", "rightWrist", "chest", "leftShoulder", "leftElbow", "leftWrist", "pelvis", "rightHip", "rightKnee", "rightAnkle", "leftHip", "leftKnee", "leftAnkle"]; +async function load8(config3) { + if (!model5) { + model5 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.body.modelPath)); + if (!model5 || !model5["modelUrl"]) + log("load model failed:", config3.body.modelPath); + else if (config3.debug) + log("load model:", model5["modelUrl"]); + } else if (config3.debug) + log("cached model:", model5["modelUrl"]); + return model5; +} +function max2d(inputs, minScore) { + const [width, height] = inputs.shape; + return tfjs_esm_exports.tidy(() => { + const mod = (a, b) => tfjs_esm_exports.sub(a, tfjs_esm_exports.mul(tfjs_esm_exports.div(a, tfjs_esm_exports.scalar(b, "int32")), tfjs_esm_exports.scalar(b, "int32"))); + const reshaped = tfjs_esm_exports.reshape(inputs, [height * width]); + const newScore = tfjs_esm_exports.max(reshaped, 0).dataSync()[0]; + if (newScore > minScore) { + const coords3 = tfjs_esm_exports.argMax(reshaped, 0); + const x = mod(coords3, width).dataSync()[0]; + const y = tfjs_esm_exports.div(coords3, tfjs_esm_exports.scalar(width, "int32")).dataSync()[0]; + return [x, y, newScore]; + } + return [0, 0, newScore]; + }); +} +async function predict7(image15, config3) { + if (skipped3 < config3.body.skipFrames && config3.skipFrame && Object.keys(keypoints).length > 0) { + skipped3++; + return [{ id: 0, score, box: box4, boxRaw, keypoints }]; + } + skipped3 = 0; + return new Promise(async (resolve) => { + const tensor2 = tfjs_esm_exports.tidy(() => { + if (!model5.inputs[0].shape) + return null; + const resize = tfjs_esm_exports.image.resizeBilinear(image15, [model5.inputs[0].shape[2], model5.inputs[0].shape[1]], false); + const enhance2 = tfjs_esm_exports.mul(resize, 2); + const norm = enhance2.sub(1); + return norm; + }); + let resT; + if (config3.body.enabled) + resT = await model5.predict(tensor2); + tensor2.dispose(); + if (resT) { + keypoints.length = 0; + const squeeze3 = resT.squeeze(); + tfjs_esm_exports.dispose(resT); + const stack2 = squeeze3.unstack(2); + tfjs_esm_exports.dispose(squeeze3); + for (let id = 0; id < stack2.length; id++) { + const [x2, y2, partScore] = max2d(stack2[id], config3.body.minConfidence); + if (score > config3.body.minConfidence) { + keypoints.push({ + score: Math.round(100 * partScore) / 100, + part: bodyParts[id], + positionRaw: [ + x2 / model5.inputs[0].shape[2], + y2 / model5.inputs[0].shape[1] + ], + position: [ + Math.round(image15.shape[2] * x2 / model5.inputs[0].shape[2]), + Math.round(image15.shape[1] * y2 / model5.inputs[0].shape[1]) + ] + }); + } + } + stack2.forEach((s) => tfjs_esm_exports.dispose(s)); + } + score = keypoints.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0); + const x = keypoints.map((a) => a.position[0]); + const y = keypoints.map((a) => a.position[1]); + box4 = [ + Math.min(...x), + Math.min(...y), + Math.max(...x) - Math.min(...x), + Math.max(...y) - Math.min(...y) + ]; + const xRaw = keypoints.map((a) => a.positionRaw[0]); + const yRaw = keypoints.map((a) => a.positionRaw[1]); + boxRaw = [ + Math.min(...xRaw), + Math.min(...yRaw), + Math.max(...xRaw) - Math.min(...xRaw), + Math.max(...yRaw) - Math.min(...yRaw) + ]; + resolve([{ id: 0, score, box: box4, boxRaw, keypoints }]); + }); +} + +// src/movenet/movenet.ts +var model6; +var keypoints2 = []; +var box5 = [0, 0, 0, 0]; +var boxRaw2 = [0, 0, 0, 0]; +var score2 = 0; +var skipped4 = Number.MAX_SAFE_INTEGER; +var bodyParts2 = ["nose", "leftEye", "rightEye", "leftEar", "rightEar", "leftShoulder", "rightShoulder", "leftElbow", "rightElbow", "leftWrist", "rightWrist", "leftHip", "rightHip", "leftKnee", "rightKnee", "leftAnkle", "rightAnkle"]; +async function load9(config3) { + if (!model6) { + model6 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.body.modelPath)); + if (!model6 || !model6["modelUrl"]) + log("load model failed:", config3.body.modelPath); + else if (config3.debug) + log("load model:", model6["modelUrl"]); + } else if (config3.debug) + log("cached model:", model6["modelUrl"]); + return model6; +} +async function predict8(image15, config3) { + if (skipped4 < config3.body.skipFrames && config3.skipFrame && Object.keys(keypoints2).length > 0) { + skipped4++; + return [{ id: 0, score: score2, box: box5, boxRaw: boxRaw2, keypoints: keypoints2 }]; + } + skipped4 = 0; + return new Promise(async (resolve) => { + const tensor2 = tfjs_esm_exports.tidy(() => { + if (!model6.inputs[0].shape) + return null; + const resize = tfjs_esm_exports.image.resizeBilinear(image15, [model6.inputs[0].shape[2], model6.inputs[0].shape[1]], false); + const cast2 = tfjs_esm_exports.cast(resize, "int32"); + return cast2; + }); + let resT; + if (config3.body.enabled) + resT = await model6.predict(tensor2); + tensor2.dispose(); + if (resT) { + keypoints2.length = 0; + const res = resT.arraySync(); + tfjs_esm_exports.dispose(resT); + const kpt3 = res[0][0]; + for (let id = 0; id < kpt3.length; id++) { + score2 = kpt3[id][2]; + if (score2 > config3.body.minConfidence) { + keypoints2.push({ + score: Math.round(100 * score2) / 100, + part: bodyParts2[id], + positionRaw: [ + kpt3[id][1], + kpt3[id][0] + ], + position: [ + Math.round((image15.shape[2] || 0) * kpt3[id][1]), + Math.round((image15.shape[1] || 0) * kpt3[id][0]) + ] + }); + } + } + } + score2 = keypoints2.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0); + const x = keypoints2.map((a) => a.position[0]); + const y = keypoints2.map((a) => a.position[1]); + box5 = [ + Math.min(...x), + Math.min(...y), + Math.max(...x) - Math.min(...x), + Math.max(...y) - Math.min(...y) + ]; + const xRaw = keypoints2.map((a) => a.positionRaw[0]); + const yRaw = keypoints2.map((a) => a.positionRaw[1]); + boxRaw2 = [ + Math.min(...xRaw), + Math.min(...yRaw), + Math.max(...xRaw) - Math.min(...xRaw), + Math.max(...yRaw) - Math.min(...yRaw) + ]; + resolve([{ id: 0, score: score2, box: box5, boxRaw: boxRaw2, keypoints: keypoints2 }]); + }); +} + +// src/object/nanodet.ts +var nanodet_exports = {}; +__export(nanodet_exports, { + load: () => load10, + predict: () => predict9 +}); + +// src/object/labels.ts +var labels = [ + { 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" } +]; + +// src/object/nanodet.ts +var model7; +var last3 = []; +var skipped5 = Number.MAX_SAFE_INTEGER; +var scaleBox = 2.5; +async function load10(config3) { + if (!model7) { + model7 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.object.modelPath)); + const inputs = Object.values(model7.modelSignature["inputs"]); + model7.inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : null; + if (!model7.inputSize) + throw new Error(`Human: Cannot determine model inputSize: ${config3.object.modelPath}`); + if (!model7 || !model7.modelUrl) + log("load model failed:", config3.object.modelPath); + else if (config3.debug) + log("load model:", model7.modelUrl); + } else if (config3.debug) + log("cached model:", model7.modelUrl); + return model7; +} +async function process2(res, inputSize, outputShape, config3) { + let id = 0; + let results = []; + for (const strideSize of [1, 2, 4]) { + tfjs_esm_exports.tidy(() => { + var _a, _b; + const baseSize = strideSize * 13; + const scoresT = (_a = res.find((a) => a.shape[1] === baseSize ** 2 && a.shape[2] === labels.length)) == null ? void 0 : _a.squeeze(); + const featuresT = (_b = res.find((a) => a.shape[1] === baseSize ** 2 && a.shape[2] < labels.length)) == null ? void 0 : _b.squeeze(); + const boxesMax = featuresT.reshape([-1, 4, featuresT.shape[1] / 4]); + const boxIdx = boxesMax.argMax(2).arraySync(); + const scores = scoresT.arraySync(); + for (let i = 0; i < scoresT.shape[0]; i++) { + for (let j = 0; j < scoresT.shape[1]; j++) { + const score3 = scores[i][j]; + if (score3 > config3.object.minConfidence && j !== 61) { + const cx = (0.5 + Math.trunc(i % baseSize)) / baseSize; + const cy = (0.5 + Math.trunc(i / baseSize)) / baseSize; + const boxOffset = boxIdx[i].map((a) => a * (baseSize / strideSize / inputSize)); + const [x, y] = [ + cx - scaleBox / strideSize * boxOffset[0], + cy - scaleBox / strideSize * boxOffset[1] + ]; + const [w, h] = [ + cx + scaleBox / strideSize * boxOffset[2] - x, + cy + scaleBox / strideSize * boxOffset[3] - y + ]; + let boxRaw3 = [x, y, w, h]; + boxRaw3 = boxRaw3.map((a) => Math.max(0, Math.min(a, 1))); + const box6 = [ + boxRaw3[0] * outputShape[0], + boxRaw3[1] * outputShape[1], + boxRaw3[2] * outputShape[0], + boxRaw3[3] * outputShape[1] + ]; + const result = { + id: id++, + score: Math.round(100 * score3) / 100, + class: j + 1, + label: labels[j].label, + box: box6.map((a) => Math.trunc(a)), + boxRaw: boxRaw3 + }; + results.push(result); + } + } + } + }); + } + res.forEach((t) => tfjs_esm_exports.dispose(t)); + const nmsBoxes = results.map((a) => [a.boxRaw[1], a.boxRaw[0], a.boxRaw[3], a.boxRaw[2]]); + const nmsScores = results.map((a) => a.score); + let nmsIdx = []; + if (nmsBoxes && nmsBoxes.length > 0) { + const nms = await tfjs_esm_exports.image.nonMaxSuppressionAsync(nmsBoxes, nmsScores, config3.object.maxDetected, config3.object.iouThreshold, config3.object.minConfidence); + nmsIdx = nms.dataSync(); + tfjs_esm_exports.dispose(nms); + } + results = results.filter((a, idx) => nmsIdx.includes(idx)).sort((a, b) => b.score - a.score); + return results; +} +async function predict9(image15, config3) { + if (skipped5 < config3.object.skipFrames && config3.skipFrame && last3.length > 0) { + skipped5++; + return last3; + } + skipped5 = 0; + return new Promise(async (resolve) => { + const outputSize = [image15.shape[2], image15.shape[1]]; + const resize = tfjs_esm_exports.image.resizeBilinear(image15, [model7.inputSize, model7.inputSize], false); + const norm = resize.div(255); + const transpose = norm.transpose([0, 3, 1, 2]); + norm.dispose(); + resize.dispose(); + let objectT; + if (config3.object.enabled) + objectT = await model7.predict(transpose); + transpose.dispose(); + const obj = await process2(objectT, model7.inputSize, outputSize, config3); + last3 = obj; + resolve(obj); + }); +} + +// src/object/centernet.ts +var centernet_exports = {}; +__export(centernet_exports, { + load: () => load11, + predict: () => predict10 +}); +var model8; +var last4 = []; +var skipped6 = Number.MAX_SAFE_INTEGER; +async function load11(config3) { + if (!model8) { + model8 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.object.modelPath)); + const inputs = Object.values(model8.modelSignature["inputs"]); + model8.inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : null; + if (!model8.inputSize) + throw new Error(`Human: Cannot determine model inputSize: ${config3.object.modelPath}`); + if (!model8 || !model8.modelUrl) + log("load model failed:", config3.object.modelPath); + else if (config3.debug) + log("load model:", model8.modelUrl); + } else if (config3.debug) + log("cached model:", model8.modelUrl); + return model8; +} +async function process3(res, inputSize, outputShape, config3) { + if (!res) + return []; + const results = []; + const detections = res.arraySync(); + const squeezeT = tfjs_esm_exports.squeeze(res); + res.dispose(); + const arr = tfjs_esm_exports.split(squeezeT, 6, 1); + squeezeT.dispose(); + const stackT = tfjs_esm_exports.stack([arr[1], arr[0], arr[3], arr[2]], 1); + const boxesT = stackT.squeeze(); + const scoresT = arr[4].squeeze(); + const classesT = arr[5].squeeze(); + arr.forEach((t) => t.dispose()); + const nmsT = await tfjs_esm_exports.image.nonMaxSuppressionAsync(boxesT, scoresT, config3.object.maxDetected, config3.object.iouThreshold, config3.object.minConfidence); + boxesT.dispose(); + scoresT.dispose(); + classesT.dispose(); + const nms = nmsT.dataSync(); + nmsT.dispose(); + let i = 0; + for (const id of nms) { + const score3 = Math.trunc(100 * detections[0][id][4]) / 100; + const classVal = detections[0][id][5]; + const label = labels[classVal].label; + const boxRaw3 = [ + detections[0][id][0] / inputSize, + detections[0][id][1] / inputSize, + detections[0][id][2] / inputSize, + detections[0][id][3] / inputSize + ]; + const box6 = [ + Math.trunc(boxRaw3[0] * outputShape[0]), + Math.trunc(boxRaw3[1] * outputShape[1]), + Math.trunc(boxRaw3[2] * outputShape[0]), + Math.trunc(boxRaw3[3] * outputShape[1]) + ]; + results.push({ id: i++, score: score3, class: classVal, label, box: box6, boxRaw: boxRaw3 }); + } + return results; +} +async function predict10(input, config3) { + if (skipped6 < config3.object.skipFrames && config3.skipFrame && last4.length > 0) { + skipped6++; + return last4; + } + skipped6 = 0; + return new Promise(async (resolve) => { + const outputSize = [input.shape[2], input.shape[1]]; + const resize = tfjs_esm_exports.image.resizeBilinear(input, [model8.inputSize, model8.inputSize]); + const objectT = config3.object.enabled ? model8.execute(resize, ["tower_0/detections"]) : null; + resize.dispose(); + const obj = await process3(objectT, model8.inputSize, outputSize, config3); + last4 = obj; + resolve(obj); + }); +} + +// src/gesture/gesture.ts +var body = (res) => { + if (!res) + return []; + const gestures = []; + for (let i = 0; i < res.length; i++) { + const leftWrist = res[i].keypoints.find((a) => a.part === "leftWrist"); + const rightWrist = res[i].keypoints.find((a) => a.part === "rightWrist"); + const nose = res[i].keypoints.find((a) => a.part === "nose"); + if (nose && leftWrist && rightWrist && leftWrist.position.y < nose.position.y && rightWrist.position.y < nose.position.y) + gestures.push({ body: i, gesture: "i give up" }); + else if (nose && leftWrist && leftWrist.position.y < nose.position.y) + gestures.push({ body: i, gesture: "raise left hand" }); + else if (nose && rightWrist && rightWrist.position.y < nose.position.y) + gestures.push({ body: i, gesture: "raise right hand" }); + const leftShoulder = res[i].keypoints.find((a) => a.part === "leftShoulder"); + const rightShoulder = res[i].keypoints.find((a) => a.part === "rightShoulder"); + if (leftShoulder && rightShoulder) + gestures.push({ body: i, gesture: `leaning ${leftShoulder.position.y > rightShoulder.position.y ? "left" : "right"}` }); + } + return gestures; +}; +var face = (res) => { + if (!res) + return []; + const gestures = []; + for (let i = 0; i < res.length; i++) { + if (res[i].mesh && res[i].mesh.length > 0) { + const eyeFacing = res[i].mesh[33][2] - res[i].mesh[263][2]; + if (Math.abs(eyeFacing) < 10) + gestures.push({ face: i, gesture: "facing center" }); + else + gestures.push({ face: i, gesture: `facing ${eyeFacing < 0 ? "left" : "right"}` }); + 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]); + if (openLeft < 0.2) + gestures.push({ face: i, gesture: "blink left eye" }); + 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]); + if (openRight < 0.2) + gestures.push({ face: i, gesture: "blink right eye" }); + 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])); + if (mouthOpen > 10) + gestures.push({ face: i, gesture: `mouth ${Math.trunc(mouthOpen)}% open` }); + const chinDepth = res[i].mesh[152][2]; + if (Math.abs(chinDepth) > 10) + gestures.push({ face: i, gesture: `head ${chinDepth < 0 ? "up" : "down"}` }); + } + } + return gestures; +}; +var iris = (res) => { + if (!res) + return []; + const gestures = []; + for (let i = 0; i < res.length; i++) { + if (!res[i].annotations || !res[i].annotations.leftEyeIris || !res[i].annotations.rightEyeIris) + continue; + const sizeXLeft = res[i].annotations.leftEyeIris[3][0] - res[i].annotations.leftEyeIris[1][0]; + const sizeYLeft = res[i].annotations.leftEyeIris[4][1] - res[i].annotations.leftEyeIris[2][1]; + const areaLeft = Math.abs(sizeXLeft * sizeYLeft); + const sizeXRight = res[i].annotations.rightEyeIris[3][0] - res[i].annotations.rightEyeIris[1][0]; + const sizeYRight = res[i].annotations.rightEyeIris[4][1] - res[i].annotations.rightEyeIris[2][1]; + const areaRight = Math.abs(sizeXRight * sizeYRight); + let center = false; + const difference = Math.abs(areaLeft - areaRight) / Math.max(areaLeft, areaRight); + if (difference < 0.25) { + center = true; + gestures.push({ iris: i, gesture: "facing center" }); + } + const rightIrisCenterX = Math.abs(res[i].mesh[33][0] - res[i].annotations.rightEyeIris[0][0]) / res[i].box[2]; + const leftIrisCenterX = Math.abs(res[i].mesh[263][0] - res[i].annotations.leftEyeIris[0][0]) / res[i].box[2]; + if (leftIrisCenterX > 0.06 || rightIrisCenterX > 0.06) + center = false; + if (leftIrisCenterX > 0.06) + gestures.push({ iris: i, gesture: "looking right" }); + if (rightIrisCenterX > 0.06) + gestures.push({ iris: i, gesture: "looking left" }); + const rightIrisCenterY = Math.abs(res[i].mesh[145][1] - res[i].annotations.rightEyeIris[0][1]) / res[i].box[3]; + const leftIrisCenterY = Math.abs(res[i].mesh[374][1] - res[i].annotations.leftEyeIris[0][1]) / res[i].box[3]; + if (leftIrisCenterY < 0.01 || rightIrisCenterY < 0.01 || leftIrisCenterY > 0.022 || rightIrisCenterY > 0.022) + center = false; + if (leftIrisCenterY < 0.01 || rightIrisCenterY < 0.01) + gestures.push({ iris: i, gesture: "looking down" }); + if (leftIrisCenterY > 0.022 || rightIrisCenterY > 0.022) + gestures.push({ iris: i, gesture: "looking up" }); + if (center) + gestures.push({ iris: i, gesture: "looking center" }); + } + return gestures; +}; +var hand = (res) => { + if (!res) + return []; + const gestures = []; + for (let i = 0; i < res.length; i++) { + const fingers = []; + for (const [finger, pos] of Object.entries(res[i]["annotations"])) { + if (finger !== "palmBase" && Array.isArray(pos)) + fingers.push({ name: finger.toLowerCase(), position: pos[0] }); + } + if (fingers && fingers.length > 0) { + const closest = fingers.reduce((best, a) => best.position[2] < a.position[2] ? best : a); + const highest = fingers.reduce((best, a) => best.position[1] < a.position[1] ? best : a); + gestures.push({ hand: i, gesture: `${closest.name} forward ${highest.name} up` }); + } + } + return gestures; +}; + +// src/image/imagefx.js +function GLProgram(gl, vertexSource, fragmentSource) { + const _collect = function(source, prefix, collection) { + const r = new RegExp("\\b" + prefix + " \\w+ (\\w+)", "ig"); + source.replace(r, (match2, name) => { + collection[name] = 0; + return match2; + }); + }; + const _compile = function(source, type) { + const shader = gl.createShader(type); + gl.shaderSource(shader, source); + gl.compileShader(shader); + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) + throw new Error("Filter: GL compile failed", gl.getShaderInfoLog(shader)); + return shader; + }; + this.uniform = {}; + this.attribute = {}; + const _vsh = _compile(vertexSource, gl.VERTEX_SHADER); + const _fsh = _compile(fragmentSource, gl.FRAGMENT_SHADER); + this.id = gl.createProgram(); + gl.attachShader(this.id, _vsh); + gl.attachShader(this.id, _fsh); + gl.linkProgram(this.id); + if (!gl.getProgramParameter(this.id, gl.LINK_STATUS)) + throw new Error("Filter: GL link failed", gl.getProgramInfoLog(this.id)); + gl.useProgram(this.id); + _collect(vertexSource, "attribute", this.attribute); + for (const a in this.attribute) + this.attribute[a] = gl.getAttribLocation(this.id, a); + _collect(vertexSource, "uniform", this.uniform); + _collect(fragmentSource, "uniform", this.uniform); + for (const u in this.uniform) + this.uniform[u] = gl.getUniformLocation(this.id, u); +} +function GLImageFilter(params) { + if (!params) + params = {}; + let _drawCount = 0; + let _sourceTexture = null; + let _lastInChain = false; + let _currentFramebufferIndex = -1; + let _tempFramebuffers = [null, null]; + let _filterChain = []; + let _width = -1; + let _height = -1; + let _vertexBuffer = null; + let _currentProgram = null; + const _filter = {}; + const _canvas = params.canvas || document.createElement("canvas"); + const _shaderProgramCache = {}; + const DRAW = { INTERMEDIATE: 1 }; + const gl = _canvas.getContext("webgl"); + if (!gl) + throw new Error("Filter: getContext() failed"); + this.addFilter = function(name) { + const args = Array.prototype.slice.call(arguments, 1); + const filter = _filter[name]; + _filterChain.push({ func: filter, args }); + }; + this.reset = function() { + _filterChain = []; + }; + const _resize = function(width, height) { + if (width === _width && height === _height) { + return; + } + _canvas.width = width; + _width = width; + _canvas.height = height; + _height = height; + if (!_vertexBuffer) { + 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 + ]); + _vertexBuffer = gl.createBuffer(), gl.bindBuffer(gl.ARRAY_BUFFER, _vertexBuffer); + gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW); + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + } + gl.viewport(0, 0, _width, _height); + _tempFramebuffers = [null, null]; + }; + const _createFramebufferTexture = function(width, height) { + const fbo = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); + const renderbuffer = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer); + const texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, texture); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); + gl.bindTexture(gl.TEXTURE_2D, null); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + return { fbo, texture }; + }; + const _getTempFramebuffer = function(index) { + _tempFramebuffers[index] = _tempFramebuffers[index] || _createFramebufferTexture(_width, _height); + return _tempFramebuffers[index]; + }; + const _draw = function(flags = null) { + var _a, _b; + let source = null; + let target = null; + let flipY = false; + if (_drawCount === 0) { + source = _sourceTexture; + } else { + source = (_a = _getTempFramebuffer(_currentFramebufferIndex)) == null ? void 0 : _a.texture; + } + _drawCount++; + if (_lastInChain && !(flags & DRAW.INTERMEDIATE)) { + target = null; + flipY = _drawCount % 2 === 0; + } else { + _currentFramebufferIndex = (_currentFramebufferIndex + 1) % 2; + target = (_b = _getTempFramebuffer(_currentFramebufferIndex)) == null ? void 0 : _b.fbo; + } + gl.bindTexture(gl.TEXTURE_2D, source); + gl.bindFramebuffer(gl.FRAMEBUFFER, target); + gl.uniform1f(_currentProgram.uniform.flipY, flipY ? -1 : 1); + gl.drawArrays(gl.TRIANGLES, 0, 6); + }; + this.apply = function(image15) { + _resize(image15.width, image15.height); + _drawCount = 0; + if (!_sourceTexture) + _sourceTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, _sourceTexture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image15); + if (_filterChain.length === 0) { + _draw(); + return _canvas; + } + for (let i = 0; i < _filterChain.length; i++) { + _lastInChain = i === _filterChain.length - 1; + const f = _filterChain[i]; + f.func.apply(this, f.args || []); + } + return _canvas; + }; + const _compileShader = function(fragmentSource) { + if (_shaderProgramCache[fragmentSource]) { + _currentProgram = _shaderProgramCache[fragmentSource]; + gl.useProgram(_currentProgram.id); + return _currentProgram; + } + const SHADER = {}; + SHADER.VERTEX_IDENTITY = [ + "precision highp float;", + "attribute vec2 pos;", + "attribute vec2 uv;", + "varying vec2 vUv;", + "uniform float flipY;", + "void main(void) {", + "vUv = uv;", + "gl_Position = vec4(pos.x, pos.y*flipY, 0.0, 1.);", + "}" + ].join("\n"); + SHADER.FRAGMENT_IDENTITY = [ + "precision highp float;", + "varying vec2 vUv;", + "uniform sampler2D texture;", + "void main(void) {", + "gl_FragColor = texture2D(texture, vUv);", + "}" + ].join("\n"); + _currentProgram = new GLProgram(gl, SHADER.VERTEX_IDENTITY, fragmentSource); + const floatSize = Float32Array.BYTES_PER_ELEMENT; + const vertSize = 4 * floatSize; + gl.enableVertexAttribArray(_currentProgram.attribute.pos); + gl.vertexAttribPointer(_currentProgram.attribute.pos, 2, gl.FLOAT, false, vertSize, 0 * floatSize); + gl.enableVertexAttribArray(_currentProgram.attribute.uv); + gl.vertexAttribPointer(_currentProgram.attribute.uv, 2, gl.FLOAT, false, vertSize, 2 * floatSize); + _shaderProgramCache[fragmentSource] = _currentProgram; + return _currentProgram; + }; + _filter.colorMatrix = function(matrix) { + const m = new Float32Array(matrix); + m[4] /= 255; + m[9] /= 255; + m[14] /= 255; + m[19] /= 255; + 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 ? _filter.colorMatrix.SHADER.WITHOUT_ALPHA : _filter.colorMatrix.SHADER.WITH_ALPHA; + const program = _compileShader(shader); + gl.uniform1fv(program.uniform.m, m); + _draw(); + }; + _filter.colorMatrix.SHADER = {}; + _filter.colorMatrix.SHADER.WITH_ALPHA = [ + "precision highp float;", + "varying vec2 vUv;", + "uniform sampler2D texture;", + "uniform float m[20];", + "void main(void) {", + "vec4 c = texture2D(texture, vUv);", + "gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[3] * c.a + m[4];", + "gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[8] * c.a + m[9];", + "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];", + "}" + ].join("\n"); + _filter.colorMatrix.SHADER.WITHOUT_ALPHA = [ + "precision highp float;", + "varying vec2 vUv;", + "uniform sampler2D texture;", + "uniform float m[20];", + "void main(void) {", + "vec4 c = texture2D(texture, vUv);", + "gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[4];", + "gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[9];", + "gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[14];", + "gl_FragColor.a = c.a;", + "}" + ].join("\n"); + _filter.brightness = function(brightness) { + const b = (brightness || 0) + 1; + _filter.colorMatrix([ + b, + 0, + 0, + 0, + 0, + 0, + b, + 0, + 0, + 0, + 0, + 0, + b, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.saturation = function(amount) { + const x = (amount || 0) * 2 / 3 + 1; + const y = (x - 1) * -0.5; + _filter.colorMatrix([ + x, + y, + y, + 0, + 0, + y, + x, + y, + 0, + 0, + y, + y, + x, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.desaturate = function() { + _filter.saturation(-1); + }; + _filter.contrast = function(amount) { + const v = (amount || 0) + 1; + const o = -128 * (v - 1); + _filter.colorMatrix([ + v, + 0, + 0, + 0, + o, + 0, + v, + 0, + 0, + o, + 0, + 0, + v, + 0, + o, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.negative = function() { + _filter.contrast(-2); + }; + _filter.hue = function(rotation) { + rotation = (rotation || 0) / 180 * Math.PI; + const cos = Math.cos(rotation); + const sin = Math.sin(rotation); + const lumR = 0.213; + const lumG = 0.715; + const lumB = 0.072; + _filter.colorMatrix([ + lumR + cos * (1 - lumR) + sin * -lumR, + lumG + cos * -lumG + sin * -lumG, + lumB + cos * -lumB + sin * (1 - lumB), + 0, + 0, + lumR + cos * -lumR + sin * 0.143, + lumG + cos * (1 - lumG) + sin * 0.14, + lumB + cos * -lumB + sin * -0.283, + 0, + 0, + lumR + cos * -lumR + sin * -(1 - lumR), + lumG + cos * -lumG + sin * lumG, + lumB + cos * (1 - lumB) + sin * lumB, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.desaturateLuminance = function() { + _filter.colorMatrix([ + 0.2764723, + 0.929708, + 0.0938197, + 0, + -37.1, + 0.2764723, + 0.929708, + 0.0938197, + 0, + -37.1, + 0.2764723, + 0.929708, + 0.0938197, + 0, + -37.1, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.sepia = function() { + _filter.colorMatrix([ + 0.393, + 0.7689999, + 0.18899999, + 0, + 0, + 0.349, + 0.6859999, + 0.16799999, + 0, + 0, + 0.272, + 0.5339999, + 0.13099999, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.brownie = function() { + _filter.colorMatrix([ + 0.5997023498159715, + 0.34553243048391263, + -0.2708298674538042, + 0, + 47.43192855600873, + -0.037703249837783157, + 0.8609577587992641, + 0.15059552388459913, + 0, + -36.96841498319127, + 0.24113635128153335, + -0.07441037908422492, + 0.44972182064877153, + 0, + -7.562075277591283, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.vintagePinhole = function() { + _filter.colorMatrix([ + 0.6279345635605994, + 0.3202183420819367, + -0.03965408211312453, + 0, + 9.651285835294123, + 0.02578397704808868, + 0.6441188644374771, + 0.03259127616149294, + 0, + 7.462829176470591, + 0.0466055556782719, + -0.0851232987247891, + 0.5241648018700465, + 0, + 5.159190588235296, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.kodachrome = function() { + _filter.colorMatrix([ + 1.1285582396593525, + -0.3967382283601348, + -0.03992559172921793, + 0, + 63.72958762196502, + -0.16404339962244616, + 1.0835251566291304, + -0.05498805115633132, + 0, + 24.732407896706203, + -0.16786010706155763, + -0.5603416277695248, + 1.6014850761964943, + 0, + 35.62982807460946, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.technicolor = function() { + _filter.colorMatrix([ + 1.9125277891456083, + -0.8545344976951645, + -0.09155508482755585, + 0, + 11.793603434377337, + -0.3087833385928097, + 1.7658908555458428, + -0.10601743074722245, + 0, + -70.35205161461398, + -0.231103377548616, + -0.7501899197440212, + 1.847597816108189, + 0, + 30.950940869491138, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.polaroid = function() { + _filter.colorMatrix([ + 1.438, + -0.062, + -0.062, + 0, + 0, + -0.122, + 1.378, + -0.122, + 0, + 0, + -0.016, + -0.016, + 1.483, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.shiftToBGR = function() { + _filter.colorMatrix([ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.convolution = function(matrix) { + const m = new Float32Array(matrix); + const pixelSizeX = 1 / _width; + const pixelSizeY = 1 / _height; + const program = _compileShader(_filter.convolution.SHADER); + gl.uniform1fv(program.uniform.m, m); + gl.uniform2f(program.uniform.px, pixelSizeX, pixelSizeY); + _draw(); + }; + _filter.convolution.SHADER = [ + "precision highp float;", + "varying vec2 vUv;", + "uniform sampler2D texture;", + "uniform vec2 px;", + "uniform float m[9];", + "void main(void) {", + "vec4 c11 = texture2D(texture, vUv - px);", + "vec4 c12 = texture2D(texture, vec2(vUv.x, vUv.y - px.y));", + "vec4 c13 = texture2D(texture, vec2(vUv.x + px.x, vUv.y - px.y));", + "vec4 c21 = texture2D(texture, vec2(vUv.x - px.x, vUv.y) );", + "vec4 c22 = texture2D(texture, vUv);", + "vec4 c23 = texture2D(texture, vec2(vUv.x + px.x, vUv.y) );", + "vec4 c31 = texture2D(texture, vec2(vUv.x - px.x, vUv.y + px.y) );", + "vec4 c32 = texture2D(texture, vec2(vUv.x, vUv.y + px.y) );", + "vec4 c33 = texture2D(texture, vUv + px );", + "gl_FragColor = ", + "c11 * m[0] + c12 * m[1] + c22 * m[2] +", + "c21 * m[3] + c22 * m[4] + c23 * m[5] +", + "c31 * m[6] + c32 * m[7] + c33 * m[8];", + "gl_FragColor.a = c22.a;", + "}" + ].join("\n"); + _filter.detectEdges = function() { + _filter.convolution.call(this, [ + 0, + 1, + 0, + 1, + -4, + 1, + 0, + 1, + 0 + ]); + }; + _filter.sobelX = function() { + _filter.convolution.call(this, [ + -1, + 0, + 1, + -2, + 0, + 2, + -1, + 0, + 1 + ]); + }; + _filter.sobelY = function() { + _filter.convolution.call(this, [ + -1, + -2, + -1, + 0, + 0, + 0, + 1, + 2, + 1 + ]); + }; + _filter.sharpen = function(amount) { + const a = amount || 1; + _filter.convolution.call(this, [ + 0, + -1 * a, + 0, + -1 * a, + 1 + 4 * a, + -1 * a, + 0, + -1 * a, + 0 + ]); + }; + _filter.emboss = function(size) { + const s = size || 1; + _filter.convolution.call(this, [ + -2 * s, + -1 * s, + 0, + -1 * s, + 1, + 1 * s, + 0, + 1 * s, + 2 * s + ]); + }; + _filter.blur = function(size) { + const blurSizeX = size / 7 / _width; + const blurSizeY = size / 7 / _height; + const program = _compileShader(_filter.blur.SHADER); + gl.uniform2f(program.uniform.px, 0, blurSizeY); + _draw(DRAW.INTERMEDIATE); + gl.uniform2f(program.uniform.px, blurSizeX, 0); + _draw(); + }; + _filter.blur.SHADER = [ + "precision highp float;", + "varying vec2 vUv;", + "uniform sampler2D texture;", + "uniform vec2 px;", + "void main(void) {", + "gl_FragColor = vec4(0.0);", + "gl_FragColor += texture2D(texture, vUv + vec2(-7.0*px.x, -7.0*px.y))*0.0044299121055113265;", + "gl_FragColor += texture2D(texture, vUv + vec2(-6.0*px.x, -6.0*px.y))*0.00895781211794;", + "gl_FragColor += texture2D(texture, vUv + vec2(-5.0*px.x, -5.0*px.y))*0.0215963866053;", + "gl_FragColor += texture2D(texture, vUv + vec2(-4.0*px.x, -4.0*px.y))*0.0443683338718;", + "gl_FragColor += texture2D(texture, vUv + vec2(-3.0*px.x, -3.0*px.y))*0.0776744219933;", + "gl_FragColor += texture2D(texture, vUv + vec2(-2.0*px.x, -2.0*px.y))*0.115876621105;", + "gl_FragColor += texture2D(texture, vUv + vec2(-1.0*px.x, -1.0*px.y))*0.147308056121;", + "gl_FragColor += texture2D(texture, vUv )*0.159576912161;", + "gl_FragColor += texture2D(texture, vUv + vec2( 1.0*px.x, 1.0*px.y))*0.147308056121;", + "gl_FragColor += texture2D(texture, vUv + vec2( 2.0*px.x, 2.0*px.y))*0.115876621105;", + "gl_FragColor += texture2D(texture, vUv + vec2( 3.0*px.x, 3.0*px.y))*0.0776744219933;", + "gl_FragColor += texture2D(texture, vUv + vec2( 4.0*px.x, 4.0*px.y))*0.0443683338718;", + "gl_FragColor += texture2D(texture, vUv + vec2( 5.0*px.x, 5.0*px.y))*0.0215963866053;", + "gl_FragColor += texture2D(texture, vUv + vec2( 6.0*px.x, 6.0*px.y))*0.00895781211794;", + "gl_FragColor += texture2D(texture, vUv + vec2( 7.0*px.x, 7.0*px.y))*0.0044299121055113265;", + "}" + ].join("\n"); + _filter.pixelate = function(size) { + const blurSizeX = size / _width; + const blurSizeY = size / _height; + const program = _compileShader(_filter.pixelate.SHADER); + gl.uniform2f(program.uniform.size, blurSizeX, blurSizeY); + _draw(); + }; + _filter.pixelate.SHADER = [ + "precision highp float;", + "varying vec2 vUv;", + "uniform vec2 size;", + "uniform sampler2D texture;", + "vec2 pixelate(vec2 coord, vec2 size) {", + "return floor( coord / size ) * size;", + "}", + "void main(void) {", + "gl_FragColor = vec4(0.0);", + "vec2 coord = pixelate(vUv, size);", + "gl_FragColor += texture2D(texture, coord);", + "}" + ].join("\n"); +} + +// src/image/image.ts +var maxSize = 2048; +var inCanvas; +var outCanvas; +var fx; +function process4(input, config3) { + let tensor2; + if (!input) + throw new Error("Human: Input is missing"); + if (!(input instanceof tfjs_esm_exports.Tensor) && !(typeof Image !== "undefined" && input instanceof Image) && !(typeof ImageData !== "undefined" && input instanceof ImageData) && !(typeof ImageBitmap !== "undefined" && input instanceof ImageBitmap) && !(typeof HTMLImageElement !== "undefined" && input instanceof HTMLImageElement) && !(typeof HTMLMediaElement !== "undefined" && input instanceof HTMLMediaElement) && !(typeof HTMLVideoElement !== "undefined" && input instanceof HTMLVideoElement) && !(typeof HTMLCanvasElement !== "undefined" && input instanceof HTMLCanvasElement) && !(typeof OffscreenCanvas !== "undefined" && input instanceof OffscreenCanvas)) { + throw new Error("Human: Input type is not recognized"); + } + if (input instanceof tfjs_esm_exports.Tensor) { + if (input.shape && input.shape.length === 4 && input.shape[0] === 1 && input.shape[3] === 3) + tensor2 = tfjs_esm_exports.clone(input); + else + throw new Error(`Human: Input tensor shape must be [1, height, width, 3] and instead was ${input.shape}`); + } else { + const originalWidth = input["naturalWidth"] || input["videoWidth"] || input["width"] || input["shape"] && input["shape"][1] > 0; + const originalHeight = input["naturalHeight"] || input["videoHeight"] || input["height"] || input["shape"] && input["shape"][2] > 0; + if (!originalWidth || !originalHeight) + return { tensor: null, canvas: inCanvas }; + let targetWidth = originalWidth; + let targetHeight = originalHeight; + if (targetWidth > maxSize) { + targetWidth = maxSize; + targetHeight = targetWidth * originalHeight / originalWidth; + } + if (targetHeight > maxSize) { + targetHeight = maxSize; + targetWidth = targetHeight * originalWidth / originalHeight; + } + if (config3.filter.width > 0) + targetWidth = config3.filter.width; + else if (config3.filter.height > 0) + targetWidth = originalWidth * (config3.filter.height / originalHeight); + if (config3.filter.height > 0) + targetHeight = config3.filter.height; + else if (config3.filter.width > 0) + targetHeight = originalHeight * (config3.filter.width / originalWidth); + if (!targetWidth || !targetHeight) + throw new Error("Human: Input cannot determine dimension"); + if (!inCanvas || (inCanvas == null ? void 0 : inCanvas.width) !== targetWidth || (inCanvas == null ? void 0 : inCanvas.height) !== targetHeight) { + inCanvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement("canvas"); + if ((inCanvas == null ? void 0 : inCanvas.width) !== targetWidth) + inCanvas.width = targetWidth; + if ((inCanvas == null ? void 0 : inCanvas.height) !== targetHeight) + inCanvas.height = targetHeight; + } + const ctx = inCanvas.getContext("2d"); + if (input instanceof ImageData) { + ctx.putImageData(input, 0, 0); + } else { + if (config3.filter.flip && typeof ctx.translate !== "undefined") { + ctx.translate(originalWidth, 0); + ctx.scale(-1, 1); + ctx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas == null ? void 0 : inCanvas.width, inCanvas == null ? void 0 : inCanvas.height); + ctx.setTransform(1, 0, 0, 1, 0, 0); + } else { + ctx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas == null ? void 0 : inCanvas.width, inCanvas == null ? void 0 : inCanvas.height); + } + } + if (config3.filter.enabled) { + if (!fx || !outCanvas || inCanvas.width !== outCanvas.width || (inCanvas == null ? void 0 : inCanvas.height) !== (outCanvas == null ? void 0 : outCanvas.height)) { + outCanvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(inCanvas == null ? void 0 : inCanvas.width, inCanvas == null ? void 0 : inCanvas.height) : document.createElement("canvas"); + if ((outCanvas == null ? void 0 : outCanvas.width) !== (inCanvas == null ? void 0 : inCanvas.width)) + outCanvas.width = inCanvas == null ? void 0 : inCanvas.width; + if ((outCanvas == null ? void 0 : outCanvas.height) !== (inCanvas == null ? void 0 : inCanvas.height)) + outCanvas.height = inCanvas == null ? void 0 : inCanvas.height; + fx = tfjs_esm_exports.ENV.flags.IS_BROWSER ? new GLImageFilter({ canvas: outCanvas }) : null; + } + if (!fx) + return { tensor: null, canvas: inCanvas }; + fx.reset(); + fx.addFilter("brightness", config3.filter.brightness); + if (config3.filter.contrast !== 0) + fx.addFilter("contrast", config3.filter.contrast); + if (config3.filter.sharpness !== 0) + fx.addFilter("sharpen", config3.filter.sharpness); + if (config3.filter.blur !== 0) + fx.addFilter("blur", config3.filter.blur); + if (config3.filter.saturation !== 0) + fx.addFilter("saturation", config3.filter.saturation); + if (config3.filter.hue !== 0) + fx.addFilter("hue", config3.filter.hue); + if (config3.filter.negative) + fx.addFilter("negative"); + if (config3.filter.sepia) + fx.addFilter("sepia"); + if (config3.filter.vintage) + fx.addFilter("brownie"); + if (config3.filter.sepia) + fx.addFilter("sepia"); + if (config3.filter.kodachrome) + fx.addFilter("kodachrome"); + if (config3.filter.technicolor) + fx.addFilter("technicolor"); + if (config3.filter.polaroid) + fx.addFilter("polaroid"); + if (config3.filter.pixelate !== 0) + fx.addFilter("pixelate", config3.filter.pixelate); + fx.apply(inCanvas); + } else { + outCanvas = inCanvas; + if (fx) + fx = null; + } + let pixels; + if (outCanvas.data) { + const shape = [outCanvas.height, outCanvas.width, 3]; + pixels = tfjs_esm_exports.tensor3d(outCanvas.data, shape, "int32"); + } else if (outCanvas instanceof ImageData) { + pixels = tfjs_esm_exports.browser.fromPixels(outCanvas); + } else if (config3.backend === "webgl" || config3.backend === "humangl") { + const tempCanvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement("canvas"); + tempCanvas.width = targetWidth; + tempCanvas.height = targetHeight; + const tempCtx = tempCanvas.getContext("2d"); + tempCtx == null ? void 0 : tempCtx.drawImage(outCanvas, 0, 0); + pixels = tfjs_esm_exports.browser.fromPixels(tempCanvas); + } else { + const tempCanvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement("canvas"); + tempCanvas.width = targetWidth; + tempCanvas.height = targetHeight; + const tempCtx = tempCanvas.getContext("2d"); + tempCtx == null ? void 0 : tempCtx.drawImage(outCanvas, 0, 0); + const data2 = tempCtx == null ? void 0 : tempCtx.getImageData(0, 0, targetWidth, targetHeight); + pixels = tfjs_esm_exports.browser.fromPixels(data2); + } + const casted = pixels.toFloat(); + tensor2 = casted.expandDims(0); + pixels.dispose(); + casted.dispose(); + } + const canvas2 = config3.filter.return ? outCanvas : null; + return { tensor: tensor2, canvas: canvas2 }; +} + +// src/draw/draw.ts +var draw_exports = {}; +__export(draw_exports, { + all: () => all, + body: () => body2, + canvas: () => canvas, + face: () => face2, + gesture: () => gesture, + hand: () => hand2, + object: () => object, + options: () => options, + person: () => person +}); +var options = { + color: "rgba(173, 216, 230, 0.6)", + labelColor: "rgba(173, 216, 230, 1)", + shadowColor: "black", + font: 'small-caps 14px "Segoe UI"', + lineHeight: 24, + lineWidth: 6, + pointSize: 2, + roundRect: 28, + drawPoints: false, + drawLabels: true, + drawBoxes: true, + drawPolygons: true, + drawGaze: true, + fillPolygons: false, + useDepth: true, + useCurves: false, + bufferedOutput: true +}; +var rad2deg = (theta) => Math.round(theta * 180 / Math.PI); +function point(ctx, x, y, z = 0, localOptions) { + ctx.fillStyle = localOptions.useDepth && z ? `rgba(${127.5 + 2 * z}, ${127.5 - 2 * z}, 255, 0.3)` : localOptions.color; + ctx.beginPath(); + ctx.arc(x, y, localOptions.pointSize, 0, 2 * Math.PI); + ctx.fill(); +} +function rect(ctx, x, y, width, height, localOptions) { + ctx.beginPath(); + if (localOptions.useCurves) { + const cx = (x + x + width) / 2; + const cy = (y + y + height) / 2; + ctx.ellipse(cx, cy, width / 2, height / 2, 0, 0, 2 * Math.PI); + } else { + ctx.lineWidth = localOptions.lineWidth; + ctx.moveTo(x + localOptions.roundRect, y); + ctx.lineTo(x + width - localOptions.roundRect, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + localOptions.roundRect); + ctx.lineTo(x + width, y + height - localOptions.roundRect); + ctx.quadraticCurveTo(x + width, y + height, x + width - localOptions.roundRect, y + height); + ctx.lineTo(x + localOptions.roundRect, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - localOptions.roundRect); + ctx.lineTo(x, y + localOptions.roundRect); + ctx.quadraticCurveTo(x, y, x + localOptions.roundRect, y); + ctx.closePath(); + } + ctx.stroke(); +} +function lines(ctx, points = [], localOptions) { + if (points === void 0 || points.length === 0) + return; + ctx.beginPath(); + ctx.moveTo(points[0][0], points[0][1]); + for (const pt of points) { + const z = pt[2] || 0; + ctx.strokeStyle = localOptions.useDepth && z ? `rgba(${127.5 + 2 * z}, ${127.5 - 2 * z}, 255, 0.3)` : localOptions.color; + ctx.fillStyle = localOptions.useDepth && z ? `rgba(${127.5 + 2 * z}, ${127.5 - 2 * z}, 255, 0.3)` : localOptions.color; + ctx.lineTo(pt[0], Math.round(pt[1])); + } + ctx.stroke(); + if (localOptions.fillPolygons) { + ctx.closePath(); + ctx.fill(); + } +} +function curves(ctx, points = [], localOptions) { + if (points === void 0 || points.length === 0) + return; + if (!localOptions.useCurves || points.length <= 2) { + lines(ctx, points, localOptions); + return; + } + ctx.moveTo(points[0][0], points[0][1]); + for (let i = 0; i < points.length - 2; i++) { + const xc = (points[i][0] + points[i + 1][0]) / 2; + const yc = (points[i][1] + points[i + 1][1]) / 2; + ctx.quadraticCurveTo(points[i][0], points[i][1], xc, yc); + } + ctx.quadraticCurveTo(points[points.length - 2][0], points[points.length - 2][1], points[points.length - 1][0], points[points.length - 1][1]); + ctx.stroke(); + if (localOptions.fillPolygons) { + ctx.closePath(); + ctx.fill(); + } +} +async function gesture(inCanvas2, result, drawOptions) { + const localOptions = mergeDeep(options, drawOptions); + if (!result || !inCanvas2) + return; + if (!(inCanvas2 instanceof HTMLCanvasElement)) + return; + const ctx = inCanvas2.getContext("2d"); + if (!ctx) + return; + ctx.font = localOptions.font; + ctx.fillStyle = localOptions.color; + let i = 1; + for (let j = 0; j < result.length; j++) { + let where = []; + let what = []; + [where, what] = Object.entries(result[j]); + if (what.length > 1 && what[1].length > 0) { + const who = where[1] > 0 ? `#${where[1]}` : ""; + const label = `${where[0]} ${who}: ${what[1]}`; + if (localOptions.shadowColor && localOptions.shadowColor !== "") { + ctx.fillStyle = localOptions.shadowColor; + ctx.fillText(label, 8, 2 + i * localOptions.lineHeight); + } + ctx.fillStyle = localOptions.labelColor; + ctx.fillText(label, 6, 0 + i * localOptions.lineHeight); + i += 1; + } + } +} +async function face2(inCanvas2, result, drawOptions) { + var _a, _b, _c, _d; + const localOptions = mergeDeep(options, drawOptions); + if (!result || !inCanvas2) + return; + if (!(inCanvas2 instanceof HTMLCanvasElement)) + return; + const ctx = inCanvas2.getContext("2d"); + if (!ctx) + return; + for (const f of result) { + ctx.font = localOptions.font; + ctx.strokeStyle = localOptions.color; + ctx.fillStyle = localOptions.color; + if (localOptions.drawBoxes) + rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], localOptions); + const labels2 = []; + labels2.push(`face: ${Math.trunc(100 * f.score)}%`); + if (f.genderScore) + labels2.push(`${f.gender || ""} ${Math.trunc(100 * f.genderScore)}%`); + if (f.age) + labels2.push(`age: ${f.age || ""}`); + if (f.iris) + labels2.push(`distance: ${f.iris}`); + if (f.emotion && f.emotion.length > 0) { + const emotion2 = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`); + if (emotion2.length > 3) + emotion2.length = 3; + labels2.push(emotion2.join(" ")); + } + if (f.rotation && f.rotation.angle && f.rotation.gaze) { + if (f.rotation.angle.roll) + labels2.push(`roll: ${rad2deg(f.rotation.angle.roll)}\xB0 yaw:${rad2deg(f.rotation.angle.yaw)}\xB0 pitch:${rad2deg(f.rotation.angle.pitch)}\xB0`); + if (f.rotation.gaze.bearing) + labels2.push(`gaze: ${rad2deg(f.rotation.gaze.bearing)}\xB0`); + } + if (labels2.length === 0) + labels2.push("face"); + ctx.fillStyle = localOptions.color; + for (let i = labels2.length - 1; i >= 0; i--) { + const x = Math.max(f.box[0], 0); + const y = i * localOptions.lineHeight + f.box[1]; + if (localOptions.shadowColor && localOptions.shadowColor !== "") { + ctx.fillStyle = localOptions.shadowColor; + ctx.fillText(labels2[i], x + 5, y + 16); + } + ctx.fillStyle = localOptions.labelColor; + ctx.fillText(labels2[i], x + 4, y + 15); + } + ctx.lineWidth = 1; + if (f.mesh && f.mesh.length > 0) { + if (localOptions.drawPoints) { + for (const pt of f.mesh) + point(ctx, pt[0], pt[1], pt[2], localOptions); + } + if (localOptions.drawPolygons) { + ctx.lineWidth = 1; + for (let i = 0; i < TRI468.length / 3; i++) { + const points = [ + TRI468[i * 3 + 0], + TRI468[i * 3 + 1], + TRI468[i * 3 + 2] + ].map((index) => f.mesh[index]); + lines(ctx, points, localOptions); + } + if (f.annotations && f.annotations["leftEyeIris"]) { + ctx.strokeStyle = localOptions.useDepth ? "rgba(255, 200, 255, 0.3)" : localOptions.color; + ctx.beginPath(); + const sizeX = Math.abs(f.annotations["leftEyeIris"][3][0] - f.annotations["leftEyeIris"][1][0]) / 2; + const sizeY = Math.abs(f.annotations["leftEyeIris"][4][1] - f.annotations["leftEyeIris"][2][1]) / 2; + ctx.ellipse(f.annotations["leftEyeIris"][0][0], f.annotations["leftEyeIris"][0][1], sizeX, sizeY, 0, 0, 2 * Math.PI); + ctx.stroke(); + if (localOptions.fillPolygons) { + ctx.fillStyle = localOptions.useDepth ? "rgba(255, 255, 200, 0.3)" : localOptions.color; + ctx.fill(); + } + } + if (f.annotations && f.annotations["rightEyeIris"]) { + ctx.strokeStyle = localOptions.useDepth ? "rgba(255, 200, 255, 0.3)" : localOptions.color; + ctx.beginPath(); + const sizeX = Math.abs(f.annotations["rightEyeIris"][3][0] - f.annotations["rightEyeIris"][1][0]) / 2; + const sizeY = Math.abs(f.annotations["rightEyeIris"][4][1] - f.annotations["rightEyeIris"][2][1]) / 2; + ctx.ellipse(f.annotations["rightEyeIris"][0][0], f.annotations["rightEyeIris"][0][1], sizeX, sizeY, 0, 0, 2 * Math.PI); + ctx.stroke(); + if (localOptions.fillPolygons) { + ctx.fillStyle = localOptions.useDepth ? "rgba(255, 255, 200, 0.3)" : localOptions.color; + ctx.fill(); + } + } + if (localOptions.drawGaze && ((_b = (_a = f.rotation) == null ? void 0 : _a.gaze) == null ? void 0 : _b.strength) && ((_d = (_c = f.rotation) == null ? void 0 : _c.gaze) == null ? void 0 : _d.bearing)) { + ctx.strokeStyle = "pink"; + ctx.beginPath(); + const leftGaze = [ + f.annotations["leftEyeIris"][0][0] + Math.sin(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[3], + f.annotations["leftEyeIris"][0][1] + Math.cos(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[2] + ]; + ctx.moveTo(f.annotations["leftEyeIris"][0][0], f.annotations["leftEyeIris"][0][1]); + ctx.lineTo(leftGaze[0], leftGaze[1]); + const rightGaze = [ + f.annotations["rightEyeIris"][0][0] + Math.sin(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[3], + f.annotations["rightEyeIris"][0][1] + Math.cos(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[2] + ]; + ctx.moveTo(f.annotations["rightEyeIris"][0][0], f.annotations["rightEyeIris"][0][1]); + ctx.lineTo(rightGaze[0], rightGaze[1]); + ctx.stroke(); + } + } + } + } +} +async function body2(inCanvas2, result, drawOptions) { + var _a; + const localOptions = mergeDeep(options, drawOptions); + if (!result || !inCanvas2) + return; + if (!(inCanvas2 instanceof HTMLCanvasElement)) + return; + const ctx = inCanvas2.getContext("2d"); + if (!ctx) + return; + ctx.lineJoin = "round"; + for (let i = 0; i < result.length; i++) { + ctx.strokeStyle = localOptions.color; + ctx.fillStyle = localOptions.color; + ctx.lineWidth = localOptions.lineWidth; + ctx.font = localOptions.font; + if (localOptions.drawBoxes && result[i].box && ((_a = result[i].box) == null ? void 0 : _a.length) === 4) { + rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions); + if (localOptions.drawLabels) { + if (localOptions.shadowColor && localOptions.shadowColor !== "") { + ctx.fillStyle = localOptions.shadowColor; + ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 3, 1 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]); + } + ctx.fillStyle = localOptions.labelColor; + ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]); + } + } + if (localOptions.drawPoints) { + for (let pt = 0; pt < result[i].keypoints.length; pt++) { + ctx.fillStyle = localOptions.useDepth && result[i].keypoints[pt].position[2] ? `rgba(${127.5 + 2 * (result[i].keypoints[pt].position[2] || 0)}, ${127.5 - 2 * (result[i].keypoints[pt].position[2] || 0)}, 255, 0.5)` : localOptions.color; + point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions); + } + } + if (localOptions.drawLabels) { + ctx.font = localOptions.font; + if (result[i].keypoints) { + for (const pt of result[i].keypoints) { + ctx.fillStyle = localOptions.useDepth && pt.position[2] ? `rgba(${127.5 + 2 * pt.position[2]}, ${127.5 - 2 * pt.position[2]}, 255, 0.5)` : localOptions.color; + ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position[0] + 4, pt.position[1] + 4); + } + } + } + if (localOptions.drawPolygons && result[i].keypoints) { + let part; + const points = []; + points.length = 0; + part = result[i].keypoints.find((a) => a.part === "leftShoulder"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "rightShoulder"); + if (part) + points.push([part.position[0], part.position[1]]); + curves(ctx, points, localOptions); + points.length = 0; + part = result[i].keypoints.find((a) => a.part === "rightShoulder"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "rightHip"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "leftHip"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "leftShoulder"); + if (part) + points.push([part.position[0], part.position[1]]); + if (points.length === 4) + lines(ctx, points, localOptions); + points.length = 0; + part = result[i].keypoints.find((a) => a.part === "leftHip"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "leftKnee"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "leftAnkle"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "leftHeel"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "leftFoot"); + if (part) + points.push([part.position[0], part.position[1]]); + curves(ctx, points, localOptions); + points.length = 0; + part = result[i].keypoints.find((a) => a.part === "rightHip"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "rightKnee"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "rightAnkle"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "rightHeel"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "rightFoot"); + if (part) + points.push([part.position[0], part.position[1]]); + curves(ctx, points, localOptions); + points.length = 0; + part = result[i].keypoints.find((a) => a.part === "leftShoulder"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "leftElbow"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "leftWrist"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "leftPalm"); + if (part) + points.push([part.position[0], part.position[1]]); + curves(ctx, points, localOptions); + points.length = 0; + part = result[i].keypoints.find((a) => a.part === "rightShoulder"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "rightElbow"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "rightWrist"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "rightPalm"); + if (part) + points.push([part.position[0], part.position[1]]); + curves(ctx, points, localOptions); + } + } +} +async function hand2(inCanvas2, result, drawOptions) { + const localOptions = mergeDeep(options, drawOptions); + if (!result || !inCanvas2) + return; + if (!(inCanvas2 instanceof HTMLCanvasElement)) + return; + const ctx = inCanvas2.getContext("2d"); + if (!ctx) + return; + ctx.lineJoin = "round"; + ctx.font = localOptions.font; + for (const h of result) { + if (localOptions.drawBoxes) { + ctx.strokeStyle = localOptions.color; + ctx.fillStyle = localOptions.color; + rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions); + if (localOptions.drawLabels) { + if (localOptions.shadowColor && localOptions.shadowColor !== "") { + ctx.fillStyle = localOptions.shadowColor; + ctx.fillText("hand", h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]); + } + ctx.fillStyle = localOptions.labelColor; + ctx.fillText("hand", h.box[0] + 2, 0 + h.box[1] + localOptions.lineHeight, h.box[2]); + } + ctx.stroke(); + } + if (localOptions.drawPoints) { + if (h.keypoints && h.keypoints.length > 0) { + for (const pt of h.keypoints) { + ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + 2 * pt[2]}, ${127.5 - 2 * pt[2]}, 255, 0.5)` : localOptions.color; + point(ctx, pt[0], pt[1], 0, localOptions); + } + } + } + if (localOptions.drawLabels) { + const addHandLabel = (part, title) => { + ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + 2 * part[part.length - 1][2]}, ${127.5 - 2 * part[part.length - 1][2]}, 255, 0.5)` : localOptions.color; + ctx.fillText(title, part[part.length - 1][0] + 4, part[part.length - 1][1] + 4); + }; + ctx.font = localOptions.font; + addHandLabel(h.annotations["indexFinger"], "index"); + addHandLabel(h.annotations["middleFinger"], "middle"); + addHandLabel(h.annotations["ringFinger"], "ring"); + addHandLabel(h.annotations["pinky"], "pinky"); + addHandLabel(h.annotations["thumb"], "thumb"); + addHandLabel(h.annotations["palmBase"], "palm"); + } + if (localOptions.drawPolygons) { + const addHandLine = (part) => { + if (!part) + return; + for (let i = 0; i < part.length; i++) { + ctx.beginPath(); + ctx.strokeStyle = localOptions.useDepth ? `rgba(${127.5 + 2 * part[i][2]}, ${127.5 - 2 * part[i][2]}, 255, 0.5)` : localOptions.color; + ctx.moveTo(part[i > 0 ? i - 1 : 0][0], part[i > 0 ? i - 1 : 0][1]); + ctx.lineTo(part[i][0], part[i][1]); + ctx.stroke(); + } + }; + ctx.lineWidth = localOptions.lineWidth; + addHandLine(h.annotations["indexFinger"]); + addHandLine(h.annotations["middleFinger"]); + addHandLine(h.annotations["ringFinger"]); + addHandLine(h.annotations["pinky"]); + addHandLine(h.annotations["thumb"]); + } + } +} +async function object(inCanvas2, result, drawOptions) { + const localOptions = mergeDeep(options, drawOptions); + if (!result || !inCanvas2) + return; + if (!(inCanvas2 instanceof HTMLCanvasElement)) + return; + const ctx = inCanvas2.getContext("2d"); + if (!ctx) + return; + ctx.lineJoin = "round"; + ctx.font = localOptions.font; + for (const h of result) { + if (localOptions.drawBoxes) { + ctx.strokeStyle = localOptions.color; + ctx.fillStyle = localOptions.color; + rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions); + if (localOptions.drawLabels) { + const label = `${Math.round(100 * h.score)}% ${h.label}`; + if (localOptions.shadowColor && localOptions.shadowColor !== "") { + ctx.fillStyle = localOptions.shadowColor; + ctx.fillText(label, h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]); + } + ctx.fillStyle = localOptions.labelColor; + ctx.fillText(label, h.box[0] + 2, 0 + h.box[1] + localOptions.lineHeight, h.box[2]); + } + ctx.stroke(); + } + } +} +async function person(inCanvas2, result, drawOptions) { + const localOptions = mergeDeep(options, drawOptions); + if (!result || !inCanvas2) + return; + if (!(inCanvas2 instanceof HTMLCanvasElement)) + return; + const ctx = inCanvas2.getContext("2d"); + if (!ctx) + return; + ctx.lineJoin = "round"; + ctx.font = localOptions.font; + for (let i = 0; i < result.length; i++) { + if (localOptions.drawBoxes) { + ctx.strokeStyle = localOptions.color; + ctx.fillStyle = localOptions.color; + rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions); + if (localOptions.drawLabels) { + const label = `person #${i}`; + if (localOptions.shadowColor && localOptions.shadowColor !== "") { + ctx.fillStyle = localOptions.shadowColor; + ctx.fillText(label, result[i].box[0] + 3, 1 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]); + } + ctx.fillStyle = localOptions.labelColor; + ctx.fillText(label, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]); + } + ctx.stroke(); + } + } +} +async function canvas(inCanvas2, outCanvas2) { + if (!inCanvas2 || !outCanvas2) + return; + if (!(inCanvas2 instanceof HTMLCanvasElement) || !(outCanvas2 instanceof HTMLCanvasElement)) + return; + const outCtx = inCanvas2.getContext("2d"); + outCtx == null ? void 0 : outCtx.drawImage(inCanvas2, 0, 0); +} +async function all(inCanvas2, result, drawOptions) { + const timestamp = now(); + const localOptions = mergeDeep(options, drawOptions); + if (!result || !inCanvas2) + return; + if (!(inCanvas2 instanceof HTMLCanvasElement)) + return; + face2(inCanvas2, result.face, localOptions); + body2(inCanvas2, result.body, localOptions); + hand2(inCanvas2, result.hand, localOptions); + object(inCanvas2, result.object, localOptions); + gesture(inCanvas2, result.gesture, localOptions); + result.performance.draw = Math.trunc(now() - timestamp); +} + +// src/persons.ts +function join2(faces, bodies, hands, gestures, shape) { + var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p; + let id = 0; + const persons2 = []; + for (const face5 of faces) { + const person2 = { id: id++, face: face5, body: null, hands: { left: null, right: null }, gestures: [], box: [0, 0, 0, 0] }; + for (const body4 of bodies) { + if (face5.box[0] > body4.box[0] && face5.box[0] < body4.box[0] + body4.box[2] && face5.box[1] + face5.box[3] > body4.box[1] && face5.box[1] + face5.box[3] < body4.box[1] + body4.box[3]) { + person2.body = body4; + } + } + if (person2.body) { + for (const hand3 of hands) { + if (hand3.box[0] + hand3.box[2] > person2.body.box[0] && hand3.box[0] + hand3.box[2] < person2.body.box[0] + person2.body.box[2] && hand3.box[1] + hand3.box[3] > person2.body.box[1] && hand3.box[1] + hand3.box[3] < person2.body.box[1] + person2.body.box[3]) { + if (person2.hands) + person2.hands.left = hand3; + } + if (hand3.box[0] < person2.body.box[0] + person2.body.box[2] && hand3.box[0] > person2.body.box[0] && hand3.box[1] + hand3.box[3] > person2.body.box[1] && hand3.box[1] + hand3.box[3] < person2.body.box[1] + person2.body.box[3]) { + if (person2.hands) + person2.hands.right = hand3; + } + } + } + for (const gesture3 of gestures) { + if (gesture3["face"] !== void 0 && gesture3["face"] === face5.id) + (_a = person2.gestures) == null ? void 0 : _a.push(gesture3); + else if (gesture3["iris"] !== void 0 && gesture3["iris"] === face5.id) + (_b = person2.gestures) == null ? void 0 : _b.push(gesture3); + else if (gesture3["body"] !== void 0 && gesture3["body"] === ((_c = person2.body) == null ? void 0 : _c.id)) + (_d = person2.gestures) == null ? void 0 : _d.push(gesture3); + else if (gesture3["hand"] !== void 0 && gesture3["hand"] === ((_f = (_e = person2.hands) == null ? void 0 : _e.left) == null ? void 0 : _f.id)) + (_g = person2.gestures) == null ? void 0 : _g.push(gesture3); + else if (gesture3["hand"] !== void 0 && gesture3["hand"] === ((_i = (_h = person2.hands) == null ? void 0 : _h.right) == null ? void 0 : _i.id)) + (_j = person2.gestures) == null ? void 0 : _j.push(gesture3); + } + const x = []; + const y = []; + const extractXY = (box6) => { + if (box6 && box6.length === 4) { + x.push(box6[0], box6[0] + box6[2]); + y.push(box6[1], box6[1] + box6[3]); + } + }; + extractXY((_k = person2.face) == null ? void 0 : _k.box); + extractXY((_l = person2.body) == null ? void 0 : _l.box); + extractXY((_n = (_m = person2.hands) == null ? void 0 : _m.left) == null ? void 0 : _n.box); + extractXY((_p = (_o = person2.hands) == null ? void 0 : _o.right) == null ? void 0 : _p.box); + const minX = Math.min(...x); + const minY = Math.min(...y); + person2.box = [minX, minY, Math.max(...x) - minX, Math.max(...y) - minY]; + if (shape && shape.length === 4) + person2.boxRaw = [person2.box[0] / shape[2], person2.box[1] / shape[1], person2.box[2] / shape[2], person2.box[3] / shape[1]]; + persons2.push(person2); + } + return persons2; +} + +// src/interpolate.ts +var bufferedResult = { face: [], body: [], hand: [], gesture: [], object: [], persons: [], performance: {}, timestamp: 0 }; +function calc(newResult) { + var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u; + const elapsed = Date.now() - newResult.timestamp; + const bufferedFactor = elapsed < 1e3 ? 8 - Math.log(elapsed) : 1; + if (!bufferedResult.body || newResult.body.length !== bufferedResult.body.length) { + bufferedResult.body = JSON.parse(JSON.stringify(newResult.body)); + } else { + for (let i = 0; i < newResult.body.length; i++) { + const box6 = newResult.body[i].box.map((b, j) => ((bufferedFactor - 1) * bufferedResult.body[i].box[j] + b) / bufferedFactor); + const boxRaw3 = newResult.body[i].boxRaw.map((b, j) => ((bufferedFactor - 1) * bufferedResult.body[i].boxRaw[j] + b) / bufferedFactor); + const keypoints3 = newResult.body[i].keypoints.map((keypoint, j) => ({ + score: keypoint.score, + part: keypoint.part, + position: [ + bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].position[0] + keypoint.position[0]) / bufferedFactor : keypoint.position[0], + bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].position[1] + keypoint.position[1]) / bufferedFactor : keypoint.position[1] + ], + positionRaw: [ + bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].positionRaw[0] + keypoint.positionRaw[0]) / bufferedFactor : keypoint.position[0], + bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].positionRaw[1] + keypoint.positionRaw[1]) / bufferedFactor : keypoint.position[1] + ] + })); + bufferedResult.body[i] = { ...newResult.body[i], box: box6, boxRaw: boxRaw3, keypoints: keypoints3 }; + } + } + if (!bufferedResult.hand || newResult.hand.length !== bufferedResult.hand.length) { + bufferedResult.hand = JSON.parse(JSON.stringify(newResult.hand)); + } else { + for (let i = 0; i < newResult.hand.length; i++) { + const box6 = newResult.hand[i].box.map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].box[j] + b) / bufferedFactor); + const boxRaw3 = newResult.hand[i].boxRaw.map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].boxRaw[j] + b) / bufferedFactor); + const keypoints3 = newResult.hand[i].keypoints.map((landmark, j) => landmark.map((coord, k) => ((bufferedFactor - 1) * bufferedResult.hand[i].keypoints[j][k] + coord) / bufferedFactor)); + const keys = Object.keys(newResult.hand[i].annotations); + const annotations3 = {}; + for (const key of keys) { + annotations3[key] = newResult.hand[i].annotations[key].map((val, j) => val.map((coord, k) => ((bufferedFactor - 1) * bufferedResult.hand[i].annotations[key][j][k] + coord) / bufferedFactor)); + } + bufferedResult.hand[i] = { ...newResult.hand[i], box: box6, boxRaw: boxRaw3, keypoints: keypoints3, annotations: annotations3 }; + } + } + if (!bufferedResult.face || newResult.face.length !== bufferedResult.face.length) { + bufferedResult.face = JSON.parse(JSON.stringify(newResult.face)); + } else { + for (let i = 0; i < newResult.face.length; i++) { + const box6 = newResult.face[i].box.map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].box[j] + b) / bufferedFactor); + const boxRaw3 = newResult.face[i].boxRaw.map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].boxRaw[j] + b) / bufferedFactor); + const rotation = { matrix: [0, 0, 0, 0, 0, 0, 0, 0, 0], angle: { roll: 0, yaw: 0, pitch: 0 }, gaze: { bearing: 0, strength: 0 } }; + rotation.matrix = (_a = newResult.face[i].rotation) == null ? void 0 : _a.matrix; + rotation.angle = { + roll: ((bufferedFactor - 1) * (((_c = (_b = bufferedResult.face[i].rotation) == null ? void 0 : _b.angle) == null ? void 0 : _c.roll) || 0) + (((_e = (_d = newResult.face[i].rotation) == null ? void 0 : _d.angle) == null ? void 0 : _e.roll) || 0)) / bufferedFactor, + yaw: ((bufferedFactor - 1) * (((_g = (_f = bufferedResult.face[i].rotation) == null ? void 0 : _f.angle) == null ? void 0 : _g.yaw) || 0) + (((_i = (_h = newResult.face[i].rotation) == null ? void 0 : _h.angle) == null ? void 0 : _i.yaw) || 0)) / bufferedFactor, + pitch: ((bufferedFactor - 1) * (((_k = (_j = bufferedResult.face[i].rotation) == null ? void 0 : _j.angle) == null ? void 0 : _k.pitch) || 0) + (((_m = (_l = newResult.face[i].rotation) == null ? void 0 : _l.angle) == null ? void 0 : _m.pitch) || 0)) / bufferedFactor + }; + rotation.gaze = { + bearing: ((bufferedFactor - 1) * (((_o = (_n = bufferedResult.face[i].rotation) == null ? void 0 : _n.gaze) == null ? void 0 : _o.bearing) || 0) + (((_q = (_p = newResult.face[i].rotation) == null ? void 0 : _p.gaze) == null ? void 0 : _q.bearing) || 0)) / bufferedFactor, + strength: ((bufferedFactor - 1) * (((_s = (_r = bufferedResult.face[i].rotation) == null ? void 0 : _r.gaze) == null ? void 0 : _s.strength) || 0) + (((_u = (_t = newResult.face[i].rotation) == null ? void 0 : _t.gaze) == null ? void 0 : _u.strength) || 0)) / bufferedFactor + }; + bufferedResult.face[i] = { ...newResult.face[i], rotation, box: box6, boxRaw: boxRaw3 }; + } + } + if (!bufferedResult.object || newResult.object.length !== bufferedResult.object.length) { + bufferedResult.object = JSON.parse(JSON.stringify(newResult.object)); + } else { + for (let i = 0; i < newResult.object.length; i++) { + const box6 = newResult.object[i].box.map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].box[j] + b) / bufferedFactor); + const boxRaw3 = newResult.object[i].boxRaw.map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].boxRaw[j] + b) / bufferedFactor); + bufferedResult.object[i] = { ...newResult.object[i], box: box6, boxRaw: boxRaw3 }; + } + } + const newPersons = newResult.persons; + if (!bufferedResult.persons || newPersons.length !== bufferedResult.persons.length) { + bufferedResult.persons = JSON.parse(JSON.stringify(newPersons)); + } else { + for (let i = 0; i < newPersons.length; i++) { + bufferedResult.persons[i].box = newPersons[i].box.map((box6, j) => ((bufferedFactor - 1) * bufferedResult.persons[i].box[j] + box6) / bufferedFactor); + } + } + bufferedResult.gesture = newResult.gesture; + bufferedResult.performance = newResult.performance; + return bufferedResult; +} + +// src/sample.ts +var face3 = ` /9j/4AAQSkZJRgABAQEAYABgAAD/4QBoRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUA AAABAAAARgEoAAMAAAABAAIAAAExAAIAAAARAAAATgAAAAAAAABgAAAAAQAAAGAAAAABcGFpbnQu bmV0IDQuMi4xMwAA/9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxob @@ -163,7 +10568,8 @@ PQ4GJ+ashuK0MhWaoWcA0AaOmASMK7jRNPWYBmHyiuepO2x10qfcv6vYxCzYqoGK4HVYVTJrmb5l c6oaM5TUJ8EgGsG4kLNUHT0M64OaqMMikSRsuKbnFMRLG3zVehOaGNE445NNlnVFpDMu6uie9Vo1 8z5mOAOST2pDK91cNN+5tsrH3PrW54a06KxT7fdrlh/q1Pc+tJ6IUdZGvHPLezMcnBOWbsPap5r3 ylFtbdT1xUWNWzU0/Zbwlgfmx8zGsHWtRHmMqE59aAMyNifvHPc1f0gtPdqkY5JosJHeNci2tktY -euPnNY+oXWZEVJNrZ9aun8SIq/CzodHuriIokhDIR1ronbKZr0o6o8ipoz//2Q==`,e5=` +euPnNY+oXWZEVJNrZ9aun8SIq/CzodHuriIokhDIR1ronbKZr0o6o8ipoz//2Q==`; +var body3 = ` /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAsICAoIBwsKCQoNDAsNERwSEQ8PESIZGhQcKSQrKigk JyctMkA3LTA9MCcnOEw5PUNFSElIKzZPVU5GVEBHSEX/2wBDAQwNDREPESESEiFFLicuRUVFRUVF RUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUX/wAARCASwBLADASIA @@ -731,5 +11137,495 @@ AAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA BAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2 SbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/ -2Q==`;var ge="2.0.0";var T0,k0,N0,c0,d0,P0,t5,I0,n5,o5,s5,r5,i2=class{constructor(e){D(this,T0,void 0);D(this,k0,void 0);D(this,N0,void 0);D(this,c0,void 0);D(this,d0,void 0);D(this,P0,void 0);this.analyze=(...e)=>{if(!q(this,k0))return;let t=this.tf.engine().state.numTensors,o=q(this,T0);Q(this,T0,t);let n=t-o;n!==0&&g(...e,n)};D(this,t5,e=>{if(!q(this,N0))return null;if(!e)return"input is not defined";if(this.tf.ENV.flags.IS_NODE&&!(e instanceof r.Tensor))return"input must be a tensor";try{this.tf.getBackend()}catch(t){return"backend not loaded"}return null});D(this,I0,async(e=!1)=>{var t;if(this.config.backend&&this.config.backend.length>0&&e||this.tf.getBackend()!==this.config.backend){let o=N();if(this.state="backend",this.config.backend&&this.config.backend.length>0){if(typeof window=="undefined"&&typeof WorkerGlobalScope!="undefined"&&this.config.debug&&g("running inside web worker"),this.tf.ENV.flags.IS_BROWSER&&this.config.backend==="tensorflow"&&(this.config.backend="webgl"),this.tf.ENV.flags.IS_NODE&&(this.config.backend==="webgl"||this.config.backend==="humangl")&&(this.config.backend="tensorflow"),this.config.debug&&g("setting backend:",this.config.backend),this.config.backend==="wasm"){if(this.config.debug&&g("wasm path:",this.config.wasmPath),typeof((t=this.tf)==null?void 0:t.setWasmPaths)!="undefined")this.tf.setWasmPaths(this.config.wasmPath);else throw new Error("Human: WASM backend is not loaded");let n=await this.tf.env().getAsync("WASM_HAS_SIMD_SUPPORT"),x=await this.tf.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT");this.config.debug&&g(`wasm execution: ${n?"SIMD":"no SIMD"} ${x?"multithreaded":"singlethreaded"}`),this.config.debug&&!n&&g("warning: wasm simd support is not enabled")}this.config.backend==="humangl"&&PA();try{await this.tf.setBackend(this.config.backend)}catch(n){g("error: cannot set backend:",this.config.backend,n)}}if(this.tf.enableProdMode(),this.tf.getBackend()==="webgl"||this.tf.getBackend()==="humangl"){this.tf.ENV.set("CHECK_COMPUTATION_FOR_ERRORS",!1),this.tf.ENV.set("WEBGL_CPU_FORWARD",!0),this.tf.ENV.set("WEBGL_PACK_DEPTHWISECONV",!0),this.config.object.enabled||this.tf.ENV.set("WEBGL_FORCE_F16_TEXTURES",!0),typeof this.config.deallocate!="undefined"&&this.config.deallocate&&(g("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",!0),this.tf.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",0));let n=await this.tf.backend().getGPGPUContext().gl;this.config.debug&&g(`gl version:${n.getParameter(n.VERSION)} renderer:${n.getParameter(n.RENDERER)}`)}await this.tf.ready(),this.performance.backend=Math.trunc(N()-o)}});this.next=e=>be(e||this.result);D(this,n5,async e=>{if(this.config.cacheSensitivity===0)return!1;let t=32,o=e.resizeBilinear([Math.trunc(e.shape[1]/t),Math.trunc(e.shape[2]/t)]),n=o.dataSync(),x=0;for(let y=0;y10*this.config.cacheSensitivity?0:a),s});D(this,o5,async()=>{let e=(n,x="application/octet-stream")=>fetch(`data:${x};base64,${n}`).then(a=>a.blob()),t,o;switch(this.config.warmup){case"face":t=await e(A5);break;case"full":t=await e(e5);break;default:t=null}if(t){let n=await createImageBitmap(t);o=await this.detect(n,this.config),n.close()}return o});D(this,s5,async()=>new Promise(e=>{let t,o=0;switch(this.config.warmup){case"face":o=256,t="data:image/jpeg;base64,"+A5;break;case"full":case"body":o=1200,t="data:image/jpeg;base64,"+e5;break;default:t=null}let n=new Image;n.onload=async()=>{let x=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(o,o):document.createElement("canvas");x.width=n.naturalWidth,x.height=n.naturalHeight;let a=x.getContext("2d");a==null||a.drawImage(n,0,0);let s=await this.detect(x,this.config);e(s)},t?n.src=t:e(null)}));D(this,r5,async()=>{let e=n=>Buffer.from(n,"base64"),t;if(this.config.warmup==="face"&&(t=e(A5)),(this.config.warmup==="body"||this.config.warmup==="full")&&(t=e(e5)),!t)return null;let o;if(typeof r.node!="undefined"){let n=r.node.decodeJpeg(t),x=n.expandDims(0);this.tf.dispose(n),o=await this.detect(x,this.config),this.tf.dispose(x)}else this.config.debug&&g("Warmup tfjs-node not loaded");return o});this.config=U(hA,e||{}),this.tf=r,this.draw=dA,this.version=ge,this.state="idle",Q(this,T0,0),Q(this,k0,!1),Q(this,N0,!1),Q(this,c0,!0),Q(this,P0,0),this.performance={backend:0,load:0,image:0,frames:0,cached:0,changed:0,total:0,draw:0},this.models={face:null,posenet:null,blazepose:null,efficientpose:null,movenet:null,handpose:null,age:null,gender:null,emotion:null,embedding:null,nanodet:null,centernet:null,faceres:null},this.image=t=>yA(t,this.config),this.classes={facemesh:u5,emotion:M5,faceres:E5,body:this.config.body.modelPath.includes("posenet")?O5:B5,hand:q5,nanodet:oA,centernet:xA},this.faceTriangulation=OA,this.faceUVMap=LA,this.sysinfo=uA(),Q(this,d0,1)}similarity(e,t){return z5(e,t)}enhance(e){return v5(e)}match(e,t,o=0){return VA(e,t,o)}async load(e){this.state="load";let t=N();e&&(this.config=U(this.config,e)),q(this,c0)&&(this.config.debug&&g(`version: ${this.version}`),this.config.debug&&g(`tfjs version: ${this.tf.version_core}`),this.config.debug&&g("platform:",this.sysinfo.platform),this.config.debug&&g("agent:",this.sysinfo.agent),await q(this,I0).call(this,!0),this.tf.ENV.flags.IS_BROWSER&&(this.config.debug&&g("configuration:",this.config),this.config.debug&&g("tf flags:",this.tf.ENV.flags))),this.config.async?[this.models.face,this.models.emotion,this.models.handpose,this.models.posenet,this.models.blazepose,this.models.efficientpose,this.models.movenet,this.models.nanodet,this.models.centernet,this.models.faceres]=await Promise.all([this.models.face||(this.config.face.enabled?h5(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?g5(this.config):null),this.models.handpose||(this.config.hand.enabled?F5(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("posenet")?I5(this.config):null),this.models.blazepose||(this.config.body.enabled&&this.config.body.modelPath.includes("blazepose")?K0(this.config):null),this.models.efficientpose||(this.config.body.enabled&&this.config.body.modelPath.includes("efficientpose")?ie(this.config):null),this.models.movenet||(this.config.body.enabled&&this.config.body.modelPath.includes("movenet")?_5(this.config):null),this.models.nanodet||(this.config.object.enabled&&this.config.object.modelPath.includes("nanodet")?tA(this.config):null),this.models.centernet||(this.config.object.enabled&&this.config.object.modelPath.includes("centernet")?iA(this.config):null),this.models.faceres||(this.config.face.enabled&&this.config.face.description.enabled?P5(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await h5(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await g5(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await F5(this.config)),this.config.body.enabled&&!this.models.posenet&&this.config.body.modelPath.includes("posenet")&&(this.models.posenet=await I5(this.config)),this.config.body.enabled&&!this.models.blazepose&&this.config.body.modelPath.includes("blazepose")&&(this.models.blazepose=await K0(this.config)),this.config.body.enabled&&!this.models.efficientpose&&this.config.body.modelPath.includes("efficientpose")&&(this.models.efficientpose=await K0(this.config)),this.config.body.enabled&&!this.models.movenet&&this.config.body.modelPath.includes("movenet")&&(this.models.movenet=await _5(this.config)),this.config.object.enabled&&!this.models.nanodet&&this.config.object.modelPath.includes("nanodet")&&(this.models.nanodet=await tA(this.config)),this.config.object.enabled&&!this.models.centernet&&this.config.object.modelPath.includes("centernet")&&(this.models.centernet=await iA(this.config)),this.config.face.enabled&&this.config.face.description.enabled&&!this.models.faceres&&(this.models.faceres=await P5(this.config))),q(this,c0)&&(this.config.debug&&g("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),Q(this,c0,!1));let o=Math.trunc(N()-t);o>(this.performance.load||0)&&(this.performance.load=o)}async detect(e,t){return new Promise(async o=>{this.state="config";let n;this.config=U(this.config,t),this.state="check";let x=q(this,t5).call(this,e);x&&(g(x,e),o({error:x}));let a=N();await q(this,I0).call(this),await this.load(),n=N();let s=yA(e,this.config);if(!s||!s.tensor){g("could not convert input to tensor"),o({error:"could not convert input to tensor"});return}this.performance.image=Math.trunc(N()-n),this.analyze("Get Image:"),n=N(),this.config.skipFrame=await q(this,n5).call(this,s.tensor),this.performance.frames||(this.performance.frames=0),this.performance.cached||(this.performance.cached=0),this.performance.frames++,this.config.skipFrame&&this.performance.cached++,this.performance.changed=Math.trunc(N()-n),this.analyze("Check Changed:");let y,i,c,l,f;this.config.async?(y=this.config.face.enabled?R5(this,s.tensor):[],this.performance.face&&delete this.performance.face):(this.state="run:face",n=N(),y=this.config.face.enabled?await R5(this,s.tensor):[],f=Math.trunc(N()-n),f>0&&(this.performance.face=f)),this.analyze("Start Body:"),this.config.async?(this.config.body.modelPath.includes("posenet")?i=this.config.body.enabled?N5(s.tensor,this.config):[]:this.config.body.modelPath.includes("blazepose")?i=this.config.body.enabled?C5(s.tensor,this.config):[]:this.config.body.modelPath.includes("efficientpose")?i=this.config.body.enabled?G5(s.tensor,this.config):[]:this.config.body.modelPath.includes("movenet")&&(i=this.config.body.enabled?$5(s.tensor,this.config):[]),this.performance.body&&delete this.performance.body):(this.state="run:body",n=N(),this.config.body.modelPath.includes("posenet")?i=this.config.body.enabled?await N5(s.tensor,this.config):[]:this.config.body.modelPath.includes("blazepose")?i=this.config.body.enabled?await C5(s.tensor,this.config):[]:this.config.body.modelPath.includes("efficientpose")?i=this.config.body.enabled?await G5(s.tensor,this.config):[]:this.config.body.modelPath.includes("movenet")&&(i=this.config.body.enabled?await $5(s.tensor,this.config):[]),f=Math.trunc(N()-n),f>0&&(this.performance.body=f)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(c=this.config.hand.enabled?X5(s.tensor,this.config):[],this.performance.hand&&delete this.performance.hand):(this.state="run:hand",n=N(),c=this.config.hand.enabled?await X5(s.tensor,this.config):[],f=Math.trunc(N()-n),f>0&&(this.performance.hand=f)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.config.async?(this.config.object.modelPath.includes("nanodet")?l=this.config.object.enabled?nA(s.tensor,this.config):[]:this.config.object.modelPath.includes("centernet")&&(l=this.config.object.enabled?aA(s.tensor,this.config):[]),this.performance.object&&delete this.performance.object):(this.state="run:object",n=N(),this.config.object.modelPath.includes("nanodet")?l=this.config.object.enabled?await nA(s.tensor,this.config):[]:this.config.object.modelPath.includes("centernet")&&(l=this.config.object.enabled?await aA(s.tensor,this.config):[]),f=Math.trunc(N()-n),f>0&&(this.performance.object=f)),this.analyze("End Object:"),this.config.async&&([y,i,c,l]=await Promise.all([y,i,c,l]));let p=[];this.config.gesture.enabled&&(n=N(),p=[...xe(y),...ae(i),...le(c),...ye(y)],this.config.async?this.performance.gesture&&delete this.performance.gesture:this.performance.gesture=Math.trunc(N()-n)),this.performance.total=Math.trunc(N()-a),this.state="idle",this.result={face:y,body:i,hand:c,gesture:p,object:l,performance:this.performance,canvas:s.canvas,timestamp:Date.now(),get persons(){var E;return pe(y,i,c,p,(E=s==null?void 0:s.tensor)==null?void 0:E.shape)}},r.dispose(s.tensor),o(this.result)})}async warmup(e){let t=N();if(e&&(this.config=U(this.config,e)),!this.config.warmup||this.config.warmup==="none")return{error:"null"};let o;typeof createImageBitmap=="function"?o=await q(this,o5).call(this):typeof Image!="undefined"?o=await q(this,s5).call(this):o=await q(this,r5).call(this);let n=N();return this.config.debug&&g("Warmup",this.config.warmup,Math.round(n-t),"ms",o),o}};T0=new WeakMap,k0=new WeakMap,N0=new WeakMap,c0=new WeakMap,d0=new WeakMap,P0=new WeakMap,t5=new WeakMap,I0=new WeakMap,n5=new WeakMap,o5=new WeakMap,s5=new WeakMap,r5=new WeakMap;export{i2 as Human,i2 as default}; +2Q==`; + +// package.json +var version2 = "2.0.0"; + +// src/human.ts +var _numTensors, _analyzeMemoryLeaks, _checkSanity, _firstRun, _lastInputSum, _lastCacheDiff, _sanity, _checkBackend, _skipFrame, _warmupBitmap, _warmupCanvas, _warmupNode; +var Human = class { + constructor(userConfig) { + __privateAdd(this, _numTensors, void 0); + __privateAdd(this, _analyzeMemoryLeaks, void 0); + __privateAdd(this, _checkSanity, void 0); + __privateAdd(this, _firstRun, void 0); + __privateAdd(this, _lastInputSum, void 0); + __privateAdd(this, _lastCacheDiff, void 0); + this.analyze = (...msg) => { + if (!__privateGet(this, _analyzeMemoryLeaks)) + return; + const currentTensors = this.tf.engine().state.numTensors; + const previousTensors = __privateGet(this, _numTensors); + __privateSet(this, _numTensors, currentTensors); + const leaked = currentTensors - previousTensors; + if (leaked !== 0) + log(...msg, leaked); + }; + __privateAdd(this, _sanity, (input) => { + if (!__privateGet(this, _checkSanity)) + return null; + if (!input) + return "input is not defined"; + if (this.tf.ENV.flags.IS_NODE && !(input instanceof tfjs_esm_exports.Tensor)) + return "input must be a tensor"; + try { + this.tf.getBackend(); + } catch (e) { + return "backend not loaded"; + } + return null; + }); + __privateAdd(this, _checkBackend, async (force = false) => { + var _a; + if (this.config.backend && this.config.backend.length > 0 && force || this.tf.getBackend() !== this.config.backend) { + const timeStamp = now(); + this.state = "backend"; + if (this.config.backend && this.config.backend.length > 0) { + if (typeof window === "undefined" && typeof WorkerGlobalScope !== "undefined" && this.config.debug) + log("running inside web worker"); + if (this.tf.ENV.flags.IS_BROWSER && this.config.backend === "tensorflow") + this.config.backend = "webgl"; + if (this.tf.ENV.flags.IS_NODE && (this.config.backend === "webgl" || this.config.backend === "humangl")) + this.config.backend = "tensorflow"; + if (this.config.debug) + log("setting backend:", this.config.backend); + if (this.config.backend === "wasm") { + if (this.config.debug) + log("wasm path:", this.config.wasmPath); + if (typeof ((_a = this.tf) == null ? void 0 : _a.setWasmPaths) !== "undefined") + this.tf.setWasmPaths(this.config.wasmPath); + else + throw new Error("Human: WASM backend is not loaded"); + const simd = await this.tf.env().getAsync("WASM_HAS_SIMD_SUPPORT"); + const mt = await this.tf.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"); + if (this.config.debug) + log(`wasm execution: ${simd ? "SIMD" : "no SIMD"} ${mt ? "multithreaded" : "singlethreaded"}`); + if (this.config.debug && !simd) + log("warning: wasm simd support is not enabled"); + } + if (this.config.backend === "humangl") + register(); + try { + await this.tf.setBackend(this.config.backend); + } catch (err) { + log("error: cannot set backend:", this.config.backend, err); + } + } + this.tf.enableProdMode(); + if (this.tf.getBackend() === "webgl" || this.tf.getBackend() === "humangl") { + this.tf.ENV.set("CHECK_COMPUTATION_FOR_ERRORS", false); + this.tf.ENV.set("WEBGL_CPU_FORWARD", true); + this.tf.ENV.set("WEBGL_PACK_DEPTHWISECONV", true); + if (!this.config.object.enabled) + this.tf.ENV.set("WEBGL_FORCE_F16_TEXTURES", true); + if (typeof this.config["deallocate"] !== "undefined" && this.config["deallocate"]) { + log("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:", true); + this.tf.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD", 0); + } + const gl = await this.tf.backend().getGPGPUContext().gl; + if (this.config.debug) + log(`gl version:${gl.getParameter(gl.VERSION)} renderer:${gl.getParameter(gl.RENDERER)}`); + } + await this.tf.ready(); + this.performance.backend = Math.trunc(now() - timeStamp); + } + }); + this.next = (result) => calc(result || this.result); + __privateAdd(this, _skipFrame, async (input) => { + if (this.config.cacheSensitivity === 0) + return false; + const resizeFact = 32; + const reduced = input.resizeBilinear([Math.trunc(input.shape[1] / resizeFact), Math.trunc(input.shape[2] / resizeFact)]); + const reducedData = reduced.dataSync(); + let sum = 0; + for (let i = 0; i < reducedData.length / 3; i++) + sum += reducedData[3 * i + 2]; + reduced.dispose(); + const diff = 100 * (Math.max(sum, __privateGet(this, _lastInputSum)) / Math.min(sum, __privateGet(this, _lastInputSum)) - 1); + __privateSet(this, _lastInputSum, sum); + const skipFrame = diff < Math.max(this.config.cacheSensitivity, __privateGet(this, _lastCacheDiff)); + __privateSet(this, _lastCacheDiff, diff > 10 * this.config.cacheSensitivity ? 0 : diff); + return skipFrame; + }); + __privateAdd(this, _warmupBitmap, async () => { + const b64toBlob = (base64, type = "application/octet-stream") => fetch(`data:${type};base64,${base64}`).then((res2) => res2.blob()); + let blob; + let res; + switch (this.config.warmup) { + case "face": + blob = await b64toBlob(face3); + break; + case "full": + blob = await b64toBlob(body3); + break; + default: + blob = null; + } + if (blob) { + const bitmap = await createImageBitmap(blob); + res = await this.detect(bitmap, this.config); + bitmap.close(); + } + return res; + }); + __privateAdd(this, _warmupCanvas, async () => new Promise((resolve) => { + let src; + let size = 0; + switch (this.config.warmup) { + case "face": + size = 256; + src = "data:image/jpeg;base64," + face3; + break; + case "full": + case "body": + size = 1200; + src = "data:image/jpeg;base64," + body3; + break; + default: + src = null; + } + const img = new Image(); + img.onload = async () => { + const canvas2 = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(size, size) : document.createElement("canvas"); + canvas2.width = img.naturalWidth; + canvas2.height = img.naturalHeight; + const ctx = canvas2.getContext("2d"); + ctx == null ? void 0 : ctx.drawImage(img, 0, 0); + const res = await this.detect(canvas2, this.config); + resolve(res); + }; + if (src) + img.src = src; + else + resolve(null); + })); + __privateAdd(this, _warmupNode, async () => { + const atob = (str) => Buffer.from(str, "base64"); + let img; + if (this.config.warmup === "face") + img = atob(face3); + if (this.config.warmup === "body" || this.config.warmup === "full") + img = atob(body3); + if (!img) + return null; + let res; + if (typeof tfjs_esm_exports["node"] !== "undefined") { + const data2 = tfjs_esm_exports["node"].decodeJpeg(img); + const expanded = data2.expandDims(0); + this.tf.dispose(data2); + res = await this.detect(expanded, this.config); + this.tf.dispose(expanded); + } else { + if (this.config.debug) + log("Warmup tfjs-node not loaded"); + } + return res; + }); + this.config = mergeDeep(config, userConfig || {}); + this.tf = tfjs_esm_exports; + this.draw = draw_exports; + this.version = version2; + this.state = "idle"; + __privateSet(this, _numTensors, 0); + __privateSet(this, _analyzeMemoryLeaks, false); + __privateSet(this, _checkSanity, false); + __privateSet(this, _firstRun, true); + __privateSet(this, _lastCacheDiff, 0); + this.performance = { backend: 0, load: 0, image: 0, frames: 0, cached: 0, changed: 0, total: 0, draw: 0 }; + this.models = { + face: null, + posenet: null, + blazepose: null, + efficientpose: null, + movenet: null, + handpose: null, + age: null, + gender: null, + emotion: null, + embedding: null, + nanodet: null, + centernet: null, + faceres: null + }; + this.image = (input) => process4(input, this.config); + this.classes = { + facemesh: facemesh_exports, + emotion: emotion_exports, + faceres: faceres_exports, + body: this.config.body.modelPath.includes("posenet") ? posenet_exports : blazepose_exports, + hand: handpose_exports, + nanodet: nanodet_exports, + centernet: centernet_exports + }; + this.faceTriangulation = triangulation; + this.faceUVMap = uvmap; + this.sysinfo = info(); + __privateSet(this, _lastInputSum, 1); + } + similarity(embedding1, embedding2) { + return similarity(embedding1, embedding2); + } + enhance(input) { + return enhance(input); + } + match(faceEmbedding, db, threshold = 0) { + return match(faceEmbedding, db, threshold); + } + async load(userConfig) { + this.state = "load"; + const timeStamp = now(); + if (userConfig) + this.config = mergeDeep(this.config, userConfig); + if (__privateGet(this, _firstRun)) { + if (this.config.debug) + log(`version: ${this.version}`); + if (this.config.debug) + log(`tfjs version: ${this.tf.version_core}`); + if (this.config.debug) + log("platform:", this.sysinfo.platform); + if (this.config.debug) + log("agent:", this.sysinfo.agent); + await __privateGet(this, _checkBackend).call(this, true); + if (this.tf.ENV.flags.IS_BROWSER) { + if (this.config.debug) + log("configuration:", this.config); + if (this.config.debug) + log("tf flags:", this.tf.ENV.flags); + } + } + if (this.config.async) { + [ + this.models.face, + this.models.emotion, + this.models.handpose, + this.models.posenet, + this.models.blazepose, + this.models.efficientpose, + this.models.movenet, + this.models.nanodet, + this.models.centernet, + this.models.faceres + ] = await Promise.all([ + this.models.face || (this.config.face.enabled ? load2(this.config) : null), + this.models.emotion || (this.config.face.enabled && this.config.face.emotion.enabled ? load3(this.config) : null), + this.models.handpose || (this.config.hand.enabled ? load6(this.config) : null), + this.models.posenet || (this.config.body.enabled && this.config.body.modelPath.includes("posenet") ? load5(this.config) : null), + this.models.blazepose || (this.config.body.enabled && this.config.body.modelPath.includes("blazepose") ? load7(this.config) : null), + this.models.efficientpose || (this.config.body.enabled && this.config.body.modelPath.includes("efficientpose") ? load8(this.config) : null), + this.models.movenet || (this.config.body.enabled && this.config.body.modelPath.includes("movenet") ? load9(this.config) : null), + this.models.nanodet || (this.config.object.enabled && this.config.object.modelPath.includes("nanodet") ? load10(this.config) : null), + this.models.centernet || (this.config.object.enabled && this.config.object.modelPath.includes("centernet") ? load11(this.config) : null), + this.models.faceres || (this.config.face.enabled && this.config.face.description.enabled ? load4(this.config) : null) + ]); + } else { + if (this.config.face.enabled && !this.models.face) + this.models.face = await load2(this.config); + if (this.config.face.enabled && this.config.face.emotion.enabled && !this.models.emotion) + this.models.emotion = await load3(this.config); + if (this.config.hand.enabled && !this.models.handpose) + this.models.handpose = await load6(this.config); + if (this.config.body.enabled && !this.models.posenet && this.config.body.modelPath.includes("posenet")) + this.models.posenet = await load5(this.config); + if (this.config.body.enabled && !this.models.blazepose && this.config.body.modelPath.includes("blazepose")) + this.models.blazepose = await load7(this.config); + if (this.config.body.enabled && !this.models.efficientpose && this.config.body.modelPath.includes("efficientpose")) + this.models.efficientpose = await load7(this.config); + if (this.config.body.enabled && !this.models.movenet && this.config.body.modelPath.includes("movenet")) + this.models.movenet = await load9(this.config); + if (this.config.object.enabled && !this.models.nanodet && this.config.object.modelPath.includes("nanodet")) + this.models.nanodet = await load10(this.config); + if (this.config.object.enabled && !this.models.centernet && this.config.object.modelPath.includes("centernet")) + this.models.centernet = await load11(this.config); + if (this.config.face.enabled && this.config.face.description.enabled && !this.models.faceres) + this.models.faceres = await load4(this.config); + } + if (__privateGet(this, _firstRun)) { + if (this.config.debug) + log("tf engine state:", this.tf.engine().state.numBytes, "bytes", this.tf.engine().state.numTensors, "tensors"); + __privateSet(this, _firstRun, false); + } + const current = Math.trunc(now() - timeStamp); + if (current > (this.performance.load || 0)) + this.performance.load = current; + } + async detect(input, userConfig) { + return new Promise(async (resolve) => { + this.state = "config"; + let timeStamp; + this.config = mergeDeep(this.config, userConfig); + this.state = "check"; + const error = __privateGet(this, _sanity).call(this, input); + if (error) { + log(error, input); + resolve({ error }); + } + const timeStart = now(); + await __privateGet(this, _checkBackend).call(this); + await this.load(); + timeStamp = now(); + const process5 = process4(input, this.config); + if (!process5 || !process5.tensor) { + log("could not convert input to tensor"); + resolve({ error: "could not convert input to tensor" }); + return; + } + this.performance.image = Math.trunc(now() - timeStamp); + this.analyze("Get Image:"); + timeStamp = now(); + this.config.skipFrame = await __privateGet(this, _skipFrame).call(this, process5.tensor); + if (!this.performance.frames) + this.performance.frames = 0; + if (!this.performance.cached) + this.performance.cached = 0; + this.performance.frames++; + if (this.config.skipFrame) + this.performance.cached++; + this.performance.changed = Math.trunc(now() - timeStamp); + this.analyze("Check Changed:"); + let faceRes; + let bodyRes; + let handRes; + let objectRes; + let elapsedTime; + if (this.config.async) { + faceRes = this.config.face.enabled ? detectFace(this, process5.tensor) : []; + if (this.performance.face) + delete this.performance.face; + } else { + this.state = "run:face"; + timeStamp = now(); + faceRes = this.config.face.enabled ? await detectFace(this, process5.tensor) : []; + elapsedTime = Math.trunc(now() - timeStamp); + if (elapsedTime > 0) + this.performance.face = elapsedTime; + } + this.analyze("Start Body:"); + if (this.config.async) { + if (this.config.body.modelPath.includes("posenet")) + bodyRes = this.config.body.enabled ? predict4(process5.tensor, this.config) : []; + else if (this.config.body.modelPath.includes("blazepose")) + bodyRes = this.config.body.enabled ? predict6(process5.tensor, this.config) : []; + else if (this.config.body.modelPath.includes("efficientpose")) + bodyRes = this.config.body.enabled ? predict7(process5.tensor, this.config) : []; + else if (this.config.body.modelPath.includes("movenet")) + bodyRes = this.config.body.enabled ? predict8(process5.tensor, this.config) : []; + if (this.performance.body) + delete this.performance.body; + } else { + this.state = "run:body"; + timeStamp = now(); + if (this.config.body.modelPath.includes("posenet")) + bodyRes = this.config.body.enabled ? await predict4(process5.tensor, this.config) : []; + else if (this.config.body.modelPath.includes("blazepose")) + bodyRes = this.config.body.enabled ? await predict6(process5.tensor, this.config) : []; + else if (this.config.body.modelPath.includes("efficientpose")) + bodyRes = this.config.body.enabled ? await predict7(process5.tensor, this.config) : []; + else if (this.config.body.modelPath.includes("movenet")) + bodyRes = this.config.body.enabled ? await predict8(process5.tensor, this.config) : []; + elapsedTime = Math.trunc(now() - timeStamp); + if (elapsedTime > 0) + this.performance.body = elapsedTime; + } + this.analyze("End Body:"); + this.analyze("Start Hand:"); + if (this.config.async) { + handRes = this.config.hand.enabled ? predict5(process5.tensor, this.config) : []; + if (this.performance.hand) + delete this.performance.hand; + } else { + this.state = "run:hand"; + timeStamp = now(); + handRes = this.config.hand.enabled ? await predict5(process5.tensor, this.config) : []; + elapsedTime = Math.trunc(now() - timeStamp); + if (elapsedTime > 0) + this.performance.hand = elapsedTime; + } + this.analyze("End Hand:"); + this.analyze("Start Object:"); + if (this.config.async) { + if (this.config.object.modelPath.includes("nanodet")) + objectRes = this.config.object.enabled ? predict9(process5.tensor, this.config) : []; + else if (this.config.object.modelPath.includes("centernet")) + objectRes = this.config.object.enabled ? predict10(process5.tensor, this.config) : []; + if (this.performance.object) + delete this.performance.object; + } else { + this.state = "run:object"; + timeStamp = now(); + if (this.config.object.modelPath.includes("nanodet")) + objectRes = this.config.object.enabled ? await predict9(process5.tensor, this.config) : []; + else if (this.config.object.modelPath.includes("centernet")) + objectRes = this.config.object.enabled ? await predict10(process5.tensor, this.config) : []; + elapsedTime = Math.trunc(now() - timeStamp); + if (elapsedTime > 0) + this.performance.object = elapsedTime; + } + this.analyze("End Object:"); + if (this.config.async) + [faceRes, bodyRes, handRes, objectRes] = await Promise.all([faceRes, bodyRes, handRes, objectRes]); + let gestureRes = []; + if (this.config.gesture.enabled) { + timeStamp = now(); + gestureRes = [...face(faceRes), ...body(bodyRes), ...hand(handRes), ...iris(faceRes)]; + if (!this.config.async) + this.performance.gesture = Math.trunc(now() - timeStamp); + else if (this.performance.gesture) + delete this.performance.gesture; + } + this.performance.total = Math.trunc(now() - timeStart); + this.state = "idle"; + this.result = { + face: faceRes, + body: bodyRes, + hand: handRes, + gesture: gestureRes, + object: objectRes, + performance: this.performance, + canvas: process5.canvas, + timestamp: Date.now(), + get persons() { + var _a; + return join2(faceRes, bodyRes, handRes, gestureRes, (_a = process5 == null ? void 0 : process5.tensor) == null ? void 0 : _a.shape); + } + }; + tfjs_esm_exports.dispose(process5.tensor); + resolve(this.result); + }); + } + async warmup(userConfig) { + const t0 = now(); + if (userConfig) + this.config = mergeDeep(this.config, userConfig); + if (!this.config.warmup || this.config.warmup === "none") + return { error: "null" }; + let res; + if (typeof createImageBitmap === "function") + res = await __privateGet(this, _warmupBitmap).call(this); + else if (typeof Image !== "undefined") + res = await __privateGet(this, _warmupCanvas).call(this); + else + res = await __privateGet(this, _warmupNode).call(this); + const t1 = now(); + if (this.config.debug) + log("Warmup", this.config.warmup, Math.round(t1 - t0), "ms", res); + return res; + } +}; +_numTensors = new WeakMap(); +_analyzeMemoryLeaks = new WeakMap(); +_checkSanity = new WeakMap(); +_firstRun = new WeakMap(); +_lastInputSum = new WeakMap(); +_lastCacheDiff = new WeakMap(); +_sanity = new WeakMap(); +_checkBackend = new WeakMap(); +_skipFrame = new WeakMap(); +_warmupBitmap = new WeakMap(); +_warmupCanvas = new WeakMap(); +_warmupNode = new WeakMap(); +export { + Human, + Human as default +}; //# sourceMappingURL=human.esm-nobundle.js.map diff --git a/dist/human.esm-nobundle.js.map b/dist/human.esm-nobundle.js.map index 64fe083c..6d9f4e8e 100644 --- a/dist/human.esm-nobundle.js.map +++ b/dist/human.esm-nobundle.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/helpers.ts", "../src/config.ts", "../src/sysinfo.ts", "../src/tfjs/tf-browser.ts", "../src/tfjs/backend.ts", "../src/blazeface/facemesh.ts", "../src/blazeface/box.ts", "../src/blazeface/util.ts", "../src/blazeface/blazeface.ts", "../src/blazeface/coords.ts", "../src/blazeface/facepipeline.ts", "../src/emotion/emotion.ts", "../src/faceres/faceres.ts", "../src/face.ts", "../src/posenet/posenet.ts", "../src/posenet/keypoints.ts", "../src/posenet/utils.ts", "../src/posenet/poses.ts", "../src/handpose/handpose.ts", "../src/handpose/box.ts", "../src/handpose/anchors.ts", "../src/handpose/handdetector.ts", "../src/handpose/util.ts", "../src/handpose/handpipeline.ts", "../src/blazepose/blazepose.ts", "../src/blazepose/annotations.ts", "../src/efficientpose/efficientpose.ts", "../src/movenet/movenet.ts", "../src/object/nanodet.ts", "../src/object/labels.ts", "../src/object/centernet.ts", "../src/gesture/gesture.ts", "../src/image/imagefx.js", "../src/image/image.ts", "../src/draw/draw.ts", "../src/persons.ts", "../src/interpolate.ts", "../src/sample.ts", "../src/human.ts"], - "sourcesContent": ["/**\n * Simple helper functions used accross codebase\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(`Human: ModelPath Error: ${path} Expecting JSON file`);\n return path;\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: 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: perform deep merge of multiple objects so it allows full inheriance 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", "/* eslint-disable indent */\n/* eslint-disable no-multi-spaces */\n\n/**\n * Configuration interface definition for **Human** library\n *\n * Contains all configurable parameters\n * @typedef Config\n */\nexport interface Config {\n /** Backend used for TFJS operations */\n backend: null | '' | 'cpu' | 'wasm' | 'webgl' | 'humangl' | 'tensorflow',\n\n /** Path to *.wasm files if backend is set to `wasm` */\n wasmPath: string,\n\n /** Print debug statements to console */\n debug: boolean,\n\n /** Perform model loading and inference concurrently or sequentially */\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 * - only used for `webgl` and `humangl` backends\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 modelBasePath: string,\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 cacheSensitivity: number;\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 skipFrame: boolean;\n\n /** Run input through image filters before inference\n * - image filters run with near-zero latency as they are executed on the GPU\n */\n filter: {\n enabled: 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 // type definition end\n\n /** Controlls gesture detection */\n gesture: {\n enabled: boolean,\n },\n\n /** Controlls and configures all face-specific options:\n * - face detection, face mesh detection, age, gender, emotion detection and face description\n * Parameters:\n * - enabled: true/false\n * - modelPath: path for each of face models\n * - minConfidence: threshold for discarding a prediction\n * - iouThreshold: ammount of overlap between two detected objects before one object is removed\n * - maxDetected: maximum number of faces detected in the input, should be set to the minimum number for performance\n * - rotation: use calculated rotated face image or just box with rotation as-is, false means higher performance, but incorrect mesh mapping on higher face angles\n * - return: return extracted face as tensor for futher user processing\n */\n face: {\n enabled: boolean,\n detector: {\n modelPath: string,\n rotation: boolean,\n maxDetected: number,\n skipFrames: number,\n minConfidence: number,\n iouThreshold: number,\n return: boolean,\n },\n mesh: {\n enabled: boolean,\n modelPath: string,\n },\n iris: {\n enabled: boolean,\n modelPath: string,\n },\n description: {\n enabled: boolean,\n modelPath: string,\n skipFrames: number,\n minConfidence: number,\n },\n emotion: {\n enabled: boolean,\n minConfidence: number,\n skipFrames: number,\n modelPath: string,\n },\n },\n\n /** Controlls and configures all body detection specific options\n * - enabled: true/false\n * - modelPath: body pose model, can be absolute path or relative to modelBasePath\n * - minConfidence: threshold for discarding a prediction\n * - maxDetected: maximum number of people detected in the input, should be set to the minimum number for performance\n */\n body: {\n enabled: boolean,\n modelPath: string,\n maxDetected: number,\n minConfidence: number,\n skipFrames: number,\n },\n\n /** Controlls and configures all hand detection specific options\n * - enabled: true/false\n * - landmarks: detect hand landmarks or just hand boundary box\n * - modelPath: paths for hand detector and hand skeleton models, can be absolute path or relative to modelBasePath\n * - minConfidence: threshold for discarding a prediction\n * - iouThreshold: ammount of overlap between two detected objects before one object is removed\n * - maxDetected: maximum number of hands detected in the input, should be set to the minimum number for performance\n * - rotation: use best-guess rotated hand image or just box with rotation as-is, false means higher performance, but incorrect finger mapping if hand is inverted\n */\n hand: {\n enabled: boolean,\n rotation: boolean,\n skipFrames: number,\n minConfidence: number,\n iouThreshold: number,\n maxDetected: number,\n landmarks: boolean,\n detector: {\n modelPath: string,\n },\n skeleton: {\n modelPath: string,\n },\n },\n\n /** Controlls and configures all object detection specific options\n * - enabled: true/false\n * - modelPath: object detection model, can be absolute path or relative to modelBasePath\n * - minConfidence: minimum score that detection must have to return as valid object\n * - iouThreshold: ammount of overlap between two detected objects before one object is removed\n * - maxDetected: maximum number of detections to return\n */\n object: {\n enabled: boolean,\n modelPath: string,\n minConfidence: number,\n iouThreshold: number,\n maxDetected: number,\n skipFrames: number,\n },\n}\n\nconst config: Config = {\n backend: 'webgl', // select tfjs backend to use, leave empty to use default backend\n // can be 'webgl', 'wasm', 'cpu', or 'humangl' which is a custom version of webgl\n modelBasePath: '../models/', // base path for all models\n wasmPath: '../node_modules/@tensorflow/tfjs-backend-wasm/dist/', // path for wasm binaries, only used for backend: wasm\n debug: true, // print additional status messages to console\n async: true, // execute enabled models in parallel\n warmup: 'full', // what to use for human.warmup(), can be 'none', 'face', 'full'\n // warmup pre-initializes all models for faster inference but can take\n // significant time on startup\n // only used for `webgl` and `humangl` backends\n cacheSensitivity: 0.75, // 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 skipFrame: false, // internal & dynamic\n filter: { // run input through image filters before inference\n // image filters run with near-zero latency as they are executed on the GPU\n enabled: true, // enable image pre-processing filters\n width: 0, // resize input width\n height: 0, // 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 flip: false, // flip input as mirror image\n return: true, // return processed canvas imagedata in result\n brightness: 0, // range: -1 (darken) to 1 (lighten)\n contrast: 0, // range: -1 (reduce contrast) to 1 (increase contrast)\n sharpness: 0, // range: 0 (no sharpening) to 1 (maximum sharpening)\n blur: 0, // range: 0 (no blur) to N (blur radius in pixels)\n saturation: 0, // range: -1 (reduce saturation) to 1 (increase saturation)\n hue: 0, // range: 0 (no change) to 360 (hue rotation in degrees)\n negative: false, // image negative\n sepia: false, // image sepia colors\n vintage: false, // image vintage colors\n kodachrome: false, // image kodachrome colors\n technicolor: false, // image technicolor colors\n polaroid: false, // image polaroid camera effect\n pixelate: 0, // range: 0 (no pixelate) to N (number of pixels to pixelate)\n },\n\n gesture: {\n enabled: true, // enable gesture recognition based on model results\n },\n\n face: {\n enabled: true, // controls if specified modul is enabled\n // face.enabled is required for all face models:\n // detector, mesh, iris, age, gender, emotion\n // (note: module is not loaded until it is required)\n detector: {\n modelPath: 'blazeface.json', // detector model, can be absolute path or relative to modelBasePath\n rotation: true, // use best-guess rotated face image or just box with rotation as-is\n // false means higher performance, but incorrect mesh mapping if face angle is above 20 degrees\n // this parameter is not valid in nodejs\n maxDetected: 15, // maximum number of faces detected in the input\n // should be set to the minimum number for performance\n skipFrames: 15, // how many max frames to go without re-running the face bounding box detector\n // only used when cacheSensitivity is not zero\n // e.g., if model is running st 25 FPS, we can re-use existing bounding\n // box for updated face analysis as the head probably hasn't moved much\n // in short time (10 * 1/25 = 0.25 sec)\n minConfidence: 0.2, // threshold for discarding a prediction\n iouThreshold: 0.1, // ammount of overlap between two detected objects before one object is removed\n return: false, // return extracted face as tensor\n },\n\n mesh: {\n enabled: true,\n modelPath: 'facemesh.json', // facemesh model, can be absolute path or relative to modelBasePath\n },\n\n iris: {\n enabled: true,\n modelPath: 'iris.json', // face iris model\n // can be either absolute path or relative to modelBasePath\n },\n\n description: {\n enabled: true, // to improve accuracy of face description extraction it is\n // recommended to enable detector.rotation and mesh.enabled\n modelPath: 'faceres.json', // face description model\n // can be either absolute path or relative to modelBasePath\n skipFrames: 16, // how many max frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n minConfidence: 0.1, // threshold for discarding a prediction\n },\n\n emotion: {\n enabled: true,\n minConfidence: 0.1, // threshold for discarding a prediction\n skipFrames: 17, // how max many frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n modelPath: 'emotion.json', // face emotion model, can be absolute path or relative to modelBasePath\n },\n },\n\n body: {\n enabled: true,\n modelPath: 'movenet-lightning.json', // body model, can be absolute path or relative to modelBasePath\n // can be 'posenet', 'blazepose', 'efficientpose', 'movenet-lightning', 'movenet-thunder'\n maxDetected: 1, // maximum number of people detected in the input\n // should be set to the minimum number for performance\n // only valid for posenet as other models detects single pose\n minConfidence: 0.2, // threshold for discarding a prediction\n skipFrames: 16, // how many max frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n},\n\n hand: {\n enabled: true,\n rotation: true, // use best-guess rotated hand image or just box with rotation as-is\n // false means higher performance, but incorrect finger mapping if hand is inverted\n skipFrames: 19, // how many max frames to go without re-running the hand bounding box detector\n // only used when cacheSensitivity is not zero\n // e.g., if model is running st 25 FPS, we can re-use existing bounding\n // box for updated hand skeleton analysis as the hand probably\n // hasn't moved much in short time (10 * 1/25 = 0.25 sec)\n minConfidence: 0.1, // threshold for discarding a prediction\n iouThreshold: 0.1, // ammount of overlap between two detected objects before one object is removed\n maxDetected: 2, // maximum number of hands detected in the input\n // should be set to the minimum number for performance\n landmarks: true, // detect hand landmarks or just hand boundary box\n detector: {\n modelPath: 'handdetect.json', // hand detector model, can be absolute path or relative to modelBasePath\n },\n skeleton: {\n modelPath: 'handskeleton.json', // hand skeleton model, can be absolute path or relative to modelBasePath\n },\n },\n\n object: {\n enabled: false,\n modelPath: 'mb3-centernet.json', // experimental: object detection model, can be absolute path or relative to modelBasePath\n // can be 'mb3-centernet' or 'nanodet'\n minConfidence: 0.2, // threshold for discarding a prediction\n iouThreshold: 0.4, // ammount of overlap between two detected objects before one object is removed\n maxDetected: 10, // maximum number of objects detected in the input\n skipFrames: 20, // how many max frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n },\n};\nexport { config as defaults };\n", "/**\n * Helper function that returns basic system info\n */\nexport function info(): { platform: string, agent: string } {\n let platform;\n let agent;\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 platform = platformMatch ? platformMatch[0].replace(/\\(|\\)/g, '') : '';\n agent = navigator.userAgent.replace(raw[0], '');\n if (platform[1]) agent = agent.replace(raw[1], '');\n agent = agent.replace(/ /g, ' ');\n }\n } else if (typeof process !== 'undefined') {\n platform = `${process.platform} ${process.arch}`;\n agent = `NodeJS ${process.version}`;\n }\n return { platform, agent };\n}\n", "/**\n * Creates tfjs bundle used by Human browser build target\n */\n\n// simplified\n// { modules: 1250, moduleBytes: 4013323, imports: 7, importBytes: 2255, outputBytes: 2991826, outputFiles: 'dist/tfjs.esm.js' }\n// export * from '@tensorflow/tfjs/dist/index.js';\n// export * from '@tensorflow/tfjs-backend-wasm';\n\n// modular\n// { modules: 1253, moduleBytes: 4029357, imports: 7, importBytes: 2285, outputBytes: 2998298, outputFiles: 'dist/tfjs.esm.js' }\n\n// get versions of all packages.\nimport * as packageBundle from '@tensorflow/tfjs/package.json';\nimport * as packageCore from '@tensorflow/tfjs-core/package.json';\nimport * as packageData from '@tensorflow/tfjs-data/package.json';\nimport * as packageLayers from '@tensorflow/tfjs-layers/package.json';\nimport * as packageConverter from '@tensorflow/tfjs-converter/package.json';\n// for backends, get version from source so it can register backend during import\nimport { version_cpu } from '@tensorflow/tfjs-backend-cpu/dist/index.js';\nimport { version_webgl } from '@tensorflow/tfjs-backend-webgl/dist/index.js';\nimport { version_wasm } from '@tensorflow/tfjs-backend-wasm/dist/index.js';\n\n// export all - compiled\nexport * from '@tensorflow/tfjs-core/dist/index.js';\nexport * from '@tensorflow/tfjs-layers/dist/index.js';\nexport * from '@tensorflow/tfjs-converter/dist/index.js';\nexport * as data from '@tensorflow/tfjs-data/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-cpu/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-webgl/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-wasm/dist/index.js';\n\n// export all - sources\n/*\nexport * from '@tensorflow/tfjs-core/src/index';\nexport * from '@tensorflow/tfjs-layers/src/index';\nexport * from '@tensorflow/tfjs-converter/src/index';\nexport * as data from '@tensorflow/tfjs-data/src/index';\nexport * from '@tensorflow/tfjs-backend-cpu/src/index';\nexport * from '@tensorflow/tfjs-backend-webgl/src/index';\nexport * from '@tensorflow/tfjs-backend-wasm/src/index';\n*/\n\n// export versions\nexport const version = {\n tfjs: packageBundle?.version || undefined,\n 'tfjs-core': packageCore?.version || undefined,\n 'tfjs-data': packageData?.version || undefined,\n 'tfjs-layers': packageLayers?.version || undefined,\n 'tfjs-converter': packageConverter?.version || undefined,\n 'tfjs-backend-cpu': version_cpu || undefined,\n 'tfjs-backend-webgl': version_webgl || undefined,\n 'tfjs-backend-wasm': version_wasm || undefined,\n};\n// export const version = {};\n", "/**\n * Custom TFJS backend for Human based on WebGL\n * Not used by default\n */\n\nimport { log } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\n\nexport const config = {\n name: 'humangl',\n priority: 99,\n canvas: null,\n gl: null,\n width: 1024,\n height: 1024,\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\nexport function register(): void {\n if (!tf.findBackend(config.name)) {\n log('backend registration:', config.name);\n try {\n config.canvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(config.width, config.height) : document.createElement('canvas');\n } catch (err) {\n log('error: cannot create canvas:', err);\n return;\n }\n try {\n config.gl = config.canvas.getContext('webgl2', config.webGLattr);\n } catch (err) {\n log('error: cannot get WebGL2 context:', err);\n return;\n }\n try {\n tf.setWebGLContext(2, config.gl);\n } catch (err) {\n log('error: cannot set WebGL2 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 try {\n tf.ENV.set('WEBGL_VERSION', 2);\n // tf.ENV.set('WEBGL_MAX_TEXTURE_SIZE', config.gl.getParameter(config.gl.MAX_TEXTURE_SIZE));\n // tf.ENV.set('WEBGL_FORCE_F16_TEXTURES', true);\n // tf.ENV.set('WEBGL_PACK_DEPTHWISECONV', true);\n } catch (err) {\n log('error: cannot set WebGL backend flags:', err);\n return;\n }\n log('backend registered:', config.name);\n }\n}\n", "/**\n * FaceMesh & BlazeFace Module entry point\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as blazeface from './blazeface';\nimport * as facepipeline from './facepipeline';\nimport * as coords from './coords';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Face } from '../result';\nimport { Config } from '../config';\n\nlet faceModels: [blazeface.BlazeFaceModel | null, GraphModel | null, GraphModel | null] = [null, null, null];\nlet facePipeline;\n\nexport async function predict(input: Tensor, config: Config): Promise {\n const predictions = await facePipeline.predict(input, config);\n const results: Array = [];\n let id = 0;\n for (const prediction of (predictions || [])) {\n if (!prediction || prediction.isDisposedInternal) continue; // guard against disposed tensors on long running operations such as pause in middle of processing\n const meshRaw = prediction.mesh.map((pt) => [\n pt[0] / (input.shape[2] || 0),\n pt[1] / (input.shape[1] || 0),\n pt[2] / facePipeline.meshSize,\n ]);\n const annotations = {};\n if (prediction.mesh && prediction.mesh.length > 0) {\n for (const key of Object.keys(coords.MESH_ANNOTATIONS)) annotations[key] = coords.MESH_ANNOTATIONS[key].map((index) => prediction.mesh[index]);\n }\n const clampedBox: [number, number, number, number] = prediction.box ? [\n Math.trunc(Math.max(0, prediction.box.startPoint[0])),\n Math.trunc(Math.max(0, prediction.box.startPoint[1])),\n Math.trunc(Math.min((input.shape[2] || 0), prediction.box.endPoint[0]) - Math.max(0, prediction.box.startPoint[0])),\n Math.trunc(Math.min((input.shape[1] || 0), prediction.box.endPoint[1]) - Math.max(0, prediction.box.startPoint[1])),\n ] : [0, 0, 0, 0];\n const boxRaw: [number, number, number, number] = prediction.box ? [\n prediction.box.startPoint[0] / (input.shape[2] || 0),\n prediction.box.startPoint[1] / (input.shape[1] || 0),\n (prediction.box.endPoint[0] - prediction.box.startPoint[0]) / (input.shape[2] || 0),\n (prediction.box.endPoint[1] - prediction.box.startPoint[1]) / (input.shape[1] || 0),\n ] : [0, 0, 0, 0];\n results.push({\n id: id++,\n score: Math.round(100 * prediction.faceConfidence || 100 * prediction.boxConfidence || 0) / 100,\n boxScore: Math.round(100 * prediction.boxConfidence) / 100,\n faceScore: Math.round(100 * prediction.faceConfidence) / 100,\n box: clampedBox,\n boxRaw,\n mesh: prediction.mesh,\n meshRaw,\n annotations,\n image: prediction.image,\n tensor: prediction.image,\n });\n if (prediction.coords) prediction.coords.dispose();\n }\n return results;\n}\n\nexport async function load(config): Promise<[unknown, unknown, unknown]> {\n if ((!faceModels[0] && config.face.enabled) || (!faceModels[1] && config.face.mesh.enabled) || (!faceModels[2] && config.face.iris.enabled)) {\n // @ts-ignore type mismatch for GraphModel\n faceModels = await Promise.all([\n (!faceModels[0] && config.face.enabled) ? blazeface.load(config) : null,\n (!faceModels[1] && config.face.mesh.enabled) ? tf.loadGraphModel(join(config.modelBasePath, config.face.mesh.modelPath), { fromTFHub: config.face.mesh.modelPath.includes('tfhub.dev') }) : null,\n (!faceModels[2] && config.face.iris.enabled) ? tf.loadGraphModel(join(config.modelBasePath, config.face.iris.modelPath), { fromTFHub: config.face.iris.modelPath.includes('tfhub.dev') }) : null,\n ]);\n if (config.face.mesh.enabled) {\n if (!faceModels[1] || !faceModels[1]['modelUrl']) log('load model failed:', config.face.mesh.modelPath);\n else if (config.debug) log('load model:', faceModels[1]['modelUrl']);\n }\n if (config.face.iris.enabled) {\n if (!faceModels[2] || !faceModels[2]['modelUrl']) log('load model failed:', config.face.iris.modelPath);\n else if (config.debug) log('load model:', faceModels[2]['modelUrl']);\n }\n } else if (config.debug) {\n if (faceModels[0]) log('cached model:', faceModels[0].model['modelUrl']);\n if (faceModels[1]) log('cached model:', faceModels[1]['modelUrl']);\n if (faceModels[2]) log('cached model:', faceModels[2]['modelUrl']);\n }\n facePipeline = new facepipeline.Pipeline(faceModels[0], faceModels[1], faceModels[2]);\n return faceModels;\n}\n\nexport const triangulation = coords.TRI468;\nexport const uvmap = coords.UV468;\n", "import * as tf from '../../dist/tfjs.esm.js';\n\nexport function scaleBoxCoordinates(box, factor) {\n const startPoint = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]];\n const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]];\n return { startPoint, endPoint };\n}\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 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]];\n const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]];\n return { startPoint, endPoint, landmarks: box.landmarks };\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 = [Math.round(centers[0] - halfSize), Math.round(centers[1] - halfSize)];\n const endPoint = [Math.round(centers[0] + halfSize), Math.round(centers[1] + halfSize)];\n return { startPoint, endPoint, landmarks: box.landmarks };\n}\n\nexport function 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, landmarks };\n}\n\nexport const disposeBox = (t) => {\n t.startPoint.dispose();\n t.endPoint.dispose();\n};\n\nexport const createBox = (startEndTensor) => ({\n startPoint: tf.slice(startEndTensor, [0, 0], [-1, 2]),\n endPoint: tf.slice(startEndTensor, [0, 2], [-1, 2]),\n});\n", "export const IDENTITY_MATRIX = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];\n/**\n * Normalizes the provided angle to the range -pi to pi.\n * @param angle The angle in radians to be normalized.\n */\nexport function normalizeRadians(angle) {\n return angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI));\n}\n\n/**\n * Computes the angle of rotation between two anchor points.\n * @param point1 First anchor point\n * @param point2 Second anchor point\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 function radToDegrees(rad) {\n return rad * 180 / Math.PI;\n}\n\nexport function buildTranslationMatrix(x, y) {\n return [[1, 0, x], [0, 1, y], [0, 0, 1]];\n}\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\nexport function xyDistanceBetweenPoints(a, b) {\n return Math.sqrt(((a[0] - b[0]) ** 2) + ((a[1] - b[1]) ** 2));\n}\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++) {\n anchors.push([anchorX, anchorY]);\n }\n }\n }\n }\n return anchors;\n}\n", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as util from './util';\nimport { Config } from '../config';\nimport { Tensor, GraphModel } from '../tfjs/types';\n\nconst keypointsCount = 6;\n\nfunction decodeBounds(boxOutputs, anchors, inputSize) {\n const boxStarts = tf.slice(boxOutputs, [0, 1], [-1, 2]);\n const centers = tf.add(boxStarts, anchors);\n const boxSizes = tf.slice(boxOutputs, [0, 3], [-1, 2]);\n const boxSizesNormalized = tf.div(boxSizes, inputSize);\n const centersNormalized = tf.div(centers, inputSize);\n const halfBoxSize = tf.div(boxSizesNormalized, 2);\n const starts = tf.sub(centersNormalized, halfBoxSize);\n const ends = tf.add(centersNormalized, halfBoxSize);\n const startNormalized = tf.mul(starts, inputSize);\n const endNormalized = tf.mul(ends, inputSize);\n const concatAxis = 1;\n return tf.concat2d([startNormalized, endNormalized], concatAxis);\n}\n\nexport class BlazeFaceModel {\n model: GraphModel;\n anchorsData: [number, number][];\n anchors: Tensor;\n inputSize: number;\n config: Config;\n\n constructor(model, config: Config) {\n this.model = model;\n this.anchorsData = util.generateAnchors(model.inputs[0].shape[1]);\n this.anchors = tf.tensor2d(this.anchorsData);\n this.inputSize = model.inputs[0].shape[2];\n this.config = config;\n }\n\n async getBoundingBoxes(inputImage: Tensor) {\n // sanity check on input\n // @ts-ignore isDisposed is internal property\n if ((!inputImage) || (inputImage.isDisposedInternal) || (inputImage.shape.length !== 4) || (inputImage.shape[1] < 1) || (inputImage.shape[2] < 1)) return null;\n const [batch, boxes, scores] = tf.tidy(() => {\n const resizedImage = inputImage.resizeBilinear([this.inputSize, this.inputSize]);\n const normalizedImage = resizedImage.div(127.5).sub(0.5);\n const res = this.model.execute(normalizedImage);\n let batchOut;\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 const concat384 = tf.concat([sorted[0], sorted[2]], 2); // dim: 384, 1 + 16\n const concat512 = tf.concat([sorted[1], sorted[3]], 2); // dim: 512, 1 + 16\n const concat = tf.concat([concat512, concat384], 1);\n batchOut = concat.squeeze(0);\n } else {\n batchOut = res.squeeze(); // when using tfhub model\n }\n const boxesOut = decodeBounds(batchOut, this.anchors, [this.inputSize, this.inputSize]);\n const logits = tf.slice(batchOut, [0, 0], [-1, 1]);\n const scoresOut = tf.sigmoid(logits).squeeze().dataSync();\n return [batchOut, boxesOut, scoresOut];\n });\n const nmsTensor = await tf.image.nonMaxSuppressionAsync(boxes, scores, this.config.face.detector.maxDetected, this.config.face.detector.iouThreshold, this.config.face.detector.minConfidence);\n const nms = nmsTensor.arraySync();\n nmsTensor.dispose();\n const annotatedBoxes: Array<{ box: { startPoint: Tensor, endPoint: Tensor }, landmarks: Tensor, anchor: number[], confidence: number }> = [];\n for (let i = 0; i < nms.length; i++) {\n const confidence = scores[nms[i]];\n if (confidence > this.config.face.detector.minConfidence) {\n const boundingBox = tf.slice(boxes, [nms[i], 0], [1, -1]);\n const localBox = box.createBox(boundingBox);\n boundingBox.dispose();\n const anchor = this.anchorsData[nms[i]];\n const landmarks = tf.tidy(() => tf.slice(batch, [nms[i], keypointsCount - 1], [1, -1]).squeeze().reshape([keypointsCount, -1]));\n annotatedBoxes.push({ box: localBox, landmarks, anchor, confidence });\n }\n }\n // boundingBoxes.forEach((t) => t.dispose());\n batch.dispose();\n boxes.dispose();\n // scores.dispose();\n return {\n boxes: annotatedBoxes,\n scaleFactor: [inputImage.shape[2] / this.inputSize, inputImage.shape[1] / this.inputSize],\n };\n }\n}\n\nexport async function load(config: Config) {\n const model = await tf.loadGraphModel(join(config.modelBasePath, config.face.detector.modelPath), { fromTFHub: config.face.detector.modelPath.includes('tfhub.dev') });\n const blazeFace = new BlazeFaceModel(model, config);\n if (!model || !model.modelUrl) log('load model failed:', config.face.detector.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n return blazeFace;\n}\n", "export const MESH_ANNOTATIONS = {\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 MESH_TO_IRIS_INDICES_MAP = [ // 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 = [\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 = [\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 = [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 = [\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 = [0, 4, 1, 2, 4, 3, 4, 5, 6];\n\nexport const VTX68 = [\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 = [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 = [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", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as bounding from './box';\nimport * as util from './util';\nimport * as coords from './coords';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { BlazeFaceModel } from './blazeface';\n\nconst leftOutline = coords.MESH_ANNOTATIONS['leftEyeLower0'];\nconst rightOutline = coords.MESH_ANNOTATIONS['rightEyeLower0'];\n\nconst eyeLandmarks = {\n leftBounds: [leftOutline[0], leftOutline[leftOutline.length - 1]],\n rightBounds: [rightOutline[0], rightOutline[rightOutline.length - 1]],\n};\n\nconst meshLandmarks = {\n count: 468,\n mouth: 13,\n symmetryLine: [13, coords.MESH_ANNOTATIONS['midwayBetweenEyes'][0]],\n};\n\nconst blazeFaceLandmarks = {\n leftEye: 0,\n rightEye: 1,\n nose: 2,\n mouth: 3,\n leftEar: 4,\n rightEar: 5,\n symmetryLine: [3, 2],\n};\n\nconst irisLandmarks = {\n upperCenter: 3,\n lowerCenter: 4,\n index: 71,\n numCoordinates: 76,\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.MESH_ANNOTATIONS[`${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// The Pipeline coordinates between the bounding box and skeleton models.\nexport class Pipeline {\n storedBoxes: Array<{ startPoint: number[], endPoint: number[], landmarks: Array, confidence: number, faceConfidence?: number }>;\n boundingBoxDetector: BlazeFaceModel; // tf.GraphModel\n meshDetector: GraphModel; // tf.GraphModel\n irisModel: GraphModel; // tf.GraphModel\n boxSize: number;\n meshSize: number;\n irisSize: number;\n irisEnlarge: number;\n skipped: number;\n detectedFaces: number;\n\n constructor(boundingBoxDetector, meshDetector, irisModel) {\n // An array of facial bounding boxes.\n this.storedBoxes = [];\n this.boundingBoxDetector = boundingBoxDetector;\n this.meshDetector = meshDetector;\n this.irisModel = irisModel;\n this.boxSize = boundingBoxDetector?.model?.inputs[0].shape[2] || 0;\n this.meshSize = meshDetector?.inputs[0].shape[2] || boundingBoxDetector?.model?.inputs[0].shape[2];\n this.irisSize = irisModel?.inputs[0].shape[1] || 0;\n this.irisEnlarge = 2.3;\n this.skipped = 0;\n this.detectedFaces = 0;\n }\n\n transformRawCoords(rawCoords, box, angle, rotationMatrix) {\n const boxSize = bounding.getBoxSize({ startPoint: box.startPoint, endPoint: box.endPoint });\n const coordsScaled = rawCoords.map((coord) => ([\n boxSize[0] / this.meshSize * (coord[0] - this.meshSize / 2),\n boxSize[1] / this.meshSize * (coord[1] - this.meshSize / 2),\n coord[2],\n ]));\n const coordsRotationMatrix = (angle !== 0) ? util.buildRotationMatrix(angle, [0, 0]) : util.IDENTITY_MATRIX;\n const coordsRotated = (angle !== 0) ? coordsScaled.map((coord) => ([...util.rotatePoint(coord, coordsRotationMatrix), coord[2]])) : coordsScaled;\n const inverseRotationMatrix = (angle !== 0) ? util.invertTransformMatrix(rotationMatrix) : util.IDENTITY_MATRIX;\n const boxCenter = [...bounding.getBoxCenter({ startPoint: box.startPoint, endPoint: box.endPoint }), 1];\n return coordsRotated.map((coord) => ([\n Math.round(coord[0] + util.dot(boxCenter, inverseRotationMatrix[0])),\n Math.round(coord[1] + util.dot(boxCenter, inverseRotationMatrix[1])),\n Math.round(coord[2]),\n ]));\n }\n\n // eslint-disable-next-line class-methods-use-this\n 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.\n getEyeBox(rawCoords, face, eyeInnerCornerIndex, eyeOuterCornerIndex, flip = false) {\n const box = bounding.squarifyBox(bounding.enlargeBox(bounding.calculateLandmarksBoundingBox([rawCoords[eyeInnerCornerIndex], rawCoords[eyeOuterCornerIndex]]), this.irisEnlarge));\n const boxSize = bounding.getBoxSize(box);\n let crop = tf.image.cropAndResize(face, [[\n box.startPoint[1] / this.meshSize,\n box.startPoint[0] / this.meshSize, box.endPoint[1] / this.meshSize,\n box.endPoint[0] / this.meshSize,\n ]], [0], [this.irisSize, this.irisSize]);\n if (flip && tf.ENV.flags.IS_BROWSER) {\n crop = tf.image.flipLeftRight(crop); // flipLeftRight is not defined for tfjs-node\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.\n getEyeCoords(eyeData, eyeBox, eyeBoxSize, flip = false) {\n const eyeRawCoords: Array<[number, number, number]> = [];\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 / this.irisSize)) : (x / this.irisSize)) * eyeBoxSize[0] + eyeBox.startPoint[0],\n (y / this.irisSize) * 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\n getAdjustedIrisCoords(rawCoords, irisCoords, direction) {\n const upperCenterZ = rawCoords[coords.MESH_ANNOTATIONS[`${direction}EyeUpper0`][irisLandmarks.upperCenter]][2];\n const lowerCenterZ = rawCoords[coords.MESH_ANNOTATIONS[`${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\n async predict(input, config) {\n let useFreshBox = false;\n // run new detector every skipFrames unless we only want box to start with\n let detector;\n if ((this.skipped === 0) || (this.skipped > config.face.detector.skipFrames) || !config.face.mesh.enabled || !config.skipFrame) {\n detector = await this.boundingBoxDetector.getBoundingBoxes(input);\n this.skipped = 0;\n }\n if (config.skipFrame) this.skipped++;\n\n // if detector result count doesn't match current working set, use it to reset current working set\n if (!config.skipFrame || (detector && detector.boxes && (!config.face.mesh.enabled || (detector.boxes.length !== this.detectedFaces) && (this.detectedFaces !== config.face.detector.maxDetected)))) {\n this.storedBoxes = [];\n this.detectedFaces = 0;\n for (const possible of detector.boxes) {\n this.storedBoxes.push({ startPoint: possible.box.startPoint.dataSync(), endPoint: possible.box.endPoint.dataSync(), landmarks: possible.landmarks.arraySync(), confidence: possible.confidence });\n }\n if (this.storedBoxes.length > 0) useFreshBox = true;\n }\n\n if (useFreshBox) {\n if (!detector || !detector.boxes || (detector.boxes.length === 0)) {\n this.storedBoxes = [];\n this.detectedFaces = 0;\n return null;\n }\n for (let i = 0; i < this.storedBoxes.length; i++) {\n const scaledBox = bounding.scaleBoxCoordinates({ startPoint: this.storedBoxes[i].startPoint, endPoint: this.storedBoxes[i].endPoint }, detector.scaleFactor);\n const enlargedBox = bounding.enlargeBox(scaledBox);\n const squarifiedBox = bounding.squarifyBox(enlargedBox);\n const landmarks = this.storedBoxes[i].landmarks;\n const confidence = this.storedBoxes[i].confidence;\n this.storedBoxes[i] = { ...squarifiedBox, confidence, landmarks };\n }\n }\n if (detector && detector.boxes) {\n detector.boxes.forEach((prediction) => {\n prediction.box.startPoint.dispose();\n prediction.box.endPoint.dispose();\n prediction.landmarks.dispose();\n });\n }\n const results = tf.tidy(() => this.storedBoxes.map((box, i) => {\n // The facial bounding box landmarks could come either from blazeface (if we are using a fresh box), or from the mesh model (if we are reusing an old box).\n let face;\n let angle = 0;\n let rotationMatrix;\n\n if (config.face.detector.rotation && config.face.mesh.enabled && tf.ENV.flags.IS_BROWSER) {\n const [indexOfMouth, indexOfForehead] = (box.landmarks.length >= meshLandmarks.count) ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine;\n angle = util.computeRotation(box.landmarks[indexOfMouth], box.landmarks[indexOfForehead]);\n const faceCenter = bounding.getBoxCenter({ startPoint: box.startPoint, endPoint: box.endPoint });\n const faceCenterNormalized = [faceCenter[0] / input.shape[2], faceCenter[1] / input.shape[1]];\n const rotatedImage = tf.image.rotateWithOffset(input, angle, 0, faceCenterNormalized); // rotateWithOffset is not defined for tfjs-node\n rotationMatrix = util.buildRotationMatrix(-angle, faceCenter);\n if (config.face.mesh.enabled) face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.meshSize, this.meshSize]).div(255);\n else face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.boxSize, this.boxSize]).div(255);\n } else {\n rotationMatrix = util.IDENTITY_MATRIX;\n const clonedImage = input.clone();\n if (config.face.mesh.enabled) face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, clonedImage, [this.meshSize, this.meshSize]).div(255);\n else face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, clonedImage, [this.boxSize, this.boxSize]).div(255);\n }\n\n // if we're not going to produce mesh, don't spend time with further processing\n if (!config.face.mesh.enabled) {\n const prediction = {\n mesh: [],\n box,\n faceConfidence: null,\n boxConfidence: box.confidence,\n confidence: box.confidence,\n image: face,\n };\n return prediction;\n }\n\n const [, confidence, contourCoords] = this.meshDetector.execute(face) as Array; // The first returned tensor represents facial contours which are already included in the coordinates.\n const faceConfidence = confidence.dataSync()[0] as number;\n if (faceConfidence < config.face.detector.minConfidence) {\n this.storedBoxes[i].confidence = faceConfidence; // reset confidence of cached box\n return null; // if below confidence just exit\n }\n const coordsReshaped = tf.reshape(contourCoords, [-1, 3]);\n let rawCoords = coordsReshaped.arraySync();\n\n if (config.face.iris.enabled) {\n const { box: leftEyeBox, boxSize: leftEyeBoxSize, crop: leftEyeCrop } = this.getEyeBox(rawCoords, face, eyeLandmarks.leftBounds[0], eyeLandmarks.leftBounds[1], true);\n const { box: rightEyeBox, boxSize: rightEyeBoxSize, crop: rightEyeCrop } = this.getEyeBox(rawCoords, face, eyeLandmarks.rightBounds[0], eyeLandmarks.rightBounds[1]);\n const eyePredictions = this.irisModel.predict(tf.concat([leftEyeCrop, rightEyeCrop])) as Tensor;\n const eyePredictionsData = eyePredictions.dataSync();\n const leftEyeData = eyePredictionsData.slice(0, irisLandmarks.numCoordinates * 3);\n const { rawCoords: leftEyeRawCoords, iris: leftIrisRawCoords } = this.getEyeCoords(leftEyeData, leftEyeBox, leftEyeBoxSize, true);\n const rightEyeData = eyePredictionsData.slice(irisLandmarks.numCoordinates * 3);\n const { rawCoords: rightEyeRawCoords, iris: rightIrisRawCoords } = this.getEyeCoords(rightEyeData, rightEyeBox, rightEyeBoxSize);\n const leftToRightEyeDepthDifference = this.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 = this.getAdjustedIrisCoords(rawCoords, leftIrisRawCoords, 'left');\n const adjustedRightIrisCoords = this.getAdjustedIrisCoords(rawCoords, rightIrisRawCoords, 'right');\n rawCoords = rawCoords.concat(adjustedLeftIrisCoords).concat(adjustedRightIrisCoords);\n }\n\n // override box from detection with one calculated from mesh\n const mesh = this.transformRawCoords(rawCoords, box, angle, rotationMatrix);\n const storeConfidence = box.confidence;\n // @ts-ignore enlargeBox does not include confidence so we append it manually\n box = bounding.enlargeBox(bounding.calculateLandmarksBoundingBox(mesh), 1.5); // redefine box with mesh calculated one\n box.confidence = storeConfidence;\n\n // do rotation one more time with mesh keypoints if we want to return perfect image\n if (config.face.detector.rotation && config.face.mesh.enabled && config.face.description.enabled && tf.ENV.flags.IS_BROWSER) {\n const [indexOfMouth, indexOfForehead] = (box.landmarks.length >= meshLandmarks.count) ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine;\n angle = util.computeRotation(box.landmarks[indexOfMouth], box.landmarks[indexOfForehead]);\n const faceCenter = bounding.getBoxCenter({ startPoint: box.startPoint, endPoint: box.endPoint });\n const faceCenterNormalized = [faceCenter[0] / input.shape[2], faceCenter[1] / input.shape[1]];\n const rotatedImage = tf.image.rotateWithOffset(input.toFloat(), angle, 0, faceCenterNormalized); // rotateWithOffset is not defined for tfjs-node\n rotationMatrix = util.buildRotationMatrix(-angle, faceCenter);\n face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.meshSize, this.meshSize]).div(255);\n }\n\n const prediction = {\n mesh,\n box,\n faceConfidence,\n boxConfidence: box.confidence,\n image: face,\n };\n\n // updated stored cache values\n this.storedBoxes[i] = { ...bounding.squarifyBox(box), confidence: box.confidence, faceConfidence };\n\n return prediction;\n }));\n\n // results = results.filter((a) => a !== null);\n // remove cache entries for detected boxes on low confidence\n if (config.face.mesh.enabled) this.storedBoxes = this.storedBoxes.filter((a) => a.confidence > config.face.detector.minConfidence);\n this.detectedFaces = results.length;\n\n return results;\n }\n}\n", "/**\n * Emotion Module\n */\n\nimport { log, join } from '../helpers';\nimport { Config } from '../config';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport * as tf from '../../dist/tfjs.esm.js';\n\nconst annotations = ['angry', 'disgust', 'fear', 'happy', 'sad', 'surprise', 'neutral'];\nlet model;\n// let last: Array<{ score: number, emotion: string }> = [];\nconst last: Array> = [];\nlet lastCount = 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\nexport async function load(config: Config): Promise {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.face.emotion.modelPath));\n if (!model || !model.modelUrl) log('load model failed:', config.face.emotion.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n\nexport async function predict(image: Tensor, config: Config, idx, count) {\n if (!model) return null;\n if ((skipped < config.face.emotion.skipFrames) && config.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 resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n const [red, green, blue] = tf.split(resize, 3, 3);\n resize.dispose();\n // weighted rgb to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\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 red.dispose();\n green.dispose();\n blue.dispose();\n const grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\n redNorm.dispose();\n greenNorm.dispose();\n blueNorm.dispose();\n const normalize = tf.tidy(() => grayscale.sub(0.5).mul(2));\n grayscale.dispose();\n const obj: Array<{ score: number, emotion: string }> = [];\n if (config.face.emotion.enabled) {\n const emotionT = await model.predict(normalize); // result is already in range 0..1, no need for additional activation\n const data = emotionT.dataSync();\n tf.dispose(emotionT);\n for (let i = 0; i < data.length; i++) {\n if (data[i] > config.face.emotion.minConfidence) obj.push({ score: Math.min(0.99, Math.trunc(100 * data[i]) / 100), emotion: annotations[i] });\n }\n obj.sort((a, b) => b.score - a.score);\n }\n normalize.dispose();\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "/**\n * HSE-FaceRes Module\n * Returns Age, Gender, Descriptor\n * Implements Face simmilarity function\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model: GraphModel;\nconst last: Array<{\n age: number,\n gender: string,\n genderScore: number,\n descriptor: number[],\n}> = [];\n\nlet lastCount = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\ntype DB = Array<{ name: string, source: string, embedding: number[] }>;\n\nexport async function load(config: Config): Promise {\n const modelUrl = join(config.modelBasePath, config.face.description.modelPath);\n if (!model) {\n // @ts-ignore type mismatch for GraphModel\n model = await tf.loadGraphModel(modelUrl);\n if (!model) log('load model failed:', config.face.description.modelPath);\n else if (config.debug) log('load model:', modelUrl);\n } else if (config.debug) log('cached model:', modelUrl);\n return model;\n}\n\nexport function similarity(embedding1: Array, embedding2: Array, order = 2): number {\n if (!embedding1 || !embedding2) return 0;\n if (embedding1?.length === 0 || embedding2?.length === 0) return 0;\n if (embedding1?.length !== embedding2?.length) return 0;\n // general minkowski distance, euclidean distance is limited case where order is 2\n const distance = 5.0 * embedding1\n .map((val, i) => (Math.abs(embedding1[i] - embedding2[i]) ** order)) // distance squared\n .reduce((sum, now) => (sum + now), 0) // sum all distances\n ** (1 / order); // get root of\n const res = Math.max(0, 100 - distance) / 100.0;\n return res;\n}\n\nexport function match(embedding: Array, db: DB, threshold = 0) {\n let best = { similarity: 0, name: '', source: '', embedding: [] as number[] };\n if (!embedding || !db || !Array.isArray(embedding) || !Array.isArray(db)) return best;\n for (const f of db) {\n if (f.embedding && f.name) {\n const perc = similarity(embedding, f.embedding);\n if (perc > threshold && perc > best.similarity) best = { ...f, similarity: perc };\n }\n }\n return best;\n}\n\nexport function enhance(input): Tensor {\n const image = tf.tidy(() => {\n // input received from detector is already normalized to 0..1\n // input is also assumed to be straightened\n const tensor = input.image || input.tensor || input;\n if (!(tensor instanceof tf.Tensor)) return null;\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 box = [[0.0, 0.0, 1.0, 1.0]]; // basically no crop for test\n if (!model.inputs[0].shape) return null; // model has no shape so no point continuing\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 // just resize to fit the embedding model instead of cropping\n const crop = tf.image.resizeBilinear(tensor, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n */\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 /*\n // increase image pseudo-contrast 100%\n // (or do it per-channel so mean is done on each channel)\n // (or calculate histogram and do it based on histogram)\n const mean = merge.mean();\n const factor = 2;\n const contrast = merge.sub(mean).mul(factor).add(mean);\n */\n\n /*\n // normalize brightness from 0..1\n // silly way of creating pseudo-hdr of image\n const darken = crop.sub(crop.min());\n const lighten = darken.div(darken.max());\n */\n\n const norm = crop.mul(255);\n\n return norm;\n });\n return image;\n}\n\nexport async function predict(image: Tensor, config: Config, idx, count) {\n if (!model) return null;\n if ((skipped < config.face.description.skipFrames) && config.skipFrame && (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 enhanced = enhance(image);\n\n let resT;\n const obj = {\n age: 0,\n gender: 'unknown',\n genderScore: 0,\n descriptor: [],\n };\n\n if (config.face.description.enabled) resT = await model.predict(enhanced);\n tf.dispose(enhanced);\n\n if (resT) {\n tf.tidy(() => {\n const gender = resT.find((t) => t.shape[1] === 1).dataSync();\n const confidence = Math.trunc(200 * Math.abs((gender[0] - 0.5))) / 100;\n if (confidence > config.face.description.minConfidence) {\n obj.gender = gender[0] <= 0.5 ? 'female' : 'male';\n obj.genderScore = Math.min(0.99, confidence);\n }\n const age = resT.find((t) => t.shape[1] === 100).argMax(1).dataSync()[0];\n const all = resT.find((t) => t.shape[1] === 100).dataSync();\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\n obj.descriptor = [...desc.dataSync()];\n });\n resT.forEach((t) => tf.dispose(t));\n }\n\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "/**\n * Module that analyzes person age\n * Obsolete\n */\n\nimport { log, now } from './helpers';\nimport * as tf from '../dist/tfjs.esm.js';\nimport * as facemesh from './blazeface/facemesh';\nimport * as emotion from './emotion/emotion';\nimport * as faceres from './faceres/faceres';\nimport { Face } from './result';\nimport { Tensor } from './tfjs/types';\n\n// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\nconst rad2deg = (theta) => Math.round((theta * 180) / Math.PI);\n\nconst calculateGaze = (mesh, box): { bearing: number, strength: number } => {\n const radians = (pt1, pt2) => Math.atan2(pt1[1] - pt2[1], pt1[0] - pt2[0]); // function to calculate angle between any two points\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 = mesh[33][2] > mesh[263][2]; // pick left or right eye depending which one is closer bazed on outsize point z axis\n const irisCenter = left ? mesh[473] : 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 ? [(mesh[133][0] + mesh[33][0]) / 2, (mesh[133][1] + mesh[33][1]) / 2]\n : [(mesh[263][0] + mesh[362][0]) / 2, (mesh[263][1] + 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 ? [mesh[133][0] - mesh[33][0], mesh[23][1] - mesh[27][1]]\n : [mesh[263][0] - mesh[362][0], mesh[253][1] - mesh[257][1]];\n\n const eyeDiff = [ // 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] ** 2) + (eyeDiff[1] ** 2)); // vector length is a diagonal between two differences\n strength = Math.min(strength, box[2] / 2, box[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\n return { bearing, strength };\n};\n\nconst calculateFaceAngle = (face, imageSize): {\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) => { // 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, b) => { // 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, b) => { // 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) => {\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; let thetaY; let thetaZ;\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 return { pitch: 2 * -thetaX, yaw: 2 * -thetaY, roll: 2 * -thetaZ };\n };\n // simple Euler angle calculation based existing 3D mesh\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const meshToEulerAngle = (mesh) => {\n const radians = (a1, a2, b1, b2) => Math.atan2(b2 - a2, b1 - a1);\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const angle = {\n // 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 is face move up/down\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\n // yaw is face turn left/right\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\n // roll is face lean 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\n };\n return angle;\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 = [mesh[10], mesh[152], mesh[234], mesh[454]].map((pt) => [\n // make the xyz coordinates proportional, independent of the image/box size\n pt[0] * imageSize[0] / size,\n pt[1] * imageSize[1] / size,\n pt[2],\n ]);\n\n const y_axis = normalize(subVectors(pts[1], pts[0]));\n let x_axis = normalize(subVectors(pts[3], pts[2]));\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(mesh, face.box) : { bearing: 0, strength: 0 };\n\n return { angle, matrix, gaze };\n};\n\nexport const detectFace = async (parent /* 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;\n let ageRes;\n let genderRes;\n let emotionRes;\n let embeddingRes;\n let descRes;\n const faceRes: Array = [];\n parent.state = 'run:face';\n timeStamp = now();\n const faces = await facemesh.predict(input, parent.config);\n parent.performance.face = 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 parent.analyze('Get Face');\n\n // is something went wrong, skip the face\n // @ts-ignore possibly undefined\n if (!faces[i].image || faces[i].image['isDisposedInternal']) {\n log('Face object is disposed:', faces[i].image);\n continue;\n }\n\n const rotation = calculateFaceAngle(faces[i], [input.shape[2], input.shape[1]]);\n\n // run emotion, inherits face from blazeface\n parent.analyze('Start Emotion:');\n if (parent.config.async) {\n emotionRes = parent.config.face.emotion.enabled ? emotion.predict(faces[i].image || tf.tensor([]), parent.config, i, faces.length) : {};\n } else {\n parent.state = 'run:emotion';\n timeStamp = now();\n emotionRes = parent.config.face.emotion.enabled ? await emotion.predict(faces[i].image || tf.tensor([]), parent.config, i, faces.length) : {};\n parent.performance.emotion = Math.trunc(now() - timeStamp);\n }\n parent.analyze('End Emotion:');\n\n // run emotion, inherits face from blazeface\n parent.analyze('Start Description:');\n if (parent.config.async) {\n descRes = parent.config.face.description.enabled ? faceres.predict(faces[i].image || tf.tensor([]), parent.config, i, faces.length) : [];\n } else {\n parent.state = 'run:description';\n timeStamp = now();\n descRes = parent.config.face.description.enabled ? await faceres.predict(faces[i].image || tf.tensor([]), parent.config, i, faces.length) : [];\n parent.performance.embedding = Math.trunc(now() - timeStamp);\n }\n parent.analyze('End Description:');\n\n // if async wait for results\n if (parent.config.async) {\n [ageRes, genderRes, emotionRes, embeddingRes, descRes] = await Promise.all([ageRes, genderRes, emotionRes, embeddingRes, descRes]);\n }\n\n parent.analyze('Finish Face:');\n\n // calculate iris distance\n // iris: array[ center, left, top, right, bottom]\n if (!parent.config.face.iris.enabled && faces[i]?.annotations?.leftEyeIris && faces[i]?.annotations?.rightEyeIris) {\n delete faces[i].annotations.leftEyeIris;\n delete faces[i].annotations.rightEyeIris;\n }\n const irisSize = (faces[i].annotations?.leftEyeIris && faces[i].annotations?.rightEyeIris)\n /* note: average human iris size is 11.7mm */\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;\n\n // combine results\n faceRes.push({\n ...faces[i],\n id: i,\n age: descRes.age,\n gender: descRes.gender,\n genderScore: descRes.genderScore,\n embedding: descRes.descriptor,\n emotion: emotionRes,\n iris: irisSize !== 0 ? Math.trunc(500 / irisSize / 11.7) / 100 : 0,\n rotation,\n tensor: parent.config.face.detector.return ? tf.squeeze(faces[i].image) : null,\n });\n // dispose original face tensor\n tf.dispose(faces[i].image);\n // delete temp face image\n if (faces[i].image) delete faces[i].image;\n\n parent.analyze('End Face');\n }\n parent.analyze('End FaceMesh:');\n if (parent.config.async) {\n if (parent.performance.face) delete parent.performance.face;\n if (parent.performance.age) delete parent.performance.age;\n if (parent.performance.gender) delete parent.performance.gender;\n if (parent.performance.emotion) delete parent.performance.emotion;\n }\n return faceRes;\n};\n", "/**\n * PoseNet module entry point\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as poses from './poses';\nimport * as util from './utils';\nimport { Body } from '../result';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { Config } from '../config';\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 */];\n\nexport async function predict(input: Tensor, config: Config): Promise {\n const res = tf.tidy(() => {\n if (!model.inputs[0].shape) return [];\n const resized = input.resizeBilinear([model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n const normalized = resized.toFloat().div(127.5).sub(1.0);\n const results: Array = model.execute(normalized, poseNetOutputs) as Array;\n const results3d = results.map((y) => y.squeeze([0]));\n results3d[1] = results3d[1].sigmoid(); // apply sigmoid on scores\n return results3d;\n });\n\n const buffers = await Promise.all(res.map((tensor) => tensor.buffer()));\n for (const t of res) t.dispose();\n\n const decoded = await poses.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 = util.scalePoses(decoded, [input.shape[1], input.shape[2]], [model.inputs[0].shape[2], model.inputs[0].shape[1]]) as Body[];\n return scaled;\n}\n\nexport async function load(config: Config): Promise {\n if (!model) {\n // @ts-ignore type mismatch for GraphModel\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath));\n if (!model || !model['modelUrl']) log('load model failed:', config.body.modelPath);\n else if (config.debug) log('load model:', model['modelUrl']);\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n", "export 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", "import * as kpt from './keypoints';\nimport { Body } from '../result';\n\nexport function eitherPointDoesntMeetConfidence(a, b, minConfidence) {\n return (a < minConfidence || b < minConfidence);\n}\n\nexport function getAdjacentKeyPoints(keypoints, minConfidence) {\n return kpt.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) => ({\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,\n part,\n position: [Math.trunc(position.x * scaleX), Math.trunc(position.y * scaleY)],\n positionRaw: [position.x / inputResolutionHeight, position.y / inputResolutionHeight],\n })),\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 + kpt.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", "import * as utils from './utils';\nimport * as kpt from './keypoints';\n\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: kpt.partNames[targetId], score };\n}\n\nexport function decodePose(root, scores, offsets, displacementsFwd, displacementsBwd) {\n const tuples = kpt.poseChain.map(([parentJoinName, childJoinName]) => ([kpt.partIds[parentJoinName], kpt.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: kpt.partNames[root.part.id],\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: [number, number, number, number], 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", "/**\n * HandPose module entry point\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as handdetector from './handdetector';\nimport * as handpipeline from './handpipeline';\nimport { Hand } from '../result';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { Config } from '../config';\n\nconst meshAnnotations = {\n thumb: [1, 2, 3, 4],\n indexFinger: [5, 6, 7, 8],\n middleFinger: [9, 10, 11, 12],\n ringFinger: [13, 14, 15, 16],\n pinky: [17, 18, 19, 20],\n palmBase: [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 // @ts-ignore landmarks are not undefined\n annotations[key] = meshAnnotations[key].map((index) => predictions[i].landmarks[index]);\n }\n }\n\n const keypoints = predictions[i].landmarks as unknown as Array<[number, number, number]>;\n\n let box: [number, number, number, number] = [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, 0, 0]; // maximums so conditionals work\n let boxRaw: [number, number, number, number] = [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 hands.push({ id: i, score: Math.round(100 * predictions[i].confidence) / 100, box, boxRaw, keypoints, annotations });\n }\n return hands;\n}\n\nexport async function load(config: Config): Promise<[unknown, unknown]> {\n if (!handDetectorModel || !handPoseModel) {\n // @ts-ignore type mismatch on GraphModel\n [handDetectorModel, handPoseModel] = await Promise.all([\n config.hand.enabled ? tf.loadGraphModel(join(config.modelBasePath, config.hand.detector.modelPath), { fromTFHub: config.hand.detector.modelPath.includes('tfhub.dev') }) : null,\n config.hand.landmarks ? tf.loadGraphModel(join(config.modelBasePath, config.hand.skeleton.modelPath), { fromTFHub: config.hand.skeleton.modelPath.includes('tfhub.dev') }) : null,\n ]);\n if (config.hand.enabled) {\n if (!handDetectorModel || !handDetectorModel['modelUrl']) log('load model failed:', config.hand.detector.modelPath);\n else if (config.debug) log('load model:', handDetectorModel['modelUrl']);\n if (!handPoseModel || !handPoseModel['modelUrl']) log('load model failed:', config.hand.skeleton.modelPath);\n else if (config.debug) log('load model:', handPoseModel['modelUrl']);\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", "import * as tf from '../../dist/tfjs.esm.js';\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]];\n const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]];\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]];\n const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]];\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];\n const endPoint = [centers[0] + halfSize, centers[1] + halfSize];\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]];\n const endPoint = [box.endPoint[0] + shiftVector[0], box.endPoint[1] + shiftVector[1]];\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n", "export 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", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as anchors from './anchors';\nimport { Tensor, GraphModel } from '../tfjs/types';\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 // @ts-ignore model is not undefined here\n this.inputSize = this.model?.inputs[0].shape[2];\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 return tf.tidy(() => {\n const boxOffsets = tf.slice(boxes, [0, 0], [-1, 2]);\n const boxSizes = tf.slice(boxes, [0, 2], [-1, 2]);\n const boxCenterPoints = tf.add(tf.div(boxOffsets, this.inputSizeTensor), this.anchorsTensor);\n const halfBoxSizes = tf.div(boxSizes, this.doubleInputSizeTensor);\n const startPoints = tf.mul(tf.sub(boxCenterPoints, halfBoxSizes), this.inputSizeTensor);\n const endPoints = tf.mul(tf.add(boxCenterPoints, halfBoxSizes), this.inputSizeTensor);\n return tf.concat2d([startPoints, endPoints], 1);\n });\n }\n\n normalizeLandmarks(rawPalmLandmarks, index) {\n return tf.tidy(() => {\n const landmarks = tf.add(tf.div(rawPalmLandmarks.reshape([-1, 7, 2]), this.inputSizeTensor), this.anchors[index]);\n return tf.mul(landmarks, this.inputSizeTensor);\n });\n }\n\n async getBoxes(input, config) {\n const batched = this.model.predict(input) as Tensor;\n const predictions = batched.squeeze();\n batched.dispose();\n const scoresT = tf.tidy(() => tf.sigmoid(tf.slice(predictions, [0, 0], [-1, 1])).squeeze());\n const scores = scoresT.dataSync();\n const rawBoxes = tf.slice(predictions, [0, 1], [-1, 4]);\n const boxes = this.normalizeBoxes(rawBoxes);\n rawBoxes.dispose();\n const filteredT = await tf.image.nonMaxSuppressionAsync(boxes, scores, config.hand.maxDetected, config.hand.iouThreshold, config.hand.minConfidence);\n const filtered = filteredT.arraySync();\n\n scoresT.dispose();\n filteredT.dispose();\n const hands: Array<{ box: Tensor, palmLandmarks: Tensor, confidence: number }> = [];\n for (const index of filtered) {\n if (scores[index] >= config.hand.minConfidence) {\n const matchingBox = tf.slice(boxes, [index, 0], [1, -1]);\n const rawPalmLandmarks = tf.slice(predictions, [index, 5], [1, 14]);\n const palmLandmarks = tf.tidy(() => this.normalizeLandmarks(rawPalmLandmarks, index).reshape([-1, 2]));\n rawPalmLandmarks.dispose();\n hands.push({ box: matchingBox, palmLandmarks, confidence: scores[index] });\n }\n }\n predictions.dispose();\n boxes.dispose();\n return hands;\n }\n\n async estimateHandBounds(input, config): Promise<{ startPoint: number[]; endPoint: number[]; palmLandmarks: number[]; confidence: number }[]> {\n const inputHeight = input.shape[1];\n const inputWidth = input.shape[2];\n const image = tf.tidy(() => input.resizeBilinear([this.inputSize, this.inputSize]).div(127.5).sub(1));\n const predictions = await this.getBoxes(image, config);\n image.dispose();\n const hands: Array<{ startPoint: number[]; endPoint: number[]; palmLandmarks: number[]; confidence: number }> = [];\n if (!predictions || predictions.length === 0) return hands;\n for (const prediction of predictions) {\n const boxes = prediction.box.dataSync();\n const startPoint = boxes.slice(0, 2);\n const endPoint = boxes.slice(2, 4);\n const palmLandmarks = prediction.palmLandmarks.arraySync();\n prediction.box.dispose();\n prediction.palmLandmarks.dispose();\n hands.push(box.scaleBoxCoordinates({ startPoint, endPoint, palmLandmarks, confidence: prediction.confidence }, [inputWidth / this.inputSize, inputHeight / this.inputSize]));\n }\n return hands;\n }\n}\n", "export 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", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as util from './util';\nimport * as detector from './handdetector';\nimport { Tensor, GraphModel } from '../tfjs/types';\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;\n\nexport class HandPipeline {\n handDetector: detector.HandDetector;\n handPoseModel: GraphModel;\n inputSize: number;\n storedBoxes: Array<{ startPoint: number[]; endPoint: number[]; palmLandmarks: number[]; confidence: number } | null>;\n skipped: number;\n detectedHands: number;\n\n constructor(handDetector, handPoseModel) {\n this.handDetector = handDetector;\n this.handPoseModel = handPoseModel;\n // @ts-ignore model is not undefined here\n this.inputSize = this.handPoseModel?.inputs[0].shape[2];\n this.storedBoxes = [];\n this.skipped = 0;\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 box.enlargeBox(box.squarifyBox(boxAroundPalm), palmBoxEnlargeFactor);\n }\n\n getBoxForHandLandmarks(landmarks) {\n const boundingBox = this.calculateLandmarksBoundingBox(landmarks);\n const boxAroundHand = box.enlargeBox(box.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 = box.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 = [...box.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 unless we only want box to start with\n let boxes;\n\n // console.log(this.skipped, config.hand.skipFrames, !config.hand.landmarks, !config.skipFrame);\n if ((this.skipped === 0) || (this.skipped > config.hand.skipFrames) || !config.hand.landmarks || !config.skipFrame) {\n boxes = await this.handDetector.estimateHandBounds(image, config);\n this.skipped = 0;\n }\n if (config.skipFrame) 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?: number[], confidence: number, box: { topLeft: number[], bottomRight: number[] } }> = [];\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 = box.getBoxCenter(currentBox);\n const palmCenterNormalized = [palmCenter[0] / image.shape[2], palmCenter[1] / image.shape[1]];\n const rotatedImage = config.hand.rotation && tf.ENV.flags.IS_BROWSER ? 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 = box.cutBoxFromImageAndResize(newBox, rotatedImage, [this.inputSize, this.inputSize]);\n const handImage = croppedInput.div(255);\n croppedInput.dispose();\n rotatedImage.dispose();\n const [confidenceT, keypoints] = await this.handPoseModel.predict(handImage) as Array;\n handImage.dispose();\n const confidence = confidenceT.dataSync()[0];\n confidenceT.dispose();\n if (confidence >= config.hand.minConfidence) {\n const keypointsReshaped = tf.reshape(keypoints, [-1, 3]);\n const rawCoords = keypointsReshaped.arraySync();\n keypoints.dispose();\n keypointsReshaped.dispose();\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 box: { topLeft: nextBoundingBox.startPoint, bottomRight: nextBoundingBox.endPoint },\n };\n hands.push(result);\n } else {\n this.storedBoxes[i] = null;\n }\n keypoints.dispose();\n } else {\n // const enlarged = box.enlargeBox(box.squarifyBox(box.shiftBox(currentBox, HAND_BOX_SHIFT_VECTOR)), handBoxEnlargeFactor);\n const enlarged = box.enlargeBox(box.squarifyBox(currentBox), handBoxEnlargeFactor);\n const result = {\n confidence: currentBox.confidence,\n box: { topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint },\n };\n hands.push(result);\n }\n }\n this.storedBoxes = this.storedBoxes.filter((a) => a !== null);\n this.detectedHands = hands.length;\n return hands;\n }\n}\n", "/**\n * BlazePose Module\n */\n\n// paper: https://ai.googleblog.com/2020/08/on-device-real-time-body-pose-tracking.html\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as annotations from './annotations';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { Body } from '../result';\nimport { Config } from '../config';\n\nlet model: GraphModel;\n\nexport async function load(config: Config): Promise {\n if (!model) {\n // @ts-ignore type mismatch for Graphmodel\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath));\n model['width'] = parseInt(model['signature'].inputs['input_1:0'].tensorShape.dim[2].size);\n model['height'] = parseInt(model['signature'].inputs['input_1:0'].tensorShape.dim[1].size);\n if (!model || !model['modelUrl']) log('load model failed:', config.body.modelPath);\n else if (config.debug) log('load model:', model['modelUrl']);\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor, config: Config): Promise {\n if (!model) return [];\n if (!config.body.enabled) return [];\n const imgSize = { width: (image.shape[2] || 0), height: (image.shape[1] || 0) };\n const resize = tf.image.resizeBilinear(image, [model['width'], model['height']], false);\n const normalize = tf.div(resize, [255.0]);\n resize.dispose();\n const resT = await model.predict(normalize) as Array;\n const points = resT.find((t) => (t.size === 195 || t.size === 155))?.dataSync() || []; // order of output tensors may change between models, full has 195 and upper has 155 items\n resT.forEach((t) => t.dispose());\n normalize.dispose();\n const keypoints: Array<{ id, part, position: [number, number, number], positionRaw: [number, number, number], score, presence }> = [];\n const labels = points?.length === 195 ? annotations.full : annotations.upper; // full model has 39 keypoints, upper has 31 keypoints\n const depth = 5; // each points has x,y,z,visibility,presence\n for (let i = 0; i < points.length / depth; i++) {\n keypoints.push({\n id: i,\n part: labels[i],\n position: [\n Math.trunc(imgSize.width * points[depth * i + 0] / 255), // return normalized x value istead of 0..255\n Math.trunc(imgSize.height * points[depth * i + 1] / 255), // return normalized y value istead of 0..255\n Math.trunc(points[depth * i + 2]) + 0, // fix negative zero\n ],\n positionRaw: [\n points[depth * i + 0] / 255, // return x value normalized to 0..1\n points[depth * i + 1] / 255, // return y value normalized to 0..1\n points[depth * i + 2] + 0, // fix negative zero\n ],\n score: (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 3])))) / 100, // reverse sigmoid value\n presence: (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 4])))) / 100, // reverse sigmoid value\n });\n }\n const x = keypoints.map((a) => a.position[0]);\n const y = keypoints.map((a) => a.position[1]);\n const box: [number, number, number, number] = [\n Math.min(...x),\n Math.min(...y),\n Math.max(...x) - Math.min(...x),\n Math.max(...y) - Math.min(...x),\n ];\n const boxRaw: [number, number, number, number] = [0, 0, 0, 0]; // not yet implemented\n const score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n return [{ id: 0, score, box, boxRaw, keypoints }];\n}\n", "export const full = [\n 'nose',\n 'leftEyeInside',\n 'leftEye',\n 'leftEyeOutside',\n 'rightEyeInside',\n 'rightEye',\n 'rightEyeOutside',\n 'leftEar',\n 'rightEar',\n 'leftMouth',\n 'rightMouth',\n 'leftShoulder',\n 'rightShoulder',\n 'leftElbow',\n 'rightElbow',\n 'leftWrist',\n 'rightWrist',\n 'leftPalm',\n 'rightPalm',\n 'leftIndex',\n 'rightIndex',\n 'leftPinky',\n 'rightPinky',\n 'leftHip',\n 'rightHip',\n 'leftKnee',\n 'rightKnee',\n 'leftAnkle',\n 'rightAnkle',\n 'leftHeel',\n 'rightHeel',\n 'leftFoot',\n 'rightFoot',\n 'midHip',\n 'forehead',\n 'leftThumb',\n 'leftHand',\n 'rightThumb',\n 'rightHand',\n];\n\nexport const upper = [\n 'nose',\n 'leftEyeInside',\n 'leftEye',\n 'leftEyeOutside',\n 'rightEyeInside',\n 'rightEye',\n 'rightEyeOutside',\n 'leftEar',\n 'rightEar',\n 'leftMouth',\n 'rightMouth',\n 'leftShoulder',\n 'rightShoulder',\n 'leftElbow',\n 'rightElbow',\n 'left:15',\n 'right:16',\n 'left:17',\n 'right:18',\n 'left:19',\n 'right:20',\n 'left:21',\n 'right:22',\n 'leftChest',\n 'rightChest',\n 'neck',\n 'forehead',\n 'left:27',\n 'right:28',\n 'left:29',\n 'right:30',\n];\n", "/**\n * EfficientPose Module\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { Body } from '../result';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model: GraphModel;\n\ntype Keypoints = { score: number, part: string, position: [number, number], positionRaw: [number, number] };\n\nconst keypoints: Array = [];\nlet box: [number, number, number, number] = [0, 0, 0, 0];\nlet boxRaw: [number, number, number, number] = [0, 0, 0, 0];\nlet score = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nconst bodyParts = ['head', 'neck', 'rightShoulder', 'rightElbow', 'rightWrist', 'chest', 'leftShoulder', 'leftElbow', 'leftWrist', 'pelvis', 'rightHip', 'rightKnee', 'rightAnkle', 'leftHip', 'leftKnee', 'leftAnkle'];\n\nexport async function load(config: Config): Promise {\n if (!model) {\n // @ts-ignore type mismatch on GraphModel\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath));\n if (!model || !model['modelUrl']) log('load model failed:', config.body.modelPath);\n else if (config.debug) log('load model:', model['modelUrl']);\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\nfunction max2d(inputs, minScore) {\n const [width, height] = inputs.shape;\n return tf.tidy(() => {\n // modulus op implemented in tf\n const mod = (a, b) => tf.sub(a, tf.mul(tf.div(a, tf.scalar(b, 'int32')), tf.scalar(b, 'int32')));\n // combine all data\n const reshaped = tf.reshape(inputs, [height * width]);\n // get highest score\n const newScore = tf.max(reshaped, 0).dataSync()[0];\n if (newScore > minScore) {\n // skip coordinate calculation is score is too low\n const coords = tf.argMax(reshaped, 0);\n const x = mod(coords, width).dataSync()[0];\n const y = tf.div(coords, tf.scalar(width, 'int32')).dataSync()[0];\n return [x, y, newScore];\n }\n return [0, 0, newScore];\n });\n}\n\nexport async function predict(image: Tensor, config: Config): Promise {\n if ((skipped < config.body.skipFrames) && config.skipFrame && Object.keys(keypoints).length > 0) {\n skipped++;\n return [{ id: 0, score, box, boxRaw, keypoints }];\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, 2);\n const norm = enhance.sub(1);\n return norm;\n });\n\n let resT;\n if (config.body.enabled) resT = await model.predict(tensor);\n tensor.dispose();\n\n if (resT) {\n 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] = max2d(stack[id], config.body.minConfidence);\n if (score > config.body.minConfidence) {\n keypoints.push({\n score: Math.round(100 * partScore) / 100,\n part: bodyParts[id],\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 score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n const x = keypoints.map((a) => a.position[0]);\n const y = keypoints.map((a) => a.position[1]);\n 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 = keypoints.map((a) => a.positionRaw[0]);\n const yRaw = keypoints.map((a) => a.positionRaw[1]);\n 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 resolve([{ id: 0, score, box, boxRaw, keypoints }]);\n });\n}\n", "/**\n * EfficientPose Module\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { Body } from '../result';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model: GraphModel;\n\ntype Keypoints = { score: number, part: string, position: [number, number], positionRaw: [number, number] };\n\nconst keypoints: Array = [];\nlet box: [number, number, number, number] = [0, 0, 0, 0];\nlet boxRaw: [number, number, number, number] = [0, 0, 0, 0];\nlet score = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nconst bodyParts = ['nose', 'leftEye', 'rightEye', 'leftEar', 'rightEar', 'leftShoulder', 'rightShoulder', 'leftElbow', 'rightElbow', 'leftWrist', 'rightWrist', 'leftHip', 'rightHip', 'leftKnee', 'rightKnee', 'leftAnkle', 'rightAnkle'];\n\nexport async function load(config: Config): Promise {\n if (!model) {\n // @ts-ignore type mismatch on GraphModel\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath));\n if (!model || !model['modelUrl']) log('load model failed:', config.body.modelPath);\n else if (config.debug) log('load model:', model['modelUrl']);\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor, config: Config): Promise {\n if ((skipped < config.body.skipFrames) && config.skipFrame && Object.keys(keypoints).length > 0) {\n skipped++;\n return [{ id: 0, score, box, boxRaw, keypoints }];\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 cast = tf.cast(resize, 'int32');\n return cast;\n });\n\n let resT;\n if (config.body.enabled) resT = await model.predict(tensor);\n tensor.dispose();\n\n if (resT) {\n keypoints.length = 0;\n const res = resT.arraySync();\n tf.dispose(resT);\n const kpt = res[0][0];\n for (let id = 0; id < kpt.length; id++) {\n score = kpt[id][2];\n if (score > config.body.minConfidence) {\n keypoints.push({\n score: Math.round(100 * score) / 100,\n part: bodyParts[id],\n positionRaw: [ // normalized to 0..1\n kpt[id][1],\n kpt[id][0],\n ],\n position: [ // normalized to input image size\n Math.round((image.shape[2] || 0) * kpt[id][1]),\n Math.round((image.shape[1] || 0) * kpt[id][0]),\n ],\n });\n }\n }\n }\n score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n const x = keypoints.map((a) => a.position[0]);\n const y = keypoints.map((a) => a.position[1]);\n 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 = keypoints.map((a) => a.positionRaw[0]);\n const yRaw = keypoints.map((a) => a.positionRaw[1]);\n 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 resolve([{ id: 0, score, box, boxRaw, keypoints }]);\n });\n}\n", "/**\n * NanoDet object detection module\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { labels } from './labels';\nimport { Item } from '../result';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model;\nlet last: Array = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nconst scaleBox = 2.5; // increase box size\n\nexport async function load(config: Config): Promise {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.object.modelPath));\n const inputs = Object.values(model.modelSignature['inputs']);\n model.inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : null;\n if (!model.inputSize) throw new Error(`Human: Cannot determine model inputSize: ${config.object.modelPath}`);\n if (!model || !model.modelUrl) log('load model failed:', config.object.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n\nasync function process(res, inputSize, outputShape, 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(() => { // 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 = res.find((a) => (a.shape[1] === (baseSize ** 2) && a.shape[2] === labels.length))?.squeeze();\n const featuresT = res.find((a) => (a.shape[1] === (baseSize ** 2) && a.shape[2] < labels.length))?.squeeze();\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 = boxesMax.argMax(2).arraySync(); // what we need is indexes of features with highest scores, not values itself\n const scores = scoresT.arraySync(); // 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 && 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) => 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 = [x, y, w, h]; // results normalized to range 0..1\n boxRaw = boxRaw.map((a) => Math.max(0, Math.min(a, 1))); // 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,\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 [number, number, number, number],\n boxRaw: boxRaw as [number, number, number, number],\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 = nms.dataSync();\n tf.dispose(nms);\n }\n\n // filter & sort results\n results = results\n .filter((a, 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 if ((skipped < config.object.skipFrames) && config.skipFrame && (last.length > 0)) {\n skipped++;\n return last;\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const outputSize = [image.shape[2], image.shape[1]];\n const resize = tf.image.resizeBilinear(image, [model.inputSize, model.inputSize], false);\n const norm = resize.div(255);\n const transpose = norm.transpose([0, 3, 1, 2]);\n norm.dispose();\n resize.dispose();\n\n let objectT;\n if (config.object.enabled) objectT = await model.predict(transpose);\n transpose.dispose();\n\n const obj = await process(objectT, model.inputSize, outputSize, config);\n last = obj;\n resolve(obj);\n });\n}\n", "/**\n * CoCo Labels used by object detection modules\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 module\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { labels } from './labels';\nimport { Item } from '../result';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model;\nlet last: Item[] = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.object.modelPath));\n const inputs = Object.values(model.modelSignature['inputs']);\n model.inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : null;\n if (!model.inputSize) throw new Error(`Human: Cannot determine model inputSize: ${config.object.modelPath}`);\n if (!model || !model.modelUrl) log('load model failed:', config.object.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n\nasync function process(res: Tensor, inputSize, outputShape, config: Config) {\n if (!res) return [];\n const results: Array = [];\n const detections = res.arraySync();\n const squeezeT = tf.squeeze(res);\n res.dispose();\n const arr = tf.split(squeezeT, 6, 1); // x1, y1, x2, y2, score, class\n squeezeT.dispose();\n const stackT = tf.stack([arr[1], arr[0], arr[3], arr[2]], 1); // reorder dims as tf.nms expects y, x\n const boxesT = stackT.squeeze();\n const scoresT = arr[4].squeeze();\n const classesT = arr[5].squeeze();\n arr.forEach((t) => t.dispose());\n const nmsT = await tf.image.nonMaxSuppressionAsync(boxesT, scoresT, config.object.maxDetected, config.object.iouThreshold, config.object.minConfidence);\n boxesT.dispose();\n scoresT.dispose();\n classesT.dispose();\n const nms = nmsT.dataSync();\n nmsT.dispose();\n let i = 0;\n for (const id of 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;\n const boxRaw = [\n detections[0][id][0] / inputSize,\n detections[0][id][1] / inputSize,\n detections[0][id][2] / inputSize,\n detections[0][id][3] / inputSize,\n ] as [number, number, number, number];\n const 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 ] as [number, number, number, number];\n results.push({ id: i++, score, class: classVal, label, box, boxRaw });\n }\n return results;\n}\n\nexport async function predict(input: Tensor, config: Config): Promise {\n if ((skipped < config.object.skipFrames) && config.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], input.shape[1]];\n const resize = tf.image.resizeBilinear(input, [model.inputSize, model.inputSize]);\n const objectT = config.object.enabled ? model.execute(resize, ['tower_0/detections']) : null;\n resize.dispose();\n\n const obj = await process(objectT, model.inputSize, outputSize, config);\n last = obj;\n resolve(obj);\n });\n}\n", "/**\n * Gesture detection module\n */\n\nimport { Gesture } from '../result';\n\nexport const body = (res): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ body: number, gesture: string }> = [];\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.y < nose.position.y) && (rightWrist.position.y < nose.position.y)) gestures.push({ body: i, gesture: 'i give up' });\n else if (nose && leftWrist && (leftWrist.position.y < nose.position.y)) gestures.push({ body: i, gesture: 'raise left hand' });\n else if (nose && rightWrist && (rightWrist.position.y < nose.position.y)) 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) gestures.push({ body: i, gesture: `leaning ${(leftShoulder.position.y > rightShoulder.position.y) ? 'left' : 'right'}` });\n }\n return gestures;\n};\n\nexport const face = (res): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ face: number, gesture: string }> = [];\n for (let i = 0; i < res.length; i++) {\n if (res[i].mesh && res[i].mesh.length > 0) {\n const eyeFacing = res[i].mesh[33][2] - res[i].mesh[263][2];\n if (Math.abs(eyeFacing) < 10) gestures.push({ face: i, gesture: 'facing center' });\n else gestures.push({ face: i, gesture: `facing ${eyeFacing < 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];\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): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ iris: number, gesture: string }> = [];\n for (let i = 0; i < res.length; i++) {\n if (!res[i].annotations || !res[i].annotations.leftEyeIris || !res[i].annotations.rightEyeIris) 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 rightIrisCenterX = Math.abs(res[i].mesh[33][0] - res[i].annotations.rightEyeIris[0][0]) / res[i].box[2];\n const leftIrisCenterX = Math.abs(res[i].mesh[263][0] - res[i].annotations.leftEyeIris[0][0]) / res[i].box[2];\n if (leftIrisCenterX > 0.06 || rightIrisCenterX > 0.06) center = false;\n if (leftIrisCenterX > 0.06) gestures.push({ iris: i, gesture: 'looking right' });\n if (rightIrisCenterX > 0.06) gestures.push({ iris: i, gesture: 'looking left' });\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): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ hand: number, gesture: string }> = [];\n for (let i = 0; i < res.length; i++) {\n const fingers: Array<{ name: string, position: number }> = [];\n for (const [finger, pos] of Object.entries(res[i]['annotations'])) {\n if (finger !== 'palmBase' && Array.isArray(pos)) fingers.push({ name: finger.toLowerCase(), position: pos[0] }); // get tip of each finger\n }\n if (fingers && fingers.length > 0) {\n const closest = fingers.reduce((best, a) => (best.position[2] < a.position[2] ? best : a));\n const highest = fingers.reduce((best, a) => (best.position[1] < a.position[1] ? best : a));\n gestures.push({ hand: i, gesture: `${closest.name} forward ${highest.name} up` });\n }\n }\n return gestures;\n};\n", "/*\nWebGLImageFilter by Dominic Szablewski: \n*/\n\nfunction GLProgram(gl, vertexSource, fragmentSource) {\n const _collect = function (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\n const _compile = function (source, type) {\n const shader = gl.createShader(type);\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) throw new Error('Filter: GL compile failed', gl.getShaderInfoLog(shader));\n return shader;\n };\n\n this.uniform = {};\n this.attribute = {};\n const _vsh = _compile(vertexSource, gl.VERTEX_SHADER);\n const _fsh = _compile(fragmentSource, gl.FRAGMENT_SHADER);\n this.id = gl.createProgram();\n gl.attachShader(this.id, _vsh);\n gl.attachShader(this.id, _fsh);\n gl.linkProgram(this.id);\n\n if (!gl.getProgramParameter(this.id, gl.LINK_STATUS)) throw new Error('Filter: GL link failed', gl.getProgramInfoLog(this.id));\n\n gl.useProgram(this.id);\n // Collect attributes\n _collect(vertexSource, 'attribute', this.attribute);\n for (const a in this.attribute) this.attribute[a] = gl.getAttribLocation(this.id, a);\n // Collect uniforms\n _collect(vertexSource, 'uniform', this.uniform);\n _collect(fragmentSource, 'uniform', this.uniform);\n for (const u in this.uniform) this.uniform[u] = gl.getUniformLocation(this.id, u);\n}\n\n// export const GLImageFilter = function (params) {\nexport function GLImageFilter(params) {\n if (!params) params = { };\n let _drawCount = 0;\n let _sourceTexture = null;\n let _lastInChain = false;\n let _currentFramebufferIndex = -1;\n let _tempFramebuffers = [null, null];\n let _filterChain = [];\n let _width = -1;\n let _height = -1;\n let _vertexBuffer = null;\n let _currentProgram = null;\n const _filter = {};\n const _canvas = params.canvas || document.createElement('canvas');\n // key is the shader program source, value is the compiled program\n const _shaderProgramCache = { };\n const DRAW = { INTERMEDIATE: 1 };\n const gl = _canvas.getContext('webgl');\n if (!gl) throw new Error('Filter: getContext() failed');\n\n this.addFilter = function (name) {\n // eslint-disable-next-line prefer-rest-params\n const args = Array.prototype.slice.call(arguments, 1);\n const filter = _filter[name];\n _filterChain.push({ func: filter, args });\n };\n\n this.reset = function () {\n _filterChain = [];\n };\n\n const _resize = function (width, height) {\n // Same width/height? Nothing to do here\n if (width === _width && height === _height) { return; }\n _canvas.width = width;\n _width = width;\n _canvas.height = height;\n _height = height;\n // Create the context if we don't have it yet\n if (!_vertexBuffer) {\n // Create the vertex buffer for the two triangles [x, y, u, v] * 6\n const vertices = new Float32Array([\n -1, -1, 0, 1, 1, -1, 1, 1, -1, 1, 0, 0,\n -1, 1, 0, 0, 1, -1, 1, 1, 1, 1, 1, 0,\n ]);\n // eslint-disable-next-line no-unused-expressions\n (_vertexBuffer = gl.createBuffer(), 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, _width, _height);\n // Delete old temp framebuffers\n _tempFramebuffers = [null, null];\n };\n\n const _createFramebufferTexture = function (width, height) {\n const fbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n const renderbuffer = gl.createRenderbuffer();\n gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);\n const texture = gl.createTexture();\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 const _getTempFramebuffer = function (index) {\n _tempFramebuffers[index] = _tempFramebuffers[index] || _createFramebufferTexture(_width, _height);\n return _tempFramebuffers[index];\n };\n\n const _draw = function (flags = null) {\n let source = null;\n let target = null;\n let flipY = false;\n // Set up the source\n if (_drawCount === 0) {\n // First draw call - use the source texture\n source = _sourceTexture;\n } else {\n // All following draw calls use the temp buffer last drawn to\n source = _getTempFramebuffer(_currentFramebufferIndex)?.texture;\n }\n _drawCount++;\n // Set up the target\n if (_lastInChain && !(flags & DRAW.INTERMEDIATE)) {\n // Last filter in our chain - draw directly to the WebGL Canvas. We may\n // also have to flip the image vertically now\n target = null;\n flipY = _drawCount % 2 === 0;\n } else {\n // Intermediate draw call - get a temp buffer to draw to\n _currentFramebufferIndex = (_currentFramebufferIndex + 1) % 2;\n target = _getTempFramebuffer(_currentFramebufferIndex)?.fbo;\n }\n // Bind the source and target and draw the two triangles\n gl.bindTexture(gl.TEXTURE_2D, source);\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 this.apply = function (image) {\n _resize(image.width, image.height);\n _drawCount = 0;\n // Create the texture for the input image if we haven't yet\n if (!_sourceTexture) _sourceTexture = gl.createTexture();\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 // No filters? Just draw\n if (_filterChain.length === 0) {\n // const program = _compileShader(SHADER.FRAGMENT_IDENTITY);\n _draw();\n return _canvas;\n }\n for (let i = 0; i < _filterChain.length; i++) {\n _lastInChain = (i === _filterChain.length - 1);\n const f = _filterChain[i];\n f.func.apply(this, f.args || []);\n }\n return _canvas;\n };\n\n const _compileShader = function (fragmentSource) {\n if (_shaderProgramCache[fragmentSource]) {\n _currentProgram = _shaderProgramCache[fragmentSource];\n gl.useProgram(_currentProgram.id);\n return _currentProgram;\n }\n // Compile shaders\n const SHADER = {};\n SHADER.VERTEX_IDENTITY = [\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 ].join('\\n');\n SHADER.FRAGMENT_IDENTITY = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform sampler2D texture;',\n 'void main(void) {',\n 'gl_FragColor = texture2D(texture, vUv);',\n '}',\n ].join('\\n');\n _currentProgram = new GLProgram(gl, SHADER.VERTEX_IDENTITY, fragmentSource);\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;\n };\n\n // -------------------------------------------------------------------------\n // Color Matrix Filter\n _filter.colorMatrix = function (matrix) {\n // Create a Float32 Array and normalize the offset component to 0-1\n const m = new Float32Array(matrix);\n m[4] /= 255;\n m[9] /= 255;\n m[14] /= 255;\n m[19] /= 255;\n // Can we ignore the alpha value? Makes things a bit faster.\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)\n ? _filter.colorMatrix.SHADER.WITHOUT_ALPHA\n : _filter.colorMatrix.SHADER.WITH_ALPHA;\n const program = _compileShader(shader);\n gl.uniform1fv(program.uniform.m, m);\n _draw();\n };\n _filter.colorMatrix.SHADER = {};\n _filter.colorMatrix.SHADER.WITH_ALPHA = [\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 ].join('\\n');\n _filter.colorMatrix.SHADER.WITHOUT_ALPHA = [\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 ].join('\\n');\n\n _filter.brightness = function (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 _filter.saturation = function (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 _filter.desaturate = function () {\n _filter.saturation(-1);\n };\n\n _filter.contrast = function (amount) {\n const v = (amount || 0) + 1;\n const o = -128 * (v - 1);\n\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 _filter.negative = function () {\n _filter.contrast(-2);\n };\n\n _filter.hue = function (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\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 _filter.desaturateLuminance = function () {\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 _filter.sepia = function () {\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 _filter.brownie = function () {\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 _filter.vintagePinhole = function () {\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 _filter.kodachrome = function () {\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 _filter.technicolor = function () {\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 _filter.polaroid = function () {\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 _filter.shiftToBGR = function () {\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 // -------------------------------------------------------------------------\n // Convolution Filter\n _filter.convolution = function (matrix) {\n const m = new Float32Array(matrix);\n const pixelSizeX = 1 / _width;\n const pixelSizeY = 1 / _height;\n const program = _compileShader(_filter.convolution.SHADER);\n gl.uniform1fv(program.uniform.m, m);\n gl.uniform2f(program.uniform.px, pixelSizeX, pixelSizeY);\n _draw();\n };\n\n _filter.convolution.SHADER = [\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 ].join('\\n');\n\n _filter.detectEdges = function () {\n _filter.convolution.call(this, [\n 0, 1, 0,\n 1, -4, 1,\n 0, 1, 0,\n ]);\n };\n\n _filter.sobelX = function () {\n _filter.convolution.call(this, [\n -1, 0, 1,\n -2, 0, 2,\n -1, 0, 1,\n ]);\n };\n\n _filter.sobelY = function () {\n _filter.convolution.call(this, [\n -1, -2, -1,\n 0, 0, 0,\n 1, 2, 1,\n ]);\n };\n\n _filter.sharpen = function (amount) {\n const a = amount || 1;\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 _filter.emboss = function (size) {\n const s = size || 1;\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 // -------------------------------------------------------------------------\n // Blur Filter\n _filter.blur = function (size) {\n const blurSizeX = (size / 7) / _width;\n const blurSizeY = (size / 7) / _height;\n const program = _compileShader(_filter.blur.SHADER);\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 _filter.blur.SHADER = [\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 ].join('\\n');\n\n // -------------------------------------------------------------------------\n // Pixelate Filter\n _filter.pixelate = function (size) {\n const blurSizeX = (size) / _width;\n const blurSizeY = (size) / _height;\n const program = _compileShader(_filter.pixelate.SHADER);\n // Horizontal\n gl.uniform2f(program.uniform.size, blurSizeX, blurSizeY);\n _draw();\n };\n\n _filter.pixelate.SHADER = [\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 ].join('\\n');\n}\n", "/**\n * Image Processing module used by Human\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as fxImage from './imagefx';\nimport { Tensor } from '../tfjs/types';\n\nconst maxSize = 2048;\n// internal temp canvases\nlet inCanvas;\nlet outCanvas;\n// instance of fximage\nlet fx;\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 function process(input, config): { tensor: Tensor | null, canvas: OffscreenCanvas | HTMLCanvasElement } {\n let tensor;\n if (!input) throw new Error('Human: Input is missing');\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 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('Human: Input type is not recognized');\n }\n if (input instanceof tf.Tensor) {\n // if input is tensor, use as-is\n if (input.shape && input.shape.length === 4 && input.shape[0] === 1 && input.shape[3] === 3) tensor = tf.clone(input);\n else throw new Error(`Human: Input tensor shape must be [1, height, width, 3] and instead was ${input.shape}`);\n } else {\n // check if resizing will be needed\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) return { tensor: null, canvas: inCanvas }; // video may become temporarily unavailable due to onresize\n let targetWidth = originalWidth;\n let targetHeight = originalHeight;\n if (targetWidth > maxSize) {\n targetWidth = maxSize;\n targetHeight = targetWidth * originalHeight / originalWidth;\n }\n if (targetHeight > maxSize) {\n targetHeight = maxSize;\n targetWidth = targetHeight * originalWidth / originalHeight;\n }\n\n // create our canvas and resize it if needed\n if (config.filter.width > 0) targetWidth = config.filter.width;\n else if (config.filter.height > 0) targetWidth = originalWidth * (config.filter.height / originalHeight);\n if (config.filter.height > 0) targetHeight = config.filter.height;\n else if (config.filter.width > 0) targetHeight = originalHeight * (config.filter.width / originalWidth);\n if (!targetWidth || !targetHeight) throw new Error('Human: Input cannot determine dimension');\n if (!inCanvas || (inCanvas?.width !== targetWidth) || (inCanvas?.height !== targetHeight)) {\n inCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement('canvas');\n if (inCanvas?.width !== targetWidth) inCanvas.width = targetWidth;\n if (inCanvas?.height !== targetHeight) inCanvas.height = targetHeight;\n }\n\n // draw input to our canvas\n const ctx = inCanvas.getContext('2d');\n if (input instanceof ImageData) {\n ctx.putImageData(input, 0, 0);\n } else {\n if (config.filter.flip && typeof ctx.translate !== 'undefined') {\n ctx.translate(originalWidth, 0);\n ctx.scale(-1, 1);\n ctx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas?.width, inCanvas?.height);\n ctx.setTransform(1, 0, 0, 1, 0, 0); // resets transforms to defaults\n } else {\n ctx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas?.width, inCanvas?.height);\n }\n }\n\n // imagefx transforms using gl\n if (config.filter.enabled) {\n if (!fx || !outCanvas || (inCanvas.width !== outCanvas.width) || (inCanvas?.height !== outCanvas?.height)) {\n outCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(inCanvas?.width, inCanvas?.height) : document.createElement('canvas');\n if (outCanvas?.width !== inCanvas?.width) outCanvas.width = inCanvas?.width;\n if (outCanvas?.height !== inCanvas?.height) outCanvas.height = inCanvas?.height;\n // log('created FX filter');\n fx = tf.ENV.flags.IS_BROWSER ? new fxImage.GLImageFilter({ canvas: outCanvas }) : null; // && (typeof document !== 'undefined')\n }\n if (!fx) return { tensor: null, canvas: inCanvas };\n fx.reset();\n fx.addFilter('brightness', config.filter.brightness); // must have at least one filter enabled\n if (config.filter.contrast !== 0) fx.addFilter('contrast', config.filter.contrast);\n if (config.filter.sharpness !== 0) fx.addFilter('sharpen', config.filter.sharpness);\n if (config.filter.blur !== 0) fx.addFilter('blur', config.filter.blur);\n if (config.filter.saturation !== 0) fx.addFilter('saturation', config.filter.saturation);\n if (config.filter.hue !== 0) fx.addFilter('hue', config.filter.hue);\n if (config.filter.negative) fx.addFilter('negative');\n if (config.filter.sepia) fx.addFilter('sepia');\n if (config.filter.vintage) fx.addFilter('brownie');\n if (config.filter.sepia) fx.addFilter('sepia');\n if (config.filter.kodachrome) fx.addFilter('kodachrome');\n if (config.filter.technicolor) fx.addFilter('technicolor');\n if (config.filter.polaroid) fx.addFilter('polaroid');\n if (config.filter.pixelate !== 0) fx.addFilter('pixelate', config.filter.pixelate);\n fx.apply(inCanvas);\n // read pixel data\n /*\n const gl = outCanvas.getContext('webgl');\n if (gl) {\n const glBuffer = new Uint8Array(outCanvas.width * outCanvas.height * 4);\n const pixBuffer = new Uint8Array(outCanvas.width * outCanvas.height * 3);\n gl.readPixels(0, 0, outCanvas.width, outCanvas.height, gl.RGBA, gl.UNSIGNED_BYTE, glBuffer);\n // gl returns rbga while we only need rgb, so discarding alpha channel\n // gl returns starting point as lower left, so need to invert vertical\n let i = 0;\n for (let y = outCanvas.height - 1; y >= 0; y--) {\n for (let x = 0; x < outCanvas.width; x++) {\n const index = (x + y * outCanvas.width) * 4;\n pixBuffer[i++] = glBuffer[index + 0];\n pixBuffer[i++] = glBuffer[index + 1];\n pixBuffer[i++] = glBuffer[index + 2];\n }\n }\n outCanvas.data = pixBuffer;\n }\n */\n } else {\n outCanvas = inCanvas;\n if (fx) fx = null;\n }\n\n // create tensor from image\n let pixels;\n if (outCanvas.data) { // if we have data, just convert to tensor\n const shape = [outCanvas.height, outCanvas.width, 3];\n pixels = tf.tensor3d(outCanvas.data, shape, 'int32');\n } else if (outCanvas instanceof ImageData) { // if input is imagedata, just use it\n pixels = tf.browser.fromPixels(outCanvas);\n } else if (config.backend === 'webgl' || config.backend === 'humangl') { // tf kernel-optimized method to get imagedata\n // we can use canvas as-is as it already has a context, so we do a silly one more canvas\n const tempCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement('canvas');\n tempCanvas.width = targetWidth;\n tempCanvas.height = targetHeight;\n const tempCtx = tempCanvas.getContext('2d');\n tempCtx?.drawImage(outCanvas, 0, 0);\n pixels = tf.browser.fromPixels(tempCanvas);\n } else { // cpu and wasm kernel does not implement efficient fromPixels method\n // we can use canvas as-is as it already has a context, so we do a silly one more canvas\n const tempCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement('canvas');\n tempCanvas.width = targetWidth;\n tempCanvas.height = targetHeight;\n const tempCtx = tempCanvas.getContext('2d');\n tempCtx?.drawImage(outCanvas, 0, 0);\n const data = tempCtx?.getImageData(0, 0, targetWidth, targetHeight);\n pixels = tf.browser.fromPixels(data);\n }\n const casted = pixels.toFloat();\n tensor = casted.expandDims(0);\n pixels.dispose();\n casted.dispose();\n }\n const canvas = config.filter.return ? outCanvas : null;\n return { tensor, canvas };\n}\n", "/**\n * Module that implements helper draw functions, exposed as human.draw\n */\n\nimport { TRI468 as triangulation } from '../blazeface/coords';\nimport { mergeDeep, now } from '../helpers';\nimport type { Result, Face, Body, Hand, Item, Gesture, Person } from '../result';\n\n/**\n * Draw Options\n * Accessed via `human.draw.options` or provided per each draw method as the drawOptions optional parameter\n * -color: draw color\n * -labelColor: color for labels\n * -shadowColor: optional shadow color for labels\n * -font: font for labels\n * -lineHeight: line height for labels, used for multi-line labels,\n * -lineWidth: width of any lines,\n * -pointSize: size of any point,\n * -roundRect: for boxes, round corners by this many pixels,\n * -drawPoints: should points be drawn,\n * -drawLabels: should labels be drawn,\n * -drawBoxes: should boxes be drawn,\n * -drawPolygons: should polygons be drawn,\n * -fillPolygons: should drawn polygons be filled,\n * -useDepth: use z-axis coordinate as color shade,\n * -useCurves: draw polygons as cures or as lines,\n * -bufferedOutput: experimental: allows to call draw methods multiple times for each detection and interpolate results between results thus achieving smoother animations\n */\nexport interface DrawOptions {\n color: string,\n labelColor: string,\n shadowColor: string,\n font: string,\n lineHeight: number,\n lineWidth: number,\n pointSize: number,\n roundRect: number,\n drawPoints: boolean,\n drawLabels: boolean,\n drawBoxes: boolean,\n drawPolygons: boolean,\n drawGaze: boolean,\n fillPolygons: boolean,\n useDepth: boolean,\n useCurves: boolean,\n bufferedOutput: boolean,\n}\n\nexport const options: DrawOptions = {\n color: 'rgba(173, 216, 230, 0.6)', // 'lightblue' with light alpha channel\n labelColor: 'rgba(173, 216, 230, 1)', // 'lightblue' with dark alpha channel\n shadowColor: 'black',\n font: 'small-caps 14px \"Segoe UI\"',\n lineHeight: 24,\n lineWidth: 6,\n pointSize: 2,\n roundRect: 28,\n drawPoints: false,\n drawLabels: true,\n drawBoxes: true,\n drawPolygons: true,\n drawGaze: true,\n fillPolygons: false,\n useDepth: true,\n useCurves: false,\n bufferedOutput: true,\n};\n\nconst rad2deg = (theta) => Math.round((theta * 180) / Math.PI);\n\nfunction point(ctx, x, y, z = 0, localOptions) {\n ctx.fillStyle = localOptions.useDepth && z ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.3)` : localOptions.color;\n ctx.beginPath();\n ctx.arc(x, y, localOptions.pointSize, 0, 2 * Math.PI);\n ctx.fill();\n}\n\nfunction rect(ctx, x, y, width, height, localOptions) {\n ctx.beginPath();\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.lineWidth = localOptions.lineWidth;\n ctx.moveTo(x + localOptions.roundRect, y);\n ctx.lineTo(x + width - localOptions.roundRect, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + localOptions.roundRect);\n ctx.lineTo(x + width, y + height - localOptions.roundRect);\n ctx.quadraticCurveTo(x + width, y + height, x + width - localOptions.roundRect, y + height);\n ctx.lineTo(x + localOptions.roundRect, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - localOptions.roundRect);\n ctx.lineTo(x, y + localOptions.roundRect);\n ctx.quadraticCurveTo(x, y, x + localOptions.roundRect, y);\n ctx.closePath();\n }\n ctx.stroke();\n}\n\nfunction lines(ctx, points: [number, number, number?][] = [], localOptions) {\n if (points === undefined || points.length === 0) 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 ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.3)` : localOptions.color;\n ctx.fillStyle = localOptions.useDepth && z ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.3)` : localOptions.color;\n ctx.lineTo(pt[0], Math.round(pt[1]));\n }\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.closePath();\n ctx.fill();\n }\n}\n\nfunction curves(ctx, points: [number, number, number?][] = [], localOptions) {\n if (points === undefined || points.length === 0) return;\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 async function gesture(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\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\nexport async function face(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\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 // 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.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 ctx.lineWidth = 1;\n if (f.mesh && f.mesh.length > 0) {\n if (localOptions.drawPoints) {\n for (const pt of f.mesh) point(ctx, pt[0], pt[1], pt[2], localOptions);\n // for (const pt of f.meshRaw) point(ctx, pt[0] * inCanvas.offsetWidth, pt[1] * inCanvas.offsetHeight, pt[2]);\n }\n if (localOptions.drawPolygons) {\n ctx.lineWidth = 1;\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 // iris: array[center, left, top, right, bottom]\n if (f.annotations && f.annotations['leftEyeIris']) {\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']) {\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?.gaze?.strength && f.rotation?.gaze?.bearing) {\n ctx.strokeStyle = 'pink';\n ctx.beginPath();\n\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 ctx.moveTo(f.annotations['leftEyeIris'][0][0], f.annotations['leftEyeIris'][0][1]);\n ctx.lineTo(leftGaze[0], leftGaze[1]);\n\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 ctx.moveTo(f.annotations['rightEyeIris'][0][0], f.annotations['rightEyeIris'][0][1]);\n ctx.lineTo(rightGaze[0], rightGaze[1]);\n\n ctx.stroke();\n }\n }\n }\n }\n}\n\nexport async function body(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\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 // @ts-ignore box may not exist\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 // @ts-ignore box may not exist\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 // @ts-ignore box may not exist\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) {\n for (let pt = 0; pt < result[i].keypoints.length; pt++) {\n ctx.fillStyle = localOptions.useDepth && result[i].keypoints[pt].position[2] ? `rgba(${127.5 + (2 * (result[i].keypoints[pt].position[2] || 0))}, ${127.5 - (2 * (result[i].keypoints[pt].position[2] || 0))}, 255, 0.5)` : localOptions.color;\n point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions);\n }\n }\n if (localOptions.drawLabels) {\n ctx.font = localOptions.font;\n if (result[i].keypoints) {\n for (const pt of result[i].keypoints) {\n ctx.fillStyle = localOptions.useDepth && pt.position[2] ? `rgba(${127.5 + (2 * pt.position[2])}, ${127.5 - (2 * pt.position[2])}, 255, 0.5)` : localOptions.color;\n ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position[0] + 4, pt.position[1] + 4);\n }\n }\n }\n if (localOptions.drawPolygons && result[i].keypoints) {\n let part;\n const points: [number, number, number?][] = [];\n // shoulder line\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n curves(ctx, points, localOptions);\n // torso main\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'rightShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightHip');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftHip');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n if (points.length === 4) lines(ctx, points, localOptions); // only draw if we have complete torso\n // leg left\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'leftHip');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftKnee');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftAnkle');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftHeel');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftFoot');\n if (part) points.push([part.position[0], part.position[1]]);\n curves(ctx, points, localOptions);\n // leg right\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'rightHip');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightKnee');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightAnkle');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightHeel');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightFoot');\n if (part) points.push([part.position[0], part.position[1]]);\n curves(ctx, points, localOptions);\n // arm left\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftElbow');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftWrist');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftPalm');\n if (part) points.push([part.position[0], part.position[1]]);\n curves(ctx, points, localOptions);\n // arm right\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'rightShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightElbow');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightWrist');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightPalm');\n if (part) points.push([part.position[0], part.position[1]]);\n curves(ctx, points, localOptions);\n // draw all\n }\n }\n}\n\nexport async function hand(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\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', h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText('hand', h.box[0] + 2, 0 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.stroke();\n }\n if (localOptions.drawPoints) {\n if (h.keypoints && h.keypoints.length > 0) {\n for (const pt of h.keypoints) {\n ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * pt[2])}, ${127.5 - (2 * pt[2])}, 255, 0.5)` : localOptions.color;\n point(ctx, pt[0], pt[1], 0, localOptions);\n }\n }\n }\n if (localOptions.drawLabels) {\n const addHandLabel = (part, title) => {\n ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * part[part.length - 1][2])}, ${127.5 - (2 * part[part.length - 1][2])}, 255, 0.5)` : localOptions.color;\n ctx.fillText(title, part[part.length - 1][0] + 4, part[part.length - 1][1] + 4);\n };\n ctx.font = localOptions.font;\n addHandLabel(h.annotations['indexFinger'], 'index');\n addHandLabel(h.annotations['middleFinger'], 'middle');\n addHandLabel(h.annotations['ringFinger'], 'ring');\n addHandLabel(h.annotations['pinky'], 'pinky');\n addHandLabel(h.annotations['thumb'], 'thumb');\n addHandLabel(h.annotations['palmBase'], 'palm');\n }\n if (localOptions.drawPolygons) {\n const addHandLine = (part) => {\n if (!part) return;\n for (let i = 0; i < part.length; i++) {\n ctx.beginPath();\n ctx.strokeStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * part[i][2])}, ${127.5 - (2 * part[i][2])}, 255, 0.5)` : localOptions.color;\n ctx.moveTo(part[i > 0 ? i - 1 : 0][0], part[i > 0 ? i - 1 : 0][1]);\n ctx.lineTo(part[i][0], part[i][1]);\n ctx.stroke();\n }\n };\n ctx.lineWidth = localOptions.lineWidth;\n addHandLine(h.annotations['indexFinger']);\n addHandLine(h.annotations['middleFinger']);\n addHandLine(h.annotations['ringFinger']);\n addHandLine(h.annotations['pinky']);\n addHandLine(h.annotations['thumb']);\n // addPart(h.annotations.palmBase);\n }\n }\n}\n\nexport async function object(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\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 = `${Math.round(100 * h.score)}% ${h.label}`;\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\nexport async function person(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\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\nexport async function canvas(inCanvas: HTMLCanvasElement, outCanvas: HTMLCanvasElement) {\n if (!inCanvas || !outCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement) || !(outCanvas instanceof HTMLCanvasElement)) return;\n const outCtx = inCanvas.getContext('2d');\n outCtx?.drawImage(inCanvas, 0, 0);\n}\n\nexport async function all(inCanvas: HTMLCanvasElement, result: Result, drawOptions?: DrawOptions) {\n const timestamp = now();\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n\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 // person(inCanvas, result.persons, localOptions);\n gesture(inCanvas, result.gesture, localOptions); // gestures do not have buffering\n\n /*\n if (!bufferedResult) bufferedResult = result; // first pass\n else if (localOptions.bufferedOutput) calcBuffered(result); // do results interpolation\n else bufferedResult = result; // or just use results as-is\n const promises: Promise[] = [];\n promises.push(face(inCanvas, bufferedResult.face, localOptions));\n promises.push(body(inCanvas, bufferedResult.body, localOptions));\n promises.push(hand(inCanvas, bufferedResult.hand, localOptions));\n promises.push(object(inCanvas, bufferedResult.object, localOptions));\n // promises.push(person(inCanvas, bufferedResult.persons, localOptions));\n promises.push(gesture(inCanvas, result.gesture, localOptions)); // gestures do not have buffering\n // await Promise.all(promises);\n */\n result.performance.draw = Math.trunc(now() - timestamp);\n}\n", "/**\n * Module that analyzes existing results and recombines them into a unified person object\n */\n\nimport { Face, Body, Hand, Gesture, Person } 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: Person = { 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 beloning to person\n const x: number[] = [];\n const y: number[] = [];\n const extractXY = (box) => { // 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.length === 4) 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 * Module that interpolates results for smoother animations\n */\n\nimport type { Result, Face, Body, Hand, Item, Gesture, Person } from './result';\n\nconst bufferedResult: Result = { face: [], body: [], hand: [], gesture: [], object: [], persons: [], performance: {}, timestamp: 0 };\n\nexport function calc(newResult: Result): Result {\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;\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 Body[])); // 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((b, j) => ((bufferedFactor - 1) * bufferedResult.body[i].box[j] + b) / bufferedFactor) as [number, number, number, number];\n const boxRaw = newResult.body[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.body[i].boxRaw[j] + b) / bufferedFactor) as [number, number, number, number];\n const keypoints = (newResult.body[i].keypoints // update keypoints\n .map((keypoint, j) => ({\n score: keypoint.score,\n part: keypoint.part,\n position: [\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].position[0] + keypoint.position[0]) / bufferedFactor : keypoint.position[0],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].position[1] + keypoint.position[1]) / bufferedFactor : keypoint.position[1],\n ],\n positionRaw: [\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].positionRaw[0] + keypoint.positionRaw[0]) / bufferedFactor : keypoint.position[0],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].positionRaw[1] + keypoint.positionRaw[1]) / bufferedFactor : keypoint.position[1],\n ],\n }))) as Array<{ score: number, part: string, position: [number, number, number?], positionRaw: [number, number, number?] }>;\n bufferedResult.body[i] = { ...newResult.body[i], box, boxRaw, keypoints }; // 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 Hand[])); // 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 [number, number, number, number];\n const boxRaw = (newResult.hand[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].boxRaw[j] + b) / bufferedFactor)) as [number, number, number, number];\n const keypoints = newResult.hand[i].keypoints // update landmarks\n .map((landmark, j) => landmark\n .map((coord, k) => (((bufferedFactor - 1) * bufferedResult.hand[i].keypoints[j][k] + coord) / bufferedFactor)) as [number, number, number]);\n const keys = Object.keys(newResult.hand[i].annotations); // update annotations\n const annotations = {};\n for (const key of keys) {\n annotations[key] = newResult.hand[i].annotations[key]\n .map((val, j) => val.map((coord, k) => ((bufferedFactor - 1) * bufferedResult.hand[i].annotations[key][j][k] + coord) / bufferedFactor));\n }\n bufferedResult.hand[i] = { ...newResult.hand[i], box, boxRaw, keypoints, 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 Face[])); // 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 [number, number, number, number];\n const boxRaw = (newResult.face[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].boxRaw[j] + b) / bufferedFactor)) as [number, number, number, number];\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 }\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 Item[])); // 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 [number, number, number, number];\n const boxRaw = (newResult.object[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].boxRaw[j] + b) / bufferedFactor)) as [number, number, number, number];\n bufferedResult.object[i] = { ...newResult.object[i], box, boxRaw }; // shallow clone plus updated values\n }\n }\n\n // interpolate person results\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 Person[]));\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 [number, number, number, number];\n }\n }\n\n // just copy latest gestures without interpolation\n bufferedResult.gesture = newResult.gesture as Gesture[];\n bufferedResult.performance = newResult.performance;\n\n return bufferedResult;\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\nCvLhho3rN9RWs9Z23n5y6O21YhrVYbdGOCfrrLPJRpv863zVS6FS09SvZj3lVZZRdPSqmnSWdrIE\nebOkK4ldTsgW1WKqd1oMZhEVZyRAImOjGI6rJ7IiATNd46qL02bHkiaxaoNGY2n4ImPgtyV2n0Vo\nGvlx7x2beiyTk08RPevSVUxux00+Fn2n7N+n5rRFb4AAAAAAAAAAAAAAACLVres1tETWekxKQHlu\nL8InR2nPp43wz3j8P/s5dLveWrFqzW0bxPeJeV4xwmdFec+CJnDM9Y/CrY1xv8qvTZ+WYdbDk5oh\n5zHk283U0eo3jaZZ2N5XYjrCnLSJhOK+8d1kxvCqzSwZvousrb7k9LfJ3nB1OLeJdLhufx9LEWn3\n6e7LXN9Ofy5/W4AuxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAETaKxMzO0Qi9646Ta07RDmZ9VbPbaOlI7Qi3i+c3TPUaqcu9adKfy0722ZXvFa9\nXO1OrjrESxt66ZJmcjPUanlidmhkzTZVfLN5VWvsC2b7R3U3yqrZZtO1esz2h2+F+zWTUcuXXTNM\nfeKR3n5+iZLVbqRzNJo9TxHLyaekz62ntD1fDOA6fQbZL7Zc/wCKY6R8odLBgxabFGPDSKUjyiFj\nSZkYa3aALKAAAAAAAAAAAAAADQ4pl2pTFH3p3n5Q33E12Tn1eSfKscsLZ+orS00eJqbW+Lfnu1tF\nXaJnZsz3WpCfsyp00fWSvmPdVYOmSUDd8kR3InoQosy7JmUX7MdwZ17ro7KKT1XRPRAsrO0rYndr\n79V1ZBaQiJ6JgCSIJASwrO07MpV2nqBlrv1a1o2bf2qtfLXaQUTO0sb05o3jv3ZXhjS20xEphW5h\nyeJjjf7UdJWNKLziyRePsz0lux1SgAQAAAAAAAAAAAAAADG9K5KTS8Rato2mJZAPIcU4ZbQZuekT\nOC3afT4NXFkmlntc2GmoxWx5K71tG0vHa/RX0GpmlutJ61t6wrY2xr8dXS5uesN+tt4ef0eaa223\n2dnHk3juyreM81OaFGiy/RtZET9jJ7s/2bdutd2jqKeic3iNTsd8a2h1H0jTVtP2o6W+bZbOO+gA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABje9cdJt\nadohGTLXFTmvO0fy52bJfU23t0pHaqLeL5xdK9Rnvqb+cUjtCi94xxvK3JetKuHrdZvaa1ljb10y\ncnIs1Wt3naJc++TmVWvMz1YWybfMGdsm3eWek0mo4jm8PT0mfW3lDf4V7P5tdMZdRviwfvZ6/TaX\nDpMMYsFIpWPTzXmf+steT8jn8L4Dp+HxF77Zc/4pjpHydYGjC3oAAAAAAAAAAAAAAAAADG9opS1p\n7RG7zszN6WtPe0zLua+3Joss/wBOzhzG2OsL5+IrY09dsSyYRijbHEMvOChb7KjF0yS2LQ169Mso\nS24noyrPVXWejNVKbTuw3T3REdQWU6LYlVvsyiUDPfqupPRr79VuOQX1lZEqoZxIMksd0gT2VT0l\nbPZVbuCaW8i8bwr32WxbcGnkjaZa9p2ndv5qbw5+aNugLItF6TEtvTX5sMb969HMpfazc0d9stqe\nvVZDdAQAAAAAAAAAAAAAAAADV1+iprtPOO/2u9bektoB4TJTJpNRbHkja1Z6uto8viVht+0HDvpG\nH6Tjj6zHHvbecONw7Ltfkmeqmo6Ma69DXbbZTkr1mGWO3RneOaGbZRoM30fVzSelMnT83aef1FZ7\nx3h1tBqfpGnjmn369LNc3sc3kzy9bQCzIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAa+q1dNNXr7157VhGp1Xh70x+9f9ocy283m1p5rz3mVbrjXHjt91lz\n5c9+fJ1nyjyhdM8lZlOOIiqrUXikd+kMreunnI5XEdX4dZiZcG+XmtNl/F83PeeWWHDOGanieSKY\nq+5H2rz2hMzWd1Iqx1yajJXHhrNrW6REeb1nCPZumn2z62Ivl7xTyr/6uhwzhGn4Zj2xxzZJ+1kn\nvLoNJnjHW7TbbsAszAAAAAAAAAAAAAAAAAAAAaPFrbaSK/itEOXt0rDf4xb/ACa/GZacRvaF58Q2\nIjasQnzPIhCU92tMbZGzHmotG10C6nZkwpPRmipIllEbMIZIE7solgmJBnCyk9VMM6z1BtVllEqK\nz0WRILYlluriWcSDJVbusV27gwInaSWM9ECyZ3hqamnSWxFmOSOaqRx725bNnSZNs9J+OynVY+WZ\nYYr7TE+nVaIr0Ais81Yn1hKAAAAAAAAAAAAAAAAAABExvG09peU4nov9n66L0j6q/WPg9Y1OJaON\nZpL0+9HWs/EWzeVz9PbmrEtnyc3h9reHy26TWdnSr2YX6657ijLXpLX0+onSamL/AHJ6W+Tbv2aW\nekTv16JzeI1Ox6KJiYiY7Slz+E6jxdN4dp3vj6fl5Og2clnKACAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZ2jeQRMxEbzO0Q08uqtkma4ulfO3r8lefUePMxWf\ncjy9WvlzVxV6T1Z61/x0Y8f7Wc7Ur1lqVy+LqOWJ2hp6rXddon5rOF1tfmz5OkT0qzb8dWbxjp1c\nbiuuilJ5Z6r+IcQrixzEy8zl1E6rNt1tMztFY81sztU1eRucN4ffi2p5esRM72n0h7rS6XFo8FcO\nCkVpX082nwXh3+z9FWLxHi36328vg6TZyW9ABAAAAAAAAAAAAAAAAAAAAAADj8Unm1tK/hqppHvw\ny1k8/EMk+m0GOPeafiFpCZYwolnXspvHvLa9mF46gmnZmwozRUiUCBKYYsoBLOFbKAX0llEqqyzi\nQXRLOJVRLOOwLIljZMEgrlhKyYYTAK5nZPN0RZjugUanHzVlz6xtLq361c+9eXItPpXX0dubTU+E\nbL2lw2++O1fSW6m/VYAISAAAAAAAAAAAAAAAAAp1GbwcfTreelYEydcuMcRrM/L9nnlsV6wqpi2r\ntv133mfWVkRyRtEdGFva7MzkYZNoamWN4bV4mYa9qztKIujhVppxGI8r1mJegeZpknBqKZY+7L0t\nLRekWrO8TG8Ns/HJ5ZypAWZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAADS12fp4VJ6z9qVuq1HgUiI+3bpDl589cOKZmevqprXPTbx477rDJlrhr1nq4+s182tMRP\nRqaziXiZJrWekNG17ZbxWJ336M5LXRbI3dLTJrs07RMY6fan1dHLrowY+X7MVjt6N3R6Kul0EbWm\ns7bz8Z+LnabQX43r7Y53php/mXj+Dnv0f1JO1x/8ZxbUzj02O15mfLtD13AvZqnDds+pmMmo26el\nXX0Wh0/D8EYtNjilY7+s/NstpOOTW7QBKgAAAAAAAAAAAAAAAAAAAAAADG88tLW9I3BwJtz6nNf1\nvK/DHVqYJ3pzT5y3MPZeojOWMQylEKpTVjZnDCwkqzYQyRRICATCITAJZQxhMAshnEq4ZQC2srKq\nqrIBZCWNZZgwswmFloVyCu0dFcx1WyrtCBhv5NTPHXds2U5o3hIz4ffbPt+KHUcTSW5c9Jme0u2v\nVYAKpAAAAAAAAAAAAAAAAYZctcVOa35R6tLrltN795/YvknNqrfhpPLH92V5isd9mWq6fHjk6rn0\nZxG8KK5Jm/wbVZiYZtqrmkqL023bkxvCiY3lJHNyRG81mHS4Rn5sNsNp64+3yaWaNrzOzHBl+i6q\nmT7s9J+S+ay8mex6EIneN47SNXKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAImYiJme0JafEs3h6fkidrZOn5eaLeJk7eOdm1Hi2vmtPTry/CHmOJcUvmvOPF1n09Pm\n6HF9ZGm01qxO3R5vSY7XwzmzTy47zzTEd7en5Mfvt2/PURWdo3tvPrPlKymbktFqTtMTvHzbOLDG\nf63JXbFX7FdnoODcDprZpq9TjiMMTvSn4vj8l5fxnrk91saPSa7i2hpOfbTVt5x1m0fLydzR6PDo\ndPGHBXasd585n1lsRERG0dIF5OOe6tAEqgAAAAAAAAAAAAAAAAAAAAAAADX11+TRZrf0y2Gjxe22\ngtH4piP3TPpXKwxtjhuYo9xq442iIblI2pC1RET2ILd9kxCqRjZmwlCSEohIJAQAAJZISDKGUd2M\nMoBnVbVVCyAWVWeSuqyOwIlXZZKue4MJV2WWYT2QKbKL9YlfdRdIo35b7/Hd3KTzUrPrDh27uxpb\nc2mpPwX/ABX9XAKpAAAAAAAAAAAAAACekTIp1eTwtJmv+GkyJn1oafeazbfpMzLR4jq/o8b823zX\n6XNF8ERCvTcNpxLV5LauvPhx9Irv3lhztdtv8TtaWLicXrt03jzjzb2k1nid56ty3s/w+a7Uwzjn\n1raejlarhmbhl/FpbxMO/fzj5p/ixSeXOvTtRfeI280ZI26tfDm3pWe63LaZx7qtGvniJ6tPLvOK\nfOa9WzbJvTbza02jl3n5SSljscK1MajSxWZ96nSW88xw/VfQ9XMT9nfa3yemid43jtLeXsce88qQ\nEqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADia3UTm1l4j7OP3Y/u\n7Vp2rM+kPJW1PhYcmS0+9MzKm/jbwz31weMzbV8UppazPL9q0/BF4rk1GLDSNqxPWPhCnHmnNrtT\nqPKteWPm6U6OdHaZvO+SaRNvhv12Ub/q3FhtrNVj0uKOt56z6R5y9zix1w4qY6RtWsREOJ7L6OKa\nS2rvX6zNM7T6Vh3mmZyOfya7eACzIAAAAAAAAAAAAAAAAAAAAAAAAAAczjVvqMVfW/8AZ03I41bf\nLp6/OVs/UVrY47NyOzUxd4bUJpEbb3Z7IiOrKIVSjZhMLJYyhKIgmGUQSDESIEbJEgQmCITEAmGU\nIiGUAyhZVhDOoM4Wx2VQtqBKuyyWEgqlhKyyuyBVaGtkbNmvk7A15l1eH2300R6TMORPSXT4ZO+O\n8fFefEX63gEAAAAAAAAAAAAAAAq1WPxdLlp+Kkx+y1Fvsz8gjhaDauGK8sx07y3OE3m1tT6RaP4c\nvU6yMNKUx73zT0ilY3l2eF6a+m0kRl/zbzz3+Ez5M8z26fJruW6wzYq5sV8d43raNpZjRzPPaTmx\n5b6bJ9rHO3zb2WJ8GWPEscY9bgzxH2t62n19GWW0eHOzHU5XbjXZ1x8WTnz2iZ7S2M1IjH2+LX0V\nKTqs8zO9ot0j8nUthi1J3UaOFMTfLFo6xMbS9BwHWTqdHOO8+/hnln5eTjYMFo1WTH5VnePzXcIm\n2k4zlpPSmXy/hfF5eMfJns69OA2cgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAADG/2LfJ874rW845mubliY7bPoto5qzHrDz0+yePNF41OotaJ7RWNtpV1OtfHqZ715fhu\nj8adNpcVfeyzE2/vLuanhOu1nEctIxTTFa/+ZPbZ3eHcF0vDbTfFE2yzG03t32+DokynXl9+leDB\nTTYKYccbUpWIhYCzEAAAAAAAAAAAAAAAAAAAAAAAAAAAAcXjE/4zDH9M/wAu04XF5/3jj/0f3Wz9\nRUYmzDWxS2I7FSyjuzY1ZKpRKEygEwiWUIkGIk2QJNhKQhMIhkCYZQxhlAMoZwwZwgWQshVCyATL\nCWc9ldpBhZXLOVdpQK7NfJPRdaWvknoDVvPvOnwuel4+TlXn3nS4VPvXj4QtEV0wAAAAAAAAAAAA\nAAAAAVV02CmTxK4qRf8AFFeq0AAAanEsfPpZmO9Ji0NDLfkwdOsulrumiyzHlVzJrz4Ovoy26vB8\ncTBa9NffLtMY77Rv8Yegx5ImkKdJoY1HC81Y+3OSbVn0mGGkmbY45u6tnrrTOu2xGO0RxCd+nNVj\nqKxTV1vH2pjaGtnyzXXYdo96ZmGXEMk15b7/AGZiVerWPTYckZcNbx5wzc7hGbnxXxzPWk7x8pdF\n0S9jh1OXgAlUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAcPjEf4/FP9H93ccXjMf4vDP9Mx+62fqKrx+S+GvibEFSsqyYwlVK\nZYsmIMoRKYJQIPIEiQ2ATCUQygCGUIhMAyhnDCGUIFkLIV1ZxIMpVWWSrsCuyqyyyq09ECq8tfJK\n66jJ2Bp5J6upwn7dv9Lk5J951uE/av8AJaIrqAAAAAAAAAAAAAAAAAAAAAAq1Mc2myxPnWf4cmtu\nXT9fR0tffk0WSe28bfq5Wbamm3326MtunwfK6PCv/AxPraZ/dz9PO97/AOqf5dHhdZrw7Dv3mOb9\nXOxRFM+avpe38mvkPHf/AFWlrKba7Tzt99ZxKkfR7euyNXMTrtPHfa0z+zPiM/UR8Zj+Wbdu8HpN\nM2bfzrV13M4dO2pyR61dNvj44/J/oAWZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADj8bj63BPzdhyeNx0wz8ZWz9RWri7Nmv\nVrYu0NmqaRZHZlDGGSiwxZSgCEkCBCQSCQBMJRCYgEsoYx3Z17AlMIhlCBnDOGEM4AlhZZKq4KrK\n7LLKrIFN2vdfZReAaObu6/CO9vk5OePR1uEd7fJeIrqAIAAAAAAAAAAAAAAAAAAAAGtxCk5NFliI\n3mI32+XVyNTyZOHTee946PQKPoeDffw4777eW/yVs60xv+ZxOnr4Okx1t05KRv8Ao41Z5q3yed5m\nXY1szXRZ5jvFJ/hxItP0aOSN9q7yrtr4f2tHFM5+KT16Yq/vK/iGSbXw4vO14UcPx5MGfNbPG18m\n1oj4THRsTw7VanPXVYpi3gzMcnrvCnG11JOupwuN8+a3pEQ6jT4divjxWnJExa09pbjbM5HHu90A\nJUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAHM41H1GOf6nTc/jEf4Ws+lls/UX45uGekNujTwdm5RNIthKIZKLDFlsiQIShIC\nEgCUJ7AmGTGO7IDzZQhMSDJMMYZQgZwzhhDOATuqssmVdgVWVWWyqtCBTeVF19lF+wNLNG7q8I+9\n8nLyupwnt+S8RXUAQAAAAAAAAAAAAAAAAAAAAAAItWL1mto3iY2lyrcLyUxzix2ia2nvPeK+jrCL\nOrTVnxpanhuPPemSs8l6RtE7dJj0ldpNP9GwRSZ3neZmV4cR/Vs4AJQAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHi1d9H\nM+kt5ra+vPoskfDdOfqK4mn7Q3aNHBPZu0W0RdDOGFWcKLCJZeTGQQlCQSgASBsCYZQxhlAJTAmA\nTsmAgGcM4YQyjsgRLC3VnaVcgwsrt3Z2V2QK7tbJ1bN5a9waeWO7p8Knt8nNyebpcK8vkvlFdQBA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK9RXmwZI+ErEWjesx6wQeZwejeo0cccuW8\nelpblJaaRGxVnCuss4ZrMvJEgCAASISCQIBlCYYpieoM0wx8k7gzIRueYM4Z79FcSy3QEsLJmWFp\nBjaVVpZWlXMoGNmvkXXlr3kGtknu6XCf7OXkl1OEdl8orqgIAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAHmskcmtzV/rls0U62OXiWX4zErcc9GmkRfWVkSqqziWayxCPIANwBIhIJSxS\nCRG6dwZwlhEs4BluMdzfqgZxLLdXuy3AmVdpZTKuZBjaVVpWWV2QlhZRdfZRcGpl7urwfrzfJy8r\nrcH61vPyWitdMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHA4nHLxKZ9awnH2ZcY\njbW459aq8fZpfiI2IZwrqzhmsz3Ebm4JN0AMhCQSIASndiAziWUSriWcAyRujc80DM3RCfIETLCW\nUsZEsJYSslXZAwlTddPZTkBp5e7r8Gj6rJPxhx8k9Xa4PG2C8/FaK10QAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAcfjcbZMFvnDWx9m5x2PqcNvS+zSxT7sNPxH62YZQwqzhRZO6UCB\nKUAJTux3SDIRuAncQAmJZRLBMSgZ7iIAZRKd2DICUSlAljLCYWMLIFVukNfI2bNbIDTyT7zu8Ijb\nSz/qcG/2nf4T/wCE/wD2WnxWt4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHL9oL\n+Hw2cm28VvEuPptfgyVj6yIn0no7/FtJfW8NzYMe3PaPd39d3iMug1WktNc2C9dvPbeP1aZ9xF+v\nT471tHu2iflK2HkqWmvaZj5Surqc9Ps5bx+alTHqYHm68S1Vf/NmfnC2vGNTXvyT84Ql6A3cSvHM\nsfaxVn5Ssrxyv3sM/lKB1xza8bwT3pePyWV4tpZ+/MfOEjfGrXiGlt2zV/PotrqcN/s5aT/+wLRj\nFontMSlAlKEgndO6IAZQljDIEgeQljLCzOVdkCu/SGrkbF56NPNeKxMzMRHxENe0+89DwuNtHHzl\n5PJr8NcnLW3Pbf7r1nCZm2gpae8zMrz4i/W6AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAETETG0xukB4HVaeMHEtRi26RedvkyjBSfX9W77QYvC4xz7dMlYlrU7M929dWJLFc6aPK0q\n7YLxPS0S22FlP6q38Zac0yR92s/KVc3tHfFf8tpbcsLRvB/dR/8ALLVnU0r9uL1+dZI1mnmdvGpv\n6TOy6ym+Oto2tWJ+cJ/tW+KLK5KW+zes/KU7tG+h01p64qx8Y6NXNo6Y+uPJlp8rLf0rfG7MXtHa\n0x8pZxqs9e2a8f8A7Oj7HaTHn0+f6RWM23LETfr6vRW4PoL99NT8ui7F4+vEdXXtnt+fVbXjGsr/\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 * Human main module\n */\n\nimport { log, now, mergeDeep } from './helpers';\nimport { Config, defaults } from './config';\nimport { Result, Gesture } from './result';\nimport * as sysinfo from './sysinfo';\nimport * as tf from '../dist/tfjs.esm.js';\nimport * as backend from './tfjs/backend';\nimport * as face from './face';\nimport * as facemesh from './blazeface/facemesh';\nimport * as faceres from './faceres/faceres';\nimport * as emotion from './emotion/emotion';\nimport * as posenet from './posenet/posenet';\nimport * as handpose from './handpose/handpose';\nimport * as blazepose from './blazepose/blazepose';\nimport * as efficientpose from './efficientpose/efficientpose';\nimport * as movenet from './movenet/movenet';\nimport * as nanodet from './object/nanodet';\nimport * as centernet from './object/centernet';\nimport * as gesture from './gesture/gesture';\nimport * as image from './image/image';\nimport * as draw from './draw/draw';\nimport * as persons from './persons';\nimport * as interpolate from './interpolate';\nimport * as sample from './sample';\nimport * as app from '../package.json';\nimport { Tensor } from './tfjs/types';\n\n// export types\nexport type { Config } from './config';\nexport type { Result, Face, Hand, Body, Item, Gesture } from './result';\nexport type { DrawOptions } from './draw/draw';\n\n/** Defines all possible input types for **Human** detection\n * @typedef Input\n */\nexport type Input = Tensor | typeof Image | ImageData | ImageBitmap | HTMLImageElement | HTMLMediaElement | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas;\n\n/** Error message\n * @typedef Error\n */\nexport type Error = { error: string };\n\n/** Instance of TensorFlow/JS */\nexport type TensorFlow = typeof tf;\n\n/** Generic Model object type, holds instance of individual models */\ntype Model = unknown;\n\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 */\nexport class Human {\n /** Current version of Human library in *semver* format */\n version: string;\n /** Current configuration\n * - Details: {@link Config}\n */\n config: Config;\n /** Last known result of detect run\n * - Can be accessed anytime after initial detection\n */\n result: Result;\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 /** @internal: Instance of current image being processed */\n image: { tensor: Tensor | null, canvas: OffscreenCanvas | HTMLCanvasElement | null };\n /** @internal: Instance of TensorFlow/JS used by Human\n * - Can be embedded or externally provided\n */\n tf: TensorFlow;\n /** Draw helper classes that can draw detected objects on canvas using specified draw styles\n * - options: global settings for all draw operations, can be overriden for each draw method, for details see {@link DrawOptions}\n * - face: draw detected faces\n * - body: draw detected people and body parts\n * - hand: draw detected hands and hand parts\n * - canvas: draw processed canvas which is a processed copy of the input\n * - all: meta-function that performs: canvas, face, body, hand\n */\n draw: {\n options: draw.DrawOptions,\n gesture: typeof draw.gesture,\n face: typeof draw.face,\n body: typeof draw.body,\n hand: typeof draw.hand,\n canvas: typeof draw.canvas,\n all: typeof draw.all,\n };\n /** @internal: Currently loaded models */\n models: {\n face: [Model, Model, Model] | null,\n posenet: Model | null,\n blazepose: Model | null,\n efficientpose: Model | null,\n movenet: Model | null,\n handpose: [Model, Model] | null,\n age: Model | null,\n gender: Model | null,\n emotion: Model | null,\n embedding: Model | null,\n nanodet: Model | null,\n centernet: Model | null,\n faceres: Model | null,\n };\n /** @internal: Currently loaded classes */\n classes: {\n facemesh: typeof facemesh;\n emotion: typeof emotion;\n body: typeof posenet | typeof blazepose | typeof movenet;\n hand: typeof handpose;\n nanodet: typeof nanodet;\n centernet: typeof centernet;\n faceres: typeof faceres;\n };\n /** Reference face triangualtion array of 468 points, used for triangle references between points */\n faceTriangulation: typeof facemesh.triangulation;\n /** Refernce UV map of 468 values, used for 3D mapping of the face mesh */\n faceUVMap: typeof facemesh.uvmap;\n /** Platform and agent information detected by Human */\n sysinfo: { platform: string, agent: string };\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 #firstRun: boolean;\n #lastInputSum: number;\n #lastCacheDiff: number;\n\n // definition end\n\n /**\n * Creates instance of Human library that is futher used for all operations\n * @param userConfig: {@link Config}\n */\n constructor(userConfig?: Config | Record) {\n this.config = mergeDeep(defaults, userConfig || {});\n this.tf = tf;\n this.draw = draw;\n this.version = app.version;\n this.state = 'idle';\n this.#numTensors = 0;\n this.#analyzeMemoryLeaks = false;\n this.#checkSanity = false;\n this.#firstRun = true;\n this.#lastCacheDiff = 0;\n this.performance = { backend: 0, load: 0, image: 0, frames: 0, cached: 0, changed: 0, total: 0, draw: 0 };\n // object that contains all initialized models\n this.models = {\n face: null,\n posenet: null,\n blazepose: null,\n efficientpose: null,\n movenet: null,\n handpose: null,\n age: null,\n gender: null,\n emotion: null,\n embedding: null,\n nanodet: null,\n centernet: null,\n faceres: null,\n };\n // export access to image processing\n // @ts-ignore eslint-typescript cannot correctly infer type in anonymous function\n this.image = (input: Input) => image.process(input, this.config);\n // export raw access to underlying models\n this.classes = {\n facemesh,\n emotion,\n faceres,\n body: this.config.body.modelPath.includes('posenet') ? posenet : blazepose,\n hand: handpose,\n nanodet,\n centernet,\n };\n this.faceTriangulation = facemesh.triangulation;\n this.faceUVMap = facemesh.uvmap;\n // include platform info\n this.sysinfo = sysinfo.info();\n this.#lastInputSum = 1;\n }\n\n // helper function: measure tensor leak\n /** @hidden */\n analyze = (...msg) => {\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 // quick sanity check on inputs\n /** @hidden */\n #sanity = (input): null | string => {\n if (!this.#checkSanity) return null;\n if (!input) return 'input is not defined';\n if (this.tf.ENV.flags.IS_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 /** Simmilarity method calculates simmilarity between two provided face descriptors (face embeddings)\n * - Calculation is based on normalized Minkowski distance between\n * @param embedding1: face descriptor as array of numbers\n * @param embedding2: face descriptor as array of numbers\n * @returns similarity: number\n */\n // eslint-disable-next-line class-methods-use-this\n similarity(embedding1: Array, embedding2: Array): number {\n return faceres.similarity(embedding1, embedding2);\n }\n\n /** Enhance method performs additional enhacements to face image previously detected for futher processing\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 // @ts-ignore type mismach for Tensor\n return faceres.enhance(input);\n }\n\n /** Math method find best match between provided face descriptor and predefined database of known descriptors\n * @param faceEmbedding: face descriptor previsouly calculated on any face\n * @param db: array of mapping of face descriptors to known values\n * @param threshold: minimum score for matching to be considered in the result\n * @returns best match\n */\n // eslint-disable-next-line class-methods-use-this\n match(faceEmbedding: Array, db: Array<{ name: string, source: string, embedding: number[] }>, threshold = 0): { name: string, source: string, similarity: number, embedding: number[] } {\n return faceres.match(faceEmbedding, db, threshold);\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 * @param userConfig?: {@link Config}\n */\n async load(userConfig?: Config | Record) {\n this.state = 'load';\n const timeStamp = now();\n if (userConfig) this.config = mergeDeep(this.config, userConfig) as Config;\n\n if (this.#firstRun) { // 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_core}`);\n if (this.config.debug) log('platform:', this.sysinfo.platform);\n if (this.config.debug) log('agent:', this.sysinfo.agent);\n\n await this.#checkBackend(true);\n if (this.tf.ENV.flags.IS_BROWSER) {\n if (this.config.debug) log('configuration:', this.config);\n if (this.config.debug) log('tf flags:', this.tf.ENV.flags);\n }\n }\n if (this.config.async) { // load models concurrently\n [\n this.models.face,\n this.models.emotion,\n this.models.handpose,\n this.models.posenet,\n this.models.blazepose,\n this.models.efficientpose,\n this.models.movenet,\n this.models.nanodet,\n this.models.centernet,\n this.models.faceres,\n ] = await Promise.all([\n this.models.face || (this.config.face.enabled ? facemesh.load(this.config) : null),\n this.models.emotion || ((this.config.face.enabled && this.config.face.emotion.enabled) ? emotion.load(this.config) : null),\n this.models.handpose || (this.config.hand.enabled ? handpose.load(this.config) : null),\n this.models.posenet || (this.config.body.enabled && this.config.body.modelPath.includes('posenet') ? posenet.load(this.config) : null),\n this.models.blazepose || (this.config.body.enabled && this.config.body.modelPath.includes('blazepose') ? blazepose.load(this.config) : null),\n this.models.efficientpose || (this.config.body.enabled && this.config.body.modelPath.includes('efficientpose') ? efficientpose.load(this.config) : null),\n this.models.movenet || (this.config.body.enabled && this.config.body.modelPath.includes('movenet') ? movenet.load(this.config) : null),\n this.models.nanodet || (this.config.object.enabled && this.config.object.modelPath.includes('nanodet') ? nanodet.load(this.config) : null),\n this.models.centernet || (this.config.object.enabled && this.config.object.modelPath.includes('centernet') ? centernet.load(this.config) : null),\n this.models.faceres || ((this.config.face.enabled && this.config.face.description.enabled) ? faceres.load(this.config) : null),\n ]);\n } else { // load models sequentially\n if (this.config.face.enabled && !this.models.face) this.models.face = await facemesh.load(this.config);\n if (this.config.face.enabled && this.config.face.emotion.enabled && !this.models.emotion) this.models.emotion = await emotion.load(this.config);\n if (this.config.hand.enabled && !this.models.handpose) this.models.handpose = await handpose.load(this.config);\n if (this.config.body.enabled && !this.models.posenet && this.config.body.modelPath.includes('posenet')) this.models.posenet = await posenet.load(this.config);\n if (this.config.body.enabled && !this.models.blazepose && this.config.body.modelPath.includes('blazepose')) this.models.blazepose = await blazepose.load(this.config);\n if (this.config.body.enabled && !this.models.efficientpose && this.config.body.modelPath.includes('efficientpose')) this.models.efficientpose = await blazepose.load(this.config);\n if (this.config.body.enabled && !this.models.movenet && this.config.body.modelPath.includes('movenet')) this.models.movenet = await movenet.load(this.config);\n if (this.config.object.enabled && !this.models.nanodet && this.config.object.modelPath.includes('nanodet')) this.models.nanodet = await nanodet.load(this.config);\n if (this.config.object.enabled && !this.models.centernet && this.config.object.modelPath.includes('centernet')) this.models.centernet = await centernet.load(this.config);\n if (this.config.face.enabled && this.config.face.description.enabled && !this.models.faceres) this.models.faceres = await faceres.load(this.config);\n }\n\n if (this.#firstRun) { // print memory stats on first run\n if (this.config.debug) log('tf engine state:', this.tf.engine().state.numBytes, 'bytes', this.tf.engine().state.numTensors, 'tensors');\n this.#firstRun = false;\n }\n\n const current = Math.trunc(now() - timeStamp);\n if (current > (this.performance.load as number || 0)) this.performance.load = current;\n }\n\n // check if backend needs initialization if it changed\n /** @hidden */\n #checkBackend = async (force = false) => {\n if (this.config.backend && (this.config.backend.length > 0) && force || (this.tf.getBackend() !== this.config.backend)) {\n const timeStamp = now();\n this.state = 'backend';\n /* force backend reload\n if (this.config.backend in tf.engine().registry) {\n const backendFactory = tf.findBackendFactory(this.config.backend);\n tf.removeBackend(this.config.backend);\n tf.registerBackend(this.config.backend, backendFactory);\n } else {\n log('Backend not registred:', this.config.backend);\n }\n */\n\n if (this.config.backend && this.config.backend.length > 0) {\n // @ts-ignore ignore missing type for WorkerGlobalScope as that is the point\n if (typeof window === 'undefined' && typeof WorkerGlobalScope !== 'undefined' && this.config.debug) log('running inside web worker');\n\n // force browser vs node backend\n if (this.tf.ENV.flags.IS_BROWSER && this.config.backend === 'tensorflow') this.config.backend = 'webgl';\n if (this.tf.ENV.flags.IS_NODE && (this.config.backend === 'webgl' || this.config.backend === 'humangl')) this.config.backend = 'tensorflow';\n\n if (this.config.debug) log('setting backend:', this.config.backend);\n\n if (this.config.backend === 'wasm') {\n if (this.config.debug) log('wasm path:', this.config.wasmPath);\n if (typeof this.tf?.setWasmPaths !== 'undefined') this.tf.setWasmPaths(this.config.wasmPath);\n else throw new Error('Human: WASM backend is not loaded');\n const simd = await this.tf.env().getAsync('WASM_HAS_SIMD_SUPPORT');\n const mt = await this.tf.env().getAsync('WASM_HAS_MULTITHREAD_SUPPORT');\n if (this.config.debug) log(`wasm execution: ${simd ? 'SIMD' : 'no SIMD'} ${mt ? 'multithreaded' : 'singlethreaded'}`);\n if (this.config.debug && !simd) log('warning: wasm simd support is not enabled');\n }\n\n if (this.config.backend === 'humangl') backend.register();\n try {\n await this.tf.setBackend(this.config.backend);\n } catch (err) {\n log('error: cannot set backend:', this.config.backend, err);\n }\n }\n this.tf.enableProdMode();\n // this.tf.enableDebugMode();\n if (this.tf.getBackend() === 'webgl' || this.tf.getBackend() === 'humangl') {\n this.tf.ENV.set('CHECK_COMPUTATION_FOR_ERRORS', false);\n this.tf.ENV.set('WEBGL_CPU_FORWARD', true);\n this.tf.ENV.set('WEBGL_PACK_DEPTHWISECONV', true);\n if (!this.config.object.enabled) this.tf.ENV.set('WEBGL_FORCE_F16_TEXTURES', true); // safe to use 16bit precision\n if (typeof this.config['deallocate'] !== 'undefined' && this.config['deallocate']) { // hidden param\n log('changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:', true);\n this.tf.ENV.set('WEBGL_DELETE_TEXTURE_THRESHOLD', 0);\n }\n const gl = await this.tf.backend().getGPGPUContext().gl;\n if (this.config.debug) log(`gl version:${gl.getParameter(gl.VERSION)} renderer:${gl.getParameter(gl.RENDERER)}`);\n }\n await this.tf.ready();\n this.performance.backend = Math.trunc(now() - timeStamp);\n }\n }\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 * @param result?: use specific result set to run interpolation on\n * @returns result: {@link Result}\n */\n next = (result?: Result) => interpolate.calc(result || this.result) as Result;\n\n // check if input changed sufficiently to trigger new detections\n /** @hidden */\n #skipFrame = async (input) => {\n if (this.config.cacheSensitivity === 0) return false;\n const resizeFact = 32;\n const reduced: Tensor = input.resizeBilinear([Math.trunc(input.shape[1] / resizeFact), Math.trunc(input.shape[2] / resizeFact)]);\n // use tensor sum\n /*\n const sumT = this.tf.sum(reduced);\n const sum = sumT.dataSync()[0] as number;\n sumT.dispose();\n */\n // use js loop sum, faster than uploading tensor to gpu calculating and downloading back\n const reducedData = reduced.dataSync(); // raw image rgb array\n let sum = 0;\n for (let i = 0; i < reducedData.length / 3; i++) sum += reducedData[3 * i + 2]; // look only at green value of each pixel\n\n reduced.dispose();\n const diff = 100 * (Math.max(sum, this.#lastInputSum) / Math.min(sum, this.#lastInputSum) - 1);\n this.#lastInputSum = sum;\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 const skipFrame = diff < Math.max(this.config.cacheSensitivity, this.#lastCacheDiff);\n // if difference is above 10x threshold, don't use last value to force reset cache for significant change of scenes or images\n this.#lastCacheDiff = diff > 10 * this.config.cacheSensitivity ? 0 : diff;\n return skipFrame;\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 * @param input: Input\n * @param userConfig?: Config\n * @returns result: Result\n */\n async detect(input: Input, userConfig?: Config | Record): Promise {\n // detection happens inside a promise\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 resolve({ error });\n }\n\n const timeStart = now();\n\n // configure backend\n await this.#checkBackend();\n\n // load models if enabled\n await this.load();\n\n /*\n // function disabled in favor of inputChanged\n // disable video optimization for inputs of type image, but skip if inside worker thread\n let previousVideoOptimized;\n // @ts-ignore ignore missing type for WorkerGlobalScope as that is the point\n if (input && this.config.videoOptimized && (typeof window !== 'undefined') && (typeof WorkerGlobalScope !== 'undefined') && (\n (typeof HTMLImageElement !== 'undefined' && input instanceof HTMLImageElement)\n || (typeof Image !== 'undefined' && input instanceof Image)\n || (typeof ImageData !== 'undefined' && input instanceof ImageData)\n || (typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap))\n ) {\n log('disabling video optimization');\n previousVideoOptimized = this.config.videoOptimized;\n this.config.videoOptimized = false;\n }\n */\n\n timeStamp = now();\n const process = image.process(input, this.config);\n if (!process || !process.tensor) {\n log('could not convert input to tensor');\n resolve({ error: 'could not convert input to tensor' });\n return;\n }\n this.performance.image = Math.trunc(now() - timeStamp);\n this.analyze('Get Image:');\n\n timeStamp = now();\n this.config.skipFrame = await this.#skipFrame(process.tensor);\n if (!this.performance.frames) this.performance.frames = 0;\n if (!this.performance.cached) this.performance.cached = 0;\n (this.performance.frames as number)++;\n if (this.config.skipFrame) this.performance.cached++;\n this.performance.changed = 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;\n let bodyRes;\n let handRes;\n let objectRes;\n let elapsedTime;\n\n // run face detection followed by all models that rely on face bounding box: face mesh, age, gender, emotion\n if (this.config.async) {\n faceRes = this.config.face.enabled ? face.detectFace(this, process.tensor) : [];\n if (this.performance.face) delete this.performance.face;\n } else {\n this.state = 'run:face';\n timeStamp = now();\n faceRes = this.config.face.enabled ? await face.detectFace(this, process.tensor) : [];\n elapsedTime = Math.trunc(now() - timeStamp);\n if (elapsedTime > 0) this.performance.face = elapsedTime;\n }\n\n // run body: can be posenet, blazepose, efficientpose, movenet\n this.analyze('Start Body:');\n if (this.config.async) {\n if (this.config.body.modelPath.includes('posenet')) bodyRes = this.config.body.enabled ? posenet.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('blazepose')) bodyRes = this.config.body.enabled ? blazepose.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('efficientpose')) bodyRes = this.config.body.enabled ? efficientpose.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('movenet')) bodyRes = this.config.body.enabled ? movenet.predict(process.tensor, this.config) : [];\n if (this.performance.body) delete this.performance.body;\n } else {\n this.state = 'run:body';\n timeStamp = now();\n if (this.config.body.modelPath.includes('posenet')) bodyRes = this.config.body.enabled ? await posenet.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('blazepose')) bodyRes = this.config.body.enabled ? await blazepose.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('efficientpose')) bodyRes = this.config.body.enabled ? await efficientpose.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('movenet')) bodyRes = this.config.body.enabled ? await movenet.predict(process.tensor, this.config) : [];\n elapsedTime = Math.trunc(now() - timeStamp);\n if (elapsedTime > 0) this.performance.body = elapsedTime;\n }\n this.analyze('End Body:');\n\n // run handpose\n this.analyze('Start Hand:');\n if (this.config.async) {\n handRes = this.config.hand.enabled ? handpose.predict(process.tensor, this.config) : [];\n if (this.performance.hand) delete this.performance.hand;\n } else {\n this.state = 'run:hand';\n timeStamp = now();\n handRes = this.config.hand.enabled ? await handpose.predict(process.tensor, this.config) : [];\n elapsedTime = Math.trunc(now() - timeStamp);\n if (elapsedTime > 0) this.performance.hand = elapsedTime;\n }\n this.analyze('End Hand:');\n\n // run nanodet\n this.analyze('Start Object:');\n if (this.config.async) {\n if (this.config.object.modelPath.includes('nanodet')) objectRes = this.config.object.enabled ? nanodet.predict(process.tensor, this.config) : [];\n else if (this.config.object.modelPath.includes('centernet')) objectRes = this.config.object.enabled ? centernet.predict(process.tensor, this.config) : [];\n if (this.performance.object) delete this.performance.object;\n } else {\n this.state = 'run:object';\n timeStamp = now();\n if (this.config.object.modelPath.includes('nanodet')) objectRes = this.config.object.enabled ? await nanodet.predict(process.tensor, this.config) : [];\n else if (this.config.object.modelPath.includes('centernet')) objectRes = this.config.object.enabled ? await centernet.predict(process.tensor, this.config) : [];\n elapsedTime = Math.trunc(now() - timeStamp);\n if (elapsedTime > 0) this.performance.object = elapsedTime;\n }\n this.analyze('End Object:');\n\n // if async wait for results\n if (this.config.async) [faceRes, bodyRes, handRes, objectRes] = await Promise.all([faceRes, bodyRes, handRes, objectRes]);\n\n // run gesture analysis last\n let gestureRes: Gesture[] = [];\n if (this.config.gesture.enabled) {\n timeStamp = now();\n gestureRes = [...gesture.face(faceRes), ...gesture.body(bodyRes), ...gesture.hand(handRes), ...gesture.iris(faceRes)];\n if (!this.config.async) this.performance.gesture = Math.trunc(now() - timeStamp);\n else if (this.performance.gesture) delete this.performance.gesture;\n }\n\n this.performance.total = Math.trunc(now() - timeStart);\n this.state = 'idle';\n this.result = {\n face: faceRes,\n body: bodyRes,\n hand: handRes,\n gesture: gestureRes,\n object: objectRes,\n performance: this.performance,\n canvas: process.canvas,\n timestamp: Date.now(),\n get persons() { return persons.join(faceRes, bodyRes, handRes, gestureRes, process?.tensor?.shape); },\n };\n\n // finally dispose input tensor\n tf.dispose(process.tensor);\n\n // log('Result:', result);\n resolve(this.result);\n });\n }\n\n /** @hidden */\n #warmupBitmap = async () => {\n const b64toBlob = (base64, type = 'application/octet-stream') => fetch(`data:${type};base64,${base64}`).then((res) => res.blob());\n let blob;\n let res;\n switch (this.config.warmup) {\n case 'face': blob = await b64toBlob(sample.face); break;\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 this.detect(bitmap, this.config);\n bitmap.close();\n }\n return res;\n }\n\n /** @hidden */\n #warmupCanvas = async () => new Promise((resolve) => {\n let src;\n let size = 0;\n switch (this.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 const img = new Image();\n img.onload = async () => {\n const canvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(size, size) : document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n ctx?.drawImage(img, 0, 0);\n // const data = ctx?.getImageData(0, 0, canvas.height, canvas.width);\n const res = await this.detect(canvas, this.config);\n resolve(res);\n };\n if (src) img.src = src;\n else resolve(null);\n });\n\n /** @hidden */\n #warmupNode = async () => {\n const atob = (str) => Buffer.from(str, 'base64');\n let img;\n if (this.config.warmup === 'face') img = atob(sample.face);\n if (this.config.warmup === 'body' || this.config.warmup === 'full') img = atob(sample.body);\n if (!img) return null;\n let res;\n if (typeof tf['node'] !== 'undefined') {\n const data = tf['node'].decodeJpeg(img);\n const expanded = data.expandDims(0);\n this.tf.dispose(data);\n // log('Input:', expanded);\n res = await this.detect(expanded, this.config);\n this.tf.dispose(expanded);\n } else {\n if (this.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 this.detect(input, this.config);\n */\n }\n return res;\n }\n\n /** Warmup metho pre-initializes all models for faster inference\n * - can take significant time on startup\n * - only used for `webgl` and `humangl` backends\n * @param userConfig?: Config\n */\n async warmup(userConfig?: Config | Record): Promise {\n const t0 = now();\n if (userConfig) this.config = mergeDeep(this.config, userConfig) as Config;\n if (!this.config.warmup || this.config.warmup === 'none') return { error: 'null' };\n let res;\n if (typeof createImageBitmap === 'function') res = await this.#warmupBitmap();\n else if (typeof Image !== 'undefined') res = await this.#warmupCanvas();\n else res = await this.#warmupNode();\n const t1 = now();\n if (this.config.debug) log('Warmup', this.config.warmup, Math.round(t1 - t0), 'ms', res);\n return res;\n }\n}\n\n/**\n * Class Human is also available as default export\n */\nexport { Human as default };\n"], - "mappings": "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iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,iBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,eAAiB,iBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,gBAAkB,kBACnB,CAAC,cAAgB,kBACjB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,mBAGT,GAAS,CACpB,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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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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AAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OACh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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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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", + "sourcesContent": ["/**\n * Simple helper functions used accross codebase\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(`Human: ModelPath Error: ${path} Expecting JSON file`);\n return path;\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: 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: perform deep merge of multiple objects so it allows full inheriance 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", "/* eslint-disable indent */\n/* eslint-disable no-multi-spaces */\n\n/**\n * Configuration interface definition for **Human** library\n *\n * Contains all configurable parameters\n * @typedef Config\n */\nexport interface Config {\n /** Backend used for TFJS operations */\n backend: null | '' | 'cpu' | 'wasm' | 'webgl' | 'humangl' | 'tensorflow',\n\n /** Path to *.wasm files if backend is set to `wasm` */\n wasmPath: string,\n\n /** Print debug statements to console */\n debug: boolean,\n\n /** Perform model loading and inference concurrently or sequentially */\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 * - only used for `webgl` and `humangl` backends\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 modelBasePath: string,\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 cacheSensitivity: number;\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 skipFrame: boolean;\n\n /** Run input through image filters before inference\n * - image filters run with near-zero latency as they are executed on the GPU\n */\n filter: {\n enabled: 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 // type definition end\n\n /** Controlls gesture detection */\n gesture: {\n enabled: boolean,\n },\n\n /** Controlls and configures all face-specific options:\n * - face detection, face mesh detection, age, gender, emotion detection and face description\n * Parameters:\n * - enabled: true/false\n * - modelPath: path for each of face models\n * - minConfidence: threshold for discarding a prediction\n * - iouThreshold: ammount of overlap between two detected objects before one object is removed\n * - maxDetected: maximum number of faces detected in the input, should be set to the minimum number for performance\n * - rotation: use calculated rotated face image or just box with rotation as-is, false means higher performance, but incorrect mesh mapping on higher face angles\n * - return: return extracted face as tensor for futher user processing\n */\n face: {\n enabled: boolean,\n detector: {\n modelPath: string,\n rotation: boolean,\n maxDetected: number,\n skipFrames: number,\n minConfidence: number,\n iouThreshold: number,\n return: boolean,\n },\n mesh: {\n enabled: boolean,\n modelPath: string,\n },\n iris: {\n enabled: boolean,\n modelPath: string,\n },\n description: {\n enabled: boolean,\n modelPath: string,\n skipFrames: number,\n minConfidence: number,\n },\n emotion: {\n enabled: boolean,\n minConfidence: number,\n skipFrames: number,\n modelPath: string,\n },\n },\n\n /** Controlls and configures all body detection specific options\n * - enabled: true/false\n * - modelPath: body pose model, can be absolute path or relative to modelBasePath\n * - minConfidence: threshold for discarding a prediction\n * - maxDetected: maximum number of people detected in the input, should be set to the minimum number for performance\n */\n body: {\n enabled: boolean,\n modelPath: string,\n maxDetected: number,\n minConfidence: number,\n skipFrames: number,\n },\n\n /** Controlls and configures all hand detection specific options\n * - enabled: true/false\n * - landmarks: detect hand landmarks or just hand boundary box\n * - modelPath: paths for hand detector and hand skeleton models, can be absolute path or relative to modelBasePath\n * - minConfidence: threshold for discarding a prediction\n * - iouThreshold: ammount of overlap between two detected objects before one object is removed\n * - maxDetected: maximum number of hands detected in the input, should be set to the minimum number for performance\n * - rotation: use best-guess rotated hand image or just box with rotation as-is, false means higher performance, but incorrect finger mapping if hand is inverted\n */\n hand: {\n enabled: boolean,\n rotation: boolean,\n skipFrames: number,\n minConfidence: number,\n iouThreshold: number,\n maxDetected: number,\n landmarks: boolean,\n detector: {\n modelPath: string,\n },\n skeleton: {\n modelPath: string,\n },\n },\n\n /** Controlls and configures all object detection specific options\n * - enabled: true/false\n * - modelPath: object detection model, can be absolute path or relative to modelBasePath\n * - minConfidence: minimum score that detection must have to return as valid object\n * - iouThreshold: ammount of overlap between two detected objects before one object is removed\n * - maxDetected: maximum number of detections to return\n */\n object: {\n enabled: boolean,\n modelPath: string,\n minConfidence: number,\n iouThreshold: number,\n maxDetected: number,\n skipFrames: number,\n },\n}\n\nconst config: Config = {\n backend: 'webgl', // select tfjs backend to use, leave empty to use default backend\n // can be 'webgl', 'wasm', 'cpu', or 'humangl' which is a custom version of webgl\n modelBasePath: '../models/', // base path for all models\n wasmPath: '../node_modules/@tensorflow/tfjs-backend-wasm/dist/', // path for wasm binaries, only used for backend: wasm\n debug: true, // print additional status messages to console\n async: true, // execute enabled models in parallel\n warmup: 'full', // what to use for human.warmup(), can be 'none', 'face', 'full'\n // warmup pre-initializes all models for faster inference but can take\n // significant time on startup\n // only used for `webgl` and `humangl` backends\n cacheSensitivity: 0.75, // 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 skipFrame: false, // internal & dynamic\n filter: { // run input through image filters before inference\n // image filters run with near-zero latency as they are executed on the GPU\n enabled: true, // enable image pre-processing filters\n width: 0, // resize input width\n height: 0, // 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 flip: false, // flip input as mirror image\n return: true, // return processed canvas imagedata in result\n brightness: 0, // range: -1 (darken) to 1 (lighten)\n contrast: 0, // range: -1 (reduce contrast) to 1 (increase contrast)\n sharpness: 0, // range: 0 (no sharpening) to 1 (maximum sharpening)\n blur: 0, // range: 0 (no blur) to N (blur radius in pixels)\n saturation: 0, // range: -1 (reduce saturation) to 1 (increase saturation)\n hue: 0, // range: 0 (no change) to 360 (hue rotation in degrees)\n negative: false, // image negative\n sepia: false, // image sepia colors\n vintage: false, // image vintage colors\n kodachrome: false, // image kodachrome colors\n technicolor: false, // image technicolor colors\n polaroid: false, // image polaroid camera effect\n pixelate: 0, // range: 0 (no pixelate) to N (number of pixels to pixelate)\n },\n\n gesture: {\n enabled: true, // enable gesture recognition based on model results\n },\n\n face: {\n enabled: true, // controls if specified modul is enabled\n // face.enabled is required for all face models:\n // detector, mesh, iris, age, gender, emotion\n // (note: module is not loaded until it is required)\n detector: {\n modelPath: 'blazeface.json', // detector model, can be absolute path or relative to modelBasePath\n rotation: true, // use best-guess rotated face image or just box with rotation as-is\n // false means higher performance, but incorrect mesh mapping if face angle is above 20 degrees\n // this parameter is not valid in nodejs\n maxDetected: 15, // maximum number of faces detected in the input\n // should be set to the minimum number for performance\n skipFrames: 15, // how many max frames to go without re-running the face bounding box detector\n // only used when cacheSensitivity is not zero\n // e.g., if model is running st 25 FPS, we can re-use existing bounding\n // box for updated face analysis as the head probably hasn't moved much\n // in short time (10 * 1/25 = 0.25 sec)\n minConfidence: 0.2, // threshold for discarding a prediction\n iouThreshold: 0.1, // ammount of overlap between two detected objects before one object is removed\n return: false, // return extracted face as tensor\n },\n\n mesh: {\n enabled: true,\n modelPath: 'facemesh.json', // facemesh model, can be absolute path or relative to modelBasePath\n },\n\n iris: {\n enabled: true,\n modelPath: 'iris.json', // face iris model\n // can be either absolute path or relative to modelBasePath\n },\n\n description: {\n enabled: true, // to improve accuracy of face description extraction it is\n // recommended to enable detector.rotation and mesh.enabled\n modelPath: 'faceres.json', // face description model\n // can be either absolute path or relative to modelBasePath\n skipFrames: 11, // how many max frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n minConfidence: 0.1, // threshold for discarding a prediction\n },\n\n emotion: {\n enabled: true,\n minConfidence: 0.1, // threshold for discarding a prediction\n skipFrames: 17, // how max many frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n modelPath: 'emotion.json', // face emotion model, can be absolute path or relative to modelBasePath\n },\n },\n\n body: {\n enabled: true,\n modelPath: 'movenet-lightning.json', // body model, can be absolute path or relative to modelBasePath\n // can be 'posenet', 'blazepose', 'efficientpose', 'movenet-lightning', 'movenet-thunder'\n maxDetected: 1, // maximum number of people detected in the input\n // should be set to the minimum number for performance\n // only valid for posenet as other models detects single pose\n minConfidence: 0.2, // threshold for discarding a prediction\n skipFrames: 1, // how many max frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n},\n\n hand: {\n enabled: true,\n rotation: true, // use best-guess rotated hand image or just box with rotation as-is\n // false means higher performance, but incorrect finger mapping if hand is inverted\n skipFrames: 18, // how many max frames to go without re-running the hand bounding box detector\n // only used when cacheSensitivity is not zero\n // e.g., if model is running st 25 FPS, we can re-use existing bounding\n // box for updated hand skeleton analysis as the hand probably\n // hasn't moved much in short time (10 * 1/25 = 0.25 sec)\n minConfidence: 0.1, // threshold for discarding a prediction\n iouThreshold: 0.1, // ammount of overlap between two detected objects before one object is removed\n maxDetected: 2, // maximum number of hands detected in the input\n // should be set to the minimum number for performance\n landmarks: true, // detect hand landmarks or just hand boundary box\n detector: {\n modelPath: 'handdetect.json', // hand detector model, can be absolute path or relative to modelBasePath\n },\n skeleton: {\n modelPath: 'handskeleton.json', // hand skeleton model, can be absolute path or relative to modelBasePath\n },\n },\n\n object: {\n enabled: false,\n modelPath: 'mb3-centernet.json', // experimental: object detection model, can be absolute path or relative to modelBasePath\n // can be 'mb3-centernet' or 'nanodet'\n minConfidence: 0.2, // threshold for discarding a prediction\n iouThreshold: 0.4, // ammount of overlap between two detected objects before one object is removed\n maxDetected: 10, // maximum number of objects detected in the input\n skipFrames: 19, // how many max frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n },\n};\nexport { config as defaults };\n", "/**\n * Helper function that returns basic system info\n */\nexport function info(): { platform: string, agent: string } {\n let platform;\n let agent;\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 platform = platformMatch ? platformMatch[0].replace(/\\(|\\)/g, '') : '';\n agent = navigator.userAgent.replace(raw[0], '');\n if (platform[1]) agent = agent.replace(raw[1], '');\n agent = agent.replace(/ /g, ' ');\n }\n } else if (typeof process !== 'undefined') {\n platform = `${process.platform} ${process.arch}`;\n agent = `NodeJS ${process.version}`;\n }\n return { platform, agent };\n}\n", "/**\n * Creates tfjs bundle used by Human browser build target\n */\n\n// simplified\n// { modules: 1250, moduleBytes: 4013323, imports: 7, importBytes: 2255, outputBytes: 2991826, outputFiles: 'dist/tfjs.esm.js' }\n// export * from '@tensorflow/tfjs/dist/index.js';\n// export * from '@tensorflow/tfjs-backend-wasm';\n\n// modular\n// { modules: 1253, moduleBytes: 4029357, imports: 7, importBytes: 2285, outputBytes: 2998298, outputFiles: 'dist/tfjs.esm.js' }\n\n// get versions of all packages.\nimport * as packageBundle from '@tensorflow/tfjs/package.json';\nimport * as packageCore from '@tensorflow/tfjs-core/package.json';\nimport * as packageData from '@tensorflow/tfjs-data/package.json';\nimport * as packageLayers from '@tensorflow/tfjs-layers/package.json';\nimport * as packageConverter from '@tensorflow/tfjs-converter/package.json';\n// for backends, get version from source so it can register backend during import\nimport { version_cpu } from '@tensorflow/tfjs-backend-cpu/dist/index.js';\nimport { version_webgl } from '@tensorflow/tfjs-backend-webgl/dist/index.js';\nimport { version_wasm } from '@tensorflow/tfjs-backend-wasm/dist/index.js';\n\n// export all - compiled\nexport * from '@tensorflow/tfjs-core/dist/index.js';\nexport * from '@tensorflow/tfjs-layers/dist/index.js';\nexport * from '@tensorflow/tfjs-converter/dist/index.js';\nexport * as data from '@tensorflow/tfjs-data/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-cpu/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-webgl/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-wasm/dist/index.js';\n\n// export all - sources\n/*\nexport * from '@tensorflow/tfjs-core/src/index';\nexport * from '@tensorflow/tfjs-layers/src/index';\nexport * from '@tensorflow/tfjs-converter/src/index';\nexport * as data from '@tensorflow/tfjs-data/src/index';\nexport * from '@tensorflow/tfjs-backend-cpu/src/index';\nexport * from '@tensorflow/tfjs-backend-webgl/src/index';\nexport * from '@tensorflow/tfjs-backend-wasm/src/index';\n*/\n\n// export versions\nexport const version = {\n tfjs: packageBundle?.version || undefined,\n 'tfjs-core': packageCore?.version || undefined,\n 'tfjs-data': packageData?.version || undefined,\n 'tfjs-layers': packageLayers?.version || undefined,\n 'tfjs-converter': packageConverter?.version || undefined,\n 'tfjs-backend-cpu': version_cpu || undefined,\n 'tfjs-backend-webgl': version_webgl || undefined,\n 'tfjs-backend-wasm': version_wasm || undefined,\n};\n// export const version = {};\n", "/**\n * Custom TFJS backend for Human based on WebGL\n * Not used by default\n */\n\nimport { log } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\n\nexport const config = {\n name: 'humangl',\n priority: 99,\n canvas: null,\n gl: null,\n width: 1024,\n height: 1024,\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\nexport function register(): void {\n if (!tf.findBackend(config.name)) {\n log('backend registration:', config.name);\n try {\n config.canvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(config.width, config.height) : document.createElement('canvas');\n } catch (err) {\n log('error: cannot create canvas:', err);\n return;\n }\n try {\n config.gl = config.canvas.getContext('webgl2', config.webGLattr);\n } catch (err) {\n log('error: cannot get WebGL2 context:', err);\n return;\n }\n try {\n tf.setWebGLContext(2, config.gl);\n } catch (err) {\n log('error: cannot set WebGL2 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 try {\n tf.ENV.set('WEBGL_VERSION', 2);\n // tf.ENV.set('WEBGL_MAX_TEXTURE_SIZE', config.gl.getParameter(config.gl.MAX_TEXTURE_SIZE));\n // tf.ENV.set('WEBGL_FORCE_F16_TEXTURES', true);\n // tf.ENV.set('WEBGL_PACK_DEPTHWISECONV', true);\n } catch (err) {\n log('error: cannot set WebGL backend flags:', err);\n return;\n }\n log('backend registered:', config.name);\n }\n}\n", "/**\n * FaceMesh & BlazeFace Module entry point\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as blazeface from './blazeface';\nimport * as facepipeline from './facepipeline';\nimport * as coords from './coords';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Face } from '../result';\nimport { Config } from '../config';\n\nlet faceModels: [blazeface.BlazeFaceModel | null, GraphModel | null, GraphModel | null] = [null, null, null];\nlet facePipeline;\n\nexport async function predict(input: Tensor, config: Config): Promise {\n const predictions = await facePipeline.predict(input, config);\n const results: Array = [];\n let id = 0;\n for (const prediction of (predictions || [])) {\n if (!prediction || prediction.isDisposedInternal) continue; // guard against disposed tensors on long running operations such as pause in middle of processing\n const meshRaw = prediction.mesh.map((pt) => [\n pt[0] / (input.shape[2] || 0),\n pt[1] / (input.shape[1] || 0),\n pt[2] / facePipeline.meshSize,\n ]);\n const annotations = {};\n if (prediction.mesh && prediction.mesh.length > 0) {\n for (const key of Object.keys(coords.MESH_ANNOTATIONS)) annotations[key] = coords.MESH_ANNOTATIONS[key].map((index) => prediction.mesh[index]);\n }\n const clampedBox: [number, number, number, number] = prediction.box ? [\n Math.trunc(Math.max(0, prediction.box.startPoint[0])),\n Math.trunc(Math.max(0, prediction.box.startPoint[1])),\n Math.trunc(Math.min((input.shape[2] || 0), prediction.box.endPoint[0]) - Math.max(0, prediction.box.startPoint[0])),\n Math.trunc(Math.min((input.shape[1] || 0), prediction.box.endPoint[1]) - Math.max(0, prediction.box.startPoint[1])),\n ] : [0, 0, 0, 0];\n const boxRaw: [number, number, number, number] = prediction.box ? [\n prediction.box.startPoint[0] / (input.shape[2] || 0),\n prediction.box.startPoint[1] / (input.shape[1] || 0),\n (prediction.box.endPoint[0] - prediction.box.startPoint[0]) / (input.shape[2] || 0),\n (prediction.box.endPoint[1] - prediction.box.startPoint[1]) / (input.shape[1] || 0),\n ] : [0, 0, 0, 0];\n results.push({\n id: id++,\n score: Math.round(100 * prediction.faceConfidence || 100 * prediction.boxConfidence || 0) / 100,\n boxScore: Math.round(100 * prediction.boxConfidence) / 100,\n faceScore: Math.round(100 * prediction.faceConfidence) / 100,\n box: clampedBox,\n boxRaw,\n mesh: prediction.mesh,\n meshRaw,\n annotations,\n image: prediction.image,\n tensor: prediction.image,\n });\n if (prediction.coords) prediction.coords.dispose();\n }\n return results;\n}\n\nexport async function load(config): Promise<[unknown, unknown, unknown]> {\n if ((!faceModels[0] && config.face.enabled) || (!faceModels[1] && config.face.mesh.enabled) || (!faceModels[2] && config.face.iris.enabled)) {\n // @ts-ignore type mismatch for GraphModel\n faceModels = await Promise.all([\n (!faceModels[0] && config.face.enabled) ? blazeface.load(config) : null,\n (!faceModels[1] && config.face.mesh.enabled) ? tf.loadGraphModel(join(config.modelBasePath, config.face.mesh.modelPath), { fromTFHub: config.face.mesh.modelPath.includes('tfhub.dev') }) : null,\n (!faceModels[2] && config.face.iris.enabled) ? tf.loadGraphModel(join(config.modelBasePath, config.face.iris.modelPath), { fromTFHub: config.face.iris.modelPath.includes('tfhub.dev') }) : null,\n ]);\n if (config.face.mesh.enabled) {\n if (!faceModels[1] || !faceModels[1]['modelUrl']) log('load model failed:', config.face.mesh.modelPath);\n else if (config.debug) log('load model:', faceModels[1]['modelUrl']);\n }\n if (config.face.iris.enabled) {\n if (!faceModels[2] || !faceModels[2]['modelUrl']) log('load model failed:', config.face.iris.modelPath);\n else if (config.debug) log('load model:', faceModels[2]['modelUrl']);\n }\n } else if (config.debug) {\n if (faceModels[0]) log('cached model:', faceModels[0].model['modelUrl']);\n if (faceModels[1]) log('cached model:', faceModels[1]['modelUrl']);\n if (faceModels[2]) log('cached model:', faceModels[2]['modelUrl']);\n }\n facePipeline = new facepipeline.Pipeline(faceModels[0], faceModels[1], faceModels[2]);\n return faceModels;\n}\n\nexport const triangulation = coords.TRI468;\nexport const uvmap = coords.UV468;\n", "import * as tf from '../../dist/tfjs.esm.js';\n\nexport function scaleBoxCoordinates(box, factor) {\n const startPoint = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]];\n const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]];\n return { startPoint, endPoint };\n}\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 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]];\n const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]];\n return { startPoint, endPoint, landmarks: box.landmarks };\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 = [Math.round(centers[0] - halfSize), Math.round(centers[1] - halfSize)];\n const endPoint = [Math.round(centers[0] + halfSize), Math.round(centers[1] + halfSize)];\n return { startPoint, endPoint, landmarks: box.landmarks };\n}\n\nexport function 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, landmarks };\n}\n\nexport const disposeBox = (t) => {\n t.startPoint.dispose();\n t.endPoint.dispose();\n};\n\nexport const createBox = (startEndTensor) => ({\n startPoint: tf.slice(startEndTensor, [0, 0], [-1, 2]),\n endPoint: tf.slice(startEndTensor, [0, 2], [-1, 2]),\n});\n", "export const IDENTITY_MATRIX = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];\n/**\n * Normalizes the provided angle to the range -pi to pi.\n * @param angle The angle in radians to be normalized.\n */\nexport function normalizeRadians(angle) {\n return angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI));\n}\n\n/**\n * Computes the angle of rotation between two anchor points.\n * @param point1 First anchor point\n * @param point2 Second anchor point\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 function radToDegrees(rad) {\n return rad * 180 / Math.PI;\n}\n\nexport function buildTranslationMatrix(x, y) {\n return [[1, 0, x], [0, 1, y], [0, 0, 1]];\n}\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\nexport function xyDistanceBetweenPoints(a, b) {\n return Math.sqrt(((a[0] - b[0]) ** 2) + ((a[1] - b[1]) ** 2));\n}\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++) {\n anchors.push([anchorX, anchorY]);\n }\n }\n }\n }\n return anchors;\n}\n", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as util from './util';\nimport { Config } from '../config';\nimport { Tensor, GraphModel } from '../tfjs/types';\n\nconst keypointsCount = 6;\n\nfunction decodeBounds(boxOutputs, anchors, inputSize) {\n const boxStarts = tf.slice(boxOutputs, [0, 1], [-1, 2]);\n const centers = tf.add(boxStarts, anchors);\n const boxSizes = tf.slice(boxOutputs, [0, 3], [-1, 2]);\n const boxSizesNormalized = tf.div(boxSizes, inputSize);\n const centersNormalized = tf.div(centers, inputSize);\n const halfBoxSize = tf.div(boxSizesNormalized, 2);\n const starts = tf.sub(centersNormalized, halfBoxSize);\n const ends = tf.add(centersNormalized, halfBoxSize);\n const startNormalized = tf.mul(starts, inputSize);\n const endNormalized = tf.mul(ends, inputSize);\n const concatAxis = 1;\n return tf.concat2d([startNormalized, endNormalized], concatAxis);\n}\n\nexport class BlazeFaceModel {\n model: GraphModel;\n anchorsData: [number, number][];\n anchors: Tensor;\n inputSize: number;\n config: Config;\n\n constructor(model, config: Config) {\n this.model = model;\n this.anchorsData = util.generateAnchors(model.inputs[0].shape[1]);\n this.anchors = tf.tensor2d(this.anchorsData);\n this.inputSize = model.inputs[0].shape[2];\n this.config = config;\n }\n\n async getBoundingBoxes(inputImage: Tensor) {\n // sanity check on input\n // @ts-ignore isDisposed is internal property\n if ((!inputImage) || (inputImage.isDisposedInternal) || (inputImage.shape.length !== 4) || (inputImage.shape[1] < 1) || (inputImage.shape[2] < 1)) return null;\n const [batch, boxes, scores] = tf.tidy(() => {\n const resizedImage = inputImage.resizeBilinear([this.inputSize, this.inputSize]);\n const normalizedImage = resizedImage.div(127.5).sub(0.5);\n const res = this.model.execute(normalizedImage);\n let batchOut;\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 const concat384 = tf.concat([sorted[0], sorted[2]], 2); // dim: 384, 1 + 16\n const concat512 = tf.concat([sorted[1], sorted[3]], 2); // dim: 512, 1 + 16\n const concat = tf.concat([concat512, concat384], 1);\n batchOut = concat.squeeze(0);\n } else {\n batchOut = res.squeeze(); // when using tfhub model\n }\n const boxesOut = decodeBounds(batchOut, this.anchors, [this.inputSize, this.inputSize]);\n const logits = tf.slice(batchOut, [0, 0], [-1, 1]);\n const scoresOut = tf.sigmoid(logits).squeeze().dataSync();\n return [batchOut, boxesOut, scoresOut];\n });\n const nmsTensor = await tf.image.nonMaxSuppressionAsync(boxes, scores, this.config.face.detector.maxDetected, this.config.face.detector.iouThreshold, this.config.face.detector.minConfidence);\n const nms = nmsTensor.arraySync();\n nmsTensor.dispose();\n const annotatedBoxes: Array<{ box: { startPoint: Tensor, endPoint: Tensor }, landmarks: Tensor, anchor: number[], confidence: number }> = [];\n for (let i = 0; i < nms.length; i++) {\n const confidence = scores[nms[i]];\n if (confidence > this.config.face.detector.minConfidence) {\n const boundingBox = tf.slice(boxes, [nms[i], 0], [1, -1]);\n const localBox = box.createBox(boundingBox);\n boundingBox.dispose();\n const anchor = this.anchorsData[nms[i]];\n const landmarks = tf.tidy(() => tf.slice(batch, [nms[i], keypointsCount - 1], [1, -1]).squeeze().reshape([keypointsCount, -1]));\n annotatedBoxes.push({ box: localBox, landmarks, anchor, confidence });\n }\n }\n // boundingBoxes.forEach((t) => t.dispose());\n batch.dispose();\n boxes.dispose();\n // scores.dispose();\n return {\n boxes: annotatedBoxes,\n scaleFactor: [inputImage.shape[2] / this.inputSize, inputImage.shape[1] / this.inputSize],\n };\n }\n}\n\nexport async function load(config: Config) {\n const model = await tf.loadGraphModel(join(config.modelBasePath, config.face.detector.modelPath), { fromTFHub: config.face.detector.modelPath.includes('tfhub.dev') });\n const blazeFace = new BlazeFaceModel(model, config);\n if (!model || !model.modelUrl) log('load model failed:', config.face.detector.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n return blazeFace;\n}\n", "export const MESH_ANNOTATIONS = {\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 MESH_TO_IRIS_INDICES_MAP = [ // 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 = [\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 = [\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 = [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 = [\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 = [0, 4, 1, 2, 4, 3, 4, 5, 6];\n\nexport const VTX68 = [\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 = [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 = [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", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as bounding from './box';\nimport * as util from './util';\nimport * as coords from './coords';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { BlazeFaceModel } from './blazeface';\n\nconst leftOutline = coords.MESH_ANNOTATIONS['leftEyeLower0'];\nconst rightOutline = coords.MESH_ANNOTATIONS['rightEyeLower0'];\n\nconst eyeLandmarks = {\n leftBounds: [leftOutline[0], leftOutline[leftOutline.length - 1]],\n rightBounds: [rightOutline[0], rightOutline[rightOutline.length - 1]],\n};\n\nconst meshLandmarks = {\n count: 468,\n mouth: 13,\n symmetryLine: [13, coords.MESH_ANNOTATIONS['midwayBetweenEyes'][0]],\n};\n\nconst blazeFaceLandmarks = {\n leftEye: 0,\n rightEye: 1,\n nose: 2,\n mouth: 3,\n leftEar: 4,\n rightEar: 5,\n symmetryLine: [3, 2],\n};\n\nconst irisLandmarks = {\n upperCenter: 3,\n lowerCenter: 4,\n index: 71,\n numCoordinates: 76,\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.MESH_ANNOTATIONS[`${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// The Pipeline coordinates between the bounding box and skeleton models.\nexport class Pipeline {\n storedBoxes: Array<{ startPoint: number[], endPoint: number[], landmarks: Array, confidence: number, faceConfidence?: number }>;\n boundingBoxDetector: BlazeFaceModel; // tf.GraphModel\n meshDetector: GraphModel; // tf.GraphModel\n irisModel: GraphModel; // tf.GraphModel\n boxSize: number;\n meshSize: number;\n irisSize: number;\n irisEnlarge: number;\n skipped: number;\n detectedFaces: number;\n\n constructor(boundingBoxDetector, meshDetector, irisModel) {\n // An array of facial bounding boxes.\n this.storedBoxes = [];\n this.boundingBoxDetector = boundingBoxDetector;\n this.meshDetector = meshDetector;\n this.irisModel = irisModel;\n this.boxSize = boundingBoxDetector?.model?.inputs[0].shape[2] || 0;\n this.meshSize = meshDetector?.inputs[0].shape[2] || boundingBoxDetector?.model?.inputs[0].shape[2];\n this.irisSize = irisModel?.inputs[0].shape[1] || 0;\n this.irisEnlarge = 2.3;\n this.skipped = 0;\n this.detectedFaces = 0;\n }\n\n transformRawCoords(rawCoords, box, angle, rotationMatrix) {\n const boxSize = bounding.getBoxSize({ startPoint: box.startPoint, endPoint: box.endPoint });\n const coordsScaled = rawCoords.map((coord) => ([\n boxSize[0] / this.meshSize * (coord[0] - this.meshSize / 2),\n boxSize[1] / this.meshSize * (coord[1] - this.meshSize / 2),\n coord[2],\n ]));\n const coordsRotationMatrix = (angle !== 0) ? util.buildRotationMatrix(angle, [0, 0]) : util.IDENTITY_MATRIX;\n const coordsRotated = (angle !== 0) ? coordsScaled.map((coord) => ([...util.rotatePoint(coord, coordsRotationMatrix), coord[2]])) : coordsScaled;\n const inverseRotationMatrix = (angle !== 0) ? util.invertTransformMatrix(rotationMatrix) : util.IDENTITY_MATRIX;\n const boxCenter = [...bounding.getBoxCenter({ startPoint: box.startPoint, endPoint: box.endPoint }), 1];\n return coordsRotated.map((coord) => ([\n Math.round(coord[0] + util.dot(boxCenter, inverseRotationMatrix[0])),\n Math.round(coord[1] + util.dot(boxCenter, inverseRotationMatrix[1])),\n Math.round(coord[2]),\n ]));\n }\n\n // eslint-disable-next-line class-methods-use-this\n 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.\n getEyeBox(rawCoords, face, eyeInnerCornerIndex, eyeOuterCornerIndex, flip = false) {\n const box = bounding.squarifyBox(bounding.enlargeBox(bounding.calculateLandmarksBoundingBox([rawCoords[eyeInnerCornerIndex], rawCoords[eyeOuterCornerIndex]]), this.irisEnlarge));\n const boxSize = bounding.getBoxSize(box);\n let crop = tf.image.cropAndResize(face, [[\n box.startPoint[1] / this.meshSize,\n box.startPoint[0] / this.meshSize, box.endPoint[1] / this.meshSize,\n box.endPoint[0] / this.meshSize,\n ]], [0], [this.irisSize, this.irisSize]);\n if (flip && tf.ENV.flags.IS_BROWSER) {\n crop = tf.image.flipLeftRight(crop); // flipLeftRight is not defined for tfjs-node\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.\n getEyeCoords(eyeData, eyeBox, eyeBoxSize, flip = false) {\n const eyeRawCoords: Array<[number, number, number]> = [];\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 / this.irisSize)) : (x / this.irisSize)) * eyeBoxSize[0] + eyeBox.startPoint[0],\n (y / this.irisSize) * 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\n getAdjustedIrisCoords(rawCoords, irisCoords, direction) {\n const upperCenterZ = rawCoords[coords.MESH_ANNOTATIONS[`${direction}EyeUpper0`][irisLandmarks.upperCenter]][2];\n const lowerCenterZ = rawCoords[coords.MESH_ANNOTATIONS[`${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\n async predict(input, config) {\n let useFreshBox = false;\n // run new detector every skipFrames unless we only want box to start with\n let detector;\n if ((this.skipped === 0) || (this.skipped > config.face.detector.skipFrames) || !config.face.mesh.enabled || !config.skipFrame) {\n detector = await this.boundingBoxDetector.getBoundingBoxes(input);\n this.skipped = 0;\n }\n if (config.skipFrame) this.skipped++;\n\n // if detector result count doesn't match current working set, use it to reset current working set\n if (!config.skipFrame || (detector && detector.boxes && (!config.face.mesh.enabled || (detector.boxes.length !== this.detectedFaces) && (this.detectedFaces !== config.face.detector.maxDetected)))) {\n this.storedBoxes = [];\n this.detectedFaces = 0;\n for (const possible of detector.boxes) {\n this.storedBoxes.push({ startPoint: possible.box.startPoint.dataSync(), endPoint: possible.box.endPoint.dataSync(), landmarks: possible.landmarks.arraySync(), confidence: possible.confidence });\n }\n if (this.storedBoxes.length > 0) useFreshBox = true;\n }\n\n if (useFreshBox) {\n if (!detector || !detector.boxes || (detector.boxes.length === 0)) {\n this.storedBoxes = [];\n this.detectedFaces = 0;\n return null;\n }\n for (let i = 0; i < this.storedBoxes.length; i++) {\n const scaledBox = bounding.scaleBoxCoordinates({ startPoint: this.storedBoxes[i].startPoint, endPoint: this.storedBoxes[i].endPoint }, detector.scaleFactor);\n const enlargedBox = bounding.enlargeBox(scaledBox);\n const squarifiedBox = bounding.squarifyBox(enlargedBox);\n const landmarks = this.storedBoxes[i].landmarks;\n const confidence = this.storedBoxes[i].confidence;\n this.storedBoxes[i] = { ...squarifiedBox, confidence, landmarks };\n }\n }\n if (detector && detector.boxes) {\n detector.boxes.forEach((prediction) => {\n prediction.box.startPoint.dispose();\n prediction.box.endPoint.dispose();\n prediction.landmarks.dispose();\n });\n }\n const results = tf.tidy(() => this.storedBoxes.map((box, i) => {\n // The facial bounding box landmarks could come either from blazeface (if we are using a fresh box), or from the mesh model (if we are reusing an old box).\n let face;\n let angle = 0;\n let rotationMatrix;\n\n if (config.face.detector.rotation && config.face.mesh.enabled && tf.ENV.flags.IS_BROWSER) {\n const [indexOfMouth, indexOfForehead] = (box.landmarks.length >= meshLandmarks.count) ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine;\n angle = util.computeRotation(box.landmarks[indexOfMouth], box.landmarks[indexOfForehead]);\n const faceCenter = bounding.getBoxCenter({ startPoint: box.startPoint, endPoint: box.endPoint });\n const faceCenterNormalized = [faceCenter[0] / input.shape[2], faceCenter[1] / input.shape[1]];\n const rotatedImage = tf.image.rotateWithOffset(input, angle, 0, faceCenterNormalized); // rotateWithOffset is not defined for tfjs-node\n rotationMatrix = util.buildRotationMatrix(-angle, faceCenter);\n if (config.face.mesh.enabled) face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.meshSize, this.meshSize]).div(255);\n else face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.boxSize, this.boxSize]).div(255);\n } else {\n rotationMatrix = util.IDENTITY_MATRIX;\n const clonedImage = input.clone();\n if (config.face.mesh.enabled) face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, clonedImage, [this.meshSize, this.meshSize]).div(255);\n else face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, clonedImage, [this.boxSize, this.boxSize]).div(255);\n }\n\n // if we're not going to produce mesh, don't spend time with further processing\n if (!config.face.mesh.enabled) {\n const prediction = {\n mesh: [],\n box,\n faceConfidence: null,\n boxConfidence: box.confidence,\n confidence: box.confidence,\n image: face,\n };\n return prediction;\n }\n\n const [, confidence, contourCoords] = this.meshDetector.execute(face) as Array; // The first returned tensor represents facial contours which are already included in the coordinates.\n const faceConfidence = confidence.dataSync()[0] as number;\n if (faceConfidence < config.face.detector.minConfidence) {\n this.storedBoxes[i].confidence = faceConfidence; // reset confidence of cached box\n return null; // if below confidence just exit\n }\n const coordsReshaped = tf.reshape(contourCoords, [-1, 3]);\n let rawCoords = coordsReshaped.arraySync();\n\n if (config.face.iris.enabled) {\n const { box: leftEyeBox, boxSize: leftEyeBoxSize, crop: leftEyeCrop } = this.getEyeBox(rawCoords, face, eyeLandmarks.leftBounds[0], eyeLandmarks.leftBounds[1], true);\n const { box: rightEyeBox, boxSize: rightEyeBoxSize, crop: rightEyeCrop } = this.getEyeBox(rawCoords, face, eyeLandmarks.rightBounds[0], eyeLandmarks.rightBounds[1]);\n const eyePredictions = this.irisModel.predict(tf.concat([leftEyeCrop, rightEyeCrop])) as Tensor;\n const eyePredictionsData = eyePredictions.dataSync();\n const leftEyeData = eyePredictionsData.slice(0, irisLandmarks.numCoordinates * 3);\n const { rawCoords: leftEyeRawCoords, iris: leftIrisRawCoords } = this.getEyeCoords(leftEyeData, leftEyeBox, leftEyeBoxSize, true);\n const rightEyeData = eyePredictionsData.slice(irisLandmarks.numCoordinates * 3);\n const { rawCoords: rightEyeRawCoords, iris: rightIrisRawCoords } = this.getEyeCoords(rightEyeData, rightEyeBox, rightEyeBoxSize);\n const leftToRightEyeDepthDifference = this.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 = this.getAdjustedIrisCoords(rawCoords, leftIrisRawCoords, 'left');\n const adjustedRightIrisCoords = this.getAdjustedIrisCoords(rawCoords, rightIrisRawCoords, 'right');\n rawCoords = rawCoords.concat(adjustedLeftIrisCoords).concat(adjustedRightIrisCoords);\n }\n\n // override box from detection with one calculated from mesh\n const mesh = this.transformRawCoords(rawCoords, box, angle, rotationMatrix);\n const storeConfidence = box.confidence;\n // @ts-ignore enlargeBox does not include confidence so we append it manually\n box = bounding.enlargeBox(bounding.calculateLandmarksBoundingBox(mesh), 1.5); // redefine box with mesh calculated one\n box.confidence = storeConfidence;\n\n // do rotation one more time with mesh keypoints if we want to return perfect image\n if (config.face.detector.rotation && config.face.mesh.enabled && config.face.description.enabled && tf.ENV.flags.IS_BROWSER) {\n const [indexOfMouth, indexOfForehead] = (box.landmarks.length >= meshLandmarks.count) ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine;\n angle = util.computeRotation(box.landmarks[indexOfMouth], box.landmarks[indexOfForehead]);\n const faceCenter = bounding.getBoxCenter({ startPoint: box.startPoint, endPoint: box.endPoint });\n const faceCenterNormalized = [faceCenter[0] / input.shape[2], faceCenter[1] / input.shape[1]];\n const rotatedImage = tf.image.rotateWithOffset(input.toFloat(), angle, 0, faceCenterNormalized); // rotateWithOffset is not defined for tfjs-node\n rotationMatrix = util.buildRotationMatrix(-angle, faceCenter);\n face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.meshSize, this.meshSize]).div(255);\n }\n\n const prediction = {\n mesh,\n box,\n faceConfidence,\n boxConfidence: box.confidence,\n image: face,\n };\n\n // updated stored cache values\n this.storedBoxes[i] = { ...bounding.squarifyBox(box), confidence: box.confidence, faceConfidence };\n\n return prediction;\n }));\n\n // results = results.filter((a) => a !== null);\n // remove cache entries for detected boxes on low confidence\n if (config.face.mesh.enabled) this.storedBoxes = this.storedBoxes.filter((a) => a.confidence > config.face.detector.minConfidence);\n this.detectedFaces = results.length;\n\n return results;\n }\n}\n", "/**\n * Emotion Module\n */\n\nimport { log, join } from '../helpers';\nimport { Config } from '../config';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport * as tf from '../../dist/tfjs.esm.js';\n\nconst annotations = ['angry', 'disgust', 'fear', 'happy', 'sad', 'surprise', 'neutral'];\nlet model;\n// let last: Array<{ score: number, emotion: string }> = [];\nconst last: Array> = [];\nlet lastCount = 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\nexport async function load(config: Config): Promise {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.face.emotion.modelPath));\n if (!model || !model.modelUrl) log('load model failed:', config.face.emotion.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n\nexport async function predict(image: Tensor, config: Config, idx, count) {\n if (!model) return null;\n if ((skipped < config.face.emotion.skipFrames) && config.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 resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n const [red, green, blue] = tf.split(resize, 3, 3);\n resize.dispose();\n // weighted rgb to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\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 red.dispose();\n green.dispose();\n blue.dispose();\n const grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\n redNorm.dispose();\n greenNorm.dispose();\n blueNorm.dispose();\n const normalize = tf.tidy(() => grayscale.sub(0.5).mul(2));\n grayscale.dispose();\n const obj: Array<{ score: number, emotion: string }> = [];\n if (config.face.emotion.enabled) {\n const emotionT = await model.predict(normalize); // result is already in range 0..1, no need for additional activation\n const data = emotionT.dataSync();\n tf.dispose(emotionT);\n for (let i = 0; i < data.length; i++) {\n if (data[i] > config.face.emotion.minConfidence) obj.push({ score: Math.min(0.99, Math.trunc(100 * data[i]) / 100), emotion: annotations[i] });\n }\n obj.sort((a, b) => b.score - a.score);\n }\n normalize.dispose();\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "/**\n * HSE-FaceRes Module\n * Returns Age, Gender, Descriptor\n * Implements Face simmilarity function\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model: GraphModel;\nconst last: Array<{\n age: number,\n gender: string,\n genderScore: number,\n descriptor: number[],\n}> = [];\n\nlet lastCount = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\ntype DB = Array<{ name: string, source: string, embedding: number[] }>;\n\nexport async function load(config: Config): Promise {\n const modelUrl = join(config.modelBasePath, config.face.description.modelPath);\n if (!model) {\n // @ts-ignore type mismatch for GraphModel\n model = await tf.loadGraphModel(modelUrl);\n if (!model) log('load model failed:', config.face.description.modelPath);\n else if (config.debug) log('load model:', modelUrl);\n } else if (config.debug) log('cached model:', modelUrl);\n return model;\n}\n\nexport function similarity(embedding1: Array, embedding2: Array, order = 2): number {\n if (!embedding1 || !embedding2) return 0;\n if (embedding1?.length === 0 || embedding2?.length === 0) return 0;\n if (embedding1?.length !== embedding2?.length) return 0;\n // general minkowski distance, euclidean distance is limited case where order is 2\n const distance = 5.0 * embedding1\n .map((val, i) => (Math.abs(embedding1[i] - embedding2[i]) ** order)) // distance squared\n .reduce((sum, now) => (sum + now), 0) // sum all distances\n ** (1 / order); // get root of\n const res = Math.max(0, 100 - distance) / 100.0;\n return res;\n}\n\nexport function match(embedding: Array, db: DB, threshold = 0) {\n let best = { similarity: 0, name: '', source: '', embedding: [] as number[] };\n if (!embedding || !db || !Array.isArray(embedding) || !Array.isArray(db)) return best;\n for (const f of db) {\n if (f.embedding && f.name) {\n const perc = similarity(embedding, f.embedding);\n if (perc > threshold && perc > best.similarity) best = { ...f, similarity: perc };\n }\n }\n return best;\n}\n\nexport function enhance(input): Tensor {\n const image = tf.tidy(() => {\n // input received from detector is already normalized to 0..1\n // input is also assumed to be straightened\n const tensor = input.image || input.tensor || input;\n if (!(tensor instanceof tf.Tensor)) return null;\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 box = [[0.0, 0.0, 1.0, 1.0]]; // basically no crop for test\n if (!model.inputs[0].shape) return null; // model has no shape so no point continuing\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 // just resize to fit the embedding model instead of cropping\n const crop = tf.image.resizeBilinear(tensor, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n */\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 /*\n // increase image pseudo-contrast 100%\n // (or do it per-channel so mean is done on each channel)\n // (or calculate histogram and do it based on histogram)\n const mean = merge.mean();\n const factor = 2;\n const contrast = merge.sub(mean).mul(factor).add(mean);\n */\n\n /*\n // normalize brightness from 0..1\n // silly way of creating pseudo-hdr of image\n const darken = crop.sub(crop.min());\n const lighten = darken.div(darken.max());\n */\n\n const norm = crop.mul(255);\n\n return norm;\n });\n return image;\n}\n\nexport async function predict(image: Tensor, config: Config, idx, count) {\n if (!model) return null;\n if ((skipped < config.face.description.skipFrames) && config.skipFrame && (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 enhanced = enhance(image);\n\n let resT;\n const obj = {\n age: 0,\n gender: 'unknown',\n genderScore: 0,\n descriptor: [],\n };\n\n if (config.face.description.enabled) resT = await model.predict(enhanced);\n tf.dispose(enhanced);\n\n if (resT) {\n tf.tidy(() => {\n const gender = resT.find((t) => t.shape[1] === 1).dataSync();\n const confidence = Math.trunc(200 * Math.abs((gender[0] - 0.5))) / 100;\n if (confidence > config.face.description.minConfidence) {\n obj.gender = gender[0] <= 0.5 ? 'female' : 'male';\n obj.genderScore = Math.min(0.99, confidence);\n }\n const age = resT.find((t) => t.shape[1] === 100).argMax(1).dataSync()[0];\n const all = resT.find((t) => t.shape[1] === 100).dataSync();\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\n obj.descriptor = [...desc.dataSync()];\n });\n resT.forEach((t) => tf.dispose(t));\n }\n\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "/**\n * Module that analyzes person age\n * Obsolete\n */\n\nimport { log, now } from './helpers';\nimport * as tf from '../dist/tfjs.esm.js';\nimport * as facemesh from './blazeface/facemesh';\nimport * as emotion from './emotion/emotion';\nimport * as faceres from './faceres/faceres';\nimport { Face } from './result';\nimport { Tensor } from './tfjs/types';\n\n// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\nconst rad2deg = (theta) => Math.round((theta * 180) / Math.PI);\n\nconst calculateGaze = (face): { bearing: number, strength: number } => {\n const radians = (pt1, pt2) => Math.atan2(pt1[1] - pt2[1], pt1[0] - pt2[0]); // function to calculate angle between any two points\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] > face.mesh[263][2]; // 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\n const eyeDiff = [ // 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] ** 2) + (eyeDiff[1] ** 2)); // 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\n return { bearing, strength };\n};\n\nconst calculateFaceAngle = (face, imageSize): {\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) => { // 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, b) => { // 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, b) => { // 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) => {\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; let thetaY; let thetaZ;\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 return { pitch: 2 * -thetaX, yaw: 2 * -thetaY, roll: 2 * -thetaZ };\n };\n // simple Euler angle calculation based existing 3D mesh\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const meshToEulerAngle = (mesh) => {\n const radians = (a1, a2, b1, b2) => Math.atan2(b2 - a2, b1 - a1);\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const angle = {\n // 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 is face move up/down\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\n // yaw is face turn left/right\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\n // roll is face lean 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\n };\n return angle;\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 = [mesh[10], mesh[152], mesh[234], mesh[454]].map((pt) => [\n // make the xyz coordinates proportional, independent of the image/box size\n pt[0] * imageSize[0] / size,\n pt[1] * imageSize[1] / size,\n pt[2],\n ]);\n\n const y_axis = normalize(subVectors(pts[1], pts[0]));\n let x_axis = normalize(subVectors(pts[3], pts[2]));\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\nexport const detectFace = async (parent /* 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;\n let ageRes;\n let genderRes;\n let emotionRes;\n let embeddingRes;\n let descRes;\n const faceRes: Array = [];\n parent.state = 'run:face';\n timeStamp = now();\n const faces = await facemesh.predict(input, parent.config);\n parent.performance.face = 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 parent.analyze('Get Face');\n\n // is something went wrong, skip the face\n // @ts-ignore possibly undefined\n if (!faces[i].image || faces[i].image['isDisposedInternal']) {\n log('Face object is disposed:', faces[i].image);\n continue;\n }\n\n const rotation = calculateFaceAngle(faces[i], [input.shape[2], input.shape[1]]);\n\n // run emotion, inherits face from blazeface\n parent.analyze('Start Emotion:');\n if (parent.config.async) {\n emotionRes = parent.config.face.emotion.enabled ? emotion.predict(faces[i].image || tf.tensor([]), parent.config, i, faces.length) : {};\n } else {\n parent.state = 'run:emotion';\n timeStamp = now();\n emotionRes = parent.config.face.emotion.enabled ? await emotion.predict(faces[i].image || tf.tensor([]), parent.config, i, faces.length) : {};\n parent.performance.emotion = Math.trunc(now() - timeStamp);\n }\n parent.analyze('End Emotion:');\n\n // run emotion, inherits face from blazeface\n parent.analyze('Start Description:');\n if (parent.config.async) {\n descRes = parent.config.face.description.enabled ? faceres.predict(faces[i].image || tf.tensor([]), parent.config, i, faces.length) : [];\n } else {\n parent.state = 'run:description';\n timeStamp = now();\n descRes = parent.config.face.description.enabled ? await faceres.predict(faces[i].image || tf.tensor([]), parent.config, i, faces.length) : [];\n parent.performance.embedding = Math.trunc(now() - timeStamp);\n }\n parent.analyze('End Description:');\n\n // if async wait for results\n if (parent.config.async) {\n [ageRes, genderRes, emotionRes, embeddingRes, descRes] = await Promise.all([ageRes, genderRes, emotionRes, embeddingRes, descRes]);\n }\n\n parent.analyze('Finish Face:');\n\n // calculate iris distance\n // iris: array[ center, left, top, right, bottom]\n if (!parent.config.face.iris.enabled && faces[i]?.annotations?.leftEyeIris && faces[i]?.annotations?.rightEyeIris) {\n delete faces[i].annotations.leftEyeIris;\n delete faces[i].annotations.rightEyeIris;\n }\n const irisSize = (faces[i].annotations?.leftEyeIris && faces[i].annotations?.rightEyeIris)\n /* note: average human iris size is 11.7mm */\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;\n\n // combine results\n faceRes.push({\n ...faces[i],\n id: i,\n age: descRes.age,\n gender: descRes.gender,\n genderScore: descRes.genderScore,\n embedding: descRes.descriptor,\n emotion: emotionRes,\n iris: irisSize !== 0 ? Math.trunc(500 / irisSize / 11.7) / 100 : 0,\n rotation,\n tensor: parent.config.face.detector.return ? tf.squeeze(faces[i].image) : null,\n });\n // dispose original face tensor\n tf.dispose(faces[i].image);\n // delete temp face image\n if (faces[i].image) delete faces[i].image;\n\n parent.analyze('End Face');\n }\n parent.analyze('End FaceMesh:');\n if (parent.config.async) {\n if (parent.performance.face) delete parent.performance.face;\n if (parent.performance.age) delete parent.performance.age;\n if (parent.performance.gender) delete parent.performance.gender;\n if (parent.performance.emotion) delete parent.performance.emotion;\n }\n return faceRes;\n};\n", "/**\n * PoseNet module entry point\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as poses from './poses';\nimport * as util from './utils';\nimport { Body } from '../result';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { Config } from '../config';\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 */];\n\nexport async function predict(input: Tensor, config: Config): Promise {\n const res = tf.tidy(() => {\n if (!model.inputs[0].shape) return [];\n const resized = input.resizeBilinear([model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n const normalized = resized.toFloat().div(127.5).sub(1.0);\n const results: Array = model.execute(normalized, poseNetOutputs) as Array;\n const results3d = results.map((y) => y.squeeze([0]));\n results3d[1] = results3d[1].sigmoid(); // apply sigmoid on scores\n return results3d;\n });\n\n const buffers = await Promise.all(res.map((tensor) => tensor.buffer()));\n for (const t of res) t.dispose();\n\n const decoded = await poses.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 = util.scalePoses(decoded, [input.shape[1], input.shape[2]], [model.inputs[0].shape[2], model.inputs[0].shape[1]]) as Body[];\n return scaled;\n}\n\nexport async function load(config: Config): Promise {\n if (!model) {\n // @ts-ignore type mismatch for GraphModel\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath));\n if (!model || !model['modelUrl']) log('load model failed:', config.body.modelPath);\n else if (config.debug) log('load model:', model['modelUrl']);\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n", "export 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", "import * as kpt from './keypoints';\nimport { Body } from '../result';\n\nexport function eitherPointDoesntMeetConfidence(a, b, minConfidence) {\n return (a < minConfidence || b < minConfidence);\n}\n\nexport function getAdjacentKeyPoints(keypoints, minConfidence) {\n return kpt.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) => ({\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,\n part,\n position: [Math.trunc(position.x * scaleX), Math.trunc(position.y * scaleY)],\n positionRaw: [position.x / inputResolutionHeight, position.y / inputResolutionHeight],\n })),\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 + kpt.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", "import * as utils from './utils';\nimport * as kpt from './keypoints';\n\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: kpt.partNames[targetId], score };\n}\n\nexport function decodePose(root, scores, offsets, displacementsFwd, displacementsBwd) {\n const tuples = kpt.poseChain.map(([parentJoinName, childJoinName]) => ([kpt.partIds[parentJoinName], kpt.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: kpt.partNames[root.part.id],\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: [number, number, number, number], 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", "/**\n * HandPose module entry point\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as handdetector from './handdetector';\nimport * as handpipeline from './handpipeline';\nimport { Hand } from '../result';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { Config } from '../config';\n\nconst meshAnnotations = {\n thumb: [1, 2, 3, 4],\n indexFinger: [5, 6, 7, 8],\n middleFinger: [9, 10, 11, 12],\n ringFinger: [13, 14, 15, 16],\n pinky: [17, 18, 19, 20],\n palmBase: [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 // @ts-ignore landmarks are not undefined\n annotations[key] = meshAnnotations[key].map((index) => predictions[i].landmarks[index]);\n }\n }\n\n const keypoints = predictions[i].landmarks as unknown as Array<[number, number, number]>;\n\n let box: [number, number, number, number] = [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, 0, 0]; // maximums so conditionals work\n let boxRaw: [number, number, number, number] = [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 hands.push({ id: i, score: Math.round(100 * predictions[i].confidence) / 100, box, boxRaw, keypoints, annotations });\n }\n return hands;\n}\n\nexport async function load(config: Config): Promise<[unknown, unknown]> {\n if (!handDetectorModel || !handPoseModel) {\n // @ts-ignore type mismatch on GraphModel\n [handDetectorModel, handPoseModel] = await Promise.all([\n config.hand.enabled ? tf.loadGraphModel(join(config.modelBasePath, config.hand.detector.modelPath), { fromTFHub: config.hand.detector.modelPath.includes('tfhub.dev') }) : null,\n config.hand.landmarks ? tf.loadGraphModel(join(config.modelBasePath, config.hand.skeleton.modelPath), { fromTFHub: config.hand.skeleton.modelPath.includes('tfhub.dev') }) : null,\n ]);\n if (config.hand.enabled) {\n if (!handDetectorModel || !handDetectorModel['modelUrl']) log('load model failed:', config.hand.detector.modelPath);\n else if (config.debug) log('load model:', handDetectorModel['modelUrl']);\n if (!handPoseModel || !handPoseModel['modelUrl']) log('load model failed:', config.hand.skeleton.modelPath);\n else if (config.debug) log('load model:', handPoseModel['modelUrl']);\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", "import * as tf from '../../dist/tfjs.esm.js';\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]];\n const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]];\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]];\n const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]];\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];\n const endPoint = [centers[0] + halfSize, centers[1] + halfSize];\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]];\n const endPoint = [box.endPoint[0] + shiftVector[0], box.endPoint[1] + shiftVector[1]];\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n", "export 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", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as anchors from './anchors';\nimport { Tensor, GraphModel } from '../tfjs/types';\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 // @ts-ignore model is not undefined here\n this.inputSize = this.model?.inputs[0].shape[2];\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 return tf.tidy(() => {\n const boxOffsets = tf.slice(boxes, [0, 0], [-1, 2]);\n const boxSizes = tf.slice(boxes, [0, 2], [-1, 2]);\n const boxCenterPoints = tf.add(tf.div(boxOffsets, this.inputSizeTensor), this.anchorsTensor);\n const halfBoxSizes = tf.div(boxSizes, this.doubleInputSizeTensor);\n const startPoints = tf.mul(tf.sub(boxCenterPoints, halfBoxSizes), this.inputSizeTensor);\n const endPoints = tf.mul(tf.add(boxCenterPoints, halfBoxSizes), this.inputSizeTensor);\n return tf.concat2d([startPoints, endPoints], 1);\n });\n }\n\n normalizeLandmarks(rawPalmLandmarks, index) {\n return tf.tidy(() => {\n const landmarks = tf.add(tf.div(rawPalmLandmarks.reshape([-1, 7, 2]), this.inputSizeTensor), this.anchors[index]);\n return tf.mul(landmarks, this.inputSizeTensor);\n });\n }\n\n async getBoxes(input, config) {\n const batched = this.model.predict(input) as Tensor;\n const predictions = batched.squeeze();\n batched.dispose();\n const scoresT = tf.tidy(() => tf.sigmoid(tf.slice(predictions, [0, 0], [-1, 1])).squeeze());\n const scores = scoresT.dataSync();\n const rawBoxes = tf.slice(predictions, [0, 1], [-1, 4]);\n const boxes = this.normalizeBoxes(rawBoxes);\n rawBoxes.dispose();\n const filteredT = await tf.image.nonMaxSuppressionAsync(boxes, scores, config.hand.maxDetected, config.hand.iouThreshold, config.hand.minConfidence);\n const filtered = filteredT.arraySync();\n\n scoresT.dispose();\n filteredT.dispose();\n const hands: Array<{ box: Tensor, palmLandmarks: Tensor, confidence: number }> = [];\n for (const index of filtered) {\n if (scores[index] >= config.hand.minConfidence) {\n const matchingBox = tf.slice(boxes, [index, 0], [1, -1]);\n const rawPalmLandmarks = tf.slice(predictions, [index, 5], [1, 14]);\n const palmLandmarks = tf.tidy(() => this.normalizeLandmarks(rawPalmLandmarks, index).reshape([-1, 2]));\n rawPalmLandmarks.dispose();\n hands.push({ box: matchingBox, palmLandmarks, confidence: scores[index] });\n }\n }\n predictions.dispose();\n boxes.dispose();\n return hands;\n }\n\n async estimateHandBounds(input, config): Promise<{ startPoint: number[]; endPoint: number[]; palmLandmarks: number[]; confidence: number }[]> {\n const inputHeight = input.shape[1];\n const inputWidth = input.shape[2];\n const image = tf.tidy(() => input.resizeBilinear([this.inputSize, this.inputSize]).div(127.5).sub(1));\n const predictions = await this.getBoxes(image, config);\n image.dispose();\n const hands: Array<{ startPoint: number[]; endPoint: number[]; palmLandmarks: number[]; confidence: number }> = [];\n if (!predictions || predictions.length === 0) return hands;\n for (const prediction of predictions) {\n const boxes = prediction.box.dataSync();\n const startPoint = boxes.slice(0, 2);\n const endPoint = boxes.slice(2, 4);\n const palmLandmarks = prediction.palmLandmarks.arraySync();\n prediction.box.dispose();\n prediction.palmLandmarks.dispose();\n hands.push(box.scaleBoxCoordinates({ startPoint, endPoint, palmLandmarks, confidence: prediction.confidence }, [inputWidth / this.inputSize, inputHeight / this.inputSize]));\n }\n return hands;\n }\n}\n", "export 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", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as util from './util';\nimport * as detector from './handdetector';\nimport { Tensor, GraphModel } from '../tfjs/types';\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;\n\nexport class HandPipeline {\n handDetector: detector.HandDetector;\n handPoseModel: GraphModel;\n inputSize: number;\n storedBoxes: Array<{ startPoint: number[]; endPoint: number[]; palmLandmarks: number[]; confidence: number } | null>;\n skipped: number;\n detectedHands: number;\n\n constructor(handDetector, handPoseModel) {\n this.handDetector = handDetector;\n this.handPoseModel = handPoseModel;\n // @ts-ignore model is not undefined here\n this.inputSize = this.handPoseModel?.inputs[0].shape[2];\n this.storedBoxes = [];\n this.skipped = 0;\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 box.enlargeBox(box.squarifyBox(boxAroundPalm), palmBoxEnlargeFactor);\n }\n\n getBoxForHandLandmarks(landmarks) {\n const boundingBox = this.calculateLandmarksBoundingBox(landmarks);\n const boxAroundHand = box.enlargeBox(box.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 = box.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 = [...box.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 unless we only want box to start with\n let boxes;\n\n // console.log(this.skipped, config.hand.skipFrames, !config.hand.landmarks, !config.skipFrame);\n if ((this.skipped === 0) || (this.skipped > config.hand.skipFrames) || !config.hand.landmarks || !config.skipFrame) {\n boxes = await this.handDetector.estimateHandBounds(image, config);\n this.skipped = 0;\n }\n if (config.skipFrame) 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?: number[], confidence: number, box: { topLeft: number[], bottomRight: number[] } }> = [];\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 = box.getBoxCenter(currentBox);\n const palmCenterNormalized = [palmCenter[0] / image.shape[2], palmCenter[1] / image.shape[1]];\n const rotatedImage = config.hand.rotation && tf.ENV.flags.IS_BROWSER ? 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 = box.cutBoxFromImageAndResize(newBox, rotatedImage, [this.inputSize, this.inputSize]);\n const handImage = croppedInput.div(255);\n croppedInput.dispose();\n rotatedImage.dispose();\n const [confidenceT, keypoints] = await this.handPoseModel.predict(handImage) as Array;\n handImage.dispose();\n const confidence = confidenceT.dataSync()[0];\n confidenceT.dispose();\n if (confidence >= config.hand.minConfidence) {\n const keypointsReshaped = tf.reshape(keypoints, [-1, 3]);\n const rawCoords = keypointsReshaped.arraySync();\n keypoints.dispose();\n keypointsReshaped.dispose();\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 box: { topLeft: nextBoundingBox.startPoint, bottomRight: nextBoundingBox.endPoint },\n };\n hands.push(result);\n } else {\n this.storedBoxes[i] = null;\n }\n keypoints.dispose();\n } else {\n // const enlarged = box.enlargeBox(box.squarifyBox(box.shiftBox(currentBox, HAND_BOX_SHIFT_VECTOR)), handBoxEnlargeFactor);\n const enlarged = box.enlargeBox(box.squarifyBox(currentBox), handBoxEnlargeFactor);\n const result = {\n confidence: currentBox.confidence,\n box: { topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint },\n };\n hands.push(result);\n }\n }\n this.storedBoxes = this.storedBoxes.filter((a) => a !== null);\n this.detectedHands = hands.length;\n return hands;\n }\n}\n", "/**\n * BlazePose Module\n */\n\n// paper: https://ai.googleblog.com/2020/08/on-device-real-time-body-pose-tracking.html\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as annotations from './annotations';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { Body } from '../result';\nimport { Config } from '../config';\n\nlet model: GraphModel;\n\nexport async function load(config: Config): Promise {\n if (!model) {\n // @ts-ignore type mismatch for Graphmodel\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath));\n model['width'] = parseInt(model['signature'].inputs['input_1:0'].tensorShape.dim[2].size);\n model['height'] = parseInt(model['signature'].inputs['input_1:0'].tensorShape.dim[1].size);\n if (!model || !model['modelUrl']) log('load model failed:', config.body.modelPath);\n else if (config.debug) log('load model:', model['modelUrl']);\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor, config: Config): Promise {\n if (!model) return [];\n if (!config.body.enabled) return [];\n const imgSize = { width: (image.shape[2] || 0), height: (image.shape[1] || 0) };\n const resize = tf.image.resizeBilinear(image, [model['width'], model['height']], false);\n const normalize = tf.div(resize, [255.0]);\n resize.dispose();\n const resT = await model.predict(normalize) as Array;\n const points = resT.find((t) => (t.size === 195 || t.size === 155))?.dataSync() || []; // order of output tensors may change between models, full has 195 and upper has 155 items\n resT.forEach((t) => t.dispose());\n normalize.dispose();\n const keypoints: Array<{ id, part, position: [number, number, number], positionRaw: [number, number, number], score, presence }> = [];\n const labels = points?.length === 195 ? annotations.full : annotations.upper; // full model has 39 keypoints, upper has 31 keypoints\n const depth = 5; // each points has x,y,z,visibility,presence\n for (let i = 0; i < points.length / depth; i++) {\n keypoints.push({\n id: i,\n part: labels[i],\n position: [\n Math.trunc(imgSize.width * points[depth * i + 0] / 255), // return normalized x value istead of 0..255\n Math.trunc(imgSize.height * points[depth * i + 1] / 255), // return normalized y value istead of 0..255\n Math.trunc(points[depth * i + 2]) + 0, // fix negative zero\n ],\n positionRaw: [\n points[depth * i + 0] / 255, // return x value normalized to 0..1\n points[depth * i + 1] / 255, // return y value normalized to 0..1\n points[depth * i + 2] + 0, // fix negative zero\n ],\n score: (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 3])))) / 100, // reverse sigmoid value\n presence: (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 4])))) / 100, // reverse sigmoid value\n });\n }\n const x = keypoints.map((a) => a.position[0]);\n const y = keypoints.map((a) => a.position[1]);\n const box: [number, number, number, number] = [\n Math.min(...x),\n Math.min(...y),\n Math.max(...x) - Math.min(...x),\n Math.max(...y) - Math.min(...x),\n ];\n const boxRaw: [number, number, number, number] = [0, 0, 0, 0]; // not yet implemented\n const score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n return [{ id: 0, score, box, boxRaw, keypoints }];\n}\n", "export const full = [\n 'nose',\n 'leftEyeInside',\n 'leftEye',\n 'leftEyeOutside',\n 'rightEyeInside',\n 'rightEye',\n 'rightEyeOutside',\n 'leftEar',\n 'rightEar',\n 'leftMouth',\n 'rightMouth',\n 'leftShoulder',\n 'rightShoulder',\n 'leftElbow',\n 'rightElbow',\n 'leftWrist',\n 'rightWrist',\n 'leftPalm',\n 'rightPalm',\n 'leftIndex',\n 'rightIndex',\n 'leftPinky',\n 'rightPinky',\n 'leftHip',\n 'rightHip',\n 'leftKnee',\n 'rightKnee',\n 'leftAnkle',\n 'rightAnkle',\n 'leftHeel',\n 'rightHeel',\n 'leftFoot',\n 'rightFoot',\n 'midHip',\n 'forehead',\n 'leftThumb',\n 'leftHand',\n 'rightThumb',\n 'rightHand',\n];\n\nexport const upper = [\n 'nose',\n 'leftEyeInside',\n 'leftEye',\n 'leftEyeOutside',\n 'rightEyeInside',\n 'rightEye',\n 'rightEyeOutside',\n 'leftEar',\n 'rightEar',\n 'leftMouth',\n 'rightMouth',\n 'leftShoulder',\n 'rightShoulder',\n 'leftElbow',\n 'rightElbow',\n 'left:15',\n 'right:16',\n 'left:17',\n 'right:18',\n 'left:19',\n 'right:20',\n 'left:21',\n 'right:22',\n 'leftChest',\n 'rightChest',\n 'neck',\n 'forehead',\n 'left:27',\n 'right:28',\n 'left:29',\n 'right:30',\n];\n", "/**\n * EfficientPose Module\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { Body } from '../result';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model: GraphModel;\n\ntype Keypoints = { score: number, part: string, position: [number, number], positionRaw: [number, number] };\n\nconst keypoints: Array = [];\nlet box: [number, number, number, number] = [0, 0, 0, 0];\nlet boxRaw: [number, number, number, number] = [0, 0, 0, 0];\nlet score = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nconst bodyParts = ['head', 'neck', 'rightShoulder', 'rightElbow', 'rightWrist', 'chest', 'leftShoulder', 'leftElbow', 'leftWrist', 'pelvis', 'rightHip', 'rightKnee', 'rightAnkle', 'leftHip', 'leftKnee', 'leftAnkle'];\n\nexport async function load(config: Config): Promise {\n if (!model) {\n // @ts-ignore type mismatch on GraphModel\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath));\n if (!model || !model['modelUrl']) log('load model failed:', config.body.modelPath);\n else if (config.debug) log('load model:', model['modelUrl']);\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\nfunction max2d(inputs, minScore) {\n const [width, height] = inputs.shape;\n return tf.tidy(() => {\n // modulus op implemented in tf\n const mod = (a, b) => tf.sub(a, tf.mul(tf.div(a, tf.scalar(b, 'int32')), tf.scalar(b, 'int32')));\n // combine all data\n const reshaped = tf.reshape(inputs, [height * width]);\n // get highest score\n const newScore = tf.max(reshaped, 0).dataSync()[0];\n if (newScore > minScore) {\n // skip coordinate calculation is score is too low\n const coords = tf.argMax(reshaped, 0);\n const x = mod(coords, width).dataSync()[0];\n const y = tf.div(coords, tf.scalar(width, 'int32')).dataSync()[0];\n return [x, y, newScore];\n }\n return [0, 0, newScore];\n });\n}\n\nexport async function predict(image: Tensor, config: Config): Promise {\n if ((skipped < config.body.skipFrames) && config.skipFrame && Object.keys(keypoints).length > 0) {\n skipped++;\n return [{ id: 0, score, box, boxRaw, keypoints }];\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, 2);\n const norm = enhance.sub(1);\n return norm;\n });\n\n let resT;\n if (config.body.enabled) resT = await model.predict(tensor);\n tensor.dispose();\n\n if (resT) {\n 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] = max2d(stack[id], config.body.minConfidence);\n if (score > config.body.minConfidence) {\n keypoints.push({\n score: Math.round(100 * partScore) / 100,\n part: bodyParts[id],\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 score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n const x = keypoints.map((a) => a.position[0]);\n const y = keypoints.map((a) => a.position[1]);\n 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 = keypoints.map((a) => a.positionRaw[0]);\n const yRaw = keypoints.map((a) => a.positionRaw[1]);\n 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 resolve([{ id: 0, score, box, boxRaw, keypoints }]);\n });\n}\n", "/**\n * EfficientPose Module\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { Body } from '../result';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model: GraphModel;\n\ntype Keypoints = { score: number, part: string, position: [number, number], positionRaw: [number, number] };\n\nconst keypoints: Array = [];\nlet box: [number, number, number, number] = [0, 0, 0, 0];\nlet boxRaw: [number, number, number, number] = [0, 0, 0, 0];\nlet score = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nconst bodyParts = ['nose', 'leftEye', 'rightEye', 'leftEar', 'rightEar', 'leftShoulder', 'rightShoulder', 'leftElbow', 'rightElbow', 'leftWrist', 'rightWrist', 'leftHip', 'rightHip', 'leftKnee', 'rightKnee', 'leftAnkle', 'rightAnkle'];\n\nexport async function load(config: Config): Promise {\n if (!model) {\n // @ts-ignore type mismatch on GraphModel\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath));\n if (!model || !model['modelUrl']) log('load model failed:', config.body.modelPath);\n else if (config.debug) log('load model:', model['modelUrl']);\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor, config: Config): Promise {\n if ((skipped < config.body.skipFrames) && config.skipFrame && Object.keys(keypoints).length > 0) {\n skipped++;\n return [{ id: 0, score, box, boxRaw, keypoints }];\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 cast = tf.cast(resize, 'int32');\n return cast;\n });\n\n let resT;\n if (config.body.enabled) resT = await model.predict(tensor);\n tensor.dispose();\n\n if (resT) {\n keypoints.length = 0;\n const res = resT.arraySync();\n tf.dispose(resT);\n const kpt = res[0][0];\n for (let id = 0; id < kpt.length; id++) {\n score = kpt[id][2];\n if (score > config.body.minConfidence) {\n keypoints.push({\n score: Math.round(100 * score) / 100,\n part: bodyParts[id],\n positionRaw: [ // normalized to 0..1\n kpt[id][1],\n kpt[id][0],\n ],\n position: [ // normalized to input image size\n Math.round((image.shape[2] || 0) * kpt[id][1]),\n Math.round((image.shape[1] || 0) * kpt[id][0]),\n ],\n });\n }\n }\n }\n score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n const x = keypoints.map((a) => a.position[0]);\n const y = keypoints.map((a) => a.position[1]);\n 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 = keypoints.map((a) => a.positionRaw[0]);\n const yRaw = keypoints.map((a) => a.positionRaw[1]);\n 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 resolve([{ id: 0, score, box, boxRaw, keypoints }]);\n });\n}\n", "/**\n * NanoDet object detection module\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { labels } from './labels';\nimport { Item } from '../result';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model;\nlet last: Array = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nconst scaleBox = 2.5; // increase box size\n\nexport async function load(config: Config): Promise {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.object.modelPath));\n const inputs = Object.values(model.modelSignature['inputs']);\n model.inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : null;\n if (!model.inputSize) throw new Error(`Human: Cannot determine model inputSize: ${config.object.modelPath}`);\n if (!model || !model.modelUrl) log('load model failed:', config.object.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n\nasync function process(res, inputSize, outputShape, 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(() => { // 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 = res.find((a) => (a.shape[1] === (baseSize ** 2) && a.shape[2] === labels.length))?.squeeze();\n const featuresT = res.find((a) => (a.shape[1] === (baseSize ** 2) && a.shape[2] < labels.length))?.squeeze();\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 = boxesMax.argMax(2).arraySync(); // what we need is indexes of features with highest scores, not values itself\n const scores = scoresT.arraySync(); // 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 && 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) => 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 = [x, y, w, h]; // results normalized to range 0..1\n boxRaw = boxRaw.map((a) => Math.max(0, Math.min(a, 1))); // 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,\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 [number, number, number, number],\n boxRaw: boxRaw as [number, number, number, number],\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 = nms.dataSync();\n tf.dispose(nms);\n }\n\n // filter & sort results\n results = results\n .filter((a, 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 if ((skipped < config.object.skipFrames) && config.skipFrame && (last.length > 0)) {\n skipped++;\n return last;\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const outputSize = [image.shape[2], image.shape[1]];\n const resize = tf.image.resizeBilinear(image, [model.inputSize, model.inputSize], false);\n const norm = resize.div(255);\n const transpose = norm.transpose([0, 3, 1, 2]);\n norm.dispose();\n resize.dispose();\n\n let objectT;\n if (config.object.enabled) objectT = await model.predict(transpose);\n transpose.dispose();\n\n const obj = await process(objectT, model.inputSize, outputSize, config);\n last = obj;\n resolve(obj);\n });\n}\n", "/**\n * CoCo Labels used by object detection modules\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 module\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { labels } from './labels';\nimport { Item } from '../result';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model;\nlet last: Item[] = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.object.modelPath));\n const inputs = Object.values(model.modelSignature['inputs']);\n model.inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : null;\n if (!model.inputSize) throw new Error(`Human: Cannot determine model inputSize: ${config.object.modelPath}`);\n if (!model || !model.modelUrl) log('load model failed:', config.object.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n\nasync function process(res: Tensor, inputSize, outputShape, config: Config) {\n if (!res) return [];\n const results: Array = [];\n const detections = res.arraySync();\n const squeezeT = tf.squeeze(res);\n res.dispose();\n const arr = tf.split(squeezeT, 6, 1); // x1, y1, x2, y2, score, class\n squeezeT.dispose();\n const stackT = tf.stack([arr[1], arr[0], arr[3], arr[2]], 1); // reorder dims as tf.nms expects y, x\n const boxesT = stackT.squeeze();\n const scoresT = arr[4].squeeze();\n const classesT = arr[5].squeeze();\n arr.forEach((t) => t.dispose());\n const nmsT = await tf.image.nonMaxSuppressionAsync(boxesT, scoresT, config.object.maxDetected, config.object.iouThreshold, config.object.minConfidence);\n boxesT.dispose();\n scoresT.dispose();\n classesT.dispose();\n const nms = nmsT.dataSync();\n nmsT.dispose();\n let i = 0;\n for (const id of 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;\n const boxRaw = [\n detections[0][id][0] / inputSize,\n detections[0][id][1] / inputSize,\n detections[0][id][2] / inputSize,\n detections[0][id][3] / inputSize,\n ] as [number, number, number, number];\n const 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 ] as [number, number, number, number];\n results.push({ id: i++, score, class: classVal, label, box, boxRaw });\n }\n return results;\n}\n\nexport async function predict(input: Tensor, config: Config): Promise {\n if ((skipped < config.object.skipFrames) && config.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], input.shape[1]];\n const resize = tf.image.resizeBilinear(input, [model.inputSize, model.inputSize]);\n const objectT = config.object.enabled ? model.execute(resize, ['tower_0/detections']) : null;\n resize.dispose();\n\n const obj = await process(objectT, model.inputSize, outputSize, config);\n last = obj;\n resolve(obj);\n });\n}\n", "/**\n * Gesture detection module\n */\n\nimport { Gesture } from '../result';\n\nexport const body = (res): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ body: number, gesture: string }> = [];\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.y < nose.position.y) && (rightWrist.position.y < nose.position.y)) gestures.push({ body: i, gesture: 'i give up' });\n else if (nose && leftWrist && (leftWrist.position.y < nose.position.y)) gestures.push({ body: i, gesture: 'raise left hand' });\n else if (nose && rightWrist && (rightWrist.position.y < nose.position.y)) 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) gestures.push({ body: i, gesture: `leaning ${(leftShoulder.position.y > rightShoulder.position.y) ? 'left' : 'right'}` });\n }\n return gestures;\n};\n\nexport const face = (res): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ face: number, gesture: string }> = [];\n for (let i = 0; i < res.length; i++) {\n if (res[i].mesh && res[i].mesh.length > 0) {\n const eyeFacing = res[i].mesh[33][2] - res[i].mesh[263][2];\n if (Math.abs(eyeFacing) < 10) gestures.push({ face: i, gesture: 'facing center' });\n else gestures.push({ face: i, gesture: `facing ${eyeFacing < 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];\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): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ iris: number, gesture: string }> = [];\n for (let i = 0; i < res.length; i++) {\n if (!res[i].annotations || !res[i].annotations.leftEyeIris || !res[i].annotations.rightEyeIris) 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 rightIrisCenterX = Math.abs(res[i].mesh[33][0] - res[i].annotations.rightEyeIris[0][0]) / res[i].box[2];\n const leftIrisCenterX = Math.abs(res[i].mesh[263][0] - res[i].annotations.leftEyeIris[0][0]) / res[i].box[2];\n if (leftIrisCenterX > 0.06 || rightIrisCenterX > 0.06) center = false;\n if (leftIrisCenterX > 0.06) gestures.push({ iris: i, gesture: 'looking right' });\n if (rightIrisCenterX > 0.06) gestures.push({ iris: i, gesture: 'looking left' });\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): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ hand: number, gesture: string }> = [];\n for (let i = 0; i < res.length; i++) {\n const fingers: Array<{ name: string, position: number }> = [];\n for (const [finger, pos] of Object.entries(res[i]['annotations'])) {\n if (finger !== 'palmBase' && Array.isArray(pos)) fingers.push({ name: finger.toLowerCase(), position: pos[0] }); // get tip of each finger\n }\n if (fingers && fingers.length > 0) {\n const closest = fingers.reduce((best, a) => (best.position[2] < a.position[2] ? best : a));\n const highest = fingers.reduce((best, a) => (best.position[1] < a.position[1] ? best : a));\n gestures.push({ hand: i, gesture: `${closest.name} forward ${highest.name} up` });\n }\n }\n return gestures;\n};\n", "/*\nWebGLImageFilter by Dominic Szablewski: \n*/\n\nfunction GLProgram(gl, vertexSource, fragmentSource) {\n const _collect = function (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\n const _compile = function (source, type) {\n const shader = gl.createShader(type);\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) throw new Error('Filter: GL compile failed', gl.getShaderInfoLog(shader));\n return shader;\n };\n\n this.uniform = {};\n this.attribute = {};\n const _vsh = _compile(vertexSource, gl.VERTEX_SHADER);\n const _fsh = _compile(fragmentSource, gl.FRAGMENT_SHADER);\n this.id = gl.createProgram();\n gl.attachShader(this.id, _vsh);\n gl.attachShader(this.id, _fsh);\n gl.linkProgram(this.id);\n\n if (!gl.getProgramParameter(this.id, gl.LINK_STATUS)) throw new Error('Filter: GL link failed', gl.getProgramInfoLog(this.id));\n\n gl.useProgram(this.id);\n // Collect attributes\n _collect(vertexSource, 'attribute', this.attribute);\n for (const a in this.attribute) this.attribute[a] = gl.getAttribLocation(this.id, a);\n // Collect uniforms\n _collect(vertexSource, 'uniform', this.uniform);\n _collect(fragmentSource, 'uniform', this.uniform);\n for (const u in this.uniform) this.uniform[u] = gl.getUniformLocation(this.id, u);\n}\n\n// export const GLImageFilter = function (params) {\nexport function GLImageFilter(params) {\n if (!params) params = { };\n let _drawCount = 0;\n let _sourceTexture = null;\n let _lastInChain = false;\n let _currentFramebufferIndex = -1;\n let _tempFramebuffers = [null, null];\n let _filterChain = [];\n let _width = -1;\n let _height = -1;\n let _vertexBuffer = null;\n let _currentProgram = null;\n const _filter = {};\n const _canvas = params.canvas || document.createElement('canvas');\n // key is the shader program source, value is the compiled program\n const _shaderProgramCache = { };\n const DRAW = { INTERMEDIATE: 1 };\n const gl = _canvas.getContext('webgl');\n if (!gl) throw new Error('Filter: getContext() failed');\n\n this.addFilter = function (name) {\n // eslint-disable-next-line prefer-rest-params\n const args = Array.prototype.slice.call(arguments, 1);\n const filter = _filter[name];\n _filterChain.push({ func: filter, args });\n };\n\n this.reset = function () {\n _filterChain = [];\n };\n\n const _resize = function (width, height) {\n // Same width/height? Nothing to do here\n if (width === _width && height === _height) { return; }\n _canvas.width = width;\n _width = width;\n _canvas.height = height;\n _height = height;\n // Create the context if we don't have it yet\n if (!_vertexBuffer) {\n // Create the vertex buffer for the two triangles [x, y, u, v] * 6\n const vertices = new Float32Array([\n -1, -1, 0, 1, 1, -1, 1, 1, -1, 1, 0, 0,\n -1, 1, 0, 0, 1, -1, 1, 1, 1, 1, 1, 0,\n ]);\n // eslint-disable-next-line no-unused-expressions\n (_vertexBuffer = gl.createBuffer(), 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, _width, _height);\n // Delete old temp framebuffers\n _tempFramebuffers = [null, null];\n };\n\n const _createFramebufferTexture = function (width, height) {\n const fbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n const renderbuffer = gl.createRenderbuffer();\n gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);\n const texture = gl.createTexture();\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 const _getTempFramebuffer = function (index) {\n _tempFramebuffers[index] = _tempFramebuffers[index] || _createFramebufferTexture(_width, _height);\n return _tempFramebuffers[index];\n };\n\n const _draw = function (flags = null) {\n let source = null;\n let target = null;\n let flipY = false;\n // Set up the source\n if (_drawCount === 0) {\n // First draw call - use the source texture\n source = _sourceTexture;\n } else {\n // All following draw calls use the temp buffer last drawn to\n source = _getTempFramebuffer(_currentFramebufferIndex)?.texture;\n }\n _drawCount++;\n // Set up the target\n if (_lastInChain && !(flags & DRAW.INTERMEDIATE)) {\n // Last filter in our chain - draw directly to the WebGL Canvas. We may\n // also have to flip the image vertically now\n target = null;\n flipY = _drawCount % 2 === 0;\n } else {\n // Intermediate draw call - get a temp buffer to draw to\n _currentFramebufferIndex = (_currentFramebufferIndex + 1) % 2;\n target = _getTempFramebuffer(_currentFramebufferIndex)?.fbo;\n }\n // Bind the source and target and draw the two triangles\n gl.bindTexture(gl.TEXTURE_2D, source);\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 this.apply = function (image) {\n _resize(image.width, image.height);\n _drawCount = 0;\n // Create the texture for the input image if we haven't yet\n if (!_sourceTexture) _sourceTexture = gl.createTexture();\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 // No filters? Just draw\n if (_filterChain.length === 0) {\n // const program = _compileShader(SHADER.FRAGMENT_IDENTITY);\n _draw();\n return _canvas;\n }\n for (let i = 0; i < _filterChain.length; i++) {\n _lastInChain = (i === _filterChain.length - 1);\n const f = _filterChain[i];\n f.func.apply(this, f.args || []);\n }\n return _canvas;\n };\n\n const _compileShader = function (fragmentSource) {\n if (_shaderProgramCache[fragmentSource]) {\n _currentProgram = _shaderProgramCache[fragmentSource];\n gl.useProgram(_currentProgram.id);\n return _currentProgram;\n }\n // Compile shaders\n const SHADER = {};\n SHADER.VERTEX_IDENTITY = [\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 ].join('\\n');\n SHADER.FRAGMENT_IDENTITY = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform sampler2D texture;',\n 'void main(void) {',\n 'gl_FragColor = texture2D(texture, vUv);',\n '}',\n ].join('\\n');\n _currentProgram = new GLProgram(gl, SHADER.VERTEX_IDENTITY, fragmentSource);\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;\n };\n\n // -------------------------------------------------------------------------\n // Color Matrix Filter\n _filter.colorMatrix = function (matrix) {\n // Create a Float32 Array and normalize the offset component to 0-1\n const m = new Float32Array(matrix);\n m[4] /= 255;\n m[9] /= 255;\n m[14] /= 255;\n m[19] /= 255;\n // Can we ignore the alpha value? Makes things a bit faster.\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)\n ? _filter.colorMatrix.SHADER.WITHOUT_ALPHA\n : _filter.colorMatrix.SHADER.WITH_ALPHA;\n const program = _compileShader(shader);\n gl.uniform1fv(program.uniform.m, m);\n _draw();\n };\n _filter.colorMatrix.SHADER = {};\n _filter.colorMatrix.SHADER.WITH_ALPHA = [\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 ].join('\\n');\n _filter.colorMatrix.SHADER.WITHOUT_ALPHA = [\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 ].join('\\n');\n\n _filter.brightness = function (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 _filter.saturation = function (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 _filter.desaturate = function () {\n _filter.saturation(-1);\n };\n\n _filter.contrast = function (amount) {\n const v = (amount || 0) + 1;\n const o = -128 * (v - 1);\n\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 _filter.negative = function () {\n _filter.contrast(-2);\n };\n\n _filter.hue = function (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\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 _filter.desaturateLuminance = function () {\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 _filter.sepia = function () {\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 _filter.brownie = function () {\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 _filter.vintagePinhole = function () {\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 _filter.kodachrome = function () {\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 _filter.technicolor = function () {\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 _filter.polaroid = function () {\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 _filter.shiftToBGR = function () {\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 // -------------------------------------------------------------------------\n // Convolution Filter\n _filter.convolution = function (matrix) {\n const m = new Float32Array(matrix);\n const pixelSizeX = 1 / _width;\n const pixelSizeY = 1 / _height;\n const program = _compileShader(_filter.convolution.SHADER);\n gl.uniform1fv(program.uniform.m, m);\n gl.uniform2f(program.uniform.px, pixelSizeX, pixelSizeY);\n _draw();\n };\n\n _filter.convolution.SHADER = [\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 ].join('\\n');\n\n _filter.detectEdges = function () {\n _filter.convolution.call(this, [\n 0, 1, 0,\n 1, -4, 1,\n 0, 1, 0,\n ]);\n };\n\n _filter.sobelX = function () {\n _filter.convolution.call(this, [\n -1, 0, 1,\n -2, 0, 2,\n -1, 0, 1,\n ]);\n };\n\n _filter.sobelY = function () {\n _filter.convolution.call(this, [\n -1, -2, -1,\n 0, 0, 0,\n 1, 2, 1,\n ]);\n };\n\n _filter.sharpen = function (amount) {\n const a = amount || 1;\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 _filter.emboss = function (size) {\n const s = size || 1;\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 // -------------------------------------------------------------------------\n // Blur Filter\n _filter.blur = function (size) {\n const blurSizeX = (size / 7) / _width;\n const blurSizeY = (size / 7) / _height;\n const program = _compileShader(_filter.blur.SHADER);\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 _filter.blur.SHADER = [\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 ].join('\\n');\n\n // -------------------------------------------------------------------------\n // Pixelate Filter\n _filter.pixelate = function (size) {\n const blurSizeX = (size) / _width;\n const blurSizeY = (size) / _height;\n const program = _compileShader(_filter.pixelate.SHADER);\n // Horizontal\n gl.uniform2f(program.uniform.size, blurSizeX, blurSizeY);\n _draw();\n };\n\n _filter.pixelate.SHADER = [\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 ].join('\\n');\n}\n", "/**\n * Image Processing module used by Human\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as fxImage from './imagefx';\nimport { Tensor } from '../tfjs/types';\n\nconst maxSize = 2048;\n// internal temp canvases\nlet inCanvas;\nlet outCanvas;\n// instance of fximage\nlet fx;\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 function process(input, config): { tensor: Tensor | null, canvas: OffscreenCanvas | HTMLCanvasElement } {\n let tensor;\n if (!input) throw new Error('Human: Input is missing');\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 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('Human: Input type is not recognized');\n }\n if (input instanceof tf.Tensor) {\n // if input is tensor, use as-is\n if (input.shape && input.shape.length === 4 && input.shape[0] === 1 && input.shape[3] === 3) tensor = tf.clone(input);\n else throw new Error(`Human: Input tensor shape must be [1, height, width, 3] and instead was ${input.shape}`);\n } else {\n // check if resizing will be needed\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) return { tensor: null, canvas: inCanvas }; // video may become temporarily unavailable due to onresize\n let targetWidth = originalWidth;\n let targetHeight = originalHeight;\n if (targetWidth > maxSize) {\n targetWidth = maxSize;\n targetHeight = targetWidth * originalHeight / originalWidth;\n }\n if (targetHeight > maxSize) {\n targetHeight = maxSize;\n targetWidth = targetHeight * originalWidth / originalHeight;\n }\n\n // create our canvas and resize it if needed\n if (config.filter.width > 0) targetWidth = config.filter.width;\n else if (config.filter.height > 0) targetWidth = originalWidth * (config.filter.height / originalHeight);\n if (config.filter.height > 0) targetHeight = config.filter.height;\n else if (config.filter.width > 0) targetHeight = originalHeight * (config.filter.width / originalWidth);\n if (!targetWidth || !targetHeight) throw new Error('Human: Input cannot determine dimension');\n if (!inCanvas || (inCanvas?.width !== targetWidth) || (inCanvas?.height !== targetHeight)) {\n inCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement('canvas');\n if (inCanvas?.width !== targetWidth) inCanvas.width = targetWidth;\n if (inCanvas?.height !== targetHeight) inCanvas.height = targetHeight;\n }\n\n // draw input to our canvas\n const ctx = inCanvas.getContext('2d');\n if (input instanceof ImageData) {\n ctx.putImageData(input, 0, 0);\n } else {\n if (config.filter.flip && typeof ctx.translate !== 'undefined') {\n ctx.translate(originalWidth, 0);\n ctx.scale(-1, 1);\n ctx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas?.width, inCanvas?.height);\n ctx.setTransform(1, 0, 0, 1, 0, 0); // resets transforms to defaults\n } else {\n ctx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas?.width, inCanvas?.height);\n }\n }\n\n // imagefx transforms using gl\n if (config.filter.enabled) {\n if (!fx || !outCanvas || (inCanvas.width !== outCanvas.width) || (inCanvas?.height !== outCanvas?.height)) {\n outCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(inCanvas?.width, inCanvas?.height) : document.createElement('canvas');\n if (outCanvas?.width !== inCanvas?.width) outCanvas.width = inCanvas?.width;\n if (outCanvas?.height !== inCanvas?.height) outCanvas.height = inCanvas?.height;\n // log('created FX filter');\n fx = tf.ENV.flags.IS_BROWSER ? new fxImage.GLImageFilter({ canvas: outCanvas }) : null; // && (typeof document !== 'undefined')\n }\n if (!fx) return { tensor: null, canvas: inCanvas };\n fx.reset();\n fx.addFilter('brightness', config.filter.brightness); // must have at least one filter enabled\n if (config.filter.contrast !== 0) fx.addFilter('contrast', config.filter.contrast);\n if (config.filter.sharpness !== 0) fx.addFilter('sharpen', config.filter.sharpness);\n if (config.filter.blur !== 0) fx.addFilter('blur', config.filter.blur);\n if (config.filter.saturation !== 0) fx.addFilter('saturation', config.filter.saturation);\n if (config.filter.hue !== 0) fx.addFilter('hue', config.filter.hue);\n if (config.filter.negative) fx.addFilter('negative');\n if (config.filter.sepia) fx.addFilter('sepia');\n if (config.filter.vintage) fx.addFilter('brownie');\n if (config.filter.sepia) fx.addFilter('sepia');\n if (config.filter.kodachrome) fx.addFilter('kodachrome');\n if (config.filter.technicolor) fx.addFilter('technicolor');\n if (config.filter.polaroid) fx.addFilter('polaroid');\n if (config.filter.pixelate !== 0) fx.addFilter('pixelate', config.filter.pixelate);\n fx.apply(inCanvas);\n // read pixel data\n /*\n const gl = outCanvas.getContext('webgl');\n if (gl) {\n const glBuffer = new Uint8Array(outCanvas.width * outCanvas.height * 4);\n const pixBuffer = new Uint8Array(outCanvas.width * outCanvas.height * 3);\n gl.readPixels(0, 0, outCanvas.width, outCanvas.height, gl.RGBA, gl.UNSIGNED_BYTE, glBuffer);\n // gl returns rbga while we only need rgb, so discarding alpha channel\n // gl returns starting point as lower left, so need to invert vertical\n let i = 0;\n for (let y = outCanvas.height - 1; y >= 0; y--) {\n for (let x = 0; x < outCanvas.width; x++) {\n const index = (x + y * outCanvas.width) * 4;\n pixBuffer[i++] = glBuffer[index + 0];\n pixBuffer[i++] = glBuffer[index + 1];\n pixBuffer[i++] = glBuffer[index + 2];\n }\n }\n outCanvas.data = pixBuffer;\n }\n */\n } else {\n outCanvas = inCanvas;\n if (fx) fx = null;\n }\n\n // create tensor from image\n let pixels;\n if (outCanvas.data) { // if we have data, just convert to tensor\n const shape = [outCanvas.height, outCanvas.width, 3];\n pixels = tf.tensor3d(outCanvas.data, shape, 'int32');\n } else if (outCanvas instanceof ImageData) { // if input is imagedata, just use it\n pixels = tf.browser.fromPixels(outCanvas);\n } else if (config.backend === 'webgl' || config.backend === 'humangl') { // tf kernel-optimized method to get imagedata\n // we can use canvas as-is as it already has a context, so we do a silly one more canvas\n const tempCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement('canvas');\n tempCanvas.width = targetWidth;\n tempCanvas.height = targetHeight;\n const tempCtx = tempCanvas.getContext('2d');\n tempCtx?.drawImage(outCanvas, 0, 0);\n pixels = tf.browser.fromPixels(tempCanvas);\n } else { // cpu and wasm kernel does not implement efficient fromPixels method\n // we can use canvas as-is as it already has a context, so we do a silly one more canvas\n const tempCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement('canvas');\n tempCanvas.width = targetWidth;\n tempCanvas.height = targetHeight;\n const tempCtx = tempCanvas.getContext('2d');\n tempCtx?.drawImage(outCanvas, 0, 0);\n const data = tempCtx?.getImageData(0, 0, targetWidth, targetHeight);\n pixels = tf.browser.fromPixels(data);\n }\n const casted = pixels.toFloat();\n tensor = casted.expandDims(0);\n pixels.dispose();\n casted.dispose();\n }\n const canvas = config.filter.return ? outCanvas : null;\n return { tensor, canvas };\n}\n", "/**\n * Module that implements helper draw functions, exposed as human.draw\n */\n\nimport { TRI468 as triangulation } from '../blazeface/coords';\nimport { mergeDeep, now } from '../helpers';\nimport type { Result, Face, Body, Hand, Item, Gesture, Person } from '../result';\n\n/**\n * Draw Options\n * Accessed via `human.draw.options` or provided per each draw method as the drawOptions optional parameter\n * -color: draw color\n * -labelColor: color for labels\n * -shadowColor: optional shadow color for labels\n * -font: font for labels\n * -lineHeight: line height for labels, used for multi-line labels,\n * -lineWidth: width of any lines,\n * -pointSize: size of any point,\n * -roundRect: for boxes, round corners by this many pixels,\n * -drawPoints: should points be drawn,\n * -drawLabels: should labels be drawn,\n * -drawBoxes: should boxes be drawn,\n * -drawPolygons: should polygons be drawn,\n * -fillPolygons: should drawn polygons be filled,\n * -useDepth: use z-axis coordinate as color shade,\n * -useCurves: draw polygons as cures or as lines,\n * -bufferedOutput: experimental: allows to call draw methods multiple times for each detection and interpolate results between results thus achieving smoother animations\n */\nexport interface DrawOptions {\n color: string,\n labelColor: string,\n shadowColor: string,\n font: string,\n lineHeight: number,\n lineWidth: number,\n pointSize: number,\n roundRect: number,\n drawPoints: boolean,\n drawLabels: boolean,\n drawBoxes: boolean,\n drawPolygons: boolean,\n drawGaze: boolean,\n fillPolygons: boolean,\n useDepth: boolean,\n useCurves: boolean,\n bufferedOutput: boolean,\n}\n\nexport const options: DrawOptions = {\n color: 'rgba(173, 216, 230, 0.6)', // 'lightblue' with light alpha channel\n labelColor: 'rgba(173, 216, 230, 1)', // 'lightblue' with dark alpha channel\n shadowColor: 'black',\n font: 'small-caps 14px \"Segoe UI\"',\n lineHeight: 24,\n lineWidth: 6,\n pointSize: 2,\n roundRect: 28,\n drawPoints: false,\n drawLabels: true,\n drawBoxes: true,\n drawPolygons: true,\n drawGaze: true,\n fillPolygons: false,\n useDepth: true,\n useCurves: false,\n bufferedOutput: true,\n};\n\nconst rad2deg = (theta) => Math.round((theta * 180) / Math.PI);\n\nfunction point(ctx, x, y, z = 0, localOptions) {\n ctx.fillStyle = localOptions.useDepth && z ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.3)` : localOptions.color;\n ctx.beginPath();\n ctx.arc(x, y, localOptions.pointSize, 0, 2 * Math.PI);\n ctx.fill();\n}\n\nfunction rect(ctx, x, y, width, height, localOptions) {\n ctx.beginPath();\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.lineWidth = localOptions.lineWidth;\n ctx.moveTo(x + localOptions.roundRect, y);\n ctx.lineTo(x + width - localOptions.roundRect, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + localOptions.roundRect);\n ctx.lineTo(x + width, y + height - localOptions.roundRect);\n ctx.quadraticCurveTo(x + width, y + height, x + width - localOptions.roundRect, y + height);\n ctx.lineTo(x + localOptions.roundRect, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - localOptions.roundRect);\n ctx.lineTo(x, y + localOptions.roundRect);\n ctx.quadraticCurveTo(x, y, x + localOptions.roundRect, y);\n ctx.closePath();\n }\n ctx.stroke();\n}\n\nfunction lines(ctx, points: [number, number, number?][] = [], localOptions) {\n if (points === undefined || points.length === 0) 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 ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.3)` : localOptions.color;\n ctx.fillStyle = localOptions.useDepth && z ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.3)` : localOptions.color;\n ctx.lineTo(pt[0], Math.round(pt[1]));\n }\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.closePath();\n ctx.fill();\n }\n}\n\nfunction curves(ctx, points: [number, number, number?][] = [], localOptions) {\n if (points === undefined || points.length === 0) return;\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 async function gesture(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\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\nexport async function face(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\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 // 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.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 ctx.lineWidth = 1;\n if (f.mesh && f.mesh.length > 0) {\n if (localOptions.drawPoints) {\n for (const pt of f.mesh) point(ctx, pt[0], pt[1], pt[2], localOptions);\n // for (const pt of f.meshRaw) point(ctx, pt[0] * inCanvas.offsetWidth, pt[1] * inCanvas.offsetHeight, pt[2]);\n }\n if (localOptions.drawPolygons) {\n ctx.lineWidth = 1;\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 // iris: array[center, left, top, right, bottom]\n if (f.annotations && f.annotations['leftEyeIris']) {\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']) {\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?.gaze?.strength && f.rotation?.gaze?.bearing) {\n ctx.strokeStyle = 'pink';\n ctx.beginPath();\n\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 ctx.moveTo(f.annotations['leftEyeIris'][0][0], f.annotations['leftEyeIris'][0][1]);\n ctx.lineTo(leftGaze[0], leftGaze[1]);\n\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 ctx.moveTo(f.annotations['rightEyeIris'][0][0], f.annotations['rightEyeIris'][0][1]);\n ctx.lineTo(rightGaze[0], rightGaze[1]);\n\n ctx.stroke();\n }\n }\n }\n }\n}\n\nexport async function body(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\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 // @ts-ignore box may not exist\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 // @ts-ignore box may not exist\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 // @ts-ignore box may not exist\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) {\n for (let pt = 0; pt < result[i].keypoints.length; pt++) {\n ctx.fillStyle = localOptions.useDepth && result[i].keypoints[pt].position[2] ? `rgba(${127.5 + (2 * (result[i].keypoints[pt].position[2] || 0))}, ${127.5 - (2 * (result[i].keypoints[pt].position[2] || 0))}, 255, 0.5)` : localOptions.color;\n point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions);\n }\n }\n if (localOptions.drawLabels) {\n ctx.font = localOptions.font;\n if (result[i].keypoints) {\n for (const pt of result[i].keypoints) {\n ctx.fillStyle = localOptions.useDepth && pt.position[2] ? `rgba(${127.5 + (2 * pt.position[2])}, ${127.5 - (2 * pt.position[2])}, 255, 0.5)` : localOptions.color;\n ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position[0] + 4, pt.position[1] + 4);\n }\n }\n }\n if (localOptions.drawPolygons && result[i].keypoints) {\n let part;\n const points: [number, number, number?][] = [];\n // shoulder line\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n curves(ctx, points, localOptions);\n // torso main\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'rightShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightHip');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftHip');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n if (points.length === 4) lines(ctx, points, localOptions); // only draw if we have complete torso\n // leg left\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'leftHip');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftKnee');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftAnkle');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftHeel');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftFoot');\n if (part) points.push([part.position[0], part.position[1]]);\n curves(ctx, points, localOptions);\n // leg right\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'rightHip');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightKnee');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightAnkle');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightHeel');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightFoot');\n if (part) points.push([part.position[0], part.position[1]]);\n curves(ctx, points, localOptions);\n // arm left\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftElbow');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftWrist');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftPalm');\n if (part) points.push([part.position[0], part.position[1]]);\n curves(ctx, points, localOptions);\n // arm right\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'rightShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightElbow');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightWrist');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightPalm');\n if (part) points.push([part.position[0], part.position[1]]);\n curves(ctx, points, localOptions);\n // draw all\n }\n }\n}\n\nexport async function hand(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\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', h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText('hand', h.box[0] + 2, 0 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.stroke();\n }\n if (localOptions.drawPoints) {\n if (h.keypoints && h.keypoints.length > 0) {\n for (const pt of h.keypoints) {\n ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * pt[2])}, ${127.5 - (2 * pt[2])}, 255, 0.5)` : localOptions.color;\n point(ctx, pt[0], pt[1], 0, localOptions);\n }\n }\n }\n if (localOptions.drawLabels) {\n const addHandLabel = (part, title) => {\n ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * part[part.length - 1][2])}, ${127.5 - (2 * part[part.length - 1][2])}, 255, 0.5)` : localOptions.color;\n ctx.fillText(title, part[part.length - 1][0] + 4, part[part.length - 1][1] + 4);\n };\n ctx.font = localOptions.font;\n addHandLabel(h.annotations['indexFinger'], 'index');\n addHandLabel(h.annotations['middleFinger'], 'middle');\n addHandLabel(h.annotations['ringFinger'], 'ring');\n addHandLabel(h.annotations['pinky'], 'pinky');\n addHandLabel(h.annotations['thumb'], 'thumb');\n addHandLabel(h.annotations['palmBase'], 'palm');\n }\n if (localOptions.drawPolygons) {\n const addHandLine = (part) => {\n if (!part) return;\n for (let i = 0; i < part.length; i++) {\n ctx.beginPath();\n ctx.strokeStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * part[i][2])}, ${127.5 - (2 * part[i][2])}, 255, 0.5)` : localOptions.color;\n ctx.moveTo(part[i > 0 ? i - 1 : 0][0], part[i > 0 ? i - 1 : 0][1]);\n ctx.lineTo(part[i][0], part[i][1]);\n ctx.stroke();\n }\n };\n ctx.lineWidth = localOptions.lineWidth;\n addHandLine(h.annotations['indexFinger']);\n addHandLine(h.annotations['middleFinger']);\n addHandLine(h.annotations['ringFinger']);\n addHandLine(h.annotations['pinky']);\n addHandLine(h.annotations['thumb']);\n // addPart(h.annotations.palmBase);\n }\n }\n}\n\nexport async function object(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\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 = `${Math.round(100 * h.score)}% ${h.label}`;\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\nexport async function person(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\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\nexport async function canvas(inCanvas: HTMLCanvasElement, outCanvas: HTMLCanvasElement) {\n if (!inCanvas || !outCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement) || !(outCanvas instanceof HTMLCanvasElement)) return;\n const outCtx = inCanvas.getContext('2d');\n outCtx?.drawImage(inCanvas, 0, 0);\n}\n\nexport async function all(inCanvas: HTMLCanvasElement, result: Result, drawOptions?: DrawOptions) {\n const timestamp = now();\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n\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 // person(inCanvas, result.persons, localOptions);\n gesture(inCanvas, result.gesture, localOptions); // gestures do not have buffering\n\n /*\n if (!bufferedResult) bufferedResult = result; // first pass\n else if (localOptions.bufferedOutput) calcBuffered(result); // do results interpolation\n else bufferedResult = result; // or just use results as-is\n const promises: Promise[] = [];\n promises.push(face(inCanvas, bufferedResult.face, localOptions));\n promises.push(body(inCanvas, bufferedResult.body, localOptions));\n promises.push(hand(inCanvas, bufferedResult.hand, localOptions));\n promises.push(object(inCanvas, bufferedResult.object, localOptions));\n // promises.push(person(inCanvas, bufferedResult.persons, localOptions));\n promises.push(gesture(inCanvas, result.gesture, localOptions)); // gestures do not have buffering\n // await Promise.all(promises);\n */\n result.performance.draw = Math.trunc(now() - timestamp);\n}\n", "/**\n * Module that analyzes existing results and recombines them into a unified person object\n */\n\nimport { Face, Body, Hand, Gesture, Person } 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: Person = { 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 beloning to person\n const x: number[] = [];\n const y: number[] = [];\n const extractXY = (box) => { // 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.length === 4) 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 * Module that interpolates results for smoother animations\n */\n\nimport type { Result, Face, Body, Hand, Item, Gesture, Person } from './result';\n\nconst bufferedResult: Result = { face: [], body: [], hand: [], gesture: [], object: [], persons: [], performance: {}, timestamp: 0 };\n\nexport function calc(newResult: Result): Result {\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;\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 Body[])); // 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((b, j) => ((bufferedFactor - 1) * bufferedResult.body[i].box[j] + b) / bufferedFactor) as [number, number, number, number];\n const boxRaw = newResult.body[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.body[i].boxRaw[j] + b) / bufferedFactor) as [number, number, number, number];\n const keypoints = (newResult.body[i].keypoints // update keypoints\n .map((keypoint, j) => ({\n score: keypoint.score,\n part: keypoint.part,\n position: [\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].position[0] + keypoint.position[0]) / bufferedFactor : keypoint.position[0],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].position[1] + keypoint.position[1]) / bufferedFactor : keypoint.position[1],\n ],\n positionRaw: [\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].positionRaw[0] + keypoint.positionRaw[0]) / bufferedFactor : keypoint.position[0],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].positionRaw[1] + keypoint.positionRaw[1]) / bufferedFactor : keypoint.position[1],\n ],\n }))) as Array<{ score: number, part: string, position: [number, number, number?], positionRaw: [number, number, number?] }>;\n bufferedResult.body[i] = { ...newResult.body[i], box, boxRaw, keypoints }; // 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 Hand[])); // 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 [number, number, number, number];\n const boxRaw = (newResult.hand[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].boxRaw[j] + b) / bufferedFactor)) as [number, number, number, number];\n const keypoints = newResult.hand[i].keypoints // update landmarks\n .map((landmark, j) => landmark\n .map((coord, k) => (((bufferedFactor - 1) * bufferedResult.hand[i].keypoints[j][k] + coord) / bufferedFactor)) as [number, number, number]);\n const keys = Object.keys(newResult.hand[i].annotations); // update annotations\n const annotations = {};\n for (const key of keys) {\n annotations[key] = newResult.hand[i].annotations[key]\n .map((val, j) => val.map((coord, k) => ((bufferedFactor - 1) * bufferedResult.hand[i].annotations[key][j][k] + coord) / bufferedFactor));\n }\n bufferedResult.hand[i] = { ...newResult.hand[i], box, boxRaw, keypoints, 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 Face[])); // 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 [number, number, number, number];\n const boxRaw = (newResult.face[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].boxRaw[j] + b) / bufferedFactor)) as [number, number, number, number];\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 }\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 Item[])); // 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 [number, number, number, number];\n const boxRaw = (newResult.object[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].boxRaw[j] + b) / bufferedFactor)) as [number, number, number, number];\n bufferedResult.object[i] = { ...newResult.object[i], box, boxRaw }; // shallow clone plus updated values\n }\n }\n\n // interpolate person results\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 Person[]));\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 [number, number, number, number];\n }\n }\n\n // just copy latest gestures without interpolation\n bufferedResult.gesture = newResult.gesture as Gesture[];\n bufferedResult.performance = newResult.performance;\n\n return bufferedResult;\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 * Human main module\n */\n\nimport { log, now, mergeDeep } from './helpers';\nimport { Config, defaults } from './config';\nimport { Result, Gesture } from './result';\nimport * as sysinfo from './sysinfo';\nimport * as tf from '../dist/tfjs.esm.js';\nimport * as backend from './tfjs/backend';\nimport * as face from './face';\nimport * as facemesh from './blazeface/facemesh';\nimport * as faceres from './faceres/faceres';\nimport * as emotion from './emotion/emotion';\nimport * as posenet from './posenet/posenet';\nimport * as handpose from './handpose/handpose';\nimport * as blazepose from './blazepose/blazepose';\nimport * as efficientpose from './efficientpose/efficientpose';\nimport * as movenet from './movenet/movenet';\nimport * as nanodet from './object/nanodet';\nimport * as centernet from './object/centernet';\nimport * as gesture from './gesture/gesture';\nimport * as image from './image/image';\nimport * as draw from './draw/draw';\nimport * as persons from './persons';\nimport * as interpolate from './interpolate';\nimport * as sample from './sample';\nimport * as app from '../package.json';\nimport { Tensor } from './tfjs/types';\n\n// export types\nexport type { Config } from './config';\nexport type { Result, Face, Hand, Body, Item, Gesture } from './result';\nexport type { DrawOptions } from './draw/draw';\n\n/** Defines all possible input types for **Human** detection\n * @typedef Input\n */\nexport type Input = Tensor | typeof Image | ImageData | ImageBitmap | HTMLImageElement | HTMLMediaElement | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas;\n\n/** Error message\n * @typedef Error\n */\nexport type Error = { error: string };\n\n/** Instance of TensorFlow/JS */\nexport type TensorFlow = typeof tf;\n\n/** Generic Model object type, holds instance of individual models */\ntype Model = unknown;\n\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 */\nexport class Human {\n /** Current version of Human library in *semver* format */\n version: string;\n /** Current configuration\n * - Details: {@link Config}\n */\n config: Config;\n /** Last known result of detect run\n * - Can be accessed anytime after initial detection\n */\n result: Result;\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 /** @internal: Instance of current image being processed */\n image: { tensor: Tensor | null, canvas: OffscreenCanvas | HTMLCanvasElement | null };\n /** @internal: Instance of TensorFlow/JS used by Human\n * - Can be embedded or externally provided\n */\n tf: TensorFlow;\n /** Draw helper classes that can draw detected objects on canvas using specified draw styles\n * - options: global settings for all draw operations, can be overriden for each draw method, for details see {@link DrawOptions}\n * - face: draw detected faces\n * - body: draw detected people and body parts\n * - hand: draw detected hands and hand parts\n * - canvas: draw processed canvas which is a processed copy of the input\n * - all: meta-function that performs: canvas, face, body, hand\n */\n draw: {\n options: draw.DrawOptions,\n gesture: typeof draw.gesture,\n face: typeof draw.face,\n body: typeof draw.body,\n hand: typeof draw.hand,\n canvas: typeof draw.canvas,\n all: typeof draw.all,\n };\n /** @internal: Currently loaded models */\n models: {\n face: [Model, Model, Model] | null,\n posenet: Model | null,\n blazepose: Model | null,\n efficientpose: Model | null,\n movenet: Model | null,\n handpose: [Model, Model] | null,\n age: Model | null,\n gender: Model | null,\n emotion: Model | null,\n embedding: Model | null,\n nanodet: Model | null,\n centernet: Model | null,\n faceres: Model | null,\n };\n /** @internal: Currently loaded classes */\n classes: {\n facemesh: typeof facemesh;\n emotion: typeof emotion;\n body: typeof posenet | typeof blazepose | typeof movenet;\n hand: typeof handpose;\n nanodet: typeof nanodet;\n centernet: typeof centernet;\n faceres: typeof faceres;\n };\n /** Reference face triangualtion array of 468 points, used for triangle references between points */\n faceTriangulation: typeof facemesh.triangulation;\n /** Refernce UV map of 468 values, used for 3D mapping of the face mesh */\n faceUVMap: typeof facemesh.uvmap;\n /** Platform and agent information detected by Human */\n sysinfo: { platform: string, agent: string };\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 #firstRun: boolean;\n #lastInputSum: number;\n #lastCacheDiff: number;\n\n // definition end\n\n /**\n * Creates instance of Human library that is futher used for all operations\n * @param userConfig: {@link Config}\n */\n constructor(userConfig?: Config | Record) {\n this.config = mergeDeep(defaults, userConfig || {});\n this.tf = tf;\n this.draw = draw;\n this.version = app.version;\n this.state = 'idle';\n this.#numTensors = 0;\n this.#analyzeMemoryLeaks = false;\n this.#checkSanity = false;\n this.#firstRun = true;\n this.#lastCacheDiff = 0;\n this.performance = { backend: 0, load: 0, image: 0, frames: 0, cached: 0, changed: 0, total: 0, draw: 0 };\n // object that contains all initialized models\n this.models = {\n face: null,\n posenet: null,\n blazepose: null,\n efficientpose: null,\n movenet: null,\n handpose: null,\n age: null,\n gender: null,\n emotion: null,\n embedding: null,\n nanodet: null,\n centernet: null,\n faceres: null,\n };\n // export access to image processing\n // @ts-ignore eslint-typescript cannot correctly infer type in anonymous function\n this.image = (input: Input) => image.process(input, this.config);\n // export raw access to underlying models\n this.classes = {\n facemesh,\n emotion,\n faceres,\n body: this.config.body.modelPath.includes('posenet') ? posenet : blazepose,\n hand: handpose,\n nanodet,\n centernet,\n };\n this.faceTriangulation = facemesh.triangulation;\n this.faceUVMap = facemesh.uvmap;\n // include platform info\n this.sysinfo = sysinfo.info();\n this.#lastInputSum = 1;\n }\n\n // helper function: measure tensor leak\n /** @hidden */\n analyze = (...msg) => {\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 // quick sanity check on inputs\n /** @hidden */\n #sanity = (input): null | string => {\n if (!this.#checkSanity) return null;\n if (!input) return 'input is not defined';\n if (this.tf.ENV.flags.IS_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 /** Simmilarity method calculates simmilarity between two provided face descriptors (face embeddings)\n * - Calculation is based on normalized Minkowski distance between\n * @param embedding1: face descriptor as array of numbers\n * @param embedding2: face descriptor as array of numbers\n * @returns similarity: number\n */\n // eslint-disable-next-line class-methods-use-this\n similarity(embedding1: Array, embedding2: Array): number {\n return faceres.similarity(embedding1, embedding2);\n }\n\n /** Enhance method performs additional enhacements to face image previously detected for futher processing\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 // @ts-ignore type mismach for Tensor\n return faceres.enhance(input);\n }\n\n /** Math method find best match between provided face descriptor and predefined database of known descriptors\n * @param faceEmbedding: face descriptor previsouly calculated on any face\n * @param db: array of mapping of face descriptors to known values\n * @param threshold: minimum score for matching to be considered in the result\n * @returns best match\n */\n // eslint-disable-next-line class-methods-use-this\n match(faceEmbedding: Array, db: Array<{ name: string, source: string, embedding: number[] }>, threshold = 0): { name: string, source: string, similarity: number, embedding: number[] } {\n return faceres.match(faceEmbedding, db, threshold);\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 * @param userConfig?: {@link Config}\n */\n async load(userConfig?: Config | Record) {\n this.state = 'load';\n const timeStamp = now();\n if (userConfig) this.config = mergeDeep(this.config, userConfig) as Config;\n\n if (this.#firstRun) { // 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_core}`);\n if (this.config.debug) log('platform:', this.sysinfo.platform);\n if (this.config.debug) log('agent:', this.sysinfo.agent);\n\n await this.#checkBackend(true);\n if (this.tf.ENV.flags.IS_BROWSER) {\n if (this.config.debug) log('configuration:', this.config);\n if (this.config.debug) log('tf flags:', this.tf.ENV.flags);\n }\n }\n if (this.config.async) { // load models concurrently\n [\n this.models.face,\n this.models.emotion,\n this.models.handpose,\n this.models.posenet,\n this.models.blazepose,\n this.models.efficientpose,\n this.models.movenet,\n this.models.nanodet,\n this.models.centernet,\n this.models.faceres,\n ] = await Promise.all([\n this.models.face || (this.config.face.enabled ? facemesh.load(this.config) : null),\n this.models.emotion || ((this.config.face.enabled && this.config.face.emotion.enabled) ? emotion.load(this.config) : null),\n this.models.handpose || (this.config.hand.enabled ? handpose.load(this.config) : null),\n this.models.posenet || (this.config.body.enabled && this.config.body.modelPath.includes('posenet') ? posenet.load(this.config) : null),\n this.models.blazepose || (this.config.body.enabled && this.config.body.modelPath.includes('blazepose') ? blazepose.load(this.config) : null),\n this.models.efficientpose || (this.config.body.enabled && this.config.body.modelPath.includes('efficientpose') ? efficientpose.load(this.config) : null),\n this.models.movenet || (this.config.body.enabled && this.config.body.modelPath.includes('movenet') ? movenet.load(this.config) : null),\n this.models.nanodet || (this.config.object.enabled && this.config.object.modelPath.includes('nanodet') ? nanodet.load(this.config) : null),\n this.models.centernet || (this.config.object.enabled && this.config.object.modelPath.includes('centernet') ? centernet.load(this.config) : null),\n this.models.faceres || ((this.config.face.enabled && this.config.face.description.enabled) ? faceres.load(this.config) : null),\n ]);\n } else { // load models sequentially\n if (this.config.face.enabled && !this.models.face) this.models.face = await facemesh.load(this.config);\n if (this.config.face.enabled && this.config.face.emotion.enabled && !this.models.emotion) this.models.emotion = await emotion.load(this.config);\n if (this.config.hand.enabled && !this.models.handpose) this.models.handpose = await handpose.load(this.config);\n if (this.config.body.enabled && !this.models.posenet && this.config.body.modelPath.includes('posenet')) this.models.posenet = await posenet.load(this.config);\n if (this.config.body.enabled && !this.models.blazepose && this.config.body.modelPath.includes('blazepose')) this.models.blazepose = await blazepose.load(this.config);\n if (this.config.body.enabled && !this.models.efficientpose && this.config.body.modelPath.includes('efficientpose')) this.models.efficientpose = await blazepose.load(this.config);\n if (this.config.body.enabled && !this.models.movenet && this.config.body.modelPath.includes('movenet')) this.models.movenet = await movenet.load(this.config);\n if (this.config.object.enabled && !this.models.nanodet && this.config.object.modelPath.includes('nanodet')) this.models.nanodet = await nanodet.load(this.config);\n if (this.config.object.enabled && !this.models.centernet && this.config.object.modelPath.includes('centernet')) this.models.centernet = await centernet.load(this.config);\n if (this.config.face.enabled && this.config.face.description.enabled && !this.models.faceres) this.models.faceres = await faceres.load(this.config);\n }\n\n if (this.#firstRun) { // print memory stats on first run\n if (this.config.debug) log('tf engine state:', this.tf.engine().state.numBytes, 'bytes', this.tf.engine().state.numTensors, 'tensors');\n this.#firstRun = false;\n }\n\n const current = Math.trunc(now() - timeStamp);\n if (current > (this.performance.load as number || 0)) this.performance.load = current;\n }\n\n // check if backend needs initialization if it changed\n /** @hidden */\n #checkBackend = async (force = false) => {\n if (this.config.backend && (this.config.backend.length > 0) && force || (this.tf.getBackend() !== this.config.backend)) {\n const timeStamp = now();\n this.state = 'backend';\n /* force backend reload\n if (this.config.backend in tf.engine().registry) {\n const backendFactory = tf.findBackendFactory(this.config.backend);\n tf.removeBackend(this.config.backend);\n tf.registerBackend(this.config.backend, backendFactory);\n } else {\n log('Backend not registred:', this.config.backend);\n }\n */\n\n if (this.config.backend && this.config.backend.length > 0) {\n // @ts-ignore ignore missing type for WorkerGlobalScope as that is the point\n if (typeof window === 'undefined' && typeof WorkerGlobalScope !== 'undefined' && this.config.debug) log('running inside web worker');\n\n // force browser vs node backend\n if (this.tf.ENV.flags.IS_BROWSER && this.config.backend === 'tensorflow') this.config.backend = 'webgl';\n if (this.tf.ENV.flags.IS_NODE && (this.config.backend === 'webgl' || this.config.backend === 'humangl')) this.config.backend = 'tensorflow';\n\n if (this.config.debug) log('setting backend:', this.config.backend);\n\n if (this.config.backend === 'wasm') {\n if (this.config.debug) log('wasm path:', this.config.wasmPath);\n if (typeof this.tf?.setWasmPaths !== 'undefined') this.tf.setWasmPaths(this.config.wasmPath);\n else throw new Error('Human: WASM backend is not loaded');\n const simd = await this.tf.env().getAsync('WASM_HAS_SIMD_SUPPORT');\n const mt = await this.tf.env().getAsync('WASM_HAS_MULTITHREAD_SUPPORT');\n if (this.config.debug) log(`wasm execution: ${simd ? 'SIMD' : 'no SIMD'} ${mt ? 'multithreaded' : 'singlethreaded'}`);\n if (this.config.debug && !simd) log('warning: wasm simd support is not enabled');\n }\n\n if (this.config.backend === 'humangl') backend.register();\n try {\n await this.tf.setBackend(this.config.backend);\n } catch (err) {\n log('error: cannot set backend:', this.config.backend, err);\n }\n }\n this.tf.enableProdMode();\n // this.tf.enableDebugMode();\n if (this.tf.getBackend() === 'webgl' || this.tf.getBackend() === 'humangl') {\n this.tf.ENV.set('CHECK_COMPUTATION_FOR_ERRORS', false);\n this.tf.ENV.set('WEBGL_CPU_FORWARD', true);\n this.tf.ENV.set('WEBGL_PACK_DEPTHWISECONV', true);\n if (!this.config.object.enabled) this.tf.ENV.set('WEBGL_FORCE_F16_TEXTURES', true); // safe to use 16bit precision\n if (typeof this.config['deallocate'] !== 'undefined' && this.config['deallocate']) { // hidden param\n log('changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:', true);\n this.tf.ENV.set('WEBGL_DELETE_TEXTURE_THRESHOLD', 0);\n }\n const gl = await this.tf.backend().getGPGPUContext().gl;\n if (this.config.debug) log(`gl version:${gl.getParameter(gl.VERSION)} renderer:${gl.getParameter(gl.RENDERER)}`);\n }\n await this.tf.ready();\n this.performance.backend = Math.trunc(now() - timeStamp);\n }\n }\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 * @param result?: use specific result set to run interpolation on\n * @returns result: {@link Result}\n */\n next = (result?: Result) => interpolate.calc(result || this.result) as Result;\n\n // check if input changed sufficiently to trigger new detections\n /** @hidden */\n #skipFrame = async (input) => {\n if (this.config.cacheSensitivity === 0) return false;\n const resizeFact = 32;\n const reduced: Tensor = input.resizeBilinear([Math.trunc(input.shape[1] / resizeFact), Math.trunc(input.shape[2] / resizeFact)]);\n // use tensor sum\n /*\n const sumT = this.tf.sum(reduced);\n const sum = sumT.dataSync()[0] as number;\n sumT.dispose();\n */\n // use js loop sum, faster than uploading tensor to gpu calculating and downloading back\n const reducedData = reduced.dataSync(); // raw image rgb array\n let sum = 0;\n for (let i = 0; i < reducedData.length / 3; i++) sum += reducedData[3 * i + 2]; // look only at green value of each pixel\n\n reduced.dispose();\n const diff = 100 * (Math.max(sum, this.#lastInputSum) / Math.min(sum, this.#lastInputSum) - 1);\n this.#lastInputSum = sum;\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 const skipFrame = diff < Math.max(this.config.cacheSensitivity, this.#lastCacheDiff);\n // if difference is above 10x threshold, don't use last value to force reset cache for significant change of scenes or images\n this.#lastCacheDiff = diff > 10 * this.config.cacheSensitivity ? 0 : diff;\n return skipFrame;\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 * @param input: Input\n * @param userConfig?: Config\n * @returns result: Result\n */\n async detect(input: Input, userConfig?: Config | Record): Promise {\n // detection happens inside a promise\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 resolve({ error });\n }\n\n const timeStart = now();\n\n // configure backend\n await this.#checkBackend();\n\n // load models if enabled\n await this.load();\n\n /*\n // function disabled in favor of inputChanged\n // disable video optimization for inputs of type image, but skip if inside worker thread\n let previousVideoOptimized;\n // @ts-ignore ignore missing type for WorkerGlobalScope as that is the point\n if (input && this.config.videoOptimized && (typeof window !== 'undefined') && (typeof WorkerGlobalScope !== 'undefined') && (\n (typeof HTMLImageElement !== 'undefined' && input instanceof HTMLImageElement)\n || (typeof Image !== 'undefined' && input instanceof Image)\n || (typeof ImageData !== 'undefined' && input instanceof ImageData)\n || (typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap))\n ) {\n log('disabling video optimization');\n previousVideoOptimized = this.config.videoOptimized;\n this.config.videoOptimized = false;\n }\n */\n\n timeStamp = now();\n const process = image.process(input, this.config);\n if (!process || !process.tensor) {\n log('could not convert input to tensor');\n resolve({ error: 'could not convert input to tensor' });\n return;\n }\n this.performance.image = Math.trunc(now() - timeStamp);\n this.analyze('Get Image:');\n\n timeStamp = now();\n this.config.skipFrame = await this.#skipFrame(process.tensor);\n if (!this.performance.frames) this.performance.frames = 0;\n if (!this.performance.cached) this.performance.cached = 0;\n (this.performance.frames as number)++;\n if (this.config.skipFrame) this.performance.cached++;\n this.performance.changed = 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;\n let bodyRes;\n let handRes;\n let objectRes;\n let elapsedTime;\n\n // run face detection followed by all models that rely on face bounding box: face mesh, age, gender, emotion\n if (this.config.async) {\n faceRes = this.config.face.enabled ? face.detectFace(this, process.tensor) : [];\n if (this.performance.face) delete this.performance.face;\n } else {\n this.state = 'run:face';\n timeStamp = now();\n faceRes = this.config.face.enabled ? await face.detectFace(this, process.tensor) : [];\n elapsedTime = Math.trunc(now() - timeStamp);\n if (elapsedTime > 0) this.performance.face = elapsedTime;\n }\n\n // run body: can be posenet, blazepose, efficientpose, movenet\n this.analyze('Start Body:');\n if (this.config.async) {\n if (this.config.body.modelPath.includes('posenet')) bodyRes = this.config.body.enabled ? posenet.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('blazepose')) bodyRes = this.config.body.enabled ? blazepose.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('efficientpose')) bodyRes = this.config.body.enabled ? efficientpose.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('movenet')) bodyRes = this.config.body.enabled ? movenet.predict(process.tensor, this.config) : [];\n if (this.performance.body) delete this.performance.body;\n } else {\n this.state = 'run:body';\n timeStamp = now();\n if (this.config.body.modelPath.includes('posenet')) bodyRes = this.config.body.enabled ? await posenet.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('blazepose')) bodyRes = this.config.body.enabled ? await blazepose.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('efficientpose')) bodyRes = this.config.body.enabled ? await efficientpose.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('movenet')) bodyRes = this.config.body.enabled ? await movenet.predict(process.tensor, this.config) : [];\n elapsedTime = Math.trunc(now() - timeStamp);\n if (elapsedTime > 0) this.performance.body = elapsedTime;\n }\n this.analyze('End Body:');\n\n // run handpose\n this.analyze('Start Hand:');\n if (this.config.async) {\n handRes = this.config.hand.enabled ? handpose.predict(process.tensor, this.config) : [];\n if (this.performance.hand) delete this.performance.hand;\n } else {\n this.state = 'run:hand';\n timeStamp = now();\n handRes = this.config.hand.enabled ? await handpose.predict(process.tensor, this.config) : [];\n elapsedTime = Math.trunc(now() - timeStamp);\n if (elapsedTime > 0) this.performance.hand = elapsedTime;\n }\n this.analyze('End Hand:');\n\n // run nanodet\n this.analyze('Start Object:');\n if (this.config.async) {\n if (this.config.object.modelPath.includes('nanodet')) objectRes = this.config.object.enabled ? nanodet.predict(process.tensor, this.config) : [];\n else if (this.config.object.modelPath.includes('centernet')) objectRes = this.config.object.enabled ? centernet.predict(process.tensor, this.config) : [];\n if (this.performance.object) delete this.performance.object;\n } else {\n this.state = 'run:object';\n timeStamp = now();\n if (this.config.object.modelPath.includes('nanodet')) objectRes = this.config.object.enabled ? await nanodet.predict(process.tensor, this.config) : [];\n else if (this.config.object.modelPath.includes('centernet')) objectRes = this.config.object.enabled ? await centernet.predict(process.tensor, this.config) : [];\n elapsedTime = Math.trunc(now() - timeStamp);\n if (elapsedTime > 0) this.performance.object = elapsedTime;\n }\n this.analyze('End Object:');\n\n // if async wait for results\n if (this.config.async) [faceRes, bodyRes, handRes, objectRes] = await Promise.all([faceRes, bodyRes, handRes, objectRes]);\n\n // run gesture analysis last\n let gestureRes: Gesture[] = [];\n if (this.config.gesture.enabled) {\n timeStamp = now();\n gestureRes = [...gesture.face(faceRes), ...gesture.body(bodyRes), ...gesture.hand(handRes), ...gesture.iris(faceRes)];\n if (!this.config.async) this.performance.gesture = Math.trunc(now() - timeStamp);\n else if (this.performance.gesture) delete this.performance.gesture;\n }\n\n this.performance.total = Math.trunc(now() - timeStart);\n this.state = 'idle';\n this.result = {\n face: faceRes,\n body: bodyRes,\n hand: handRes,\n gesture: gestureRes,\n object: objectRes,\n performance: this.performance,\n canvas: process.canvas,\n timestamp: Date.now(),\n get persons() { return persons.join(faceRes, bodyRes, handRes, gestureRes, process?.tensor?.shape); },\n };\n\n // finally dispose input tensor\n tf.dispose(process.tensor);\n\n // log('Result:', result);\n resolve(this.result);\n });\n }\n\n /** @hidden */\n #warmupBitmap = async () => {\n const b64toBlob = (base64, type = 'application/octet-stream') => fetch(`data:${type};base64,${base64}`).then((res) => res.blob());\n let blob;\n let res;\n switch (this.config.warmup) {\n case 'face': blob = await b64toBlob(sample.face); break;\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 this.detect(bitmap, this.config);\n bitmap.close();\n }\n return res;\n }\n\n /** @hidden */\n #warmupCanvas = async () => new Promise((resolve) => {\n let src;\n let size = 0;\n switch (this.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 const img = new Image();\n img.onload = async () => {\n const canvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(size, size) : document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n ctx?.drawImage(img, 0, 0);\n // const data = ctx?.getImageData(0, 0, canvas.height, canvas.width);\n const res = await this.detect(canvas, this.config);\n resolve(res);\n };\n if (src) img.src = src;\n else resolve(null);\n });\n\n /** @hidden */\n #warmupNode = async () => {\n const atob = (str) => Buffer.from(str, 'base64');\n let img;\n if (this.config.warmup === 'face') img = atob(sample.face);\n if (this.config.warmup === 'body' || this.config.warmup === 'full') img = atob(sample.body);\n if (!img) return null;\n let res;\n if (typeof tf['node'] !== 'undefined') {\n const data = tf['node'].decodeJpeg(img);\n const expanded = data.expandDims(0);\n this.tf.dispose(data);\n // log('Input:', expanded);\n res = await this.detect(expanded, this.config);\n this.tf.dispose(expanded);\n } else {\n if (this.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 this.detect(input, this.config);\n */\n }\n return res;\n }\n\n /** Warmup metho pre-initializes all models for faster inference\n * - can take significant time on startup\n * - only used for `webgl` and `humangl` backends\n * @param userConfig?: Config\n */\n async warmup(userConfig?: Config | Record): Promise {\n const t0 = now();\n if (userConfig) this.config = mergeDeep(this.config, userConfig) as Config;\n if (!this.config.warmup || this.config.warmup === 'none') return { error: 'null' };\n let res;\n if (typeof createImageBitmap === 'function') res = await this.#warmupBitmap();\n else if (typeof Image !== 'undefined') res = await this.#warmupCanvas();\n else res = await this.#warmupNode();\n const t1 = now();\n if (this.config.debug) log('Warmup', this.config.warmup, Math.round(t1 - t0), 'ms', res);\n return res;\n }\n}\n\n/**\n * Class Human is also available as default export\n */\nexport { Human as default };\n"], + "mappings": "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AAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,kBAAkB;AAAA,EACnB,CAAC,gBAAgB;AAAA,EACjB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA;AAGf,IAAM,SAAS;AAAA,EACpB;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAG;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EACtJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAClJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EACrJ;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAC7I;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAClJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EACrJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EACpJ;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACnJ;AAAA,EAAK;AAAA,EAAI;AAAA,EAAG;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACnJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAG;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAC9I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EACtJ;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAClJ;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAG;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACnJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACrJ;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACpJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAClJ;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACnJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACnJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EACnJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAChJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAChJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC7I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAClJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC7I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EACnJ;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACpJ;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAClJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAClJ;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAChJ;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EACpJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EACrJ;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACpJ;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAC9I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EACpJ;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACrJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EACpJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EACpJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAC9I;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAI;AAAA,EAClJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAC9I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAChJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAChJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC9I;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAChJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAClJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACpJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA;AAwBvI,IAAM,QAAQ;AAAA,EACP;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/E;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC1C;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAG;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAChC;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACtD;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAChD;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA;AAGtC,IAAM,QAAQ,CAAC,IAAI,KAAK,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK;AAEhK,IAAM,OAAO,CAAC,IAAI,KAAK,KAAK,KAAK,GAAG,IAAI;AAExC,IAAM,OAAO,MAAM,IAAI,CAAC,MAAM,MAAM;AAEpC,IAAM,OAAO,MAAM,IAAI,CAAC,MAAM,MAAM;AAEpC,IAAM,MAAM,KAAK,IAAI,CAAC,MAAM,MAAM;;;AChoBzC,IAAM,cAAc,AAAO,iBAAiB;AAC5C,IAAM,eAAe,AAAO,iBAAiB;AAE7C,IAAM,eAAe;AAAA,EACnB,YAAY,CAAC,YAAY,IAAI,YAAY,YAAY,SAAS;AAAA,EAC9D,aAAa,CAAC,aAAa,IAAI,aAAa,aAAa,SAAS;AAAA;AAGpE,IAAM,gBAAgB;AAAA,EACpB,OAAO;AAAA,EACP,OAAO;AAAA,EACP,cAAc,CAAC,IAAI,AAAO,iBAAiB,qBAAqB;AAAA;AAGlE,IAAM,qBAAqB;AAAA,EACzB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,cAAc,CAAC,GAAG;AAAA;AAGpB,IAAM,gBAAgB;AAAA,EACpB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,OAAO;AAAA,EACP,gBAAgB;AAAA;AAKlB,+BAA+B,WAAW,WAAW,QAAQ,MAAM;AACjE,WAAS,IAAI,GAAG,IAAI,AAAO,yBAAyB,QAAQ,KAAK;AAC/D,UAAM,EAAE,KAAK,YAAY,AAAO,yBAAyB;AACzD,UAAM,kBAAkB,AAAO,iBAAiB,GAAG,SAAS;AAC5D,QAAI,CAAC,QAAQ,KAAK,SAAS,MAAM;AAC/B,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,cAAM,QAAQ,QAAQ;AACtB,kBAAU,gBAAgB,MAAM;AAAA,UAC9B,UAAU,OAAO;AAAA,UAAI,UAAU,OAAO;AAAA,UACrC,WAAU,OAAO,KAAK,UAAU,gBAAgB,IAAI,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAO9D,qBAAe;AAAA,EAYpB,YAAY,qBAAqB,cAAc,WAAW;AApE5D;AAsEI,SAAK,cAAc;AACnB,SAAK,sBAAsB;AAC3B,SAAK,eAAe;AACpB,SAAK,YAAY;AACjB,SAAK,UAAU,kEAAqB,UAArB,mBAA4B,OAAO,GAAG,MAAM,OAAM;AACjE,SAAK,WAAW,8CAAc,OAAO,GAAG,MAAM,OAAM,kEAAqB,UAArB,mBAA4B,OAAO,GAAG,MAAM;AAChG,SAAK,WAAW,wCAAW,OAAO,GAAG,MAAM,OAAM;AACjD,SAAK,cAAc;AACnB,SAAK,UAAU;AACf,SAAK,gBAAgB;AAAA;AAAA,EAGvB,mBAAmB,WAAW,MAAK,OAAO,gBAAgB;AACxD,UAAM,UAAU,AAAS,WAAW,EAAE,YAAY,KAAI,YAAY,UAAU,KAAI;AAChF,UAAM,eAAe,UAAU,IAAI,CAAC,UAAW;AAAA,MAC7C,QAAQ,KAAK,KAAK,WAAY,OAAM,KAAK,KAAK,WAAW;AAAA,MACzD,QAAQ,KAAK,KAAK,WAAY,OAAM,KAAK,KAAK,WAAW;AAAA,MACzD,MAAM;AAAA;AAER,UAAM,uBAAwB,UAAU,IAAK,AAAK,oBAAoB,OAAO,CAAC,GAAG,MAAW;AAC5F,UAAM,gBAAiB,UAAU,IAAK,aAAa,IAAI,CAAC,UAAW,CAAC,GAAG,AAAK,YAAY,OAAO,uBAAuB,MAAM,OAAQ;AACpI,UAAM,wBAAyB,UAAU,IAAK,AAAK,sBAAsB,kBAAuB;AAChG,UAAM,YAAY,CAAC,GAAG,AAAS,aAAa,EAAE,YAAY,KAAI,YAAY,UAAU,KAAI,aAAa;AACrG,WAAO,cAAc,IAAI,CAAC,UAAW;AAAA,MACnC,KAAK,MAAM,MAAM,KAAK,AAAK,IAAI,WAAW,sBAAsB;AAAA,MAChE,KAAK,MAAM,MAAM,KAAK,AAAK,IAAI,WAAW,sBAAsB;AAAA,MAChE,KAAK,MAAM,MAAM;AAAA;AAAA;AAAA,EAKrB,iCAAiC,WAAW;AAC1C,UAAM,WAAW,UAAU,aAAa,WAAW,IAAI;AACvD,UAAM,YAAY,UAAU,aAAa,YAAY,IAAI;AACzD,WAAO,WAAW;AAAA;AAAA,EAIpB,UAAU,WAAW,OAAM,qBAAqB,qBAAqB,OAAO,OAAO;AACjF,UAAM,OAAM,AAAS,YAAY,AAAS,WAAW,AAAS,8BAA8B,CAAC,UAAU,sBAAsB,UAAU,wBAAwB,KAAK;AACpK,UAAM,UAAU,AAAS,WAAW;AACpC,QAAI,OAAO,AAAG,uBAAM,cAAc,OAAM,CAAC;AAAA,MACvC,KAAI,WAAW,KAAK,KAAK;AAAA,MACzB,KAAI,WAAW,KAAK,KAAK;AAAA,MAAU,KAAI,SAAS,KAAK,KAAK;AAAA,MAC1D,KAAI,SAAS,KAAK,KAAK;AAAA,QACrB,CAAC,IAAI,CAAC,KAAK,UAAU,KAAK;AAC9B,QAAI,QAAQ,AAAG,qBAAI,MAAM,YAAY;AACnC,aAAO,AAAG,uBAAM,cAAc;AAAA;AAEhC,WAAO,EAAE,WAAK,SAAS;AAAA;AAAA,EAIzB,aAAa,SAAS,QAAQ,YAAY,OAAO,OAAO;AACtD,UAAM,eAAgD;AACtD,aAAS,IAAI,GAAG,IAAI,cAAc,gBAAgB,KAAK;AACrD,YAAM,IAAI,QAAQ,IAAI;AACtB,YAAM,IAAI,QAAQ,IAAI,IAAI;AAC1B,YAAM,IAAI,QAAQ,IAAI,IAAI;AAC1B,mBAAa,KAAK;AAAA,QACf,QAAQ,IAAK,IAAI,KAAK,WAAc,IAAI,KAAK,YAAa,WAAW,KAAK,OAAO,WAAW;AAAA,QAC5F,IAAI,KAAK,WAAY,WAAW,KAAK,OAAO,WAAW;AAAA,QAAI;AAAA;AAAA;AAGhE,WAAO,EAAE,WAAW,cAAc,MAAM,aAAa,MAAM,cAAc;AAAA;AAAA,EAK3E,sBAAsB,WAAW,YAAY,WAAW;AACtD,UAAM,eAAe,UAAU,AAAO,iBAAiB,GAAG,sBAAsB,cAAc,cAAc;AAC5G,UAAM,eAAe,UAAU,AAAO,iBAAiB,GAAG,sBAAsB,cAAc,cAAc;AAC5G,UAAM,WAAY,gBAAe,gBAAgB;AAEjD,WAAO,WAAW,IAAI,CAAC,OAAO,MAAM;AAClC,UAAI,IAAI;AACR,UAAI,MAAM,GAAG;AACX,YAAI;AAAA,iBACK,MAAM,GAAG;AAClB,YAAI;AAAA;AAEN,aAAO,CAAC,MAAM,IAAI,MAAM,IAAI;AAAA;AAAA;AAAA,QAI1B,QAAQ,OAAO,SAAQ;AAC3B,QAAI,cAAc;AAElB,QAAI;AACJ,QAAK,KAAK,YAAY,KAAO,KAAK,UAAU,QAAO,KAAK,SAAS,cAAe,CAAC,QAAO,KAAK,KAAK,WAAW,CAAC,QAAO,WAAW;AAC9H,iBAAW,MAAM,KAAK,oBAAoB,iBAAiB;AAC3D,WAAK,UAAU;AAAA;AAEjB,QAAI,QAAO;AAAW,WAAK;AAG3B,QAAI,CAAC,QAAO,aAAc,YAAY,SAAS,SAAU,EAAC,QAAO,KAAK,KAAK,WAAY,SAAS,MAAM,WAAW,KAAK,iBAAmB,KAAK,kBAAkB,QAAO,KAAK,SAAS,cAAgB;AACnM,WAAK,cAAc;AACnB,WAAK,gBAAgB;AACrB,iBAAW,YAAY,SAAS,OAAO;AACrC,aAAK,YAAY,KAAK,EAAE,YAAY,SAAS,IAAI,WAAW,YAAY,UAAU,SAAS,IAAI,SAAS,YAAY,WAAW,SAAS,UAAU,aAAa,YAAY,SAAS;AAAA;AAEtL,UAAI,KAAK,YAAY,SAAS;AAAG,sBAAc;AAAA;AAGjD,QAAI,aAAa;AACf,UAAI,CAAC,YAAY,CAAC,SAAS,SAAU,SAAS,MAAM,WAAW,GAAI;AACjE,aAAK,cAAc;AACnB,aAAK,gBAAgB;AACrB,eAAO;AAAA;AAET,eAAS,IAAI,GAAG,IAAI,KAAK,YAAY,QAAQ,KAAK;AAChD,cAAM,YAAY,AAAS,oBAAoB,EAAE,YAAY,KAAK,YAAY,GAAG,YAAY,UAAU,KAAK,YAAY,GAAG,YAAY,SAAS;AAChJ,cAAM,cAAc,AAAS,WAAW;AACxC,cAAM,gBAAgB,AAAS,YAAY;AAC3C,cAAM,YAAY,KAAK,YAAY,GAAG;AACtC,cAAM,aAAa,KAAK,YAAY,GAAG;AACvC,aAAK,YAAY,KAAK,KAAK,eAAe,YAAY;AAAA;AAAA;AAG1D,QAAI,YAAY,SAAS,OAAO;AAC9B,eAAS,MAAM,QAAQ,CAAC,eAAe;AACrC,mBAAW,IAAI,WAAW;AAC1B,mBAAW,IAAI,SAAS;AACxB,mBAAW,UAAU;AAAA;AAAA;AAGzB,UAAM,UAAU,AAAG,sBAAK,MAAM,KAAK,YAAY,IAAI,CAAC,MAAK,MAAM;AAE7D,UAAI;AACJ,UAAI,QAAQ;AACZ,UAAI;AAEJ,UAAI,QAAO,KAAK,SAAS,YAAY,QAAO,KAAK,KAAK,WAAW,AAAG,qBAAI,MAAM,YAAY;AACxF,cAAM,CAAC,cAAc,mBAAoB,KAAI,UAAU,UAAU,cAAc,QAAS,cAAc,eAAe,mBAAmB;AACxI,gBAAQ,AAAK,gBAAgB,KAAI,UAAU,eAAe,KAAI,UAAU;AACxE,cAAM,aAAa,AAAS,aAAa,EAAE,YAAY,KAAI,YAAY,UAAU,KAAI;AACrF,cAAM,uBAAuB,CAAC,WAAW,KAAK,MAAM,MAAM,IAAI,WAAW,KAAK,MAAM,MAAM;AAC1F,cAAM,eAAe,AAAG,uBAAM,iBAAiB,OAAO,OAAO,GAAG;AAChE,yBAAiB,AAAK,oBAAoB,CAAC,OAAO;AAClD,YAAI,QAAO,KAAK,KAAK;AAAS,kBAAO,AAAS,yBAAyB,EAAE,YAAY,KAAI,YAAY,UAAU,KAAI,YAAY,cAAc,CAAC,KAAK,UAAU,KAAK,WAAW,IAAI;AAAA;AAC5K,kBAAO,AAAS,yBAAyB,EAAE,YAAY,KAAI,YAAY,UAAU,KAAI,YAAY,cAAc,CAAC,KAAK,SAAS,KAAK,UAAU,IAAI;AAAA,aACjJ;AACL,yBAAsB;AACtB,cAAM,cAAc,MAAM;AAC1B,YAAI,QAAO,KAAK,KAAK;AAAS,kBAAO,AAAS,yBAAyB,EAAE,YAAY,KAAI,YAAY,UAAU,KAAI,YAAY,aAAa,CAAC,KAAK,UAAU,KAAK,WAAW,IAAI;AAAA;AAC3K,kBAAO,AAAS,yBAAyB,EAAE,YAAY,KAAI,YAAY,UAAU,KAAI,YAAY,aAAa,CAAC,KAAK,SAAS,KAAK,UAAU,IAAI;AAAA;AAIvJ,UAAI,CAAC,QAAO,KAAK,KAAK,SAAS;AAC7B,cAAM,cAAa;AAAA,UACjB,MAAM;AAAA,UACN;AAAA,UACA,gBAAgB;AAAA,UAChB,eAAe,KAAI;AAAA,UACnB,YAAY,KAAI;AAAA,UAChB,OAAO;AAAA;AAET,eAAO;AAAA;AAGT,YAAM,CAAC,EAAE,YAAY,iBAAiB,KAAK,aAAa,QAAQ;AAChE,YAAM,iBAAiB,WAAW,WAAW;AAC7C,UAAI,iBAAiB,QAAO,KAAK,SAAS,eAAe;AACvD,aAAK,YAAY,GAAG,aAAa;AACjC,eAAO;AAAA;AAET,YAAM,iBAAiB,AAAG,yBAAQ,eAAe,CAAC,IAAI;AACtD,UAAI,YAAY,eAAe;AAE/B,UAAI,QAAO,KAAK,KAAK,SAAS;AAC5B,cAAM,EAAE,KAAK,YAAY,SAAS,gBAAgB,MAAM,gBAAgB,KAAK,UAAU,WAAW,OAAM,aAAa,WAAW,IAAI,aAAa,WAAW,IAAI;AAChK,cAAM,EAAE,KAAK,aAAa,SAAS,iBAAiB,MAAM,iBAAiB,KAAK,UAAU,WAAW,OAAM,aAAa,YAAY,IAAI,aAAa,YAAY;AACjK,cAAM,iBAAiB,KAAK,UAAU,QAAQ,AAAG,wBAAO,CAAC,aAAa;AACtE,cAAM,qBAAqB,eAAe;AAC1C,cAAM,cAAc,mBAAmB,MAAM,GAAG,cAAc,iBAAiB;AAC/E,cAAM,EAAE,WAAW,kBAAkB,MAAM,sBAAsB,KAAK,aAAa,aAAa,YAAY,gBAAgB;AAC5H,cAAM,eAAe,mBAAmB,MAAM,cAAc,iBAAiB;AAC7E,cAAM,EAAE,WAAW,mBAAmB,MAAM,uBAAuB,KAAK,aAAa,cAAc,aAAa;AAChH,cAAM,gCAAgC,KAAK,iCAAiC;AAC5E,YAAI,KAAK,IAAI,iCAAiC,IAAI;AAChD,gCAAsB,WAAW,kBAAkB,QAAQ;AAC3D,gCAAsB,WAAW,mBAAmB,SAAS;AAAA,mBAGpD,gCAAgC,GAAG;AAC5C,gCAAsB,WAAW,kBAAkB,QAAQ,CAAC,aAAa;AAAA,eACpE;AACL,gCAAsB,WAAW,mBAAmB,SAAS,CAAC,aAAa;AAAA;AAE7E,cAAM,yBAAyB,KAAK,sBAAsB,WAAW,mBAAmB;AACxF,cAAM,0BAA0B,KAAK,sBAAsB,WAAW,oBAAoB;AAC1F,oBAAY,UAAU,OAAO,wBAAwB,OAAO;AAAA;AAI9D,YAAM,OAAO,KAAK,mBAAmB,WAAW,MAAK,OAAO;AAC5D,YAAM,kBAAkB,KAAI;AAE5B,aAAM,AAAS,WAAW,AAAS,8BAA8B,OAAO;AACxE,WAAI,aAAa;AAGjB,UAAI,QAAO,KAAK,SAAS,YAAY,QAAO,KAAK,KAAK,WAAW,QAAO,KAAK,YAAY,WAAW,AAAG,qBAAI,MAAM,YAAY;AAC3H,cAAM,CAAC,cAAc,mBAAoB,KAAI,UAAU,UAAU,cAAc,QAAS,cAAc,eAAe,mBAAmB;AACxI,gBAAQ,AAAK,gBAAgB,KAAI,UAAU,eAAe,KAAI,UAAU;AACxE,cAAM,aAAa,AAAS,aAAa,EAAE,YAAY,KAAI,YAAY,UAAU,KAAI;AACrF,cAAM,uBAAuB,CAAC,WAAW,KAAK,MAAM,MAAM,IAAI,WAAW,KAAK,MAAM,MAAM;AAC1F,cAAM,eAAe,AAAG,uBAAM,iBAAiB,MAAM,WAAW,OAAO,GAAG;AAC1E,yBAAiB,AAAK,oBAAoB,CAAC,OAAO;AAClD,gBAAO,AAAS,yBAAyB,EAAE,YAAY,KAAI,YAAY,UAAU,KAAI,YAAY,cAAc,CAAC,KAAK,UAAU,KAAK,WAAW,IAAI;AAAA;AAGrJ,YAAM,aAAa;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA,eAAe,KAAI;AAAA,QACnB,OAAO;AAAA;AAIT,WAAK,YAAY,KAAK,KAAK,AAAS,YAAY,OAAM,YAAY,KAAI,YAAY;AAElF,aAAO;AAAA;AAKT,QAAI,QAAO,KAAK,KAAK;AAAS,WAAK,cAAc,KAAK,YAAY,OAAO,CAAC,MAAM,EAAE,aAAa,QAAO,KAAK,SAAS;AACpH,SAAK,gBAAgB,QAAQ;AAE7B,WAAO;AAAA;AAAA;;;ALlSX,IAAI,aAAsF,CAAC,MAAM,MAAM;AACvG,IAAI;AAEJ,uBAA8B,OAAe,SAAiC;AAC5E,QAAM,cAAc,MAAM,aAAa,QAAQ,OAAO;AACtD,QAAM,UAAuB;AAC7B,MAAI,KAAK;AACT,aAAW,cAAe,eAAe,IAAK;AAC5C,QAAI,CAAC,cAAc,WAAW;AAAoB;AAClD,UAAM,UAAU,WAAW,KAAK,IAAI,CAAC,OAAO;AAAA,MAC1C,GAAG,KAAM,OAAM,MAAM,MAAM;AAAA,MAC3B,GAAG,KAAM,OAAM,MAAM,MAAM;AAAA,MAC3B,GAAG,KAAK,aAAa;AAAA;AAEvB,UAAM,eAAc;AACpB,QAAI,WAAW,QAAQ,WAAW,KAAK,SAAS,GAAG;AACjD,iBAAW,OAAO,OAAO,KAAY;AAAmB,qBAAY,OAAO,AAAO,iBAAiB,KAAK,IAAI,CAAC,UAAU,WAAW,KAAK;AAAA;AAEzI,UAAM,aAA+C,WAAW,MAAM;AAAA,MACpE,KAAK,MAAM,KAAK,IAAI,GAAG,WAAW,IAAI,WAAW;AAAA,MACjD,KAAK,MAAM,KAAK,IAAI,GAAG,WAAW,IAAI,WAAW;AAAA,MACjD,KAAK,MAAM,KAAK,IAAK,MAAM,MAAM,MAAM,GAAI,WAAW,IAAI,SAAS,MAAM,KAAK,IAAI,GAAG,WAAW,IAAI,WAAW;AAAA,MAC/G,KAAK,MAAM,KAAK,IAAK,MAAM,MAAM,MAAM,GAAI,WAAW,IAAI,SAAS,MAAM,KAAK,IAAI,GAAG,WAAW,IAAI,WAAW;AAAA,QAC7G,CAAC,GAAG,GAAG,GAAG;AACd,UAAM,UAA2C,WAAW,MAAM;AAAA,MAChE,WAAW,IAAI,WAAW,KAAM,OAAM,MAAM,MAAM;AAAA,MAClD,WAAW,IAAI,WAAW,KAAM,OAAM,MAAM,MAAM;AAAA,MACjD,YAAW,IAAI,SAAS,KAAK,WAAW,IAAI,WAAW,MAAO,OAAM,MAAM,MAAM;AAAA,MAChF,YAAW,IAAI,SAAS,KAAK,WAAW,IAAI,WAAW,MAAO,OAAM,MAAM,MAAM;AAAA,QAC/E,CAAC,GAAG,GAAG,GAAG;AACd,YAAQ,KAAK;AAAA,MACX,IAAI;AAAA,MACJ,OAAO,KAAK,MAAM,MAAM,WAAW,kBAAkB,MAAM,WAAW,iBAAiB,KAAK;AAAA,MAC5F,UAAU,KAAK,MAAM,MAAM,WAAW,iBAAiB;AAAA,MACvD,WAAW,KAAK,MAAM,MAAM,WAAW,kBAAkB;AAAA,MACzD,KAAK;AAAA,MACL;AAAA,MACA,MAAM,WAAW;AAAA,MACjB;AAAA,MACA;AAAA,MACA,OAAO,WAAW;AAAA,MAClB,QAAQ,WAAW;AAAA;AAErB,QAAI,WAAW;AAAQ,iBAAW,OAAO;AAAA;AAE3C,SAAO;AAAA;AAGT,qBAA2B,SAA8C;AACvE,MAAK,CAAC,WAAW,MAAM,QAAO,KAAK,WAAa,CAAC,WAAW,MAAM,QAAO,KAAK,KAAK,WAAa,CAAC,WAAW,MAAM,QAAO,KAAK,KAAK,SAAU;AAE3I,iBAAa,MAAM,QAAQ,IAAI;AAAA,MAC5B,CAAC,WAAW,MAAM,QAAO,KAAK,UAAW,AAAU,KAAK,WAAU;AAAA,MAClE,CAAC,WAAW,MAAM,QAAO,KAAK,KAAK,UAAW,AAAG,gCAAe,KAAK,QAAO,eAAe,QAAO,KAAK,KAAK,YAAY,EAAE,WAAW,QAAO,KAAK,KAAK,UAAU,SAAS,kBAAkB;AAAA,MAC3L,CAAC,WAAW,MAAM,QAAO,KAAK,KAAK,UAAW,AAAG,gCAAe,KAAK,QAAO,eAAe,QAAO,KAAK,KAAK,YAAY,EAAE,WAAW,QAAO,KAAK,KAAK,UAAU,SAAS,kBAAkB;AAAA;AAE9L,QAAI,QAAO,KAAK,KAAK,SAAS;AAC5B,UAAI,CAAC,WAAW,MAAM,CAAC,WAAW,GAAG;AAAa,YAAI,sBAAsB,QAAO,KAAK,KAAK;AAAA,eACpF,QAAO;AAAO,YAAI,eAAe,WAAW,GAAG;AAAA;AAE1D,QAAI,QAAO,KAAK,KAAK,SAAS;AAC5B,UAAI,CAAC,WAAW,MAAM,CAAC,WAAW,GAAG;AAAa,YAAI,sBAAsB,QAAO,KAAK,KAAK;AAAA,eACpF,QAAO;AAAO,YAAI,eAAe,WAAW,GAAG;AAAA;AAAA,aAEjD,QAAO,OAAO;AACvB,QAAI,WAAW;AAAI,UAAI,iBAAiB,WAAW,GAAG,MAAM;AAC5D,QAAI,WAAW;AAAI,UAAI,iBAAiB,WAAW,GAAG;AACtD,QAAI,WAAW;AAAI,UAAI,iBAAiB,WAAW,GAAG;AAAA;AAExD,iBAAe,IAAiB,SAAS,WAAW,IAAI,WAAW,IAAI,WAAW;AAClF,SAAO;AAAA;AAGF,IAAM,gBAAuB;AAC7B,IAAM,QAAe;;;AMvF5B;AAAA;AAAA;AAAA;AAAA;AASA,IAAM,cAAc,CAAC,SAAS,WAAW,QAAQ,SAAS,OAAO,YAAY;AAC7E,IAAI;AAEJ,IAAM,OAAyD;AAC/D,IAAI,YAAY;AAChB,IAAI,UAAU,OAAO;AAGrB,IAAM,MAAM,CAAC,QAAQ,OAAQ;AAE7B,qBAA2B,SAAqC;AAC9D,MAAI,CAAC,OAAO;AACV,YAAQ,MAAM,AAAG,gCAAe,KAAK,QAAO,eAAe,QAAO,KAAK,QAAQ;AAC/E,QAAI,CAAC,SAAS,CAAC,MAAM;AAAU,UAAI,sBAAsB,QAAO,KAAK,QAAQ;AAAA,aACpE,QAAO;AAAO,UAAI,eAAe,MAAM;AAAA,aACvC,QAAO;AAAO,QAAI,iBAAiB,MAAM;AACpD,SAAO;AAAA;AAGT,wBAA8B,SAAe,SAAgB,KAAK,QAAO;AACvE,MAAI,CAAC;AAAO,WAAO;AACnB,MAAK,UAAU,QAAO,KAAK,QAAQ,cAAe,QAAO,aAAc,cAAc,UAAU,KAAK,QAAS,KAAK,KAAK,SAAS,GAAI;AAClI;AACA,WAAO,KAAK;AAAA;AAEd,YAAU;AACV,SAAO,IAAI,QAAQ,OAAO,YAAY;AACpC,UAAM,SAAS,AAAG,uBAAM,eAAe,SAAO,CAAC,MAAM,OAAO,GAAG,MAAM,IAAI,MAAM,OAAO,GAAG,MAAM,KAAK;AACpG,UAAM,CAAC,KAAK,OAAO,QAAQ,AAAG,uBAAM,QAAQ,GAAG;AAC/C,WAAO;AAEP,UAAM,UAAU,AAAG,qBAAI,KAAK,IAAI;AAChC,UAAM,YAAY,AAAG,qBAAI,OAAO,IAAI;AACpC,UAAM,WAAW,AAAG,qBAAI,MAAM,IAAI;AAClC,QAAI;AACJ,UAAM;AACN,SAAK;AACL,UAAM,YAAY,AAAG,sBAAK,CAAC,SAAS,WAAW;AAC/C,YAAQ;AACR,cAAU;AACV,aAAS;AACT,UAAM,YAAY,AAAG,sBAAK,MAAM,UAAU,IAAI,KAAK,IAAI;AACvD,cAAU;AACV,UAAM,MAAiD;AACvD,QAAI,QAAO,KAAK,QAAQ,SAAS;AAC/B,YAAM,WAAW,MAAM,MAAM,QAAQ;AACrC,YAAM,QAAO,SAAS;AACtB,MAAG,yBAAQ;AACX,eAAS,IAAI,GAAG,IAAI,MAAK,QAAQ,KAAK;AACpC,YAAI,MAAK,KAAK,QAAO,KAAK,QAAQ;AAAe,cAAI,KAAK,EAAE,OAAO,KAAK,IAAI,MAAM,KAAK,MAAM,MAAM,MAAK,MAAM,MAAM,SAAS,YAAY;AAAA;AAE3I,UAAI,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE;AAAA;AAEjC,cAAU;AACV,SAAK,OAAO;AACZ,gBAAY;AACZ,YAAQ;AAAA;AAAA;;;ACjEZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA,IAAI;AACJ,IAAM,QAKD;AAEL,IAAI,aAAY;AAChB,IAAI,WAAU,OAAO;AAIrB,qBAA2B,SAAqC;AAC9D,QAAM,WAAW,KAAK,QAAO,eAAe,QAAO,KAAK,YAAY;AACpE,MAAI,CAAC,QAAO;AAEV,aAAQ,MAAM,AAAG,gCAAe;AAChC,QAAI,CAAC;AAAO,UAAI,sBAAsB,QAAO,KAAK,YAAY;AAAA,aACrD,QAAO;AAAO,UAAI,eAAe;AAAA,aACjC,QAAO;AAAO,QAAI,iBAAiB;AAC9C,SAAO;AAAA;AAGF,oBAAoB,YAA2B,YAA2B,QAAQ,GAAW;AAClG,MAAI,CAAC,cAAc,CAAC;AAAY,WAAO;AACvC,MAAI,0CAAY,YAAW,KAAK,0CAAY,YAAW;AAAG,WAAO;AACjE,MAAI,0CAAY,YAAW,0CAAY;AAAQ,WAAO;AAEtD,QAAM,WAAW,IAAM,WACpB,IAAI,CAAC,KAAK,MAAO,KAAK,IAAI,WAAW,KAAK,WAAW,OAAO,OAC5D,OAAO,CAAC,KAAK,SAAS,MAAM,MAAM,MAC/B,KAAI;AACV,QAAM,MAAM,KAAK,IAAI,GAAG,MAAM,YAAY;AAC1C,SAAO;AAAA;AAGF,eAAe,WAA0B,IAAQ,YAAY,GAAG;AACrE,MAAI,OAAO,EAAE,YAAY,GAAG,MAAM,IAAI,QAAQ,IAAI,WAAW;AAC7D,MAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,QAAQ,cAAc,CAAC,MAAM,QAAQ;AAAK,WAAO;AACjF,aAAW,KAAK,IAAI;AAClB,QAAI,EAAE,aAAa,EAAE,MAAM;AACzB,YAAM,OAAO,WAAW,WAAW,EAAE;AACrC,UAAI,OAAO,aAAa,OAAO,KAAK;AAAY,eAAO,KAAK,GAAG,YAAY;AAAA;AAAA;AAG/E,SAAO;AAAA;AAGF,iBAAiB,OAAe;AACrC,QAAM,UAAQ,AAAG,sBAAK,MAAM;AAG1B,UAAM,UAAS,MAAM,SAAS,MAAM,UAAU;AAC9C,QAAI,CAAE,oBAAqB;AAAS,aAAO;AAE3C,UAAM,OAAM,CAAC,CAAC,MAAM,MAAM,MAAM;AAEhC,QAAI,CAAC,OAAM,OAAO,GAAG;AAAO,aAAO;AACnC,UAAM,OAAQ,QAAO,MAAM,WAAW,IAClC,AAAG,uBAAM,cAAc,AAAG,4BAAW,SAAQ,IAAI,MAAK,CAAC,IAAI,CAAC,OAAM,OAAO,GAAG,MAAM,IAAI,OAAM,OAAO,GAAG,MAAM,OAC5G,AAAG,uBAAM,cAAc,SAAQ,MAAK,CAAC,IAAI,CAAC,OAAM,OAAO,GAAG,MAAM,IAAI,OAAM,OAAO,GAAG,MAAM;AAkC9F,UAAM,OAAO,KAAK,IAAI;AAEtB,WAAO;AAAA;AAET,SAAO;AAAA;AAGT,wBAA8B,SAAe,SAAgB,KAAK,QAAO;AAjHzE;AAkHE,MAAI,CAAC;AAAO,WAAO;AACnB,MAAK,WAAU,QAAO,KAAK,YAAY,cAAe,QAAO,aAAc,eAAc,UAAU,aAAK,SAAL,mBAAW,QAAQ,aAAK,SAAL,mBAAW,OAAM,GAAI;AACzI;AACA,WAAO,MAAK;AAAA;AAEd,aAAU;AACV,SAAO,IAAI,QAAQ,OAAO,YAAY;AACpC,UAAM,WAAW,QAAQ;AAEzB,QAAI;AACJ,UAAM,MAAM;AAAA,MACV,KAAa;AAAA,MACb,QAAgB;AAAA,MAChB,aAAqB;AAAA,MACrB,YAAsB;AAAA;AAGxB,QAAI,QAAO,KAAK,YAAY;AAAS,aAAO,MAAM,OAAM,QAAQ;AAChE,IAAG,yBAAQ;AAEX,QAAI,MAAM;AACR,MAAG,sBAAK,MAAM;AACZ,cAAM,SAAS,KAAK,KAAK,CAAC,MAAM,EAAE,MAAM,OAAO,GAAG;AAClD,cAAM,aAAa,KAAK,MAAM,MAAM,KAAK,IAAK,OAAO,KAAK,QAAS;AACnE,YAAI,aAAa,QAAO,KAAK,YAAY,eAAe;AACtD,cAAI,SAAS,OAAO,MAAM,MAAM,WAAW;AAC3C,cAAI,cAAc,KAAK,IAAI,MAAM;AAAA;AAEnC,cAAM,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,MAAM,OAAO,KAAK,OAAO,GAAG,WAAW;AACtE,cAAM,OAAM,KAAK,KAAK,CAAC,MAAM,EAAE,MAAM,OAAO,KAAK;AACjD,YAAI,MAAM,KAAK,MAAM,KAAI,MAAM,KAAK,KAAI,MAAM,KAAK,KAAK,MAAM,MAAM,KAAI,MAAM,KAAK,KAAK,MAAM,MAAM,KAAI,MAAM,MAAM;AAEpH,cAAM,OAAO,KAAK,KAAK,CAAC,MAAM,EAAE,MAAM,OAAO;AAI7C,YAAI,aAAa,CAAC,GAAG,KAAK;AAAA;AAE5B,WAAK,QAAQ,CAAC,MAAM,AAAG,yBAAQ;AAAA;AAGjC,UAAK,OAAO;AACZ,iBAAY;AACZ,YAAQ;AAAA;AAAA;;;AC7IZ,IAAM,gBAAgB,CAAC,UAAgD;AACrE,QAAM,UAAU,CAAC,KAAK,QAAQ,KAAK,MAAM,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI;AAEvE,QAAM,aAAa,CAAC,GAAG;AACvB,QAAM,WAAW;AAEjB,QAAM,OAAO,MAAK,KAAK,IAAI,KAAK,MAAK,KAAK,KAAK;AAC/C,QAAM,aAAa,OAAO,MAAK,KAAK,OAAO,MAAK,KAAK;AACrD,QAAM,YAAY,OACd,CAAE,OAAK,KAAK,KAAK,KAAK,MAAK,KAAK,IAAI,MAAM,GAAI,OAAK,KAAK,KAAK,KAAK,MAAK,KAAK,IAAI,MAAM,KACtF,CAAE,OAAK,KAAK,KAAK,KAAK,MAAK,KAAK,KAAK,MAAM,GAAI,OAAK,KAAK,KAAK,KAAK,MAAK,KAAK,KAAK,MAAM;AAC5F,QAAM,UAAU,OACZ,CAAC,MAAK,KAAK,KAAK,KAAK,MAAK,KAAK,IAAI,IAAI,MAAK,KAAK,IAAI,KAAK,MAAK,KAAK,IAAI,MACxE,CAAC,MAAK,KAAK,KAAK,KAAK,MAAK,KAAK,KAAK,IAAI,MAAK,KAAK,KAAK,KAAK,MAAK,KAAK,KAAK;AAE/E,QAAM,UAAU;AAAA,IACb,WAAU,KAAK,WAAW,MAAM,QAAQ,KAAK,WAAW;AAAA,IACzD,WAAY,YAAW,KAAK,UAAU,MAAM,QAAQ,KAAK,WAAW;AAAA;AAEtE,MAAI,WAAW,KAAK,KAAM,QAAQ,MAAM,IAAM,QAAQ,MAAM;AAC5D,aAAW,KAAK,IAAI,UAAU,MAAK,OAAO,KAAK,GAAG,MAAK,OAAO,KAAK;AACnE,QAAM,UAAW,SAAQ,CAAC,GAAG,IAAI,WAAY,KAAK,KAAK,KAAM,KAAK;AAElE,SAAO,EAAE,SAAS;AAAA;AAGpB,IAAM,qBAAqB,CAAC,OAAM,cAI7B;AAEH,QAAM,YAAY,CAAC,MAAM;AACvB,UAAM,SAAS,KAAK,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;AAC9D,MAAE,MAAM;AACR,MAAE,MAAM;AACR,MAAE,MAAM;AACR,WAAO;AAAA;AAET,QAAM,aAAa,CAAC,GAAG,MAAM;AAC3B,UAAM,IAAI,EAAE,KAAK,EAAE;AACnB,UAAM,IAAI,EAAE,KAAK,EAAE;AACnB,UAAM,IAAI,EAAE,KAAK,EAAE;AACnB,WAAO,CAAC,GAAG,GAAG;AAAA;AAEhB,QAAM,eAAe,CAAC,GAAG,MAAM;AAC7B,UAAM,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;AACjC,UAAM,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;AACjC,UAAM,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;AACjC,WAAO,CAAC,GAAG,GAAG;AAAA;AAGhB,QAAM,6BAA6B,CAAC,MAAM;AAExC,UAAM,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,OAAO;AACtD,QAAI;AAAQ,QAAI;AAAQ,QAAI;AAC5B,QAAI,MAAM,GAAG;AACX,UAAI,MAAM,IAAI;AACZ,iBAAS,KAAK,KAAK;AACnB,iBAAS,KAAK,MAAM,CAAC,KAAK;AAC1B,iBAAS,KAAK,MAAM,CAAC,KAAK;AAAA,aACrB;AACL,iBAAS,CAAC,KAAK,KAAK;AACpB,iBAAS,CAAC,KAAK,MAAM,KAAK;AAC1B,iBAAS;AAAA;AAAA,WAEN;AACL,eAAS,KAAK,KAAK;AACnB,eAAS,KAAK,MAAM,KAAK;AACzB,eAAS;AAAA;AAEX,WAAO,EAAE,OAAO,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,MAAM,IAAI,CAAC;AAAA;AAI5D,QAAM,mBAAmB,CAAC,UAAS;AACjC,UAAM,UAAU,CAAC,IAAI,IAAI,IAAI,OAAO,KAAK,MAAM,KAAK,IAAI,KAAK;AAE7D,UAAM,SAAQ;AAAA,MAGZ,OAAO,QAAQ,MAAK,IAAI,IAAI,MAAK,IAAI,IAAI,MAAK,KAAK,IAAI,MAAK,KAAK;AAAA,MAEjE,KAAK,QAAQ,MAAK,IAAI,IAAI,MAAK,IAAI,IAAI,MAAK,KAAK,IAAI,MAAK,KAAK;AAAA,MAE/D,MAAM,QAAQ,MAAK,IAAI,IAAI,MAAK,IAAI,IAAI,MAAK,KAAK,IAAI,MAAK,KAAK;AAAA;AAElE,WAAO;AAAA;AAIT,QAAM,OAAO,MAAK;AAClB,MAAI,CAAC,QAAQ,KAAK,SAAS;AAAK,WAAO,EAAE,OAAO,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,KAAK,QAAQ,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,MAAM,EAAE,SAAS,GAAG,UAAU;AAElJ,QAAM,OAAO,KAAK,IAAI,MAAK,OAAO,KAAK,UAAU,IAAI,MAAK,OAAO,KAAK,UAAU,MAAM;AAEtF,QAAM,MAAM,CAAC,KAAK,KAAK,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,IAAI,CAAC,OAAO;AAAA,IAElE,GAAG,KAAK,UAAU,KAAK;AAAA,IACvB,GAAG,KAAK,UAAU,KAAK;AAAA,IACvB,GAAG;AAAA;AAGL,QAAM,SAAS,UAAU,WAAW,IAAI,IAAI,IAAI;AAChD,MAAI,SAAS,UAAU,WAAW,IAAI,IAAI,IAAI;AAC9C,QAAM,SAAS,UAAU,aAAa,QAAQ;AAE9C,WAAS,aAAa,QAAQ;AAI9B,QAAM,SAAmF;AAAA,IACvF,OAAO;AAAA,IAAI,OAAO;AAAA,IAAI,OAAO;AAAA,IAC7B,OAAO;AAAA,IAAI,OAAO;AAAA,IAAI,OAAO;AAAA,IAC7B,OAAO;AAAA,IAAI,OAAO;AAAA,IAAI,OAAO;AAAA;AAE/B,QAAM,QAAQ,2BAA2B;AAIzC,QAAM,OAAO,KAAK,WAAW,MAAM,cAAc,SAAQ,EAAE,SAAS,GAAG,UAAU;AAEjF,SAAO,EAAE,OAAO,QAAQ;AAAA;AAGnB,IAAM,aAAa,OAAO,QAAgC,UAAmC;AA7IpG;AAgJE,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,QAAM,UAAuB;AAC7B,SAAO,QAAQ;AACf,cAAY;AACZ,QAAM,QAAQ,MAAM,AAAS,QAAQ,OAAO,OAAO;AACnD,SAAO,YAAY,OAAO,KAAK,MAAM,QAAQ;AAC7C,MAAI,CAAC,MAAM,SAAS,MAAM,MAAM,WAAW;AAAG,WAAO;AACrD,MAAI,CAAC;AAAO,WAAO;AAEnB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,WAAO,QAAQ;AAIf,QAAI,CAAC,MAAM,GAAG,SAAS,MAAM,GAAG,MAAM,uBAAuB;AAC3D,UAAI,4BAA4B,MAAM,GAAG;AACzC;AAAA;AAGF,UAAM,WAAW,mBAAmB,MAAM,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,MAAM;AAG3E,WAAO,QAAQ;AACf,QAAI,OAAO,OAAO,OAAO;AACvB,mBAAa,OAAO,OAAO,KAAK,QAAQ,UAAU,AAAQ,SAAQ,MAAM,GAAG,SAAS,AAAG,wBAAO,KAAK,OAAO,QAAQ,GAAG,MAAM,UAAU;AAAA,WAChI;AACL,aAAO,QAAQ;AACf,kBAAY;AACZ,mBAAa,OAAO,OAAO,KAAK,QAAQ,UAAU,MAAM,AAAQ,SAAQ,MAAM,GAAG,SAAS,AAAG,wBAAO,KAAK,OAAO,QAAQ,GAAG,MAAM,UAAU;AAC3I,aAAO,YAAY,UAAU,KAAK,MAAM,QAAQ;AAAA;AAElD,WAAO,QAAQ;AAGf,WAAO,QAAQ;AACf,QAAI,OAAO,OAAO,OAAO;AACvB,gBAAU,OAAO,OAAO,KAAK,YAAY,UAAU,AAAQ,SAAQ,MAAM,GAAG,SAAS,AAAG,wBAAO,KAAK,OAAO,QAAQ,GAAG,MAAM,UAAU;AAAA,WACjI;AACL,aAAO,QAAQ;AACf,kBAAY;AACZ,gBAAU,OAAO,OAAO,KAAK,YAAY,UAAU,MAAM,AAAQ,SAAQ,MAAM,GAAG,SAAS,AAAG,wBAAO,KAAK,OAAO,QAAQ,GAAG,MAAM,UAAU;AAC5I,aAAO,YAAY,YAAY,KAAK,MAAM,QAAQ;AAAA;AAEpD,WAAO,QAAQ;AAGf,QAAI,OAAO,OAAO,OAAO;AACvB,OAAC,QAAQ,WAAW,YAAY,cAAc,WAAW,MAAM,QAAQ,IAAI,CAAC,QAAQ,WAAW,YAAY,cAAc;AAAA;AAG3H,WAAO,QAAQ;AAIf,QAAI,CAAC,OAAO,OAAO,KAAK,KAAK,WAAW,mBAAM,OAAN,mBAAU,gBAAV,mBAAuB,gBAAe,mBAAM,OAAN,mBAAU,gBAAV,mBAAuB,eAAc;AACjH,aAAO,MAAM,GAAG,YAAY;AAC5B,aAAO,MAAM,GAAG,YAAY;AAAA;AAE9B,UAAM,WAAY,aAAM,GAAG,gBAAT,mBAAsB,gBAAe,aAAM,GAAG,gBAAT,mBAAsB,gBAEzE,KAAK,IAAI,KAAK,IAAI,MAAM,GAAG,YAAY,YAAY,GAAG,KAAK,MAAM,GAAG,YAAY,YAAY,GAAG,KAAK,KAAK,IAAI,MAAM,GAAG,YAAY,aAAa,GAAG,KAAK,MAAM,GAAG,YAAY,aAAa,GAAG,OAAO,MAAM,MAAM,KAC/M;AAGJ,YAAQ,KAAK;AAAA,SACR,MAAM;AAAA,MACT,IAAI;AAAA,MACJ,KAAK,QAAQ;AAAA,MACb,QAAQ,QAAQ;AAAA,MAChB,aAAa,QAAQ;AAAA,MACrB,WAAW,QAAQ;AAAA,MACnB,SAAS;AAAA,MACT,MAAM,aAAa,IAAI,KAAK,MAAM,MAAM,WAAW,QAAQ,MAAM;AAAA,MACjE;AAAA,MACA,QAAQ,OAAO,OAAO,KAAK,SAAS,SAAS,AAAG,yBAAQ,MAAM,GAAG,SAAS;AAAA;AAG5E,IAAG,yBAAQ,MAAM,GAAG;AAEpB,QAAI,MAAM,GAAG;AAAO,aAAO,MAAM,GAAG;AAEpC,WAAO,QAAQ;AAAA;AAEjB,SAAO,QAAQ;AACf,MAAI,OAAO,OAAO,OAAO;AACvB,QAAI,OAAO,YAAY;AAAM,aAAO,OAAO,YAAY;AACvD,QAAI,OAAO,YAAY;AAAK,aAAO,OAAO,YAAY;AACtD,QAAI,OAAO,YAAY;AAAQ,aAAO,OAAO,YAAY;AACzD,QAAI,OAAO,YAAY;AAAS,aAAO,OAAO,YAAY;AAAA;AAE5D,SAAO;AAAA;;;AC/OT;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,YAAY;AAAA,EACvB;AAAA,EAAQ;AAAA,EAAW;AAAA,EAAY;AAAA,EAAW;AAAA,EAAY;AAAA,EACtD;AAAA,EAAiB;AAAA,EAAa;AAAA,EAAc;AAAA,EAAa;AAAA,EACzD;AAAA,EAAW;AAAA,EAAY;AAAA,EAAY;AAAA,EAAa;AAAA,EAAa;AAAA;AAGxD,IAAM,QAAQ,UAAU;AAExB,IAAM,UAAU,UAAU,OAAO,CAAC,QAAQ,WAAW,MAAM;AAChE,SAAO,aAAa;AACpB,SAAO;AAAA,GACN;AAEH,IAAM,qBAAqB;AAAA,EACzB,CAAC,WAAW;AAAA,EAAiB,CAAC,aAAa;AAAA,EAC3C,CAAC,aAAa;AAAA,EAAc,CAAC,WAAW;AAAA,EACxC,CAAC,YAAY;AAAA,EAAc,CAAC,YAAY;AAAA,EACxC,CAAC,cAAc;AAAA,EAAkB,CAAC,cAAc;AAAA,EAChD,CAAC,YAAY;AAAA,EAAc,CAAC,aAAa;AAAA,EACzC,CAAC,gBAAgB;AAAA,EAAkB,CAAC,WAAW;AAAA;AAE1C,IAAM,uBAAuB,mBAAmB,IAAI,CAAC,CAAC,YAAY,gBAAiB,CAAC,QAAQ,aAAa,QAAQ;AAEjH,IAAM,YAAY;AAAA,EACvB,CAAC,QAAQ;AAAA,EAAY,CAAC,WAAW;AAAA,EAAY,CAAC,QAAQ;AAAA,EACtD,CAAC,YAAY;AAAA,EAAa,CAAC,QAAQ;AAAA,EACnC,CAAC,gBAAgB;AAAA,EAAc,CAAC,aAAa;AAAA,EAC7C,CAAC,gBAAgB;AAAA,EAAY,CAAC,WAAW;AAAA,EACzC,CAAC,YAAY;AAAA,EAAc,CAAC,QAAQ;AAAA,EACpC,CAAC,iBAAiB;AAAA,EAAe,CAAC,cAAc;AAAA,EAChD,CAAC,iBAAiB;AAAA,EAAa,CAAC,YAAY;AAAA,EAC5C,CAAC,aAAa;AAAA;;;ACdT,wBAAwB,YAA6C;AAC1E,QAAM,QAAQ,WAAU,OAAO,CAAC,EAAE,MAAM,MAAM,MAAM,QAAQ,EAAE,UAAU,EAAE,GAAG,UAAW;AAAA,IACtF,MAAM,KAAK,IAAI,MAAM;AAAA,IACrB,MAAM,KAAK,IAAI,MAAM;AAAA,IACrB,MAAM,KAAK,IAAI,MAAM;AAAA,IACrB,MAAM,KAAK,IAAI,MAAM;AAAA,MACnB;AAAA,IACF,MAAM,OAAO;AAAA,IACb,MAAM,OAAO;AAAA,IACb,MAAM,OAAO;AAAA,IACb,MAAM,OAAO;AAAA;AAEf,SAAO,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO,MAAM,MAAM,MAAM,OAAO,MAAM;AAAA;AAGvE,oBAAoB,QAAO,CAAC,QAAQ,QAAQ,CAAC,uBAAuB,uBAAoC;AAC7G,QAAM,SAAS,SAAS;AACxB,QAAM,SAAS,QAAQ;AACvB,QAAM,YAAY,CAAC,MAAM,MAAO;AAAA,IAC9B,IAAI;AAAA,IACJ,OAAO,KAAK;AAAA,IACZ,QAAQ,CAAC,KAAK,IAAI,KAAK,sBAAsB,KAAK,IAAI,KAAK,uBAAuB,KAAK,IAAI,KAAK,sBAAsB,KAAK,IAAI,KAAK;AAAA,IACpI,KAAK,CAAC,KAAK,MAAM,KAAK,IAAI,KAAK,SAAS,KAAK,MAAM,KAAK,IAAI,KAAK,SAAS,KAAK,MAAM,KAAK,IAAI,KAAK,SAAS,KAAK,MAAM,KAAK,IAAI,KAAK;AAAA,IACrI,WAAW,KAAK,UAAU,IAAI,CAAC,EAAE,eAAO,MAAM,eAAgB;AAAA,MAC5D;AAAA,MACA;AAAA,MACA,UAAU,CAAC,KAAK,MAAM,SAAS,IAAI,SAAS,KAAK,MAAM,SAAS,IAAI;AAAA,MACpE,aAAa,CAAC,SAAS,IAAI,uBAAuB,SAAS,IAAI;AAAA;AAAA;AAGnE,QAAM,cAAc,OAAM,IAAI,CAAC,MAAM,MAAM,UAAU,MAAM;AAC3D,SAAO;AAAA;AAIF,oBAAc;AAAA,EAKnB,YAAY,UAAS,iBAAiB;AACpC,SAAK,gBAAgB,IAAI,MAAM;AAC/B,SAAK,mBAAmB;AACxB,SAAK,kBAAkB;AAAA;AAAA,EAGzB,QAAQ,GAAG;AACT,SAAK,cAAc,EAAE,KAAK,oBAAoB;AAC9C,SAAK,KAAK,KAAK;AAAA;AAAA,EAGjB,UAAU;AACR,UAAM,OAAM,KAAK,cAAc;AAC/B,SAAK,SAAS,GAAG,KAAK;AACtB,SAAK,KAAK;AACV,SAAK,cAAc,KAAK,mBAAmB,KAAK;AAChD,WAAO;AAAA;AAAA,EAGT,QAAQ;AAAE,WAAO,KAAK,qBAAqB;AAAA;AAAA,EAE3C,OAAO;AAAE,WAAO,KAAK,mBAAmB;AAAA;AAAA,EAExC,MAAM;AAAE,WAAO,KAAK,cAAc,MAAM,GAAG,KAAK,mBAAmB;AAAA;AAAA,EAEnE,MAAM;AAAE,WAAO,KAAK,cAAc;AAAA;AAAA,EAElC,KAAK,GAAG;AACN,WAAO,IAAI,KAAK,KAAK,KAAK,KAAK,MAAM,IAAI,IAAI,IAAI;AAC/C,WAAK,SAAS,GAAG,KAAK,MAAM,IAAI;AAChC,UAAI,KAAK,MAAM,IAAI;AAAA;AAAA;AAAA,EAIvB,KAAK,GAAG;AACN,WAAO,IAAI,KAAK,KAAK,kBAAkB;AACrC,UAAI,IAAI,IAAI;AACZ,UAAI,IAAI,KAAK,oBAAoB,KAAK,KAAK,GAAG,IAAI;AAAI;AACtD,UAAI,CAAC,KAAK,KAAK,GAAG;AAAI;AACtB,WAAK,SAAS,GAAG;AACjB,UAAI;AAAA;AAAA;AAAA,EAIR,WAAW,GAAG;AAEZ,WAAO,KAAK,gBAAgB,KAAK,cAAc;AAAA;AAAA,EAGjD,KAAK,GAAG,GAAG;AACT,WAAO,KAAK,WAAW,KAAK,KAAK,WAAW;AAAA;AAAA,EAG9C,SAAS,GAAG,GAAG;AACb,UAAM,IAAI,KAAK,cAAc;AAC7B,SAAK,cAAc,KAAK,KAAK,cAAc;AAC3C,SAAK,cAAc,KAAK;AAAA;AAAA;AAIrB,wBAAwB,GAAG,GAAG,UAAU,SAAS;AACtD,SAAO;AAAA,IACL,GAAG,QAAQ,IAAI,GAAG,GAAG;AAAA,IACrB,GAAG,QAAQ,IAAI,GAAG,GAAG,WAAe;AAAA;AAAA;AAIjC,wBAAwB,MAAM,eAAc,SAAS;AAC1D,QAAM,EAAE,UAAU,UAAU,IAAI,aAAa;AAC7C,QAAM,EAAE,GAAG,MAAM,eAAe,UAAU,UAAU,UAAU;AAC9D,SAAO;AAAA,IACL,GAAG,KAAK,WAAW,gBAAe;AAAA,IAClC,GAAG,KAAK,WAAW,gBAAe;AAAA;AAAA;AAY/B,eAAe,GAAG,KAAK,MAAK;AACjC,MAAI,IAAI;AAAK,WAAO;AACpB,MAAI,IAAI;AAAK,WAAO;AACpB,SAAO;AAAA;AAGF,yBAAyB,IAAI,IAAI,IAAI,IAAI;AAC9C,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,KAAK;AAChB,SAAO,KAAK,KAAK,KAAK;AAAA;AAGjB,oBAAoB,GAAG,GAAG;AAC/B,SAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE;AAAA;;;ACvJpC,IAAM,qBAAqB;AAC3B,IAAM,eAAe;AACrB,IAAM,mBAAmB,MAAM;AAE/B,kBAAkB,QAAQ,gBAAgB,UAAU,QAAQ,SAAS,eAAe,mBAAmB,GAAG;AACxG,QAAM,kBAAkB,CAAC,WAAW;AAAA,IAClC,GAAG,cAAc,IAAI,OAAM,GAAG,OAAM,GAAG;AAAA,IACvC,GAAG,cAAc,IAAI,OAAM,GAAG,OAAM,GAAI,cAAc,MAAM,KAAK,IAAK;AAAA;AAExE,QAAM,2BAA2B,CAAC,QAAO,SAAQ,WAAW;AAAA,IAC1D,GAAG,AAAM,MAAM,KAAK,MAAM,OAAM,IAAI,eAAe,GAAG,UAAS;AAAA,IAC/D,GAAG,AAAM,MAAM,KAAK,MAAM,OAAM,IAAI,eAAe,GAAG,SAAQ;AAAA;AAGhE,QAAM,CAAC,QAAQ,SAAS,OAAO;AAE/B,QAAM,wBAAwB,yBAAyB,eAAe,UAAU,QAAQ;AACxF,QAAM,eAAe,gBAAgB;AACrC,QAAM,iBAAiB,AAAM,WAAW,eAAe,UAAU;AACjE,MAAI,iBAAiB;AACrB,WAAS,IAAI,GAAG,IAAI,kBAAkB,KAAK;AACzC,UAAM,wBAAwB,yBAAyB,gBAAgB,QAAQ;AAC/E,UAAM,cAAc,AAAM,eAAe,sBAAsB,GAAG,sBAAsB,GAAG,UAAU;AACrG,qBAAiB,AAAM,WACrB,EAAE,GAAG,sBAAsB,IAAI,cAAc,GAAG,sBAAsB,IAAI,gBAC1E,EAAE,GAAG,YAAY,GAAG,GAAG,YAAY;AAAA;AAGvC,QAAM,wBAAwB,yBAAyB,gBAAgB,QAAQ;AAC/E,QAAM,SAAQ,OAAO,IAAI,sBAAsB,GAAG,sBAAsB,GAAG;AAC3E,SAAO,EAAE,UAAU,gBAAgB,MAAM,AAAI,UAAU,WAAW;AAAA;AAG7D,oBAAoB,MAAM,QAAQ,SAAS,kBAAkB,kBAAkB;AACpF,QAAM,SAAS,AAAI,UAAU,IAAI,CAAC,CAAC,gBAAgB,mBAAoB,CAAC,AAAI,QAAQ,iBAAiB,AAAI,QAAQ;AACjH,QAAM,WAAW,OAAO,IAAI,CAAC,CAAC,EAAE,kBAAkB;AAClD,QAAM,WAAW,OAAO,IAAI,CAAC,CAAC,mBAAmB;AACjD,QAAM,WAAW,OAAO,MAAM;AAC9B,QAAM,WAAW,SAAS;AAC1B,QAAM,aAAY,IAAI,MAAM;AAE5B,QAAM,YAAY,AAAM,eAAe,KAAK,MAAM,cAAc;AAChE,aAAU,KAAK,KAAK,MAAM;AAAA,IACxB,OAAO,KAAK;AAAA,IACZ,MAAM,AAAI,UAAU,KAAK,KAAK;AAAA,IAC9B,UAAU;AAAA;AAGZ,WAAS,OAAO,WAAW,GAAG,QAAQ,GAAG,EAAE,MAAM;AAC/C,UAAM,WAAW,SAAS;AAC1B,UAAM,WAAW,SAAS;AAC1B,QAAI,WAAU,aAAa,CAAC,WAAU,WAAW;AAC/C,iBAAU,YAAY,SAAS,MAAM,WAAU,WAAW,UAAU,QAAQ,SAAS;AAAA;AAAA;AAIzF,WAAS,OAAO,GAAG,OAAO,UAAU,EAAE,MAAM;AAC1C,UAAM,WAAW,SAAS;AAC1B,UAAM,WAAW,SAAS;AAC1B,QAAI,WAAU,aAAa,CAAC,WAAU,WAAW;AAC/C,iBAAU,YAAY,SAAS,MAAM,WAAU,WAAW,UAAU,QAAQ,SAAS;AAAA;AAAA;AAGzF,SAAO;AAAA;AAGT,qCAAqC,YAAY,QAAO,UAAU,UAAU,QAAQ;AAClF,QAAM,CAAC,QAAQ,SAAS,OAAO;AAC/B,MAAI,eAAe;AACnB,QAAM,SAAS,KAAK,IAAI,WAAW,oBAAoB;AACvD,QAAM,OAAO,KAAK,IAAI,WAAW,qBAAqB,GAAG;AACzD,WAAS,WAAW,QAAQ,WAAW,MAAM,EAAE,UAAU;AACvD,UAAM,SAAS,KAAK,IAAI,WAAW,oBAAoB;AACvD,UAAM,OAAO,KAAK,IAAI,WAAW,qBAAqB,GAAG;AACzD,aAAS,WAAW,QAAQ,WAAW,MAAM,EAAE,UAAU;AACvD,UAAI,OAAO,IAAI,UAAU,UAAU,cAAc,QAAO;AACtD,uBAAe;AACf;AAAA;AAAA;AAGJ,QAAI,CAAC;AAAc;AAAA;AAErB,SAAO;AAAA;AAGF,iCAAiC,eAAe,QAAQ;AAC7D,QAAM,CAAC,QAAQ,OAAO,gBAAgB,OAAO;AAC7C,QAAM,QAAQ,IAAU,QAAQ,SAAS,QAAQ,cAAc,CAAC,EAAE,oBAAY;AAC9E,WAAS,WAAW,GAAG,WAAW,QAAQ,EAAE,UAAU;AACpD,aAAS,WAAW,GAAG,WAAW,OAAO,EAAE,UAAU;AACnD,eAAS,aAAa,GAAG,aAAa,cAAc,EAAE,YAAY;AAChE,cAAM,SAAQ,OAAO,IAAI,UAAU,UAAU;AAE7C,YAAI,SAAQ;AAAe;AAE3B,YAAI,4BAA4B,YAAY,QAAO,UAAU,UAAU;AAAS,gBAAM,QAAQ,EAAE,eAAO,MAAM,EAAE,UAAU,UAAU,IAAI;AAAA;AAAA;AAAA;AAI7I,SAAO;AAAA;AAGT,sBAAsB,QAAO,EAAE,GAAG,KAAK,YAAY;AACjD,SAAO,OAAM,KAAK,CAAC,EAAE,4BAAgB;AA1GvC;AA2GI,UAAM,wBAAwB,iBAAU,gBAAV,mBAAuB;AACrD,QAAI,CAAC;AAAuB,aAAO;AACnC,WAAO,AAAM,gBAAgB,GAAG,GAAG,sBAAsB,GAAG,sBAAsB,MAAM;AAAA;AAAA;AAI5F,0BAA0B,eAAe,YAAW;AAClD,QAAM,8BAA8B,WAAU,OAAO,CAAC,QAAQ,EAAE,UAAU,iBAAS,eAAe;AAChG,QAAI,CAAC,aAAa,eAAe,UAAU;AAAa,gBAAU;AAClE,WAAO;AAAA,KACN;AACH,SAAO,8BAA8B,WAAU;AAAA;AAG1C,gBAAgB,SAAS,QAAQ,kBAAkB,kBAAkB,aAAa,eAAe;AACtG,QAAM,SAAoF;AAC1F,QAAM,QAAQ,wBAAwB,eAAe;AAErD,SAAO,OAAM,SAAS,eAAe,CAAC,MAAM,SAAS;AAEnD,UAAM,OAAO,MAAM;AAGnB,UAAM,kBAAkB,AAAM,eAAe,KAAK,MAAM,cAAc;AAEtE,QAAI,aAAa,QAAO,iBAAiB,KAAK,KAAK;AAAK;AAExD,QAAI,aAAY,WAAW,MAAM,QAAQ,SAAS,kBAAkB;AACpE,iBAAY,WAAU,OAAO,CAAC,MAAM,EAAE,QAAQ;AAC9C,UAAM,SAAQ,iBAAiB,QAAO;AACtC,UAAM,OAAM,AAAM,eAAe;AACjC,QAAI,SAAQ;AAAe,aAAM,KAAK,EAAE,uBAAW,WAAK,OAAO,KAAK,MAAM,MAAM,UAAS;AAAA;AAE3F,SAAO;AAAA;;;AHhIT,IAAI;AACJ,IAAM,iBAAiB,CAAC,gCAA6C,iCAAoD,0CAA+D;AAExL,wBAA8B,OAAe,SAAiC;AAC5E,QAAM,MAAM,AAAG,sBAAK,MAAM;AACxB,QAAI,CAAC,OAAM,OAAO,GAAG;AAAO,aAAO;AACnC,UAAM,UAAU,MAAM,eAAe,CAAC,OAAM,OAAO,GAAG,MAAM,IAAI,OAAM,OAAO,GAAG,MAAM;AACtF,UAAM,aAAa,QAAQ,UAAU,IAAI,OAAO,IAAI;AACpD,UAAM,UAAyB,OAAM,QAAQ,YAAY;AACzD,UAAM,YAAY,QAAQ,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC;AAChD,cAAU,KAAK,UAAU,GAAG;AAC5B,WAAO;AAAA;AAGT,QAAM,UAAU,MAAM,QAAQ,IAAI,IAAI,IAAI,CAAC,YAAW,QAAO;AAC7D,aAAW,KAAK;AAAK,MAAE;AAEvB,QAAM,UAAU,MAAM,AAAM,OAAO,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAO,KAAK,aAAa,QAAO,KAAK;AACxH,MAAI,CAAC,OAAM,OAAO,GAAG;AAAO,WAAO;AACnC,QAAM,SAAS,AAAK,WAAW,SAAS,CAAC,MAAM,MAAM,IAAI,MAAM,MAAM,KAAK,CAAC,OAAM,OAAO,GAAG,MAAM,IAAI,OAAM,OAAO,GAAG,MAAM;AAC3H,SAAO;AAAA;AAGT,qBAA2B,SAAqC;AAC9D,MAAI,CAAC,QAAO;AAEV,aAAQ,MAAM,AAAG,gCAAe,KAAK,QAAO,eAAe,QAAO,KAAK;AACvE,QAAI,CAAC,UAAS,CAAC,OAAM;AAAa,UAAI,sBAAsB,QAAO,KAAK;AAAA,aAC/D,QAAO;AAAO,UAAI,eAAe,OAAM;AAAA,aACvC,QAAO;AAAO,QAAI,iBAAiB,OAAM;AACpD,SAAO;AAAA;;;AI1CT;AAAA;AAAA;AAAA;AAAA;;;ACEO,qBAAoB,MAAK;AAC9B,SAAO;AAAA,IACL,KAAK,IAAI,KAAI,SAAS,KAAK,KAAI,WAAW;AAAA,IAC1C,KAAK,IAAI,KAAI,SAAS,KAAK,KAAI,WAAW;AAAA;AAAA;AAIvC,uBAAsB,MAAK;AAChC,SAAO;AAAA,IACL,KAAI,WAAW,KAAM,MAAI,SAAS,KAAK,KAAI,WAAW,MAAM;AAAA,IAC5D,KAAI,WAAW,KAAM,MAAI,SAAS,KAAK,KAAI,WAAW,MAAM;AAAA;AAAA;AAIzD,mCAAkC,MAAK,SAAO,UAAU;AAC7D,QAAM,IAAI,QAAM,MAAM;AACtB,QAAM,IAAI,QAAM,MAAM;AACtB,QAAM,QAAQ,CAAC;AAAA,IACb,KAAI,WAAW,KAAK;AAAA,IACpB,KAAI,WAAW,KAAK;AAAA,IACpB,KAAI,SAAS,KAAK;AAAA,IAClB,KAAI,SAAS,KAAK;AAAA;AAEpB,SAAO,AAAG,uBAAM,cAAc,SAAO,OAAO,CAAC,IAAI;AAAA;AAG5C,8BAA6B,MAAK,QAAQ;AAC/C,QAAM,aAAa,CAAC,KAAI,WAAW,KAAK,OAAO,IAAI,KAAI,WAAW,KAAK,OAAO;AAC9E,QAAM,WAAW,CAAC,KAAI,SAAS,KAAK,OAAO,IAAI,KAAI,SAAS,KAAK,OAAO;AACxE,QAAM,gBAAgB,KAAI,cAAc,IAAI,CAAC,UAAU;AACrD,UAAM,cAAc,CAAC,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,OAAO;AAC7D,WAAO;AAAA;AAET,SAAO,EAAE,YAAY,UAAU,eAAe,YAAY,KAAI;AAAA;AAGzD,qBAAoB,MAAK,SAAS,KAAK;AAC5C,QAAM,SAAS,cAAa;AAC5B,QAAM,OAAO,YAAW;AACxB,QAAM,cAAc,CAAC,SAAS,KAAK,KAAK,GAAG,SAAS,KAAK,KAAK;AAC9D,QAAM,aAAa,CAAC,OAAO,KAAK,YAAY,IAAI,OAAO,KAAK,YAAY;AACxE,QAAM,WAAW,CAAC,OAAO,KAAK,YAAY,IAAI,OAAO,KAAK,YAAY;AACtE,SAAO,EAAE,YAAY,UAAU,eAAe,KAAI;AAAA;AAG7C,sBAAqB,MAAK;AAC/B,QAAM,UAAU,cAAa;AAC7B,QAAM,OAAO,YAAW;AACxB,QAAM,UAAU,KAAK,IAAI,GAAG;AAC5B,QAAM,WAAW,UAAU;AAC3B,QAAM,aAAa,CAAC,QAAQ,KAAK,UAAU,QAAQ,KAAK;AACxD,QAAM,WAAW,CAAC,QAAQ,KAAK,UAAU,QAAQ,KAAK;AACtD,SAAO,EAAE,YAAY,UAAU,eAAe,KAAI;AAAA;;;ACtD7C,IAAM,UAAU;AAAA,EACrB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GA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,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0Jb,IAAM,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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", "names": [] } diff --git a/dist/human.esm.js b/dist/human.esm.js index 03a802a1..d2144d58 100644 --- a/dist/human.esm.js +++ b/dist/human.esm.js @@ -5,41 +5,22440 @@ author: ' */ -var yI=Object.defineProperty;var vm=e=>{if(typeof require!="undefined")return require(e);throw new Error('Dynamic require of "'+e+'" is not supported')};var Pa=(e,t)=>{for(var n in t)yI(e,n,{get:t[n],enumerable:!0})};var d5=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)};var ln=(e,t,n)=>(d5(e,t,"read from private field"),n?n.call(e):t.get(e)),Qn=(e,t,n)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,n)},xa=(e,t,n,a)=>(d5(e,t,"write to private field"),a?a.call(e,n):t.set(e,n),n);function vt(e,t){let n=e.endsWith("/")?"":"/",r=t.startsWith(".")||t.startsWith("/")||t.startsWith("http:")||t.startsWith("https:")||t.startsWith("file:")?`${t}`:`${e}${n}${t}`;if(!r.toLocaleLowerCase().includes(".json"))throw new Error(`Human: ModelPath Error: ${r} Expecting JSON file`);return r}function de(...e){let t=new Date,n=`${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(n,"Human:",...e)}var Je=()=>typeof performance!="undefined"?performance.now():parseInt((Number(process.hrtime.bigint())/1e3/1e3).toString());function On(...e){let t=n=>n&&typeof n=="object";return e.reduce((n,a)=>(Object.keys(a||{}).forEach(r=>{let s=n[r],i=a[r];Array.isArray(s)&&Array.isArray(i)?n[r]=s.concat(...i):t(s)&&t(i)?n[r]=On(s,i):n[r]=i}),n),{})}var p5={backend:"webgl",modelBasePath:"../models/",wasmPath:"../node_modules/@tensorflow/tfjs-backend-wasm/dist/",debug:!0,async:!0,warmup:"full",cacheSensitivity:.75,skipFrame:!1,filter:{enabled:!0,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:15,skipFrames:15,minConfidence:.2,iouThreshold:.1,return:!1},mesh:{enabled:!0,modelPath:"facemesh.json"},iris:{enabled:!0,modelPath:"iris.json"},description:{enabled:!0,modelPath:"faceres.json",skipFrames:16,minConfidence:.1},emotion:{enabled:!0,minConfidence:.1,skipFrames:17,modelPath:"emotion.json"}},body:{enabled:!0,modelPath:"movenet-lightning.json",maxDetected:1,minConfidence:.2,skipFrames:16},hand:{enabled:!0,rotation:!0,skipFrames:19,minConfidence:.1,iouThreshold:.1,maxDetected:2,landmarks:!0,detector:{modelPath:"handdetect.json"},skeleton:{modelPath:"handskeleton.json"}},object:{enabled:!1,modelPath:"mb3-centernet.json",minConfidence:.2,iouThreshold:.4,maxDetected:10,skipFrames:20}};function c5(){let e,t;if(typeof navigator!="undefined"){let n=navigator.userAgent.match(/\(([^()]+)\)/g);if(n&&n[0]){let a=n[0].match(/\(([^()]+)\)/g);e=a?a[0].replace(/\(|\)/g,""):"",t=navigator.userAgent.replace(n[0],""),e[1]&&(t=t.replace(n[1],"")),t=t.replace(/ /g," ")}}else typeof process!="undefined"&&(e=`${process.platform} ${process.arch}`,t=`NodeJS ${process.version}`);return{platform:e,agent:t}}var tp={};Pa(tp,{Abs:()=>oo,Acos:()=>lo,Acosh:()=>uo,AdadeltaOptimizer:()=>ih,AdagradOptimizer:()=>oh,AdamOptimizer:()=>lh,AdamaxOptimizer:()=>uh,Add:()=>Mr,AddN:()=>hs,All:()=>po,Any:()=>co,ArgMax:()=>fs,ArgMin:()=>Nu,Asin:()=>ho,Asinh:()=>fo,Atan:()=>mo,Atan2:()=>Ao,Atanh:()=>yo,AvgPool:()=>ms,AvgPool3D:()=>Tu,AvgPool3DGrad:()=>Wp,AvgPoolGrad:()=>Lp,BackendWasm:()=>P6,BatchMatMul:()=>ys,BatchToSpaceND:()=>Eu,Bincount:()=>Bp,BroadcastTo:()=>rb,Callback:()=>R8,CallbackList:()=>w4,Cast:()=>As,Ceil:()=>gs,ClipByValue:()=>Fr,Complex:()=>Vp,ComplexAbs:()=>Cu,Concat:()=>go,Conv2D:()=>xs,Conv2DBackpropFilter:()=>jp,Conv2DBackpropInput:()=>bs,Conv3D:()=>Ru,Conv3DBackpropFilterV2:()=>Up,Conv3DBackpropInputV2:()=>Hp,Cos:()=>vs,Cosh:()=>xo,CropAndResize:()=>bo,Cumsum:()=>ws,CustomCallback:()=>I4,DataStorage:()=>zp,DenseBincount:()=>Gp,DepthToSpace:()=>vo,DepthwiseConv2dNative:()=>ks,DepthwiseConv2dNativeBackpropFilter:()=>qp,DepthwiseConv2dNativeBackpropInput:()=>Xp,Diag:()=>Kp,Dilation2D:()=>Mu,Dilation2DBackpropFilter:()=>Yp,Dilation2DBackpropInput:()=>Zp,ENV:()=>ea,EarlyStopping:()=>F8,Einsum:()=>Jp,Elu:()=>wo,EluGrad:()=>Qp,Environment:()=>nb,Equal:()=>Io,Erf:()=>ko,Exp:()=>Ss,ExpandDims:()=>So,Expm1:()=>No,FFT:()=>ec,Fill:()=>Fu,FlipLeftRight:()=>To,Floor:()=>Ns,FloorDiv:()=>Ts,FromPixels:()=>yc,FusedBatchNorm:()=>Es,FusedConv2D:()=>li,FusedDepthwiseConv2D:()=>ui,GPGPUContext:()=>Nh,GatherNd:()=>Co,GatherV2:()=>Eo,GraphModel:()=>lk,Greater:()=>Ro,GreaterEqual:()=>Cs,History:()=>k4,IFFT:()=>tc,Identity:()=>Rs,Imag:()=>nc,InputSpec:()=>zt,IsFinite:()=>Mo,IsInf:()=>Fo,IsNan:()=>$o,KernelBackend:()=>ku,LRN:()=>zu,LRNGrad:()=>rc,LayerVariable:()=>A4,LayersModel:()=>xr,LeakyRelu:()=>Ms,Less:()=>Do,LessEqual:()=>zo,LinSpace:()=>ac,Log:()=>Fs,Log1p:()=>Oo,LogSoftmax:()=>sb,LogicalAnd:()=>_o,LogicalNot:()=>$u,LogicalOr:()=>Du,MathBackendCPU:()=>hh,MathBackendWebGL:()=>jl,Max:()=>$s,MaxPool:()=>zs,MaxPool3D:()=>Ou,MaxPool3DGrad:()=>ic,MaxPoolGrad:()=>sc,MaxPoolWithArgmax:()=>oc,Maximum:()=>Ds,Mean:()=>Os,Min:()=>_s,Minimum:()=>Ps,MirrorPad:()=>Ls,Mod:()=>Po,MomentumOptimizer:()=>dh,Multinomial:()=>lc,Multiply:()=>Ws,Neg:()=>Lo,NonMaxSuppressionV3:()=>Bo,NonMaxSuppressionV4:()=>Vo,NonMaxSuppressionV5:()=>jo,NotEqual:()=>Wo,OP_SCOPE_SUFFIX:()=>yb,OneHot:()=>Bs,OnesLike:()=>Uo,Optimizer:()=>mr,Pack:()=>Ho,PadV2:()=>Vs,Pool:()=>AS,Pow:()=>js,Prelu:()=>Us,Prod:()=>Go,RMSPropOptimizer:()=>ph,RNN:()=>Qa,Range:()=>_u,Rank:()=>Om,Real:()=>uc,RealDiv:()=>Is,Reciprocal:()=>qo,Reduction:()=>hn,Relu:()=>Hs,Relu6:()=>qs,Reshape:()=>Xo,ResizeBilinear:()=>Gs,ResizeBilinearGrad:()=>pc,ResizeNearestNeighbor:()=>Pu,ResizeNearestNeighborGrad:()=>dc,Reverse:()=>Xs,RotateWithOffset:()=>ll,Round:()=>Ks,Rsqrt:()=>Zs,SGDOptimizer:()=>fd,ScatterNd:()=>Ko,Select:()=>Zo,Selu:()=>Yo,Sequential:()=>Jl,Sigmoid:()=>Js,Sign:()=>el,Sin:()=>Ys,Sinh:()=>Qo,Slice:()=>Jo,Softmax:()=>ti,Softplus:()=>tl,SpaceToBatchND:()=>Lu,SparseFillEmptyRows:()=>cc,SparseReshape:()=>hc,SparseToDense:()=>fc,SplitV:()=>nl,Sqrt:()=>Qs,Square:()=>Wu,SquaredDifference:()=>ni,Step:()=>Dr,StridedSlice:()=>al,Sub:()=>ai,Sum:()=>ei,SymbolicTensor:()=>Ca,Tan:()=>ri,Tanh:()=>si,Tensor:()=>We,TensorBuffer:()=>Pt,Tile:()=>$r,TopK:()=>rl,Transform:()=>sl,Transpose:()=>ii,Unique:()=>mc,Unpack:()=>il,UnsortedSegmentSum:()=>Bu,Variable:()=>Xu,ZerosLike:()=>ol,_FusedMatMul:()=>oi,abs:()=>Lt,acos:()=>u1,acosh:()=>d1,add:()=>se,addN:()=>Ec,all:()=>Cc,any:()=>Qu,argMax:()=>yi,argMin:()=>p1,asin:()=>c1,asinh:()=>h1,atan:()=>f1,atan2:()=>m1,atanh:()=>y1,avgPool:()=>td,avgPool3d:()=>x1,backend:()=>Yb,backend_util:()=>R,basicLSTMCell:()=>ZT,batchNorm:()=>xi,batchNorm2d:()=>t3,batchNorm3d:()=>n3,batchNorm4d:()=>a3,batchToSpaceND:()=>nd,bincount:()=>b1,booleanMaskAsync:()=>nM,broadcastTo:()=>xl,browser:()=>fi,buffer:()=>Be,callbacks:()=>hse,cast:()=>me,ceil:()=>v1,clipByValue:()=>Tn,clone:()=>Ba,complex:()=>zr,concat:()=>lt,concat1d:()=>r3,concat2d:()=>bl,concat3d:()=>s3,concat4d:()=>i3,constraints:()=>K6,conv1d:()=>Mc,conv2d:()=>pr,conv2dTranspose:()=>Fc,conv3d:()=>k1,conv3dTranspose:()=>l3,copyRegisteredKernels:()=>bS,cos:()=>ad,cosh:()=>$c,cosineWindow:()=>Z1,cumsum:()=>Dc,customGrad:()=>ja,data:()=>uk,denseBincount:()=>u3,deprecationWarn:()=>o1,depthToSpace:()=>I1,depthwiseConv2d:()=>vl,deregisterOp:()=>mse,device_util:()=>Zu,diag:()=>SE,dilation2d:()=>S1,disableDeprecationWarnings:()=>uT,dispose:()=>Ie,disposeVariables:()=>dT,div:()=>fe,divNoNan:()=>N1,dot:()=>d3,dropout:()=>M3,einsum:()=>p3,elu:()=>wl,enableDebugMode:()=>lT,enableProdMode:()=>oT,enclosingPowerOfTwo:()=>F3,engine:()=>dr,env:()=>J,equal:()=>Wr,erf:()=>T1,exp:()=>na,expandDims:()=>pn,expm1:()=>E1,eye:()=>C1,fft:()=>cd,fill:()=>kl,findBackend:()=>l1,findBackendFactory:()=>AT,floor:()=>Il,floorDiv:()=>Tc,forceHalfFloat:()=>Kv,fused:()=>Ur,gather:()=>bi,gatherND:()=>R3,gather_util:()=>e1,getBackend:()=>mT,getGradient:()=>$m,getKernel:()=>Ac,getKernelsForBackend:()=>dl,gpgpu_util:()=>xv,grad:()=>tC,grads:()=>nC,greater:()=>_n,greaterEqual:()=>Vr,ifft:()=>Cl,imag:()=>zc,image:()=>je,inTopKAsync:()=>hM,initializers:()=>n4,input:()=>q4,io:()=>Sn,irfft:()=>Yc,isFinite:()=>c3,isInf:()=>h3,isNaN:()=>R1,keep:()=>Gt,kernel_impls:()=>Ga,layers:()=>f4,leakyRelu:()=>rd,less:()=>Oc,lessEqual:()=>jr,linalg:()=>U3,linspace:()=>f3,loadGraphModel:()=>gt,loadLayersModel:()=>kae,localResponseNormalization:()=>M1,log:()=>Pn,log1p:()=>_c,logSigmoid:()=>y3,logSoftmax:()=>Lc,logSumExp:()=>D1,logicalAnd:()=>ca,logicalNot:()=>sd,logicalOr:()=>Wc,logicalXor:()=>b3,losses:()=>_F,matMul:()=>Ve,math:()=>Fb,max:()=>En,maxPool:()=>id,maxPool3d:()=>z1,maxPoolWithArgmax:()=>v3,maximum:()=>Ua,mean:()=>St,memory:()=>Nc,meshgrid:()=>IC,metrics:()=>T8,min:()=>Sl,minimum:()=>Nl,mirrorPad:()=>O1,mod:()=>_1,model:()=>vae,models:()=>E8,moments:()=>Bc,movingAverage:()=>sM,mul:()=>W,multiRNNCell:()=>FC,multinomial:()=>w3,neg:()=>It,nextFrame:()=>ch,norm:()=>th,notEqual:()=>ki,oneHot:()=>ml,ones:()=>Ln,onesLike:()=>Wn,op:()=>L,outerProduct:()=>_C,pad:()=>cr,pad1d:()=>WC,pad2d:()=>VC,pad3d:()=>UC,pad4d:()=>GC,pool:()=>k3,pow:()=>hr,prelu:()=>ld,print:()=>Nb,prod:()=>Vc,profile:()=>pT,rand:()=>tR,randomGamma:()=>sR,randomNormal:()=>I3,randomUniform:()=>Tl,range:()=>El,ready:()=>fT,real:()=>ud,reciprocal:()=>W1,registerBackend:()=>Al,registerCallbackConstructor:()=>Iae,registerGradient:()=>ib,registerKernel:()=>di,registerOp:()=>fse,regularizers:()=>C8,relu:()=>Ha,relu6:()=>jc,removeBackend:()=>yT,reshape:()=>H,reverse:()=>Bn,reverse1d:()=>fR,reverse2d:()=>yR,reverse3d:()=>gR,reverse4d:()=>bR,rfft:()=>hd,round:()=>Uc,rsqrt:()=>Hc,scalar:()=>we,scatterND:()=>C3,scatter_util:()=>t1,selu:()=>Gc,separableConv2d:()=>B1,sequential:()=>wae,serialization:()=>ae,setBackend:()=>hT,setPlatform:()=>gT,setWasmPath:()=>TQ,setWasmPaths:()=>EQ,setWebGLContext:()=>xh,setdiff1dAsync:()=>S3,shared:()=>ty,sigmoid:()=>Nn,sign:()=>V1,signal:()=>OF,sin:()=>qc,sinh:()=>Xc,slice:()=>Re,slice1d:()=>Kc,slice2d:()=>j1,slice3d:()=>Zc,slice4d:()=>dd,slice_util:()=>dn,softmax:()=>pd,softplus:()=>vi,spaceToBatchND:()=>od,sparse:()=>H3,sparseToDense:()=>K1,spectral:()=>zF,split:()=>qt,sqrt:()=>en,square:()=>ot,squaredDifference:()=>Jc,squeeze:()=>ha,stack:()=>cn,step:()=>Rl,stridedSlice:()=>U1,sub:()=>ye,sum:()=>Se,sumOutType:()=>vc,tan:()=>H1,tanh:()=>gi,tensor:()=>rn,tensor1d:()=>Mt,tensor2d:()=>wa,tensor3d:()=>Ic,tensor4d:()=>GR,tensor5d:()=>qR,tensor6d:()=>XR,tensor_util:()=>ba,test_util:()=>Xb,tidy:()=>V,tile:()=>Br,time:()=>cT,topk:()=>G1,train:()=>Si,transpose:()=>Qe,truncatedNormal:()=>Qc,unique:()=>eh,unregisterGradient:()=>xS,unregisterKernel:()=>gS,unsortedSegmentSum:()=>q1,unstack:()=>fa,upcastType:()=>pa,util:()=>k,valueAndGrad:()=>aC,valueAndGrads:()=>rC,variable:()=>N3,variableGrads:()=>m3,version:()=>toe,version_converter:()=>mie,version_core:()=>iT,version_cpu:()=>S7,version_layers:()=>AA,version_wasm:()=>W6,version_webgl:()=>Xv,webgl:()=>IB,webgl_util:()=>q7,where:()=>sn,whereAsync:()=>X1,zeros:()=>$t,zerosLike:()=>Ge});var AI=Object.create,Dp=Object.defineProperty,gI=Object.getOwnPropertyDescriptor,xI=Object.getOwnPropertyNames,bI=Object.getPrototypeOf,vI=Object.prototype.hasOwnProperty,wI=e=>Dp(e,"__esModule",{value:!0}),ao=e=>{if(typeof vm!="undefined")return vm(e);throw new Error('Dynamic require of "'+e+'" is not supported')},wt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Fe=(e,t)=>{for(var n in t)Dp(e,n,{get:t[n],enumerable:!0})},kI=(e,t,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of xI(t))!vI.call(e,a)&&a!=="default"&&Dp(e,a,{get:()=>t[a],enumerable:!(n=gI(t,a))||n.enumerable});return e},ro=e=>kI(wI(Dp(e!=null?AI(bI(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e),II=wt(()=>{}),SI=wt((e,t)=>{(function(n,a,r){function s(l){var d=this,p=u();d.next=function(){var c=2091639*d.s0+d.c*23283064365386963e-26;return d.s0=d.s1,d.s1=d.s2,d.s2=c-(d.c=c|0)},d.c=1,d.s0=p(" "),d.s1=p(" "),d.s2=p(" "),d.s0-=p(l),d.s0<0&&(d.s0+=1),d.s1-=p(l),d.s1<0&&(d.s1+=1),d.s2-=p(l),d.s2<0&&(d.s2+=1),p=null}function i(l,d){return d.c=l.c,d.s0=l.s0,d.s1=l.s1,d.s2=l.s2,d}function o(l,d){var p=new s(l),c=d&&d.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,c&&(typeof c=="object"&&i(c,p),h.state=function(){return i(p,{})}),h}function u(){var l=4022871197,d=function(p){p=p.toString();for(var c=0;c>>0,h-=l,h*=l,l=h>>>0,h-=l,l+=h*4294967296}return(l>>>0)*23283064365386963e-26};return d}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.alea=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),NI=wt((e,t)=>{(function(n,a,r){function s(u){var l=this,d="";l.x=0,l.y=0,l.z=0,l.w=0,l.next=function(){var c=l.x^l.x<<11;return l.x=l.y,l.y=l.z,l.z=l.w,l.w^=l.w>>>19^c^c>>>8},u===(u|0)?l.x=u:d+=u;for(var p=0;p>>0)/4294967296};return c.double=function(){do var h=d.next()>>>11,m=(d.next()>>>0)/4294967296,f=(h+m)/(1<<21);while(f===0);return f},c.int32=d.next,c.quick=c,p&&(typeof p=="object"&&i(p,d),c.state=function(){return i(d,{})}),c}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.xor128=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),TI=wt((e,t)=>{(function(n,a,r){function s(u){var l=this,d="";l.next=function(){var c=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^(c^c<<1))|0},l.x=0,l.y=0,l.z=0,l.w=0,l.v=0,u===(u|0)?l.x=u:d+=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 d=new s(u),p=l&&l.state,c=function(){return(d.next()>>>0)/4294967296};return c.double=function(){do var h=d.next()>>>11,m=(d.next()>>>0)/4294967296,f=(h+m)/(1<<21);while(f===0);return f},c.int32=d.next,c.quick=c,p&&(typeof p=="object"&&i(p,d),c.state=function(){return i(d,{})}),c}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.xorwow=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),EI=wt((e,t)=>{(function(n,a,r){function s(u){var l=this;l.next=function(){var p=l.x,c=l.i,h,m,f;return h=p[c],h^=h>>>7,m=h^h<<24,h=p[c+1&7],m^=h^h>>>10,h=p[c+3&7],m^=h^h>>>3,h=p[c+4&7],m^=h^h<<7,h=p[c+7&7],h=h^h<<13,m^=h^h<<9,p[c]=m,l.i=c+1&7,m};function d(p,c){var h,m,f=[];if(c===(c|0))m=f[0]=c;else for(c=""+c,h=0;h0;--h)p.next()}d(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 d=new s(u),p=l&&l.state,c=function(){return(d.next()>>>0)/4294967296};return c.double=function(){do var h=d.next()>>>11,m=(d.next()>>>0)/4294967296,f=(h+m)/(1<<21);while(f===0);return f},c.int32=d.next,c.quick=c,p&&(p.x&&i(p,d),c.state=function(){return i(d,{})}),c}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.xorshift7=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),CI=wt((e,t)=>{(function(n,a,r){function s(u){var l=this;l.next=function(){var p=l.w,c=l.X,h=l.i,m,f;return l.w=p=p+1640531527|0,f=c[h+34&127],m=c[h=h+1&127],f^=f<<13,m^=m<<17,f^=f>>>15,m^=m>>>12,f=c[h]=f^m,l.i=h,f+(p^p>>>16)|0};function d(p,c){var h,m,f,y,A,g=[],x=128;for(c===(c|0)?(m=c,c=null):(c=c+"\0",m=0,x=Math.max(x,c.length)),f=0,y=-32;y>>15,m^=m<<4,m^=m>>>13,y>=0&&(A=A+1640531527|0,h=g[y&127]^=m+A,f=h==0?f+1:0);for(f>=128&&(g[(c&&c.length||0)&127]=-1),f=127,y=4*128;y>0;--y)m=g[f+34&127],h=g[f=f+1&127],m^=m<<13,h^=h<<17,m^=m>>>15,h^=h>>>12,g[f]=m^h;p.w=A,p.X=g,p.i=f}d(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 d=new s(u),p=l&&l.state,c=function(){return(d.next()>>>0)/4294967296};return c.double=function(){do var h=d.next()>>>11,m=(d.next()>>>0)/4294967296,f=(h+m)/(1<<21);while(f===0);return f},c.int32=d.next,c.quick=c,p&&(p.X&&i(p,d),c.state=function(){return i(d,{})}),c}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.xor4096=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),RI=wt((e,t)=>{(function(n,a,r){function s(u){var l=this,d="";l.next=function(){var c=l.b,h=l.c,m=l.d,f=l.a;return c=c<<25^c>>>7^h,h=h-m|0,m=m<<24^m>>>8^f,f=f-c|0,l.b=c=c<<20^c>>>12^h,l.c=h=h-m|0,l.d=m<<16^h>>>16^f,l.a=f-c|0},l.a=0,l.b=0,l.c=2654435769|0,l.d=1367130551,u===Math.floor(u)?(l.a=u/4294967296|0,l.b=u|0):d+=u;for(var p=0;p>>0)/4294967296};return c.double=function(){do var h=d.next()>>>11,m=(d.next()>>>0)/4294967296,f=(h+m)/(1<<21);while(f===0);return f},c.int32=d.next,c.quick=c,p&&(typeof p=="object"&&i(p,d),c.state=function(){return i(d,{})}),c}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.tychei=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),h5=wt(()=>{}),MI=wt((e,t)=>{(function(n,a){var r=this,s=256,i=6,o=52,u="random",l=a.pow(s,i),d=a.pow(2,o),p=d*2,c=s-1,h;function m(b,v,S){var T=[];v=v==!0?{entropy:!0}:v||{};var E=g(A(v.entropy?[b,w(n)]:b==null?x():b,3),T),$=new f(T),z=function(){for(var O=$.g(i),_=l,D=0;O=p;)O/=2,_/=2,D>>>=1;return(O+D)/_};return z.int32=function(){return $.g(4)|0},z.quick=function(){return $.g(4)/4294967296},z.double=z,g(w($.S),n),(v.pass||S||function(O,_,D,U){return U&&(U.S&&y(U,$),O.state=function(){return y($,{})}),D?(a[u]=O,_):O})(z,E,"global"in v?v.global:this==a,v.state)}a["seed"+u]=m;function f(b){var v,S=b.length,T=this,E=0,$=T.i=T.j=0,z=T.S=[];for(S||(b=[S++]);E{var n=SI(),a=NI(),r=TI(),s=EI(),i=CI(),o=RI(),u=MI();u.alea=n,u.xor128=a,u.xorwow=r,u.xorshift7=s,u.xor4096=i,u.tychei=o,t.exports=u}),wu=wt(()=>{}),FI=wt(()=>{}),$I=wt(()=>{}),DI=wt((e,t)=>{var n=function(){var a=typeof document!="undefined"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename!="undefined"&&(a=a||__filename),function(r){r=r||{};function s(){return ee.buffer!=Ue&&Jt(ee.buffer),bn}function i(){return ee.buffer!=Ue&&Jt(ee.buffer),bt}function o(){return ee.buffer!=Ue&&Jt(ee.buffer),vn}function u(){return ee.buffer!=Ue&&Jt(ee.buffer),Yn}function l(){return ee.buffer!=Ue&&Jt(ee.buffer),on}var d=typeof r!="undefined"?r:{},p,c;d.ready=new Promise(function(N,C){p=N,c=C});var h={},m;for(m in d)d.hasOwnProperty(m)&&(h[m]=d[m]);var f=[],y="./this.program",A=function(N,C){throw C},g=!1,x=!1,w=!1,b=!1;g=typeof window=="object",x=typeof importScripts=="function",w=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",b=!g&&!w&&!x;var v=d.ENVIRONMENT_IS_PTHREAD||!1;v&&(Ue=d.buffer);var S="";function T(N){return d.locateFile?d.locateFile(N,S):S+N}var E,$,z,O,_,D;if(w){x?S=wu().dirname(S)+"/":S=__dirname+"/",E=function(N,C){return _||(_=ao("fs")),D||(D=wu()),N=D.normalize(N),_.readFileSync(N,C?null:"utf8")},z=function(N){var C=E(N,!0);return C.buffer||(C=new Uint8Array(C)),he(C.buffer),C},process.argv.length>1&&(y=process.argv[1].replace(/\\/g,"/")),f=process.argv.slice(2),process.on("uncaughtException",function(N){if(!(N instanceof vu))throw N}),process.on("unhandledRejection",sr),A=function(N){process.exit(N)},d.inspect=function(){return"[Emscripten Module object]"};var U;try{U=FI()}catch(N){throw console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'),N}global.Worker=U.Worker}else b?(typeof read!="undefined"&&(E=function(N){return read(N)}),z=function(N){var C;return typeof readbuffer=="function"?new Uint8Array(readbuffer(N)):(C=read(N,"binary"),he(typeof C=="object"),C)},typeof scriptArgs!="undefined"?f=scriptArgs:typeof arguments!="undefined"&&(f=arguments),typeof quit=="function"&&(A=function(N){quit(N)}),typeof print!="undefined"&&(typeof console=="undefined"&&(console={}),console.log=print,console.warn=console.error=typeof printErr!="undefined"?printErr:print)):(g||x)&&(x?S=self.location.href:typeof document!="undefined"&&document.currentScript&&(S=document.currentScript.src),typeof a!="undefined"&&a&&(S=a),S.indexOf("blob:")!==0?S=S.substr(0,S.lastIndexOf("/")+1):S="",w?(E=function(N,C){return _||(_=ao("fs")),D||(D=wu()),N=D.normalize(N),_.readFileSync(N,C?null:"utf8")},z=function(N){var C=E(N,!0);return C.buffer||(C=new Uint8Array(C)),he(C.buffer),C}):(E=function(N){var C=new XMLHttpRequest;return C.open("GET",N,!1),C.send(null),C.responseText},x&&(z=function(N){var C=new XMLHttpRequest;return C.open("GET",N,!1),C.responseType="arraybuffer",C.send(null),new Uint8Array(C.response)}),$=function(N,C,B){var X=new XMLHttpRequest;X.open("GET",N,!0),X.responseType="arraybuffer",X.onload=function(){if(X.status==200||X.status==0&&X.response){C(X.response);return}B()},X.onerror=B,X.send(null)}),O=function(N){document.title=N});w&&typeof performance=="undefined"&&(global.performance=$I().performance);var q=d.print||console.log.bind(console),G=d.printErr||console.warn.bind(console);for(m in h)h.hasOwnProperty(m)&&(d[m]=h[m]);h=null,d.arguments&&(f=d.arguments),d.thisProgram&&(y=d.thisProgram),d.quit&&(A=d.quit);var Q=Atomics.load,Y=Atomics.store,re=Atomics.compareExchange,ne;d.wasmBinary&&(ne=d.wasmBinary);var ie=d.noExitRuntime||!0;typeof WebAssembly!="object"&&sr("no native wasm support detected");var ee,pe,oe=!1,ge;function he(N,C){N||sr("Assertion failed: "+C)}function Ne(N){var C=d["_"+N];return he(C,"Cannot call unknown function "+N+", make sure it is exported"),C}function Te(N,C,B,X,ce){var le={string:function(In){var no=0;if(In!=null&&In!==0){var u5=(In.length<<2)+1;no=Qi(u5),nt(In,no,u5)}return no},array:function(In){var no=Qi(In.length);return Ze(In,no),no}};function ue(In){return C==="string"?ze(In):C==="boolean"?Boolean(In):In}var be=Ne(N),at=[],Ut=0;if(X)for(var _t=0;_t=X);){var le=N[C++];if(!le)return ce;if(!(le&128)){ce+=String.fromCharCode(le);continue}var ue=N[C++]&63;if((le&224)==192){ce+=String.fromCharCode((le&31)<<6|ue);continue}var be=N[C++]&63;if((le&240)==224?le=(le&15)<<12|ue<<6|be:le=(le&7)<<18|ue<<12|be<<6|N[C++]&63,le<65536)ce+=String.fromCharCode(le);else{var at=le-65536;ce+=String.fromCharCode(55296|at>>10,56320|at&1023)}}return ce}function ze(N,C){return N?_e(i(),N,C):""}function tt(N,C,B,X){if(!(X>0))return 0;for(var ce=B,le=B+X-1,ue=0;ue=55296&&be<=57343){var at=N.charCodeAt(++ue);be=65536+((be&1023)<<10)|at&1023}if(be<=127){if(B>=le)break;C[B++]=be}else if(be<=2047){if(B+1>=le)break;C[B++]=192|be>>6,C[B++]=128|be&63}else if(be<=65535){if(B+2>=le)break;C[B++]=224|be>>12,C[B++]=128|be>>6&63,C[B++]=128|be&63}else{if(B+3>=le)break;C[B++]=240|be>>18,C[B++]=128|be>>12&63,C[B++]=128|be>>6&63,C[B++]=128|be&63}}return C[B]=0,B-ce}function nt(N,C,B){return tt(N,i(),C,B)}function it(N){for(var C=0,B=0;B=55296&&X<=57343&&(X=65536+((X&1023)<<10)|N.charCodeAt(++B)&1023),X<=127?++C:X<=2047?C+=2:X<=65535?C+=3:C+=4}return C}function Ze(N,C){s().set(N,C)}function pt(N,C){return N%C>0&&(N+=C-N%C),N}var Ue,bn,bt,Zn,Yt,vn,Yn,zn,on;function Jt(N){Ue=N,d.HEAP8=bn=new Int8Array(N),d.HEAP16=Zn=new Int16Array(N),d.HEAP32=vn=new Int32Array(N),d.HEAPU8=bt=new Uint8Array(N),d.HEAPU16=Yt=new Uint16Array(N),d.HEAPU32=Yn=new Uint32Array(N),d.HEAPF32=zn=new Float32Array(N),d.HEAPF64=on=new Float64Array(N)}var Oa=d.INITIAL_MEMORY||16777216;if(v)ee=d.wasmMemory,Ue=d.buffer;else if(d.wasmMemory)ee=d.wasmMemory;else if(ee=new WebAssembly.Memory({initial:Oa/65536,maximum:2147483648/65536,shared:!0}),!(ee.buffer instanceof SharedArrayBuffer))throw G("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"),w&&console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"),Error("bad memory");ee&&(Ue=ee.buffer),Oa=Ue.byteLength,Jt(Ue);var oa,la=[],wr=[],ar=[],kr=[],Gi=[],_a=!1,cp=!1;v||wr.push({func:function(){Tp()}});function Z0(){if(!v){if(d.preRun)for(typeof d.preRun=="function"&&(d.preRun=[d.preRun]);d.preRun.length;)fp(d.preRun.shift());Xi(la)}}function pu(){_a=!0,!v&&Xi(wr)}function Y0(){v||Xi(ar)}function hp(){v||(cp=!0)}function wn(){if(!v){if(d.postRun)for(typeof d.postRun=="function"&&(d.postRun=[d.postRun]);d.postRun.length;)J0(d.postRun.shift());Xi(Gi)}}function fp(N){la.unshift(N)}function J0(N){Gi.unshift(N)}var rr=0,Ir=null,ls=null;function Q0(N){he(!v,"addRunDependency cannot be used in a pthread worker"),rr++,d.monitorRunDependencies&&d.monitorRunDependencies(rr)}function ef(N){if(rr--,d.monitorRunDependencies&&d.monitorRunDependencies(rr),rr==0&&(Ir!==null&&(clearInterval(Ir),Ir=null),ls)){var C=ls;ls=null,C()}}d.preloadedImages={},d.preloadedAudios={};function sr(N){d.onAbort&&d.onAbort(N),v&&console.error("Pthread aborting at "+new Error().stack),N+="",G(N),oe=!0,ge=1,N="abort("+N+"). Build with -s ASSERTIONS=1 for more info.";var C=new WebAssembly.RuntimeError(N);throw c(C),C}function mp(N,C){return String.prototype.startsWith?N.startsWith(C):N.indexOf(C)===0}var qi="data:application/octet-stream;base64,";function yp(N){return mp(N,qi)}var tf="file://";function Ap(N){return mp(N,tf)}var kn="tfjs-backend-wasm-threaded-simd.wasm";yp(kn)||(kn=T(kn));function gp(N){try{if(N==kn&&ne)return new Uint8Array(ne);if(z)return z(N);throw"both async and sync fetching of the wasm failed"}catch(C){sr(C)}}function nf(){if(!ne&&(g||x)){if(typeof fetch=="function"&&!Ap(kn))return fetch(kn,{credentials:"same-origin"}).then(function(N){if(!N.ok)throw"failed to load wasm binary file at '"+kn+"'";return N.arrayBuffer()}).catch(function(){return gp(kn)});if($)return new Promise(function(N,C){$(kn,function(B){N(new Uint8Array(B))},C)})}return Promise.resolve().then(function(){return gp(kn)})}function af(){var N={a:Xf};function C(ue,be){var at=ue.exports;if(d.asm=at,oa=d.asm.F,pe=be,!v){var Ut=ke.unusedWorkers.length;ke.unusedWorkers.forEach(function(_t){ke.loadWasmModuleToWorker(_t,function(){--Ut||ef("wasm-instantiate")})})}}v||Q0("wasm-instantiate");function B(ue){C(ue.instance,ue.module)}function X(ue){return nf().then(function(be){return WebAssembly.instantiate(be,N)}).then(ue,function(be){G("failed to asynchronously prepare wasm: "+be),sr(be)})}function ce(){return!ne&&typeof WebAssembly.instantiateStreaming=="function"&&!yp(kn)&&!Ap(kn)&&typeof fetch=="function"?fetch(kn,{credentials:"same-origin"}).then(function(ue){var be=WebAssembly.instantiateStreaming(ue,N);return be.then(B,function(at){return G("wasm streaming compile failed: "+at),G("falling back to ArrayBuffer instantiation"),X(B)})}):X(B)}if(d.instantiateWasm)try{var le=d.instantiateWasm(N,C);return le}catch(ue){return G("Module.instantiateWasm callback failed with error: "+ue),!1}return ce().catch(c),{}}var rf={9816:function(){throw"Canceled!"},9834:function(N,C){setTimeout(function(){a5(N,C)},0)}};function xp(){ke.initRuntime()}function Xi(N){for(;N.length>0;){var C=N.shift();if(typeof C=="function"){C(d);continue}var B=C.func;typeof B=="number"?C.arg===void 0?oa.get(B)():oa.get(B)(C.arg):B(C.arg===void 0?null:C.arg)}}function cu(N,C){if(N<=0||N>s().length||N&!0||C<0)return-28;if(C==0)return 0;C>=2147483647&&(C=Infinity);var B=Atomics.load(o(),eo>>2),X=0;if(B==N){var ce=Atomics.compareExchange(o(),eo>>2,B,0);if(ce==B&&(--C,X=1,C<=0))return 1}var le=Atomics.notify(o(),N>>2,C);if(le>=0)return le+X;throw"Atomics.notify returned an unexpected value "+le}d._emscripten_futex_wake=cu;function sf(N){if(v)throw"Internal Error! killThread() can only ever be called from main application thread!";if(!N)throw"Internal Error! Null pthread_ptr in killThread!";o()[N+12>>2]=0;var C=ke.pthreads[N];C.worker.terminate(),ke.freeThreadData(C),ke.runningWorkers.splice(ke.runningWorkers.indexOf(C.worker),1),C.worker.pthread=void 0}function of(N){if(v)throw"Internal Error! cancelThread() can only ever be called from main application thread!";if(!N)throw"Internal Error! Null pthread_ptr in cancelThread!";var C=ke.pthreads[N];C.worker.postMessage({cmd:"cancel"})}function lf(N){if(v)throw"Internal Error! cleanupThread() can only ever be called from main application thread!";if(!N)throw"Internal Error! Null pthread_ptr in cleanupThread!";var C=ke.pthreads[N];if(C){o()[N+12>>2]=0;var B=C.worker;ke.returnWorkerToPool(B)}}var ke={unusedWorkers:[],runningWorkers:[],initMainThreadBlock:function(){for(var N=Math.min(4,Math.max(1,(navigator.hardwareConcurrency||1)/2)),C=0;C>2]=N;var B=N+152;o()[B>>2]=B;for(var X=ds(512),C=0;C<128;++C)u()[X/4+C]=0;Atomics.store(u(),N+100>>2,X),Atomics.store(u(),N+40>>2,N),xm(N,!x,1),n5(N)},initWorker:function(){},pthreads:{},threadExitHandlers:[],setThreadStatus:function(){},runExitHandlers:function(){for(;ke.threadExitHandlers.length>0;)ke.threadExitHandlers.pop()();v&&Yi()&&t5()},runExitHandlersAndDeinitThread:function(N,C){Atomics.store(u(),N+56>>2,1),Atomics.store(u(),N+60>>2,0),ke.runExitHandlers(),Atomics.store(u(),N+4>>2,C),Atomics.store(u(),N+0>>2,1),cu(N+0,2147483647),xm(0,0,0)},threadExit:function(N){var C=Yi();C&&(ke.runExitHandlersAndDeinitThread(C,N),v&&postMessage({cmd:"exit"}))},threadCancel:function(){ke.runExitHandlersAndDeinitThread(Yi(),-1),postMessage({cmd:"cancelDone"})},terminateAllThreads:function(){for(var N in ke.pthreads){var C=ke.pthreads[N];C&&C.worker&&ke.returnWorkerToPool(C.worker)}ke.pthreads={};for(var B=0;B>2];o()[N.threadInfoStruct+100>>2]=0,xu(C),xu(N.threadInfoStruct)}N.threadInfoStruct=0,N.allocatedOwnStack&&N.stackBase&&xu(N.stackBase),N.stackBase=0,N.worker&&(N.worker.pthread=null)}},returnWorkerToPool:function(N){ke.runWithoutMainThreadQueuedCalls(function(){delete ke.pthreads[N.pthread.threadInfoStruct],ke.unusedWorkers.push(N),ke.runningWorkers.splice(ke.runningWorkers.indexOf(N),1),ke.freeThreadData(N.pthread),N.pthread=void 0})},runWithoutMainThreadQueuedCalls:function(N){o()[l5>>2]=0;try{N()}finally{o()[l5>>2]=1}},receiveObjectTransfer:function(N){},loadWasmModuleToWorker:function(N,C){N.onmessage=function(B){var X=B.data,ce=X.cmd;if(N.pthread&&(ke.currentProxiedOperationCallerThread=N.pthread.threadInfoStruct),X.targetThread&&X.targetThread!=Yi()){var le=ke.pthreads[X.targetThread];le?le.worker.postMessage(B.data,X.transferList):console.error('Internal error! Worker sent a message "'+ce+'" to target pthread '+X.targetThread+", but that thread no longer exists!"),ke.currentProxiedOperationCallerThread=void 0;return}if(ce==="processQueuedMainThreadWork")Am();else if(ce==="spawnThread")Sp(B.data);else if(ce==="cleanupThread")lf(X.thread);else if(ce==="killThread")sf(X.thread);else if(ce==="cancelThread")of(X.thread);else if(ce==="loaded")N.loaded=!0,C&&C(N),N.runPthread&&(N.runPthread(),delete N.runPthread);else if(ce==="print")q("Thread "+X.threadId+": "+X.text);else if(ce==="printErr")G("Thread "+X.threadId+": "+X.text);else if(ce==="alert")alert("Thread "+X.threadId+": "+X.text);else if(ce==="exit"){var ue=N.pthread&&Atomics.load(u(),N.pthread.threadInfoStruct+64>>2);ue&&ke.returnWorkerToPool(N)}else if(ce==="exitProcess")try{mI(X.returnCode)}catch(be){if(be instanceof vu)return;throw be}else ce==="cancelDone"?ke.returnWorkerToPool(N):ce==="objectTransfer"?ke.receiveObjectTransfer(B.data):B.data.target==="setimmediate"?N.postMessage(B.data):G("worker sent an unknown command "+ce);ke.currentProxiedOperationCallerThread=void 0},N.onerror=function(B){G("pthread sent an error! "+B.filename+":"+B.lineno+": "+B.message)},w&&(N.on("message",function(B){N.onmessage({data:B})}),N.on("error",function(B){N.onerror(B)}),N.on("exit",function(B){})),N.postMessage({cmd:"load",urlOrBlob:d.mainScriptUrlOrBlob||a,wasmMemory:ee,wasmModule:pe})},allocateUnusedWorker:function(){var N=T("tfjs-backend-wasm-threaded-simd.worker.js");ke.unusedWorkers.push(new Worker(N))},getNewWorker:function(){return ke.unusedWorkers.length==0&&(ke.allocateUnusedWorker(),ke.loadWasmModuleToWorker(ke.unusedWorkers[0])),ke.unusedWorkers.length>0?ke.unusedWorkers.pop():null},busySpinWait:function(N){for(var C=performance.now()+N;performance.now()>2]=N,N}function mf(N,C){if(v)return Sr(1,1,N,C)}function yf(N,C){if(N==C)postMessage({cmd:"processQueuedMainThreadWork"});else if(v)postMessage({targetThread:N,cmd:"processThreadQueue"});else{var B=ke.pthreads[N],X=B&&B.worker;if(!X)return;X.postMessage({cmd:"processThreadQueue"})}return 1}function Af(){sr()}function gf(N,C,B){var X=kf(C,B);return rf[N].apply(null,X)}function xf(N,C){}function bf(N,C,B){if(N<=0||N>s().length||N&!0)return-28;if(g){if(Atomics.load(o(),N>>2)!=C)return-6;for(var X=performance.now(),ce=X+B,le=Atomics.exchange(o(),eo>>2,N);;){if(X=performance.now(),X>ce)return le=Atomics.exchange(o(),eo>>2,0),-73;if(le=Atomics.exchange(o(),eo>>2,0),le==0)break;if(Am(),Atomics.load(o(),N>>2)!=C)return-6;le=Atomics.exchange(o(),eo>>2,N)}return 0}else{var ue=Atomics.wait(o(),N>>2,C,B);if(ue==="timed-out")return-73;if(ue==="not-equal")return-6;if(ue==="ok")return 0;throw"Atomics.wait returned an unexpected value "+ue}}function vf(N,C,B){i().copyWithin(N,C,C+B)}function wf(){return w?ao("os").cpus().length:navigator.hardwareConcurrency}function Sr(N,C){for(var B=arguments.length-2,X=bu(),ce=B,le=Qi(ce*8),ue=le>>3,be=0;be>=2;B=i()[N++];){var X=B<105;X&&C&1&&C++,fu.push(X?l()[C++>>1]:o()[C]),++C}return fu}function If(N,C,B){hu.length=C;for(var X=B>>3,ce=0;ce>>16),Jt(ee.buffer),1}catch(C){}}function Tf(N){var C=Sf();if(N<=C)return!1;var B=2147483648;if(N>B)return!1;for(var X=1;X<=4;X*=2){var ce=C*(1+.2/X);ce=Math.min(ce,N+100663296);var le=Math.min(B,pt(Math.max(N,ce),65536)),ue=Nf(le);if(ue)return!0}return!1}var Le={inEventHandler:0,removeAllEventListeners:function(){for(var N=Le.eventHandlers.length-1;N>=0;--N)Le._removeHandler(N);Le.eventHandlers=[],Le.deferredCalls=[]},registerRemoveEventListeners:function(){Le.removeEventListenersRegistered||(kr.push(Le.removeAllEventListeners),Le.removeEventListenersRegistered=!0)},deferredCalls:[],deferCall:function(N,C,B){function X(ue,be){if(ue.length!=be.length)return!1;for(var at in ue)if(ue[at]!=be[at])return!1;return!0}for(var ce in Le.deferredCalls){var le=Le.deferredCalls[ce];if(le.targetFunction==N&&X(le.argsList,B))return}Le.deferredCalls.push({targetFunction:N,precedence:C,argsList:B}),Le.deferredCalls.sort(function(ue,be){return ue.precedence>2]=B,o()[ue+4>>2]=X,o()[ue+8>>2]=ce,gm(0,N,637534208,C,X,ue),Ji(le)},getTargetThreadForEventCallback:function(N){switch(N){case 1:return 0;case 2:return ke.currentProxiedOperationCallerThread;default:return N}},getNodeNameForTarget:function(N){return N?N==window?"#window":N==screen?"#screen":N&&N.nodeName?N.nodeName:"":""},fullscreenEnabled:function(){return document.fullscreenEnabled||document.webkitFullscreenEnabled}};function Ef(N){var C=it(N)+1,B=ds(C);return nt(N,B,C),B}function Cf(N,C,B,X){var ce=bu(),le=Qi(12),ue=0;C&&(ue=Ef(C)),o()[le>>2]=ue,o()[le+4>>2]=B,o()[le+8>>2]=X,gm(0,N,657457152,0,ue,le),Ji(ce)}function Rf(N,C,B,X){C=C?ze(C):"",Cf(N,C,B,X)}function Mf(N){return N>2?ze(N):N}var Ff=[0,typeof document!="undefined"?document:0,typeof window!="undefined"?window:0];function $f(N){N=Mf(N);var C=Ff[N]||(typeof document!="undefined"?document.querySelector(N):void 0);return C}function mu(N){return $f(N)}function bp(N,C,B){var X=mu(N);if(!X)return-4;if(X.canvasSharedPtr&&(o()[X.canvasSharedPtr>>2]=C,o()[X.canvasSharedPtr+4>>2]=B),X.offscreenCanvas||!X.controlTransferredOffscreen){X.offscreenCanvas&&(X=X.offscreenCanvas);var ce=!1;if(X.GLctxObject&&X.GLctxObject.GLctx){var le=X.GLctxObject.GLctx.getParameter(2978);ce=le[0]===0&&le[1]===0&&le[2]===X.width&&le[3]===X.height}X.width=C,X.height=B,ce&&X.GLctxObject.GLctx.viewport(0,0,C,B)}else if(X.canvasSharedPtr){var ue=o()[X.canvasSharedPtr+8>>2];return Rf(ue,N,C,B),1}else return-4;return 0}function vp(N,C,B){return v?Sr(2,1,N,C,B):bp(N,C,B)}function Df(N,C,B){var X=mu(N);return X?bp(N,C,B):vp(N,C,B)}function zf(N){}function Of(N,C){}function _f(N){var C=N.getExtension("ANGLE_instanced_arrays");if(C)return N.vertexAttribDivisor=function(B,X){C.vertexAttribDivisorANGLE(B,X)},N.drawArraysInstanced=function(B,X,ce,le){C.drawArraysInstancedANGLE(B,X,ce,le)},N.drawElementsInstanced=function(B,X,ce,le,ue){C.drawElementsInstancedANGLE(B,X,ce,le,ue)},1}function Pf(N){var C=N.getExtension("OES_vertex_array_object");if(C)return N.createVertexArray=function(){return C.createVertexArrayOES()},N.deleteVertexArray=function(B){C.deleteVertexArrayOES(B)},N.bindVertexArray=function(B){C.bindVertexArrayOES(B)},N.isVertexArray=function(B){return C.isVertexArrayOES(B)},1}function Lf(N){var C=N.getExtension("WEBGL_draw_buffers");if(C)return N.drawBuffers=function(B,X){C.drawBuffersWEBGL(B,X)},1}function Wf(N){return!!(N.multiDrawWebgl=N.getExtension("WEBGL_multi_draw"))}var et={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],uniforms:[],shaders:[],vaos:[],contexts:{},offscreenCanvases:{},timerQueriesEXT:[],programInfos:{},stringCache:{},unpackAlignment:4,recordError:function(N){et.lastError||(et.lastError=N)},getNewId:function(N){for(var C=et.counter++,B=N.length;B>2]:-1;ce+=ze(o()[B+le*4>>2],ue<0?void 0:ue)}return ce},createContext:function(N,C){var B=N.getContext("webgl",C);if(!B)return 0;var X=et.registerContext(B,C);return X},registerContext:function(N,C){var B=ds(8);o()[B+4>>2]=Yi();var X={handle:B,attributes:C,version:C.majorVersion,GLctx:N};return N.canvas&&(N.canvas.GLctxObject=X),et.contexts[B]=X,(typeof C.enableExtensionsByDefault=="undefined"||C.enableExtensionsByDefault)&&et.initExtensions(X),B},makeContextCurrent:function(N){return et.currentContext=et.contexts[N],d.ctx=Nr=et.currentContext&&et.currentContext.GLctx,!(N&&!Nr)},getContext:function(N){return et.contexts[N]},deleteContext:function(N){et.currentContext===et.contexts[N]&&(et.currentContext=null),typeof Le=="object"&&Le.removeAllHandlersOnTarget(et.contexts[N].GLctx.canvas),et.contexts[N]&&et.contexts[N].GLctx.canvas&&(et.contexts[N].GLctx.canvas.GLctxObject=void 0),xu(et.contexts[N].handle),et.contexts[N]=null},initExtensions:function(N){if(N||(N=et.currentContext),!N.initExtensionsDone){N.initExtensionsDone=!0;var C=N.GLctx;_f(C),Pf(C),Lf(C),C.disjointTimerQueryExt=C.getExtension("EXT_disjoint_timer_query"),Wf(C);var B=C.getSupportedExtensions()||[];B.forEach(function(X){X.indexOf("lose_context")<0&&X.indexOf("debug")<0&&C.getExtension(X)})}},populateUniformTable:function(N){for(var C=et.programs[N],B=et.programInfos[N]={uniforms:{},maxUniformLength:0,maxAttributeLength:-1,maxUniformBlockNameLength:-1},X=B.uniforms,ce=Nr.getProgramParameter(C,35718),le=0;le>2,X=o()[B+(24>>2)],ce={alpha:!!o()[B+(0>>2)],depth:!!o()[B+(4>>2)],stencil:!!o()[B+(8>>2)],antialias:!!o()[B+(12>>2)],premultipliedAlpha:!!o()[B+(16>>2)],preserveDrawingBuffer:!!o()[B+(20>>2)],powerPreference:Bf[X],failIfMajorPerformanceCaveat:!!o()[B+(28>>2)],majorVersion:o()[B+(32>>2)],minorVersion:o()[B+(36>>2)],enableExtensionsByDefault:o()[B+(40>>2)],explicitSwapControl:o()[B+(44>>2)],proxyContextToMainThread:o()[B+(48>>2)],renderViaOffscreenBackBuffer:o()[B+(52>>2)]},le=mu(N);if(!le||ce.explicitSwapControl)return 0;var ue=et.createContext(le,ce);return ue}function jf(N,C){return Vf(N,C)}var Ki={mappings:{},buffers:[null,[],[]],printChar:function(N,C){var B=Ki.buffers[N];C===0||C===10?((N===1?q:G)(_e(B,0)),B.length=0):B.push(C)},varargs:void 0,get:function(){Ki.varargs+=4;var N=o()[Ki.varargs-4>>2];return N},getStr:function(N){var C=ze(N);return C},get64:function(N,C){return N}};function wp(N){return v?Sr(3,1,N):0}function kp(N,C,B,X,ce){if(v)return Sr(4,1,N,C,B,X,ce)}function Ip(N,C,B,X){if(v)return Sr(5,1,N,C,B,X);for(var ce=0,le=0;le>2],be=o()[C+(le*8+4)>>2],at=0;at>2]=ce,0}function Uf(N){var C=ke.threadExitHandlers.pop();N&&C()}function Hf(N,C){ke.threadExitHandlers.push(function(){oa.get(N)(C)})}function Sp(N){if(v)throw"Internal Error! spawnThread() can only ever be called from main application thread!";var C=ke.getNewWorker();if(C.pthread!==void 0)throw"Internal error!";if(!N.pthread_ptr)throw"Internal error, no pthread ptr!";ke.runningWorkers.push(C);for(var B=ds(128*4),X=0;X<128;++X)o()[B+X*4>>2]=0;var ce=N.stackBase+N.stackSize,le=ke.pthreads[N.pthread_ptr]={worker:C,stackBase:N.stackBase,stackSize:N.stackSize,allocatedOwnStack:N.allocatedOwnStack,threadInfoStruct:N.pthread_ptr},ue=le.threadInfoStruct>>2;Atomics.store(u(),ue+(64>>2),N.detached),Atomics.store(u(),ue+(100>>2),B),Atomics.store(u(),ue+(40>>2),le.threadInfoStruct),Atomics.store(u(),ue+(80>>2),N.stackSize),Atomics.store(u(),ue+(76>>2),ce),Atomics.store(u(),ue+(104>>2),N.stackSize),Atomics.store(u(),ue+(104+8>>2),ce),Atomics.store(u(),ue+(104+12>>2),N.detached);var be=e5(),at=be+40;Atomics.store(u(),ue+(172>>2),at),C.pthread=le;var Ut={cmd:"run",start_routine:N.startRoutine,arg:N.arg,threadInfoStruct:N.pthread_ptr,stackBase:N.stackBase,stackSize:N.stackSize};C.runPthread=function(){Ut.time=performance.now(),C.postMessage(Ut,N.transferList)},C.loaded&&(C.runPthread(),delete C.runPthread)}function Gf(N,C,B,X){if(typeof SharedArrayBuffer=="undefined")return G("Current environment does not support SharedArrayBuffer, pthreads are not available!"),6;if(!N)return G("pthread_create called with a null thread pointer!"),28;var ce=[],le=0;if(v&&(ce.length===0||le))return r5(687865856,N,C,B,X);if(le)return le;var ue=0,be=0,at=0;C&&C!=-1?(ue=o()[C>>2],ue+=81920,be=o()[C+8>>2],at=o()[C+12>>2]!==0):ue=2097152;var Ut=be==0;Ut?be=o5(16,ue):(be-=ue,he(be>0));for(var _t=ds(228),Er=0;Er<228>>2;++Er)u()[(_t>>2)+Er]=0;o()[N>>2]=_t,o()[_t+12>>2]=_t;var to=_t+152;o()[to>>2]=to;var In={stackBase:be,stackSize:ue,allocatedOwnStack:Ut,detached:at,startRoutine:B,pthread_ptr:_t,arg:X,transferList:ce};return v?(In.cmd="spawnThread",postMessage(In,ce)):Sp(In),0}function Np(N){if(v)return Sr(6,1,N);switch(N){case 30:return 16384;case 85:var C=2147483648;return C/16384;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return typeof navigator=="object"&&navigator.hardwareConcurrency||1}return ff(28),-1}v||ke.initMainThreadBlock();var Nr,qf=[null,mf,vp,wp,kp,Ip,Np],Xf={e:cf,r:hf,x:yf,b:Af,y:gf,j:xf,c:bf,d:cu,f:us,p:vf,z:wf,u:If,q:Tf,v:Df,i:zf,t:Of,w:jf,m:wp,n:kp,g:Ip,o:xp,a:ee||d.wasmMemory,k:Uf,l:Hf,h:Gf,s:Np},Jg=af(),Tp=d.___wasm_call_ctors=function(){return(Tp=d.___wasm_call_ctors=d.asm.A).apply(null,arguments)},Kf=d._init=function(){return(Kf=d._init=d.asm.B).apply(null,arguments)},Zf=d._register_tensor=function(){return(Zf=d._register_tensor=d.asm.C).apply(null,arguments)},Yf=d._dispose_data=function(){return(Yf=d._dispose_data=d.asm.D).apply(null,arguments)},Jf=d._dispose=function(){return(Jf=d._dispose=d.asm.E).apply(null,arguments)},Qf=d._Abs=function(){return(Qf=d._Abs=d.asm.G).apply(null,arguments)},em=d._Add=function(){return(em=d._Add=d.asm.H).apply(null,arguments)},tm=d._AddN=function(){return(tm=d._AddN=d.asm.I).apply(null,arguments)},nm=d._All=function(){return(nm=d._All=d.asm.J).apply(null,arguments)},am=d._Any=function(){return(am=d._Any=d.asm.K).apply(null,arguments)},rm=d._ArgMax=function(){return(rm=d._ArgMax=d.asm.L).apply(null,arguments)},sm=d._AvgPool=function(){return(sm=d._AvgPool=d.asm.M).apply(null,arguments)},im=d._BatchMatMul=function(){return(im=d._BatchMatMul=d.asm.N).apply(null,arguments)},om=d._Ceil=function(){return(om=d._Ceil=d.asm.O).apply(null,arguments)},lm=d._ClipByValue=function(){return(lm=d._ClipByValue=d.asm.P).apply(null,arguments)},um=d._Conv2D=function(){return(um=d._Conv2D=d.asm.Q).apply(null,arguments)},dm=d._Conv2DBackpropInput=function(){return(dm=d._Conv2DBackpropInput=d.asm.R).apply(null,arguments)},pm=d._Cos=function(){return(pm=d._Cos=d.asm.S).apply(null,arguments)},cm=d._CropAndResize=function(){return(cm=d._CropAndResize=d.asm.T).apply(null,arguments)},hm=d._Cumsum=function(){return(hm=d._Cumsum=d.asm.U).apply(null,arguments)},fm=d._DepthToSpace=function(){return(fm=d._DepthToSpace=d.asm.V).apply(null,arguments)},mm=d._DepthwiseConv2dNative=function(){return(mm=d._DepthwiseConv2dNative=d.asm.W).apply(null,arguments)},Ep=d._Equal=function(){return(Ep=d._Equal=d.asm.X).apply(null,arguments)},Cp=d._Exp=function(){return(Cp=d._Exp=d.asm.Y).apply(null,arguments)},Rp=d._FlipLeftRight=function(){return(Rp=d._FlipLeftRight=d.asm.Z).apply(null,arguments)},yu=d._Floor=function(){return(yu=d._Floor=d.asm._).apply(null,arguments)},Zi=d._FloorDiv=function(){return(Zi=d._FloorDiv=d.asm.$).apply(null,arguments)},ym=d._FusedBatchNorm=function(){return(ym=d._FusedBatchNorm=d.asm.aa).apply(null,arguments)},Au=d._FusedConv2D=function(){return(Au=d._FusedConv2D=d.asm.ba).apply(null,arguments)},K=d._FusedDepthwiseConv2D=function(){return(K=d._FusedDepthwiseConv2D=d.asm.ca).apply(null,arguments)},te=d._Gather=function(){return(te=d._Gather=d.asm.da).apply(null,arguments)},Ee=d._GatherNd=function(){return(Ee=d._GatherNd=d.asm.ea).apply(null,arguments)},Ye=d._Greater=function(){return(Ye=d._Greater=d.asm.fa).apply(null,arguments)},Tt=d._GreaterEqual=function(){return(Tt=d._GreaterEqual=d.asm.ga).apply(null,arguments)},mt=d._LeakyRelu=function(){return(mt=d._LeakyRelu=d.asm.ha).apply(null,arguments)},He=d._Less=function(){return(He=d._Less=d.asm.ia).apply(null,arguments)},qe=d._LessEqual=function(){return(qe=d._LessEqual=d.asm.ja).apply(null,arguments)},Qt=d._Log=function(){return(Qt=d._Log=d.asm.ka).apply(null,arguments)},ir=d._LogicalAnd=function(){return(ir=d._LogicalAnd=d.asm.la).apply(null,arguments)},or=d._Max=function(){return(or=d._Max=d.asm.ma).apply(null,arguments)},Mp=d._MaxPool=function(){return(Mp=d._MaxPool=d.asm.na).apply(null,arguments)},gu=d._Maximum=function(){return(gu=d._Maximum=d.asm.oa).apply(null,arguments)},Jn=d._Mean=function(){return(Jn=d._Mean=d.asm.pa).apply(null,arguments)},Tr=d._Min=function(){return(Tr=d._Min=d.asm.qa).apply(null,arguments)},Fp=d._Minimum=function(){return(Fp=d._Minimum=d.asm.ra).apply(null,arguments)},E9=d._MirrorPad=function(){return(E9=d._MirrorPad=d.asm.sa).apply(null,arguments)},C9=d._Multiply=function(){return(C9=d._Multiply=d.asm.ta).apply(null,arguments)},R9=d._Neg=function(){return(R9=d._Neg=d.asm.ua).apply(null,arguments)},M9=d._NonMaxSuppressionV3=function(){return(M9=d._NonMaxSuppressionV3=d.asm.va).apply(null,arguments)},F9=d._NonMaxSuppressionV4=function(){return(F9=d._NonMaxSuppressionV4=d.asm.wa).apply(null,arguments)},$9=d._NonMaxSuppressionV5=function(){return($9=d._NonMaxSuppressionV5=d.asm.xa).apply(null,arguments)},D9=d._NotEqual=function(){return(D9=d._NotEqual=d.asm.ya).apply(null,arguments)},z9=d._OneHot=function(){return(z9=d._OneHot=d.asm.za).apply(null,arguments)},O9=d._PadV2=function(){return(O9=d._PadV2=d.asm.Aa).apply(null,arguments)},_9=d._Pow=function(){return(_9=d._Pow=d.asm.Ba).apply(null,arguments)},P9=d._Prelu=function(){return(P9=d._Prelu=d.asm.Ca).apply(null,arguments)},L9=d._Prod=function(){return(L9=d._Prod=d.asm.Da).apply(null,arguments)},W9=d._RealDiv=function(){return(W9=d._RealDiv=d.asm.Ea).apply(null,arguments)},B9=d._Relu=function(){return(B9=d._Relu=d.asm.Fa).apply(null,arguments)},V9=d._Relu6=function(){return(V9=d._Relu6=d.asm.Ga).apply(null,arguments)},j9=d._ResizeBilinear=function(){return(j9=d._ResizeBilinear=d.asm.Ha).apply(null,arguments)},U9=d._Reverse=function(){return(U9=d._Reverse=d.asm.Ia).apply(null,arguments)},H9=d._RotateWithOffset=function(){return(H9=d._RotateWithOffset=d.asm.Ja).apply(null,arguments)},G9=d._Round=function(){return(G9=d._Round=d.asm.Ka).apply(null,arguments)},q9=d._Rsqrt=function(){return(q9=d._Rsqrt=d.asm.La).apply(null,arguments)},X9=d._ScatterNd=function(){return(X9=d._ScatterNd=d.asm.Ma).apply(null,arguments)},K9=d._SelectV2=function(){return(K9=d._SelectV2=d.asm.Na).apply(null,arguments)},Z9=d._Sigmoid=function(){return(Z9=d._Sigmoid=d.asm.Oa).apply(null,arguments)},Y9=d._Sin=function(){return(Y9=d._Sin=d.asm.Pa).apply(null,arguments)},J9=d._Softmax=function(){return(J9=d._Softmax=d.asm.Qa).apply(null,arguments)},Q9=d._Sqrt=function(){return(Q9=d._Sqrt=d.asm.Ra).apply(null,arguments)},eI=d._Square=function(){return(eI=d._Square=d.asm.Sa).apply(null,arguments)},tI=d._SquaredDifference=function(){return(tI=d._SquaredDifference=d.asm.Ta).apply(null,arguments)},nI=d._Step=function(){return(nI=d._Step=d.asm.Ua).apply(null,arguments)},aI=d._StridedSlice=function(){return(aI=d._StridedSlice=d.asm.Va).apply(null,arguments)},rI=d._Sub=function(){return(rI=d._Sub=d.asm.Wa).apply(null,arguments)},sI=d._Sum=function(){return(sI=d._Sum=d.asm.Xa).apply(null,arguments)},iI=d._Tan=function(){return(iI=d._Tan=d.asm.Ya).apply(null,arguments)},oI=d._Tanh=function(){return(oI=d._Tanh=d.asm.Za).apply(null,arguments)},lI=d._Tile=function(){return(lI=d._Tile=d.asm._a).apply(null,arguments)},uI=d._TopK=function(){return(uI=d._TopK=d.asm.$a).apply(null,arguments)},dI=d._Transform=function(){return(dI=d._Transform=d.asm.ab).apply(null,arguments)},pI=d._Transpose=function(){return(pI=d._Transpose=d.asm.bb).apply(null,arguments)},cI=d.__FusedMatMul=function(){return(cI=d.__FusedMatMul=d.asm.cb).apply(null,arguments)},ds=d._malloc=function(){return(ds=d._malloc=d.asm.db).apply(null,arguments)},xu=d._free=function(){return(xu=d._free=d.asm.eb).apply(null,arguments)},Qg=d.___errno_location=function(){return(Qg=d.___errno_location=d.asm.fb).apply(null,arguments)},e5=d._emscripten_get_global_libc=function(){return(e5=d._emscripten_get_global_libc=d.asm.gb).apply(null,arguments)},Yi=d._pthread_self=function(){return(Yi=d._pthread_self=d.asm.hb).apply(null,arguments)},t5=d.___pthread_tsd_run_dtors=function(){return(t5=d.___pthread_tsd_run_dtors=d.asm.ib).apply(null,arguments)},Am=d._emscripten_main_thread_process_queued_calls=function(){return(Am=d._emscripten_main_thread_process_queued_calls=d.asm.jb).apply(null,arguments)},hI=d._emscripten_current_thread_process_queued_calls=function(){return(hI=d._emscripten_current_thread_process_queued_calls=d.asm.kb).apply(null,arguments)},n5=d._emscripten_register_main_browser_thread_id=function(){return(n5=d._emscripten_register_main_browser_thread_id=d.asm.lb).apply(null,arguments)},a5=d.__emscripten_do_dispatch_to_thread=function(){return(a5=d.__emscripten_do_dispatch_to_thread=d.asm.mb).apply(null,arguments)},r5=d._emscripten_sync_run_in_main_thread_4=function(){return(r5=d._emscripten_sync_run_in_main_thread_4=d.asm.nb).apply(null,arguments)},s5=d._emscripten_run_in_main_runtime_thread_js=function(){return(s5=d._emscripten_run_in_main_runtime_thread_js=d.asm.ob).apply(null,arguments)},gm=d.__emscripten_call_on_thread=function(){return(gm=d.__emscripten_call_on_thread=d.asm.pb).apply(null,arguments)},fI=d._emscripten_tls_init=function(){return(fI=d._emscripten_tls_init=d.asm.qb).apply(null,arguments)},xm=d.__emscripten_thread_init=function(){return(xm=d.__emscripten_thread_init=d.asm.rb).apply(null,arguments)},bu=d.stackSave=function(){return(bu=d.stackSave=d.asm.sb).apply(null,arguments)},Ji=d.stackRestore=function(){return(Ji=d.stackRestore=d.asm.tb).apply(null,arguments)},Qi=d.stackAlloc=function(){return(Qi=d.stackAlloc=d.asm.ub).apply(null,arguments)},i5=d._emscripten_stack_set_limits=function(){return(i5=d._emscripten_stack_set_limits=d.asm.vb).apply(null,arguments)},o5=d._memalign=function(){return(o5=d._memalign=d.asm.wb).apply(null,arguments)},l5=d.__emscripten_allow_main_runtime_queued_calls=9808,eo=d.__emscripten_main_thread_futex=11432;d.cwrap=De,d.PThread=ke,d.PThread=ke,d.wasmMemory=ee,d.ExitStatus=vu;var $p;function vu(N){this.name="ExitStatus",this.message="Program terminated with exit("+N+")",this.status=N}ls=function N(){$p||bm(),$p||(ls=N)};function bm(N){if(N=N||f,rr>0)return;if(v){p(d),pu(),postMessage({cmd:"loaded"});return}if(Z0(),rr>0)return;function C(){$p||($p=!0,d.calledRun=!0,!oe&&(pu(),Y0(),p(d),d.onRuntimeInitialized&&d.onRuntimeInitialized(),wn()))}d.setStatus?(d.setStatus("Running..."),setTimeout(function(){setTimeout(function(){d.setStatus("")},1),C()},1)):C()}d.run=bm;function mI(N,C){if(!(C&&ie&&N===0)){if(!C&&v)throw postMessage({cmd:"exitProcess",returnCode:N}),new vu(N);ie||(ke.terminateAllThreads(),ge=N,hp(),d.onExit&&d.onExit(N),oe=!0),A(N,new vu(N))}}if(d.preInit)for(typeof d.preInit=="function"&&(d.preInit=[d.preInit]);d.preInit.length>0;)d.preInit.pop()();return v&&(ie=!1,ke.initWorker()),bm(),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)}),zI=wt((e,t)=>{var n=function(){var a=typeof document!="undefined"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename!="undefined"&&(a=a||__filename),function(r){r=r||{};var s=typeof r!="undefined"?r:{},i,o;s.ready=new Promise(function(K,te){i=K,o=te});var u={},l;for(l in s)s.hasOwnProperty(l)&&(u[l]=s[l]);var d=[],p="./this.program",c=function(K,te){throw te},h=!1,m=!1,f=!1,y=!1;h=typeof window=="object",m=typeof importScripts=="function",f=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",y=!h&&!f&&!m;var A="";function g(K){return s.locateFile?s.locateFile(K,A):A+K}var x,w,b,v,S,T;f?(m?A=wu().dirname(A)+"/":A=__dirname+"/",x=function(K,te){return S||(S=ao("fs")),T||(T=wu()),K=T.normalize(K),S.readFileSync(K,te?null:"utf8")},b=function(K){var te=x(K,!0);return te.buffer||(te=new Uint8Array(te)),q(te.buffer),te},process.argv.length>1&&(p=process.argv[1].replace(/\\/g,"/")),d=process.argv.slice(2),process.on("uncaughtException",function(K){if(!(K instanceof ym))throw K}),process.on("unhandledRejection",_a),c=function(K){process.exit(K)},s.inspect=function(){return"[Emscripten Module object]"}):y?(typeof read!="undefined"&&(x=function(K){return read(K)}),b=function(K){var te;return typeof readbuffer=="function"?new Uint8Array(readbuffer(K)):(te=read(K,"binary"),q(typeof te=="object"),te)},typeof scriptArgs!="undefined"?d=scriptArgs:typeof arguments!="undefined"&&(d=arguments),typeof quit=="function"&&(c=function(K){quit(K)}),typeof print!="undefined"&&(typeof console=="undefined"&&(console={}),console.log=print,console.warn=console.error=typeof printErr!="undefined"?printErr:print)):(h||m)&&(m?A=self.location.href:typeof document!="undefined"&&document.currentScript&&(A=document.currentScript.src),a&&(A=a),A.indexOf("blob:")!==0?A=A.substr(0,A.lastIndexOf("/")+1):A="",x=function(K){var te=new XMLHttpRequest;return te.open("GET",K,!1),te.send(null),te.responseText},m&&(b=function(K){var te=new XMLHttpRequest;return te.open("GET",K,!1),te.responseType="arraybuffer",te.send(null),new Uint8Array(te.response)}),w=function(K,te,Ee){var Ye=new XMLHttpRequest;Ye.open("GET",K,!0),Ye.responseType="arraybuffer",Ye.onload=function(){if(Ye.status==200||Ye.status==0&&Ye.response){te(Ye.response);return}Ee()},Ye.onerror=Ee,Ye.send(null)},v=function(K){document.title=K});var E=s.print||console.log.bind(console),$=s.printErr||console.warn.bind(console);for(l in u)u.hasOwnProperty(l)&&(s[l]=u[l]);u=null,s.arguments&&(d=s.arguments),s.thisProgram&&(p=s.thisProgram),s.quit&&(c=s.quit);var z;s.wasmBinary&&(z=s.wasmBinary);var O=s.noExitRuntime||!0;typeof WebAssembly!="object"&&_a("no native wasm support detected");var _,D=!1,U;function q(K,te){K||_a("Assertion failed: "+te)}function G(K){var te=s["_"+K];return q(te,"Cannot call unknown function "+K+", make sure it is exported"),te}function Q(K,te,Ee,Ye,Tt){var mt={string:function(Jn){var Tr=0;if(Jn!=null&&Jn!==0){var Fp=(Jn.length<<2)+1;Tr=yu(Fp),pe(Jn,Tr,Fp)}return Tr},array:function(Jn){var Tr=yu(Jn.length);return oe(Jn,Tr),Tr}};function He(Jn){return te==="string"?ie(Jn):te==="boolean"?Boolean(Jn):Jn}var qe=G(K),Qt=[],ir=0;if(Ye)for(var or=0;or=Ye);)++Tt;if(Tt-te>16&&K.subarray&&re)return re.decode(K.subarray(te,Tt));for(var mt="";te>10,56320|ir&1023)}}return mt}function ie(K,te){return K?ne(Te,K,te):""}function ee(K,te,Ee,Ye){if(!(Ye>0))return 0;for(var Tt=Ee,mt=Ee+Ye-1,He=0;He=55296&&qe<=57343){var Qt=K.charCodeAt(++He);qe=65536+((qe&1023)<<10)|Qt&1023}if(qe<=127){if(Ee>=mt)break;te[Ee++]=qe}else if(qe<=2047){if(Ee+1>=mt)break;te[Ee++]=192|qe>>6,te[Ee++]=128|qe&63}else if(qe<=65535){if(Ee+2>=mt)break;te[Ee++]=224|qe>>12,te[Ee++]=128|qe>>6&63,te[Ee++]=128|qe&63}else{if(Ee+3>=mt)break;te[Ee++]=240|qe>>18,te[Ee++]=128|qe>>12&63,te[Ee++]=128|qe>>6&63,te[Ee++]=128|qe&63}}return te[Ee]=0,Ee-Tt}function pe(K,te,Ee){return ee(K,Te,te,Ee)}function oe(K,te){Ne.set(K,te)}function ge(K,te){return K%te>0&&(K+=te-K%te),K}var he,Ne,Te,De,_e,ze,tt,nt,it;function Ze(K){he=K,s.HEAP8=Ne=new Int8Array(K),s.HEAP16=De=new Int16Array(K),s.HEAP32=ze=new Int32Array(K),s.HEAPU8=Te=new Uint8Array(K),s.HEAPU16=_e=new Uint16Array(K),s.HEAPU32=tt=new Uint32Array(K),s.HEAPF32=nt=new Float32Array(K),s.HEAPF64=it=new Float64Array(K)}var pt=s.INITIAL_MEMORY||16777216,Ue,bn=[],bt=[],Zn=[],Yt=[],vn=!1;bt.push({func:function(){xp()}});function Yn(){if(s.preRun)for(typeof s.preRun=="function"&&(s.preRun=[s.preRun]);s.preRun.length;)Oa(s.preRun.shift());Ir(bn)}function zn(){vn=!0,Ir(bt)}function on(){Ir(Zn)}function Jt(){if(s.postRun)for(typeof s.postRun=="function"&&(s.postRun=[s.postRun]);s.postRun.length;)oa(s.postRun.shift());Ir(Yt)}function Oa(K){bn.unshift(K)}function oa(K){Yt.unshift(K)}var la=0,wr=null,ar=null;function kr(K){la++,s.monitorRunDependencies&&s.monitorRunDependencies(la)}function Gi(K){if(la--,s.monitorRunDependencies&&s.monitorRunDependencies(la),la==0&&(wr!==null&&(clearInterval(wr),wr=null),ar)){var te=ar;ar=null,te()}}s.preloadedImages={},s.preloadedAudios={};function _a(K){s.onAbort&&s.onAbort(K),K+="",$(K),D=!0,U=1,K="abort("+K+"). Build with -s ASSERTIONS=1 for more info.";var te=new WebAssembly.RuntimeError(K);throw o(te),te}function cp(K,te){return String.prototype.startsWith?K.startsWith(te):K.indexOf(te)===0}var Z0="data:application/octet-stream;base64,";function pu(K){return cp(K,Z0)}var Y0="file://";function hp(K){return cp(K,Y0)}var wn="tfjs-backend-wasm.wasm";pu(wn)||(wn=g(wn));function fp(K){try{if(K==wn&&z)return new Uint8Array(z);if(b)return b(K);throw"both async and sync fetching of the wasm failed"}catch(te){_a(te)}}function J0(){if(!z&&(h||m)){if(typeof fetch=="function"&&!hp(wn))return fetch(wn,{credentials:"same-origin"}).then(function(K){if(!K.ok)throw"failed to load wasm binary file at '"+wn+"'";return K.arrayBuffer()}).catch(function(){return fp(wn)});if(w)return new Promise(function(K,te){w(wn,function(Ee){K(new Uint8Array(Ee))},te)})}return Promise.resolve().then(function(){return fp(wn)})}function rr(){var K={a:af};function te(He,qe){var Qt=He.exports;s.asm=Qt,_=s.asm.i,Ze(_.buffer),Ue=s.asm.o,Gi("wasm-instantiate")}kr("wasm-instantiate");function Ee(He){te(He.instance)}function Ye(He){return J0().then(function(qe){return WebAssembly.instantiate(qe,K)}).then(He,function(qe){$("failed to asynchronously prepare wasm: "+qe),_a(qe)})}function Tt(){return!z&&typeof WebAssembly.instantiateStreaming=="function"&&!pu(wn)&&!hp(wn)&&typeof fetch=="function"?fetch(wn,{credentials:"same-origin"}).then(function(He){var qe=WebAssembly.instantiateStreaming(He,K);return qe.then(Ee,function(Qt){return $("wasm streaming compile failed: "+Qt),$("falling back to ArrayBuffer instantiation"),Ye(Ee)})}):Ye(Ee)}if(s.instantiateWasm)try{var mt=s.instantiateWasm(K,te);return mt}catch(He){return $("Module.instantiateWasm callback failed with error: "+He),!1}return Tt().catch(o),{}}function Ir(K){for(;K.length>0;){var te=K.shift();if(typeof te=="function"){te(s);continue}var Ee=te.func;typeof Ee=="number"?te.arg===void 0?Ue.get(Ee)():Ue.get(Ee)(te.arg):Ee(te.arg===void 0?null:te.arg)}}function ls(){_a()}function Q0(K,te,Ee){Te.copyWithin(K,te,te+Ee)}function ef(){return Te.length}function sr(K){try{return _.grow(K-he.byteLength+65535>>>16),Ze(_.buffer),1}catch(te){}}function mp(K){var te=ef(),Ee=2147483648;if(K>Ee)return!1;for(var Ye=1;Ye<=4;Ye*=2){var Tt=te*(1+.2/Ye);Tt=Math.min(Tt,K+100663296);var mt=Math.min(Ee,ge(Math.max(K,Tt),65536)),He=sr(mt);if(He)return!0}return!1}var qi={mappings:{},buffers:[null,[],[]],printChar:function(K,te){var Ee=qi.buffers[K];te===0||te===10?((K===1?E:$)(ne(Ee,0)),Ee.length=0):Ee.push(te)},varargs:void 0,get:function(){qi.varargs+=4;var K=ze[qi.varargs-4>>2];return K},getStr:function(K){var te=ie(K);return te},get64:function(K,te){return K}};function yp(K){return 0}function tf(K,te,Ee,Ye,Tt){}function Ap(K,te,Ee,Ye){for(var Tt=0,mt=0;mt>2],qe=ze[te+(mt*8+4)>>2],Qt=0;Qt>2]=Tt,0}function kn(){return 6}function gp(K){return ze[Ep()>>2]=K,K}function nf(K){switch(K){case 30:return 16384;case 85:var te=2147483648;return te/16384;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return typeof navigator=="object"&&navigator.hardwareConcurrency||1}return gp(28),-1}var af={a:ls,d:Q0,e:mp,f:yp,c:tf,b:Ap,g:kn,h:nf},rf=rr(),xp=s.___wasm_call_ctors=function(){return(xp=s.___wasm_call_ctors=s.asm.j).apply(null,arguments)},Xi=s._init=function(){return(Xi=s._init=s.asm.k).apply(null,arguments)},cu=s._register_tensor=function(){return(cu=s._register_tensor=s.asm.l).apply(null,arguments)},sf=s._dispose_data=function(){return(sf=s._dispose_data=s.asm.m).apply(null,arguments)},of=s._dispose=function(){return(of=s._dispose=s.asm.n).apply(null,arguments)},lf=s._Abs=function(){return(lf=s._Abs=s.asm.p).apply(null,arguments)},ke=s._Add=function(){return(ke=s._Add=s.asm.q).apply(null,arguments)},uf=s._AddN=function(){return(uf=s._AddN=s.asm.r).apply(null,arguments)},df=s._All=function(){return(df=s._All=s.asm.s).apply(null,arguments)},pf=s._Any=function(){return(pf=s._Any=s.asm.t).apply(null,arguments)},cf=s._ArgMax=function(){return(cf=s._ArgMax=s.asm.u).apply(null,arguments)},hf=s._AvgPool=function(){return(hf=s._AvgPool=s.asm.v).apply(null,arguments)},us=s._BatchMatMul=function(){return(us=s._BatchMatMul=s.asm.w).apply(null,arguments)},ff=s._Ceil=function(){return(ff=s._Ceil=s.asm.x).apply(null,arguments)},mf=s._ClipByValue=function(){return(mf=s._ClipByValue=s.asm.y).apply(null,arguments)},yf=s._Conv2D=function(){return(yf=s._Conv2D=s.asm.z).apply(null,arguments)},Af=s._Conv2DBackpropInput=function(){return(Af=s._Conv2DBackpropInput=s.asm.A).apply(null,arguments)},gf=s._Cos=function(){return(gf=s._Cos=s.asm.B).apply(null,arguments)},xf=s._CropAndResize=function(){return(xf=s._CropAndResize=s.asm.C).apply(null,arguments)},bf=s._Cumsum=function(){return(bf=s._Cumsum=s.asm.D).apply(null,arguments)},vf=s._DepthToSpace=function(){return(vf=s._DepthToSpace=s.asm.E).apply(null,arguments)},wf=s._DepthwiseConv2dNative=function(){return(wf=s._DepthwiseConv2dNative=s.asm.F).apply(null,arguments)},Sr=s._Equal=function(){return(Sr=s._Equal=s.asm.G).apply(null,arguments)},hu=s._Exp=function(){return(hu=s._Exp=s.asm.H).apply(null,arguments)},fu=s._FlipLeftRight=function(){return(fu=s._FlipLeftRight=s.asm.I).apply(null,arguments)},kf=s._Floor=function(){return(kf=s._Floor=s.asm.J).apply(null,arguments)},If=s._FloorDiv=function(){return(If=s._FloorDiv=s.asm.K).apply(null,arguments)},Sf=s._FusedBatchNorm=function(){return(Sf=s._FusedBatchNorm=s.asm.L).apply(null,arguments)},Nf=s._FusedConv2D=function(){return(Nf=s._FusedConv2D=s.asm.M).apply(null,arguments)},Tf=s._FusedDepthwiseConv2D=function(){return(Tf=s._FusedDepthwiseConv2D=s.asm.N).apply(null,arguments)},Le=s._Gather=function(){return(Le=s._Gather=s.asm.O).apply(null,arguments)},Ef=s._GatherNd=function(){return(Ef=s._GatherNd=s.asm.P).apply(null,arguments)},Cf=s._Greater=function(){return(Cf=s._Greater=s.asm.Q).apply(null,arguments)},Rf=s._GreaterEqual=function(){return(Rf=s._GreaterEqual=s.asm.R).apply(null,arguments)},Mf=s._LeakyRelu=function(){return(Mf=s._LeakyRelu=s.asm.S).apply(null,arguments)},Ff=s._Less=function(){return(Ff=s._Less=s.asm.T).apply(null,arguments)},$f=s._LessEqual=function(){return($f=s._LessEqual=s.asm.U).apply(null,arguments)},mu=s._Log=function(){return(mu=s._Log=s.asm.V).apply(null,arguments)},bp=s._LogicalAnd=function(){return(bp=s._LogicalAnd=s.asm.W).apply(null,arguments)},vp=s._Max=function(){return(vp=s._Max=s.asm.X).apply(null,arguments)},Df=s._MaxPool=function(){return(Df=s._MaxPool=s.asm.Y).apply(null,arguments)},zf=s._Maximum=function(){return(zf=s._Maximum=s.asm.Z).apply(null,arguments)},Of=s._Mean=function(){return(Of=s._Mean=s.asm._).apply(null,arguments)},_f=s._Min=function(){return(_f=s._Min=s.asm.$).apply(null,arguments)},Pf=s._Minimum=function(){return(Pf=s._Minimum=s.asm.aa).apply(null,arguments)},Lf=s._MirrorPad=function(){return(Lf=s._MirrorPad=s.asm.ba).apply(null,arguments)},Wf=s._Multiply=function(){return(Wf=s._Multiply=s.asm.ca).apply(null,arguments)},et=s._Neg=function(){return(et=s._Neg=s.asm.da).apply(null,arguments)},Bf=s._NonMaxSuppressionV3=function(){return(Bf=s._NonMaxSuppressionV3=s.asm.ea).apply(null,arguments)},Vf=s._NonMaxSuppressionV4=function(){return(Vf=s._NonMaxSuppressionV4=s.asm.fa).apply(null,arguments)},jf=s._NonMaxSuppressionV5=function(){return(jf=s._NonMaxSuppressionV5=s.asm.ga).apply(null,arguments)},Ki=s._NotEqual=function(){return(Ki=s._NotEqual=s.asm.ha).apply(null,arguments)},wp=s._OneHot=function(){return(wp=s._OneHot=s.asm.ia).apply(null,arguments)},kp=s._PadV2=function(){return(kp=s._PadV2=s.asm.ja).apply(null,arguments)},Ip=s._Pow=function(){return(Ip=s._Pow=s.asm.ka).apply(null,arguments)},Uf=s._Prelu=function(){return(Uf=s._Prelu=s.asm.la).apply(null,arguments)},Hf=s._Prod=function(){return(Hf=s._Prod=s.asm.ma).apply(null,arguments)},Sp=s._RealDiv=function(){return(Sp=s._RealDiv=s.asm.na).apply(null,arguments)},Gf=s._Relu=function(){return(Gf=s._Relu=s.asm.oa).apply(null,arguments)},Np=s._Relu6=function(){return(Np=s._Relu6=s.asm.pa).apply(null,arguments)},Nr=s._ResizeBilinear=function(){return(Nr=s._ResizeBilinear=s.asm.qa).apply(null,arguments)},qf=s._Reverse=function(){return(qf=s._Reverse=s.asm.ra).apply(null,arguments)},Xf=s._RotateWithOffset=function(){return(Xf=s._RotateWithOffset=s.asm.sa).apply(null,arguments)},Jg=s._Round=function(){return(Jg=s._Round=s.asm.ta).apply(null,arguments)},Tp=s._Rsqrt=function(){return(Tp=s._Rsqrt=s.asm.ua).apply(null,arguments)},Kf=s._ScatterNd=function(){return(Kf=s._ScatterNd=s.asm.va).apply(null,arguments)},Zf=s._SelectV2=function(){return(Zf=s._SelectV2=s.asm.wa).apply(null,arguments)},Yf=s._Sigmoid=function(){return(Yf=s._Sigmoid=s.asm.xa).apply(null,arguments)},Jf=s._Sin=function(){return(Jf=s._Sin=s.asm.ya).apply(null,arguments)},Qf=s._Softmax=function(){return(Qf=s._Softmax=s.asm.za).apply(null,arguments)},em=s._Sqrt=function(){return(em=s._Sqrt=s.asm.Aa).apply(null,arguments)},tm=s._Square=function(){return(tm=s._Square=s.asm.Ba).apply(null,arguments)},nm=s._SquaredDifference=function(){return(nm=s._SquaredDifference=s.asm.Ca).apply(null,arguments)},am=s._Step=function(){return(am=s._Step=s.asm.Da).apply(null,arguments)},rm=s._StridedSlice=function(){return(rm=s._StridedSlice=s.asm.Ea).apply(null,arguments)},sm=s._Sub=function(){return(sm=s._Sub=s.asm.Fa).apply(null,arguments)},im=s._Sum=function(){return(im=s._Sum=s.asm.Ga).apply(null,arguments)},om=s._Tan=function(){return(om=s._Tan=s.asm.Ha).apply(null,arguments)},lm=s._Tanh=function(){return(lm=s._Tanh=s.asm.Ia).apply(null,arguments)},um=s._Tile=function(){return(um=s._Tile=s.asm.Ja).apply(null,arguments)},dm=s._TopK=function(){return(dm=s._TopK=s.asm.Ka).apply(null,arguments)},pm=s._Transform=function(){return(pm=s._Transform=s.asm.La).apply(null,arguments)},cm=s._Transpose=function(){return(cm=s._Transpose=s.asm.Ma).apply(null,arguments)},hm=s.__FusedMatMul=function(){return(hm=s.__FusedMatMul=s.asm.Na).apply(null,arguments)},fm=s._malloc=function(){return(fm=s._malloc=s.asm.Oa).apply(null,arguments)},mm=s._free=function(){return(mm=s._free=s.asm.Pa).apply(null,arguments)},Ep=s.___errno_location=function(){return(Ep=s.___errno_location=s.asm.Qa).apply(null,arguments)},Cp=s.stackSave=function(){return(Cp=s.stackSave=s.asm.Ra).apply(null,arguments)},Rp=s.stackRestore=function(){return(Rp=s.stackRestore=s.asm.Sa).apply(null,arguments)},yu=s.stackAlloc=function(){return(yu=s.stackAlloc=s.asm.Ta).apply(null,arguments)};s.cwrap=Y;var Zi;function ym(K){this.name="ExitStatus",this.message="Program terminated with exit("+K+")",this.status=K}ar=function K(){Zi||Au(),Zi||(ar=K)};function Au(K){if(K=K||d,la>0||(Yn(),la>0))return;function te(){Zi||(Zi=!0,s.calledRun=!0,!D&&(zn(),on(),i(s),s.onRuntimeInitialized&&s.onRuntimeInitialized(),Jt()))}s.setStatus?(s.setStatus("Running..."),setTimeout(function(){setTimeout(function(){s.setStatus("")},1),te()},1)):te()}if(s.run=Au,s.preInit)for(typeof s.preInit=="function"&&(s.preInit=[s.preInit]);s.preInit.length>0;)s.preInit.pop()();return Au(),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)}),OI=wt((e,t)=>{(function(n,a,r){function s(l){var d=this,p=u();d.next=function(){var c=2091639*d.s0+d.c*23283064365386963e-26;return d.s0=d.s1,d.s1=d.s2,d.s2=c-(d.c=c|0)},d.c=1,d.s0=p(" "),d.s1=p(" "),d.s2=p(" "),d.s0-=p(l),d.s0<0&&(d.s0+=1),d.s1-=p(l),d.s1<0&&(d.s1+=1),d.s2-=p(l),d.s2<0&&(d.s2+=1),p=null}function i(l,d){return d.c=l.c,d.s0=l.s0,d.s1=l.s1,d.s2=l.s2,d}function o(l,d){var p=new s(l),c=d&&d.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,c&&(typeof c=="object"&&i(c,p),h.state=function(){return i(p,{})}),h}function u(){var l=4022871197,d=function(p){p=String(p);for(var c=0;c>>0,h-=l,h*=l,l=h>>>0,h-=l,l+=h*4294967296}return(l>>>0)*23283064365386963e-26};return d}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.alea=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),_I=wt((e,t)=>{(function(n,a,r){function s(u){var l=this,d="";l.x=0,l.y=0,l.z=0,l.w=0,l.next=function(){var c=l.x^l.x<<11;return l.x=l.y,l.y=l.z,l.z=l.w,l.w^=l.w>>>19^c^c>>>8},u===(u|0)?l.x=u:d+=u;for(var p=0;p>>0)/4294967296};return c.double=function(){do var h=d.next()>>>11,m=(d.next()>>>0)/4294967296,f=(h+m)/(1<<21);while(f===0);return f},c.int32=d.next,c.quick=c,p&&(typeof p=="object"&&i(p,d),c.state=function(){return i(d,{})}),c}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.xor128=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),PI=wt((e,t)=>{(function(n,a,r){function s(u){var l=this,d="";l.next=function(){var c=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^(c^c<<1))|0},l.x=0,l.y=0,l.z=0,l.w=0,l.v=0,u===(u|0)?l.x=u:d+=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 d=new s(u),p=l&&l.state,c=function(){return(d.next()>>>0)/4294967296};return c.double=function(){do var h=d.next()>>>11,m=(d.next()>>>0)/4294967296,f=(h+m)/(1<<21);while(f===0);return f},c.int32=d.next,c.quick=c,p&&(typeof p=="object"&&i(p,d),c.state=function(){return i(d,{})}),c}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.xorwow=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),LI=wt((e,t)=>{(function(n,a,r){function s(u){var l=this;l.next=function(){var p=l.x,c=l.i,h,m,f;return h=p[c],h^=h>>>7,m=h^h<<24,h=p[c+1&7],m^=h^h>>>10,h=p[c+3&7],m^=h^h>>>3,h=p[c+4&7],m^=h^h<<7,h=p[c+7&7],h=h^h<<13,m^=h^h<<9,p[c]=m,l.i=c+1&7,m};function d(p,c){var h,m,f=[];if(c===(c|0))m=f[0]=c;else for(c=""+c,h=0;h0;--h)p.next()}d(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 d=new s(u),p=l&&l.state,c=function(){return(d.next()>>>0)/4294967296};return c.double=function(){do var h=d.next()>>>11,m=(d.next()>>>0)/4294967296,f=(h+m)/(1<<21);while(f===0);return f},c.int32=d.next,c.quick=c,p&&(p.x&&i(p,d),c.state=function(){return i(d,{})}),c}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.xorshift7=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),WI=wt((e,t)=>{(function(n,a,r){function s(u){var l=this;l.next=function(){var p=l.w,c=l.X,h=l.i,m,f;return l.w=p=p+1640531527|0,f=c[h+34&127],m=c[h=h+1&127],f^=f<<13,m^=m<<17,f^=f>>>15,m^=m>>>12,f=c[h]=f^m,l.i=h,f+(p^p>>>16)|0};function d(p,c){var h,m,f,y,A,g=[],x=128;for(c===(c|0)?(m=c,c=null):(c=c+"\0",m=0,x=Math.max(x,c.length)),f=0,y=-32;y>>15,m^=m<<4,m^=m>>>13,y>=0&&(A=A+1640531527|0,h=g[y&127]^=m+A,f=h==0?f+1:0);for(f>=128&&(g[(c&&c.length||0)&127]=-1),f=127,y=4*128;y>0;--y)m=g[f+34&127],h=g[f=f+1&127],m^=m<<13,h^=h<<17,m^=m>>>15,h^=h>>>12,g[f]=m^h;p.w=A,p.X=g,p.i=f}d(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 d=new s(u),p=l&&l.state,c=function(){return(d.next()>>>0)/4294967296};return c.double=function(){do var h=d.next()>>>11,m=(d.next()>>>0)/4294967296,f=(h+m)/(1<<21);while(f===0);return f},c.int32=d.next,c.quick=c,p&&(p.X&&i(p,d),c.state=function(){return i(d,{})}),c}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.xor4096=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),BI=wt((e,t)=>{(function(n,a,r){function s(u){var l=this,d="";l.next=function(){var c=l.b,h=l.c,m=l.d,f=l.a;return c=c<<25^c>>>7^h,h=h-m|0,m=m<<24^m>>>8^f,f=f-c|0,l.b=c=c<<20^c>>>12^h,l.c=h=h-m|0,l.d=m<<16^h>>>16^f,l.a=f-c|0},l.a=0,l.b=0,l.c=2654435769|0,l.d=1367130551,u===Math.floor(u)?(l.a=u/4294967296|0,l.b=u|0):d+=u;for(var p=0;p>>0)/4294967296};return c.double=function(){do var h=d.next()>>>11,m=(d.next()>>>0)/4294967296,f=(h+m)/(1<<21);while(f===0);return f},c.int32=d.next,c.quick=c,p&&(typeof p=="object"&&i(p,d),c.state=function(){return i(d,{})}),c}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.tychei=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),VI=wt((e,t)=>{(function(n,a,r){var s=256,i=6,o=52,u="random",l=r.pow(s,i),d=r.pow(2,o),p=d*2,c=s-1,h;function m(b,v,S){var T=[];v=v==!0?{entropy:!0}:v||{};var E=g(A(v.entropy?[b,w(a)]:b==null?x():b,3),T),$=new f(T),z=function(){for(var O=$.g(i),_=l,D=0;O=p;)O/=2,_/=2,D>>>=1;return(O+D)/_};return z.int32=function(){return $.g(4)|0},z.quick=function(){return $.g(4)/4294967296},z.double=z,g(w($.S),a),(v.pass||S||function(O,_,D,U){return U&&(U.S&&y(U,$),O.state=function(){return y($,{})}),D?(r[u]=O,_):O})(z,E,"global"in v?v.global:this==r,v.state)}function f(b){var v,S=b.length,T=this,E=0,$=T.i=T.j=0,z=T.S=[];for(S||(b=[S++]);E{var n=OI(),a=_I(),r=PI(),s=LI(),i=WI(),o=BI(),u=VI();u.alea=n,u.xor128=a,u.xorwow=r,u.xorshift7=s,u.xor4096=i,u.tychei=o,t.exports=u}),jI=wt(()=>{}),wm={};Fe(wm,{bin:()=>N5,browser:()=>F5,default:()=>UI,dependencies:()=>M5,description:()=>g5,devDependencies:()=>C5,jsdelivr:()=>w5,license:()=>E5,main:()=>b5,miniprogram:()=>S5,module:()=>v5,name:()=>y5,private:()=>x5,repository:()=>T5,scripts:()=>R5,types:()=>I5,unpkg:()=>k5,version:()=>A5});var y5="@tensorflow/tfjs",A5="3.6.0",g5="An open-source machine learning framework.",x5=!1,b5="dist/tf.node.js",v5="dist/index.js",w5="dist/tf.min.js",k5="dist/tf.min.js",I5="dist/index.d.ts",S5="dist/miniprogram",N5={"tfjs-custom-module":"dist/tools/custom_module/cli.js"},T5={type:"git",url:"https://github.com/tensorflow/tfjs.git"},E5="Apache-2.0",C5={"@babel/core":"^7.9.0","@babel/polyfill":"^7.10.4","@babel/preset-env":"^7.9.5","@rollup/plugin-commonjs":"^11.0.2","@rollup/plugin-node-resolve":"^7.1.1","@rollup/plugin-typescript":"^3.0.0","@types/argparse":"^1.0.38","@types/jasmine":"2.8.7","@types/node":"~10.17.50","@types/shelljs":"^0.8.4","@types/yargs":"^15.0.7","clang-format":"~1.2.2",commander:"~2.14.1",jasmine:"3.1.0","jasmine-core":"~3.1.0",karma:"~6.3.2","karma-browserstack-launcher":"~1.6.0","karma-chrome-launcher":"~2.2.0","karma-firefox-launcher":"~1.1.0","karma-jasmine":"~1.1.1","karma-typescript":"~5.5.1","karma-typescript-es6-transform":"^5.5.1","npm-run-all":"~4.1.3",rimraf:"~2.6.2",rollup:"~2.3.2","rollup-plugin-babel":"^4.4.0","rollup-plugin-terser":"~7.0.2","rollup-plugin-visualizer":"~4.2.2",shelljs:"~0.8.1","ts-node":"~8.8.2",tslint:"~5.11.0","tslint-no-circular-imports":"~0.5.0",typescript:"3.5.3",yalc:"1.0.0-pre.50"},R5={build:"tsc && yarn build-cli && yarn bundle","build-ci":"tsc && yarn build-cli && yarn bundle-ci",bundle:"rollup -c","bundle-ci":"rollup -c --ci","build-core":"cd ../tfjs-core && yarn && yarn build","build-core-ci":"cd ../tfjs-core && yarn && yarn build-ci","build-layers":"cd ../tfjs-layers && yarn && yarn build","build-layers-ci":"cd ../tfjs-layers && yarn && yarn build-ci","build-converter":"cd ../tfjs-converter && yarn && yarn build","build-converter-ci":"cd ../tfjs-converter && yarn && yarn build-ci","build-data":"cd ../tfjs-data && yarn && yarn build","build-data-ci":"cd ../tfjs-data && yarn && yarn build-ci","build-backend-cpu":"cd ../tfjs-backend-cpu && yarn && yarn build","build-backend-cpu-ci":"cd ../tfjs-backend-cpu && yarn && yarn build-ci","build-backend-webgl":"cd ../tfjs-backend-webgl && yarn && yarn build","build-backend-webgl-ci":"cd ../tfjs-backend-webgl && yarn && yarn build-ci","build-deps":"yarn build-core && yarn build-layers && yarn build-converter && yarn build-data && yarn build-backend-cpu && yarn build-backend-webgl","build-deps-ci":"yarn build-core-ci && yarn build-layers-ci && yarn build-converter-ci && yarn build-data-ci && yarn build-backend-cpu-ci && yarn build-backend-webgl-ci","build-cli":"tsc --project ./tools/custom_module/tsconfig.json && chmod +x ./dist/tools/custom_module/cli.js","run-custom-build":"ts-node -s ./tools/custom_module/cli.ts","build-npm":"./scripts/build-npm.sh","link-local":"yalc link","publish-local":"yarn build-npm && yalc push","publish-npm":"npm publish",lint:"tslint -p . -t verbose",coverage:"KARMA_COVERAGE=1 karma start --browsers='Chrome' --singleRun",test:"yarn && yarn build-deps && yarn build && karma start","test-dev":"karma start","test-tools":"ts-node --project ./tools/custom_module/tsconfig.json run_tools_tests.ts","test-ci":"./scripts/test-ci.sh"},M5={"@tensorflow/tfjs-backend-cpu":"3.6.0","@tensorflow/tfjs-backend-webgl":"3.6.0","@tensorflow/tfjs-converter":"3.6.0","@tensorflow/tfjs-core":"3.6.0","@tensorflow/tfjs-data":"3.6.0","@tensorflow/tfjs-layers":"3.6.0",argparse:"^1.0.10",chalk:"^4.1.0","core-js":"3","regenerator-runtime":"^0.13.5",yargs:"^16.0.3"},F5={"node-fetch":!1,util:!1,crypto:!1},UI={name:y5,version:A5,description:g5,private:x5,main:b5,module:v5,jsdelivr:w5,unpkg:k5,types:I5,miniprogram:S5,bin:N5,repository:T5,license:E5,devDependencies:C5,scripts:R5,dependencies:M5,browser:F5},km={};Fe(km,{browser:()=>Z5,default:()=>HI,dependencies:()=>K5,description:()=>z5,devDependencies:()=>q5,engines:()=>U5,jsdelivr:()=>P5,"jsnext:main":()=>B5,license:()=>G5,main:()=>_5,miniprogram:()=>j5,module:()=>V5,name:()=>$5,private:()=>O5,repository:()=>H5,scripts:()=>X5,sideEffects:()=>Y5,types:()=>W5,unpkg:()=>L5,version:()=>D5});var $5="@tensorflow/tfjs-core",D5="3.6.0",z5="Hardware-accelerated JavaScript library for machine intelligence",O5=!1,_5="dist/tf-core.node.js",P5="dist/tf-core.min.js",L5="dist/tf-core.min.js",W5="dist/index.d.ts",B5="dist/index.js",V5="dist/index.js",j5="dist/miniprogram",U5={yarn:">= 1.3.2"},H5={type:"git",url:"https://github.com/tensorflow/tfjs-core.git"},G5="Apache-2.0",q5={"@bazel/bazelisk":"^1.3.0","@bazel/typescript":"^0.27.8","@rollup/plugin-commonjs":"^11.0.2","@rollup/plugin-node-resolve":"^7.1.1","@rollup/plugin-typescript":"^3.0.0","@tensorflow/tfjs-backend-cpu":"link:../tfjs-backend-cpu","@types/jasmine":"~3.0.0","@types/node":"~9.6.0","@types/node-fetch":"~2.1.2","clang-format":"~1.2.4",jasmine:"~3.1.0","jasmine-core":"~3.1.0",karma:"6.3.2","karma-browserstack-launcher":"~1.6.0","karma-chrome-launcher":"~3.1.0","karma-jasmine":"~4.0.1","karma-typescript":"~5.5.1","npm-run-all":"~4.1.3",rimraf:"~2.6.2",rollup:"~2.3.2","rollup-plugin-terser":"~5.3.0","rollup-plugin-visualizer":"~3.3.2",shelljs:"~0.8.3","ts-node":"~8.8.2",tslint:"~5.11.0","tslint-no-circular-imports":"~0.5.0",typescript:"3.5.3",yalc:"~1.0.0-pre.21",yargs:"~13.2.2"},X5={"build-ci":"./scripts/enumerate-tests.js --ci && tsc && yarn bundle-ci && yarn build-test-snippets",build:"node ./scripts/enumerate-tests.js && tsc && yarn bundle",bundle:"rollup -c","bundle-ci":"rollup -c --ci","build-npm":"./scripts/build-npm.sh","build-deps":"yarn build && yarn build-cpu-backend","build-cpu-backend":"cd ../tfjs-backend-cpu && yarn && yarn build","build-cpu-backend-ci":"cd ../tfjs-backend-cpu && yarn && yarn build-ci","build:bazel":"bazelisk build //...","build-test-snippets":"yarn tsc --project ./scripts/test_snippets/tsconfig.json","format-all":"clang-format -i -style=Google --glob=src/**/*.ts","link-local":"yalc link","publish-local":"rimraf dist/ && yarn build && rollup -c && yalc push","publish-npm":"npm publish",lint:"tslint -p . -t verbose",coverage:"KARMA_COVERAGE=1 karma start --browsers='Chrome' --singleRun",test:"yarn && yarn build-deps && karma start","test-dev":"karma start","test-ci":"./scripts/test-ci.sh","test-webworker":"karma start --worker","run-browserstack":"karma start --browserstack","test-bundle-size":"./scripts/test-bundle-size.js","test-node":"rimraf dist/ && yarn build-deps && yarn build && ts-node --transpile-only --skip-ignore -P tsconfig.test.json dist/test_node.js","test-node-dev":"tsc && ts-node --transpile-only --skip-ignore -P tsconfig.test.json dist/test_node.js","test-node-ci":"ts-node --transpile-only -P tsconfig.test.json dist/test_node.js","test-async-backends":"rimraf dist/ && yarn build && ts-node --transpile-only -P tsconfig.test.json dist/test_async_backends.js","test-async-backends-ci":"ts-node --transpile-only -P tsconfig.test.json dist/test_async_backends.js","test-snippets":"yarn build && yarn build-cpu-backend && ts-node -P tsconfig.test.json ./scripts/test_snippets/test_snippets.ts","test-snippets-ci":"ts-node -P tsconfig.test.json ./scripts/test_snippets/test_snippets.ts"},K5={"@types/offscreencanvas":"~2019.3.0","@types/seedrandom":"2.4.27","@types/webgl-ext":"0.0.30","node-fetch":"~2.6.1",seedrandom:"2.4.3"},Z5={"node-fetch":!1,util:!1,crypto:!1,worker_threads:!1},Y5=["./dist/index.js","./dist/engine.js","./dist/tensor.js","./dist/base_side_effects.js","./dist/flags.js","./dist/platforms/*.js","./dist/register_all_gradients.js","./dist/public/chained_ops/*.js","./dist/io/*.js"],HI={name:$5,version:D5,description:z5,private:O5,main:_5,jsdelivr:P5,unpkg:L5,types:W5,"jsnext:main":B5,module:V5,miniprogram:j5,engines:U5,repository:H5,license:G5,devDependencies:q5,scripts:X5,dependencies:K5,browser:Z5,sideEffects:Y5},Im={};Fe(Im,{browser:()=>fx,default:()=>GI,dependencies:()=>hx,description:()=>ex,devDependencies:()=>dx,jsdelivr:()=>ax,"jsnext:main":()=>ix,license:()=>ux,main:()=>nx,miniprogram:()=>lx,module:()=>ox,name:()=>J5,peerDependencies:()=>cx,private:()=>tx,scripts:()=>px,types:()=>sx,unpkg:()=>rx,version:()=>Q5});var J5="@tensorflow/tfjs-data",Q5="3.6.0",ex="TensorFlow Data API in JavaScript",tx=!1,nx="dist/tf-data.node.js",ax="dist/tf-data.min.js",rx="dist/tf-data.min.js",sx="dist/index.d.ts",ix="dist/index.js",ox="dist/index.js",lx="dist/miniprogram",ux="Apache-2.0",dx={"@rollup/plugin-commonjs":"^11.0.2","@rollup/plugin-node-resolve":"^7.1.1","@rollup/plugin-typescript":"^3.0.0","@tensorflow/tfjs-backend-cpu":"3.6.0","@tensorflow/tfjs-core":"3.6.0","@tensorflow/tfjs-layers":"3.6.0","@types/jasmine":"~2.5.53","@types/seedrandom":"^2.4.27","@types/utf8":"~2.1.6","clang-format":"~1.2.2","http-server":"~0.12.3",jasmine:"3.1.0","jasmine-core":"~3.1.0",karma:"~6.3.1","karma-chrome-launcher":"~2.2.0","karma-firefox-launcher":"~1.1.0","karma-jasmine":"~1.1.1","karma-typescript":"~5.5.1","karma-typescript-es6-transform":"^5.0.2",nyc:"^15.1.0",rimraf:"~2.6.2",rollup:"~2.3.2","rollup-plugin-terser":"~7.0.2","rollup-plugin-visualizer":"~3.3.2","ts-node":"~7.0.0",tslint:"~6.1.3","tslint-no-circular-imports":"^0.7.0",typescript:"3.5.3",yalc:"^1.0.0-pre.50"},px={build:"tsc && yarn bundle","build-ci":"tsc && yarn bundle-ci",bundle:"rollup -c","bundle-ci":"rollup -c --ci","build-core":"cd ../tfjs-core && yarn && yarn build","build-core-ci":"cd ../tfjs-core && yarn && yarn build-ci","build-layers":"cd ../tfjs-layers && yarn && yarn build","build-backend-cpu":"cd ../tfjs-backend-cpu && yarn && yarn build","build-backend-cpu-ci":"cd ../tfjs-backend-cpu && yarn && yarn build-ci","build-layers-ci":"cd ../tfjs-layers && yarn && yarn build-ci","build-deps":"yarn build-core && yarn build-layers && yarn build-backend-cpu","build-deps-ci":"yarn build-core-ci && yarn build-layers-ci && yarn build-backend-cpu-ci","build-npm":"./scripts/build-npm.sh","link-local":"yalc link","publish-local":"rimraf dist/ && yarn build-npm && yalc push","publish-npm":"npm publish",test:"yarn && yarn build-deps && yarn build && ts-node --transpile-only --project tsconfig.test.json src/test_node.ts","test-dev":"tsc && ts-node --transpile-only --project tsconfig.test.json src/test_node.ts","test-browsers":"karma start --browsers='Chrome,Firefox'","test-ci":"ts-node --transpile-only --skip-ignore -P tsconfig.test.json src/test_node.ts","test-snippets":"yarn && yarn build-deps && yarn build && ts-node --skip-ignore --project tsconfig.test.json ./scripts/test_snippets.ts","test-snippets-ci":"ts-node --skip-ignore --project tsconfig.test.json ./scripts/test_snippets.ts",coverage:"yarn nyc yarn ts-node --transpile-only -P tsconfig.test.json src/test_node.ts",lint:"tslint -p . -t verbose"},cx={"@tensorflow/tfjs-core":"3.6.0",seedrandom:"~2.4.3"},hx={"@types/node-fetch":"^2.1.2","node-fetch":"~2.6.1"},fx={fs:!1,"node-fetch":!1,string_decoder:!1,crypto:!1},GI={name:J5,version:Q5,description:ex,private:tx,main:nx,jsdelivr:ax,unpkg:rx,types:sx,"jsnext:main":ix,module:ox,miniprogram:lx,license:ux,devDependencies:dx,scripts:px,peerDependencies:cx,dependencies:hx,browser:fx},Sm={};Fe(Sm,{default:()=>qI,description:()=>Ax,devDependencies:()=>Tx,jsdelivr:()=>Ix,"jsnext:main":()=>wx,license:()=>gx,main:()=>bx,miniprogram:()=>Nx,module:()=>kx,name:()=>mx,peerDependencies:()=>Cx,private:()=>xx,scripts:()=>Ex,types:()=>vx,unpkg:()=>Sx,version:()=>yx});var mx="@tensorflow/tfjs-layers",yx="3.6.0",Ax="TensorFlow layers API in JavaScript",gx="Apache-2.0 AND MIT",xx=!1,bx="dist/tf-layers.node.js",vx="dist/index.d.ts",wx="dist/index.js",kx="dist/index.js",Ix="dist/tf-layers.min.js",Sx="dist/tf-layers.min.js",Nx="dist/miniprogram",Tx={"@babel/polyfill":"^7.8.7","@rollup/plugin-commonjs":"^11.0.2","@rollup/plugin-node-resolve":"^7.1.1","@rollup/plugin-typescript":"^3.0.0","@tensorflow/tfjs-backend-cpu":"3.6.0","@tensorflow/tfjs-backend-webgl":"3.6.0","@tensorflow/tfjs-core":"3.6.0","@types/jasmine":"~2.5.53","clang-format":"~1.2.2","http-server":"~0.12.3",jasmine:"~3.1.0","jasmine-core":"~3.1.0",karma:"~6.3.1","karma-browserstack-launcher":"~1.6.0","karma-chrome-launcher":"~2.2.0","karma-firefox-launcher":"~1.1.0","karma-jasmine":"~1.1.1","karma-typescript":"~5.5.1","karma-typescript-es6-transform":"^5.0.2",rimraf:"~2.6.2",rollup:"~2.3.2","rollup-plugin-terser":"~7.0.2","rollup-plugin-visualizer":"~3.3.2","ts-node":"~8.8.2",tslint:"~6.1.3","tslint-no-circular-imports":"^0.7.0",typescript:"3.5.3",yalc:"~1.0.0-pre.50"},Ex={prep:"yarn install && yarn build-ci",build:"tsc && yarn bundle","build-ci":"tsc && yarn bundle-ci",bundle:"rollup -c","bundle-ci":"rollup -c --ci","build-core":"cd ../tfjs-core && yarn && yarn build","build-backend-cpu":"cd ../tfjs-backend-cpu && yarn && yarn build","build-backend-cpu-ci":"cd ../tfjs-backend-cpu && yarn && yarn build-ci","build-backend-webgl":"cd ../tfjs-backend-webgl && yarn && yarn build","build-backend-webgl-ci":"cd ../tfjs-backend-webgl && yarn && yarn build-ci","build-core-ci":"cd ../tfjs-core && yarn && yarn build-ci","build-deps":"yarn build-core && yarn build-backend-cpu && yarn build-backend-webgl","build-deps-ci":"yarn build-core-ci && yarn build-backend-cpu-ci && yarn build-backend-webgl-ci","build-npm":"./scripts/build-npm.sh",format:"./tools/clang_format_ts.sh","link-local":"yalc link","publish-local":"yarn build-npm && yalc push","publish-npm":"npm publish",coverage:"KARMA_COVERAGE=1 karma start --browsers='Chrome' --singleRun",test:"yarn && yarn build-deps && karma start","test-dev":"karma start","test-ci":"./scripts/test-ci.sh","test-snippets":"yarn && yarn build-deps && yarn build && ts-node --skip-ignore -s ./scripts/test_snippets.ts","test-snippets-ci":"ts-node --skip-ignore -s ./scripts/test_snippets.ts","run-browserstack":"karma start --browsers='bs_chrome_mac' --singleRun --reporters='dots,karma-typescript'",lint:"tslint -p . -t verbose"},Cx={"@tensorflow/tfjs-core":"3.6.0"},qI={name:mx,version:yx,description:Ax,license:gx,private:xx,main:bx,types:vx,"jsnext:main":wx,module:kx,jsdelivr:Ix,unpkg:Sx,miniprogram:Nx,devDependencies:Tx,scripts:Ex,peerDependencies:Cx},Nm={};Fe(Nm,{default:()=>XI,description:()=>Fx,devDependencies:()=>jx,jsdelivr:()=>Px,"jsnext:main":()=>Dx,license:()=>Bx,main:()=>$x,miniprogram:()=>Lx,module:()=>zx,name:()=>Rx,peerDependencies:()=>Vx,repository:()=>Wx,scripts:()=>Ux,types:()=>Ox,unpkg:()=>_x,version:()=>Mx});var Rx="@tensorflow/tfjs-converter",Mx="3.6.0",Fx="Tensorflow model converter for javascript",$x="dist/tf-converter.node.js",Dx="dist/index.js",zx="dist/index.js",Ox="dist/index.d.ts",_x="dist/tf-converter.min.js",Px="dist/tf-converter.min.js",Lx="dist/miniprogram",Wx={type:"git",url:"https://github.com/tensorflow/tfjs-converter.git"},Bx="Apache-2.0",Vx={"@tensorflow/tfjs-core":"3.6.0"},jx={"@rollup/plugin-commonjs":"^11.0.2","@rollup/plugin-node-resolve":"^7.1.1","@rollup/plugin-replace":"^2.3.3","@rollup/plugin-typescript":"^3.0.0","@tensorflow/tfjs-backend-cpu":"3.6.0","@tensorflow/tfjs-core":"3.6.0","@types/argparse":"^1.0.38","@types/deep-equal":"^1.0.1","@types/jasmine":"~2.8.6","@types/long":"~3.0.32","@types/node-fetch":"1.6.9",ajv:"~6.3.0",argparse:"^1.0.10","babel-core":"~6.26.3","babel-plugin-external-helpers":"~6.22.0","babel-preset-env":"~1.7.0","clang-format":"~1.2.2",copyfiles:"~1.2.0","deep-equal":"^1.0.1","jasmine-core":"~3.5.0","node-fetch":"~2.6.1",opn:"~5.1.0",protobufjs:"~6.8.6",rimraf:"~2.6.2",rollup:"~2.3.2","rollup-plugin-terser":"~7.0.2","rollup-plugin-visualizer":"~3.3.2","ts-morph":"^7.1.3","ts-node":"~8.8.2",tslint:"~6.1.3","tslint-no-circular-imports":"~0.7.0",typescript:"3.5.3",yalc:"~1.0.0-pre.50"},Ux={build:"yarn gen-json --test && yarn gen-kernel2ops && tsc && yarn bundle","build-ci":"yarn gen-json --test && yarn gen-kernel2ops && tsc && yarn bundle-ci",bundle:"rollup -c","bundle-ci":"rollup -c --ci","build-core":"cd ../tfjs-core && yarn && yarn build","build-backend-cpu":"cd ../tfjs-backend-cpu && yarn && yarn build","build-backend-cpu-ci":"cd ../tfjs-backend-cpu && yarn && yarn build-ci","build-core-ci":"cd ../tfjs-core && yarn && yarn build-ci","build-deps":"yarn build-core && yarn build-backend-cpu","build-deps-ci":"yarn build-core-ci && yarn build-backend-cpu","build-npm":"./scripts/build-npm.sh","link-local":"yalc link","publish-local":"yarn build-npm && yalc push","publish-npm":"npm publish",test:"yarn && yarn build-deps && yarn build && yarn gen-json --test && yarn gen-kernel2ops && ts-node --transpile-only -P tsconfig.test.json src/run_tests.ts","test-ci":"ts-node --transpile-only --skip-ignore -P tsconfig.test.json src/run_tests.ts","test-dev":"tsc && ts-node --transpile-only -P tsconfig.test.json src/run_tests.ts","test-snippets":"yarn && yarn build-deps && yarn build && ts-node --skip-ignore -s ./scripts/test_snippets.ts","test-snippets-ci":"ts-node --skip-ignore -s ./scripts/test_snippets.ts",lint:"tslint -p . -t verbose","make-version":"sh -c ./scripts/make-version","gen-doc":"ts-node -s ./scripts/gen_doc.ts","gen-json":"ts-node -s ./scripts/gen_json.ts","model-summary":"ts-node -s ./tools/model_summary.ts",pb2json:"ts-node -s ./tools/pb2json_converter.ts","build-pip-package":"yarn gen-json --test && cd python && ./build-pip-package.sh --test /tmp/tfjs-pips","run-python-tests":"yarn gen-json --test && cd python && ./run-python-tests.sh","gen-kernel2ops":"ts-node -s scripts/kernels_to_ops.ts --out metadata/kernel2op.json"},XI={name:Rx,version:Mx,description:Fx,main:$x,"jsnext:main":Dx,module:zx,types:Ox,unpkg:_x,jsdelivr:Px,miniprogram:Lx,repository:Wx,license:Bx,peerDependencies:Vx,devDependencies:jx,scripts:Ux},KI=1e-7,ZI=1e-4,zp=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}},ku=class{refCount(e){return ua("refCount")}incRef(e){return ua("incRef")}timerAvailable(){return!0}time(e){return ua("time")}read(e){return ua("read")}readSync(e){return ua("readSync")}numDataIds(){return ua("numDataIds")}disposeData(e,t){return ua("disposeData")}write(e,t,n){return ua("write")}move(e,t,n,a,r){return ua("move")}memory(){return ua("memory")}floatPrecision(){return ua("floatPrecision")}epsilon(){return this.floatPrecision()===32?KI:ZI}dispose(){return ua("dispose")}};function ua(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 Hx(e){let t=e.length,n=0,a=0;for(;t>0;)a=Math.random()*t|0,t--,n=e[t],e[t]=e[a],e[a]=n}function YI(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,a,r,s=0;for(;n>0;)s=Math.random()*n|0,n--,a=e[n],r=t[n],e[n]=e[s],t[n]=t[s],e[s]=a,t[s]=r}function Iu(e,t,n){return Math.max(e,Math.min(t,n))}function JI(e){return e%2==0?e:e+1}function QI(e){let t=0;for(let n=0;nn+` Shapes ${e} and ${t} must match`)}function ps(e){F(e!=null,()=>"The input to the tensor constructor must be a non-null value.")}function cs(e,t=[],n=!1){if(t==null&&(t=[]),Array.isArray(e)||an(e)&&!n)for(let a=0;a0,n){return new Promise((a,r)=>{let s=0,i=()=>{if(e()){a();return}s++;let o=t(s);if(n!=null&&s>=n){r();return}setTimeout(i,o)};i()})}function oS(e,t){let n=1,a=-1;for(let s=0;s=0)n*=e[s];else if(e[s]===-1){if(a!==-1)throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${a} and dim ${s}`);a=s}else if(e[s]<0)throw Error(`Shapes can not be < 0. Found ${e[s]} at dim ${s}`);if(a===-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[a]=t/n,r}function da(e,t){let n=t.length;return e=e==null?t.map((a,r)=>r):[].concat(e),F(e.every(a=>a>=-n&&a`All values in axis param must be in range [-${n}, ${n}) but got axis ${e}`),F(e.every(a=>Ht(a)),()=>`All values in axis param must be integers but got axis ${e}`),e.map(a=>a<0?n+a:a)}function Gx(e,t){let n=[],a=[],r=t!=null&&Array.isArray(t)&&t.length===0,s=t==null||r?null:da(t,e).sort(),i=0;for(let o=0;oo)&&e[o]===1&&(n.push(e[o]),a.push(o)),s[i]<=o&&i++}e[o]!==1&&(n.push(e[o]),a.push(o))}return{newShape:n,keptDims:a}}function qx(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 Xx(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 Kx(e,t){for(let n=0;nt+=n.length),t}function Cr(e){return typeof e=="string"||e instanceof String}function Jx(e){return typeof e=="boolean"}function Qx(e){return typeof e=="number"}function Op(e){return Array.isArray(e)?Op(e[0]):e instanceof Float32Array?"float32":e instanceof Int32Array||e instanceof Uint8Array?"int32":Qx(e)?"float32":Cr(e)?"string":Jx(e)?"bool":"float32"}function Rr(e){return!!(e&&e.constructor&&e.call&&e.apply)}function _p(e,t){for(let n=t;n=0;--a)n[a]=n[a+1]*e[a+1];return n}function eb(e,t,n,a=!1){let r=new Array;if(t.length===1){let s=t[0]*(a?2:1);for(let i=0;iu*l)*(a?2:1);for(let u=0;ur*s)*(n?2:1);if(a===0)return[];if(a!==t.length)throw new Error(`[${e}] does not match the input size ${t.length}${n?" for a complex tensor":""}.`);return eb(0,e,t,n)}function Em(e,t){let n=Pp(e,t);for(let a=0;aa*r,1);if(t==null||t==="float32")return io(e,new Float32Array(n));if(t==="int32")return io(e,new Int32Array(n));if(t==="bool")return io(e,new Uint8Array(n));throw new Error(`Unknown data type ${t}`)}function Cm(e){e.forEach(t=>{F(Number.isInteger(t)&&t>=0,()=>`Tensor must have a shape comprised of positive integers but got shape [${e}].`)})}function dS(e,t,n){if(t===0)return 0;if(t===1)return e[0];let a=e[e.length-1];for(let r=0;r{let[n,a]=t.split(":");this.urlFlags[n]=fS(n,a)})}};function cS(e){let t={};return e.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g,(n,...a)=>(hS(t,a[0],a[1]),a.join("="))),t}function hS(e,t,n){e[decodeURIComponent(t)]=decodeURIComponent(n||"")}function fS(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 J(){return ea}var ea=null;function mS(e){ea=e}var Mm;function ab(){if(Mm==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");Mm=e}return Mm}function yS(){let e=ab();return e._tfGlobals==null&&(e._tfGlobals=new Map),e._tfGlobals}function Fm(e,t){let n=yS();if(n.has(e))return n.get(e);{let a=t();return n.set(e,a),n.get(e)}}var oo="Abs",lo="Acos",uo="Acosh",Mr="Add",hs="AddN",po="All",co="Any",fs="ArgMax",Nu="ArgMin",ho="Asin",fo="Asinh",mo="Atan",yo="Atanh",Ao="Atan2",ms="AvgPool",Lp="AvgPoolGrad",Tu="AvgPool3D",Wp="AvgPool3DGrad",ys="BatchMatMul",Eu="BatchToSpaceND",Bp="Bincount",rb="BroadcastTo",As="Cast",gs="Ceil",Fr="ClipByValue",Vp="Complex",Cu="ComplexAbs",go="Concat",xs="Conv2D",jp="Conv2DBackpropFilter",bs="Conv2DBackpropInput",Ru="Conv3D",Up="Conv3DBackpropFilterV2",Hp="Conv3DBackpropInputV2",vs="Cos",xo="Cosh",ws="Cumsum",bo="CropAndResize",Gp="DenseBincount",vo="DepthToSpace",ks="DepthwiseConv2dNative",qp="DepthwiseConv2dNativeBackpropFilter",Xp="DepthwiseConv2dNativeBackpropInput",Kp="Diag",Mu="Dilation2D",Zp="Dilation2DBackpropInput",Yp="Dilation2DBackpropFilter",Is="RealDiv",Jp="Einsum",wo="Elu",Qp="EluGrad",ko="Erf",Io="Equal",Ss="Exp",So="ExpandDims",No="Expm1",ec="FFT",Fu="Fill",To="FlipLeftRight",Ns="Floor",Ts="FloorDiv",Es="FusedBatchNorm",Eo="GatherV2",Co="GatherNd",Ro="Greater",Cs="GreaterEqual",Rs="Identity",tc="IFFT",nc="Imag",Mo="IsFinite",Fo="IsInf",$o="IsNan",Ms="LeakyRelu",Do="Less",zo="LessEqual",ac="LinSpace",Fs="Log",Oo="Log1p",_o="LogicalAnd",$u="LogicalNot",Du="LogicalOr",sb="LogSoftmax",zu="LRN",rc="LRNGrad",$s="Max",Ds="Maximum",zs="MaxPool",sc="MaxPoolGrad",Ou="MaxPool3D",ic="MaxPool3DGrad",oc="MaxPoolWithArgmax",Os="Mean",_s="Min",Ps="Minimum",Ls="MirrorPad",Po="Mod",lc="Multinomial",Ws="Multiply",Lo="Neg",Wo="NotEqual",Bo="NonMaxSuppressionV3",Vo="NonMaxSuppressionV4",jo="NonMaxSuppressionV5",Uo="OnesLike",Bs="OneHot",Ho="Pack",Vs="PadV2",AS="Pool",js="Pow",Us="Prelu",Go="Prod",_u="Range",uc="Real",qo="Reciprocal",Hs="Relu",Xo="Reshape",Pu="ResizeNearestNeighbor",dc="ResizeNearestNeighborGrad",Gs="ResizeBilinear",pc="ResizeBilinearGrad",qs="Relu6",Xs="Reverse",Ks="Round",Zs="Rsqrt",Ko="ScatterNd",Zo="Select",Yo="Selu",Jo="Slice",Ys="Sin",Qo="Sinh",el="Sign",Js="Sigmoid",tl="Softplus",Qs="Sqrt",ei="Sum",Lu="SpaceToBatchND",nl="SplitV",ti="Softmax",cc="SparseFillEmptyRows",hc="SparseReshape",fc="SparseToDense",ni="SquaredDifference",Wu="Square",al="StridedSlice",ai="Sub",ri="Tan",si="Tanh",$r="Tile",rl="TopK",sl="Transform",ii="Transpose",mc="Unique",il="Unpack",Bu="UnsortedSegmentSum",ol="ZerosLike",Dr="Step",yc="FromPixels",ll="RotateWithOffset",oi="_FusedMatMul",li="FusedConv2D",ui="FusedDepthwiseConv2D",ul=Fm("kernelRegistry",()=>new Map),Vu=Fm("gradRegistry",()=>new Map);function Ac(e,t){let n=Dm(e,t);return ul.get(n)}function $m(e){return Vu.get(e)}function dl(e){let t=ul.entries(),n=[];for(;;){let{done:a,value:r}=t.next();if(a)break;let[s,i]=r,[o]=s.split("_");o===e&&n.push(i)}return n}function di(e){let{kernelName:t,backendName:n}=e,a=Dm(t,n);ul.has(a)&&console.warn(`The kernel '${t}' for backend '${n}' is already registered`),ul.set(a,e)}function ib(e){let{kernelName:t}=e;Vu.has(t)&&J().getBool("DEBUG")&&console.warn(`Overriding the gradient for '${t}'`),Vu.set(t,e)}function gS(e,t){let n=Dm(e,t);if(!ul.has(n))throw new Error(`The kernel '${e}' for backend '${t}' is not registered`);ul.delete(n)}function xS(e){if(!Vu.has(e))throw new Error(`The gradient '${e}' for backend is not registered`);Vu.delete(e)}function bS(e,t){dl(e).forEach(n=>{let a=Object.assign({},n,{backendName:t});di(a)})}function Dm(e,t){return`${t}_${e}`}var k={};Fe(k,{arraysEqual:()=>lr,assert:()=>F,assertNonNegativeIntegerDimensions:()=>Cm,assertNonNull:()=>ps,assertShapesMatch:()=>un,bytesFromStringArray:()=>Yx,bytesPerElement:()=>Tm,checkConversionForErrors:()=>Kx,clamp:()=>Iu,computeStrides:()=>so,createScalarValue:()=>vS,createShuffledIndices:()=>sS,decodeString:()=>xc,distSquared:()=>tS,encodeString:()=>Uu,fetch:()=>kS,flatten:()=>cs,getArrayFromDType:()=>Xx,getTypedArrayFromDType:()=>qx,hasEncodingLoss:()=>lS,indexToLoc:()=>pS,inferDtype:()=>Op,inferFromImplicitShape:()=>oS,isBoolean:()=>Jx,isFunction:()=>Rr,isInt:()=>Ht,isNumber:()=>Qx,isPromise:()=>Rm,isScalarShape:()=>nS,isString:()=>Cr,isTypedArray:()=>an,isValidDtype:()=>Zx,locToIndex:()=>dS,makeOnesTypedArray:()=>Em,makeZerosNestedTypedArray:()=>uS,makeZerosTypedArray:()=>Pp,nearestDivisor:()=>_p,nearestLargerEven:()=>JI,now:()=>ju,parseAxisParam:()=>da,randUniform:()=>eS,repeatedTry:()=>iS,rightPad:()=>Su,shuffle:()=>Hx,shuffleCombo:()=>YI,sizeFromShape:()=>Rt,sizeToSquarishShape:()=>rS,squeezeShape:()=>Gx,sum:()=>QI,tanh:()=>aS,toNestedArray:()=>io,toTypedArray:()=>gc});function vS(e,t){return t==="string"?Uu(e):gc([e],t)}function wS(e,t){return e instanceof Float32Array&&t==="float32"||e instanceof Int32Array&&t==="int32"||e instanceof Uint8Array&&t==="bool"}function gc(e,t){if(t==="string")throw new Error("Cannot convert a string[] to a TypedArray");if(Array.isArray(e)&&(e=cs(e)),J().getBool("DEBUG")&&Kx(e,t),wS(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 a=0;a{a=n()},s,i=ju();if(this.backendTimer.timerAvailable())s=this.backendTimer.time(r);else{r();for(let o of a)o.dataSync();s=Promise.resolve({kernelMs:ju()-i})}if(J().getBool("CHECK_COMPUTATION_FOR_ERRORS"))for(let o=0;o{SS(l,u.dtype,e)})}return{kernelName:e,outputs:a,inputs:t,timeMs:s.then(o=>o.kernelMs),extraInfo:s.then(o=>o.getExtraProfileInfo!=null?o.getExtraProfileInfo():"")}}logKernelProfile(e){let{kernelName:t,outputs:n,timeMs:a,inputs:r,extraInfo:s}=e;n.forEach(i=>{Promise.all([i.data(),a,s]).then(o=>{this.logger.logKernelProfile(t,i,o[0],o[1],r,o[2])})})}};function SS(e,t,n){if(t!=="float32")return!1;for(let a=0;a0?m:""} `}}console.log(`%c${o} %c${i} %c${u}D ${d} %c${l} %c${p} %c${s}`,"font-weight:bold","color:red","color:blue","color: orange","color: green","color: steelblue")}};function TS(e,t,n){let a={},r={};for(let u=0;ua[f.id]=!0),h=!0,r[l.id]=!0;break}if(h)break}}let s={};s[n.id]=!0;let i={};for(let u=e.length-1;u>=0;u--){let l=e[u],d=l.inputs;for(let p=0;p=0;r--){let s=t[r],i=[];if(s.outputs.forEach(u=>{let l=e[u.id];l!=null?i.push(l):i.push(null)}),s.gradient==null)throw new Error(`Cannot compute gradient: gradient function not found for ${s.kernelName}.`);let o=s.gradient(i);for(let u in s.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 ${s.kernelName}. The gradient of input ${u} must have 'float32' dtype, but has '${l.dtype}'`);let d=s.inputs[u];if(!lr(l.shape,d.shape))throw new Error(`Error in gradient for op ${s.kernelName}. The gradient of input '${u}' has shape '${l.shape}', which does not match the shape of the input '${d.shape}'`);if(e[d.id]==null)e[d.id]=l;else{let p=e[d.id];e[d.id]=a(p,l),p.dispose()}}}}var ob=20,Hu=3,zm=7;function CS(e,t,n,a){let r=so(t),s=RS(e,t,n,r),i=t.length,o=bc(e,t,n,r,s),u=["Tensor"];return a&&(u.push(` dtype: ${n}`),u.push(` rank: ${i}`),u.push(` shape: [${t}]`),u.push(" values:")),u.push(o.map(l=>" "+l).join(` -`)),u.join(` -`)}function RS(e,t,n,a){let r=Rt(t),s=a[a.length-1],i=new Array(s).fill(0),o=t.length,u=n==="complex64"?qu(e):e;if(o>1)for(let l=0;lob){let y=Hu*i,A=Array.from(e.slice(0,y)),g=Array.from(e.slice((o-Hu)*i,o*i));return n==="complex64"&&(A=qu(A),g=qu(g)),["["+A.map((x,w)=>Gu(x,r[w],n)).join(", ")+", ..., "+g.map((x,w)=>Gu(x,r[o-Hu+w],n)).join(", ")+"]"]}let f=n==="complex64"?qu(e):Array.from(e);return["["+f.map((y,A)=>Gu(y,r[A],n)).join(", ")+"]"]}let l=t.slice(1),d=a.slice(1),p=a[0]*i,c=[];if(o>ob){for(let f=0;f`Length of values '${a}' 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||Xx(t,this.size),this.strides=so(e)}set(e,...t){t.length===0&&(t=[0]),F(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 a of e){if(a<0||a>=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 a=0;axc(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}dataSync(){this.throwIfDisposed();let e=La().readSync(this.dataId);if(this.dtype==="string")try{return e.map(t=>xc(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 La().read(this.dataId);return this.dtype==="string"?e:new Uint8Array(e.buffer)}dispose(){this.isDisposed||(La().disposeTensor(this),this.isDisposedInternal=!0)}get isDisposed(){return this.isDisposedInternal}throwIfDisposed(){if(this.isDisposed)throw new Error("Tensor is disposed.")}print(e=!1){return pl.print(this,e)}clone(){return this.throwIfDisposed(),pl.clone(this)}toString(e=!1){let t=this.dataSync();return CS(t,this.shape,this.dtype,e)}cast(e){return this.throwIfDisposed(),pl.cast(this,e)}variable(e=!0,t,n){return this.throwIfDisposed(),La().makeVariable(this,e,t,n)}};Object.defineProperty(We,Symbol.hasInstance,{value:e=>!!e&&e.data!=null&&e.dataSync!=null&&e.throwIfDisposed!=null});function Z(){return Fm("Tensor",()=>We)}Z();var Xu=class extends We{constructor(e,t,n,a){super(e.shape,e.dtype,e.dataId,a);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(!lr(e.shape,this.shape))throw new Error(`shape of the new value (${e.shape}) and previous value (${this.shape}) must match`);La().disposeTensor(this),this.dataId=e.dataId,La().incRef(this,null)}dispose(){La().disposeVariable(this),this.isDisposedInternal=!0}};Object.defineProperty(Xu,Symbol.hasInstance,{value:e=>e instanceof We&&e.assign!=null&&e.assign instanceof Function});var ba={};Fe(ba,{assertTypesMatch:()=>ub,getTensorsInContainer:()=>Bm,isTensorInList:()=>OS,makeTypesMatch:()=>kt});var Om;(function(e){e.R0="R0",e.R1="R1",e.R2="R2",e.R3="R3",e.R4="R4",e.R5="R5",e.R6="R6"})(Om||(Om={}));var _m;(function(e){e.float32="float32",e.int32="int32",e.bool="int32",e.complex64="complex64"})(_m||(_m={}));var Pm;(function(e){e.float32="float32",e.int32="int32",e.bool="bool",e.complex64="complex64"})(Pm||(Pm={}));var Lm;(function(e){e.float32="float32",e.int32="float32",e.bool="float32",e.complex64="complex64"})(Lm||(Lm={}));var Wm;(function(e){e.float32="complex64",e.int32="complex64",e.bool="complex64",e.complex64="complex64"})(Wm||(Wm={}));var zS={float32:Lm,int32:_m,bool:Pm,complex64:Wm};function pa(e,t){if(e==="string"||t==="string"){if(e==="string"&&t==="string")return"string";throw new Error(`Can not upcast ${e} with ${t}`)}return zS[e][t]}function vc(e){return pa(e,"int32")}function kt(e,t){if(e.dtype===t.dtype)return[e,t];let n=pa(e.dtype,t.dtype);return[e.cast(n),t.cast(n)]}function ub(e,t){F(e.dtype===t.dtype,()=>`The dtypes of the first(${e.dtype}) and second(${t.dtype}) input must match`)}function OS(e,t){return t.some(n=>n.id===e.id)}function Bm(e){let t=[],n=new Set;return db(e,t,n),t}function db(e,t,n){if(e==null)return;if(e instanceof We){t.push(e);return}if(!_S(e))return;let a=e;for(let r in a){let s=a[r];n.has(s)||(n.add(s),db(s,t,n))}}function _S(e){return Array.isArray(e)||typeof e=="object"}function Vm(e){return e.kernelName!=null}var pb=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()}},Ku=class{constructor(e){this.ENV=e,this.registry={},this.registryFactory={},this.pendingBackendInitId=0,this.state=new pb}async ready(){if(this.pendingBackendInit!=null)return this.pendingBackendInit.then(()=>{});if(this.backendInstance!=null)return;let e=this.getSortedBackends();for(let t=0;t{e.setupFunc!=null&&e.setupFunc(this.backendInstance)})}disposeRegisteredKernels(e){dl(e).forEach(t=>{t.disposeFunc!=null&&t.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 ku)&&typeof n.then=="function"){let a=++this.pendingBackendInitId,r=n.then(s=>a(athis.registryFactory[t].priority-this.registryFactory[e].priority)}initializeBackendsAndReturnBest(){let e=this.getSortedBackends();for(let t=0;tthis.startScope(n),()=>this.endScope(a),()=>(a=t(),a instanceof Promise&&console.error("Cannot return a Promise inside of tidy."),a))}scopedRun(e,t,n){e();try{let a=n();return t(),a}catch(a){throw t(),a}}nextTensorId(){return Ku.nextTensorId++}nextVariableId(){return Ku.nextVariableId++}clone(e){let t=P.runKernel(Rs,{x:e}),n={x:e},a=s=>({x:()=>{let i="float32",o={x:s},u={dtype:i};return P.runKernel(As,o,u)}}),r=[];return this.addTapeNode(this.state.activeScope.name,n,[t],a,r,{}),t}runKernel(e,t,n){if(Ac(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 a=this.backend.numDataIds(),r=0;n.forEach(o=>{r+=o.dtype==="complex64"?3:1});let s=this.state.numDataMovesStack[this.state.numDataMovesStack.length-1],i=a-t-r-s;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=[],a=this.isTapeOn(),r=this.state.numBytes,s=this.state.numTensors;this.shouldCheckForMemLeaks()&&this.state.numDataMovesStack.push(0);let i;this.backendName==null&&this.backend;let o,u=Vm(e)?e.kernelName:this.state.activeScope!=null?this.state.activeScope.name:"";if(Vm(e)){let{kernelName:h,inputs:m,attrs:f}=e;this.backendName==null&&this.backend;let y=Ac(h,this.backendName);F(y!=null,()=>`Cannot find registered kernel '${h}' for backend '${this.backendName}'`),i=()=>{let A=this.backend.numDataIds();o=y.kernelFunc({inputs:m,attrs:f,backend:this.backend});let g=Array.isArray(o)?o:[o];this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(h,A,g);let x=g.map(w=>{if(w.rank!=null)return w;let{dataId:b,shape:v,dtype:S}=w;return this.makeTensorFromDataId(b,v,S)});if(a){let w=this.getTensorsForGradient(h,m,x);n=this.saveTensorsForBackwardMode(w)}return x}}else{let{forwardFunc:h}=e,m=f=>{!a||(n=f.map(y=>this.keep(this.clone(y))))};i=()=>{let f=this.backend.numDataIds();o=this.tidy(()=>h(this.backend,m));let y=Array.isArray(o)?o:[o];return this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(u,f,y),y}}let{inputs:l,attrs:d}=e,p=Vm(e)?null:e.backwardsFunc,c;return this.scopedRun(()=>this.state.kernelDepth++,()=>this.state.kernelDepth--,()=>{!this.ENV.getBool("DEBUG")&&!this.state.profiling?t=i():(c=this.profiler.profileKernel(u,l,()=>i()),this.ENV.getBool("DEBUG")&&this.profiler.logKernelProfile(c),t=c.outputs)}),a&&this.addTapeNode(u,l,t,p,n,d),this.state.profiling&&this.state.activeProfile.kernels.push({name:u,bytesAdded:this.state.numBytes-r,totalBytesSnapshot:this.state.numBytes,tensorsAdded:this.state.numTensors-s,totalTensorsSnapshot:this.state.numTensors,inputShapes:Object.keys(l).map(h=>l[h]!=null?l[h].shape:null),outputShapes:t.map(h=>h.shape),kernelTimeMs:c.timeMs,extraInfo:c.extraInfo}),Array.isArray(o)?t:t[0]}saveTensorsForBackwardMode(e){return e.map(t=>this.keep(this.clone(t)))}getTensorsForGradient(e,t,n){let a=$m(e);if(a!=null){let r=a.inputsToSave||[],s=a.outputsToSave||[],i;a.saveAllInputs?(F(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)=>s[l]);return i.concat(o)}return[]}makeTensor(e,t,n,a){if(e==null)throw new Error("Values passed to engine.makeTensor() are null");n=n||"float32",a=a||this.backend;let r=e;n==="string"&&Cr(e[0])&&(r=e.map(o=>Uu(o)));let s=a.write(r,t,n),i=new We(t,n,s,this.nextTensorId());if(this.trackTensor(i,a),n==="string"){let o=this.state.tensorInfo.get(s),u=Yx(r);this.state.numBytes+=u-o.bytes,o.bytes=u}return i}makeTensorFromDataId(e,t,n,a){n=n||"float32";let r=new We(t,n,e,this.nextTensorId());return this.trackTensor(r,a),r}makeVariable(e,t=!0,n,a){n=n||this.nextVariableId().toString(),a!=null&&a!==e.dtype&&(e=e.cast(a));let r=new Xu(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*Tm(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 Xu||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*Tm(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(a=>a.totalBytesSnapshot)),this.state.activeProfile.newBytes=this.state.numBytes-t,this.state.activeProfile.newTensors=this.state.numTensors-n;for(let a of this.state.activeProfile.kernels)a.kernelTimeMs=await a.kernelTimeMs,a.extraInfo=await a.extraInfo;return this.state.activeProfile}isTapeOn(){return this.state.gradientDepth>0&&this.state.kernelDepth===0}addTapeNode(e,t,n,a,r,s){let i={id:this.state.nextTapeNodeId++,kernelName:e,inputs:t,outputs:n,saved:r},o=$m(e);o!=null&&(a=o.gradFunc),a!=null&&(i.gradient=u=>(u=u.map((l,d)=>{if(l==null){let p=n[d],c=Pp(p.size,p.dtype);return this.makeTensor(c,p.shape,p.dtype)}return l}),a(u.length>1?u:u[0],r,s))),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=Bm(e),n=new Set(t.map(r=>r.id));for(let r=0;r{!r.kept&&r.scopeId===a.id&&this.track(r)})}gradients(e,t,n,a=!1){if(F(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));F(r instanceof We,()=>"The result y returned by f() must be a tensor.");let s=TS(this.state.activeTape,t,r);if(!a&&s.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?PS(r.shape):n,ES(i,s,u=>this.tidy(u),LS);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 F(Rr(e),()=>"The f passed in customGrad(f) must be a function."),(...t)=>{F(t.every(i=>i instanceof We),()=>"The args passed in customGrad(f)(x1, x2,...) must all be tensors");let n,a={};t.forEach((i,o)=>{a[o]=i});let r=(i,o)=>(n=e(...t,o),F(n.value instanceof We,()=>"The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"),F(Rr(n.gradFunc),()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."),n.value),s=(i,o)=>{let u=n.gradFunc(i,o),l=Array.isArray(u)?u:[u];F(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(...)."),F(l.every(p=>p instanceof We),()=>"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 d={};return l.forEach((p,c)=>{d[c]=()=>p}),d};return this.runKernelFunc({forwardFunc:r,backwardsFunc:s,inputs:a})}}readSync(e){return this.state.tensorInfo.get(e).backend.readSync(e)}read(e){return this.state.tensorInfo.get(e).backend.read(e)}async time(e){let t=ju(),n=await this.backend.time(e);return n.wallMs=ju()-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 pb;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}};Ku.nextTensorId=0;Ku.nextVariableId=0;function PS(e){let t=Em(Rt(e),"float32");return P.makeTensor(t,e,"float32")}function cb(){let e=ab();if(e._tfengine==null){let t=new nb(e);e._tfengine=new Ku(t)}return mS(e._tfengine.ENV),FS(()=>e._tfengine),e._tfengine}var P=cb();function LS(e,t){let n={a:e,b:t};return P.runKernel(Mr,n)}var Zu={};Fe(Zu,{isBrowser:()=>hb,isMobile:()=>BS});function WS(){return typeof navigator!="undefined"&&navigator!=null}function BS(e){if(e||WS()){if(e||(e=navigator),e.product==="ReactNative")return!0;let t=e.userAgent||e.vendor||window.opera;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 hb(){return typeof window!="undefined"&&window.document!=null||typeof WorkerGlobalScope!="undefined"}var va=J();va.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.")});va.registerFlag("IS_BROWSER",()=>hb());va.registerFlag("IS_NODE",()=>typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined");va.registerFlag("IS_CHROME",()=>typeof navigator!="undefined"&&navigator!=null&&navigator.userAgent!=null&&/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor));va.registerFlag("PROD",()=>!1);va.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY",()=>va.getBool("DEBUG"));va.registerFlag("DEPRECATION_WARNINGS_ENABLED",()=>!0);va.registerFlag("IS_TEST",()=>!1);va.registerFlag("CHECK_COMPUTATION_FOR_ERRORS",()=>!0);va.registerFlag("WRAP_TO_IMAGEBITMAP",()=>!1);function Wa(e,t){let n=e;if(an(e))return t==="string"?[]:[e.length];if(!Array.isArray(e))return[];let a=[];for(;Array.isArray(n)||an(n)&&t!=="string";)a.push(n.length),n=n[0];return Array.isArray(e)&&J().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")&&fb(e,a,[]),a}function fb(e,t,n){if(n=n||[],!Array.isArray(e)&&!an(e)){F(t.length===0,()=>`Element arr[${n.join("][")}] is a primitive, but should be an array/TypedArray of ${t[0]} elements`);return}F(t.length>0,()=>`Element arr[${n.join("][")}] should be a primitive, but is an array of ${e.length} elements`),F(e.length===t[0],()=>`Element arr[${n.join("][")}] should have ${t[0]} elements, but has ${e.length} elements`);let a=t.slice(1);for(let r=0;r=0&&(r=a),mb(a,r,t,n),e==null||!an(e)&&!Array.isArray(e)&&typeof e!="number"&&typeof e!="boolean"&&typeof e!="string"){let o=e==null?"null":e.constructor.name;throw new Error(`Argument '${t}' passed to '${n}' must be a Tensor or TensorLike, but got '${o}'`)}let s=Wa(e,r);!an(e)&&!Array.isArray(e)&&(e=[e]);let i=r!=="string"?gc(e,r):cs(e,[],!0);return P.makeTensor(i,s,r)}function Yu(e,t,n,a="numeric"){if(!Array.isArray(e))throw new Error(`Argument ${t} passed to ${n} must be a \`Tensor[]\` or \`TensorLike[]\``);return e.map((r,s)=>M(r,`${t}[${s}]`,n,a))}var yb="__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],a=e[n];n.endsWith("_")&&(n=n.substring(0,n.length-1)),n=n+yb;let r=(...s)=>{P.startScope(n);try{let i=a(...s);return Rm(i)&&console.error("Cannot return a Promise inside of tidy."),P.endScope(i),i}catch(i){throw P.endScope(null),i}};return Object.defineProperty(r,"name",{value:n,configurable:!0}),r}function VS(e,t){let n=M(e,"real","complex"),a=M(t,"imag","complex");un(n.shape,a.shape,`real and imag shapes, ${n.shape} and ${a.shape}, must match in call to tf.complex().`);let r={real:n,imag:a};return P.runKernel(Vp,r)}var zr=L({complex_:VS});function Or(e,t,n,a){if(a==null&&(a=Op(e)),a==="complex64")throw new Error("Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).");if(!an(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){Cm(t);let r=Rt(t),s=Rt(n);F(r===s,()=>`Based on the provided shape, [${t}], the tensor should have ${r} values but has ${s}`);for(let i=0;i`Error creating a new Tensor. Inferred shape (${n}) does not match the provided shape (${t}). `)}}return!an(e)&&!Array.isArray(e)&&(e=[e]),t=t||n,e=a!=="string"?gc(e,a):cs(e,[],!0),P.makeTensor(e,t,a)}function rn(e,t,n){let a=Wa(e,n);return Or(e,t,a,n)}var jm={float32:4,float16:2,int32:4,uint16:2,uint8:1,bool:1,complex64:8},wc=4;async function jS(e,t){let n=[],a=[],r=Array.isArray(e)?e.map(i=>i.name):Object.keys(e);for(let i=0;i{let c=await u.bytes(),h=c.reduce((y,A)=>y+A.length,0)+wc*c.length,m=new Uint8Array(h),f=0;for(let y=0;y{if(t+=s.byteLength,n.push(s.byteLength===s.buffer.byteLength?s:new s.constructor(s)),!(s instanceof Float32Array||s instanceof Int32Array||s instanceof Uint8Array))throw new Error(`Unsupported TypedArray subtype: ${s.constructor.name}`)});let a=new Uint8Array(t),r=0;return n.forEach(s=>{a.set(new Uint8Array(s.buffer),r),r+=s.byteLength}),a.buffer}var Um=typeof Buffer!="undefined"&&(typeof Blob=="undefined"||typeof atob=="undefined"||typeof btoa=="undefined");function gb(e){return Um?Buffer.byteLength(e):new Blob([e]).size}function HS(e){if(Um)return Buffer.from(e).toString("base64");let t=new Uint8Array(e),n="";for(let a=0,r=t.length;a{t+=r.byteLength});let n=new Uint8Array(t),a=0;return e.forEach(r=>{n.set(new Uint8Array(r),a),a+=r.byteLength}),n.buffer}function xb(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 Ju(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:gb(JSON.stringify(e.modelTopology)),weightSpecsBytes:e.weightSpecs==null?0:gb(JSON.stringify(e.weightSpecs)),weightDataBytes:e.weightData==null?0:e.weightData.byteLength}}function qS(){let e=n=>{let a=n<<13,r=0;for(;(a&8388608)==0;)r-=8388608,a<<=1;return a&=~8388608,r+=947912704,a|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 XS(){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 KS(){let e=new Uint32Array(64);for(let t=0;t<64;t++)e[t]=1024;return e[0]=e[32]=0,e}function ZS(){let e=qS(),t=XS(),n=KS();return a=>{let r=new ArrayBuffer(4*a.length),s=new Uint32Array(r);for(let i=0;i>10]+(o&1023)]+t[o>>10];s[i]=u}return new Float32Array(r)}}var Et=class{constructor(){this.saveRouters=[],this.loadRouters=[]}static getInstance(){return Et.instance==null&&(Et.instance=new Et),Et.instance}static registerSaveRouter(e){Et.getInstance().saveRouters.push(e)}static registerLoadRouter(e){Et.getInstance().loadRouters.push(e)}static getSaveHandlers(e){return Et.getHandlers(e,"save")}static getLoadHandlers(e,t){return Et.getHandlers(e,"load",t)}static getHandlers(e,t,n){let a=[];return(t==="load"?Et.getInstance().loadRouters:Et.getInstance().saveRouters).forEach(r=>{let s=r(e,n);s!==null&&a.push(s)}),a}},YS=e=>Et.registerSaveRouter(e),JS=e=>Et.registerLoadRouter(e),QS=e=>Et.getSaveHandlers(e),eN=(e,t)=>Et.getLoadHandlers(e,t),Gm="tensorflowjs",qm=1,pi="models_store",_r="model_info_store";function bb(){if(!J().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 Xm(e){let t=e.result;t.createObjectStore(pi,{keyPath:"modelPath"}),t.createObjectStore(_r,{keyPath:"modelPath"})}var ci=class{constructor(e){if(this.indexedDB=bb(),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,a)=>{let r=this.indexedDB.open(Gm,qm);r.onupgradeneeded=()=>Xm(r),r.onsuccess=()=>{let s=r.result;if(t==null){let i=s.transaction(pi,"readonly"),o=i.objectStore(pi).get(this.modelPath);o.onsuccess=()=>{if(o.result==null)return s.close(),a(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`));n(o.result.modelArtifacts)},o.onerror=u=>(s.close(),a(o.error)),i.oncomplete=()=>s.close()}else{let i=Ju(t),o=s.transaction(_r,"readwrite"),u=o.objectStore(_r),l=u.put({modelPath:this.modelPath,modelArtifactsInfo:i}),d;l.onsuccess=()=>{d=s.transaction(pi,"readwrite");let p=d.objectStore(pi).put({modelPath:this.modelPath,modelArtifacts:t,modelArtifactsInfo:i});p.onsuccess=()=>n({modelArtifactsInfo:i}),p.onerror=c=>{u=o.objectStore(_r);let h=u.delete(this.modelPath);h.onsuccess=()=>(s.close(),a(p.error)),h.onerror=m=>(s.close(),a(p.error))}},l.onerror=p=>(s.close(),a(l.error)),o.oncomplete=()=>{d==null?s.close():d.oncomplete=()=>s.close()}}},r.onerror=s=>a(r.error)})}};ci.URL_SCHEME="indexeddb://";var vb=e=>J().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(ci.URL_SCHEME)?tN(e.slice(ci.URL_SCHEME.length)):null;Et.registerSaveRouter(vb);Et.registerLoadRouter(vb);function tN(e){return new ci(e)}function nN(e){return e.startsWith(ci.URL_SCHEME)?e.slice(ci.URL_SCHEME.length):e}var aN=class{constructor(){this.indexedDB=bb()}async listModels(){return new Promise((e,t)=>{let n=this.indexedDB.open(Gm,qm);n.onupgradeneeded=()=>Xm(n),n.onsuccess=()=>{let a=n.result,r=a.transaction(_r,"readonly"),s=r.objectStore(_r).getAll();s.onsuccess=()=>{let i={};for(let o of s.result)i[o.modelPath]=o.modelArtifactsInfo;e(i)},s.onerror=i=>(a.close(),t(s.error)),r.oncomplete=()=>a.close()},n.onerror=a=>t(n.error)})}async removeModel(e){return e=nN(e),new Promise((t,n)=>{let a=this.indexedDB.open(Gm,qm);a.onupgradeneeded=()=>Xm(a),a.onsuccess=()=>{let r=a.result,s=r.transaction(_r,"readwrite"),i=s.objectStore(_r),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),d=()=>{u=r.transaction(pi,"readwrite");let p=u.objectStore(pi).delete(e);p.onsuccess=()=>t(o.result.modelArtifactsInfo),p.onerror=c=>n(o.error)};l.onsuccess=d,l.onerror=p=>(d(),r.close(),n(o.error))}},o.onerror=l=>(r.close(),n(o.error)),s.oncomplete=()=>{u==null?r.close():u.oncomplete=()=>r.close()}},a.onerror=r=>n(a.error)})}},ur="/",cl="tensorflowjs_models",wb="info",rN="model_topology",sN="weight_specs",iN="weight_data",oN="model_metadata";function kb(e){return{info:[cl,e,wb].join(ur),topology:[cl,e,rN].join(ur),weightSpecs:[cl,e,sN].join(ur),weightData:[cl,e,iN].join(ur),modelMetadata:[cl,e,oN].join(ur)}}function lN(e){let t=e.split(ur);if(t.length<3)throw new Error(`Invalid key format: ${e}`);return t.slice(1,t.length-1).join(ur)}function uN(e){return e.startsWith(hi.URL_SCHEME)?e.slice(hi.URL_SCHEME.length):e}var hi=class{constructor(e){if(!J().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=kb(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),a=Ju(e);try{this.LS.setItem(this.keys.info,JSON.stringify(a)),this.LS.setItem(this.keys.topology,t),this.LS.setItem(this.keys.weightSpecs,n),this.LS.setItem(this.keys.weightData,HS(e.weightData));let r={format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy};return e.signature!=null&&(r.signature=e.signature),e.userDefinedMetadata!=null&&(r.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(r.modelInitializer=e.modelInitializer),this.LS.setItem(this.keys.modelMetadata,JSON.stringify(r)),{modelArtifactsInfo:a}}catch(r){throw this.LS.removeItem(this.keys.info),this.LS.removeItem(this.keys.topology),this.LS.removeItem(this.keys.weightSpecs),this.LS.removeItem(this.keys.weightData),this.LS.removeItem(this.keys.modelMetadata),new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${a.modelTopologyBytes}, weightSpecsBytes=${a.weightSpecsBytes}, weightDataBytes=${a.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 a=JSON.parse(this.LS.getItem(this.keys.weightSpecs));if(a==null)throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`);t.weightSpecs=a;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)}let s=this.LS.getItem(this.keys.weightData);if(s==null)throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`);return t.weightData=GS(s),t}};hi.URL_SCHEME="localstorage://";var Ib=e=>J().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(hi.URL_SCHEME)?dN(e.slice(hi.URL_SCHEME.length)):null;Et.registerSaveRouter(Ib);Et.registerLoadRouter(Ib);function dN(e){return new hi(e)}var pN=class{constructor(){F(J().getBool("IS_BROWSER"),()=>"Current environment is not a web browser"),F(typeof window=="undefined"||typeof window.localStorage!="undefined",()=>"Current browser does not appear to support localStorage"),this.LS=window.localStorage}async listModels(){let e={},t=cl+ur,n=ur+wb;for(let a=0;a"scheme must not be undefined or null."),e.endsWith(hl)&&(e=e.slice(0,e.indexOf(hl))),F(e.length>0,()=>"scheme must not be an empty string.");let n=ta.getInstance();F(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 kc(e){if(e.indexOf(hl)===-1)throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${ta.getSchemes().join(",")}`);return{scheme:e.split(hl)[0],path:e.split(hl)[1]}}async function Sb(e,t,n=!1){F(e!==t,()=>`Old path and new path are the same: '${e}'`);let a=Et.getLoadHandlers(e);F(a.length>0,()=>`Copying failed because no load handler is found for source URL ${e}.`),F(a.length<2,()=>`Copying failed because more than one (${a.length}) load handlers for source URL ${e}.`);let r=a[0],s=Et.getSaveHandlers(t);F(s.length>0,()=>`Copying failed because no save handler is found for destination URL ${t}.`),F(s.length<2,()=>`Copying failed because more than one (${a.length}) save handlers for destination URL ${t}.`);let i=s[0],o=kc(e).scheme,u=kc(e).path,l=o===kc(e).scheme,d=await r.load();n&&l&&await ta.getManager(o).removeModel(u);let p=await i.save(d);return n&&!l&&await ta.getManager(o).removeModel(u),p.modelArtifactsInfo}async function cN(){let e=ta.getSchemes(),t={};for(let n of e){let a=await ta.getManager(n).listModels();for(let r in a){let s=n+hl+r;t[s]=a[r]}}return t}async function hN(e){let t=kc(e);return ta.getManager(t.scheme).removeModel(t.path)}async function fN(e,t){return Sb(e,t,!1)}async function mN(e,t){return Sb(e,t,!0)}var yN=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(J().get("IS_BROWSER")){J().setPlatform("browser",new yN);try{ta.registerManager(hi.URL_SCHEME,new pN)}catch(e){}try{ta.registerManager(ci.URL_SCHEME,new aN)}catch(e){}}var AN={importFetch:()=>II()},Km,gN=class{constructor(){this.util=ao("util"),this.textEncoder=new this.util.TextEncoder}fetch(e,t){return J().global.fetch!=null?J().global.fetch(e,t):(Km==null&&(Km=AN.importFetch()),Km(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)}};J().get("IS_NODE")&&J().setPlatform("node",new gN);function Be(e,t="float32",n){return t=t||"float32",Cm(e),new Pt(e,t,n)}function xN(e,t){let n=M(e,"x","cast");if(!Zx(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 a={x:n},r={dtype:t};return P.runKernel(As,a,r)}var me=L({cast_:xN});function bN(e){let t={x:M(e,"x","clone","string_or_numeric")};return P.runKernel(Rs,t)}var Ba=L({clone_:bN});function Nb(e,t=!1){console.log(e.toString(t))}cb();var vN={buffer:Be,cast:me,clone:Ba,print:Nb};$S(vN);var Sn={};Fe(Sn,{browserFiles:()=>EN,browserHTTPRequest:()=>$N,concatenateArrayBuffers:()=>Hm,copyModel:()=>fN,decodeWeights:()=>Ab,encodeWeights:()=>jS,fromMemory:()=>zN,getLoadHandlers:()=>eN,getModelArtifactsInfoForJSON:()=>Ju,getSaveHandlers:()=>QS,http:()=>Jm,isHTTPScheme:()=>Ym,listModels:()=>cN,loadWeights:()=>CN,moveModel:()=>mN,registerLoadRouter:()=>JS,registerSaveRouter:()=>YS,removeModel:()=>hN,weightsLoaderFactory:()=>Rb,withSaveHandler:()=>ON});var wN="model",kN=".json",IN=".weights.bin";function Tb(e){return new Promise(t=>setTimeout(t)).then(e)}var fl=class{constructor(e){if(!J().getBool("IS_BROWSER"))throw new Error("browserDownloads() cannot proceed because the current environment is not a browser.");e.startsWith(fl.URL_SCHEME)&&(e=e.slice(fl.URL_SCHEME.length)),(e==null||e.length===0)&&(e=wN),this.modelTopologyFileName=e+kN,this.weightDataFileName=e+IN}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}],a={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,weightsManifest:n};e.signature!=null&&(a.signature=e.signature),e.userDefinedMetadata!=null&&(a.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(a.modelInitializer=e.modelInitializer);let r=window.URL.createObjectURL(new Blob([JSON.stringify(a)],{type:"application/json"})),s=this.jsonAnchor==null?document.createElement("a"):this.jsonAnchor;if(s.download=this.modelTopologyFileName,s.href=r,await Tb(()=>s.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 Tb(()=>i.dispatchEvent(new MouseEvent("click")))}return{modelArtifactsInfo:Ju(e)}}}};fl.URL_SCHEME="downloads://";var SN=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.files=e}async load(){let e=this.files[0],t=this.files.slice(1);return new Promise((n,a)=>{let r=new FileReader;r.onload=s=>{let i=JSON.parse(s.target.result),o=i.modelTopology;if(o==null){a(new Error(`modelTopology field is missing from file ${e.name}`));return}t.length===0&&n({modelTopology:o});let u=i.weightsManifest;if(u==null){a(new Error(`weightManifest field is missing from file ${e.name}`));return}let l;try{l=this.checkManifestAndWeightFiles(u,t)}catch(h){a(h);return}let d=[],p=[],c=[];u.forEach(h=>{h.paths.forEach(m=>{p.push(m),c.push(null)}),d.push(...h.weights)}),u.forEach(h=>{h.paths.forEach(m=>{let f=new FileReader;f.onload=y=>{let A=y.target.result,g=p.indexOf(m);if(c[g]=A,c.indexOf(null)===-1){let x={modelTopology:o,weightSpecs:d,weightData:Hm(c),format:i.format,generatedBy:i.generatedBy,convertedBy:i.convertedBy};i.signature!=null&&(x.signature=i.signature),i.userDefinedMetadata!=null&&(x.userDefinedMetadata=i.userDefinedMetadata),i.modelInitializer!=null&&(x.modelInitializer=i.modelInitializer),n(x)}},f.onerror=y=>a(`Failed to weights data from file of path '${m}'.`),f.readAsArrayBuffer(l[m])})})},r.onerror=s=>a(`Failed to read model topology and weights manifest JSON from file '${e.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`),r.readAsText(e)})}checkManifestAndWeightFiles(e,t){let n=[],a=t.map(s=>xb(s.name)),r={};for(let s of e)s.paths.forEach(i=>{let o=xb(i);if(n.indexOf(o)!==-1)throw new Error(`Duplicate file basename found in weights manifest: '${o}'`);if(n.push(o),a.indexOf(o)===-1)throw new Error(`Weight file with basename '${o}' is not provided.`);r[i]=t[a.indexOf(o)]});if(n.length!==t.length)throw new Error(`Mismatch in the number of files in weights manifest (${n.length}) and the number of weight files provided (${t.length}).`);return r}},NN=e=>J().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(fl.URL_SCHEME)?TN(e.slice(fl.URL_SCHEME.length)):null;Et.registerSaveRouter(NN);function TN(e="model"){return new fl(e)}function EN(e){return new SN(e)}function Eb(e,t,n,a){i(e),n=n==null?0:n,a=a==null?1:a,o(n,a);let r=0,s=u=>(u.then(l=>{let d=n+ ++r/e.length*(a-n);return t(d),l}),u);function i(u){F(u!=null&&Array.isArray(u)&&u.length>0,()=>"promises must be a none empty array")}function o(u,l){F(u>=0&&u<=1,()=>`Progress fraction must be in range [0, 1], but got startFraction ${u}`),F(l>=0&&l<=1,()=>`Progress fraction must be in range [0, 1], but got endFraction ${l}`),F(l>=u,()=>`startFraction must be no more than endFraction, but got startFraction ${u} and endFraction ${l}`)}return Promise.all(e.map(s))}async function Cb(e,t){t==null&&(t={});let n=t.fetchFunc==null?J().platform.fetch:t.fetchFunc,a=e.map(l=>n(l,t.requestInit,{isBinary:!0})),r=0,s=.5,i=(t.onProgress==null?await Promise.all(a):await Eb(a,t.onProgress,r,s)).map(l=>l.arrayBuffer()),o=.5,u=1;return t.onProgress==null?await Promise.all(i):await Eb(i,t.onProgress,o,u)}async function CN(e,t="",n,a){return Rb(r=>Cb(r,{requestInit:a}))(e,t,n)}function Rb(e){return async(t,n="",a)=>{let r=t.map(()=>!1),s={},i=a!=null?a.map(()=>!1):[],o=[];if(t.forEach((h,m)=>{let f=0;h.weights.forEach(y=>{let A="quantization"in y?y.quantization.dtype:y.dtype,g=jm[A]*Rt(y.shape),x=()=>{r[m]=!0,s[m]==null&&(s[m]=[]),s[m].push({manifestEntry:y,groupOffset:f,sizeBytes:g})};a!=null?a.forEach((w,b)=>{w===y.name&&(x(),i[b]=!0)}):x(),o.push(y.name),f+=g})}),!i.every(h=>h)){let h=a.filter((m,f)=>!i[f]);throw new Error(`Could not find weights in manifest with names: ${h.join(", ")}. -Manifest JSON has weights with names: ${o.join(", ")}.`)}let u=r.reduce((h,m,f)=>(m&&h.push(f),h),[]),l=[];u.forEach(h=>{t[h].paths.forEach(m=>{let f=n+(n.endsWith("/")?"":"/")+m;l.push(f)})});let d=await e(l),p={},c=0;return u.forEach(h=>{let m=t[h].paths.length,f=0;for(let x=0;x{let w=y.slice(x.groupOffset,x.groupOffset+x.sizeBytes),b=Ab(w,[x.manifestEntry]);for(let v in b)p[v]=b[v]}),c+=m}),p}}var RN="application/octet-stream",MN="application/json",Zm=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?(F(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=J().platform.fetch,F(e!=null&&e.length>0,()=>"URL path for http must not be null, undefined or empty."),Array.isArray(e)&&F(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}],a={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,weightsManifest:n};e.signature!=null&&(a.signature=e.signature),e.userDefinedMetadata!=null&&(a.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(a.modelInitializer=e.modelInitializer),t.body.append("model.json",new Blob([JSON.stringify(a)],{type:MN}),"model.json"),e.weightData!=null&&t.body.append("model.weights.bin",new Blob([e.weightData],{type:RN}),"model.weights.bin");let r=await this.fetch(this.path,t);if(r.ok)return{modelArtifactsInfo:Ju(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(h){let m=`Failed to parse model JSON of response from ${this.path}.`;throw this.path.endsWith(".pb")?m+=" 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.":m+=" Please make sure the server is serving valid JSON for this request.",new Error(m)}let n=t.modelTopology,a=t.weightsManifest,r=t.generatedBy,s=t.convertedBy,i=t.format,o=t.signature,u=t.userDefinedMetadata;if(n==null&&a==null)throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`);let l,d;a!=null&&([l,d]=await this.loadWeights(a));let p={modelTopology:n,weightSpecs:l,weightData:d,generatedBy:r,convertedBy:s,format:i};o!=null&&(p.signature=o),u!=null&&(p.userDefinedMetadata=u);let c=t.modelInitializer;return c&&(p.modelInitializer=c),p}async loadWeights(e){let t=Array.isArray(this.path)?this.path[1]:this.path,[n,a]=FN(t),r=this.weightPathPrefix||n,s=[];for(let l of e)s.push(...l.weights);let i=[],o=[];for(let l of e)for(let d of l.paths)this.weightUrlConverter!=null?o.push(this.weightUrlConverter(d)):i.push(r+d+a);this.weightUrlConverter&&i.push(...await Promise.all(o));let u=await Cb(i,{requestInit:this.requestInit,fetchFunc:this.fetch,onProgress:this.onProgress});return[s,Hm(u)]}};Zm.URL_SCHEME_REGEX=/^https?:\/\//;function FN(e){let t=e.lastIndexOf("/"),n=e.lastIndexOf("?"),a=e.substring(0,t),r=n>t?e.substring(n):"";return[a+"/",r]}function Ym(e){return e.match(Zm.URL_SCHEME_REGEX)!=null}var Mb=(e,t)=>{if(typeof fetch=="undefined"&&(t==null||t.fetchFunc==null))return null;{let n=!0;if(Array.isArray(e)?n=e.every(a=>Ym(a)):n=Ym(e),n)return Jm(e,t)}return null};Et.registerSaveRouter(Mb);Et.registerLoadRouter(Mb);function Jm(e,t){return new Zm(e,t)}function $N(e,t){return Jm(e,t)}var Qm=class{constructor(e){this.modelArtifacts=e}async load(){return this.modelArtifacts}},DN=class{constructor(e){this.saveHandler=e}async save(e){return this.saveHandler(e)}};function zN(e,t,n,a){return arguments.length===1?e.modelTopology!=null||e.weightSpecs!=null?new Qm(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 Qm({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 Qm({modelTopology:e,weightSpecs:t,weightData:n,trainingConfig:a}))}function ON(e){return new DN(e)}var Fb={};Fe(Fb,{confusionMatrix:()=>BN});function _N(e,t,n=!1,a=!1){let r=M(e,"a","matMul"),s=M(t,"b","matMul");[r,s]=kt(r,s);let i={a:r,b:s},o={transposeA:n,transposeB:a};return P.runKernel(ys,i,o)}var Ve=L({matMul_:_N});function PN(e,t,n=1,a=0){if(t<2)throw new Error(`Error in oneHot: depth must be >=2, but it is ${t}`);let r={indices:M(e,"indices","oneHot","int32")},s={depth:t,onValue:n,offValue:a};return P.runKernel(Bs,r,s)}var ml=L({oneHot_:PN});function LN(e,t){let n=M(e,"x","transpose");if(t==null&&(t=n.shape.map((s,i)=>i).reverse()),F(n.rank===t.length,()=>`Error in transpose: rank of input ${n.rank} must match length of perm ${t}.`),t.forEach(s=>{F(s>=0&&s`All entries in 'perm' must be between 0 and ${n.rank-1} but got ${t}`)}),n.rank<=1)return n.clone();let a={x:n},r={perm:t};return P.runKernel(ii,a,r)}var Qe=L({transpose_:LN});function WN(e,t,n){let a=M(e,"labels","confusionMatrix"),r=M(t,"predictions","confusionMatrix");F(n==null||n>0&&Number.isInteger(n),()=>`If provided, numClasses must be a positive integer, but got ${n}`),F(a.rank===1,()=>`Expected the rank of labels to be 1, but got ${a.rank}`),F(r.rank===1,()=>`Expected the rank of predictions to be 1, but got ${r.rank}`),F(a.shape[0]===r.shape[0],()=>`Mismatch in the number of examples: ${a.shape[0]} vs. ${r.shape[0]}. Labels and predictions should have the same number of elements.`),F(n>0&&Number.isInteger(n),()=>`numClasses is required to be a positive integer, but got ${n}`);let s=ml(me(a,"int32"),n),i=ml(me(r,"int32"),n),o=Qe(s),u=Ve(o,i);return me(u,"int32")}var BN=L({confusionMatrix_:WN}),fi={};Fe(fi,{fromPixels:()=>XN,fromPixelsAsync:()=>GN,toPixels:()=>qN});function Ic(e,t,n){if(ps(e),t!=null&&t.length!==3)throw new Error("tensor3d() requires shape to have three numbers");let a=Wa(e,n);if(a.length!==3&&a.length!==1)throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray");if(a.length===1&&t==null)throw new Error("tensor3d() requires shape to be provided when `values` are a flat array");return Or(e,t,a,n)}var yl;function $b(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,a=!1,r=!1,s=!1,i=!1,o=!1;if(e.data instanceof Uint8Array)n=!0;else if(typeof ImageData!="undefined"&&e instanceof ImageData)a=!0;else if(typeof HTMLVideoElement!="undefined"&&e instanceof HTMLVideoElement)r=!0;else if(typeof HTMLImageElement!="undefined"&&e instanceof HTMLImageElement)s=!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){let c=2;if(r&&e.readyState element.")}if(Ac(yc,P.backendName)!=null){let c={pixels:e},h={numChannels:t};return P.runKernel(yc,c,h)}let[u,l]=r?[e.videoWidth,e.videoHeight]:[e.width,e.height],d;i?d=e.getContext("2d").getImageData(0,0,u,l).data:a||n?d=e.data:(s||r||o)&&(yl==null&&(yl=document.createElement("canvas").getContext("2d")),yl.canvas.width=u,yl.canvas.height=l,yl.drawImage(e,0,0,u,l),d=yl.getImageData(0,0,u,l).data);let p;if(t===4)p=new Int32Array(d);else{let c=u*l;p=new Int32Array(c*t);for(let h=0;h4||s===2)throw new Error(`toPixels only supports depth of size 1, 3 or 4 but got ${s}`);if(n.dtype!=="float32"&&n.dtype!=="int32")throw new Error(`Unsupported type for toPixels: ${n.dtype}. Please use float32 or int32 tensors.`);let i=await n.data(),o=n.dtype==="float32"?255:1,u=new Uint8ClampedArray(r*a*4);for(let l=0;l1)throw new Error(`Tensor values for a float32 Tensor must be in the range [0 - 1] but encountered ${h}.`)}else if(n.dtype==="int32"&&(h<0||h>255))throw new Error(`Tensor values for a int32 Tensor must be in the range [0 - 255] but encountered ${h}.`);s===1?(d[0]=h*o,d[1]=h*o,d[2]=h*o):d[c]=h*o}let p=l*4;u[p+0]=Math.round(d[0]),u[p+1]=Math.round(d[1]),u[p+2]=Math.round(d[2]),u[p+3]=Math.round(d[3])}if(t!=null){t.width=r,t.height=a;let l=t.getContext("2d"),d=new ImageData(u,r,a);l.putImageData(d,0,0)}return n!==e&&n.dispose(),u}var XN=L({fromPixels_:$b}),e1={};Fe(e1,{prepareAndValidate:()=>Db});function Db(e,t){let n=e.shape.length,a=t.shape.length;if(n<1)throw new Error(`tf.gatherND() expects the input to be rank 1 or higher, but the rank was ${n}.`);if(a<1)throw new Error(`tf.gatherND() expects the indices to be rank 1 or higher, but the rank was ${a}.`);if(t.dtype!=="int32")throw new Error(`tf.gatherND() expects the indices to be int32 type, but the dtype was ${t.dtype}.`);if(t.shape[a-1]>n)throw new Error(`index innermost dimension length must be <= tensor rank; saw: ${t.shape[a-1]} vs. ${n}`);if(Rt(e.shape)===0)throw new Error(`Requested more than 0 entries, but input is empty. Input shape: ${e.shape}.`);let r=t.shape,s=r[r.length-1],i=1;for(let p=0;pp/l),1].slice(0,s);return[u,i,l,d]}var t1={};Fe(t1,{calculateShapes:()=>zb,validateInput:()=>a1,validateUpdateShape:()=>n1});function n1(e,t,n){let a=t.rank>1?t.shape[t.rank-1]:1,r=t.rank>1?t.rank-1:1,s=`Must have updates.shape = indices.shape[:batchDim] + shape[sliceDim:], got updates.shape: ${n.shape}, indices.shape: ${t.shape}, shape: ${e}, sliceDim: ${a}, and batchDim: ${r}.`;if(n.rank1?t.shape[a-1]:1,s=n.length,i=1;for(let p=r;pKN,computeFlatOffset:()=>YN,computeOutShape:()=>Ob,getNormalizedAxes:()=>Wb,isSliceContinous:()=>ZN,maskToAxes:()=>Sc,parseSliceParams:()=>Gb,sliceInfo:()=>JN,startForAxis:()=>Ub,startIndicesWithElidedDims:()=>Bb,stopForAxis:()=>Hb,stopIndicesWithElidedDims:()=>Vb,stridesForAxis:()=>jb,stridesWithElidedDims:()=>_b});function KN(e,t,n){let a=e.shape.length;F(a===t.length,()=>`Error in slice${a}D: Length of begin ${t} must match the rank of the array (${a}).`),F(a===n.length,()=>`Error in slice${a}D: Length of size ${n} must match the rank of the array (${a}).`);for(let r=0;r`Error in slice${a}D: begin[${r}] + size[${r}] (${t[r]+n[r]}) would overflow input.shape[${r}] (${e.shape[r]})`)}function Sc(e){let t=[],n=0;for(;e>0;)e&1&&t.push(n),e/=2,n++;return t}function Ob(e,t,n){let a=[];for(let r=0;r0){let h=t[0],m=n+1;d=Bb(i,h,m,a,e),p=Vb(o,h,m,r,e),c=_b(s,h,m,e)}else for(let h=0;h-1)s[o]=0;else{let u=Pb(t,n,o),l=a[u];e&1<-1)s[o]=Number.MAX_SAFE_INTEGER;else{let u=Pb(t,n,o),l=a[u];e&1<0?i=Number.MIN_SAFE_INTEGER:i=Number.MAX_SAFE_INTEGER);let u=a[r];return i<0&&(i+=u),i=Iu(0,i,u-1),i}function Hb(e,t,n,a,r,s){let i=t[r],o=n[r]||1;(e&1<0?i=Number.MAX_SAFE_INTEGER:i=Number.MIN_SAFE_INTEGER);let u=a[r];return i<0&&(i+=u),o>0?i=Iu(0,i,u):i=Iu(-1,i,u-1),i}function ZN(e,t,n){let a=n.length;for(let r=0;r1){a=r;break}for(let r=a+1;r0||n[r]!==e[r])return!1;return!0}function YN(e,t){let n=e.length>0?e[e.length-1]:1;for(let a=0;a{F(i!==-1,()=>"slice() does not support negative begin indexing.")});let s;return n==null?s=new Array(r).fill(-1):typeof n=="number"?s=[n,...new Array(r-1).fill(-1)]:n.lengthi>=0?i:(F(i===-1,()=>`Negative size values should be exactly -1 but got ${i} for the slice() size at index ${o}.`),e.shape[o]-a[o])),[a,s]}function JN(e,t,n,a,r,s,i,o,u){let l=t.slice(),d=n.slice(),p=a;a==null&&(p=new Array(l.length));let c=Sc(i);if(c.length>1)throw new Error("Multiple ellipses in slice is not allowed.");if(i!==0&&o!==0)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(i!==0&&u!==0)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");let h=e.length-l.length,m=Sc(o),f=e.slice();m.forEach(v=>{l[v]=0,d[v]=1,f.splice(v,0,1)});let{begin:y,end:A,strides:g}=Wb(f,c,h,l,d,p,r,s,i);l=y,d=A,p=g;let x=Sc(u);x.forEach(v=>{d[v]=l[v]+1,p[v]=1});let w=Ob(l,d,p),b=w.filter((v,S)=>x.indexOf(S)===-1);return{nonStrided:p.every(v=>v===1),$begin:l,$end:d,$strides:p,size:w,newShape:f,outShape:b}}var ae={};Fe(ae,{Serializable:()=>qb,SerializationMap:()=>mi,registerClass:()=>Pr});var qb=class{getClassName(){return this.constructor.className}static fromConfig(e,t){return new e(t)}},mi=class{constructor(){this.classNameMap={}}static getMap(){return mi.instance==null&&(mi.instance=new mi),mi.instance}static register(e){mi.getMap().classNameMap[e.className]=[e,e.fromConfig]}};function Pr(e){F(e.className!=null,()=>"Class being registered does not have the static className property defined."),F(typeof e.className=="string",()=>"className is required to be a string, but got type "+typeof e.className),F(e.className.length>0,()=>"Class being registered has an empty-string as its className, which is disallowed."),mi.register(e)}var Xb={};Fe(Xb,{TEST_EPSILON_FLOAT16:()=>Kb,encodeStrings:()=>Zb,expectArrayBuffersEqual:()=>sT,expectArraysClose:()=>eT,expectArraysEqual:()=>nT,expectNumbersClose:()=>aT,expectPromiseToFail:()=>tT,expectValuesInRange:()=>rT,testEpsilon:()=>r1});var QN=.001,Kb=.1;function eT(e,t,n){return n==null&&(n=r1()),s1(e,t,(a,r)=>i1(a,r,n))}function r1(){return P.backend.floatPrecision()===32?QN:Kb}function s1(e,t,n){let a=!0;if((an(e)||an(t))&&(a=!1),an(e)&&an(t)&&(a=!0),a){let i=e.constructor.name,o=t.constructor.name;if(i!==o)throw new Error(`Arrays are of different type. Actual: ${i}. Expected: ${o}`)}if(Array.isArray(e)&&Array.isArray(t)){let i=Wa(e),o=Wa(t);if(!lr(i,o))throw new Error(`Arrays have different shapes. Actual: [${i}]. Expected: [${o}]`)}let r=an(e)?e:cs(e),s=an(t)?t:cs(t);if(r.length!==s.length)throw new Error(`Arrays have different lengths actual: ${r.length} vs expected: ${s.length}. -Actual: ${r}. -Expected: ${s}.`);for(let i=0;it.fail(),()=>t())}function nT(e,t){let n=typeof t=="string"||typeof t=="number"||typeof t=="boolean"?[t]:t;return Cr(e)||Cr(e[0])||Cr(t)||Cr(t[0])?s1(e,n,(a,r)=>a==r):s1(e,t,(a,r)=>i1(a,r,0))}function aT(e,t,n){if(n==null&&(n=r1()),!i1(e,t,n))throw new Error(`Numbers differ: actual === ${e}, expected === ${t}`)}function i1(e,t,n){return!isFinite(e)&&!isFinite(t)?!0:!(isNaN(e)||isNaN(t)||Math.abs(e-t)>n)}function rT(e,t,n){for(let a=0;an)throw new Error(`Value out of range:${e[a]} low: ${t}, high: ${n}`)}function sT(e,t){expect(new Float32Array(e)).toEqual(new Float32Array(t))}function Zb(e){for(let t=0;tt.dispose())}function Gt(e){return P.keep(e)}function cT(e){return P.time(e)}function hT(e){return P.setBackend(e)}function fT(){return P.ready()}function mT(){return P.backendName}function yT(e){P.removeBackend(e)}function l1(e){return P.findBackend(e)}function AT(e){return P.findBackendFactory(e)}function Al(e,t,n=1){return P.registerBackend(e,t,n)}function Yb(){return P.backend}function gT(e,t){J().setPlatform(e,t)}function xT(e,t){let n=M(e,"a","add"),a=M(t,"b","add");[n,a]=kt(n,a);let r={a:n,b:a};return P.runKernel(Mr,r)}var se=L({add_:xT});function bT(e,t){let n=M(e,"a","floorDiv"),a=M(t,"b","floorDiv");[n,a]=kt(n,a);let r={a:n,b:a};return P.runKernel(Ts,r)}var Tc=L({floorDiv_:bT});function vT(e,t){let n=M(e,"a","div"),a=M(t,"b","div");if([n,a]=kt(n,a),n.dtype==="int32"&&a.dtype==="int32")return Tc(n,a);let r={a:n,b:a},s={};return P.runKernel(Is,r,s)}var fe=L({div_:vT});function wT(e,t){let n=M(e,"a","mul"),a=M(t,"b","mul");[n,a]=kt(n,a);let r={a:n,b:a};return P.runKernel(Ws,r)}var W=L({mul_:wT});function kT(e){let t=M(e,"x","abs");if(t.dtype==="complex64"){let n={x:t};return P.runKernel(Cu,n)}else{let n={x:t};return P.runKernel(oo,n)}}var Lt=L({abs_:kT});function IT(e){let t={x:M(e,"x","acos")};return P.runKernel(lo,t)}var u1=L({acos_:IT});function ST(e){let t={x:M(e,"x","acosh")};return P.runKernel(uo,t)}var d1=L({acosh_:ST});function NT(e){F(Array.isArray(e),()=>"The argument passed to tf.addN() must be a list of tensors"),F(e.length>=1,()=>`Must pass at least one tensor to tf.addN(), but got ${e.length}`);let t=e.map((r,s)=>M(r,`tensors${s}`,"addN")),n=t[0];t.forEach(r=>{if(r.dtype!==n.dtype)throw new Error("All tensors passed to tf.addN() must have the same dtype")}),t.forEach(r=>{if(!lr(r.shape,n.shape))throw new Error("All tensors passed to tf.addN() must have the same shape")});let a=t;return P.runKernel(hs,a)}var Ec=L({addN_:NT});function TT(e,t=null,n=!1){let a={x:M(e,"x","all","bool")},r={axis:t,keepDims:n};return P.runKernel(po,a,r)}var Cc=L({all_:TT});function ET(e,t=null,n=!1){let a={x:M(e,"x","any","bool")},r={axis:t,keepDims:n};return P.runKernel(co,a,r)}var Qu=L({any_:ET});function CT(e,t=0){let n={x:M(e,"x","argMax")},a={axis:t};return P.runKernel(fs,n,a)}var yi=L({argMax_:CT});function RT(e,t=0){let n={x:M(e,"x","argMin")},a={axis:t};return P.runKernel(Nu,n,a)}var p1=L({argMin_:RT});function MT(e){let t={x:M(e,"x","asin")};return P.runKernel(ho,t)}var c1=L({asin_:MT});function FT(e){let t={x:M(e,"x","asinh")};return P.runKernel(fo,t)}var h1=L({asinh_:FT});function $T(e){let t={x:M(e,"x","atan")};return P.runKernel(mo,t)}var f1=L({atan_:$T});function DT(e,t){let n=M(e,"a","atan2"),a=M(t,"b","atan2");[n,a]=kt(n,a);let r={a:n,b:a};return P.runKernel(Ao,r)}var m1=L({atan2_:DT});function zT(e){let t={x:M(e,"x","atanh")};return P.runKernel(yo,t)}var y1=L({atanh_:zT});function OT(e,t,n,a,r="NHWC",s){let i=e[3],o=[...t,i],u=e3(r);return ed(e,o,n,s,a,null,null,u)}function Jb(e,t,n,a,r,s,i="channelsLast"){let[o,u]=Rc(t),l;if(i==="channelsLast")l=[o,u,e[3],e[3]];else if(i==="channelsFirst")l=[o,u,e[1],e[1]];else throw new Error(`Unknown dataFormat ${i}`);return ed(e,l,n,a,r,s,!1,i)}function _T(e,t,n,a,r,s,i="NDHWC"){let[o,u,l]=g1(t),d,p;if(i==="NDHWC")p="channelsLast",d=[o,u,l,e[4],e[4]];else if(i==="NCDHW")p="channelsFirst",d=[o,u,l,e[1],e[1]];else throw new Error(`Unknown dataFormat ${i}`);return Qb(e,d,n,a,r,!1,p,s)}function ed(e,t,n,a,r,s,i=!1,o="channelsLast"){let[u,l,d,p]=[-1,-1,-1,-1];if(o==="channelsLast")[u,l,d,p]=e;else if(o==="channelsFirst")[u,p,l,d]=e;else throw new Error(`Unknown dataFormat ${o}`);let[c,h,,m]=t,[f,y]=Rc(n),[A,g]=Rc(a),x=gl(c,A),w=gl(h,g),{padInfo:b,outHeight:v,outWidth:S}=WT(r,l,d,f,y,x,w,s,o),T=i?m*p:m,E;return o==="channelsFirst"?E=[u,T,v,S]:o==="channelsLast"&&(E=[u,v,S,T]),{batchSize:u,dataFormat:o,inHeight:l,inWidth:d,inChannels:p,outHeight:v,outWidth:S,outChannels:T,padInfo:b,strideHeight:f,strideWidth:y,filterHeight:c,filterWidth:h,effectiveFilterHeight:x,effectiveFilterWidth:w,dilationHeight:A,dilationWidth:g,inShape:e,outShape:E,filterShape:t}}function Qb(e,t,n,a,r,s=!1,i="channelsLast",o){let[u,l,d,p,c]=[-1,-1,-1,-1,-1];if(i==="channelsLast")[u,l,d,p,c]=e;else if(i==="channelsFirst")[u,c,l,d,p]=e;else throw new Error(`Unknown dataFormat ${i}`);let[h,m,f,,y]=t,[A,g,x]=g1(n),[w,b,v]=g1(a),S=gl(h,w),T=gl(m,b),E=gl(f,v),{padInfo:$,outDepth:z,outHeight:O,outWidth:_}=BT(r,l,d,p,A,g,x,S,T,E,o),D=s?y*c:y,U;return i==="channelsFirst"?U=[u,D,z,O,_]:i==="channelsLast"&&(U=[u,z,O,_,D]),{batchSize:u,dataFormat:i,inDepth:l,inHeight:d,inWidth:p,inChannels:c,outDepth:z,outHeight:O,outWidth:_,outChannels:D,padInfo:$,strideDepth:A,strideHeight:g,strideWidth:x,filterDepth:h,filterHeight:m,filterWidth:f,effectiveFilterDepth:S,effectiveFilterHeight:T,effectiveFilterWidth:E,dilationDepth:w,dilationHeight:b,dilationWidth:v,inShape:e,outShape:U,filterShape:t}}function PT(e,t,n,a,r){a==null&&(a=A1(e,t,n));let s=e[0],i=e[1],o=Ai((s-t+2*a)/n+1,r),u=Ai((i-t+2*a)/n+1,r);return[o,u]}function LT(e,t,n,a,r,s){r==null&&(r=A1(e,t,a));let i=e[0],o=e[1],u=e[2],l=Ai((i-t+2*r)/a+1,s),d=Ai((o-t+2*r)/a+1,s),p=Ai((u-t+2*r)/a+1,s);return[l,d,p,n]}function A1(e,t,n,a=1){let r=gl(t,a);return Math.floor((e[0]*(n-1)-n+r)/2)}function Rc(e){return typeof e=="number"?[e,e,e]:e.length===2?[e[0],e[1],1]:e}function g1(e){return typeof e=="number"?[e,e,e]:e}function gl(e,t){return t<=1?e:e+(e-1)*(t-1)}function WT(e,t,n,a,r,s,i,o,u){let l,d,p;if(typeof e=="number"){l={top:e,bottom:e,left:e,right:e,type:e===0?"VALID":"NUMBER"};let c=PT([t,n],s,a,e,o);d=c[0],p=c[1]}else if(e==="same"){d=Math.ceil(t/a),p=Math.ceil(n/r);let c=Math.max(0,(d-1)*a+s-t),h=Math.max(0,(p-1)*r+i-n),m=Math.floor(c/2),f=c-m,y=Math.floor(h/2),A=h-y;l={top:m,bottom:f,left:y,right:A,type:"SAME"}}else if(e==="valid")l={top:0,bottom:0,left:0,right:0,type:"VALID"},d=Math.ceil((t-s+1)/a),p=Math.ceil((n-i+1)/r);else if(typeof e=="object"){let c=u==="channelsLast"?e[1][0]:e[2][0],h=u==="channelsLast"?e[1][1]:e[2][1],m=u==="channelsLast"?e[2][0]:e[3][0],f=u==="channelsLast"?e[2][1]:e[3][1];l={top:c,bottom:h,left:m,right:f,type:c===0&&h===0&&m===0&&f===0?"VALID":"EXPLICIT"},d=Ai((t-s+c+h)/a+1,o),p=Ai((n-i+m+f)/r+1,o)}else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:l,outHeight:d,outWidth:p}}function BT(e,t,n,a,r,s,i,o,u,l,d){let p,c,h,m;if(typeof e=="number"){p={top:e,bottom:e,left:e,right:e,front:e,back:e,type:e===0?"VALID":"NUMBER"};let f=LT([t,n,a,1],o,1,r,e,d);c=f[0],h=f[1],m=f[2]}else if(e==="same"){c=Math.ceil(t/r),h=Math.ceil(n/s),m=Math.ceil(a/i);let f=(c-1)*r+o-t,y=(h-1)*s+u-n,A=(m-1)*i+l-a,g=Math.floor(f/2),x=f-g,w=Math.floor(y/2),b=y-w,v=Math.floor(A/2),S=A-v;p={top:w,bottom:b,left:v,right:S,front:g,back:x,type:"SAME"}}else if(e==="valid")p={top:0,bottom:0,left:0,right:0,front:0,back:0,type:"VALID"},c=Math.ceil((t-o+1)/r),h=Math.ceil((n-u+1)/s),m=Math.ceil((a-l+1)/i);else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:p,outDepth:c,outHeight:h,outWidth:m}}function Ai(e,t){if(!t)return Math.trunc(e);switch(t){case"round":return Math.round(e);case"ceil":return Math.ceil(e);case"floor":return Math.floor(e);default:throw new Error(`Unknown roundingMode ${t}`)}}function Lr(e){let[t,n,a]=Rc(e);return t===1&&n===1&&a===1}function Va(e,t){return Lr(e)||Lr(t)}function e3(e){if(e==="NHWC")return"channelsLast";if(e==="NCHW")return"channelsFirst";throw new Error(`Unknown dataFormat ${e}`)}function VT(e,t){let n={x:M(e,"x","reshape","string_or_numeric")},a={shape:t};return P.runKernel(Xo,n,a)}var H=L({reshape_:VT});function jT(e,t,n,a,r){let s=M(e,"x","avgPool","float32"),i=1;F(Va(n,i),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${n} and dilations '${i}'`);let o=s,u=!1;s.rank===3&&(u=!0,o=H(s,[1,s.shape[0],s.shape[1],s.shape[2]])),F(o.rank===4,()=>`Error in avgPool: x must be rank 4 but got rank ${o.rank}.`),r!=null&&F(Ht(a),()=>`Error in avgPool: pad must be an integer when using, dimRoundingMode ${r} but got pad ${a}.`);let l={x:o},d={filterSize:t,strides:n,pad:a,dimRoundingMode:r},p=P.runKernel(ms,l,d);return p=me(p,s.dtype),u?H(p,[p.shape[1],p.shape[2],p.shape[3]]):p}var td=L({avgPool_:jT});function UT(e,t,n,a,r,s="NDHWC"){let i=M(e,"x","avgPool3d","float32"),o=i,u=!1;i.rank===4&&(u=!0,o=H(i,[1,i.shape[0],i.shape[1],i.shape[2],i.shape[3]])),F(o.rank===5,()=>`Error in avgPool3d: x must be rank 5 but got rank ${o.rank}.`),F(s==="NDHWC",()=>`Error in avgPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`),r!=null&&F(Ht(a),()=>`Error in avgPool3d: pad must be an integer when using, dimRoundingMode ${r} but got pad ${a}.`);let l={x:o},d={filterSize:t,strides:n,pad:a,dimRoundingMode:r,dataFormat:s},p=P.runKernel(Tu,l,d);return p=me(p,o.dtype),u?H(p,[p.shape[1],p.shape[2],p.shape[3],p.shape[4]]):p}var x1=L({avgPool3d_:UT});function HT(e,t=0){F(e.length>=1,()=>"Pass at least one tensor to concat");let n=Yu(e,"tensors","concat","string_or_numeric");if(n[0].dtype==="complex64"&&n.forEach(s=>{if(s.dtype!=="complex64")throw new Error(`Cannot concatenate complex64 tensors with a tensor - with dtype ${s.dtype}. `)}),n.length===1)return Ba(n[0]);let a=n,r={axis:t};return P.runKernel(go,a,r)}var lt=L({concat_:HT});function GT(e){let t={x:M(e,"x","sigmoid")};return P.runKernel(Js,t)}var Nn=L({sigmoid_:GT});function qT(e,t,n){let a=M(e,"x","slice","string_or_numeric");if(a.rank===0)throw new Error("Slicing scalar is not possible");let r={x:a},s={begin:t,size:n};return P.runKernel(Jo,r,s)}var Re=L({slice_:qT});function XT(e){let t={x:M(e,"x","tanh")};return P.runKernel(si,t)}var gi=L({tanh_:XT});function KT(e,t,n,a,r,s){let i=M(e,"forgetBias","basicLSTMCell"),o=M(t,"lstmKernel","basicLSTMCell"),u=M(n,"lstmBias","basicLSTMCell"),l=M(a,"data","basicLSTMCell"),d=M(r,"c","basicLSTMCell"),p=M(s,"h","basicLSTMCell"),c=lt([l,p],1),h=Ve(c,o),m=se(h,u),f=m.shape[0],y=m.shape[1]/4,A=[f,y],g=Re(m,[0,0],A),x=Re(m,[0,y],A),w=Re(m,[0,y*2],A),b=Re(m,[0,y*3],A),v=se(W(Nn(g),gi(x)),W(d,Nn(se(i,w)))),S=W(gi(v),Nn(b));return[v,S]}var ZT=L({basicLSTMCell_:KT});function YT(e,t,n){let a=M(e,"x","batchToSpaceND"),r=t.reduce((o,u)=>o*u);F(a.rank>=1+t.length,()=>`input rank is ${a.rank} but should be > than blockShape.length ${t.length}`),F(n.length===t.length,()=>`crops.length is ${n.length} but should be equal to blockShape.length ${t.length}`),F(a.shape[0]%r==0,()=>`input tensor batch is ${a.shape[0]} but is not divisible by the product of the elements of blockShape ${t.join(" * ")} === ${r}`);let s={x:a},i={blockShape:t,crops:n};return P.runKernel(Eu,s,i)}var nd=L({batchToSpaceND_:YT});function JT(e){let t;return e.rank===0||e.rank===1?t=H(e,[1,1,1,e.size]):e.rank===2?t=H(e,[1,1,e.shape[0],e.shape[1]]):e.rank===3?t=H(e,[1,e.shape[0],e.shape[1],e.shape[2]]):t=e,t}function QT(e,t,n,a,r,s){s==null&&(s=.001);let i=M(e,"x","batchNorm"),o=M(t,"mean","batchNorm"),u=M(n,"variance","batchNorm"),l;r!=null&&(l=M(r,"scale","batchNorm"));let d;a!=null&&(d=M(a,"offset","batchNorm")),F(o.rank===u.rank,()=>"Batch normalization gradient requires mean and variance to have equal ranks."),F(d==null||o.rank===d.rank,()=>"Batch normalization gradient requires mean and offset to have equal ranks."),F(l==null||o.rank===l.rank,()=>"Batch normalization gradient requires mean and scale to have equal ranks.");let p={x:JT(i),scale:l,offset:d,mean:o,variance:u},c={varianceEpsilon:s},h=P.runKernel(Es,p,c);return H(h,i.shape)}var xi=L({batchNorm_:QT});function eE(e,t,n,a,r,s){let i=M(e,"x","batchNorm"),o=M(t,"mean","batchNorm"),u=M(n,"variance","batchNorm"),l;r!=null&&(l=M(r,"scale","batchNorm"));let d;return a!=null&&(d=M(a,"offset","batchNorm")),F(i.rank===2,()=>`Error in batchNorm2D: x must be rank 2 but got rank ${i.rank}.`),F(o.rank===2||o.rank===1,()=>`Error in batchNorm2D: mean must be rank 2 or rank 1 but got rank ${o.rank}.`),F(u.rank===2||u.rank===1,()=>`Error in batchNorm2D: variance must be rank 2 or rank 1 but got rank ${u.rank}.`),l!=null&&F(l.rank===2||l.rank===1,()=>`Error in batchNorm2D: scale must be rank 2 or rank 1 but got rank ${l.rank}.`),d!=null&&F(d.rank===2||d.rank===1,()=>`Error in batchNorm2D: offset must be rank 2 or rank 1 but got rank ${d.rank}.`),xi(i,o,u,d,l,s)}var t3=L({batchNorm2d_:eE});function tE(e,t,n,a,r,s){let i=M(e,"x","batchNorm"),o=M(t,"mean","batchNorm"),u=M(n,"variance","batchNorm"),l;r!=null&&(l=M(r,"scale","batchNorm"));let d;return a!=null&&(d=M(a,"offset","batchNorm")),F(i.rank===3,()=>`Error in batchNorm3D: x must be rank 3 but got rank ${i.rank}.`),F(o.rank===3||o.rank===1,()=>`Error in batchNorm3D: mean must be rank 3 or rank 1 but got rank ${o.rank}.`),F(u.rank===3||u.rank===1,()=>`Error in batchNorm3D: variance must be rank 3 or rank 1 but got rank ${u.rank}.`),l!=null&&F(l.rank===3||l.rank===1,()=>`Error in batchNorm3D: scale must be rank 3 or rank 1 but got rank ${l.rank}.`),d!=null&&F(d.rank===3||d.rank===1,()=>`Error in batchNorm3D: offset must be rank 3 or rank 1 but got rank ${d.rank}.`),xi(i,o,u,d,l,s)}var n3=L({batchNorm3d_:tE});function nE(e,t,n,a,r,s){let i=M(e,"x","batchNorm"),o=M(t,"mean","batchNorm"),u=M(n,"variance","batchNorm"),l;r!=null&&(l=M(r,"scale","batchNorm"));let d;return a!=null&&(d=M(a,"offset","batchNorm")),F(i.rank===4,()=>`Error in batchNorm4D: x must be rank 4 but got rank ${i.rank}.`),F(o.rank===4||o.rank===1,()=>`Error in batchNorm4D: mean must be rank 4 or rank 1 but got rank ${o.rank}.`),F(u.rank===4||u.rank===1,()=>`Error in batchNorm4D: variance must be rank 4 or rank 1 but got rank ${u.rank}.`),l!=null&&F(l.rank===4||l.rank===1,()=>`Error in batchNorm4D: scale must be rank 4 or rank 1 but got rank ${l.rank}.`),d!=null&&F(d.rank===4||d.rank===1,()=>`Error in batchNorm4D: offset must be rank 4 or rank 1 but got rank ${d.rank}.`),xi(i,o,u,d,l,s)}var a3=L({batchNorm4d_:nE});function aE(e,t,n){let a=M(e,"x","bincount"),r=M(t,"weights","bincount");F(a.dtype==="int32",()=>`Error in bincount: input dtype must be int32, but got ${a.dtype}`),F(n>=0,()=>`size must be non-negative, but got ${n}.`),F(r.size===a.size||r.size===0,()=>`Error in bincount: weights must have the same size as input or0-length, but got input shape: ${a.shape}, weights shape: ${r.shape}.`);let s={x:a,weights:r},i={size:n};return P.runKernel(Bp,s,i)}var b1=L({bincount_:aE});function rE(e,t){let n=M(e,"broadcastTo","x"),a=n.shape;if(t.some(u=>!(u>0)||u%1!=0))throw new Error(`broadcastTo(): Invalid broadcast shape [${t}].`);if(t.lengthn.rank){let u=n.shape.slice();for(;u.length=0;u--)if(r[u]===t[u])s[u]=1;else if(n.shape[u]!==1)throw new Error(`broadcastTo(): [${a}] cannot be broadcast to [${t}].`);if(s.map((u,l)=>u>1?l:-1).filter(u=>u>=0).length===0)return Ba(n);let i={x:n},o={reps:s};return P.runKernel($r,i,o)}var xl=L({broadcastTo_:rE});function sE(e){let t={x:M(e,"x","ceil")};return P.runKernel(gs,t)}var v1=L({ceil_:sE});function iE(e,t,n){let a=M(e,"x","clipByValue");F(t<=n,()=>`Error in clip: min (${t}) must be less than or equal to max (${n}).`);let r={x:a},s={clipValueMin:t,clipValueMax:n};return P.runKernel(Fr,r,s)}var Tn=L({clipByValue_:iE});function oE(e){return lt(e,0)}var r3=L({concat1d_:oE});function lE(e,t){return lt(e,t)}var bl=L({concat2d_:lE});function uE(e,t){return lt(e,t)}var s3=L({concat3d_:uE});function dE(e,t){return lt(e,t)}var i3=L({concat4d_:dE});function pE(e,t,n,a,r="NHWC",s=[1,1],i){let o=M(e,"x","conv2d"),u=M(t,"filter","conv2d"),l=o,d=!1;o.rank===3&&(d=!0,l=H(o,[1,o.shape[0],o.shape[1],o.shape[2]])),F(l.rank===4,()=>`Error in conv2d: input must be rank 4, but got rank ${l.rank}.`),F(u.rank===4,()=>`Error in conv2d: filter must be rank 4, but got rank ${u.rank}.`),i!=null&&F(Ht(a),()=>`Error in conv2d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${a}.`);let p=r==="NHWC"?l.shape[3]:l.shape[1];F(p===u.shape[2],()=>`Error in conv2d: depth of input (${p}) must match input depth for filter ${u.shape[2]}.`),F(Va(n,s),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`);let c={x:l,filter:u},h={strides:n,pad:a,dataFormat:r,dilations:s,dimRoundingMode:i},m=P.runKernel(xs,c,h);return d?H(m,[m.shape[1],m.shape[2],m.shape[3]]):m}var pr=L({conv2d_:pE});function cE(e,t,n,a,r="NWC",s=1,i){let o=M(e,"x","conv1d"),u=M(t,"filter","conv1d"),l=o,d=!1;o.rank===2&&(d=!0,l=H(o,[1,o.shape[0],o.shape[1]])),F(l.rank===3,()=>`Error in conv1d: input must be rank 3, but got rank ${l.rank}.`),F(u.rank===3,()=>`Error in conv1d: filter must be rank 3, but got rank ${u.rank}.`),i!=null&&F(Ht(a),()=>`Error in conv1d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${a}.`),F(l.shape[2]===u.shape[1],()=>`Error in conv1d: depth of input (${l.shape[2]}) must match input depth for filter ${u.shape[1]}.`),F(Va(n,s),()=>`Error in conv1D: Either stride or dilation must be 1. Got stride ${n} and dilation '${s}'`),F(r==="NWC",()=>`Error in conv1d: got dataFormat of ${r} but only NWC is currently supported.`);let p=H(u,[1,u.shape[0],u.shape[1],u.shape[2]]),c=H(l,[l.shape[0],1,l.shape[1],l.shape[2]]),h=pr(c,p,[1,n],a,"NHWC",[1,s],i);return d?H(h,[h.shape[2],h.shape[3]]):H(h,[h.shape[0],h.shape[2],h.shape[3]])}var Mc=L({conv1d_:cE});function hE(e,t,n,a,r,s="NHWC",i){F(e.length===t.rank,()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`);let o=e,u=t,l=!1;t.rank===3&&(l=!0,u=H(t,[1,t.shape[0],t.shape[1],t.shape[2]]),o=[1,e[0],e[1],e[2]]),F(o.length===4,()=>`Error in conv2dDerInput: inShape must be length 4, but got length ${o.length}.`),F(u.rank===4,()=>`Error in conv2dDerInput: dy must be rank 4, but got rank ${u.rank}`),F(n.rank===4,()=>`Error in conv2dDerInput: filter must be rank 4, but got rank ${n.rank}`);let d=s==="NHWC"?o[3]:o[1],p=s==="NHWC"?u.shape[3]:u.shape[1];F(d===n.shape[2],()=>`Error in conv2dDerInput: depth of input (${d}) must match input depth for filter ${n.shape[2]}.`),F(p===n.shape[3],()=>`Error in conv2dDerInput: depth of output (${p}) must match output depth for filter ${n.shape[3]}.`),i!=null&&F(Ht(r),()=>`Error in conv2dDerInput: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`);let c={dy:u,filter:n},h={strides:a,pad:r,dataFormat:s,dimRoundingMode:i,inputShape:o},m=P.runKernel(bs,c,h);return l?H(m,[m.shape[1],m.shape[2],m.shape[3]]):m}var w1=L({conv2DBackpropInput_:hE});function fE(e,t,n,a,r,s){let i=M(e,"x","conv2dTranspose"),o=M(t,"filter","conv2dTranspose");return w1(n,i,o,a,r,"NHWC",s)}var Fc=L({conv2dTranspose_:fE});function mE(e,t,n,a,r="NDHWC",s=[1,1,1]){let i=M(e,"x","conv3d"),o=M(t,"filter","conv3d"),u=i,l=!1;i.rank===4&&(l=!0,u=H(i,[1,i.shape[0],i.shape[1],i.shape[2],i.shape[3]])),F(u.rank===5,()=>`Error in conv3d: input must be rank 5, but got rank ${u.rank}.`),F(o.rank===5,()=>`Error in conv3d: filter must be rank 5, but got rank ${o.rank}.`),F(u.shape[4]===o.shape[3],()=>`Error in conv3d: depth of input (${u.shape[4]}) must match input depth for filter ${o.shape[3]}.`),F(Va(n,s),()=>`Error in conv3D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`),F(r==="NDHWC",()=>`Error in conv3d: got dataFormat of ${r} but only NDHWC is currently supported.`);let d={x:u,filter:o},p={strides:n,pad:a,dataFormat:r,dilations:s},c=P.runKernel(Ru,d,p);return l?H(c,[c.shape[1],c.shape[2],c.shape[3],c.shape[4]]):c}var k1=L({conv3d_:mE});function yE(e,t,n,a,r){F(e.length===t.rank,()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`);let s=e,i=t,o=!1;t.rank===4&&(o=!0,i=H(t,[1,t.shape[0],t.shape[1],t.shape[2],t.shape[3]]),s=[1,e[0],e[1],e[2],e[3]]);let u=s[4],l=i.shape[4];F(s.length===5,()=>`Error in conv3dDerInput: inShape must be length 5, but got length ${s.length}.`),F(i.rank===5,()=>`Error in conv3dDerInput: dy must be rank 5, but got rank ${i.rank}`),F(n.rank===5,()=>`Error in conv3dDerInput: filter must be rank 5, but got rank ${n.rank}`),F(u===n.shape[3],()=>`Error in conv3dDerInput: depth of input (${u}) must match input depth for filter ${n.shape[3]}.`),F(l===n.shape[4],()=>`Error in conv3dDerInput: depth of output (${l}) must match output depth for filter ${n.shape[4]}.`);let d={dy:i,filter:n},p={pad:r,strides:a,inputShape:s},c=P.runKernel(Hp,d,p);return o?H(c,[c.shape[1],c.shape[2],c.shape[3],c.shape[4]]):c}var o3=L({conv3DBackpropInput_:yE});function AE(e,t,n,a,r){let s=M(e,"x","conv3dTranspose"),i=M(t,"filter","conv3dTranspose");return o3(n,s,i,a,r)}var l3=L({conv3dTranspose_:AE});function gE(e){let t={x:M(e,"x","cos")};return P.runKernel(vs,t)}var ad=L({cos_:gE});function xE(e){let t={x:M(e,"x","cosh")};return P.runKernel(xo,t)}var $c=L({cosh_:xE});function bE(e,t=0,n=!1,a=!1){let r={x:M(e,"x","cumsum")},s={axis:t,exclusive:n,reverse:a};return P.runKernel(ws,r,s)}var Dc=L({cumsum_:bE});function vE(e,t,n,a=!1){let r=M(e,"x","denseBincount"),s=M(t,"weights","denseBincount");F(r.dtype==="int32",()=>`Error in denseBincount: input dtype must be int32, but got ${r.dtype}`),F(r.rank<=2,()=>`Error in denseBincount: input must be at most rank 2, but got rank ${r.rank}.`),F(n>=0,()=>`size must be non-negative, but got ${n}.`),F(s.size===r.size||s.size===0,()=>`Error in denseBincount: weights must have the same shape as x or 0-length, but got x shape: ${r.shape}, weights shape: ${s.shape}.`);let i={x:r,weights:s},o={size:n,binaryOutput:a};return P.runKernel(Gp,i,o)}var u3=L({denseBincount_:vE});function wE(e,t,n="NHWC"){let a=M(e,"x","depthToSpace"),r=n==="NHWC"?a.shape[1]:a.shape[2],s=n==="NHWC"?a.shape[2]:a.shape[3],i=n==="NHWC"?a.shape[3]:a.shape[1];F(r*t>=0,()=>`Negative dimension size caused by overflow when multiplying - ${r} and ${t} for depthToSpace with input shape - ${a.shape}`),F(s*t>=0,()=>`Negative dimension size caused by overflow when multiplying - ${s} and ${t} for depthToSpace with input shape - ${a.shape}`),F(i%(t*t)==0,()=>`Dimension size must be evenly divisible by ${t*t} but is ${i} for depthToSpace with input shape ${a.shape}`);let o={x:a},u={blockSize:t,dataFormat:n};return P.runKernel(vo,o,u)}var I1=L({depthToSpace_:wE});function kE(e,t,n,a,r="NHWC",s=[1,1],i){let o=M(e,"x","depthwiseConv2d"),u=M(t,"filter","depthwiseConv2d"),l=o,d=!1;o.rank===3&&(d=!0,l=H(o,[1,o.shape[0],o.shape[1],o.shape[2]])),F(l.rank===4,()=>`Error in depthwiseConv2d: input must be rank 4, but got rank ${l.rank}.`),F(u.rank===4,()=>`Error in depthwiseConv2d: filter must be rank 4, but got rank ${u.rank}.`),F(l.shape[3]===u.shape[2],()=>`Error in depthwiseConv2d: number of input channels (${l.shape[3]}) must match the inChannels dimension in filter ${u.shape[2]}.`),i!=null&&F(Ht(a),()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${a}.`);let p={x:l,filter:u},c={strides:n,pad:a,dataFormat:r,dilations:s,dimRoundingMode:i},h=P.runKernel(ks,p,c);return d?H(h,[h.shape[1],h.shape[2],h.shape[3]]):h}var vl=L({depthwiseConv2d_:kE});function IE(e){let t={x:M(e,"x","diag")};return P.runKernel(Kp,t)}var SE=L({diag_:IE});function NE(e,t,n,a,r=[1,1],s="NHWC"){let i=M(e,"x","dilation2d"),o=M(t,"filter","dilation2d");F(i.rank===3||i.rank===4,()=>`Error in dilation2d: input must be rank 3 or 4, but got rank ${i.rank}.`),F(o.rank===3,()=>`Error in dilation2d: filter must be rank 3, but got rank ${o.rank}.`),F(s==="NHWC",()=>`Error in dilation2d: Only NHWC is currently supported, but got dataFormat of ${s}`);let u=i,l=!1;i.rank===3&&(u=H(i,[1,i.shape[0],i.shape[1],i.shape[2]]),l=!0);let d={x:u,filter:o},p={strides:n,pad:a,dilations:r},c=P.runKernel(Mu,d,p);return l?H(c,[c.shape[1],c.shape[2],c.shape[3]]):c}var S1=L({dilation2d_:NE});function TE(e,t){let n=e.length,a=[];for(let r=0;r1&&i===1&&a.unshift(s)}return a}function Wt(e,t){let n=[];for(let a=0;a1)&&n.unshift(s)}return n}function ct(e,t){let n=[],a=Math.max(e.length,t.length);for(let r=0;r`Error in dot: inputs must all be rank 1 or 2, but got ranks ${n.rank} and ${a.rank}.`);let r=n.rank===1?n.size:n.shape[1],s=a.rank===1?a.size:a.shape[0];if(F(r===s,()=>`Error in dot: inner dimensions of inputs must match, but got ${r} and ${s}.`),n.rank===1&&a.rank===1){let i=H(n,[1,-1]),o=H(a,[-1,1]),u=Ve(i,o);return H(u,[])}else if(n.rank===1&&a.rank===2){let i=H(n,[1,-1]),o=H(a,[a.shape[0],a.shape[1]]),u=Ve(i,o);return H(u,[u.size])}else if(n.rank===2&&a.rank===1){let i=H(a,[-1,1]),o=Ve(n,i);return H(o,[o.size])}else{let i=H(a,[a.shape[0],a.shape[1]]);return Ve(n,i)}}var d3=L({dot_:FE});function $E(e,...t){let n=t.map((r,s)=>M(r,`tensors${s}`,"einsum")),a={equation:e};return P.runKernel(Jp,n,a)}var p3=L({einsum_:$E});function DE(e){let t={x:M(e,"x","elu")};return P.runKernel(wo,t)}var wl=L({elu_:DE});function zE(e){let t=M(e,"x","erf");F(t.dtype==="int32"||t.dtype==="float32",()=>"Input dtype must be `int32` or `float32`."),t.dtype==="int32"&&(t=me(t,"float32"));let n={x:t};return P.runKernel(ko,n)}var T1=L({erf_:zE});function OE(e){let t={x:M(e,"x","exp")};return P.runKernel(Ss,t)}var na=L({exp_:OE});function _E(e,t=0){let n=M(e,"x","expandDims","string_or_numeric");F(t<=n.rank,()=>"Axis must be <= rank of the tensor");let a={input:n},r={dim:t};return P.runKernel(So,a,r)}var pn=L({expandDims_:_E});function PE(e){let t={x:M(e,"x","expm1")};return P.runKernel(No,t)}var E1=L({expm1_:PE});function LE(e,t){let n=M(e,"x","tile","string_or_numeric");F(n.rank===t.length,()=>`Error in transpose: rank of input ${n.rank} must match length of reps ${t}.`);let a={x:n},r={reps:t};return P.runKernel($r,a,r)}var Br=L({tile_:LE});function WE(e,t,n,a="float32"){t==null&&(t=e);let r=Be([e,t],a),s=e<=t?e:t;for(let o=0;o`Error in localResponseNormalization: x must be rank 3 or 4 but got - rank ${s.rank}.`),F(Ht(t),()=>`Error in localResponseNormalization: depthRadius must be an integer but got depthRadius ${t}.`);let i=s,o=!1;s.rank===3&&(o=!0,i=H(s,[1,s.shape[0],s.shape[1],s.shape[2]]));let u={x:i},l={depthRadius:t,bias:n,alpha:a,beta:r},d=P.runKernel(zu,u,l);return o?H(d,[d.shape[1],d.shape[2],d.shape[3]]):d}var M1=L({localResponseNormalization_:JE});function QE(e){let t={x:M(e,"x","log")};return P.runKernel(Fs,t)}var Pn=L({log_:QE});function eC(e){let t={x:M(e,"x","log1p")};return P.runKernel(Oo,t)}var _c=L({log1p_:eC});function tC(e){return F(Rr(e),()=>"The f passed in grad(f) must be a function"),(t,n)=>{let a=M(t,"x","tf.grad","string_or_numeric"),r=n!=null?M(n,"dy","tf.grad"):null;return P.tidy(()=>{let{value:s,grads:i}=P.gradients(()=>e(a),[a],r);return r!=null&&un(s.shape,r.shape,"The shape of dy passed in grad(f)(x, dy) must match the shape returned by f(x)"),Pc(i),i[0]})}}function nC(e){return F(Rr(e),()=>"The f passed in grads(f) must be a function"),(t,n)=>{F(Array.isArray(t),()=>"The args passed in grads(f)(args) must be an array of `Tensor`s or `TensorLike`s");let a=Yu(t,"args","tf.grads","string_or_numeric"),r=n!=null?M(n,"dy","tf.grads"):null;return P.tidy(()=>{let{value:s,grads:i}=P.gradients(()=>e(...a),a,r);return r!=null&&un(s.shape,r.shape,"The shape of dy passed in grads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),Pc(i),i})}}function aC(e){return F(Rr(e),()=>"The f passed in valueAndGrad(f) must be a function"),(t,n)=>{F(t instanceof We,()=>"The x passed in valueAndGrad(f)(x) must be a tensor"),F(n==null||n instanceof We,()=>"The dy passed in valueAndGrad(f)(x, dy) must be a tensor");let{grads:a,value:r}=P.gradients(()=>e(t),[t],n);return Pc(a),{grad:a[0],value:r}}}function rC(e){return F(Rr(e),()=>"The f passed in valueAndGrads(f) must be a function"),(t,n)=>{F(Array.isArray(t)&&t.every(r=>r instanceof We),()=>"The args passed in valueAndGrads(f)(args) must be array of tensors"),F(n==null||n instanceof We,()=>"The dy passed in valueAndGrads(f)(args, dy) must be a tensor");let a=P.gradients(()=>e(...t),t,n);return n!=null&&un(a.value.shape,n.shape,"The shape of dy passed in valueAndGrads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),Pc(a.grads),a}}function m3(e,t){F(Rr(e),()=>"The f passed in variableGrads(f) must be a function"),F(t==null||Array.isArray(t)&&t.every(l=>l instanceof Xu),()=>"The varList passed in variableGrads(f, varList) must be an array of variables");let n=t!=null;if(!n){t=[];for(let l in P.registeredVariables)t.push(P.registeredVariables[l])}let a=n?t.filter(l=>!l.trainable):null,r=t.length;t=t.filter(l=>l.trainable),F(t.length>0,()=>`variableGrads() expects at least one of the input variables to be trainable, but none of the ${r} variables is trainable.`);let s=!0,{value:i,grads:o}=P.gradients(e,t,null,s);F(o.some(l=>l!=null),()=>"Cannot find a connection between any variable and the result of the loss function y=f(x). Please make sure the operations that use variables are inside the function f passed to minimize()."),F(i.rank===0,()=>`The f passed in variableGrads(f) must return a scalar, but it returned a rank-${i.rank} tensor`);let u={};return t.forEach((l,d)=>{o[d]!=null&&(u[l.name]=o[d])}),a!=null&&a.forEach(l=>u[l.name]=null),{value:i,grads:u}}function ja(e){return P.customGrad(e)}function Pc(e){if(e.filter(t=>t==null).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.`)}function sC(e){let t={x:M(e,"x","neg")};return P.runKernel(Lo,t)}var It=L({neg_:sC});function iC(e){let t={x:M(e,"x","softplus")};return P.runKernel(tl,t)}var vi=L({softplus_:iC});function oC(e){let t=M(e,"x","logSigmoid");return ja(n=>({value:It(vi(It(n))),gradFunc:a=>W(a,Nn(It(n)))}))(t)}var y3=L({logSigmoid_:oC});function lC(e,t=null,n=!1){let a={x:M(e,"x","max")},r={reductionIndices:t,keepDims:n};return P.runKernel($s,a,r)}var En=L({max_:lC});function uC(e,t){let n=M(e,"a","sub"),a=M(t,"b","sub");[n,a]=kt(n,a);let r={a:n,b:a};return P.runKernel(ai,r)}var ye=L({sub_:uC});function dC(e,t=null,n=!1){let a=M(e,"x","sum");a.dtype==="bool"&&(a=me(a,"int32"));let r={x:a},s={axis:t,keepDims:n};return P.runKernel(ei,r,s)}var Se=L({sum_:dC});function pC(e,t=-1){let n=M(e,"logits","logSoftmax");if(t===-1&&(t=n.rank-1),t!==n.rank-1)throw Error(`Log Softmax along a non-last dimension is not yet supported. Logits was rank ${n.rank} and axis was ${t}`);return ja((a,r)=>{let s=!0,i=En(a,t,!0),o=ye(a,i),u=ye(me(o,"float32"),Pn(Se(na(o),t,s)));return r([u]),{value:u,gradFunc:(l,d)=>{let[p]=d,c=!0,h=na(p);return ye(l,W(Se(l,t,c),h))}}})(n)}var Lc=L({logSoftmax_:pC});function F1(e,t){for(let n=0;ne[s]);return[n,r]}function wi(e,t){let n=t.map(a=>1);return A3(e,n,t)}function cC(e,t,n){F(F1(t,n),()=>`${e} supports only inner-most axes for now. Got axes ${t} and rank-${n} input.`)}function x3(e,t){if(F1(e,t))return null;let n=[];for(let a=0;an.push(a)),n}function $1(e){return e.map((t,n)=>[n,t]).sort((t,n)=>t[1]-n[1]).map(t=>t[0])}function hC(e,t){let n=[];for(let a=t-e;a`Error in maxPool: input must be rank 4 but got rank ${o.rank}.`),F(Va(n,i),()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${n} and dilations '${i}'`),r!=null&&F(Ht(a),()=>`Error in maxPool: pad must be an integer when using, dimRoundingMode ${r} but got pad ${a}.`);let l={x:o},d={filterSize:t,strides:n,pad:a,dimRoundingMode:r},p=P.runKernel(zs,l,d);return u?H(p,[p.shape[1],p.shape[2],p.shape[3]]):p}var id=L({maxPool_:xC});function bC(e,t=[1,1,1],n,a,r,s="NDHWC"){let i=M(e,"x","maxPool3d"),o=i,u=!1;i.rank===4&&(u=!0,o=H(i,[1,i.shape[0],i.shape[1],i.shape[2],i.shape[3]])),F(o.rank===5,()=>`Error in maxPool3d: x must be rank 5 but got rank ${o.rank}.`),F(s==="NDHWC",()=>`Error in maxPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`),r!=null&&F(Ht(a),()=>`Error in maxPool3d: pad must be an integer when using, dimRoundingMode ${r} but got pad ${a}.`);let l={x:o},d={filterSize:t,strides:n,pad:a,dimRoundingMode:r,dataFormat:s},p=P.runKernel(Ou,l,d);return u?H(p,[p.shape[1],p.shape[2],p.shape[3],p.shape[4]]):p}var z1=L({maxPool3d_:bC});function vC(e,t,n,a,r=!1){let s={x:M(e,"x","maxPoolWithArgmax")},i={filterSize:t,strides:n,pad:a,includeBatchInIndex:r},o=P.runKernel(oc,s,i);return{result:o[0],indexes:o[1]}}var v3=L({maxPoolWithArgmax_:vC});function wC(e,t){let n=M(e,"a","maximum"),a=M(t,"b","maximum");[n,a]=kt(n,a),n.dtype==="bool"&&(n=me(n,"int32"),a=me(a,"int32")),ct(n.shape,a.shape);let r={a:n,b:a};return P.runKernel(Ds,r)}var Ua=L({maximum_:wC});function kC(e,t=null,n=!1){let a={x:M(e,"x","mean")},r={axis:t,keepDims:n};return P.runKernel(Os,a,r)}var St=L({mean_:kC});function $t(e,t="float32"){if(t==="complex64"){let a=$t(e,"float32"),r=$t(e,"float32");return zr(a,r)}let n=Pp(Rt(e),t);return P.makeTensor(n,e,t)}function Ln(e,t="float32"){if(t==="complex64"){let a=Ln(e,"float32"),r=$t(e,"float32");return zr(a,r)}let n=Em(Rt(e),t);return P.makeTensor(n,e,t)}function IC(e,t,{indexing:n="xy"}={}){if(n!=="xy"&&n!=="ij")throw new TypeError(`${n} is not a valid third argument to meshgrid`);if(e===void 0)return[];let a=M(e,"x","meshgrid",e instanceof We?e.dtype:"float32");if(t===void 0)return[a];let r=M(t,"y","meshgrid",t instanceof We?t.dtype:"float32"),s=Rt(a.shape),i=Rt(r.shape);return n==="xy"?(a=H(a,[1,-1]),r=H(r,[-1,1]),[Ve(Ln([i,1],a.dtype),a),Ve(r,Ln([1,s],r.dtype))]):(a=H(a,[-1,1]),r=H(r,[1,-1]),[Ve(a,Ln([1,i],a.dtype)),Ve(Ln([s,1],r.dtype),r)])}function SC(e,t=null,n=!1){let a={x:M(e,"x","min")},r={axis:t,keepDims:n};return P.runKernel(_s,a,r)}var Sl=L({min_:SC});function NC(e,t){let n=M(e,"a","minimum"),a=M(t,"b","minimum");[n,a]=kt(n,a),n.dtype==="bool"&&(n=me(n,"int32"),a=me(a,"int32")),ct(n.shape,a.shape);let r={a:n,b:a};return P.runKernel(Ps,r)}var Nl=L({minimum_:NC});function TC(e,t,n){F(n==="reflect"||n==="symmetric",()=>`Invalid mode. Mode must be either reflect or symmetric. Got ${n}.`);let a=M(e,"x","mirrorPad");if(a.rank===0)throw new Error("mirrorPad(scalar) is not defined. Pass non-scalar to mirrorPad");F(t.length===a.rank,()=>`Padding doesn't match input. Must be ${a.rank}. Got ${t.length}.`);let r=n==="reflect"?1:0;for(let o=0;o"Invalid number of paddings. Must be length of 2 each."),F(t[o][0]>=0&&t[o][0]<=a.shape[o]-r&&t[o][1]>=0&&t[o][1]<=a.shape[o]-r,()=>`Padding in dimension ${o} cannot be greater than or equal to ${a.shape[o]-r} or less than 0 for input of shape ${a.shape}`);let s={paddings:t,mode:n},i={x:a};return P.runKernel(Ls,i,s)}var O1=L({mirrorPad_:TC});function EC(e,t){let n=M(e,"a","mod"),a=M(t,"b","mod");[n,a]=kt(n,a);let r={a:n,b:a};return P.runKernel(Po,r)}var _1=L({mod_:EC});function CC(e){let t=M(e,"x","square"),n={};return P.runKernel("Square",{x:t},n)}var ot=L({square_:CC});function RC(e,t=null,n=!1){e=M(e,"x","moments");let a=da(t,e.shape),r=St(e,a,n),s=r.shape;n||(s=wi(r.shape,a));let i=ot(ye(me(e,"float32"),H(r,s))),o=St(i,a,n);return{mean:r,variance:o}}var Bc=L({moments_:RC});function MC(e,t,n,a){let r=M(t,"data","multiRNNCell"),s=Yu(n,"c","multiRNNCell"),i=Yu(a,"h","multiRNNCell"),o=r,u=[];for(let p=0;p2)throw new Error(`Rank of probabilities must be 1 or 2, but is ${i}`);n=n||Math.random();let o={logits:i===1?H(r,[1,-1]):r},u={numSamples:t,seed:n,normalized:a},l=P.runKernel(lc,o,u);return i===1?H(l,[l.size]):l}var w3=L({multinomial_:$C});function DC(e,t){let n=M(e,"a","notEqual"),a=M(t,"b","notEqual");[n,a]=kt(n,a),ct(n.shape,a.shape);let r={a:n,b:a};return P.runKernel(Wo,r)}var ki=L({notEqual_:DC});function zC(e){let t={x:M(e,"x","onesLike")};return P.runKernel(Uo,t)}var Wn=L({onesLike_:zC});function OC(e,t){let n=M(e,"v1","outerProduct"),a=M(t,"v2","outerProduct");F(n.rank===1&&a.rank===1,()=>`Error in outerProduct: inputs must be rank 1, but got ranks ${n.rank} and ${a.rank}.`);let r=H(n,[-1,1]),s=H(a,[1,-1]);return Ve(r,s)}var _C=L({outerProduct_:OC});function PC(e,t,n=0){let a=M(e,"x","pad");if(a.rank===0)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");let r={paddings:t,constantValue:n},s={x:a};return P.runKernel(Vs,s,r)}var cr=L({pad_:PC});function LC(e,t,n=0){return F(t.length===2,()=>"Invalid number of paddings. Must be length of 2."),cr(e,[t],n)}var WC=L({pad1d_:LC});function BC(e,t,n=0){return F(t.length===2&&t[0].length===2&&t[1].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),cr(e,t,n)}var VC=L({pad2d_:BC});function jC(e,t,n=0){return F(t.length===3&&t[0].length===2&&t[1].length===2&&t[2].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),cr(e,t,n)}var UC=L({pad3d_:jC});function HC(e,t,n=0){return F(t.length===4&&t[0].length===2&&t[1].length===2&&t[2].length===2&&t[3].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),cr(e,t,n)}var GC=L({pad4d_:HC});function qC(e,t,n){let a=M(e,"x","spaceToBatchND");F(a.rank>=1+t.length,()=>`input rank ${a.rank} should be > than [blockShape] ${t.length}`),F(n.length===t.length,()=>`paddings.shape[0] ${n.length} must be equal to [blockShape] ${t.length}`),F(a.shape.reduce((i,o,u)=>u>0&&u<=t.length?i&&(o+n[u-1][0]+n[u-1][1])%t[u-1]==0:i,!0),()=>`input spatial dimensions ${a.shape.slice(1)} with paddings ${n.toString()} must be divisible by blockShapes ${t.toString()}`);let r={x:a},s={blockShape:t,paddings:n};return P.runKernel(Lu,r,s)}var od=L({spaceToBatchND_:qC});function XC(e,t,n,a,r,s){r==null&&(r=[1,1]),s==null&&(s=1),a===0&&(a="valid");let i=M(e,"x","maxPool"),o=i,u=!1;i.rank===3&&(u=!0,o=H(i,[1,i.shape[0],i.shape[1],i.shape[2]])),F(Va(s,r),()=>`Error in pool: Either strides or dilations must be 1. Got strides ${s} and dilations '${r}'`);let l=Jb(o.shape,t,s,r,a),d=[l.dilationHeight,l.dilationWidth],p;a==="same"?p=ZC([l.filterHeight,l.filterWidth],d):p=[[0,0],[0,0]];let c=d[0]===1&&d[1]===1,[h,m]=KC([l.inHeight,l.inWidth],d,p),f=c?a:"valid",y=c?o:od(o,d,h),A=(n==="avg"?()=>td(y,t,s,f):()=>id(y,t,s,f))(),g=c?A:nd(A,d,m);return u?H(g,[g.shape[1],g.shape[2],g.shape[3]]):g}function KC(e,t,n){let a=n.map(d=>d[0]),r=n.map(d=>d[1]),s=e.concat(a,r),i=t.map((d,p)=>(d-s[p]%d)%d),o=r.map((d,p)=>d+i[p]),u=t.map((d,p)=>[a[p],o[p]]),l=t.map((d,p)=>[0,i[p]]);return[u,l]}function ZC(e,t){let n=e.map((s,i)=>s+(s-1)*(t[i]-1)).map(s=>s-1),a=n.map(s=>Math.floor(s/2)),r=n.map((s,i)=>s-a[i]);return n.map((s,i)=>[a[i],r[i]])}var k3=L({pool_:XC});function YC(e,t){let n=M(e,"base","pow"),a=M(t,"exp","pow");[n,a]=kt(n,a);let r={a:n,b:a};return P.runKernel(js,r)}var hr=L({pow_:YC});function JC(e,t){let n=M(e,"x","prelu"),a=M(t,"alpha","prelu"),r={x:n,alpha:a};return P.runKernel(Us,r)}var ld=L({prelu_:JC});function QC(e,t=null,n=!1){let a=M(e,"x","prod");a.dtype==="bool"&&(a=me(a,"int32"));let r={x:a},s={axis:t,keepDims:n};return P.runKernel(Go,r,s)}var Vc=L({prod_:QC});function eR(e,t,n){let a=Rt(e),r=null;if(n==null||n==="float32")r=new Float32Array(a);else if(n==="int32")r=new Int32Array(a);else if(n==="bool")r=new Uint8Array(a);else throw new Error(`Unknown data type ${n}`);for(let s=0;s=1||s===0);let i=Math.sqrt(-2*Math.log(s)/s);e=this.mean+this.stdDev*a*i,t=this.mean+this.stdDev*r*i,(!this.truncated||this.isValidTruncated(e))&&(n=!0)}return(!this.truncated||this.isValidTruncated(t))&&(this.nextVal=this.convertValue(t)),this.convertValue(e)}convertValue(e){return this.dtype==null||this.dtype==="float32"?e:Math.round(e)}isValidTruncated(e){return e<=this.upper&&e>=this.lower}},nR=class{constructor(e,t,n,a){this.alpha=e,this.beta=1/t,this.dtype=n;let r=a||Math.random();this.randu=P1.alea(r.toString()),this.randn=new L1(0,1,n,!1,this.randu()),e<1?this.d=e+2/3:this.d=e-1/3,this.c=1/Math.sqrt(9*this.d)}nextValue(){let e,t,n,a,r,s;for(;;){do a=this.randn.nextValue(),s=1+this.c*a;while(s<=0);if(s*=s*s,e=a*a,t=1-.331*e*e,n=.5*e+this.d*(1-s+Math.log(s)),r=this.randu(),rthis.dtype==null||this.dtype==="float32",this.min=e,this.range=t-e,this.dtype=n,a==null&&(a=Math.random()),typeof a=="number"&&(a=a.toString()),!this.canReturnFloat()&&this.range<=1)throw new Error(`The difference between ${e} - ${t} <= 1 and dtype is not float`);this.random=P1.alea(a)}convertValue(e){return this.canReturnFloat()?e:Math.round(e)}nextValue(){return this.convertValue(this.min+this.range*this.random())}};function rR(e,t,n=1,a="float32",r){if(n==null&&(n=1),a==null&&(a="float32"),a!=="float32"&&a!=="int32")throw new Error(`Unsupported data type ${a}`);let s=new nR(t,n,a,r),i=Be(e,a);for(let o=0;o`Error in reverse1D: x must be rank 1 but got rank ${t.rank}.`),Bn(t,0)}var fR=L({reverse1d_:hR});function mR(e,t){let n=M(e,"x","reverse");return F(n.rank===2,()=>`Error in reverse2D: x must be rank 2 but got rank ${n.rank}.`),Bn(n,t)}var yR=L({reverse2d_:mR});function AR(e,t){let n=M(e,"x","reverse");return F(n.rank===3,()=>`Error in reverse3D: x must be rank 3 but got rank ${n.rank}.`),Bn(n,t)}var gR=L({reverse3d_:AR});function xR(e,t){let n=M(e,"x","reverse");return F(n.rank===4,()=>`Error in reverse4D: x must be rank 4 but got rank ${n.rank}.`),Bn(n,t)}var bR=L({reverse4d_:xR});function vR(e){let t={x:M(e,"x","round")};return P.runKernel(Ks,t)}var Uc=L({round_:vR});function wR(e){let t={x:M(e,"x","rsqrt")};return P.runKernel(Zs,t)}var Hc=L({rsqrt_:wR});function we(e,t){if((an(e)&&t!=="string"||Array.isArray(e))&&t!=="complex64")throw new Error("Error creating a new Scalar: value must be a primitive (number|boolean|string)");if(t==="string"&&an(e)&&!(e instanceof Uint8Array))throw new Error("When making a scalar from encoded string, the value must be `Uint8Array`.");return Or(e,[],[],t)}function kR(e){let t={x:M(e,"x","selu")};return P.runKernel(Yo,t)}var Gc=L({selu_:kR});function IR(e,t,n,a,r,s=[1,1],i="NHWC"){let o=M(e,"x","separableConv2d"),u=M(t,"depthwiseFilter","separableConv2d"),l=M(n,"pointwiseFilter","separableConv2d"),d=o,p=!1;if(o.rank===3&&(p=!0,d=H(o,[1,o.shape[0],o.shape[1],o.shape[2]])),i==="NCHW")throw new Error("separableConv2d currently does not support dataFormat NCHW; only NHWC is supported");F(d.rank===4,()=>`Error in separableConv2d: input must be rank 4, but got rank ${d.rank}.`),F(u.rank===4,()=>`Error in separableConv2d: depthwise filter must be rank 4, but got rank ${u.rank}.`),F(l.rank===4,()=>`Error in separableConv2d: pointwise filter must be rank 4, but got rank ${u.rank}.`),F(l.shape[0]===1,()=>`Error in separableConv2d: the first dimension of pointwise filter must be 1, but got ${l.shape[0]}.`),F(l.shape[1]===1,()=>`Error in separableConv2d: the second dimension of pointwise filter must be 1, but got ${l.shape[1]}.`);let c=u.shape[2],h=u.shape[3];F(l.shape[2]===c*h,()=>`Error in separableConv2d: the third dimension of pointwise filter must be ${c*h}, but got ${l.shape[2]}.`);let m=vl(d,u,a,r,i,s),f=pr(m,l,1,"valid",i);return p?H(f,[f.shape[1],f.shape[2],f.shape[3]]):f}var B1=L({separableConv2d_:IR});async function SR(e,t){let n=M(e,"x","setdiff1d"),a=M(t,"y","setdiff1d");F(n.dtype===a.dtype,()=>`x and y should have the same dtype, but got x (${n.dtype}) and y (${a.dtype}).`),F(n.rank===1,()=>`x should be 1D tensor, but got x (${n.shape}).`),F(a.rank===1,()=>`y should be 1D tensor, but got y (${a.shape}).`);let r=await n.data(),s=await a.data(),i=new Set(s),o=0;for(let d=0;d`slice1d expects a rank-1 tensor, but got a rank-${a.rank} tensor`),Re(a,[t],[n])}var Kc=L({slice1d_:CR});function RR(e,t,n){let a=M(e,"x","slice2d");return F(a.rank===2,()=>`slice2d expects a rank-2 tensor, but got a rank-${a.rank} tensor`),Re(a,t,n)}var j1=L({slice2d_:RR});function MR(e,t,n){let a=M(e,"x","slice3d");return F(a.rank===3,()=>`slice3d expects a rank-3 tensor, but got a rank-${a.rank} tensor`),Re(a,t,n)}var Zc=L({slice3d_:MR});function FR(e,t,n){let a=M(e,"x","slice4d");return F(a.rank===4,()=>`slice4d expects a rank-4 tensor, but got a rank-${a.rank} tensor`),Re(a,t,n)}var dd=L({slice4d_:FR});function $R(e,t=-1){let n=M(e,"logits","softmax","float32");if(t===-1&&(t=n.rank-1),t!==n.rank-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${n.rank} and dim was ${t}`);let a={logits:n},r={dim:t};return P.runKernel(ti,a,r)}var pd=L({softmax_:$R});function DR(e){F(e.dtype==="complex64",()=>`The dtype for tf.spectral.fft() must be complex64 but got ${e.dtype}.`);let t={input:e};return P.runKernel(ec,t)}var cd=L({fft_:DR});function zR(e){F(e.dtype==="complex64",()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${e.dtype}.`);let t={input:e};return P.runKernel(tc,t)}var Cl=L({ifft_:zR});function OR(e){let t=e.shape[e.shape.length-1],n=e.size/t,a;if(t<=2){let r=H(e,[n,t]);a=Cl(r)}else{let r=[n,2*(t-1)],s=H(ud(e),[n,t]),i=H(zc(e),[n,t]),o=Bn(Re(s,[0,1],[n,t-2]),1),u=W(Bn(Re(i,[0,1],[n,t-2]),1),we(-1)),l=lt([s,o],1),d=lt([i,u],1),p=H(zr(l,d),[r[0],r[1]]);a=Cl(p)}if(a=ud(a),e.rank===3&&e.shape[0]!==0){let r=a,s=e.shape[0];a=H(a,[s,a.shape[0]/s,a.shape[1]]),r.dispose()}return a}var Yc=L({irfft_:OR});function _R(e,t,n=0){let a={x:M(e,"x","split")},r={numOrSizeSplits:t,axis:n};return P.runKernel(nl,a,r)}var qt=L({split_:_R});function PR(e,t){F(e.dtype==="float32",()=>`The dtype for rfft() must be real value but got ${e.dtype}`);let n=e.shape[e.shape.length-1],a=e.size/n,r;if(t!=null&&t0),f=e.shape.map(y=>y);f[e.shape.length-1]=t,r=Re(e,m,f),n=t}else if(t!=null&&t>n){let m=e.shape.map(f=>f);m[e.shape.length-1]=t-n,r=lt([e,$t(m)],e.shape.length-1),n=t}else r=e;let s=Ge(r),i=H(zr(r,s),[a,n]),o=cd(i),u=Math.floor(n/2)+1,l=ud(o),d=zc(o),p=qt(l,[u,n-u],l.shape.length-1),c=qt(d,[u,n-u],d.shape.length-1),h=r.shape.slice();return h[r.shape.length-1]=u,H(zr(p[0],c[0]),h)}var hd=L({rfft_:PR});function LR(e){let t={x:M(e,"x","sqrt")};return P.runKernel(Qs,t)}var en=L({sqrt_:LR});function WR(e,t){let n=M(e,"a","squaredDifference"),a=M(t,"b","squaredDifference");[n,a]=kt(n,a),ct(n.shape,a.shape);let r={a:n,b:a},s={};return P.runKernel(ni,r,s)}var Jc=L({squaredDifference_:WR});function BR(e,t){let n=M(e,"x","squeeze");return H(n,Gx(n.shape,t).newShape)}var ha=L({squeeze_:BR});function VR(e,t=0){let n=Yu(e,"tensors","stack","string_or_numeric");F(n.length>=1,()=>"Pass at least one tensor to tf.stack"),n.length>0&&F(t<=n[0].rank,()=>"Axis must be <= rank of the tensor");let a=n,r={axis:t};return P.runKernel(Ho,a,r)}var cn=L({stack_:VR});function jR(e,t=0){let n={x:M(e,"x","step")},a={alpha:t};return P.runKernel(Dr,n,a)}var Rl=L({step_:jR});function UR(e,t,n,a,r=0,s=0,i=0,o=0,u=0){let l={x:M(e,"x","stridedSlice")},d={begin:t,end:n,strides:a,beginMask:r,endMask:s,ellipsisMask:i,newAxisMask:o,shrinkAxisMask:u};return P.runKernel(al,l,d)}var U1=L({stridedSlice_:UR});function HR(e){let t={x:M(e,"x","tan")};return P.runKernel(ri,t)}var H1=L({tan_:HR});function Mt(e,t){ps(e);let n=Wa(e,t);if(n.length!==1)throw new Error("tensor1d() requires values to be a flat/TypedArray");return Or(e,null,n,t)}function wa(e,t,n){if(ps(e),t!=null&&t.length!==2)throw new Error("tensor2d() requires shape to have two numbers");let a=Wa(e,n);if(a.length!==2&&a.length!==1)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(a.length===1&&t==null)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return Or(e,t,a,n)}function GR(e,t,n){if(ps(e),t!=null&&t.length!==4)throw new Error("tensor4d() requires shape to have four numbers");let a=Wa(e,n);if(a.length!==4&&a.length!==1)throw new Error("tensor4d() requires values to be number[][][][] or flat/TypedArray");if(a.length===1&&t==null)throw new Error("tensor4d() requires shape to be provided when `values` are a flat array");return Or(e,t,a,n)}function qR(e,t,n){if(ps(e),t!=null&&t.length!==5)throw new Error("tensor5d() requires shape to have five numbers");let a=Wa(e,n);if(a.length!==5&&a.length!==1)throw new Error("tensor5d() requires values to be number[][][][][] or flat/TypedArray");if(a.length===1&&t==null)throw new Error("tensor5d() requires shape to be provided when `values` are a flat array");return Or(e,t,a,n)}function XR(e,t,n){if(ps(e),t!=null&&t.length!==6)throw new Error("tensor6d() requires shape to have six numbers");let a=Wa(e,n);if(a.length!==6&&a.length!==1)throw new Error("tensor6d() requires values to be number[][][][][][] or flat/TypedArray");if(a.length===1&&t==null)throw new Error("tensor6d() requires shape to be provided when `values` are a flat array");return t=t||a,Or(e,t,a,n)}function KR(e,t=1,n=!0){let a=M(e,"x","topk");if(a.rank===0)throw new Error("topk() expects the input to be of rank 1 or higher");let r=a.shape[a.shape.length-1];if(t>r)throw new Error(`'k' passed to topk() must be <= the last dimension (${r}) but got ${t}`);let s={x:a},i={k:t,sorted:n},[o,u]=P.runKernel(rl,s,i);return{values:o,indices:u}}var G1=L({topk_:KR});function ZR(e,t=0,n=1,a,r){if(a!=null&&a==="bool")throw new Error("Unsupported data type $ { dtype }");let s=new L1(t,n,a,!0,r),i=Be(e,a);for(let o=0;o0,()=>"The input tensor must be at least 1D");let a={x:n},r={axis:t},[s,i]=P.runKernel(mc,a,r);return{values:s,indices:i}}var eh=L({unique_:YR});function JR(e,t,n){let a=M(e,"x","unsortedSegmentSum"),r=M(t,"segmentIds","unsortedSegmentSum","int32");F(Ht(n),()=>"numSegments must be of dtype int");let s={x:a,segmentIds:r},i={numSegments:n};return P.runKernel(Bu,s,i)}var q1=L({unsortedSegmentSum_:JR});function QR(e,t=0){let n=M(e,"x","unstack","string_or_numeric");F(t>=-n.shape.length&&t`Axis = ${t} is not in [-${n.shape.length}, ${n.shape.length})`);let a={value:n},r={axis:t};return P.runKernel(il,a,r)}var fa=L({unstack_:QR});function N3(e,t=!0,n,a){return P.makeVariable(e,t,n,a)}function T3(e,t){let n=[];for(let s=0;s0,()=>"mask cannot be scalar"),un(o.slice(s,s+i),r.shape,"mask's shape must match the first K dimensions of tensor's shape,");let u=1;for(let f=s;f"Shape mismatch in v and x");let u=we(1),l=ye(u,o),d=W(ye(i,s),l);if(r){F(a!=null,()=>"When using zeroDebias: true, step is required.");let p=M(a,"step","movingAverage");d=fe(d,ye(u,hr(o,p)))}return se(s,d)}var sM=L({movingAverage_:rM});function iM(e,t,n){let a=M(e,"indices","scatterND","int32"),r=M(t,"updates","scatterND");a1(r,a,n);let s={indices:a,updates:r},i={shape:n};return P.runKernel(Ko,s,i)}var C3=L({scatterND_:iM});function oM(e,t,n,a){if(e.dtype!=="int32")throw new Error(`tf.sparseToDense() expects the indices to be int32 type, but the dtype was ${e.dtype}.`);if(e.rank>2)throw new Error(`sparseIndices should be a scalar, vector, or matrix, but got shape ${e.shape}.`);let r=e.rank>0?e.shape[0]:1,s=e.rank>1?e.shape[1]:1;if(n.length!==s)throw new Error(`outputShape has incorrect number of elements:, ${n.length}, should be: ${s}.`);let i=t.size;if(!(t.rank===0||t.rank===1&&i===r))throw new Error(`sparseValues has incorrect shape ${t.shape}, should be [] or [${r}]`);if(t.dtype!==a.dtype)throw new Error("sparseValues.dtype must match defaultValues.dtype")}function lM(e,t,n,a=0){let r=M(e,"sparseIndices","sparseToDense","int32"),s=M(t,"sparseValues","sparseToDense"),i=M(a,"defaultValue","sparseToDense",s.dtype);oM(r,s,n,i);let o={sparseIndices:r,sparseValues:s,defaultValue:i},u={outputShape:n};return P.runKernel(fc,o,u)}var K1=L({sparseToDense_:lM});function uM(e,t){let n=M(t,"indices","gatherND","int32"),a={params:M(e,"x","gatherND"),indices:n};return P.runKernel(Co,a)}var R3=L({gatherND_:uM});function dM(e,t){if(t==null)return e.shape.slice();if(lr(e.shape,t))return t;if(e.shape.length===t.length){let n=[];for(let a=0;a`x has to be a floating point tensor since it's going to be scaled, but got a ${r.dtype} tensor instead.`),F(t>=0&&t<1,()=>`rate must be a float in the range [0, 1), but got ${t}.`),t===0)return e instanceof We?r.clone():r;let s=dM(r,n),i=1-t,o=fe(Il(se(Tl(s,0,1,"float32",a),i)),i);return W(r,o)}var M3=L({dropout_:pM});function F3(e){return Math.floor(Math.pow(2,Math.ceil(Math.log(e)/Math.log(2))))}function Z1(e,t,n){let a=1-e%2,r=new Float32Array(e);for(let s=0;s1,()=>`inTopK() expects the predictions to be of rank 2 or higher, but got ${a.rank}`),F(a.rank-1===r.rank,()=>`predictions rank should be 1 larger than targets rank, but got predictions rank ${a.rank} and targets rank ${r.rank}`),un(a.shape.slice(0,a.shape.length-1),r.shape,"predictions's shape should be align with the targets' shape, except the last dimension.");let s=a.shape[a.shape.length-1];F(n>0&&n<=s,()=>`'k' passed to inTopK() must be > 0 && <= the predictions last dimension (${s}), but got ${n}`);let i=await a.data(),o=await r.data(),[u,l]=[i.length/s,s],d=qx("bool",u);for(let p=0;py.value-f.value),d[p]=0;for(let f=0;fyM,depthwiseConv2d:()=>bM,matMul:()=>wM});function fM(e,t,n,a,r,s="NHWC",i){let o=e;e.rank===3&&(o=H(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let u=t;u.rank===3&&(u=H(t,[1,t.shape[0],t.shape[1],t.shape[2]])),F(o.rank===4,()=>`Error in conv2dDerFilter: input must be rank 4, but got shape ${o.shape}.`),F(u.rank===4,()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${u.shape}.`),F(n.length===4,()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${n}.`);let l=s==="NHWC"?o.shape[3]:o.shape[1],d=s==="NHWC"?u.shape[3]:u.shape[1];F(l===n[2],()=>`Error in conv2dDerFilter: depth of input ${l}) must match input depth in filter (${n[2]}.`),F(d===n[3],()=>`Error in conv2dDerFilter: depth of dy (${d}) must match output depth for filter (${n[3]}).`),i!=null&&F(Ht(r),()=>`Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`);let p={x:o,dy:u},c={strides:a,pad:r,dataFormat:s,dimRoundingMode:i,filterShape:n};return P.runKernel(jp,p,c)}var Y1=L({conv2DBackpropFilter_:fM});function nh(e,t,n){if(n==null||n==="linear")return e;if(n==="relu")return W(e,Rl(t));throw new Error(`Cannot compute gradient for fused activation ${n}.`)}function ah(e,t){let n=t,a=Wt(e.shape,t.shape);return a.length>0&&(n=Se(n,a)),H(n,e.shape)}function rh(e,t,n,a){if(t==="linear")return e;if(t==="relu")return Ha(e);if(t==="elu")return wl(e);if(t==="relu6")return jc(e);if(t==="prelu")return ld(e,n);if(t==="leakyrelu")return rd(e,a);if(t==="sigmoid")return Nn(e);throw new Error(`Unknown fused activation ${t}.`)}var sh=(e,t)=>!(e>0)||t==="linear";function mM({x:e,filter:t,strides:n,pad:a,dataFormat:r="NHWC",dilations:s=[1,1],dimRoundingMode:i,bias:o,activation:u="linear",preluActivationWeights:l,leakyreluAlpha:d}){if(u=u||"linear",sh(P.state.gradientDepth,u)===!1){let b=pr(e,t,n,a,r,s,i);return o!=null&&(b=se(b,o)),rh(b,u,l,d)}let p=M(e,"x","conv2d"),c=M(t,"filter","conv2d"),h=p,m=!1;p.rank===3&&(m=!0,h=H(p,[1,p.shape[0],p.shape[1],p.shape[2]])),F(h.rank===4,()=>`Error in fused conv2d: input must be rank 4, but got rank ${h.rank}.`),F(c.rank===4,()=>`Error in fused conv2d: filter must be rank 4, but got rank ${c.rank}.`),i!=null&&F(Ht(a),()=>`Error in fused conv2d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${a}.`),F(h.shape[3]===c.shape[2],()=>`Error in conv2d: depth of input (${h.shape[3]}) must match input depth for filter ${c.shape[2]}.`),F(Va(n,s),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`),F(r==="NHWC",()=>`Error in conv2d: got dataFormat of ${r} but only NHWC is currently supported.`);let f=ed(h.shape,c.shape,n,s,a,i),y;o!=null&&(y=M(o,"bias","fused conv2d"),[y]=kt(y,p),ct(f.outShape,y.shape));let A;l!=null&&(A=M(l,"prelu weights","fused conv2d"));let g=(b,v)=>{let[S,T,E,$]=v,z=nh(b,E,u);F(Lr(s),()=>`Error in gradient of fused conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${s}'`);let O=w1(T.shape,z,S,n,a),_=Y1(T,z,S.shape,n,a),D=[O,_];if($!=null){let U=ah($,z);D.push(U)}return D},x={x:h,filter:c,bias:y,preluActivationWeights:A},w={strides:n,pad:a,dataFormat:r,dilations:s,dimRoundingMode:i,activation:u,leakyreluAlpha:d};return o==null?ja((b,v,S)=>{let T=P.runKernel(li,x,w);return S([v,b,T]),m&&(T=H(T,[T.shape[1],T.shape[2],T.shape[3]])),{value:T,gradFunc:g}})(h,c):ja((b,v,S,T)=>{let E=P.runKernel(li,x,w);return T([v,b,E,S]),m&&(E=H(E,[E.shape[1],E.shape[2],E.shape[3]])),{value:E,gradFunc:g}})(h,c,y)}var yM=L({fusedConv2d_:mM});function AM(e,t,n,a,r,s=[1,1],i){let o=e;e.rank===3&&(o=H(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let u=t;u.rank===3&&(u=H(t,[1,t.shape[0],t.shape[1],t.shape[2]]));let l={x:o,dy:u},d={strides:a,pad:r,dimRoundingMode:i,dilations:s,filterShape:n};return P.runKernel(qp,l,d)}var $3=L({depthwiseConv2dNativeBackpropFilter_:AM});function gM(e,t,n,a,r,s=[1,1],i){let o=t,u=!1;t.rank===3&&(u=!0,o=H(t,[1,t.shape[0],t.shape[1],t.shape[2]]));let l={dy:o,filter:n},d={strides:a,pad:r,dimRoundingMode:i,dilations:s,inputShape:e},p=P.runKernel(Xp,l,d);return u?H(p,[p.shape[1],p.shape[2],p.shape[3]]):p}var D3=L({depthwiseConv2dNativeBackpropInput_:gM});function xM({x:e,filter:t,strides:n,pad:a,dataFormat:r="NHWC",dilations:s=[1,1],dimRoundingMode:i,bias:o,activation:u="linear",preluActivationWeights:l,leakyreluAlpha:d}){if(sh(P.state.gradientDepth,u)===!1){let b=vl(e,t,n,a,r,s,i);return o!=null&&(b=se(b,o)),rh(b,u,l,d)}let p=M(e,"x","depthwiseConv2d"),c=M(t,"filter","depthwiseConv2d"),h=p,m=!1;p.rank===3&&(m=!0,h=H(p,[1,p.shape[0],p.shape[1],p.shape[2]])),F(h.rank===4,()=>`Error in fused depthwiseConv2d: input must be rank 4, but got rank ${h.rank}.`),F(c.rank===4,()=>`Error in fused depthwiseConv2d: filter must be rank 4, but got rank ${c.rank}.`),F(h.shape[3]===c.shape[2],()=>`Error in fused depthwiseConv2d: number of input channels (${h.shape[3]}) must match the inChannels dimension in filter ${c.shape[2]}.`),s==null&&(s=[1,1]),F(Va(n,s),()=>`Error in fused depthwiseConv2d: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`),i!=null&&F(Ht(a),()=>`Error in fused depthwiseConv2d: pad must be an integer when using dimRoundingMode ${i} but got pad ${a}.`);let f=ed(h.shape,c.shape,n,s,a,i,!0),y;o!=null&&(y=M(o,"bias","fused conv2d"),[y]=kt(y,p),ct(f.outShape,y.shape));let A;l!=null&&(A=M(l,"prelu weights","fused depthwiseConv2d"));let g=(b,v)=>{F(Lr(s),()=>`Error in gradient of fused depthwiseConv2d: dilation rates greater than 1 are not yet supported. Got dilations '${s}'`);let[S,T,E,$]=v,z=nh(b,E,u),O=D3(T.shape,z,S,n,a,s,i),_=$3(T,z,S.shape,n,a,s,i);if($!=null){let D=ah(y,z);return[O,_,D]}return[O,_]},x={x:h,filter:c,bias:y,preluActivationWeights:A},w={strides:n,pad:a,dataFormat:r,dilations:s,dimRoundingMode:i,activation:u,leakyreluAlpha:d};return o==null?ja((b,v,S)=>{let T=P.runKernel(ui,x,w);return S([v,b,T]),m&&(T=H(T,[T.shape[1],T.shape[2],T.shape[3]])),{value:T,gradFunc:g}})(h,c):ja((b,v,S,T)=>{let E=P.runKernel(ui,x,w);return T([v,b,E,S]),m&&(E=H(E,[E.shape[1],E.shape[2],E.shape[3]])),{value:E,gradFunc:g}})(h,c,y)}var bM=L({fusedDepthwiseConv2d_:xM});function vM({a:e,b:t,transposeA:n=!1,transposeB:a=!1,bias:r,activation:s="linear",preluActivationWeights:i,leakyreluAlpha:o}){if(sh(P.state.gradientDepth,s)===!1){let $=Ve(e,t,n,a);return r!=null&&($=se($,r)),rh($,s,i,o)}let u=M(e,"a","fused matMul"),l=M(t,"b","fused matMul");[u,l]=kt(u,l);let d=n?u.shape[u.rank-2]:u.shape[u.rank-1],p=a?l.shape[l.rank-1]:l.shape[l.rank-2],c=n?u.shape[u.rank-1]:u.shape[u.rank-2],h=a?l.shape[l.rank-2]:l.shape[l.rank-1],m=u.shape.slice(0,-2),f=l.shape.slice(0,-2),y=Rt(m),A=Rt(f);F(u.rank>=2&&l.rank>=2&&u.rank===l.rank,()=>`Error in fused matMul: inputs must have the same rank of at least 2, got ranks ${u.rank} and ${l.rank}.`),F(lr(m,f),()=>`Error in fused matMul: outer dimensions (${m}) and (${f}) of Tensors with shapes ${u.shape} and ${l.shape} must match.`),F(d===p,()=>`Error in fused matMul: inner shapes (${d}) and (${p}) of Tensors with shapes ${u.shape} and ${l.shape} and transposeA=${n} and transposeB=${a} must match.`);let g=u.shape.slice(0,-2).concat([c,h]),x=n?H(u,[y,d,c]):H(u,[y,c,d]),w=a?H(l,[A,h,p]):H(l,[A,p,h]),b;r!=null&&(b=M(r,"bias","fused matMul"),[b]=kt(b,u),ct(g,b.shape));let v;i!=null&&(v=M(i,"prelu weights","fused matMul"));let S=($,z)=>{let[O,_,D,U]=z,q=nh(H($,D.shape),D,s),G,Q;if(!n&&!a?(G=Ve(q,_,!1,!0),Q=Ve(O,q,!0,!1)):!n&&a?(G=Ve(q,_,!1,!1),Q=Ve(q,O,!0,!1)):n&&!a?(G=Ve(_,q,!1,!0),Q=Ve(O,q,!1,!1)):(G=Ve(_,q,!0,!0),Q=Ve(q,O,!0,!0)),r!=null){let Y=ah(U,q);return[G,Q,Y]}else return[G,Q]},T={a:x,b:w,bias:b,preluActivationWeights:v},E={transposeA:n,transposeB:a,activation:s,leakyreluAlpha:o};return r==null?ja(($,z,O)=>{let _=P.runKernel(oi,T,E);return O([$,z,_]),{value:H(_,g),gradFunc:S}})(x,w):ja(($,z,O,_)=>{let D=P.runKernel(oi,T,E);return _([$,z,D,O]),{value:H(D,g),gradFunc:S}})(x,w,b)}var wM=L({fusedMatMul_:vM});function kM(e){return Z1(e,.54,.46)}var IM=L({hammingWindow_:kM});function SM(e){return Z1(e,.5,.5)}var z3=L({hannWindow_:SM});function NM(e,t,n,a=!1,r=0){let s=0,i=[];for(;s+t<=e.size;)i.push(Re(e,s,t)),s+=n;if(a)for(;s`Error in cropAndResize: image must be rank 4,but got rank ${i.rank}.`),F(o.rank===2&&o.shape[1]===4,()=>`Error in cropAndResize: boxes must be have size [${l},4] but had shape ${o.shape}.`),F(u.rank===1&&u.shape[0]===l,()=>`Error in cropAndResize: boxInd must be have size [${l}] but had shape ${o.shape}.`),F(a.length===2,()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${a.length}.`),F(a[0]>=1&&a[1]>=1,()=>`cropSize must be atleast [1,1], but was ${a}`),F(r==="bilinear"||r==="nearest",()=>`method must be bilinear or nearest, but was ${r}`);let d={image:i,boxes:o,boxInd:u},p={method:r,extrapolationValue:s,cropSize:a};return P.runKernel(bo,d,p)}var RM=L({cropAndResize_:CM});function MM(e){let t=M(e,"image","flipLeftRight","float32");F(t.rank===4,()=>`Error in flipLeftRight: image must be rank 4,but got rank ${t.rank}.`);let n={image:t};return P.runKernel(To,n,{})}var FM=L({flipLeftRight_:MM});function $M(e,t,n=0,a=.5){let r=M(e,"image","rotateWithOffset","float32");F(r.rank===4,()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${r.rank}.`);let s={image:r},i={radians:t,fillValue:n,center:a};return P.runKernel(ll,s,i)}var DM=L({rotateWithOffset_:$M});function Ml(e,t,n,a,r,s){a==null&&(a=.5),r==null&&(r=Number.NEGATIVE_INFINITY),s==null&&(s=0);let i=e.shape[0];return n=Math.min(n,i),F(0<=a&&a<=1,()=>`iouThreshold must be in [0, 1], but was '${a}'`),F(e.rank===2,()=>`boxes must be a 2D tensor, but was of rank '${e.rank}'`),F(e.shape[1]===4,()=>`boxes must have 4 columns, but 2nd dimension was ${e.shape[1]}`),F(t.rank===1,()=>"scores must be a 1D tensor"),F(t.shape[0]===i,()=>`scores has incompatible shape with boxes. Expected ${i}, but was ${t.shape[0]}`),F(0<=s&&s<=1,()=>`softNmsSigma must be in [0, 1], but was '${s}'`),{maxOutputSize:n,iouThreshold:a,scoreThreshold:r,softNmsSigma:s}}function zM(e,t,n,a=.5,r=Number.NEGATIVE_INFINITY){let s=M(e,"boxes","nonMaxSuppression"),i=M(t,"scores","nonMaxSuppression"),o=Ml(s,i,n,a,r);n=o.maxOutputSize,a=o.iouThreshold,r=o.scoreThreshold;let u={maxOutputSize:n,iouThreshold:a,scoreThreshold:r};return P.runKernel(Bo,{boxes:s,scores:i},u)}var OM=L({nonMaxSuppression_:zM});function _M(e,t,n){let a=PM(e,t,n),r=a<0?-(a+1):a;e.splice(r,0,t)}function PM(e,t,n){return WM(e,t,n||LM)}function LM(e,t){return e>t?1:e>>1);let o=n(t,e[s]);o>0?a=s+1:(r=s,i=!o)}return i?a:-a-1}function _3(e,t,n,a,r){return J1(e,t,n,a,r,0)}function P3(e,t,n,a,r,s){return J1(e,t,n,a,r,0,!1,s,!0)}function L3(e,t,n,a,r,s){return J1(e,t,n,a,r,s,!0)}function J1(e,t,n,a,r,s,i=!1,o=!1,u=!1){let l=[];for(let y=0;yr&&l.push({score:t[y],boxIndex:y,suppressBeginIndex:0});l.sort(W3);let d=s>0?-.5/s:0,p=[],c=[];for(;p.length0;){let y=l.pop(),{score:A,boxIndex:g,suppressBeginIndex:x}=y;if(A=x;--b){let v=BM(e,g,p[b]);if(v>=a){w=!0;break}if(y.score=y.score*VM(a,d,v),y.score<=r)break}y.suppressBeginIndex=p.length,w||(y.score===A?(p.push(g),c.push(y.score)):y.score>r&&_M(l,y,W3))}let h=p.length,m=n-h;o&&m>0&&(p.push(...new Array(m).fill(0)),c.push(...new Array(m).fill(0)));let f={selectedIndices:p};return i&&(f.selectedScores=c),u&&(f.validOutputs=h),f}function BM(e,t,n){let a=e.subarray(t*4,t*4+4),r=e.subarray(n*4,n*4+4),s=Math.min(a[0],a[2]),i=Math.min(a[1],a[3]),o=Math.max(a[0],a[2]),u=Math.max(a[1],a[3]),l=Math.min(r[0],r[2]),d=Math.min(r[1],r[3]),p=Math.max(r[0],r[2]),c=Math.max(r[1],r[3]),h=(o-s)*(u-i),m=(p-l)*(c-d);if(h<=0||m<=0)return 0;let f=Math.max(s,l),y=Math.max(i,d),A=Math.min(o,p),g=Math.min(u,c),x=Math.max(A-f,0)*Math.max(g-y,0);return x/(h+m-x)}function VM(e,t,n){let a=Math.exp(t*n*n);return n<=e?a:0}function W3(e,t){return e.score-t.score||e.score===t.score&&t.boxIndex-e.boxIndex}async function jM(e,t,n,a=.5,r=Number.NEGATIVE_INFINITY){let s=M(e,"boxes","nonMaxSuppressionAsync"),i=M(t,"scores","nonMaxSuppressionAsync"),o=Ml(s,i,n,a,r);n=o.maxOutputSize,a=o.iouThreshold,r=o.scoreThreshold;let u=await Promise.all([s.data(),i.data()]),l=u[0],d=u[1],{selectedIndices:p}=_3(l,d,n,a,r);return s!==e&&s.dispose(),i!==t&&i.dispose(),Mt(p,"int32")}var UM=jM;function HM(e,t,n,a=.5,r=Number.NEGATIVE_INFINITY,s=0){let i=M(e,"boxes","nonMaxSuppression"),o=M(t,"scores","nonMaxSuppression"),u=Ml(i,o,n,a,r,s);n=u.maxOutputSize,a=u.iouThreshold,r=u.scoreThreshold,s=u.softNmsSigma;let l={boxes:i,scores:o},d={maxOutputSize:n,iouThreshold:a,scoreThreshold:r,softNmsSigma:s},p=P.runKernel(jo,l,d);return{selectedIndices:p[0],selectedScores:p[1]}}var GM=L({nonMaxSuppressionWithScore_:HM});async function qM(e,t,n,a=.5,r=Number.NEGATIVE_INFINITY,s=0){let i=M(e,"boxes","nonMaxSuppressionAsync"),o=M(t,"scores","nonMaxSuppressionAsync"),u=Ml(i,o,n,a,r,s);n=u.maxOutputSize,a=u.iouThreshold,r=u.scoreThreshold,s=u.softNmsSigma;let l=await Promise.all([i.data(),o.data()]),d=l[0],p=l[1],{selectedIndices:c,selectedScores:h}=L3(d,p,n,a,r,s);return i!==e&&i.dispose(),o!==t&&o.dispose(),{selectedIndices:Mt(c,"int32"),selectedScores:Mt(h)}}var XM=qM;function KM(e,t,n,a=.5,r=Number.NEGATIVE_INFINITY,s=!1){let i=M(e,"boxes","nonMaxSuppression"),o=M(t,"scores","nonMaxSuppression"),u=Ml(i,o,n,a,r,null),l=u.maxOutputSize,d=u.iouThreshold,p=u.scoreThreshold,c={boxes:i,scores:o},h={maxOutputSize:l,iouThreshold:d,scoreThreshold:p,padToMaxOutputSize:s},m=P.runKernel(Vo,c,h);return{selectedIndices:m[0],validOutputs:m[1]}}var ZM=L({nonMaxSuppressionPadded_:KM});async function YM(e,t,n,a=.5,r=Number.NEGATIVE_INFINITY,s=!1){let i=M(e,"boxes","nonMaxSuppressionAsync"),o=M(t,"scores","nonMaxSuppressionAsync"),u=Ml(i,o,n,a,r,null),l=u.maxOutputSize,d=u.iouThreshold,p=u.scoreThreshold,[c,h]=await Promise.all([i.data(),o.data()]),{selectedIndices:m,validOutputs:f}=P3(c,h,l,d,p,s);return i!==e&&i.dispose(),o!==t&&o.dispose(),{selectedIndices:Mt(m,"int32"),validOutputs:we(f,"int32")}}var JM=YM;function QM(e,t,n=!1,a=!1){let r=M(e,"images","resizeBilinear");F(r.rank===3||r.rank===4,()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${r.rank}.`),F(t.length===2,()=>`Error in resizeBilinear: new shape must 2D, but got shape ${t}.`),F(a===!1||n===!1,()=>"Error in resizeBilinear: If halfPixelCenters is true, alignCorners must be false.");let s=r,i=!1;r.rank===3&&(i=!0,s=H(r,[1,r.shape[0],r.shape[1],r.shape[2]]));let[]=t,o={images:s},u={alignCorners:n,halfPixelCenters:a,size:t},l=P.runKernel(Gs,o,u);return i?H(l,[l.shape[1],l.shape[2],l.shape[3]]):l}var B3=L({resizeBilinear_:QM});function eF(e,t,n=!1,a=!1){let r=M(e,"images","resizeNearestNeighbor");F(r.rank===3||r.rank===4,()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${r.rank}.`),F(t.length===2,()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${t}.`),F(r.dtype==="float32"||r.dtype==="int32",()=>"`images` must have `int32` or `float32` as dtype"),F(a===!1||n===!1,()=>"Error in resizeNearestNeighbor: If halfPixelCenters is true, alignCorners must be false.");let s=r,i=!1;r.rank===3&&(i=!0,s=H(r,[1,r.shape[0],r.shape[1],r.shape[2]]));let[]=t,o={images:s},u={alignCorners:n,halfPixelCenters:a,size:t},l=P.runKernel(Pu,o,u);return i?H(l,[l.shape[1],l.shape[2],l.shape[3]]):l}var V3=L({resizeNearestNeighbor_:eF});function tF(e,t="binary",n=!1,a=.5){let r=M(e,"image","threshold"),s=.2989,i=.587,o=.114,u=r.shape[0]*r.shape[1],l=W(Mt([a]),255),d,p,c,h;if(F(r.rank===3,()=>`Error in threshold: image must be rank 3,but got rank ${r.rank}.`),F(r.shape[2]===3||r.shape[2]===1,()=>`Error in threshold: image color channel must be equal to 3 or 1but got ${r.shape[2]}.`),F(r.dtype==="int32"||r.dtype==="float32",()=>`Error in dtype: image dtype must be int32 or float32,but got dtype ${r.dtype}.`),F(t==="otsu"||t==="binary",()=>`Method must be binary or otsu, but was ${t}`),r.shape[2]===3){[d,p,c]=qt(r,[1,1,1],-1);let f=W(d,s),y=W(p,i),A=W(c,o);h=se(se(f,y),A)}else h=e;if(t==="otsu"){let f=b1(me(Uc(h),"int32"),rn([]),256);l=nF(f,u)}let m=n?jr(h,l):_n(h,l);return me(W(m,255),"int32")}function nF(e,t){let n=Mt([-1]),a=Mt([0]),r=Mt([0]),s,i,o,u,l,d;for(let p=0;p`Error in transform: image must be rank 4,but got rank ${i.rank}.`),F(o.rank===2&&(o.shape[0]===i.shape[0]||o.shape[0]===1)&&o.shape[1]===8,()=>"Error in transform: Input transform should be batch x 8 or 1 x 8"),F(s==null||s.length===2,()=>`Error in transform: outputShape must be [height, width] or null, but got ${s}.`);let u={image:i,transforms:o},l={interpolation:n,fillMode:a,fillValue:r,outputShape:s};return P.runKernel(sl,u,l)}var sF=L({transform_:rF});function iF(e,t,n){F(t%1==0,()=>`bandPart(): numLower must be an integer, got ${t}.`),F(n%1==0,()=>`bandPart(): numUpper must be an integer, got ${n}.`);let a=M(e,"a","bandPart");F(a.rank>=2,()=>`bandPart(): Rank must be at least 2, got ${a.rank}.`);let r=a.shape,[s,i]=a.shape.slice(-2);if(!(t<=s))throw new Error(`bandPart(): numLower (${t}) must not be greater than the number of rows (${s}).`);if(!(n<=i))throw new Error(`bandPart(): numUpper (${n}) must not be greater than the number of columns (${i}).`);t<0&&(t=s),n<0&&(n=i);let o=H(El(0,s,1,"int32"),[-1,1]),u=El(0,i,1,"int32"),l=ye(o,u),d=ca(jr(l,we(+t,"int32")),Vr(l,we(-n,"int32"))),p=$t([s,i],a.dtype);return H(cn(fa(H(a,[-1,s,i])).map(c=>sn(d,c,p))),r)}var oF=L({bandPart_:iF});function lF(e){let t;if(Array.isArray(e)){t=!1,F(e!=null&&e.length>0,()=>"Gram-Schmidt process: input must not be null, undefined, or empty");let r=e[0].shape[0];for(let s=1;s`Gram-Schmidt: Non-unique lengths found in the input vectors: (${e[s].shape[0]} vs. ${r})`)}else t=!0,e=qt(e,e.shape[0],0).map(r=>ha(r,[0]));F(e.length<=e[0].shape[0],()=>`Gram-Schmidt: Number of vectors (${e.length}) exceeds number of dimensions (${e[0].shape[0]}).`);let n=[],a=e;for(let r=0;r{let s=a[r];if(r>0)for(let i=0;i=2,()=>`qr() requires input tensor to have a rank >= 2, but got rank ${e.rank}`),e.rank===2)return j3(e,t);{let n=e.shape.slice(0,e.shape.length-2).reduce((u,l)=>u*l),a=fa(H(e,[n,e.shape[e.shape.length-2],e.shape[e.shape.length-1]]),0),r=[],s=[];a.forEach(u=>{let[l,d]=j3(u,t);r.push(l),s.push(d)});let i=H(cn(r,0),e.shape),o=H(cn(s,0),e.shape);return[i,o]}}function j3(e,t=!1){return P.tidy(()=>{F(e.shape.length===2,()=>`qr2d() requires a 2D Tensor, but got a ${e.shape.length}D Tensor.`);let n=e.shape[0],a=e.shape[1],r=C1(n),s=Ba(e),i=wa([[1]],[1,1]),o=Ba(i),u=n>=a?a:n;for(let l=0;l{let h=Re(s,[l,l],[n-l,1]),m=th(h),f=Re(s,[l,l],[1,1]),y=sn(_n(f,0),wa([[-1]]),wa([[1]])),A=ye(f,W(y,m)),g=fe(h,A);g.shape[0]===1?o=Ba(i):o=lt([i,Re(g,[1,0],[g.shape[0]-1,g.shape[1]])],0);let x=It(fe(Ve(y,A),m)),w=Re(s,[l,0],[n-l,a]),b=W(x,o),v=Qe(o);if(l===0)s=ye(w,Ve(b,Ve(v,w)));else{let E=ye(w,Ve(b,Ve(v,w)));s=lt([Re(s,[0,0],[l,a]),E],0)}let S=Qe(b),T=Re(r,[0,l],[n,r.shape[1]-l]);if(l===0)r=ye(T,Ve(Ve(T,o),S));else{let E=ye(T,Ve(Ve(T,o),S));r=lt([Re(r,[0,0],[n,l]),E],1)}return[o,s,r]}),Ie([d,p,c])}return!t&&n>a&&(r=Re(r,[0,0],[n,a]),s=Re(s,[0,0],[a,a])),[r,s]})}var pF=L({qr_:dF}),hn;(function(e){e[e.NONE=0]="NONE",e[e.MEAN=1]="MEAN",e[e.SUM=2]="SUM",e[e.SUM_BY_NONZERO_WEIGHTS=3]="SUM_BY_NONZERO_WEIGHTS"})(hn||(hn={}));function cF(e,t,n=hn.SUM_BY_NONZERO_WEIGHTS){let a=M(e,"losses","computeWeightedLoss"),r=null;t!=null&&(r=M(t,"weights","computeWeightedLoss"));let s=r==null?a:W(a,r);if(n===hn.NONE)return s;if(n===hn.SUM)return Se(s);if(n===hn.MEAN){if(r==null)return St(s);{let i=a.size/r.size,o=fe(Se(s),Se(r));return i>1?fe(o,we(i)):o}}if(n===hn.SUM_BY_NONZERO_WEIGHTS){if(r==null)return fe(Se(s),we(a.size));{let i=W(r,Ln(a.shape)),o=me(Se(ki(i,we(0))),"float32");return fe(Se(s),o)}}throw Error(`Unknown reduction: ${n}`)}var fr=L({computeWeightedLoss_:cF});function hF(e,t,n,a=hn.SUM_BY_NONZERO_WEIGHTS){let r=M(e,"labels","absoluteDifference"),s=M(t,"predictions","absoluteDifference"),i=null;n!=null&&(i=M(n,"weights","absoluteDifference")),un(r.shape,s.shape,"Error in absoluteDifference: ");let o=Lt(ye(r,s));return fr(o,i,a)}var fF=L({absoluteDifference_:hF});function mF(e,t,n,a,r=hn.SUM_BY_NONZERO_WEIGHTS){let s=M(e,"labels","cosineDistance"),i=M(t,"predictions","cosineDistance"),o=null;a!=null&&(o=M(a,"weights","cosineDistance")),un(s.shape,i.shape,"Error in cosineDistance: ");let u=we(1),l=ye(u,Se(W(s,i),n,!0));return fr(l,o,r)}var yF=L({cosineDistance_:mF});function AF(e,t,n,a=hn.SUM_BY_NONZERO_WEIGHTS){let r=M(e,"labels","hingeLoss"),s=M(t,"predictions","hingeLoss"),i=null;n!=null&&(i=M(n,"weights","hingeLoss")),un(r.shape,s.shape,"Error in hingeLoss: ");let o=we(1);r=ye(W(we(2),r),o);let u=Ha(ye(o,W(r,s)));return fr(u,i,a)}var gF=L({hingeLoss_:AF});function xF(e,t,n,a=1,r=hn.SUM_BY_NONZERO_WEIGHTS){let s=M(e,"labels","huberLoss"),i=M(t,"predictions","huberLoss"),o=null;n!=null&&(o=M(n,"weights","huberLoss")),un(s.shape,i.shape,"Error in huberLoss: ");let u=we(a),l=Lt(ye(i,s)),d=Nl(l,u),p=ye(l,d),c=se(W(we(.5),ot(d)),W(u,p));return fr(c,o,r)}var bF=L({huberLoss_:xF});function vF(e,t,n,a=1e-7,r=hn.SUM_BY_NONZERO_WEIGHTS){let s=M(e,"labels","logLoss"),i=M(t,"predictions","logLoss"),o=null;n!=null&&(o=M(n,"weights","logLoss")),un(s.shape,i.shape,"Error in logLoss: ");let u=we(1),l=we(a),d=It(W(s,Pn(se(i,l)))),p=W(ye(u,s),Pn(se(ye(u,i),l))),c=ye(d,p);return fr(c,o,r)}var wF=L({logLoss_:vF});function kF(e,t,n,a=hn.SUM_BY_NONZERO_WEIGHTS){let r=M(e,"labels","meanSquaredError"),s=M(t,"predictions","meanSquaredError"),i=null;n!=null&&(i=M(n,"weights","meanSquaredError")),un(r.shape,s.shape,"Error in meanSquaredError: ");let o=Jc(r,s);return fr(o,i,a)}var IF=L({meanSquaredError_:kF});function SF(e,t){let n=M(e,"labels","sigmoidCrossEntropyWithLogits"),a=M(t,"logits","sigmoidCrossEntropyWithLogits");un(n.shape,a.shape,"Error in sigmoidCrossEntropyWithLogits: ");let r=Ha(a),s=W(a,n),i=_c(na(It(Lt(a))));return se(ye(r,s),i)}function NF(e,t,n,a=0,r=hn.SUM_BY_NONZERO_WEIGHTS){let s=M(e,"multiClassLabels","sigmoidCrossEntropy"),i=M(t,"logits","sigmoidCrossEntropy"),o=null;if(n!=null&&(o=M(n,"weights","sigmoidCrossEntropy")),un(s.shape,i.shape,"Error in sigmoidCrossEntropy: "),a>0){let l=we(a),d=we(1),p=we(.5);s=se(W(s,ye(d,l)),W(p,l))}let u=SF(s,i);return fr(u,o,r)}var TF=L({sigmoidCrossEntropy_:NF});function EF(e,t,n=-1){if(n===-1&&(n=t.rank-1),n!==t.rank-1)throw Error(`Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank ${t.rank} and dim was ${n}`);return ja((a,r,s)=>{let i=D1(r,[n],!0),o=ye(me(r,"float32"),i);s([a,o]);let u=It(W(o,a));return{value:Se(u,[n]),gradFunc:(l,d)=>{let[p,c]=d,h=wi(l.shape,[n]);return[W(H(l,h),ye(me(p,"float32"),na(c))),W(H(l,h),ye(na(c),me(p,"float32")))]}}})(e,t)}function CF(e,t,n,a=0,r=hn.SUM_BY_NONZERO_WEIGHTS){let s=M(e,"onehotLabels","softmaxCrossEntropy"),i=M(t,"logits","softmaxCrossEntropy"),o=null;if(n!=null&&(o=M(n,"weights","softmaxCrossEntropy")),un(s.shape,i.shape,"Error in softmaxCrossEntropy: "),a>0){let l=we(a),d=we(1),p=we(s.shape[1]);s=se(W(s,ye(d,l)),fe(l,p))}let u=EF(s,i);return fr(u,o,r)}var RF=L({softmaxCrossEntropy_:CF});function MF(e,t,n,a){let r=M(e,"indices","sparseFillEmptyRows"),s=M(t,"values","sparseFillEmptyRows"),i=M(n,"denseShape","sparseFillEmptyRows"),o=M(a,"defaultValue","sparseFillEmptyRows",s.dtype);if(r.rank!==2)throw new Error(`Indices should be Tensor2D but received shape - ${r.shape}`);if(s.rank!==1)throw new Error(`Values should be Tensor1D but received shape ${s.shape}`);if(i.rank!==1)throw new Error(`Dense shape should be Tensor1D but received shape ${i.shape}`);if(o.rank!==0)throw new Error(`Default value should be a scalar but received shape ${o.shape}`);let u={indices:r,values:s,denseShape:i,defaultValue:o},l=P.runKernel(cc,u);return{outputIndices:l[0],outputValues:l[1],emptyRowIndicator:l[2],reverseIndexMap:l[3]}}var FF=L({sparseFillEmptyRows_:MF});function $F(e,t,n){let a=M(e,"inputIndices","sparseReshape"),r=M(t,"inputShape","sparseReshape"),s=M(n,"newShape","sparseReshape");if(a.rank!==2)throw new Error(`Input indices should be Tensor2D but received shape - ${a.shape}`);if(r.rank!==1)throw new Error(`Input shape should be Tensor1D but received shape ${r.shape}`);if(s.rank!==1)throw new Error(`New shape should be Tensor1D but received shape ${s.shape}`);let i={inputIndices:a,inputShape:r,newShape:s},o=P.runKernel(hc,i);return{outputIndices:o[0],outputShape:o[1]}}var DF=L({sparseReshape_:$F}),zF={fft:cd,ifft:Cl,rfft:hd,irfft:Yc},OF={hammingWindow:IM,hannWindow:z3,frame:O3,stft:EM},je={flipLeftRight:FM,resizeNearestNeighbor:V3,resizeBilinear:B3,rotateWithOffset:DM,cropAndResize:RM,nonMaxSuppression:OM,nonMaxSuppressionAsync:UM,nonMaxSuppressionWithScore:GM,nonMaxSuppressionWithScoreAsync:XM,nonMaxSuppressionPadded:ZM,nonMaxSuppressionPaddedAsync:JM,threshold:aF,transform:sF},U3={bandPart:oF,gramSchmidt:uF,qr:pF},_F={absoluteDifference:fF,computeWeightedLoss:fr,cosineDistance:yF,hingeLoss:gF,huberLoss:bF,logLoss:wF,meanSquaredError:IF,sigmoidCrossEntropy:TF,softmaxCrossEntropy:RF},H3={sparseFillEmptyRows:FF,sparseReshape:DF},mr=class extends qb{minimize(e,t=!1,n){let{value:a,grads:r}=this.computeGradients(e,n);if(n!=null){let s=n.map(i=>({name:i.name,tensor:r[i.name]}));this.applyGradients(s)}else this.applyGradients(r);return Ie(r),t?a:(a.dispose(),null)}get iterations(){return this.iterations_==null&&(this.iterations_=0),this.iterations_}incrementIterations(){this.iterations_=this.iterations+1}computeGradients(e,t){return m3(e,t)}dispose(){this.iterations_!=null&&Ie(this.iterations_)}async saveIterations(){return this.iterations_==null&&(this.iterations_=0),{name:"iter",tensor:we(this.iterations_,"int32")}}async getWeights(){throw new Error("getWeights() is not implemented for this optimizer yet.")}async setWeights(e){throw new Error(`setWeights() is not implemented for this optimizer class ${this.getClassName()}`)}async extractIterations(e){return this.iterations_=(await e[0].tensor.data())[0],e.slice(1)}};Object.defineProperty(mr,Symbol.hasInstance,{value:e=>e.minimize!=null&&e.computeGradients!=null&&e.applyGradients!=null});var ih=class extends mr{constructor(e,t,n=null){super();this.learningRate=e,this.rho=t,this.epsilon=n,this.accumulatedGrads=[],this.accumulatedUpdates=[],n==null&&(this.epsilon=P.backend.epsilon())}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let a=P.registeredVariables[t],r=!1;this.accumulatedGrads[n]==null&&(this.accumulatedGrads[n]={originalName:`${t}/accum_grad`,variable:V(()=>Ge(a).variable(r))}),this.accumulatedUpdates[n]==null&&(this.accumulatedUpdates[n]={originalName:`${t}/accum_var`,variable:V(()=>Ge(a).variable(r))});let s=Array.isArray(e)?e[n].tensor:e[t];if(s==null)return;let i=this.accumulatedGrads[n].variable,o=this.accumulatedUpdates[n].variable;V(()=>{let u=se(W(i,this.rho),W(ot(s),1-this.rho)),l=W(fe(en(se(o,this.epsilon)),en(se(i,this.epsilon))),s),d=se(W(o,this.rho),W(ot(l),1-this.rho));i.assign(u),o.assign(d);let p=se(W(l,-this.learningRate),a);a.assign(p)})}),this.incrementIterations()}dispose(){this.accumulatedUpdates!=null&&(Ie(this.accumulatedGrads.map(e=>e.variable)),Ie(this.accumulatedUpdates.map(e=>e.variable)))}async getWeights(){let e=[...this.accumulatedGrads,...this.accumulatedUpdates];return[await this.saveIterations()].concat(e.map(t=>({name:t.originalName,tensor:t.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=e.length/2,n=!1;this.accumulatedGrads=e.slice(0,t).map(a=>({originalName:a.name,variable:a.tensor.variable(n)})),this.accumulatedUpdates=e.slice(t,t*2).map(a=>({originalName:a.name,variable:a.tensor.variable(n)}))}getConfig(){return{learningRate:this.learningRate,rho:this.rho,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.rho,t.epsilon)}};ih.className="Adadelta";Pr(ih);var oh=class extends mr{constructor(e,t=.1){super();this.learningRate=e,this.initialAccumulatorValue=t,this.accumulatedGrads=[]}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let a=P.registeredVariables[t];if(this.accumulatedGrads[n]==null){let i=!1;this.accumulatedGrads[n]={originalName:`${t}/accumulator`,variable:V(()=>kl(a.shape,this.initialAccumulatorValue).variable(i))}}let r=Array.isArray(e)?e[n].tensor:e[t];if(r==null)return;let s=this.accumulatedGrads[n].variable;V(()=>{let i=se(s,ot(r));s.assign(i);let o=se(W(fe(r,en(se(i,P.backend.epsilon()))),-this.learningRate),a);a.assign(o)})}),this.incrementIterations()}dispose(){this.accumulatedGrads!=null&&Ie(this.accumulatedGrads.map(e=>e.variable))}async getWeights(){return[await this.saveIterations()].concat(this.accumulatedGrads.map(e=>({name:e.originalName,tensor:e.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=!1;this.accumulatedGrads=e.map(n=>({originalName:n.name,variable:n.tensor.variable(t)}))}getConfig(){return{learningRate:this.learningRate,initialAccumulatorValue:this.initialAccumulatorValue}}static fromConfig(e,t){return new e(t.learningRate,t.initialAccumulatorValue)}};oh.className="Adagrad";Pr(oh);var lh=class extends mr{constructor(e,t,n,a=null){super();this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=a,this.accumulatedFirstMoment=[],this.accumulatedSecondMoment=[],V(()=>{this.accBeta1=we(t).variable(),this.accBeta2=we(n).variable()}),a==null&&(this.epsilon=P.backend.epsilon())}applyGradients(e){let t=Array.isArray(e)?e.map(n=>n.name):Object.keys(e);V(()=>{let n=ye(1,this.accBeta1),a=ye(1,this.accBeta2);t.forEach((r,s)=>{let i=P.registeredVariables[r],o=!1;this.accumulatedFirstMoment[s]==null&&(this.accumulatedFirstMoment[s]={originalName:`${r}/m`,variable:V(()=>Ge(i).variable(o))}),this.accumulatedSecondMoment[s]==null&&(this.accumulatedSecondMoment[s]={originalName:`${r}/v`,variable:V(()=>Ge(i).variable(o))});let u=Array.isArray(e)?e[s].tensor:e[r];if(u==null)return;let l=this.accumulatedFirstMoment[s].variable,d=this.accumulatedSecondMoment[s].variable,p=se(W(l,this.beta1),W(u,1-this.beta1)),c=se(W(d,this.beta2),W(ot(u),1-this.beta2)),h=fe(p,n),m=fe(c,a);l.assign(p),d.assign(c);let f=se(W(fe(h,se(en(m),this.epsilon)),-this.learningRate),i);i.assign(f)}),this.accBeta1.assign(W(this.accBeta1,this.beta1)),this.accBeta2.assign(W(this.accBeta2,this.beta2))}),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.accBeta2.dispose(),this.accumulatedFirstMoment!=null&&Ie(this.accumulatedFirstMoment.map(e=>e.variable)),this.accumulatedSecondMoment!=null&&Ie(this.accumulatedSecondMoment.map(e=>e.variable))}async getWeights(){let e=[...this.accumulatedFirstMoment,...this.accumulatedSecondMoment];return[await this.saveIterations()].concat(e.map(t=>({name:t.originalName,tensor:t.variable})))}async setWeights(e){e=await this.extractIterations(e),V(()=>{this.accBeta1.assign(hr(this.beta1,this.iterations_+1)),this.accBeta2.assign(hr(this.beta2,this.iterations_+1))});let t=e.length/2,n=!1;this.accumulatedFirstMoment=e.slice(0,t).map(a=>({originalName:a.name,variable:a.tensor.variable(n)})),this.accumulatedSecondMoment=e.slice(t,t*2).map(a=>({originalName:a.name,variable:a.tensor.variable(n)}))}getConfig(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon)}};lh.className="Adam";Pr(lh);var uh=class extends mr{constructor(e,t,n,a=null,r=0){super();this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=a,this.decay=r,this.accumulatedFirstMoment=[],this.accumulatedWeightedInfNorm=[],V(()=>{this.iteration=we(0).variable(),this.accBeta1=we(t).variable()}),a==null&&(this.epsilon=P.backend.epsilon())}applyGradients(e){let t=Array.isArray(e)?e.map(n=>n.name):Object.keys(e);V(()=>{let n=ye(1,this.accBeta1),a=fe(-this.learningRate,se(W(this.iteration,this.decay),1));t.forEach((r,s)=>{let i=P.registeredVariables[r],o=!1;this.accumulatedFirstMoment[s]==null&&(this.accumulatedFirstMoment[s]={originalName:`${r}/m`,variable:Ge(i).variable(o)}),this.accumulatedWeightedInfNorm[s]==null&&(this.accumulatedWeightedInfNorm[s]={originalName:`${r}/v`,variable:Ge(i).variable(o)});let u=Array.isArray(e)?e[s].tensor:e[r];if(u==null)return;let l=this.accumulatedFirstMoment[s].variable,d=this.accumulatedWeightedInfNorm[s].variable,p=se(W(l,this.beta1),W(u,1-this.beta1)),c=W(d,this.beta2),h=Lt(u),m=Ua(c,h);l.assign(p),d.assign(m);let f=se(W(fe(a,n),fe(p,se(m,this.epsilon))),i);i.assign(f)}),this.iteration.assign(se(this.iteration,1)),this.accBeta1.assign(W(this.accBeta1,this.beta1))}),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.iteration.dispose(),this.accumulatedFirstMoment!=null&&Ie(this.accumulatedFirstMoment.map(e=>e.variable)),this.accumulatedWeightedInfNorm!=null&&Ie(this.accumulatedWeightedInfNorm.map(e=>e.variable))}async getWeights(){throw new Error("getWeights() is not implemented for Adamax yet.")}async setWeights(e){throw new Error("setWeights() is not implemented for Adamax yet.")}getConfig(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon,decay:this.decay}}static fromConfig(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon,t.decay)}};uh.className="Adamax";Pr(uh);var fd=class extends mr{constructor(e){super();this.learningRate=e,this.setLearningRate(e)}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let a=Array.isArray(e)?e[n].tensor:e[t];if(a==null)return;let r=P.registeredVariables[t];V(()=>{let s=se(W(this.c,a),r);r.assign(s)})}),this.incrementIterations()}setLearningRate(e){this.learningRate=e,this.c!=null&&this.c.dispose(),this.c=Gt(we(-e))}dispose(){this.c.dispose()}async getWeights(){return[await this.saveIterations()]}async setWeights(e){if(e=await this.extractIterations(e),e.length!==0)throw new Error("SGD optimizer does not have settable weights.")}getConfig(){return{learningRate:this.learningRate}}static fromConfig(e,t){return new e(t.learningRate)}};fd.className="SGD";Pr(fd);var dh=class extends fd{constructor(e,t,n=!1){super(e);this.learningRate=e,this.momentum=t,this.useNesterov=n,this.accumulations=[],this.m=we(this.momentum)}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let a=P.registeredVariables[t];if(this.accumulations[n]==null){let i=!1;this.accumulations[n]={originalName:`${t}/momentum`,variable:V(()=>Ge(a).variable(i))}}let r=this.accumulations[n].variable,s=Array.isArray(e)?e[n].tensor:e[t];s!=null&&V(()=>{let i,o=se(W(this.m,r),s);this.useNesterov?i=se(W(this.c,se(s,W(o,this.m))),a):i=se(W(this.c,o),a),r.assign(o),a.assign(i)})}),this.incrementIterations()}dispose(){this.m.dispose(),this.accumulations!=null&&Ie(this.accumulations.map(e=>e.variable))}setMomentum(e){this.momentum=e}async getWeights(){return[await this.saveIterations()].concat(this.accumulations.map(e=>({name:e.originalName,tensor:e.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=!1;this.accumulations=e.map(n=>({originalName:n.name,variable:n.tensor.variable(t)}))}getConfig(){return{learningRate:this.learningRate,momentum:this.momentum,useNesterov:this.useNesterov}}static fromConfig(e,t){return new e(t.learningRate,t.momentum,t.useNesterov)}};dh.className="Momentum";Pr(dh);var ph=class extends mr{constructor(e,t=.9,n=0,a=null,r=!1){super();if(this.learningRate=e,this.decay=t,this.momentum=n,this.epsilon=a,this.accumulatedMeanSquares=[],this.accumulatedMoments=[],this.accumulatedMeanGrads=[],this.centered=r,a==null&&(this.epsilon=P.backend.epsilon()),e==null)throw new Error("learningRate for RMSPropOptimizer must be defined.")}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let a=P.registeredVariables[t],r=!1;this.accumulatedMeanSquares[n]==null&&(this.accumulatedMeanSquares[n]={originalName:`${t}/rms`,variable:V(()=>Ge(a).variable(r))}),this.accumulatedMoments[n]==null&&(this.accumulatedMoments[n]={originalName:`${t}/momentum`,variable:V(()=>Ge(a).variable(r))}),this.accumulatedMeanGrads[n]==null&&this.centered&&(this.accumulatedMeanGrads[n]={originalName:`${t}/mg`,variable:V(()=>Ge(a).variable(r))});let s=Array.isArray(e)?e[n].tensor:e[t];if(s==null)return;let i=this.accumulatedMeanSquares[n].variable,o=this.accumulatedMoments[n].variable;V(()=>{let u=se(W(i,this.decay),W(ot(s),1-this.decay));if(this.centered){let l=this.accumulatedMeanGrads[n].variable,d=se(W(l,this.decay),W(s,1-this.decay)),p=fe(W(s,this.learningRate),en(ye(u,se(ot(d),this.epsilon)))),c=se(W(o,this.momentum),p);i.assign(u),l.assign(d),o.assign(c);let h=ye(a,c);a.assign(h)}else{let l=se(W(i,this.decay),W(ot(s),1-this.decay)),d=se(W(o,this.momentum),fe(W(s,this.learningRate),en(se(l,this.epsilon))));i.assign(l),o.assign(d);let p=ye(a,d);a.assign(p)}})}),this.incrementIterations()}dispose(){this.accumulatedMeanSquares!=null&&Ie(this.accumulatedMeanSquares.map(e=>e.variable)),this.accumulatedMeanGrads!=null&&this.centered&&Ie(this.accumulatedMeanGrads.map(e=>e.variable)),this.accumulatedMoments!=null&&Ie(this.accumulatedMoments.map(e=>e.variable))}async getWeights(){let e=[...this.accumulatedMeanSquares,...this.accumulatedMoments];return this.centered&&e.push(...this.accumulatedMeanGrads),[await this.saveIterations()].concat(e.map(t=>({name:t.originalName,tensor:t.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=this.centered?e.length/3:e.length/2,n=!1;this.accumulatedMeanSquares=e.slice(0,t).map(a=>({originalName:a.name,variable:a.tensor.variable(n)})),this.accumulatedMoments=e.slice(t,t*2).map(a=>({originalName:a.name,variable:a.tensor.variable(n)})),this.centered&&(this.accumulatedMeanGrads=e.slice(t*2,t*3).map(a=>({originalName:a.name,variable:a.tensor.variable(n)})))}getConfig(){return{learningRate:this.learningRate,decay:this.decay,momentum:this.momentum,epsilon:this.epsilon,centered:this.centered}}static fromConfig(e,t){return new e(t.learningRate,t.decay,t.momentum,t.epsilon,t.centered)}};ph.className="RMSProp";Pr(ph);var Ii=class{static sgd(e){return new fd(e)}static momentum(e,t,n=!1){return new dh(e,t,n)}static rmsprop(e,t=.9,n=0,a=null,r=!1){return new ph(e,t,n,a,r)}static adam(e=.001,t=.9,n=.999,a=null){return new lh(e,t,n,a)}static adadelta(e=.001,t=.95,n=null){return new ih(e,t,n)}static adamax(e=.002,t=.9,n=.999,a=null,r=0){return new uh(e,t,n,a,r)}static adagrad(e,t=.1){return new oh(e,t)}},Si={sgd:Ii.sgd,momentum:Ii.momentum,adadelta:Ii.adadelta,adagrad:Ii.adagrad,rmsprop:Ii.rmsprop,adamax:Ii.adamax,adam:Ii.adam},PF=(()=>typeof requestAnimationFrame!="undefined"?requestAnimationFrame:typeof setImmediate!="undefined"?setImmediate:e=>e())();function ch(){return new Promise(e=>PF(()=>e()))}var R={};Fe(R,{ERF_A1:()=>KF,ERF_A2:()=>ZF,ERF_A3:()=>YF,ERF_A4:()=>JF,ERF_A5:()=>QF,ERF_P:()=>XF,PARALLELIZE_THRESHOLD:()=>Q1,SELU_SCALE:()=>q3,SELU_SCALEALPHA:()=>G3,applyActivation:()=>rh,assertAndGetBroadcastShape:()=>ct,assertAxesAreInnerMostDims:()=>cC,assertParamsConsistent:()=>LF,assignToTypedArray:()=>o$,axesAreInnerMostDims:()=>F1,calculateShapes:()=>zb,checkEinsumDimSizes:()=>h$,combineLocations:()=>A3,complexWithEvenIndex:()=>r$,complexWithOddIndex:()=>s$,computeConv2DInfo:()=>ed,computeConv3DInfo:()=>Qb,computeDefaultPad:()=>A1,computeDilation2DInfo:()=>OT,computeOptimalWindowSize:()=>BF,computeOutAndReduceShapes:()=>g3,computeOutShape:()=>WF,computePool2DInfo:()=>Jb,computePool3DInfo:()=>_T,convertConv2DDataFormat:()=>e3,decodeEinsumEquation:()=>p$,eitherStridesOrDilationsAreOne:()=>Va,expandShapeToKeepDim:()=>wi,exponent:()=>u$,exponents:()=>l$,fromStringArrayToUint8:()=>w$,fromUint8ToStringArray:()=>v$,getAxesPermutation:()=>x3,getBroadcastDims:()=>TE,getComplexWithIndex:()=>i$,getEinsumComputePath:()=>f$,getEinsumPermutation:()=>c$,getFusedBiasGradient:()=>ah,getFusedDyActivation:()=>nh,getImageCenter:()=>VF,getInnerMostAxes:()=>hC,getPermuted:()=>UF,getReductionAxes:()=>Wt,getReshaped:()=>jF,getReshapedPermuted:()=>HF,getSliceBeginCoords:()=>GF,getSliceSize:()=>qF,getUndoAxesPermutation:()=>$1,isIdentityPermutation:()=>m$,log:()=>t$,mergeRealAndImagArrays:()=>n$,prepareAndValidate:()=>Db,prepareSplitSize:()=>A$,segment_util:()=>Z3,shouldFuse:()=>sh,slice_util:()=>dn,splitRealAndImagArrays:()=>a$,tupleValuesAreOne:()=>Lr,upcastType:()=>pa,validateInput:()=>a1,validateUpdateShape:()=>n1,warn:()=>e$});function LF(e,t){let n=e[0].length;e.forEach((r,s)=>{F(r.length===n,()=>`Error in concat${n}D: rank of tensors[${s}] must be the same as the rank of the rest (${n})`)}),F(t>=0&&t`Error in concat${n}D: axis must be between 0 and ${n-1}.`);let a=e[0];e.forEach((r,s)=>{for(let i=0;i`Error in concat${n}D: Shape of tensors[${s}] (${r}) does not match the shape of the rest (${a}) along the non-concatenated axis ${s}.`)})}function WF(e,t){let n=e[0].slice();for(let a=1;a=t*2+1||i%2==1?s.push(i):r.push(i);a.push(...r),a.push(0),a.push(...s)}return a}function HF(e,t,n,a=!0){let r=[];a?r.push(e[0]/n):r.push(e[0]*n);for(let s=1;s/g,X3=",",K3="...";function p$(e,t){e=e.replace(/\s/g,"");let n=(e.length-e.replace(d$,"").length)/ey.length;if(n<1)throw new Error("Equations without an arrow are not supported.");if(n>1)throw new Error(`Equation must contain exactly one arrow ("${ey}").`);let[a,r]=e.split(ey);F(a.indexOf(K3)===-1,()=>`The ellipsis notation ("${K3}") is not supported yet.`);let s=a.split(X3),i=s.length;if(t!==i)throw new Error(`Expected ${i} input tensors, received ${t}`);if(i>2)throw new Error("Support for more than 2 input tensors is not implemented yet.");let o=[];for(let c=0;cm.indexOf(h)!==-1))throw new Error(`Output subscripts contain the label ${h} not present in the input subscripts.`);o.indexOf(h)===-1&&o.push(h)}for(let c=0;cr!==-1),{permutationIndices:n,expandDims:a}}function h$(e,t,n){let a=new Array(e);for(let r=0;r`Expected dimension ${a[t[r][i]]} at axis ${i} of input shaped ${JSON.stringify(s)}, but got dimension ${s[i]}`)}}function f$(e,t){let n=e,a=[],r=0;e.length===0&&n.push(-1),r=e.length+1;for(let i=0;it===n)}function y$(e,t){let n=[];for(let a=0;a"Number of splits must evenly divide the axis."),a=new Array(t).fill(e.shape[n]/t);else{let r=t.reduce((i,o)=>(o===-1&&(i+=1),i),0);F(r<=1,()=>"There should be only one negative value in split array.");let s=t.indexOf(-1);if(s!==-1){let i=t.reduce((o,u)=>u>0?o+u:o);t[s]=e.shape[n]-i}F(e.shape[n]===t.reduce((i,o)=>i+o),()=>"The sum of sizes must match the size of the axis dimension."),a=t}return a}var Z3={};Fe(Z3,{collectGatherOpShapeInfo:()=>b$,computeOutShape:()=>x$,segOpComputeOptimalWindowSize:()=>g$});function g$(e,t){let n=!1,a;for(e<=Q1?(a=e,n=!0):a=_p(e,Math.floor(Math.sqrt(e)));!n;)a>t||a===e?n=!0:a=_p(e,a+1);return a}function x$(e,t,n){let a=[],r=e.length;for(let s=0;sr))throw new Error(`Expect batchDims in the range of [-${r}, ${r}], but got ${a}`);if(a<0&&(a+=r),a>s)throw new Error(`batchDims (${a}) must be less than rank(x) ( - ${s}).`);if(nxc(t))}catch(t){throw new Error(`Failed to decode encoded string bytes into utf-8, error: ${t}`)}}function w$(e){return e.map(t=>Uu(t))}var Ga={};Fe(Ga,{nonMaxSuppressionV3Impl:()=>_3,nonMaxSuppressionV4Impl:()=>P3,nonMaxSuppressionV5Impl:()=>L3,whereImpl:()=>T3});function ve(e,t){Array.isArray(e)||(e=[e]),e.forEach(n=>{n!=null&&k.assert(n.dtype!=="complex64",()=>`${t} does not support complex64 tensors in the CPU backend.`)})}var k$=Ga.whereImpl,hh=class extends ku{constructor(){super();this.blockSize=48,this.firstUse=!0,this.data=new zp(this,dr())}nextDataId(){return hh.nextDataId++}write(e,t,n){this.firstUse&&(this.firstUse=!1,J().get("IS_NODE")&&R.warn(` -============================ -Hi there \u{1F44B}. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details. -============================`));let a={id:this.nextDataId()};return this.data.set(a,{values:e,dtype:n,refCount:1}),a}makeTensorInfo(e,t,n){let a;if(t==="string"&&n!=null&&n.length>0&&k.isString(n[0])){let r=n.map(s=>k.encodeString(s));a=this.write(r,e,t)}else a=this.write(n,e,t);return{dataId:a,shape:e,dtype:t}}refCount(e){return this.data.has(e)?this.data.get(e).refCount:0}incRef(e){let t=this.data.get(e);t.refCount++}decRef(e){if(this.data.has(e)){let t=this.data.get(e);t.refCount--}}move(e,t,n,a,r){this.data.set(e,{values:t,dtype:a,refCount:r})}numDataIds(){return this.data.numDataIds()}async read(e){return this.readSync(e)}readSync(e){let{dtype:t,complexTensorInfos:n}=this.data.get(e);if(t==="complex64"){let a=this.readSync(n.real.dataId),r=this.readSync(n.imag.dataId);return R.mergeRealAndImagArrays(a,r)}return this.data.get(e).values}bufferSync(e){let t=this.readSync(e.dataId),n=t;if(e.dtype==="string")try{n=t.map(a=>k.decodeString(a))}catch(a){throw new Error("Failed to decode encoded string bytes into utf-8")}return Be(e.shape,e.dtype,n)}makeOutput(e,t,n){let a=this.write(e,t,n);return dr().makeTensorFromDataId(a,t,n,this)}disposeData(e,t=!1){if(this.data.has(e)){if(this.data.get(e).refCount--,!t&&this.data.get(e).refCount>0)return!1;let{complexTensorInfos:n}=this.data.get(e);n!=null&&(this.disposeData(n.real.dataId,!0),this.disposeData(n.imag.dataId,!0)),this.data.delete(e)}return!0}disposeIntermediateTensorInfo(e){this.disposeData(e.dataId)}async time(e){let t=k.now();return e(),{kernelMs:k.now()-t}}memory(){return{unreliable:!0,reasons:["The reported memory is an upper bound. Due to automatic garbage collection, the true allocated memory may be less."]}}where(e){ve([e],"where");let t=this.readSync(e.dataId);return k$(e.shape,t)}dispose(){}floatPrecision(){return 32}epsilon(){return super.epsilon()}};hh.nextDataId=0;var ty={};Fe(ty,{addImpl:()=>J3,bincountImpl:()=>ay,bincountReduceImpl:()=>Q3,ceilImpl:()=>e7,concatImpl:()=>ry,expImpl:()=>t7,expm1Impl:()=>a7,floorImpl:()=>r7,gatherV2Impl:()=>s7,greaterImpl:()=>i7,lessImpl:()=>o7,linSpaceImpl:()=>l7,logImpl:()=>u7,maxImpl:()=>d7,maximumImpl:()=>p7,minimumImpl:()=>c7,multiplyImpl:()=>sy,negImpl:()=>h7,notEqualImpl:()=>f7,prodImpl:()=>m7,rangeImpl:()=>oy,rsqrtImpl:()=>y7,simpleAbsImpl:()=>Y3,sliceImpl:()=>yh,sparseFillEmptyRowsImpl:()=>A7,sparseReshapeImpl:()=>g7,squaredDifferenceImpl:()=>x7,stridedSliceImpl:()=>b7,subImpl:()=>v7,tileImpl:()=>w7,topKImpl:()=>k7,transposeImpl:()=>iy,uniqueImpl:()=>I7});function Y3(e){let t=new Float32Array(e.length);for(let n=0;n{let{x:t}=e.inputs,n=e.backend;ve(t,"abs");let a=new Float32Array(k.sizeFromShape(t.shape)),r=n.data.get(t.dataId).values;return a=Y3(r),n.makeOutput(a,t.shape,"float32")},S$={kernelName:oo,backendName:"cpu",kernelFunc:I$};function Dt(e){return(t,n,a,r,s)=>{let i=R.assertAndGetBroadcastShape(t,n),o=i.length,u=k.computeStrides(i),l=k.sizeFromShape(i),d=k.getTypedArrayFromDType(s,l),p=t.length,c=n.length,h=k.computeStrides(t),m=k.computeStrides(n),f=R.getBroadcastDims(t,i),y=R.getBroadcastDims(n,i);if(f.length+y.length===0)for(let A=0;Ax[S]=0);let w=k.locToIndex(x,p,h),b=g.slice(-c);y.forEach(S=>b[S]=0);let v=k.locToIndex(b,c,m);d[A]=e(a[w],r[v])}return[d,i]}}function Vn(e){let{inputs:t,backend:n}=e,{real:a,imag:r}=t,s=n.data.get(a.dataId).values,i=n.data.get(r.dataId).values,o=n.makeTensorInfo(a.shape,"complex64"),u=n.data.get(o.dataId);return u.complexTensorInfos={real:n.makeTensorInfo(a.shape,"float32",s),imag:n.makeTensorInfo(r.shape,"float32",i)},o}var N$={kernelName:Vp,backendName:"cpu",kernelFunc:Vn};function fh(e,t,n="float32"){if(n==="complex64"){let r=fh(e,t,"float32"),s=fh(e,t,"float32");return Vn({inputs:{real:r,imag:s},backend:e})}let a=k.makeZerosTypedArray(k.sizeFromShape(t),n);return e.makeTensorInfo(t,n,a)}function qa(e){let{inputs:t,backend:n}=e,{x:a}=t;return n.incRef(a.dataId),{dataId:a.dataId,shape:a.shape,dtype:a.dtype}}var T$={kernelName:Rs,backendName:"cpu",kernelFunc:qa};function Ni(e){let{inputs:t,backend:n}=e,{input:a}=t,r=n.data.get(a.dataId).complexTensorInfos.real,s=n.data.get(r.dataId).values;return n.makeTensorInfo(r.shape,r.dtype,s)}var E$={kernelName:uc,backendName:"cpu",kernelFunc:Ni};function Hr(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{dtype:s}=a;if(s==="complex64"){if(r.dtype==="complex64")return qa({inputs:{x:r},backend:n});let i=fh(n,r.shape,r.dtype),o=Hr({inputs:{x:r},backend:n,attrs:{dtype:"float32"}}),u=Vn({inputs:{real:o,imag:i},backend:n});return n.disposeIntermediateTensorInfo(i),n.disposeIntermediateTensorInfo(o),u}if(r.dtype==="complex64"){let i=Ni({inputs:{input:r},backend:n}),o=Hr({inputs:{x:i},backend:n,attrs:{dtype:s}});return n.disposeIntermediateTensorInfo(i),o}if(!k.hasEncodingLoss(r.dtype,s)){let i=qa({inputs:{x:r},backend:n});return{dataId:i.dataId,shape:i.shape,dtype:s}}if(s==="int32"){let i=n.data.get(r.dataId).values,o=Int32Array.from(i);return n.makeTensorInfo(r.shape,"int32",o)}if(s==="bool"){let i=n.data.get(r.dataId).values,o=k.toTypedArray([0],r.dtype),[u,l]=Dt((d,p)=>d!==p?1:0)(r.shape,[],i,o,"bool");return n.makeTensorInfo(l,"bool",u)}throw new Error(`Error in Cast: failed to cast ${r.dtype} to ${s}`)}var C$={kernelName:As,backendName:"cpu",kernelFunc:Hr};function Xt(e,t,n,a){return n==null?({inputs:r,backend:s})=>{let{a:i,b:o}=r,u=s;ve([i,o],e);let l=u.data.get(i.dataId).values,d=u.data.get(o.dataId).values,p=a||i.dtype,[c,h]=t(i.shape,o.shape,l,d,p);return u.makeTensorInfo(h,p,c)}:({inputs:r,backend:s})=>{let{a:i,b:o}=r,u=s;if(i.dtype==="complex64"||o.dtype==="complex64"){let l=Hr({inputs:{x:i},backend:u,attrs:{dtype:"complex64"}}),d=u.data.get(l.dataId),p=d.complexTensorInfos.real,c=d.complexTensorInfos.imag,h=u.data.get(p.dataId).values,m=u.data.get(c.dataId).values,f=Hr({inputs:{x:o},backend:u,attrs:{dtype:"complex64"}}),y=u.data.get(f.dataId),A=y.complexTensorInfos.real,g=y.complexTensorInfos.imag,x=u.data.get(A.dataId).values,w=u.data.get(g.dataId).values,[b,v,S]=n(i.shape,o.shape,h,m,x,w),T=u.makeTensorInfo(S,"float32",b),E=u.makeTensorInfo(S,"float32",v),$=Vn({inputs:{real:T,imag:E},backend:u});return u.disposeIntermediateTensorInfo(l),u.disposeIntermediateTensorInfo(f),u.disposeIntermediateTensorInfo(T),u.disposeIntermediateTensorInfo(E),$}else{let l=u.data.get(i.dataId).values,d=u.data.get(o.dataId).values,p=a||i.dtype,[c,h]=t(i.shape,o.shape,l,d,p);return u.makeTensorInfo(h,p,c)}}}function ny(e){return(t,n,a,r,s,i)=>{let o=R.assertAndGetBroadcastShape(t,n),u=k.sizeFromShape(o),l=o.length,d=k.computeStrides(o),p=k.getTypedArrayFromDType("float32",u),c=k.getTypedArrayFromDType("float32",u),h=R.getBroadcastDims(t,o),m=R.getBroadcastDims(n,o),f=R.mergeRealAndImagArrays(a,r),y=R.mergeRealAndImagArrays(s,i),A=t.length,g=k.computeStrides(t),x=n.length,w=k.computeStrides(n);if(h.length+m.length===0)for(let b=0;bS[O]=0);let T=k.locToIndex(S,A,g),E=v.slice(-x);m.forEach(O=>E[O]=0);let $=k.locToIndex(E,x,w),z=e(f[T*2],f[T*2+1],y[$*2],y[$*2+1]);p[b]=z.real,c[b]=z.imag}return[p,c,o]}}var J3=Dt((e,t)=>e+t),R$=ny((e,t,n,a)=>({real:e+n,imag:t+a})),md=Xt(Mr,J3,R$),M$={kernelName:Mr,backendName:"cpu",kernelFunc:md};function ay(e,t,n,a,r){let s=k.sizeFromShape(a),i=k.makeZerosTypedArray(r,n);for(let o=0;o=r||(s>0?i[u]+=t[o]:i[u]+=1)}return i}function Q3(e,t,n,a=!1){let r=e.shape[0],s=e.shape[1],i=Be([r,n],t.dtype);for(let o=0;o=n||(a?i.set(1,o,l):t.size>0?i.set(i.get(o,l)+t.get(o,u),o,l):i.set(i.get(o,l)+1,o,l))}return i}function Fl(e){return(t,n,a)=>{let r=k.getTypedArrayFromDType(n,t.length);for(let s=0;s{let{x:i}=a;if(ve(i,e),i.dtype==="string"||n==="string")throw new Error("unaryKernelFunc does not support string input/output");let o=s,u=o.data.get(i.dataId).values,l=k.sizeFromShape(i.shape),d=n||i.dtype,p=k.getArrayFromDType(d,l);for(let c=0;c{let{x:i}=a;if(ve(i,e),i.dtype==="string"||n==="string")throw new Error("unaryKernelFunc does not support string input/output");let o=s,u=o.data.get(i.dataId).values,l=n||i.dtype,d=t(u,l,r);return o.makeTensorInfo(i.shape,l,d)}}var e7=Fl(e=>Math.ceil(e)),F$=$l(gs,e7),$$={kernelName:gs,backendName:"cpu",kernelFunc:F$};function ry(e,t,n,a){let r=k.getArrayFromDType(n,k.sizeFromShape(t));if(a&&n!=="string"){let s=0;e.forEach(i=>{let o=k.sizeFromShape(i.shape);r.set(i.vals,s),s+=o})}else{let s=0;e.forEach(i=>{let o=n==="string"?R.fromUint8ToStringArray(i.vals):i.vals,u=0;for(let l=0;lMath.exp(e)),n7=$l(Ss,t7),D$={kernelName:Ss,backendName:"cpu",kernelFunc:n7},a7=Fl(e=>Math.expm1(e)),z$=$l(No,a7),O$={kernelName:No,backendName:"cpu",kernelFunc:z$},r7=Fl(e=>Math.floor(e)),_$=$l(Ns,r7),P$={kernelName:Ns,backendName:"cpu",kernelFunc:_$};function s7(e,t,n){let a=Be(n,e.dtype);for(let r=0;re>t?1:0),L$=Xt(Ro,i7,null,"bool"),W$={kernelName:Ro,backendName:"cpu",kernelFunc:L$},o7=Dt((e,t)=>eMath.log(e)),j$=$l(Fs,u7),U$={kernelName:Fs,backendName:"cpu",kernelFunc:j$};function d7(e,t,n,a){let r=k.getTypedArrayFromDType(a,k.sizeFromShape(n));for(let s=0;so&&(o=l)}r[s]=o}return r}var p7=Dt((e,t)=>Math.max(e,t)),H$=Xt(Ds,p7),G$={kernelName:Ds,backendName:"cpu",kernelFunc:H$},c7=Dt((e,t)=>Math.min(e,t)),q$=Xt(Ps,c7),X$={kernelName:Ps,backendName:"cpu",kernelFunc:q$},sy=Dt((e,t)=>e*t),K$=ny((e,t,n,a)=>({real:e*n-t*a,imag:e*a+t*n})),mh=Xt(Ws,sy,K$),Z$={kernelName:Ws,backendName:"cpu",kernelFunc:mh};function h7(e,t,n){let a=k.createScalarValue(-1,n);return sy([],t,a,e,n)}function Y$(e){let{inputs:t,backend:n}=e,{x:a}=t;ve(a,"neg");let r=n.data.get(a.dataId).values,[s,i]=h7(r,a.shape,a.dtype);return n.makeTensorInfo(i,a.dtype,s)}var J$={kernelName:Lo,backendName:"cpu",kernelFunc:Y$},f7=Dt((e,t)=>e!==t?1:0),Q$=Xt(Wo,f7,null,"bool"),eD={kernelName:Wo,backendName:"cpu",kernelFunc:Q$};function iy(e,t,n,a,r){let s=t.length,i=k.sizeFromShape(t),o=k.computeStrides(t),u=k.computeStrides(r),l=k.getTypedArrayFromDType(n,k.sizeFromShape(r));for(let d=0;dn.disposeIntermediateTensorInfo(g)),n.makeTensorInfo(A,y,m)}var aD={kernelName:Go,backendName:"cpu",kernelFunc:nD};function oy(e,t,n,a){let r=e===t,s=e1;if(r||s||i)return k.makeZerosTypedArray(0,a);let o=Math.abs(Math.ceil((t-e)/n)),u=k.makeZerosTypedArray(o,a);t1/Math.sqrt(e)),rD=$l(Zs,y7),sD={kernelName:Zs,backendName:"cpu",kernelFunc:rD};function yh(e,t,n,a,r){let s=dn.isSliceContinous(a,t,n),i=k.sizeFromShape(n),o=k.computeStrides(a);if(s){let p=dn.computeFlatOffset(t,o);return r==="string"?e.slice(p,p+i):e.subarray(p,p+i)}let u=r==="string"?R.fromUint8ToStringArray(e):e,l=Be(a,r,u),d=Be(n,r);for(let p=0;pm+t[f]);d.set(l.get(...h),...c)}return r==="string"?R.fromStringArrayToUint8(d.values):d.values}function Ti(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{begin:s,size:i}=a;ve(r,"slice");let[o,u]=dn.parseSliceParams(r,s,i);dn.assertParamsValid(r,o,u);let l=n.data.get(r.dataId).values,d=yh(l,o,u,r.shape,r.dtype);return n.makeTensorInfo(u,r.dtype,d)}var iD={kernelName:Jo,backendName:"cpu",kernelFunc:Ti};function A7(e,t,n,a,r,s,i){let o=t[0],u=s[0],l=new Array(u),d=new Array(o),p=t[1];if(u===0){if(o!==0)throw new Error(`Received SparseTensor with denseShape[0] = 0 but - indices.shape[0] = ${o}`);let y=k.getArrayFromDType(n,0),A=k.getArrayFromDType(r,0);return[y,[0,p],A,l,d]}let c=!0,h=0,m=new Array(u).fill(0);for(let y=0;y=u)throw new Error(`indices(${y}, 0) is invalid: ${A} >= ${u}`);++m[A],c=c&&A>=h,h=A}let f=!0;for(let y=0;y0&&(m[y]+=m[y-1])}if(f&&c){let y=e,A=a;for(let g=0;g0){h[c-1]=1;for(let y=c-2;y>=0;--y)h[y]=h[y+1]*a[y+1]}let m=[];if(o>0){m[o-1]=1;for(let y=o-2;y>=0;--y)m[y]=m[y+1]*u[y+1]}let f=k.getArrayFromDType(n,i*o);for(let y=0;y{let n=e-t;return n*n}),oD=Xt(ni,x7),lD={kernelName:ni,backendName:"cpu",kernelFunc:oD};function b7(e,t,n,a){let r=Be(e,t.dtype);for(let s=0;se-t),uD=ny((e,t,n,a)=>({real:e-n,imag:t-a})),ly=Xt(ai,v7,uD),dD={kernelName:ai,backendName:"cpu",kernelFunc:ly};function w7(e,t){let n=new Array(e.rank);for(let r=0;rx.value-g.value);let f=p*a,y=u.subarray(f,f+a),A=l.subarray(f,f+a);for(let g=0;g{for(let y=0;ynew hh,1);var N7=rt(wo,e=>e>=0?e:Math.exp(e)-1),pD={kernelName:wo,backendName:"cpu",kernelFunc:N7};function T7(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{alpha:s}=a;ve([r],"leakyRelu");let i=k.sizeFromShape(r.shape),o=n.data.get(r.dataId).values,u=k.getTypedArrayFromDType("float32",i);for(let l=0;le<0?t*e:e);function E7(e){let{inputs:t,backend:n}=e,{x:a,alpha:r}=t;ve([a,r],"prelu");let s=n.data.get(a.dataId).values,i=n.data.get(r.dataId).values,[o,u]=hD(a.shape,r.shape,s,i,a.dtype);return n.makeTensorInfo(u,a.dtype,o)}var fD={kernelName:Us,backendName:"cpu",kernelFunc:E7},C7=rt(Hs,e=>Math.max(0,e)),mD={kernelName:Hs,backendName:"cpu",kernelFunc:C7},R7=rt(qs,e=>Math.min(Math.max(0,e),6)),yD={kernelName:qs,backendName:"cpu",kernelFunc:R7},M7=rt(Js,e=>1/(1+Math.exp(-e))),AD={kernelName:Js,backendName:"cpu",kernelFunc:M7};function uy(e,t,n,a,r){if(n==="linear")return qa({inputs:{x:t},backend:e});if(n==="relu")return C7({inputs:{x:t},backend:e});if(n==="elu")return N7({inputs:{x:t},backend:e});if(n==="relu6")return R7({inputs:{x:t},backend:e});if(n==="prelu")return E7({inputs:{x:t,alpha:a},backend:e});if(n==="leakyrelu")return T7({inputs:{x:t},backend:e,attrs:{alpha:r}});if(n==="sigmoid")return M7({inputs:{x:t},backend:e});throw new Error(`Activation ${n} has not been implemented for the CPU backend.`)}function ht(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{shape:s}=a,i=k.sizeFromShape(r.shape),o=k.inferFromImplicitShape(s,i),u=k.sizeFromShape(o);k.assert(i===u,()=>`The new shape (${o}) has ${u} elements and the old shape (${r.shape}) has ${i} elements. The new shape and old shape must have the same number of elements.`),n.incRef(r.dataId);let l=n.data.get(r.dataId);if(l.complexTensorInfos!=null){let d=l.complexTensorInfos.real,p=l.complexTensorInfos.imag;d.shape=o,p.shape=o}return{dataId:r.dataId,shape:o,dtype:r.dtype}}var gD={kernelName:Xo,backendName:"cpu",kernelFunc:ht};function F7(e){let{inputs:t,backend:n,attrs:a}=e,{a:r,b:s}=t,{transposeA:i,transposeB:o}=a;ve([r,s],"matMul");let u=r.shape.length,l=s.shape.length,d=i?r.shape[u-2]:r.shape[u-1],p=o?s.shape[l-1]:s.shape[l-2],c=i?r.shape[u-1]:r.shape[u-2],h=o?s.shape[l-2]:s.shape[l-1],m=r.shape.slice(0,-2),f=s.shape.slice(0,-2),y=k.sizeFromShape(m),A=k.sizeFromShape(f),g=y===A||y===1||A===1;k.assert(u>=2&&l>=2&&g,()=>`Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${m}) and (${f}).`);let x=(y>A?r.shape.slice(0,-2):s.shape.slice(0,-2)).concat([c,h]);k.assert(d===p,()=>`Error in matMul: inner shapes (${d}) and (${p}) of Tensors with shapes ${r.shape} and ${s.shape} and transposeA=${i} and transposeB=${o} must match.`);let w=i?[y,d,c]:[y,c,d],b=o?[A,h,p]:[A,p,h],v=ht({inputs:{x:r},backend:n,attrs:{shape:w}}),S=ht({inputs:{x:s},backend:n,attrs:{shape:b}}),T=i?v.shape[1]:v.shape[2],E=i?v.shape[2]:v.shape[1],$=o?S.shape[1]:S.shape[2],z=Math.max(y,A),O=n.data.get(v.dataId).values,_=n.data.get(S.dataId).values,D=k.computeStrides(v.shape),U=k.computeStrides(S.shape),[q,G,Q]=i?[D[0],1,D[1]]:[D[0],D[1],1],[Y,re,ne]=o?[1,U[1],U[0]]:[U[1],1,U[0]],ie=E*$,ee=Be([z,E,$],v.dtype),pe=ee.values,oe=n.blockSize;for(let ge=0;geMath.acos(e)),kD={kernelName:lo,backendName:"cpu",kernelFunc:wD},ID=rt(uo,e=>Math.acosh(e)),SD={kernelName:uo,backendName:"cpu",kernelFunc:ID};function ND(e){let{inputs:t,backend:n}=e,a=t;ve(t,"addN");let r=a.map(o=>n.data.get(o.dataId).values),s=Be(a[0].shape,a[0].dtype),i=s.values;for(let o=0;og&&(g=b,x=w)}h[y]=x}return l.forEach(y=>n.disposeIntermediateTensorInfo(y)),n.makeTensorInfo(d,"int32",h)}var $D={kernelName:fs,backendName:"cpu",kernelFunc:FD};function DD(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{axis:s}=a;ve(r,"argMin");let i=k.parseAxisParam(s,r.shape),o=R.getAxesPermutation(i,r.shape.length),u=r,l=[];o!=null&&(u=aa({inputs:{x:r},backend:n,attrs:{perm:o}}),l.push(u),i=R.getInnerMostAxes(i.length,u.shape.length)),i=[i[0]],R.assertAxesAreInnerMostDims("argMin",i,u.shape.length);let[d,p]=R.computeOutAndReduceShapes(u.shape,i),c=k.sizeFromShape(d),h=k.makeZerosTypedArray(c,"int32"),m=k.sizeFromShape(p),f=n.data.get(u.dataId).values;for(let y=0;yn.disposeIntermediateTensorInfo(y)),n.makeTensorInfo(d,"int32",h)}var zD={kernelName:Nu,backendName:"cpu",kernelFunc:DD},OD=rt(ho,e=>Math.asin(e)),_D={kernelName:ho,backendName:"cpu",kernelFunc:OD},PD=rt(fo,e=>Math.asinh(e)),LD={kernelName:fo,backendName:"cpu",kernelFunc:PD},WD=rt(mo,e=>Math.atan(e)),BD={kernelName:mo,backendName:"cpu",kernelFunc:WD},VD=Dt((e,t)=>Math.atan2(e,t)),jD=Xt(Ao,VD),UD={kernelName:Ao,backendName:"cpu",kernelFunc:jD},HD=rt(yo,e=>Math.atanh(e)),GD={kernelName:yo,backendName:"cpu",kernelFunc:HD};function dy(e,t,n,a,r,s){let i=r.strideHeight,o=r.strideWidth,u=r.dilationHeight,l=r.dilationWidth,d=r.effectiveFilterHeight,p=r.effectiveFilterWidth,c=r.padInfo.top,h=r.padInfo.left,m=s==="max"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,f=Be(r.outShape,n),y=f.values,A=r.outShape[1]*r.outShape[2]*r.outShape[3],g=r.outShape[2]*r.outShape[3],x=r.outShape[3];for(let w=0;wG?G=oe:s==="avg"&&(Q+=oe,Y++)}if(isNaN(G))break}let re=O+_*x+S;y[re]=s==="avg"?Q/Y:G}}}return f}function $7(e,t,n,a,r=!1,s=!1){let i=Be(a.outShape,"int32"),o=a.strideHeight,u=a.strideWidth,l=a.dilationHeight,d=a.dilationWidth,p=a.effectiveFilterHeight,c=a.effectiveFilterWidth,h=a.padInfo.top,m=a.padInfo.left,f=Be(t,n,e);for(let y=0;y$&&($=q,r?z=s?((y*a.inHeight+O)*a.inWidth+D)*a.inChannels+A:(O*a.inWidth+D)*a.inChannels+A:z=_*c+U)}}i.set(z,y,g,v,A)}}return i}function D7(e,t,n,a,r,s){let i=r.strideDepth,o=r.strideHeight,u=r.strideWidth,l=r.dilationDepth,d=r.dilationHeight,p=r.dilationWidth,c=r.effectiveFilterDepth,h=r.effectiveFilterHeight,m=r.effectiveFilterWidth,f=r.padInfo.front,y=r.padInfo.top,A=r.padInfo.left,g=s==="max"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,x=Be(r.outShape,n),w=x.values,b=r.outShape[1]*r.outShape[2]*r.outShape[3]*r.outShape[4],v=r.outShape[2]*r.outShape[3]*r.outShape[4],S=r.outShape[3]*r.outShape[4],T=r.outShape[4];for(let E=0;ENe?Ne=Ue:s==="avg"&&(Te+=Ue,De++),isNaN(Ne))break}if(isNaN(Ne))break}if(isNaN(Ne))break}let _e=he+O;w[_e]=s==="avg"?Te/De:Ne}}}}return x}function qD(e,t){let n=Be(t.outShape,"int32"),a=t.strideDepth,r=t.strideHeight,s=t.strideWidth,i=t.dilationDepth,o=t.dilationHeight,u=t.dilationWidth,l=t.effectiveFilterDepth,d=t.effectiveFilterHeight,p=t.effectiveFilterWidth,c=t.padInfo.front,h=t.padInfo.top,m=t.padInfo.left;for(let f=0;f=_&&(_=ne,D=q*d*p+Q*d+re)}}}n.set(D,f,A,b,E,y)}}}return n}function XD(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t;ve(r,"avgPool");let{filterSize:s,strides:i,pad:o,dimRoundingMode:u}=a,l=1;k.assert(R.eitherStridesOrDilationsAreOne(i,l),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${i} and dilations '${l}'`);let d=R.computePool2DInfo(r.shape,s,i,l,o,u),p;if(d.filterWidth===1&&d.filterHeight===1&&k.arraysEqual(d.inShape,d.outShape))p=qa({inputs:{x:r},backend:n});else{let c=n.data.get(r.dataId).values,h=k.computeStrides(r.shape),m=dy(c,r.shape,r.dtype,h,d,"avg");p=n.makeTensorInfo(d.outShape,r.dtype,m.values)}return p}var KD={kernelName:ms,backendName:"cpu",kernelFunc:XD};function ZD(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{filterSize:s,strides:i,pad:o,dimRoundingMode:u,dataFormat:l}=a;ve(r,"avgPool3d");let d=R.computePool3DInfo(r.shape,s,i,1,o,u,l),p=n.data.get(r.dataId).values,c=D7(p,r.shape,r.dtype,k.computeStrides(r.shape),d,"avg");return n.makeTensorInfo(c.shape,"float32",c.values)}var YD={kernelName:Tu,backendName:"cpu",kernelFunc:ZD};function JD(e){let{inputs:t,backend:n,attrs:a}=e,{dy:r,input:s}=t,{filterSize:i,strides:o,pad:u,dimRoundingMode:l}=a;ve([r,s],"avgPool3DGrad");let d=R.computePool3DInfo(s.shape,i,o,1,u,l),p=d.strideDepth,c=d.strideHeight,h=d.strideWidth,m=d.filterDepth,f=d.filterHeight,y=d.filterWidth,A=d.dilationDepth,g=d.dilationHeight,x=d.dilationWidth,w=d.effectiveFilterDepth,b=d.effectiveFilterHeight,v=d.effectiveFilterWidth,S=w-1-d.padInfo.front,T=v-1-d.padInfo.left,E=b-1-d.padInfo.top,$=Be(s.shape,"float32"),z=1/(m*f*y),O=n.bufferSync(r);for(let _=0;_=d.outDepth||Math.floor(ee)!==ee))for(let pe=0;pe=d.outHeight||Math.floor(oe)!==oe))for(let ge=0;ge=d.outWidth||Math.floor(he)!==he||(ne+=O.get(_,ee,oe,he,D))}}}$.set(ne*z,_,U,q,G,D)}return n.makeTensorInfo($.shape,$.dtype,$.values)}var QD={kernelName:Wp,backendName:"cpu",kernelFunc:JD};function ez(e){let{inputs:t,backend:n,attrs:a}=e,{dy:r,input:s}=t,i=s;ve([r,s],"avgPoolGrad");let{filterSize:o,strides:u,pad:l}=a,d=R.computePool2DInfo(i.shape,o,u,1,l),p=d.strideHeight,c=d.strideWidth,h=d.filterHeight,m=d.filterWidth,f=d.dilationHeight,y=d.dilationWidth,A=d.effectiveFilterHeight,g=d.effectiveFilterWidth,x=g-1-d.padInfo.left,w=A-1-d.padInfo.top,b=Be(i.shape,"float32"),v=1/(h*m),S=n.data.get(r.dataId).values,T=Be(r.shape,"float32",S);for(let E=0;E=d.outHeight||Math.floor(G)!==G))for(let Q=0;Q=d.outWidth||Math.floor(Y)!==Y||(U+=T.get(E,G,Y,$))}}b.set(U*v,E,z,O,$)}return n.makeTensorInfo(b.shape,b.dtype,b.values)}var tz={kernelName:Lp,backendName:"cpu",kernelFunc:ez};function nz(e){let{inputs:t,backend:n,attrs:a}=e,{x:r,scale:s,offset:i,mean:o,variance:u}=t;k.assert(o.shape.length===u.shape.length,()=>"Batch normalization gradient requires mean and variance to have equal ranks."),k.assert(i==null||o.shape.length===i.shape.length,()=>"Batch normalization gradient requires mean and offset to have equal ranks."),k.assert(s==null||o.shape.length===s.shape.length,()=>"Batch normalization gradient requires mean and scale to have equal ranks."),ve([r,o,u,s,i],"batchNorm");let{varianceEpsilon:l}=a;l==null&&(l=.001);let d=n.data.get(r.dataId).values,p=n.data.get(o.dataId).values,c=n.data.get(u.dataId).values,h=s?n.data.get(s.dataId).values:new Float32Array([1]),m=i?n.data.get(i.dataId).values:new Float32Array([0]),f=new Float32Array(d.length),y=m.length,A=h.length,g=c.length,x=p.length,w=0,b=0,v=0,S=0;for(let T=0;T=y&&(w=0),b>=x&&(b=0),v>=A&&(v=0),S>=g&&(S=0);return n.makeTensorInfo(r.shape,r.dtype,f)}var az={kernelName:Es,backendName:"cpu",kernelFunc:nz};function rz(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{blockShape:s,crops:i}=a;ve([r],"batchToSpaceND");let o=s.reduce((A,g)=>A*g),u=R.getReshaped(r.shape,s,o),l=R.getPermuted(u.length,s.length),d=R.getReshapedPermuted(r.shape,s,o),p=R.getSliceBeginCoords(i,s.length),c=R.getSliceSize(d,i,s.length),h=ht({inputs:{x:r},backend:n,attrs:{shape:u}}),m=aa({inputs:{x:h},backend:n,attrs:{perm:l}}),f=ht({inputs:{x:m},backend:n,attrs:{shape:d}}),y=Ti({inputs:{x:f},backend:n,attrs:{begin:p,size:c}});return n.disposeIntermediateTensorInfo(h),n.disposeIntermediateTensorInfo(m),n.disposeIntermediateTensorInfo(f),y}var sz={kernelName:Eu,backendName:"cpu",kernelFunc:rz};function iz(e){let{inputs:t,backend:n,attrs:a}=e,{x:r,weights:s}=t,{size:i}=a,o=n.data.get(r.dataId).values,u=n.data.get(s.dataId).values,l=ay(o,u,s.dtype,s.shape,i);return n.makeTensorInfo([i],s.dtype,l)}var oz={kernelName:Bp,backendName:"cpu",kernelFunc:iz},lz=rt(Fr,(e,t)=>{let n=t;return e>n.clipValueMax?n.clipValueMax:e{let{x:t}=e.inputs,n=e.backend,a=new Float32Array(k.sizeFromShape(t.shape)),r=n.data.get(t.dataId),s=r.complexTensorInfos.real,i=r.complexTensorInfos.imag,o=n.data.get(s.dataId).values,u=n.data.get(i.dataId).values;for(let l=0;lf.shape),s);if(k.sizeFromShape(i)===0)return n.makeTensorInfo(i,t[0].dtype,[]);let o=t.filter(f=>k.sizeFromShape(f.shape)>0);if(o.length===1)return qa({inputs:{x:o[0]},backend:n});let u=o.map(f=>f.shape);if(R.assertParamsConsistent(u,s),o[0].dtype==="complex64"){let f=o.map(w=>Ni({inputs:{input:w},backend:n})),y=o.map(w=>Dl({inputs:{input:w},backend:n})),A=zl({inputs:f,backend:n,attrs:{axis:s}}),g=zl({inputs:y,backend:n,attrs:{axis:s}}),x=Vn({inputs:{real:A,imag:g},backend:n});return f.forEach(w=>n.disposeIntermediateTensorInfo(w)),y.forEach(w=>n.disposeIntermediateTensorInfo(w)),n.disposeIntermediateTensorInfo(A),n.disposeIntermediateTensorInfo(g),x}let l=o.map(f=>{let y=k.sizeFromShape(f.shape.slice(s));return ht({inputs:{x:f},backend:n,attrs:{shape:[-1,y]}})}),d=l.map(f=>({vals:n.data.get(f.dataId).values,shape:f.shape}));i=R.computeOutShape(l.map(f=>f.shape),1);let p=l[0].shape[0]===1,c=ry(d,i,t[0].dtype,p),h=R.computeOutShape(o.map(f=>f.shape),s),m=n.makeTensorInfo(h,t[0].dtype,c);return l.forEach(f=>n.disposeIntermediateTensorInfo(f)),m}var hz={kernelName:go,backendName:"cpu",kernelFunc:zl};function z7(e){let{inputs:t,backend:n,attrs:a}=e,{x:r,filter:s}=t,{strides:i,pad:o,dataFormat:u,dilations:l,dimRoundingMode:d}=a;ve([r,s],"conv2d");let p=R.convertConv2DDataFormat(u),c=R.computeConv2DInfo(r.shape,s.shape,i,l,o,d,!1,p),h=c.filterHeight,m=c.filterWidth,f=c.dilationHeight,y=c.dilationWidth,A=c.padInfo.left,g=c.padInfo.top,x=c.dataFormat==="channelsLast",w=new Pt(c.outShape,r.dtype),b=k.computeStrides(r.shape),v=k.computeStrides(s.shape),S=b[0],T=x?b[1]:b[2],E=x?b[2]:1,$=x?1:b[1],z=w.strides[0],O=x?w.strides[1]:w.strides[2],_=x?w.strides[2]:1,D=x?1:w.strides[1],U=n.data.get(r.dataId).values,q=n.data.get(s.dataId).values,G=w.values;for(let Q=0;Q=c.inHeight)continue;let ge=pe*v[0],he=Y+oe*T;for(let Ne=0;Ne=c.inWidth)continue;let tt=ge+_e*v[1],nt=he+ze*E,it=tt;for(let Ze=0;Ze=l.inDepth)continue;let Q=q*E[0],Y=z+G*T[1];for(let re=0;re=l.inHeight)continue;let oe=Q+ee*E[1],ge=Y+pe*T[2];for(let he=0;he=l.inWidth)continue;let ze=oe+De*E[2],tt=ge+_e*l.inChannels,nt=ze;for(let it=0;itMath.cos(e)),Nz={kernelName:vs,backendName:"cpu",kernelFunc:Sz},Tz=rt(xo,e=>Math.cosh(e)),Ez={kernelName:xo,backendName:"cpu",kernelFunc:Tz};function Cz(e){let{inputs:t,backend:n,attrs:a}=e,{image:r,boxes:s,boxInd:i}=t,{cropSize:o,method:u,extrapolationValue:l}=a,[d,p,c,h]=r.shape,m=s.shape[0],[f,y]=o,A=Be([m,f,y,h],"float32"),g=n.data.get(s.dataId).values,x=n.data.get(i.dataId).values,w=n.data.get(r.dataId).values,b=k.computeStrides(r.shape),v=k.computeStrides(A.shape);for(let S=0;S=d)continue;let D=f>1?(z-E)*(p-1)/(f-1):0,U=y>1?(O-$)*(c-1)/(y-1):0;for(let q=0;q1?E*(p-1)+q*D:.5*(E+z)*(p-1);if(G<0||G>p-1){for(let Q=0;Q1?$*(c-1)+ne*U:.5*($+O)*(c-1);if(ie<0||ie>c-1){for(let ge=0;ge1?$*(c-1)+Q*U:.5*($+O)*(c-1);if(Y<0||Y>c-1){for(let ie=0;ieA+m-g-1:(A,g)=>A+g;for(let A=0;A`Only NHWC dataFormat supported on CPU for depthToSpace. Got ${i}`),k.assert(s>1,()=>`blockSize should be > 1 for depthToSpace, but was: ${s}`);let o=r.shape[0],u=r.shape[1],l=r.shape[2],d=r.shape[3],p=u*s,c=l*s,h=d/(s*s),m=n.data.get(r.dataId).values,f=new Float32Array(o*p*c*h),y=0;for(let A=0;A`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${i} and dilations '${c}'`);let h=R.computeConv2DInfo(r.shape,s.shape,i,c,o,l,!0),{filterHeight:m,filterWidth:f,dilationHeight:y,dilationWidth:A,padInfo:g}=h,x=g.left,w=g.top,b=h.outChannels/h.inChannels,v=new Pt(h.outShape,r.dtype),S=n.data.get(r.dataId).values,T=n.data.get(s.dataId).values,E=v.values;for(let $=0;$=h.inHeight)continue;let Q=q*p[0],Y=z+G*d[1];for(let re=0;re=h.inWidth)continue;let oe=Q+ee*p[1],ge=Y+pe*h.inChannels,he=ne,Ne=oe;for(let Te=0;Te{let{x:a,filter:r}=e,{strides:s,pad:i,dilations:o}=n,u=t,l=u.data.get(a.dataId).values,d=a.shape.length,p=u.data.get(r.dataId).values,c=r.shape.length,{batchSize:h,inHeight:m,inWidth:f,inChannels:y,outHeight:A,outWidth:g,padInfo:x,strideHeight:w,strideWidth:b,filterHeight:v,filterWidth:S,dilationHeight:T,dilationWidth:E,outShape:$}=R.computeDilation2DInfo(a.shape,r.shape,s,i,"NHWC",o),z=k.sizeFromShape($),O=$.length,_=k.getArrayFromDType(a.dtype,z);for(let D=0;D=0&&ee=0&&oere&&(re=Ne)}}}let ne=k.locToIndex([D,U,G,Y],O,k.computeStrides($));_[ne]=re}}}return{dataId:u.write(k.toTypedArray(_,a.dtype),$,a.dtype),shape:$,dtype:a.dtype}}},Hz={kernelName:Yp,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{let{x:a,filter:r,dy:s}=e,{strides:i,pad:o,dilations:u}=n,l=t,d=k.toNestedArray(a.shape,l.data.get(a.dataId).values),p=k.toNestedArray(r.shape,l.data.get(r.dataId).values),{batchSize:c,inHeight:h,inWidth:m,inChannels:f,outHeight:y,outWidth:A,padInfo:g,strideHeight:x,strideWidth:w,filterHeight:b,filterWidth:v,dilationHeight:S,dilationWidth:T,outShape:E}=R.computeDilation2DInfo(a.shape,r.shape,i,o,"NHWC",u);k.assert(s.rank===E.length,()=>`Error in ${Yp}, dy must have the same rank as output ${E.length}, but got ${s.rank}`);let $=k.toNestedArray(E,l.data.get(s.dataId).values),z=k.makeZerosNestedTypedArray(r.shape,r.dtype);for(let O=0;O=0&&ie=0&&peQ&&(Q=oe,Y=ne,re=ee)}}}z[Y][re][G]+=$[O][_][U][G]}}}return{dataId:l.write(k.toTypedArray(z,a.dtype),r.shape,r.dtype),shape:r.shape,dtype:r.dtype}}},Gz={kernelName:Zp,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{let{x:a,filter:r,dy:s}=e,{strides:i,pad:o,dilations:u}=n,l=t,d=k.toNestedArray(a.shape,l.data.get(a.dataId).values),p=k.toNestedArray(r.shape,l.data.get(r.dataId).values),{batchSize:c,inHeight:h,inWidth:m,inChannels:f,outHeight:y,outWidth:A,padInfo:g,strideHeight:x,strideWidth:w,filterHeight:b,filterWidth:v,dilationHeight:S,dilationWidth:T,outShape:E}=R.computeDilation2DInfo(a.shape,r.shape,i,o,"NHWC",u);k.assert(s.rank===E.length,()=>`Error in ${Zp}, dy must have the same rank as output ${E.length}, but got ${s.rank}`);let $=k.toNestedArray(E,l.data.get(s.dataId).values),z=k.makeZerosNestedTypedArray(a.shape,a.dtype);for(let O=0;O=0&&ie=0&&peQ&&(Q=oe,Y=ie,re=pe)}}}z[O][Y][re][G]+=$[O][_][U][G]}}}return{dataId:l.write(k.toTypedArray(z,a.dtype),a.shape,a.dtype),shape:a.shape,dtype:a.dtype}}};function yd(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{axis:s,keepDims:i}=a;ve(r,"sum");let o;r.dtype==="bool"?o=Hr({inputs:{x:r},backend:n,attrs:{dtype:"int32"}}):o=qa({inputs:{x:r},backend:n});let u=o.shape.length,l=k.parseAxisParam(s,o.shape),d=R.getAxesPermutation(l,u),p=l,c=o;d!=null&&(c=aa({inputs:{x:o},backend:n,attrs:{perm:d}}),p=R.getInnerMostAxes(p.length,u)),R.assertAxesAreInnerMostDims("sum",p,c.shape.length);let[h,m]=R.computeOutAndReduceShapes(c.shape,p),f=R.upcastType(c.dtype,"int32"),y=fh(n,h,f),A=k.sizeFromShape(m),g=n.data.get(y.dataId).values,x=n.data.get(c.dataId).values;for(let w=0;w=0&&(c=yd({inputs:{x:c},backend:n,attrs:{axis:l[f]-(i.length-h),keepDims:!1}}),m.push(c)),h--)}for(let f of m)f!==c&&n.disposeIntermediateTensorInfo(f);return c}var Kz={kernelName:Jp,backendName:"cpu",kernelFunc:Xz};function Zz(e){let{inputs:t,backend:n}=e,{dy:a,y:r}=t;ve([a,r],"eluGrad");let s=new Float32Array(k.sizeFromShape(r.shape)),i=n.data.get(r.dataId).values,o=n.data.get(a.dataId).values;for(let u=0;u=1?s[u]=o[u]:s[u]=o[u]*(l+1)}return n.makeTensorInfo(r.shape,"float32",s)}var Yz={kernelName:Qp,backendName:"cpu",kernelFunc:Zz},Jz=Dt((e,t)=>e===t?1:0),_7=Xt(Io,Jz,null,"bool"),Qz={kernelName:Io,backendName:"cpu",kernelFunc:_7},eO=R.ERF_P,tO=R.ERF_A1,nO=R.ERF_A2,aO=R.ERF_A3,rO=R.ERF_A4,sO=R.ERF_A5,iO=rt(ko,e=>{let t=Math.sign(e),n=Math.abs(e),a=1/(1+eO*n);return t*(1-((((sO*a+rO)*a+aO)*a+nO)*a+tO)*a*Math.exp(-n*n))}),oO={kernelName:ko,backendName:"cpu",kernelFunc:iO};function Ah(e){let{inputs:t,backend:n,attrs:a}=e,{input:r}=t,{dim:s}=a,i=r.shape.length,o=r.shape.slice(),u=s;return s<0&&(k.assert(-(i+1)<=s,()=>`Axis must be in the interval [${-(i+1)}, ${i}]`),u=i+s+1),o.splice(u,0,1),ht({inputs:{x:r},backend:n,attrs:{shape:o}})}var lO={kernelName:So,backendName:"cpu",kernelFunc:Ah},uO=Dt((e,t)=>e/t),py=Xt(Is,uO),cy={kernelName:Is,backendName:"cpu",kernelFunc:py};function P7(e,t,n){let a=e.shape,r=a[0],s=a[1],i=n.data.get(e.dataId),o=i.complexTensorInfos.real,u=i.complexTensorInfos.imag,l=[r,s],d=k.sizeFromShape(l),p=k.getTypedArrayFromDType("float32",d),c=k.getTypedArrayFromDType("float32",d);for(let y=0;y{let{image:a}=e,r=n,s=k.getTypedArrayFromDType(a.dtype,k.sizeFromShape(a.shape)),[i,o,u,l]=a.shape,d=r.data.get(a.dataId).values;for(let p=0;p=0&&xMath.floor(e/t)),xO=Xt(Ts,gO,null,"int32"),bO={kernelName:Ts,backendName:"cpu",kernelFunc:xO};function vO(e){let{inputs:t,backend:n,attrs:a}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:u,pad:l,dataFormat:d,dilations:p,dimRoundingMode:c,activation:h,leakyreluAlpha:m}=a,f=z7({inputs:{x:r,filter:s},backend:n,attrs:{strides:u,pad:l,dataFormat:d,dilations:p,dimRoundingMode:c}});if(i){let y=f;f=md({inputs:{a:f,b:i},backend:n}),n.disposeIntermediateTensorInfo(y)}if(h){let y=f;f=uy(n,f,h,o,m),n.disposeIntermediateTensorInfo(y)}return f}var wO={kernelName:li,backendName:"cpu",kernelFunc:vO};function kO(e){let{inputs:t,backend:n,attrs:a}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:u,pad:l,dataFormat:d,dilations:p,dimRoundingMode:c,activation:h,leakyreluAlpha:m}=a,f=O7({inputs:{x:r,filter:s},backend:n,attrs:{strides:u,pad:l,dataFormat:d,dilations:p,dimRoundingMode:c}});if(i){let y=f;f=md({inputs:{a:f,b:i},backend:n}),n.disposeIntermediateTensorInfo(y)}if(h){let y=f;f=uy(n,f,h,o,m),n.disposeIntermediateTensorInfo(y)}return f}var IO={kernelName:ui,backendName:"cpu",kernelFunc:kO};function SO(e){let{inputs:t,backend:n}=e,{params:a,indices:r}=t,s=k.sizeFromShape(a.shape),i=r.shape,o=i[i.length-1],[u,l,d,p]=R.prepareAndValidate(a,r);if(l===0)return n.makeTensorInfo(u,a.dtype,[]);let c=Be([l,d],a.dtype),h=n.data.get(r.dataId).values,m=n.data.get(a.dataId).values;for(let f=0;f=s/d)throw new Error(`Invalid indices: ${y} does not index into ${a.shape}`);for(let g=0;ge>=t?1:0),RO=Xt(Cs,CO,null,"bool"),MO={kernelName:Cs,backendName:"cpu",kernelFunc:RO};function FO(e){let{inputs:t,backend:n}=e,{input:a}=t,r=k.sizeFromShape(a.shape),s=a.shape[a.shape.length-1],i=r/s,o=ht({inputs:{x:a},backend:n,attrs:{shape:[i,s]}}),u=P7(o,!0,n),l=ht({inputs:{x:u},backend:n,attrs:{shape:a.shape}});return n.disposeIntermediateTensorInfo(o),n.disposeIntermediateTensorInfo(u),l}var $O={kernelName:tc,backendName:"cpu",kernelFunc:FO},DO=rt(Mo,e=>Number.isFinite(e)?1:0,"bool"),zO={kernelName:Mo,backendName:"cpu",kernelFunc:DO},OO=rt(Fo,e=>Math.abs(e)===Infinity?1:0,"bool"),_O={kernelName:Fo,backendName:"cpu",kernelFunc:OO},PO=rt($o,e=>Number.isNaN(e)?1:0,"bool"),LO={kernelName:$o,backendName:"cpu",kernelFunc:PO},WO=Dt((e,t)=>e<=t?1:0),BO=Xt(zo,WO,null,"bool"),VO={kernelName:zo,backendName:"cpu",kernelFunc:BO};function jO(e){let{backend:t,attrs:n}=e,{start:a,stop:r,num:s}=n,i=l7(a,r,s);return t.makeTensorInfo([i.length],"float32",i)}var UO={kernelName:ac,backendName:"cpu",kernelFunc:jO},HO=rt(Oo,e=>Math.log1p(e)),GO={kernelName:Oo,backendName:"cpu",kernelFunc:HO},qO=Dt((e,t)=>e&&t),XO=Xt(_o,qO,null,"bool"),KO={kernelName:_o,backendName:"cpu",kernelFunc:XO},ZO=rt($u,e=>e?0:1,"bool"),YO={kernelName:$u,backendName:"cpu",kernelFunc:ZO},JO=Dt((e,t)=>e||t),QO=Xt(Du,JO,null,"bool"),e_={kernelName:Du,backendName:"cpu",kernelFunc:QO};function t_(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{depthRadius:s,bias:i,alpha:o,beta:u}=a;ve(r,"LRN");let l=r.shape[3],d=l-1,p=n.data.get(r.dataId).values,c=k.sizeFromShape(r.shape),h=new Float32Array(c);function m(f){let y=f%l,A=f-y+Math.max(0,y-s),g=f-y+Math.min(y+s,d),x=0;for(;A<=g;A++){let w=p[A];x+=w*w}return x}for(let f=0;f`Error in maxPool: Either strides or dilations must be 1. Got strides ${i} and dilations '${l}'`);let d=R.computePool2DInfo(r.shape,s,i,l,o,u),p;if(d.filterWidth===1&&d.filterHeight===1&&k.arraysEqual(d.inShape,d.outShape))p=qa({inputs:{x:r},backend:n});else{let c=n.data.get(r.dataId).values,h=k.computeStrides(r.shape),m=dy(c,r.shape,r.dtype,h,d,"max");p=n.makeTensorInfo(d.outShape,r.dtype,m.values)}return p}var o_={kernelName:zs,backendName:"cpu",kernelFunc:i_};function l_(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{filterSize:s,strides:i,pad:o,dimRoundingMode:u,dataFormat:l}=a;ve(r,"maxPool3d");let d=R.computePool3DInfo(r.shape,s,i,1,o,u,l),p=n.data.get(r.dataId).values,c=D7(p,r.shape,r.dtype,k.computeStrides(r.shape),d,"max");return n.makeTensorInfo(c.shape,"float32",c.values)}var u_={kernelName:Ou,backendName:"cpu",kernelFunc:l_};function d_(e){let{inputs:t,backend:n,attrs:a}=e,{dy:r,input:s}=t,{filterSize:i,strides:o,pad:u,dimRoundingMode:l}=a;ve([r,s],"maxPool3DGrad");let d=R.computePool3DInfo(s.shape,i,o,1,u,l),p=n.bufferSync(s),c=qD(p,d),h=d.strideDepth,m=d.strideHeight,f=d.strideWidth,y=d.dilationDepth,A=d.dilationHeight,g=d.dilationWidth,x=d.effectiveFilterDepth,w=d.effectiveFilterHeight,b=d.effectiveFilterWidth,v=x-1-d.padInfo.front,S=b-1-d.padInfo.left,T=w-1-d.padInfo.top,E=Be(s.shape,"float32"),$=n.bufferSync(r);for(let z=0;z=d.outDepth||Math.floor(ne)!==ne))for(let ie=0;ie=d.outHeight||Math.floor(ee)!==ee))for(let pe=0;pe=d.outWidth||Math.floor(oe)!==oe)continue;let ge=x*w*b-1-c.get(z,ne,ee,oe,O),he=re*w*b+ie*b+pe,Ne=ge===he?1:0;Ne!==0&&(Y+=$.get(z,ne,ee,oe,O)*Ne)}}}E.set(Y,z,_,D,U,O)}return n.makeTensorInfo(E.shape,E.dtype,E.values)}var p_={kernelName:ic,backendName:"cpu",kernelFunc:d_};function c_(e){let{inputs:t,backend:n,attrs:a}=e,{dy:r,input:s,output:i}=t,o=s;ve([s,i],"maxPoolGrad");let{filterSize:u,strides:l,pad:d,dimRoundingMode:p}=a,c=R.computePool2DInfo(o.shape,u,l,1,d,p),h=n.data.get(o.dataId).values,m=Be(c.outShape,o.dtype,$7(h,o.shape,o.dtype,c).values),f=c.strideHeight,y=c.strideWidth,A=c.dilationHeight,g=c.dilationWidth,x=c.effectiveFilterHeight,w=c.effectiveFilterWidth,b=w-1-c.padInfo.left,v=x-1-c.padInfo.top,S=Be(o.shape,"float32"),T=n.data.get(r.dataId).values,E=Be(r.shape,"float32",T);for(let $=0;$=c.outHeight||Math.floor(Q)!==Q))for(let Y=0;Y=c.outWidth||Math.floor(re)!==re)continue;let ne=x*w-1-m.get($,Q,re,z),ie=G*w+Y,ee=ne===ie?1:0;ee!==0&&(q+=E.get($,Q,re,z)*ee)}}S.set(q,$,O,_,z)}return n.makeTensorInfo(S.shape,S.dtype,S.values)}var h_={kernelName:sc,backendName:"cpu",kernelFunc:c_};function f_(e,t,n,a,r){let s=k.computeStrides(t),i=dy(e,t,n,s,r,"max"),o=$7(e,t,n,r,!0,a);return[i.values,o.values]}var m_={kernelName:oc,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{let{x:a}=e,{filterSize:r,strides:s,pad:i,includeBatchInIndex:o}=t,u=n;ve(a,"MaxPoolWithArgmax");let l=u.data.get(a.dataId).values,d=R.computePool2DInfo(a.shape,r,s,[1,1],i),[p,c]=f_(l,a.shape,a.dtype,o,d),h=u.write(p,d.outShape,a.dtype),m=u.write(c,d.outShape,a.dtype);return[{dataId:h,shape:d.outShape,dtype:a.dtype},{dataId:m,shape:d.outShape,dtype:"int32"}]}};function y_(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{axis:s,keepDims:i}=a,o=k.parseAxisParam(s,r.shape),u=R.computeOutAndReduceShapes(r.shape,o)[1],l=k.sizeFromShape(u),d=[],p=n.makeTensorInfo([],"float32",new Float32Array([l]));d.push(p);let c=Hr({inputs:{x:r},backend:n,attrs:{dtype:"float32"}});d.push(c);let h=py({inputs:{a:c,b:p},backend:n});d.push(h);let m=yd({inputs:{x:h},backend:n,attrs:{axis:s,keepDims:i}});return d.forEach(f=>n.disposeIntermediateTensorInfo(f)),m}var A_={kernelName:Os,backendName:"cpu",kernelFunc:y_};function g_(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{axis:s,keepDims:i}=a;ve(r,"min");let o=k.parseAxisParam(s,r.shape),u=o,l=R.getAxesPermutation(u,r.shape.length),d=r;l!=null&&(d=aa({inputs:{x:r},backend:n,attrs:{perm:l}}),u=R.getInnerMostAxes(u.length,r.shape.length)),R.assertAxesAreInnerMostDims("min",u,d.shape.length);let[p,c]=R.computeOutAndReduceShapes(d.shape,u),h=k.sizeFromShape(c),m=k.makeZerosTypedArray(k.sizeFromShape(p),d.dtype),f=n.data.get(d.dataId).values;for(let A=0;Ag[0]+r.shape[x]+g[1]),u=s.map(g=>g[0]),l=s.map((g,x)=>g[0]+r.shape[x]),d=i==="reflect"?0:1,p=n.data.get(r.dataId).values,c=r.shape.length,h=k.computeStrides(r.shape),m=k.sizeFromShape(o),f=o.length,y=k.computeStrides(o),A=k.getTypedArrayFromDType(r.dtype,m);for(let g=0;g=l[b]&&(x[b]=(l[b]-1)*2-x[b]+d);x=x.map((b,v)=>b-u[v]);let w=k.locToIndex(x,c,h);A[g]=p[w]}return{dataId:n.write(A,o,r.dtype),shape:o,dtype:r.dtype}}var v_={kernelName:Ls,backendName:"cpu",kernelFunc:b_},w_=Dt((e,t)=>{let n=e%t;return e<0&&t<0||e>=0&&t>=0?n:(n+t)%t}),k_=Xt(Po,w_),I_={kernelName:Po,backendName:"cpu",kernelFunc:k_},S_=ro(f5());function W7(e){let{inputs:t,backend:n,attrs:a}=e,{logits:r}=t,{dim:s}=a,i=r.shape.length,o=s;if(o===-1&&(o=i-1),o!==i-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${i} and dim was ${o}`);let u=k.parseAxisParam([o],r.shape),l=L7({inputs:{x:r},backend:n,attrs:{reductionIndices:u,keepDims:!1}}),d=R.expandShapeToKeepDim(l.shape,u),p=ht({inputs:{x:l},backend:n,attrs:{shape:d}}),c=ly({inputs:{a:r,b:p},backend:n}),h=n7({inputs:{x:c},backend:n}),m=yd({inputs:{x:h},backend:n,attrs:{axis:u,keepDims:!1}}),f=ht({inputs:{x:m},backend:n,attrs:{shape:d}}),y=py({inputs:{a:h,b:f},backend:n});return n.disposeIntermediateTensorInfo(l),n.disposeIntermediateTensorInfo(p),n.disposeIntermediateTensorInfo(c),n.disposeIntermediateTensorInfo(h),n.disposeIntermediateTensorInfo(m),n.disposeIntermediateTensorInfo(f),y}var N_={kernelName:ti,backendName:"cpu",kernelFunc:W7};function T_(e){let{inputs:t,backend:n,attrs:a}=e,{logits:r}=t,{numSamples:s,seed:i,normalized:o}=a;ve(r,"multinomial");let u=o?r:W7({inputs:{logits:r},backend:n,attrs:{dim:-1}}),l=u.shape[0],d=u.shape[1],p=n.data.get(u.dataId).values,c=[l,s],h=k.makeZerosTypedArray(k.sizeFromShape(c),"int32");for(let m=0;m=0&&d[p]{k.assertShapesMatch(s,d.shape,"All tensors passed to stack must have matching shapes"),k.assert(i===d.dtype,()=>"All tensors passed to stack must have matching dtypes")});let o=[],u=t.map(d=>{let p=Ah({inputs:{input:d},backend:n,attrs:{dim:r}});return o.push(p),p}),l=zl({inputs:u,backend:n,attrs:{axis:r}});return o.forEach(d=>n.disposeIntermediateTensorInfo(d)),l}var V_={kernelName:Ho,backendName:"cpu",kernelFunc:V7};function j_(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{paddings:s,constantValue:i}=a;ve(r,"pad");let o=s.map((A,g)=>A[0]+r.shape[g]+A[1]),u=s.map(A=>A[0]),l=n.data.get(r.dataId).values,d=k.sizeFromShape(r.shape),p=r.shape.length,c=k.computeStrides(r.shape),h=k.sizeFromShape(o),m=o.length,f=k.computeStrides(o),y=k.getTypedArrayFromDType(r.dtype,h);i!==0&&y.fill(i);for(let A=0;Aw+u[b]),x=k.locToIndex(g,m,f);y[x]=l[A]}return{dataId:n.write(y,o,r.dtype),shape:o,dtype:r.dtype}}var j7={kernelName:Vs,backendName:"cpu",kernelFunc:j_},U_=Dt((e,t)=>Math.pow(e,t)),H_=Xt(js,U_),G_={kernelName:js,backendName:"cpu",kernelFunc:H_};function q_(e){let{backend:t,attrs:n}=e,{start:a,stop:r,dtype:s,step:i}=n,o=oy(a,r,i,s);return t.makeTensorInfo([o.length],s,o)}var X_={kernelName:_u,backendName:"cpu",kernelFunc:q_},K_=rt(qo,e=>1/e),Z_={kernelName:qo,backendName:"cpu",kernelFunc:K_};function Y_(e){let{inputs:t,backend:n,attrs:a}=e,{images:r}=t,{alignCorners:s,halfPixelCenters:i,size:o}=a;ve(r,"resizeBilinear");let u=k.computeStrides(r.shape),[l,d]=o,[p,c,h,m]=r.shape,f=n.data.get(r.dataId).values,y=new Float32Array(k.sizeFromShape([p,l,d,m])),A=[s&&l>1?c-1:c,s&&d>1?h-1:h],g=[s&&l>1?l-1:l,s&&d>1?d-1:d],x=0,w=A[0]/g[0],b=A[1]/g[1];for(let v=0;v1?l-1:l,i&&h>1?d-1:d],y=[i&&c>1?c-1:c,i&&h>1?h-1:h],A=f[0]/y[0],g=f[1]/y[1],x=n.data.get(s.dataId).values,w=0;for(let b=0;b1?c-1:c,s&&d>1?h-1:h],g=[s&&l>1?l-1:l,s&&d>1?d-1:d],x=A[0]/g[0],w=A[1]/g[1],b=0;for(let v=0;v1?d-1:d,i&&m>1?p-1:p],g=[i&&h>1?h-1:h,i&&m>1?m-1:m],x=A[0]/g[0],w=A[1]/g[1],b=1/x,v=1/w,S=Math.ceil(b)*2+2,T=Math.ceil(v)*2+2;for(let E=0;E=h)continue;let ee=$+ie*u[1],pe=ie*x,oe=Math.min(d-1,i?Math.round(pe):Math.floor(pe));if(z===oe)for(let ge=0;ge=m)continue;let Ne=ee+he*u[2],Te=he*w,De=Math.min(p-1,i?Math.round(Te):Math.floor(Te));U===De&&(re+=y[Ne+Y])}}f[q+Y]=re}}}}return n.makeTensorInfo(r.shape,r.dtype,f)}var rP={kernelName:dc,backendName:"cpu",kernelFunc:aP};function sP(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{dims:s}=a;ve(r,"reverse");let i=r.shape.length,o=k.parseAxisParam(s,r.shape);if(i===0)return qa({inputs:{x:r},backend:n});let u=new Pt(r.shape,r.dtype),l=n.bufferSync(r);for(let d=0;dc[h]=r.shape[h]-1-c[h]),u.set(l.get(...c),...p)}return n.makeTensorInfo(u.shape,u.dtype,u.values)}var iP={kernelName:Xs,backendName:"cpu",kernelFunc:sP},oP={kernelName:ll,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{let{image:a}=e,{radians:r,fillValue:s,center:i}=t,o=n,u=k.getTypedArrayFromDType(a.dtype,k.sizeFromShape(a.shape)),[l,d,p,c]=a.shape,[h,m]=R.getImageCenter(i,d,p),f=255,y=Math.sin(r),A=Math.cos(r),g=o.data.get(a.dataId).values;for(let x=0;x=0&&_=0&&D{let t=Math.floor(e);return e-t<.5?Math.floor(e):e-t>.5?Math.ceil(e):t%2==0?t:t+1}),uP={kernelName:Ks,backendName:"cpu",kernelFunc:lP};function U7(e,t,n,a,r,s,i,o,u,l){let d=[a/r,r],p=e.values,c=t.values;if(a===0)return Be(n,t.dtype);let h=Be(d,t.dtype);h.values.fill(u);for(let m=0;m=a/r)throw new Error(`Invalid indices: ${f} does not index into ${n}`);for(let A=0;A1||r.shape.length===1?1:k.sizeFromShape(r.shape.slice(1));for(let m=0;me>=0?mP*e:fP*(Math.exp(e)-1)),AP={kernelName:Yo,backendName:"cpu",kernelFunc:yP},gP=rt(el,e=>e<0?-1:e>0?1:0),xP={kernelName:el,backendName:"cpu",kernelFunc:gP},bP=rt(Ys,e=>Math.sin(e)),vP={kernelName:Ys,backendName:"cpu",kernelFunc:bP},wP=rt(Qo,e=>Math.sinh(e)),kP={kernelName:Qo,backendName:"cpu",kernelFunc:wP},IP=11920928955078125e-23,H7=Math.log(IP)+2,SP=rt(tl,e=>{let t=e>-H7,n=eNumber(y)))),n.makeTensorInfo([f.length],a.dtype,new Int32Array(f))]}var RP={kernelName:cc,backendName:"cpu",kernelFunc:CP};function MP(e){let{inputs:t,backend:n}=e,{inputIndices:a,inputShape:r,newShape:s}=t;if(a.shape.length!==2)throw new Error(`Input indices should be a matrix but received shape - ${a.shape}`);if(r.shape.length!==1)throw new Error(`Input shape should be a vector but received shape - ${r.shape}`);if(s.shape.length!==1)throw new Error(`Target shape should be a vector but received shape ${s.shape}`);let i=Array.from(n.data.get(r.dataId).values),o=n.data.get(a.dataId).values,u=Array.from(n.data.get(s.dataId).values),[l,d,p]=g7(o,a.shape,a.dtype,i,u);return[n.makeTensorInfo(d,a.dtype,l),n.makeTensorInfo([p.length],s.dtype,new Int32Array(p))]}var FP={kernelName:hc,backendName:"cpu",kernelFunc:MP};function $P(e){let{inputs:t,backend:n,attrs:a}=e,{sparseIndices:r,sparseValues:s,defaultValue:i}=t,{outputShape:o}=a,{sliceRank:u,numUpdates:l,sliceSize:d,strides:p,outputSize:c}=R.calculateShapes(s,r,o),h=!1,m=n.bufferSync(r),f=n.bufferSync(s),y=n.data.get(i.dataId).values[0],A=U7(m,f,o,c,d,l,u,p,y,h);return n.makeTensorInfo(o,A.dtype,A.values)}var DP={kernelName:fc,backendName:"cpu",kernelFunc:$P};function zP(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{numOrSizeSplits:s,axis:i}=a,o=k.parseAxisParam(i,r.shape)[0],u=R.prepareSplitSize(r,s,o),l=new Array(r.shape.length).fill(0),d=r.shape.slice();return u.map(p=>{let c=[...d];c[o]=p;let h=Ti({inputs:{x:r},backend:n,attrs:{begin:l,size:c}});return l[o]+=p,h})}var OP={kernelName:nl,backendName:"cpu",kernelFunc:zP},_P=rt(Qs,e=>Math.sqrt(e)),PP={kernelName:Qs,backendName:"cpu",kernelFunc:_P},LP={kernelName:Wu,backendName:"cpu",kernelFunc:({inputs:e,backend:t})=>{let{x:n}=e,a=t;ve(n,"square");let r=a.data.get(n.dataId).values,s=new Float32Array(r.length);for(let i=0;i{let n=t;return isNaN(e)?NaN:e>0?1:n.alpha}),BP={kernelName:Dr,backendName:"cpu",kernelFunc:WP};function VP(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{begin:s,end:i,strides:o,beginMask:u,endMask:l,ellipsisMask:d,newAxisMask:p,shrinkAxisMask:c}=a;ve(r,"stridedSlice");let{nonStrided:h,$begin:m,$strides:f,size:y,newShape:A,outShape:g}=dn.sliceInfo(r.shape,s,i,o,u,l,d,p,c),x=ht({inputs:{x:r},backend:n,attrs:{shape:A}}),w;if(h){let v=Ti({inputs:{x},backend:n,attrs:{begin:m,size:y}});w=ht({inputs:{x:v},backend:n,attrs:{shape:g}}),n.disposeIntermediateTensorInfo(v)}else if(g.some(v=>v===0))w=n.makeTensorInfo(g,r.dtype,[]);else{let v=n.bufferSync(x),S=b7(g,v,f,m);w=n.makeTensorInfo(S.shape,S.dtype,S.values)}let b=ht({inputs:{x:w},backend:n,attrs:{shape:g}});return n.disposeIntermediateTensorInfo(x),n.disposeIntermediateTensorInfo(w),b}var jP={kernelName:al,backendName:"cpu",kernelFunc:VP},UP=rt(ri,e=>Math.tan(e)),HP={kernelName:ri,backendName:"cpu",kernelFunc:UP},GP=rt(si,e=>Math.tanh(e)),qP={kernelName:si,backendName:"cpu",kernelFunc:GP};function XP(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{reps:s}=a;ve(r,"tile");let i=w7(n.bufferSync(r),s);return n.makeTensorInfo(i.shape,i.dtype,i.values)}var KP={kernelName:$r,backendName:"cpu",kernelFunc:XP};function ZP(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{k:s,sorted:i}=a;ve(r,"topk");let o=n.data.get(r.dataId).values,[u,l]=k7(o,r.shape,r.dtype,s,i);return[n.makeTensorInfo(u.shape,u.dtype,u.values),n.makeTensorInfo(l.shape,l.dtype,l.values)]}var YP={kernelName:rl,backendName:"cpu",kernelFunc:ZP};function JP(e){let{inputs:t,attrs:n,backend:a}=e,{image:r,transforms:s}=t,{interpolation:i,fillMode:o,fillValue:u,outputShape:l}=n,[d,p,c,h]=r.shape,[m,f]=l!=null?l:[p,c],y=[d,m,f,h],A=k.computeStrides(r.shape),g=A[0],x=A[1],w=A[2],b=k.getTypedArrayFromDType(r.dtype,k.sizeFromShape(y));b.fill(u);let v=a.data.get(r.dataId).values,S=a.data.get(s.dataId).values;for(let T=0;Tt-1)if(t<=1)n=0;else{let a=2*t;n-=a*Math.trunc(n/a),n>=t&&(n=a-n-1)}return k.clamp(0,n,t-1)}function tL(e,t){let n=e;if(n<0)if(t<=1)n=0;else{let a=t-1;n+=t*(Math.trunc(-n/a)+1)}else if(n>t-1)if(t<=1)n=0;else{let a=t-1;n-=t*Math.trunc(n/a)}return k.clamp(0,n,t-1)}function nL(e,t){return e}function aL(e,t){return k.clamp(0,e,t-1)}function Ad(e,t,n,a,r,s,i,o,u,l,d){let p=i*a+o*r+u*s+l;return 0<=o&&on.disposeIntermediateTensorInfo(m)),h}var pL={kernelName:Bu,backendName:"cpu",kernelFunc:dL},cL=[vD,S$,kD,SD,M$,TD,CD,MD,$D,zD,_D,LD,BD,UD,GD,KD,YD,QD,tz,xD,az,sz,oz,C$,$$,uz,N$,pz,hz,yz,gz,fz,wz,Iz,bz,Nz,Ez,Rz,Fz,Dz,Oz,_z,Lz,Bz,jz,Uz,Gz,Hz,cy,Kz,pD,Yz,Qz,oO,D$,lO,O$,fO,mO,AO,P$,bO,wO,IO,NO,EO,W$,MO,T$,$O,cz,zO,_O,LO,cD,V$,VO,UO,U$,GO,KO,YO,e_,n_,r_,G$,o_,u_,p_,h_,m_,s_,A_,x_,X$,v_,I_,E_,Z$,J$,M_,D_,__,eD,L_,B_,V_,j7,G_,fD,aD,X_,E$,Z_,mD,yD,gD,J_,eP,nP,rP,iP,oP,uP,sD,pP,hP,AP,AD,xP,vP,kP,iD,N_,NP,EP,RP,FP,DP,OP,PP,LP,lD,BP,jP,dD,qz,HP,qP,KP,YP,tD,QP,oL,uL,pL,W_];for(let e of cL)di(e);var q7={};Fe(q7,{assertNotComplex:()=>_l,bindCanvasToFramebuffer:()=>IL,bindColorTextureToFramebuffer:()=>vh,bindTextureToProgramUniformSampler:()=>lv,bindTextureUnit:()=>sv,bindVertexBufferToProgramAttribute:()=>Ay,callAndCheck:()=>xe,canBeRepresented:()=>X7,createFragmentShader:()=>Y7,createFramebuffer:()=>rv,createProgram:()=>J7,createStaticIndexBuffer:()=>tv,createStaticVertexBuffer:()=>ev,createTexture:()=>nv,createVertexShader:()=>Z7,getBatchDim:()=>Ci,getExtensionOrThrow:()=>vd,getFramebufferErrorMessage:()=>uv,getMaxTexturesInShader:()=>hv,getNumChannels:()=>wL,getProgramUniformLocation:()=>ov,getProgramUniformLocationOrThrow:()=>iv,getRowsCols:()=>Ri,getShapeAs3D:()=>wh,getTextureShapeFromLogicalShape:()=>pv,getWebGLDisjointQueryTimerVersion:()=>fv,getWebGLErrorMessage:()=>K7,getWebGLMaxTextureSize:()=>cv,hasExtension:()=>sa,isCapableOfRenderingToFloatTexture:()=>mv,isDownloadFloatTextureEnabled:()=>yv,isReshapeFree:()=>kd,isWebGLFenceEnabled:()=>Av,isWebGLVersionEnabled:()=>xy,linkProgram:()=>Q7,resetMaxTextureSize:()=>SL,resetMaxTexturesInShader:()=>NL,unbindColorTextureFromFramebuffer:()=>gy,unbindTextureUnit:()=>kL,validateFramebuffer:()=>wd,validateProgram:()=>bh,validateTextureSize:()=>av});var Ei={},my={alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!0};function xh(e,t){Ei[e]=t}function Xa(e){if(!(e in Ei)){let n=fL(e);if(n!==null)Ei[e]=n;else return console.log("Could not get context for WebGL version",e),null}let t=Ei[e];return t.isContextLost()?(delete Ei[e],Xa(e)):(t.disable(t.DEPTH_TEST),t.disable(t.STENCIL_TEST),t.disable(t.BLEND),t.disable(t.DITHER),t.disable(t.POLYGON_OFFSET_FILL),t.disable(t.SAMPLE_COVERAGE),t.enable(t.SCISSOR_TEST),t.enable(t.CULL_FACE),t.cullFace(t.BACK),Ei[e])}function hL(e){if(typeof OffscreenCanvas!="undefined"&&e===2)return new OffscreenCanvas(300,150);if(typeof document!="undefined")return document.createElement("canvas");throw new Error("Cannot create a canvas in this context")}function fL(e){if(e!==1&&e!==2)throw new Error("Cannot get WebGL rendering context, WebGL is disabled.");let t=hL(e);return t.addEventListener("webglcontextlost",n=>{n.preventDefault(),delete Ei[e]},!1),e===1?t.getContext("webgl",my)||t.getContext("experimental-webgl",my):t.getContext("webgl2",my)}var gd;(function(e){e[e.DENSE=0]="DENSE",e[e.SHARED_BATCH=1]="SHARED_BATCH"})(gd||(gd={}));var ra;(function(e){e[e.RENDER=0]="RENDER",e[e.UPLOAD=1]="UPLOAD",e[e.PIXELS=2]="PIXELS",e[e.DOWNLOAD=3]="DOWNLOAD"})(ra||(ra={}));var tn;(function(e){e[e.UNPACKED_FLOAT16=0]="UNPACKED_FLOAT16",e[e.UNPACKED_FLOAT32=1]="UNPACKED_FLOAT32",e[e.PACKED_4X1_UNSIGNED_BYTE=2]="PACKED_4X1_UNSIGNED_BYTE",e[e.PACKED_2X2_FLOAT32=3]="PACKED_2X2_FLOAT32",e[e.PACKED_2X2_FLOAT16=4]="PACKED_2X2_FLOAT16"})(tn||(tn={}));function xd(e,t){return[t,e]}function mL(e,t){return e*t}function bd(e){let t=k.sizeFromShape(e),n=Math.ceil(t/4);return k.sizeToSquarishShape(n)}function Ol(e,t){return[Math.max(1,Math.ceil(t/2)),Math.max(1,Math.ceil(e/2))]}function yL(e,t){let[n,a]=Ol(e,t);return n*a*4}function yy(e,t){let n=e,a,r,s,i,o,u,l,d,p,c;return J().getNumber("WEBGL_VERSION")===2?(a=n.R32F,r=n.R16F,s=n.RGBA16F,i=n.RGBA32F,o=n.RED,l=4,d=1,p=n.HALF_FLOAT,c=n.FLOAT):(a=e.RGBA,r=e.RGBA,s=e.RGBA,i=n.RGBA,o=e.RGBA,l=4,d=4,p=t!=null?t.HALF_FLOAT_OES:null,c=e.FLOAT),u=e.RGBA,{internalFormatFloat:a,internalFormatHalfFloat:r,internalFormatPackedHalfFloat:s,internalFormatPackedFloat:i,textureFormatFloat:o,downloadTextureFormat:u,downloadUnpackNumChannels:l,defaultNumChannels:d,textureTypeHalfFloat:p,textureTypeFloat:c}}function xe(e,t){let n=t();return J().getBool("DEBUG")&&AL(e),n}function AL(e){let t=e.getError();if(t!==e.NO_ERROR)throw new Error("WebGL Error: "+K7(e,t))}var gL=596e-10,xL=65504;function X7(e){return!!(J().getBool("WEBGL_RENDER_FLOAT32_ENABLED")||e===0||gLe.getExtension(t),'Extension "'+t+'" not supported on this browser.')}function Z7(e,t){let n=yr(e,()=>e.createShader(e.VERTEX_SHADER),"Unable to create vertex WebGLShader.");if(xe(e,()=>e.shaderSource(n,t)),xe(e,()=>e.compileShader(n)),e.getShaderParameter(n,e.COMPILE_STATUS)===!1)throw console.log(e.getShaderInfoLog(n)),new Error("Failed to compile vertex shader.");return n}function Y7(e,t){let n=yr(e,()=>e.createShader(e.FRAGMENT_SHADER),"Unable to create fragment WebGLShader.");if(xe(e,()=>e.shaderSource(n,t)),xe(e,()=>e.compileShader(n)),e.getShaderParameter(n,e.COMPILE_STATUS)===!1)throw vL(t,e.getShaderInfoLog(n)),new Error("Failed to compile fragment shader.");return n}var bL=/ERROR: [0-9]+:([0-9]+):/g;function vL(e,t){let n=bL.exec(t);if(n==null){console.log(`Couldn't parse line number in error: ${t}`),console.log(e);return}let a=+n[1],r=e.split(` -`),s=r.length.toString().length+2,i=r.map((p,c)=>k.rightPad((c+1).toString(),s)+p),o=0;for(let p=0;pe.createProgram(),"Unable to create WebGLProgram.")}function Q7(e,t){if(xe(e,()=>e.linkProgram(t)),e.getProgramParameter(t,e.LINK_STATUS)===!1)throw console.log(e.getProgramInfoLog(t)),new Error("Failed to link vertex and fragment shaders.")}function bh(e,t){if(xe(e,()=>e.validateProgram(t)),e.getProgramParameter(t,e.VALIDATE_STATUS)===!1)throw console.log(e.getProgramInfoLog(t)),new Error("Shader program validation failed.")}function ev(e,t){let n=yr(e,()=>e.createBuffer(),"Unable to create WebGLBuffer");return xe(e,()=>e.bindBuffer(e.ARRAY_BUFFER,n)),xe(e,()=>e.bufferData(e.ARRAY_BUFFER,t,e.STATIC_DRAW)),n}function tv(e,t){let n=yr(e,()=>e.createBuffer(),"Unable to create WebGLBuffer");return xe(e,()=>e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,n)),xe(e,()=>e.bufferData(e.ELEMENT_ARRAY_BUFFER,t,e.STATIC_DRAW)),n}function wL(){return J().getNumber("WEBGL_VERSION")===2?1:4}function nv(e){return yr(e,()=>e.createTexture(),"Unable to create WebGLTexture.")}function av(e,t){let n=J().getNumber("WEBGL_MAX_TEXTURE_SIZE");if(e<=0||t<=0){let a=`[${e}x${t}]`;throw new Error("Requested texture size "+a+" is invalid.")}if(e>n||t>n){let a=`[${e}x${t}]`,r=`[${n}x${n}]`;throw new Error("Requested texture size "+a+" greater than WebGL maximum on this browser / GPU "+r+".")}}function rv(e){return yr(e,()=>e.createFramebuffer(),"Unable to create WebGLFramebuffer.")}function Ay(e,t,n,a,r,s,i){let o=e.getAttribLocation(t,n);return o===-1?!1:(xe(e,()=>e.bindBuffer(e.ARRAY_BUFFER,a)),xe(e,()=>e.vertexAttribPointer(o,r,e.FLOAT,!1,s,i)),xe(e,()=>e.enableVertexAttribArray(o)),!0)}function sv(e,t,n){dv(e,n),xe(e,()=>e.activeTexture(e.TEXTURE0+n)),xe(e,()=>e.bindTexture(e.TEXTURE_2D,t))}function kL(e,t){dv(e,t),xe(e,()=>e.activeTexture(e.TEXTURE0+t)),xe(e,()=>e.bindTexture(e.TEXTURE_2D,null))}function iv(e,t,n){return yr(e,()=>e.getUniformLocation(t,n),'uniform "'+n+'" not present in program.')}function ov(e,t,n){return e.getUniformLocation(t,n)}function lv(e,t,n,a){xe(e,()=>sv(e,t,a)),xe(e,()=>e.uniform1i(n,a))}function IL(e){xe(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,null)),xe(e,()=>e.viewport(0,0,e.canvas.width,e.canvas.height)),xe(e,()=>e.scissor(0,0,e.canvas.width,e.canvas.height))}function vh(e,t,n){xe(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,n)),xe(e,()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t,0))}function gy(e,t){xe(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,t)),xe(e,()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,null,0))}function wd(e){let t=e.checkFramebufferStatus(e.FRAMEBUFFER);if(t!==e.FRAMEBUFFER_COMPLETE)throw new Error("Error binding framebuffer: "+uv(e,t))}function uv(e,t){switch(t){case e.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:return"FRAMEBUFFER_INCOMPLETE_DIMENSIONS";case e.FRAMEBUFFER_UNSUPPORTED:return"FRAMEBUFFER_UNSUPPORTED";default:return`unknown error ${t}`}}function yr(e,t,n){let a=xe(e,()=>t());if(a==null)throw new Error(n);return a}function dv(e,t){let n=e.MAX_COMBINED_TEXTURE_IMAGE_UNITS-1,a=t+e.TEXTURE0;if(an){let r=`[gl.TEXTURE0, gl.TEXTURE${n}]`;throw new Error(`textureUnit must be in ${r}.`)}}function Ci(e,t=2){return k.sizeFromShape(e.slice(0,e.length-t))}function Ri(e){if(e.length===0)throw Error("Cannot get rows and columns of an empty shape array.");return[e.length>1?e[e.length-2]:1,e[e.length-1]]}function wh(e){let t=[1,1,1];return e.length===0||e.length===1&&e[0]===1||(t=[Ci(e),...Ri(e)]),t}function pv(e,t=!1){let n=J().getNumber("WEBGL_MAX_TEXTURE_SIZE");t&&(n=n*2,e=e.map((r,s)=>s>=e.length-2?k.nearestLargerEven(e[s]):e[s]),e.length===1&&(e=[2,e[0]])),e.length!==2&&(e=k.squeezeShape(e).newShape);let a=k.sizeFromShape(e);if(e.length<=1&&a<=n)return[1,a];if(e.length===2&&e[0]<=n&&e[1]<=n)return e;if(e.length===3&&e[0]*e[1]<=n&&e[2]<=n)return[e[0]*e[1],e[2]];if(e.length===3&&e[0]<=n&&e[1]*e[2]<=n)return[e[0],e[1]*e[2]];if(e.length===4&&e[0]*e[1]*e[2]<=n&&e[3]<=n)return[e[0]*e[1]*e[2],e[3]];if(e.length===4&&e[0]<=n&&e[1]*e[2]*e[3]<=n)return[e[0],e[1]*e[2]*e[3]];if(t){let r=Ci(e),s=2,i=2;return e.length&&([s,i]=Ri(e)),a=r*(s/2)*(i/2),k.sizeToSquarishShape(a).map(o=>o*2)}return k.sizeToSquarishShape(a)}function kh(e){return e%2==0}function kd(e,t){if(e=e.slice(-2),t=t.slice(-2),k.arraysEqual(e,t)||!e.length||!t.length||e[0]===0||e[1]===0||t[0]===0||t[1]===0)return!0;if(e.length!==t.length){let n=e.slice(-1)[0],a=t.slice(-1)[0];if(n===a||kh(n)&&kh(a)&&(e[0]===1||t[0]===1))return!0}return e[1]===t[1]&&kh(e[0])&&kh(t[0])}var Ih,Sh;function cv(e){if(Ih==null){let t=Xa(e);Ih=t.getParameter(t.MAX_TEXTURE_SIZE)}return Ih}function SL(){Ih=null}function NL(){Sh=null}function hv(e){if(Sh==null){let t=Xa(e);Sh=t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS)}return Math.min(16,Sh)}function fv(e){if(e===0)return 0;let t,n=Xa(e);return sa(n,"EXT_disjoint_timer_query_webgl2")&&e===2?t=2:sa(n,"EXT_disjoint_timer_query")?t=1:t=0,t}function sa(e,t){return e.getExtension(t)!=null}function xy(e){try{if(Xa(e)!=null)return!0}catch(t){return console.log("Error when getting WebGL context: ",t),!1}return!1}function mv(e){if(e===0)return!1;let t=Xa(e);if(e===1){if(!sa(t,"OES_texture_float"))return!1}else if(!sa(t,"EXT_color_buffer_float"))return!1;return by(t)}function yv(e){if(e===0)return!1;let t=Xa(e);if(e===1){if(!sa(t,"OES_texture_float")||!sa(t,"WEBGL_color_buffer_float"))return!1}else{if(sa(t,"EXT_color_buffer_float"))return by(t);let n="EXT_color_buffer_half_float";if(sa(t,n)){let a=t.getExtension(n);return TL(t,a)}return!1}return by(t)}function by(e){let t=yy(e),n=e.createTexture();e.bindTexture(e.TEXTURE_2D,n);let a=1,r=1;e.texImage2D(e.TEXTURE_2D,0,t.internalFormatFloat,a,r,0,t.textureFormatFloat,t.textureTypeFloat,null);let s=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,s),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,n,0);let i=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(n),e.deleteFramebuffer(s),i}function TL(e,t){let n=yy(e,t),a=e.createTexture();e.bindTexture(e.TEXTURE_2D,a);let r=1,s=1;e.texImage2D(e.TEXTURE_2D,0,n.internalFormatHalfFloat,r,s,0,n.textureFormatFloat,n.textureTypeHalfFloat,null);let i=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,i),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,a,0);let o=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(a),e.deleteFramebuffer(i),o}function Av(e){return e!==2?!1:Xa(e).fenceSync!=null}function _l(e,t){Array.isArray(e)||(e=[e]),e.forEach(n=>{n!=null&&k.assert(n.dtype!=="complex64",()=>`${t} does not support complex64 tensors in the WebGL backend.`)})}var Me=J();Me.registerFlag("HAS_WEBGL",()=>Me.getNumber("WEBGL_VERSION")>0);Me.registerFlag("WEBGL_VERSION",()=>xy(2)?2:xy(1)?1:0);Me.registerFlag("WEBGL_CHECK_NUMERICAL_PROBLEMS",()=>!1);Me.registerFlag("WEBGL_BUFFER_SUPPORTED",()=>Me.get("WEBGL_VERSION")===2);Me.registerFlag("WEBGL_CPU_FORWARD",()=>!0);Me.registerFlag("WEBGL_FORCE_F16_TEXTURES",()=>!1);Me.registerFlag("WEBGL_PACK",()=>Me.getBool("HAS_WEBGL"));Me.registerFlag("WEBGL_PACK_NORMALIZATION",()=>Me.getBool("WEBGL_PACK"));Me.registerFlag("WEBGL_PACK_CLIP",()=>Me.getBool("WEBGL_PACK"));Me.registerFlag("WEBGL_PACK_DEPTHWISECONV",()=>Me.getBool("WEBGL_PACK"));Me.registerFlag("WEBGL_PACK_BINARY_OPERATIONS",()=>Me.getBool("WEBGL_PACK"));Me.registerFlag("WEBGL_PACK_UNARY_OPERATIONS",()=>Me.getBool("WEBGL_PACK"));Me.registerFlag("WEBGL_PACK_ARRAY_OPERATIONS",()=>Me.getBool("WEBGL_PACK"));Me.registerFlag("WEBGL_PACK_IMAGE_OPERATIONS",()=>Me.getBool("WEBGL_PACK"));Me.registerFlag("WEBGL_PACK_REDUCE",()=>Me.getBool("WEBGL_PACK"));Me.registerFlag("WEBGL_LAZILY_UNPACK",()=>Me.getBool("WEBGL_PACK"));Me.registerFlag("WEBGL_CONV_IM2COL",()=>Me.getBool("WEBGL_PACK"));Me.registerFlag("WEBGL_MAX_TEXTURE_SIZE",()=>cv(Me.getNumber("WEBGL_VERSION")));Me.registerFlag("WEBGL_MAX_TEXTURES_IN_SHADER",()=>hv(Me.getNumber("WEBGL_VERSION")));Me.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION",()=>{let e=Me.getNumber("WEBGL_VERSION");return e===0?0:fv(e)});Me.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE",()=>Me.getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0&&!Zu.isMobile());Me.registerFlag("WEBGL_RENDER_FLOAT32_CAPABLE",()=>mv(Me.getNumber("WEBGL_VERSION")));Me.registerFlag("WEBGL_RENDER_FLOAT32_ENABLED",()=>Me.getBool("WEBGL_FORCE_F16_TEXTURES")?!1:Me.getBool("WEBGL_RENDER_FLOAT32_CAPABLE"));Me.registerFlag("WEBGL_DOWNLOAD_FLOAT_ENABLED",()=>yv(Me.getNumber("WEBGL_VERSION")));Me.registerFlag("WEBGL_FENCE_API_ENABLED",()=>Av(Me.getNumber("WEBGL_VERSION")));Me.registerFlag("WEBGL_SIZE_UPLOAD_UNIFORM",()=>Me.getBool("WEBGL_RENDER_FLOAT32_ENABLED")?4:0);Me.registerFlag("WEBGL_DELETE_TEXTURE_THRESHOLD",()=>-1,e=>{if(e<0&&e!==-1)throw new Error(`WEBGL_DELETE_TEXTURE_THRESHOLD must be -1 (indicating never delete) or at least 0, but got ${e}.`)});Me.registerFlag("WEBGL_FLUSH_THRESHOLD",()=>Zu.isMobile()&&Me.getBool("IS_CHROME")?1:-1,e=>{if(e<0&&e!==-1)throw new Error(`WEBGL_FLUSH_THRESHOLD must be -1 (indicating never manual flush) or at least 0, but got ${e}.`)});function fn(){let e,t,n,a,r,s,i,o,u,l;return J().getNumber("WEBGL_VERSION")===2?(e="#version 300 es",t="in",n="out",a="in",r="texture",s="outputColor",i="out vec4 outputColor;",o=` +var __defProp = Object.defineProperty; +var __require = (x) => { + if (typeof require !== "undefined") + return require(x); + throw new Error('Dynamic require of "' + x + '" is not supported'); +}; +var __export = (target, all6) => { + for (var name6 in all6) + __defProp(target, name6, { get: all6[name6], enumerable: true }); +}; +var __accessCheck = (obj, member, msg) => { + if (!member.has(obj)) + throw TypeError("Cannot " + msg); +}; +var __privateGet = (obj, member, getter) => { + __accessCheck(obj, member, "read from private field"); + return getter ? getter.call(obj) : member.get(obj); +}; +var __privateAdd = (obj, member, value) => { + if (member.has(obj)) + throw TypeError("Cannot add the same private member more than once"); + member instanceof WeakSet ? member.add(obj) : member.set(obj, value); +}; +var __privateSet = (obj, member, value, setter) => { + __accessCheck(obj, member, "write to private field"); + setter ? setter.call(obj, value) : member.set(obj, value); + return value; +}; + +// src/helpers.ts +function join(folder, file) { + const separator = folder.endsWith("/") ? "" : "/"; + const skipJoin = file.startsWith(".") || file.startsWith("/") || file.startsWith("http:") || file.startsWith("https:") || file.startsWith("file:"); + const path = skipJoin ? `${file}` : `${folder}${separator}${file}`; + if (!path.toLocaleLowerCase().includes(".json")) + throw new Error(`Human: ModelPath Error: ${path} Expecting JSON file`); + return path; +} +function log(...msg) { + const dt = new Date(); + 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")}`; + if (msg) + console.log(ts, "Human:", ...msg); +} +var now = () => { + if (typeof performance !== "undefined") + return performance.now(); + return parseInt((Number(process.hrtime.bigint()) / 1e3 / 1e3).toString()); +}; +function mergeDeep(...objects) { + const isObject = (obj) => obj && typeof obj === "object"; + return objects.reduce((prev, obj) => { + Object.keys(obj || {}).forEach((key) => { + const pVal = prev[key]; + const oVal = obj[key]; + if (Array.isArray(pVal) && Array.isArray(oVal)) + prev[key] = pVal.concat(...oVal); + else if (isObject(pVal) && isObject(oVal)) + prev[key] = mergeDeep(pVal, oVal); + else + prev[key] = oVal; + }); + return prev; + }, {}); +} + +// src/config.ts +var config = { + backend: "webgl", + modelBasePath: "../models/", + wasmPath: "../node_modules/@tensorflow/tfjs-backend-wasm/dist/", + debug: true, + async: true, + warmup: "full", + cacheSensitivity: 0.75, + skipFrame: false, + filter: { + enabled: true, + width: 0, + height: 0, + flip: false, + return: true, + brightness: 0, + contrast: 0, + sharpness: 0, + blur: 0, + saturation: 0, + hue: 0, + negative: false, + sepia: false, + vintage: false, + kodachrome: false, + technicolor: false, + polaroid: false, + pixelate: 0 + }, + gesture: { + enabled: true + }, + face: { + enabled: true, + detector: { + modelPath: "blazeface.json", + rotation: true, + maxDetected: 15, + skipFrames: 15, + minConfidence: 0.2, + iouThreshold: 0.1, + return: false + }, + mesh: { + enabled: true, + modelPath: "facemesh.json" + }, + iris: { + enabled: true, + modelPath: "iris.json" + }, + description: { + enabled: true, + modelPath: "faceres.json", + skipFrames: 11, + minConfidence: 0.1 + }, + emotion: { + enabled: true, + minConfidence: 0.1, + skipFrames: 17, + modelPath: "emotion.json" + } + }, + body: { + enabled: true, + modelPath: "movenet-lightning.json", + maxDetected: 1, + minConfidence: 0.2, + skipFrames: 1 + }, + hand: { + enabled: true, + rotation: true, + skipFrames: 18, + minConfidence: 0.1, + iouThreshold: 0.1, + maxDetected: 2, + landmarks: true, + detector: { + modelPath: "handdetect.json" + }, + skeleton: { + modelPath: "handskeleton.json" + } + }, + object: { + enabled: false, + modelPath: "mb3-centernet.json", + minConfidence: 0.2, + iouThreshold: 0.4, + maxDetected: 10, + skipFrames: 19 + } +}; + +// src/sysinfo.ts +function info() { + let platform; + let agent; + if (typeof navigator !== "undefined") { + const raw = navigator.userAgent.match(/\(([^()]+)\)/g); + if (raw && raw[0]) { + const platformMatch = raw[0].match(/\(([^()]+)\)/g); + platform = platformMatch ? platformMatch[0].replace(/\(|\)/g, "") : ""; + agent = navigator.userAgent.replace(raw[0], ""); + if (platform[1]) + agent = agent.replace(raw[1], ""); + agent = agent.replace(/ /g, " "); + } + } else if (typeof process !== "undefined") { + platform = `${process.platform} ${process.arch}`; + agent = `NodeJS ${process.version}`; + } + return { platform, agent }; +} + +// dist/tfjs.esm.js +var tfjs_esm_exports = {}; +__export(tfjs_esm_exports, { + Abs: () => Abs, + Acos: () => Acos, + Acosh: () => Acosh, + AdadeltaOptimizer: () => AdadeltaOptimizer, + AdagradOptimizer: () => AdagradOptimizer, + AdamOptimizer: () => AdamOptimizer, + AdamaxOptimizer: () => AdamaxOptimizer, + Add: () => Add, + AddN: () => AddN, + All: () => All, + Any: () => Any, + ArgMax: () => ArgMax, + ArgMin: () => ArgMin, + Asin: () => Asin, + Asinh: () => Asinh, + Atan: () => Atan, + Atan2: () => Atan2, + Atanh: () => Atanh, + AvgPool: () => AvgPool, + AvgPool3D: () => AvgPool3D, + AvgPool3DGrad: () => AvgPool3DGrad, + AvgPoolGrad: () => AvgPoolGrad, + BackendWasm: () => BackendWasm, + BatchMatMul: () => BatchMatMul, + BatchToSpaceND: () => BatchToSpaceND, + Bincount: () => Bincount, + BroadcastTo: () => BroadcastTo, + Callback: () => Callback, + CallbackList: () => CallbackList, + Cast: () => Cast, + Ceil: () => Ceil, + ClipByValue: () => ClipByValue, + Complex: () => Complex, + ComplexAbs: () => ComplexAbs, + Concat: () => Concat, + Conv2D: () => Conv2D, + Conv2DBackpropFilter: () => Conv2DBackpropFilter, + Conv2DBackpropInput: () => Conv2DBackpropInput, + Conv3D: () => Conv3D, + Conv3DBackpropFilterV2: () => Conv3DBackpropFilterV2, + Conv3DBackpropInputV2: () => Conv3DBackpropInputV2, + Cos: () => Cos, + Cosh: () => Cosh, + CropAndResize: () => CropAndResize, + Cumsum: () => Cumsum, + CustomCallback: () => CustomCallback, + DataStorage: () => DataStorage, + DenseBincount: () => DenseBincount, + DepthToSpace: () => DepthToSpace, + DepthwiseConv2dNative: () => DepthwiseConv2dNative, + DepthwiseConv2dNativeBackpropFilter: () => DepthwiseConv2dNativeBackpropFilter, + DepthwiseConv2dNativeBackpropInput: () => DepthwiseConv2dNativeBackpropInput, + Diag: () => Diag, + Dilation2D: () => Dilation2D, + Dilation2DBackpropFilter: () => Dilation2DBackpropFilter, + Dilation2DBackpropInput: () => Dilation2DBackpropInput, + ENV: () => ENV, + EarlyStopping: () => EarlyStopping, + Einsum: () => Einsum, + Elu: () => Elu, + EluGrad: () => EluGrad, + Environment: () => Environment, + Equal: () => Equal, + Erf: () => Erf, + Exp: () => Exp, + ExpandDims: () => ExpandDims, + Expm1: () => Expm1, + FFT: () => FFT, + Fill: () => Fill, + FlipLeftRight: () => FlipLeftRight, + Floor: () => Floor, + FloorDiv: () => FloorDiv, + FromPixels: () => FromPixels, + FusedBatchNorm: () => FusedBatchNorm, + FusedConv2D: () => FusedConv2D, + FusedDepthwiseConv2D: () => FusedDepthwiseConv2D, + GPGPUContext: () => GPGPUContext, + GatherNd: () => GatherNd, + GatherV2: () => GatherV2, + GraphModel: () => GraphModel, + Greater: () => Greater, + GreaterEqual: () => GreaterEqual, + History: () => History, + IFFT: () => IFFT, + Identity: () => Identity, + Imag: () => Imag, + InputSpec: () => InputSpec, + IsFinite: () => IsFinite, + IsInf: () => IsInf, + IsNan: () => IsNan, + KernelBackend: () => KernelBackend, + LRN: () => LRN, + LRNGrad: () => LRNGrad, + LayerVariable: () => LayerVariable, + LayersModel: () => LayersModel, + LeakyRelu: () => LeakyRelu, + Less: () => Less, + LessEqual: () => LessEqual, + LinSpace: () => LinSpace, + Log: () => Log, + Log1p: () => Log1p, + LogSoftmax: () => LogSoftmax, + LogicalAnd: () => LogicalAnd, + LogicalNot: () => LogicalNot, + LogicalOr: () => LogicalOr, + MathBackendCPU: () => MathBackendCPU, + MathBackendWebGL: () => MathBackendWebGL, + Max: () => Max, + MaxPool: () => MaxPool, + MaxPool3D: () => MaxPool3D, + MaxPool3DGrad: () => MaxPool3DGrad, + MaxPoolGrad: () => MaxPoolGrad, + MaxPoolWithArgmax: () => MaxPoolWithArgmax, + Maximum: () => Maximum, + Mean: () => Mean, + Min: () => Min, + Minimum: () => Minimum, + MirrorPad: () => MirrorPad, + Mod: () => Mod, + MomentumOptimizer: () => MomentumOptimizer, + Multinomial: () => Multinomial, + Multiply: () => Multiply, + Neg: () => Neg, + NonMaxSuppressionV3: () => NonMaxSuppressionV3, + NonMaxSuppressionV4: () => NonMaxSuppressionV4, + NonMaxSuppressionV5: () => NonMaxSuppressionV5, + NotEqual: () => NotEqual, + OP_SCOPE_SUFFIX: () => OP_SCOPE_SUFFIX, + OneHot: () => OneHot, + OnesLike: () => OnesLike, + Optimizer: () => Optimizer, + Pack: () => Pack, + PadV2: () => PadV2, + Pool: () => Pool, + Pow: () => Pow, + Prelu: () => Prelu, + Prod: () => Prod, + RMSPropOptimizer: () => RMSPropOptimizer, + RNN: () => RNN, + Range: () => Range, + Rank: () => Rank, + Real: () => Real, + RealDiv: () => RealDiv, + Reciprocal: () => Reciprocal, + Reduction: () => Reduction, + Relu: () => Relu, + Relu6: () => Relu6, + Reshape: () => Reshape, + ResizeBilinear: () => ResizeBilinear, + ResizeBilinearGrad: () => ResizeBilinearGrad, + ResizeNearestNeighbor: () => ResizeNearestNeighbor, + ResizeNearestNeighborGrad: () => ResizeNearestNeighborGrad, + Reverse: () => Reverse, + RotateWithOffset: () => RotateWithOffset, + Round: () => Round, + Rsqrt: () => Rsqrt, + SGDOptimizer: () => SGDOptimizer, + ScatterNd: () => ScatterNd, + Select: () => Select, + Selu: () => Selu, + Sequential: () => Sequential, + Sigmoid: () => Sigmoid, + Sign: () => Sign, + Sin: () => Sin, + Sinh: () => Sinh, + Slice: () => Slice, + Softmax: () => Softmax, + Softplus: () => Softplus, + SpaceToBatchND: () => SpaceToBatchND, + SparseFillEmptyRows: () => SparseFillEmptyRows, + SparseReshape: () => SparseReshape, + SparseToDense: () => SparseToDense, + SplitV: () => SplitV, + Sqrt: () => Sqrt, + Square: () => Square, + SquaredDifference: () => SquaredDifference, + Step: () => Step, + StridedSlice: () => StridedSlice, + Sub: () => Sub, + Sum: () => Sum, + SymbolicTensor: () => SymbolicTensor, + Tan: () => Tan, + Tanh: () => Tanh, + Tensor: () => Tensor, + TensorBuffer: () => TensorBuffer, + Tile: () => Tile, + TopK: () => TopK, + Transform: () => Transform, + Transpose: () => Transpose, + Unique: () => Unique, + Unpack: () => Unpack, + UnsortedSegmentSum: () => UnsortedSegmentSum, + Variable: () => Variable, + ZerosLike: () => ZerosLike, + _FusedMatMul: () => _FusedMatMul, + abs: () => abs, + acos: () => acos, + acosh: () => acosh, + add: () => add2, + addN: () => addN, + all: () => all, + any: () => any, + argMax: () => argMax, + argMin: () => argMin, + asin: () => asin, + asinh: () => asinh, + atan: () => atan, + atan2: () => atan2, + atanh: () => atanh, + avgPool: () => avgPool, + avgPool3d: () => avgPool3d, + backend: () => backend, + backend_util: () => backend_util_exports, + basicLSTMCell: () => basicLSTMCell, + batchNorm: () => batchNorm, + batchNorm2d: () => batchNorm2d, + batchNorm3d: () => batchNorm3d, + batchNorm4d: () => batchNorm4d, + batchToSpaceND: () => batchToSpaceND, + bincount: () => bincount, + booleanMaskAsync: () => booleanMaskAsync, + broadcastTo: () => broadcastTo, + browser: () => browser_exports, + buffer: () => buffer, + callbacks: () => callbacks, + cast: () => cast, + ceil: () => ceil, + clipByValue: () => clipByValue, + clone: () => clone, + complex: () => complex, + concat: () => concat, + concat1d: () => concat1d, + concat2d: () => concat2d, + concat3d: () => concat3d, + concat4d: () => concat4d, + constraints: () => exports_constraints_exports, + conv1d: () => conv1d, + conv2d: () => conv2d, + conv2dTranspose: () => conv2dTranspose, + conv3d: () => conv3d, + conv3dTranspose: () => conv3dTranspose, + copyRegisteredKernels: () => copyRegisteredKernels, + cos: () => cos, + cosh: () => cosh, + cosineWindow: () => cosineWindow, + cumsum: () => cumsum, + customGrad: () => customGrad, + data: () => dist_exports, + denseBincount: () => denseBincount, + deprecationWarn: () => deprecationWarn, + depthToSpace: () => depthToSpace, + depthwiseConv2d: () => depthwiseConv2d, + deregisterOp: () => deregisterOp, + device_util: () => device_util_exports, + diag: () => diag, + dilation2d: () => dilation2d, + disableDeprecationWarnings: () => disableDeprecationWarnings, + dispose: () => dispose, + disposeVariables: () => disposeVariables, + div: () => div, + divNoNan: () => divNoNan, + dot: () => dot, + dropout: () => dropout, + einsum: () => einsum, + elu: () => elu, + enableDebugMode: () => enableDebugMode, + enableProdMode: () => enableProdMode, + enclosingPowerOfTwo: () => enclosingPowerOfTwo, + engine: () => engine, + env: () => env, + equal: () => equal, + erf: () => erf, + exp: () => exp, + expandDims: () => expandDims, + expm1: () => expm1, + eye: () => eye, + fft: () => fft, + fill: () => fill, + findBackend: () => findBackend, + findBackendFactory: () => findBackendFactory, + floor: () => floor, + floorDiv: () => floorDiv, + forceHalfFloat: () => forceHalfFloat, + fused: () => fused_ops_exports, + gather: () => gather, + gatherND: () => gatherND, + gather_util: () => gather_nd_util_exports, + getBackend: () => getBackend, + getGradient: () => getGradient, + getKernel: () => getKernel, + getKernelsForBackend: () => getKernelsForBackend, + gpgpu_util: () => gpgpu_util_exports, + grad: () => grad, + grads: () => grads, + greater: () => greater, + greaterEqual: () => greaterEqual, + ifft: () => ifft, + imag: () => imag, + image: () => image, + inTopKAsync: () => inTopKAsync, + initializers: () => exports_initializers_exports, + input: () => input, + io: () => io_exports, + irfft: () => irfft, + isFinite: () => isFinite2, + isInf: () => isInf, + isNaN: () => isNaN2, + keep: () => keep, + kernel_impls: () => kernel_impls_exports, + layers: () => exports_layers_exports, + leakyRelu: () => leakyRelu, + less: () => less, + lessEqual: () => lessEqual, + linalg: () => linalg, + linspace: () => linspace, + loadGraphModel: () => loadGraphModel, + loadLayersModel: () => loadLayersModel, + localResponseNormalization: () => localResponseNormalization, + log: () => log2, + log1p: () => log1p, + logSigmoid: () => logSigmoid, + logSoftmax: () => logSoftmax, + logSumExp: () => logSumExp, + logicalAnd: () => logicalAnd, + logicalNot: () => logicalNot, + logicalOr: () => logicalOr, + logicalXor: () => logicalXor, + losses: () => losses, + matMul: () => matMul, + math: () => math_exports, + max: () => max, + maxPool: () => maxPool, + maxPool3d: () => maxPool3d, + maxPoolWithArgmax: () => maxPoolWithArgmax, + maximum: () => maximum, + mean: () => mean, + memory: () => memory, + meshgrid: () => meshgrid, + metrics: () => exports_metrics_exports, + min: () => min, + minimum: () => minimum, + mirrorPad: () => mirrorPad, + mod: () => mod, + model: () => model, + models: () => exports_models_exports, + moments: () => moments, + movingAverage: () => movingAverage, + mul: () => mul, + multiRNNCell: () => multiRNNCell, + multinomial: () => multinomial, + neg: () => neg, + nextFrame: () => nextFrame, + norm: () => norm, + notEqual: () => notEqual, + oneHot: () => oneHot, + ones: () => ones2, + onesLike: () => onesLike, + op: () => op, + outerProduct: () => outerProduct, + pad: () => pad, + pad1d: () => pad1d, + pad2d: () => pad2d, + pad3d: () => pad3d, + pad4d: () => pad4d, + pool: () => pool, + pow: () => pow, + prelu: () => prelu, + print: () => print2, + prod: () => prod, + profile: () => profile, + rand: () => rand, + randomGamma: () => randomGamma, + randomNormal: () => randomNormal, + randomUniform: () => randomUniform, + range: () => range, + ready: () => ready, + real: () => real, + reciprocal: () => reciprocal, + registerBackend: () => registerBackend, + registerCallbackConstructor: () => registerCallbackConstructor, + registerGradient: () => registerGradient, + registerKernel: () => registerKernel, + registerOp: () => registerOp, + regularizers: () => exports_regularizers_exports, + relu: () => relu, + relu6: () => relu6, + removeBackend: () => removeBackend, + reshape: () => reshape, + reverse: () => reverse, + reverse1d: () => reverse1d, + reverse2d: () => reverse2d, + reverse3d: () => reverse3d, + reverse4d: () => reverse4d, + rfft: () => rfft, + round: () => round2, + rsqrt: () => rsqrt, + scalar: () => scalar, + scatterND: () => scatterND, + scatter_util: () => scatter_nd_util_exports, + selu: () => selu, + separableConv2d: () => separableConv2d, + sequential: () => sequential, + serialization: () => serialization_exports, + setBackend: () => setBackend, + setPlatform: () => setPlatform, + setWasmPath: () => setWasmPath, + setWasmPaths: () => setWasmPaths, + setWebGLContext: () => setWebGLContext, + setdiff1dAsync: () => setdiff1dAsync, + shared: () => shared_exports, + sigmoid: () => sigmoid, + sign: () => sign, + signal: () => signal, + sin: () => sin, + sinh: () => sinh, + slice: () => slice, + slice1d: () => slice1d, + slice2d: () => slice2d, + slice3d: () => slice3d, + slice4d: () => slice4d, + slice_util: () => slice_util_exports, + softmax: () => softmax, + softplus: () => softplus, + spaceToBatchND: () => spaceToBatchND, + sparse: () => sparse, + sparseToDense: () => sparseToDense, + spectral: () => spectral, + split: () => split, + sqrt: () => sqrt, + square: () => square, + squaredDifference: () => squaredDifference, + squeeze: () => squeeze, + stack: () => stack, + step: () => step, + stridedSlice: () => stridedSlice, + sub: () => sub, + sum: () => sum2, + sumOutType: () => sumOutType, + tan: () => tan, + tanh: () => tanh2, + tensor: () => tensor, + tensor1d: () => tensor1d, + tensor2d: () => tensor2d, + tensor3d: () => tensor3d, + tensor4d: () => tensor4d, + tensor5d: () => tensor5d, + tensor6d: () => tensor6d, + tensor_util: () => tensor_util_exports, + test_util: () => test_util_exports, + tidy: () => tidy, + tile: () => tile, + time: () => time, + topk: () => topk, + train: () => train, + transpose: () => transpose, + truncatedNormal: () => truncatedNormal, + unique: () => unique, + unregisterGradient: () => unregisterGradient, + unregisterKernel: () => unregisterKernel, + unsortedSegmentSum: () => unsortedSegmentSum, + unstack: () => unstack, + upcastType: () => upcastType, + util: () => util_exports, + valueAndGrad: () => valueAndGrad, + valueAndGrads: () => valueAndGrads, + variable: () => variable, + variableGrads: () => variableGrads, + version: () => version13, + version_converter: () => version11, + version_core: () => version6, + version_cpu: () => version7, + version_layers: () => version10, + version_wasm: () => version9, + version_webgl: () => version8, + webgl: () => webgl, + webgl_util: () => webgl_util_exports, + where: () => where, + whereAsync: () => whereAsync, + zeros: () => zeros, + zerosLike: () => zerosLike +}); +var __create = Object.create; +var __defProp2 = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __markAsModule = (target) => __defProp2(target, "__esModule", { value: true }); +var __require2 = (x) => { + if (typeof __require !== "undefined") + return __require(x); + throw new Error('Dynamic require of "' + x + '" is not supported'); +}; +var __commonJS = (cb, mod4) => function __require22() { + return mod4 || (0, cb[Object.keys(cb)[0]])((mod4 = { exports: {} }).exports, mod4), mod4.exports; +}; +var __export2 = (target, all52) => { + for (var name6 in all52) + __defProp2(target, name6, { get: all52[name6], enumerable: true }); +}; +var __reExport = (target, module6, desc) => { + if (module6 && typeof module6 === "object" || typeof module6 === "function") { + for (let key of __getOwnPropNames(module6)) + if (!__hasOwnProp.call(target, key) && key !== "default") + __defProp2(target, key, { get: () => module6[key], enumerable: !(desc = __getOwnPropDesc(module6, key)) || desc.enumerable }); + } + return target; +}; +var __toModule = (module6) => { + return __reExport(__markAsModule(__defProp2(module6 != null ? __create(__getProtoOf(module6)) : {}, "default", module6 && module6.__esModule && "default" in module6 ? { get: () => module6.default, enumerable: true } : { value: module6, enumerable: true })), module6); +}; +var require_browser = __commonJS({ + "(disabled):node_modules/.pnpm/node-fetch@2.6.1/node_modules/node-fetch/browser.js"() { + } +}); +var require_alea = __commonJS({ + "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/alea.js"(exports, module6) { + (function(global2, module7, define2) { + function Alea(seed) { + var me = this, mash = Mash(); + me.next = function() { + var t = 2091639 * me.s0 + me.c * 23283064365386963e-26; + me.s0 = me.s1; + me.s1 = me.s2; + return me.s2 = t - (me.c = t | 0); + }; + me.c = 1; + me.s0 = mash(" "); + me.s1 = mash(" "); + me.s2 = mash(" "); + me.s0 -= mash(seed); + if (me.s0 < 0) { + me.s0 += 1; + } + me.s1 -= mash(seed); + if (me.s1 < 0) { + me.s1 += 1; + } + me.s2 -= mash(seed); + if (me.s2 < 0) { + me.s2 += 1; + } + mash = null; + } + function copy(f, t) { + t.c = f.c; + t.s0 = f.s0; + t.s1 = f.s1; + t.s2 = f.s2; + return t; + } + function impl(seed, opts) { + var xg = new Alea(seed), state = opts && opts.state, prng = xg.next; + prng.int32 = function() { + return xg.next() * 4294967296 | 0; + }; + prng.double = function() { + return prng() + (prng() * 2097152 | 0) * 11102230246251565e-32; + }; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + function Mash() { + var n = 4022871197; + var mash = function(data) { + data = data.toString(); + for (var i = 0; i < data.length; i++) { + n += data.charCodeAt(i); + var h = 0.02519603282416938 * n; + n = h >>> 0; + h -= n; + h *= n; + n = h >>> 0; + h -= n; + n += h * 4294967296; + } + return (n >>> 0) * 23283064365386963e-26; + }; + return mash; + } + if (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.alea = impl; + } + })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); + } +}); +var require_xor128 = __commonJS({ + "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xor128.js"(exports, module6) { + (function(global2, module7, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.next = function() { + var t = me.x ^ me.x << 11; + me.x = me.y; + me.y = me.z; + me.z = me.w; + return me.w ^= me.w >>> 19 ^ t ^ t >>> 8; + }; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor128 = impl; + } + })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); + } +}); +var require_xorwow = __commonJS({ + "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xorwow.js"(exports, module6) { + (function(global2, module7, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var t = me.x ^ me.x >>> 2; + me.x = me.y; + me.y = me.z; + me.z = me.w; + me.w = me.v; + return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t ^ t << 1)) | 0; + }; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.v = 0; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + if (k == strseed.length) { + me.d = me.x << 10 ^ me.x >>> 4; + } + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + t.v = f.v; + t.d = f.d; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorwow = impl; + } + })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); + } +}); +var require_xorshift7 = __commonJS({ + "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xorshift7.js"(exports, module6) { + (function(global2, module7, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var X = me.x, i = me.i, t, v, w; + t = X[i]; + t ^= t >>> 7; + v = t ^ t << 24; + t = X[i + 1 & 7]; + v ^= t ^ t >>> 10; + t = X[i + 3 & 7]; + v ^= t ^ t >>> 3; + t = X[i + 4 & 7]; + v ^= t ^ t << 7; + t = X[i + 7 & 7]; + t = t ^ t << 13; + v ^= t ^ t << 9; + X[i] = v; + me.i = i + 1 & 7; + return v; + }; + function init2(me2, seed2) { + var j, w, X = []; + if (seed2 === (seed2 | 0)) { + w = X[0] = seed2; + } else { + seed2 = "" + seed2; + for (j = 0; j < seed2.length; ++j) { + X[j & 7] = X[j & 7] << 15 ^ seed2.charCodeAt(j) + X[j + 1 & 7] << 13; + } + } + while (X.length < 8) + X.push(0); + for (j = 0; j < 8 && X[j] === 0; ++j) + ; + if (j == 8) + w = X[7] = -1; + else + w = X[j]; + me2.x = X; + me2.i = 0; + for (j = 256; j > 0; --j) { + me2.next(); + } + } + init2(me, seed); + } + function copy(f, t) { + t.x = f.x.slice(); + t.i = f.i; + return t; + } + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.x) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorshift7 = impl; + } + })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); + } +}); +var require_xor4096 = __commonJS({ + "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xor4096.js"(exports, module6) { + (function(global2, module7, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var w = me.w, X = me.X, i = me.i, t, v; + me.w = w = w + 1640531527 | 0; + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + v = X[i] = v ^ t; + me.i = i; + return v + (w ^ w >>> 16) | 0; + }; + function init2(me2, seed2) { + var t, v, i, j, w, X = [], limit = 128; + if (seed2 === (seed2 | 0)) { + v = seed2; + seed2 = null; + } else { + seed2 = seed2 + "\0"; + v = 0; + limit = Math.max(limit, seed2.length); + } + for (i = 0, j = -32; j < limit; ++j) { + if (seed2) + v ^= seed2.charCodeAt((j + 32) % seed2.length); + if (j === 0) + w = v; + v ^= v << 10; + v ^= v >>> 15; + v ^= v << 4; + v ^= v >>> 13; + if (j >= 0) { + w = w + 1640531527 | 0; + t = X[j & 127] ^= v + w; + i = t == 0 ? i + 1 : 0; + } + } + if (i >= 128) { + X[(seed2 && seed2.length || 0) & 127] = -1; + } + i = 127; + for (j = 4 * 128; j > 0; --j) { + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + X[i] = v ^ t; + } + me2.w = w; + me2.X = X; + me2.i = i; + } + init2(me, seed); + } + function copy(f, t) { + t.i = f.i; + t.w = f.w; + t.X = f.X.slice(); + return t; + } + ; + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.X) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor4096 = impl; + } + })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); + } +}); +var require_tychei = __commonJS({ + "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/tychei.js"(exports, module6) { + (function(global2, module7, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var b = me.b, c = me.c, d = me.d, a = me.a; + b = b << 25 ^ b >>> 7 ^ c; + c = c - d | 0; + d = d << 24 ^ d >>> 8 ^ a; + a = a - b | 0; + me.b = b = b << 20 ^ b >>> 12 ^ c; + me.c = c = c - d | 0; + me.d = d << 16 ^ c >>> 16 ^ a; + return me.a = a - b | 0; + }; + me.a = 0; + me.b = 0; + me.c = 2654435769 | 0; + me.d = 1367130551; + if (seed === Math.floor(seed)) { + me.a = seed / 4294967296 | 0; + me.b = seed | 0; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 20; k++) { + me.b ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.a = f.a; + t.b = f.b; + t.c = f.c; + t.d = f.d; + return t; + } + ; + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.tychei = impl; + } + })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); + } +}); +var require_crypto = __commonJS({ + "(disabled):crypto"() { + } +}); +var require_seedrandom = __commonJS({ + "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/seedrandom.js"(exports, module6) { + (function(pool3, math) { + var global2 = this, width = 256, chunks = 6, digits = 52, rngname = "random", startdenom = math.pow(width, chunks), significance = math.pow(2, digits), overflow = significance * 2, mask = width - 1, nodecrypto; + function seedrandom5(seed, options2, callback) { + var key = []; + options2 = options2 == true ? { entropy: true } : options2 || {}; + var shortseed = mixkey(flatten4(options2.entropy ? [seed, tostring(pool3)] : seed == null ? autoseed() : seed, 3), key); + var arc4 = new ARC4(key); + var prng = function() { + var n = arc4.g(chunks), d = startdenom, x = 0; + while (n < significance) { + n = (n + x) * width; + d *= width; + x = arc4.g(1); + } + while (n >= overflow) { + n /= 2; + d /= 2; + x >>>= 1; + } + return (n + x) / d; + }; + prng.int32 = function() { + return arc4.g(4) | 0; + }; + prng.quick = function() { + return arc4.g(4) / 4294967296; + }; + prng.double = prng; + mixkey(tostring(arc4.S), pool3); + return (options2.pass || callback || function(prng2, seed2, is_math_call, state) { + if (state) { + if (state.S) { + copy(state, arc4); + } + prng2.state = function() { + return copy(arc4, {}); + }; + } + if (is_math_call) { + math[rngname] = prng2; + return seed2; + } else + return prng2; + })(prng, shortseed, "global" in options2 ? options2.global : this == math, options2.state); + } + math["seed" + rngname] = seedrandom5; + function ARC4(key) { + var t, keylen = key.length, me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; + if (!keylen) { + key = [keylen++]; + } + while (i < width) { + s[i] = i++; + } + for (i = 0; i < width; i++) { + s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])]; + s[j] = t; + } + (me.g = function(count22) { + var t2, r = 0, i2 = me.i, j2 = me.j, s2 = me.S; + while (count22--) { + t2 = s2[i2 = mask & i2 + 1]; + r = r * width + s2[mask & (s2[i2] = s2[j2 = mask & j2 + t2]) + (s2[j2] = t2)]; + } + me.i = i2; + me.j = j2; + return r; + })(width); + } + function copy(f, t) { + t.i = f.i; + t.j = f.j; + t.S = f.S.slice(); + return t; + } + ; + function flatten4(obj, depth) { + var result = [], typ = typeof obj, prop; + if (depth && typ == "object") { + for (prop in obj) { + try { + result.push(flatten4(obj[prop], depth - 1)); + } catch (e) { + } + } + } + return result.length ? result : typ == "string" ? obj : obj + "\0"; + } + function mixkey(seed, key) { + var stringseed = seed + "", smear, j = 0; + while (j < stringseed.length) { + key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++); + } + return tostring(key); + } + function autoseed() { + try { + var out; + if (nodecrypto && (out = nodecrypto.randomBytes)) { + out = out(width); + } else { + out = new Uint8Array(width); + (global2.crypto || global2.msCrypto).getRandomValues(out); + } + return tostring(out); + } catch (e) { + var browser4 = global2.navigator, plugins = browser4 && browser4.plugins; + return [+new Date(), global2, plugins, global2.screen, tostring(pool3)]; + } + } + function tostring(a) { + return String.fromCharCode.apply(0, a); + } + mixkey(math.random(), pool3); + if (typeof module6 == "object" && module6.exports) { + module6.exports = seedrandom5; + try { + nodecrypto = require_crypto(); + } catch (ex) { + } + } else if (typeof define == "function" && define.amd) { + define(function() { + return seedrandom5; + }); + } + })([], Math); + } +}); +var require_seedrandom2 = __commonJS({ + "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/index.js"(exports, module6) { + var alea5 = require_alea(); + var xor128 = require_xor128(); + var xorwow = require_xorwow(); + var xorshift7 = require_xorshift7(); + var xor4096 = require_xor4096(); + var tychei = require_tychei(); + var sr = require_seedrandom(); + sr.alea = alea5; + sr.xor128 = xor128; + sr.xorwow = xorwow; + sr.xorshift7 = xorshift7; + sr.xor4096 = xor4096; + sr.tychei = tychei; + module6.exports = sr; + } +}); +var require_path = __commonJS({ + "(disabled):path"() { + } +}); +var require_worker_threads = __commonJS({ + "(disabled):worker_threads"() { + } +}); +var require_perf_hooks = __commonJS({ + "(disabled):perf_hooks"() { + } +}); +var require_tfjs_backend_wasm_threaded_simd = __commonJS({ + "node_modules/.pnpm/@tensorflow+tfjs-backend-wasm@3.6.0_@tensorflow+tfjs-core@3.6.0/node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js"(exports, module6) { + var WasmBackendModuleThreadedSimd = function() { + var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0; + if (typeof __filename !== "undefined") + _scriptDir = _scriptDir || __filename; + return function(WasmBackendModuleThreadedSimd2) { + WasmBackendModuleThreadedSimd2 = WasmBackendModuleThreadedSimd2 || {}; + function GROWABLE_HEAP_I8() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAP8; + } + function GROWABLE_HEAP_U8() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPU8; + } + function GROWABLE_HEAP_I32() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAP32; + } + function GROWABLE_HEAP_U32() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPU32; + } + function GROWABLE_HEAP_F64() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPF64; + } + var Module = typeof WasmBackendModuleThreadedSimd2 !== "undefined" ? WasmBackendModuleThreadedSimd2 : {}; + var readyPromiseResolve, readyPromiseReject; + Module["ready"] = new Promise(function(resolve, reject) { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + var moduleOverrides = {}; + var key; + for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } + } + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = function(status, toThrow) { + throw toThrow; + }; + var ENVIRONMENT_IS_WEB = false; + var ENVIRONMENT_IS_WORKER = false; + var ENVIRONMENT_IS_NODE = false; + var ENVIRONMENT_IS_SHELL = false; + ENVIRONMENT_IS_WEB = typeof window === "object"; + ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; + ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string"; + ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + var ENVIRONMENT_IS_PTHREAD = Module["ENVIRONMENT_IS_PTHREAD"] || false; + if (ENVIRONMENT_IS_PTHREAD) { + buffer2 = Module["buffer"]; + } + var scriptDirectory = ""; + function locateFile(path) { + if (Module["locateFile"]) { + return Module["locateFile"](path, scriptDirectory); + } + return scriptDirectory + path; + } + var read_, readAsync, readBinary, setWindowTitle; + var nodeFS; + var nodePath; + if (ENVIRONMENT_IS_NODE) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = require_path().dirname(scriptDirectory) + "/"; + } else { + scriptDirectory = __dirname + "/"; + } + read_ = function shell_read(filename, binary) { + if (!nodeFS) + nodeFS = __require2("fs"); + if (!nodePath) + nodePath = require_path(); + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert3(ret.buffer); + return ret; + }; + if (process["argv"].length > 1) { + thisProgram = process["argv"][1].replace(/\\/g, "/"); + } + arguments_ = process["argv"].slice(2); + process["on"]("uncaughtException", function(ex) { + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + process["on"]("unhandledRejection", abort); + quit_ = function(status) { + process["exit"](status); + }; + Module["inspect"] = function() { + return "[Emscripten Module object]"; + }; + var nodeWorkerThreads; + try { + nodeWorkerThreads = require_worker_threads(); + } catch (e) { + console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'); + throw e; + } + global.Worker = nodeWorkerThreads.Worker; + } else if (ENVIRONMENT_IS_SHELL) { + if (typeof read != "undefined") { + read_ = function shell_read(f) { + return read(f); + }; + } + readBinary = function readBinary2(f) { + var data; + if (typeof readbuffer === "function") { + return new Uint8Array(readbuffer(f)); + } + data = read(f, "binary"); + assert3(typeof data === "object"); + return data; + }; + if (typeof scriptArgs != "undefined") { + arguments_ = scriptArgs; + } else if (typeof arguments != "undefined") { + arguments_ = arguments; + } + if (typeof quit === "function") { + quit_ = function(status) { + quit(status); + }; + } + if (typeof print !== "undefined") { + if (typeof console === "undefined") + console = {}; + console.log = print; + console.warn = console.error = typeof printErr !== "undefined" ? printErr : print; + } + } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = self.location.href; + } else if (typeof document !== "undefined" && document.currentScript) { + scriptDirectory = document.currentScript.src; + } + if (typeof _scriptDir !== "undefined" && _scriptDir) { + scriptDirectory = _scriptDir; + } + if (scriptDirectory.indexOf("blob:") !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1); + } else { + scriptDirectory = ""; + } + if (ENVIRONMENT_IS_NODE) { + read_ = function shell_read(filename, binary) { + if (!nodeFS) + nodeFS = __require2("fs"); + if (!nodePath) + nodePath = require_path(); + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert3(ret.buffer); + return ret; + }; + } else { + read_ = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.send(null); + return xhr.responseText; + }; + if (ENVIRONMENT_IS_WORKER) { + readBinary = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return new Uint8Array(xhr.response); + }; + } + readAsync = function(url, onload, onerror) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + xhr.responseType = "arraybuffer"; + xhr.onload = function() { + if (xhr.status == 200 || xhr.status == 0 && xhr.response) { + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + }; + } + setWindowTitle = function(title) { + document.title = title; + }; + } else { + } + if (ENVIRONMENT_IS_NODE) { + if (typeof performance === "undefined") { + global.performance = require_perf_hooks().performance; + } + } + var out = Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.warn.bind(console); + for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } + } + moduleOverrides = null; + if (Module["arguments"]) + arguments_ = Module["arguments"]; + if (Module["thisProgram"]) + thisProgram = Module["thisProgram"]; + if (Module["quit"]) + quit_ = Module["quit"]; + var Atomics_load = Atomics.load; + var Atomics_store = Atomics.store; + var Atomics_compareExchange = Atomics.compareExchange; + var wasmBinary; + if (Module["wasmBinary"]) + wasmBinary = Module["wasmBinary"]; + var noExitRuntime = Module["noExitRuntime"] || true; + if (typeof WebAssembly !== "object") { + abort("no native wasm support detected"); + } + var wasmMemory; + var wasmModule; + var ABORT = false; + var EXITSTATUS; + function assert3(condition, text) { + if (!condition) { + abort("Assertion failed: " + text); + } + } + function getCFunc(ident) { + var func2 = Module["_" + ident]; + assert3(func2, "Cannot call unknown function " + ident + ", make sure it is exported"); + return func2; + } + function ccall(ident, returnType, argTypes, args, opts) { + var toC = { "string": function(str) { + var ret2 = 0; + if (str !== null && str !== void 0 && str !== 0) { + var len = (str.length << 2) + 1; + ret2 = stackAlloc(len); + stringToUTF8(str, ret2, len); + } + return ret2; + }, "array": function(arr) { + var ret2 = stackAlloc(arr.length); + writeArrayToMemory(arr, ret2); + return ret2; + } }; + function convertReturnValue(ret2) { + if (returnType === "string") + return UTF8ToString(ret2); + if (returnType === "boolean") + return Boolean(ret2); + return ret2; + } + var func2 = getCFunc(ident); + var cArgs = []; + var stack2 = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack2 === 0) + stack2 = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func2.apply(null, cArgs); + ret = convertReturnValue(ret); + if (stack2 !== 0) + stackRestore(stack2); + return ret; + } + function cwrap(ident, returnType, argTypes, opts) { + argTypes = argTypes || []; + var numericArgs = argTypes.every(function(type) { + return type === "number"; + }); + var numericRet = returnType !== "string"; + if (numericRet && numericArgs && !opts) { + return getCFunc(ident); + } + return function() { + return ccall(ident, returnType, argTypes, arguments, opts); + }; + } + function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var str = ""; + while (!(idx >= endIdx)) { + var u0 = heap[idx++]; + if (!u0) + return str; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heap[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode((u0 & 31) << 6 | u1); + continue; + } + var u2 = heap[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = (u0 & 15) << 12 | u1 << 6 | u2; + } else { + u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63; + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); + } + } + return str; + } + function UTF8ToString(ptr, maxBytesToRead) { + return ptr ? UTF8ArrayToString(GROWABLE_HEAP_U8(), ptr, maxBytesToRead) : ""; + } + function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) + return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = 65536 + ((u & 1023) << 10) | u1 & 1023; + } + if (u <= 127) { + if (outIdx >= endIdx) + break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) + break; + heap[outIdx++] = 192 | u >> 6; + heap[outIdx++] = 128 | u & 63; + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) + break; + heap[outIdx++] = 224 | u >> 12; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } else { + if (outIdx + 3 >= endIdx) + break; + heap[outIdx++] = 240 | u >> 18; + heap[outIdx++] = 128 | u >> 12 & 63; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + } + function stringToUTF8(str, outPtr, maxBytesToWrite) { + return stringToUTF8Array(str, GROWABLE_HEAP_U8(), outPtr, maxBytesToWrite); + } + function lengthBytesUTF8(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) + u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023; + if (u <= 127) + ++len; + else if (u <= 2047) + len += 2; + else if (u <= 65535) + len += 3; + else + len += 4; + } + return len; + } + function writeArrayToMemory(array2, buffer3) { + GROWABLE_HEAP_I8().set(array2, buffer3); + } + function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - x % multiple; + } + return x; + } + var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; + function updateGlobalBufferAndViews(buf) { + buffer2 = buf; + Module["HEAP8"] = HEAP8 = new Int8Array(buf); + Module["HEAP16"] = HEAP16 = new Int16Array(buf); + Module["HEAP32"] = HEAP32 = new Int32Array(buf); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); + Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); + Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); + } + var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; + if (ENVIRONMENT_IS_PTHREAD) { + wasmMemory = Module["wasmMemory"]; + buffer2 = Module["buffer"]; + } else { + if (Module["wasmMemory"]) { + wasmMemory = Module["wasmMemory"]; + } else { + wasmMemory = new WebAssembly.Memory({ "initial": INITIAL_MEMORY / 65536, "maximum": 2147483648 / 65536, "shared": true }); + if (!(wasmMemory.buffer instanceof SharedArrayBuffer)) { + err("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"); + if (ENVIRONMENT_IS_NODE) { + console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"); + } + throw Error("bad memory"); + } + } + } + if (wasmMemory) { + buffer2 = wasmMemory.buffer; + } + INITIAL_MEMORY = buffer2.byteLength; + updateGlobalBufferAndViews(buffer2); + var wasmTable; + var __ATPRERUN__ = []; + var __ATINIT__ = []; + var __ATMAIN__ = []; + var __ATEXIT__ = []; + var __ATPOSTRUN__ = []; + var runtimeInitialized = false; + var runtimeExited = false; + if (!ENVIRONMENT_IS_PTHREAD) + __ATINIT__.push({ func: function() { + ___wasm_call_ctors(); + } }); + function preRun() { + if (ENVIRONMENT_IS_PTHREAD) + return; + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") + Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + function initRuntime() { + runtimeInitialized = true; + if (ENVIRONMENT_IS_PTHREAD) + return; + callRuntimeCallbacks(__ATINIT__); + } + function preMain() { + if (ENVIRONMENT_IS_PTHREAD) + return; + callRuntimeCallbacks(__ATMAIN__); + } + function exitRuntime() { + if (ENVIRONMENT_IS_PTHREAD) + return; + runtimeExited = true; + } + function postRun() { + if (ENVIRONMENT_IS_PTHREAD) + return; + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") + Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + var runDependencies = 0; + var runDependencyWatcher = null; + var dependenciesFulfilled = null; + function addRunDependency(id) { + assert3(!ENVIRONMENT_IS_PTHREAD, "addRunDependency cannot be used in a pthread worker"); + runDependencies++; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + } + function removeRunDependency(id) { + runDependencies--; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + Module["preloadedImages"] = {}; + Module["preloadedAudios"] = {}; + function abort(what) { + if (Module["onAbort"]) { + Module["onAbort"](what); + } + if (ENVIRONMENT_IS_PTHREAD) + console.error("Pthread aborting at " + new Error().stack); + what += ""; + err(what); + ABORT = true; + EXITSTATUS = 1; + what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject(e); + throw e; + } + function hasPrefix(str, prefix) { + return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0; + } + var dataURIPrefix = "data:application/octet-stream;base64,"; + function isDataURI(filename) { + return hasPrefix(filename, dataURIPrefix); + } + var fileURIPrefix = "file://"; + function isFileURI(filename) { + return hasPrefix(filename, fileURIPrefix); + } + var wasmBinaryFile = "tfjs-backend-wasm-threaded-simd.wasm"; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + function getBinary(file) { + try { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } catch (err2) { + abort(err2); + } + } + function getBinaryPromise() { + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch === "function" && !isFileURI(wasmBinaryFile)) { + return fetch(wasmBinaryFile, { credentials: "same-origin" }).then(function(response) { + if (!response["ok"]) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response["arrayBuffer"](); + }).catch(function() { + return getBinary(wasmBinaryFile); + }); + } else { + if (readAsync) { + return new Promise(function(resolve, reject) { + readAsync(wasmBinaryFile, function(response) { + resolve(new Uint8Array(response)); + }, reject); + }); + } + } + } + return Promise.resolve().then(function() { + return getBinary(wasmBinaryFile); + }); + } + function createWasm() { + var info2 = { "a": asmLibraryArg }; + function receiveInstance(instance, module7) { + var exports3 = instance.exports; + Module["asm"] = exports3; + wasmTable = Module["asm"]["F"]; + wasmModule = module7; + if (!ENVIRONMENT_IS_PTHREAD) { + var numWorkersToLoad = PThread.unusedWorkers.length; + PThread.unusedWorkers.forEach(function(w) { + PThread.loadWasmModuleToWorker(w, function() { + if (!--numWorkersToLoad) + removeRunDependency("wasm-instantiate"); + }); + }); + } + } + if (!ENVIRONMENT_IS_PTHREAD) { + addRunDependency("wasm-instantiate"); + } + function receiveInstantiatedSource(output) { + receiveInstance(output["instance"], output["module"]); + } + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info2); + }).then(receiver, function(reason) { + err("failed to asynchronously prepare wasm: " + reason); + abort(reason); + }); + } + function instantiateAsync() { + if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === "function") { + return fetch(wasmBinaryFile, { credentials: "same-origin" }).then(function(response) { + var result = WebAssembly.instantiateStreaming(response, info2); + return result.then(receiveInstantiatedSource, function(reason) { + err("wasm streaming compile failed: " + reason); + err("falling back to ArrayBuffer instantiation"); + return instantiateArrayBuffer(receiveInstantiatedSource); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiatedSource); + } + } + if (Module["instantiateWasm"]) { + try { + var exports2 = Module["instantiateWasm"](info2, receiveInstance); + return exports2; + } catch (e) { + err("Module.instantiateWasm callback failed with error: " + e); + return false; + } + } + instantiateAsync().catch(readyPromiseReject); + return {}; + } + var ASM_CONSTS = { 9816: function() { + throw "Canceled!"; + }, 9834: function($0, $1) { + setTimeout(function() { + __emscripten_do_dispatch_to_thread($0, $1); + }, 0); + } }; + function initPthreadsJS() { + PThread.initRuntime(); + } + function callRuntimeCallbacks(callbacks2) { + while (callbacks2.length > 0) { + var callback = callbacks2.shift(); + if (typeof callback == "function") { + callback(Module); + continue; + } + var func2 = callback.func; + if (typeof func2 === "number") { + if (callback.arg === void 0) { + wasmTable.get(func2)(); + } else { + wasmTable.get(func2)(callback.arg); + } + } else { + func2(callback.arg === void 0 ? null : callback.arg); + } + } + } + function _emscripten_futex_wake(addr, count22) { + if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & true || count22 < 0) + return -28; + if (count22 == 0) + return 0; + if (count22 >= 2147483647) + count22 = Infinity; + var mainThreadWaitAddress = Atomics.load(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2); + var mainThreadWoken = 0; + if (mainThreadWaitAddress == addr) { + var loadedAddr = Atomics.compareExchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, mainThreadWaitAddress, 0); + if (loadedAddr == mainThreadWaitAddress) { + --count22; + mainThreadWoken = 1; + if (count22 <= 0) + return 1; + } + } + var ret = Atomics.notify(GROWABLE_HEAP_I32(), addr >> 2, count22); + if (ret >= 0) + return ret + mainThreadWoken; + throw "Atomics.notify returned an unexpected value " + ret; + } + Module["_emscripten_futex_wake"] = _emscripten_futex_wake; + function killThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! killThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in killThread!"; + GROWABLE_HEAP_I32()[pthread_ptr + 12 >> 2] = 0; + var pthread = PThread.pthreads[pthread_ptr]; + pthread.worker.terminate(); + PThread.freeThreadData(pthread); + PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker), 1); + pthread.worker.pthread = void 0; + } + function cancelThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! cancelThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in cancelThread!"; + var pthread = PThread.pthreads[pthread_ptr]; + pthread.worker.postMessage({ "cmd": "cancel" }); + } + function cleanupThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! cleanupThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in cleanupThread!"; + var pthread = PThread.pthreads[pthread_ptr]; + if (pthread) { + GROWABLE_HEAP_I32()[pthread_ptr + 12 >> 2] = 0; + var worker = pthread.worker; + PThread.returnWorkerToPool(worker); + } + } + var PThread = { unusedWorkers: [], runningWorkers: [], initMainThreadBlock: function() { + var pthreadPoolSize = Math.min(4, Math.max(1, (navigator.hardwareConcurrency || 1) / 2)); + for (var i = 0; i < pthreadPoolSize; ++i) { + PThread.allocateUnusedWorker(); + } + }, initRuntime: function() { + var tb = _malloc(228); + for (var i = 0; i < 228 / 4; ++i) + GROWABLE_HEAP_U32()[tb / 4 + i] = 0; + GROWABLE_HEAP_I32()[tb + 12 >> 2] = tb; + var headPtr = tb + 152; + GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; + var tlsMemory = _malloc(512); + for (var i = 0; i < 128; ++i) + GROWABLE_HEAP_U32()[tlsMemory / 4 + i] = 0; + Atomics.store(GROWABLE_HEAP_U32(), tb + 100 >> 2, tlsMemory); + Atomics.store(GROWABLE_HEAP_U32(), tb + 40 >> 2, tb); + __emscripten_thread_init(tb, !ENVIRONMENT_IS_WORKER, 1); + _emscripten_register_main_browser_thread_id(tb); + }, initWorker: function() { + }, pthreads: {}, threadExitHandlers: [], setThreadStatus: function() { + }, runExitHandlers: function() { + while (PThread.threadExitHandlers.length > 0) { + PThread.threadExitHandlers.pop()(); + } + if (ENVIRONMENT_IS_PTHREAD && _pthread_self()) + ___pthread_tsd_run_dtors(); + }, runExitHandlersAndDeinitThread: function(tb, exitCode) { + Atomics.store(GROWABLE_HEAP_U32(), tb + 56 >> 2, 1); + Atomics.store(GROWABLE_HEAP_U32(), tb + 60 >> 2, 0); + PThread.runExitHandlers(); + Atomics.store(GROWABLE_HEAP_U32(), tb + 4 >> 2, exitCode); + Atomics.store(GROWABLE_HEAP_U32(), tb + 0 >> 2, 1); + _emscripten_futex_wake(tb + 0, 2147483647); + __emscripten_thread_init(0, 0, 0); + }, threadExit: function(exitCode) { + var tb = _pthread_self(); + if (tb) { + PThread.runExitHandlersAndDeinitThread(tb, exitCode); + if (ENVIRONMENT_IS_PTHREAD) { + postMessage({ "cmd": "exit" }); + } + } + }, threadCancel: function() { + PThread.runExitHandlersAndDeinitThread(_pthread_self(), -1); + postMessage({ "cmd": "cancelDone" }); + }, terminateAllThreads: function() { + for (var t in PThread.pthreads) { + var pthread = PThread.pthreads[t]; + if (pthread && pthread.worker) { + PThread.returnWorkerToPool(pthread.worker); + } + } + PThread.pthreads = {}; + for (var i = 0; i < PThread.unusedWorkers.length; ++i) { + var worker = PThread.unusedWorkers[i]; + worker.terminate(); + } + PThread.unusedWorkers = []; + for (var i = 0; i < PThread.runningWorkers.length; ++i) { + var worker = PThread.runningWorkers[i]; + var pthread = worker.pthread; + PThread.freeThreadData(pthread); + worker.terminate(); + } + PThread.runningWorkers = []; + }, freeThreadData: function(pthread) { + if (!pthread) + return; + if (pthread.threadInfoStruct) { + var tlsMemory = GROWABLE_HEAP_I32()[pthread.threadInfoStruct + 100 >> 2]; + GROWABLE_HEAP_I32()[pthread.threadInfoStruct + 100 >> 2] = 0; + _free(tlsMemory); + _free(pthread.threadInfoStruct); + } + pthread.threadInfoStruct = 0; + if (pthread.allocatedOwnStack && pthread.stackBase) + _free(pthread.stackBase); + pthread.stackBase = 0; + if (pthread.worker) + pthread.worker.pthread = null; + }, returnWorkerToPool: function(worker) { + PThread.runWithoutMainThreadQueuedCalls(function() { + delete PThread.pthreads[worker.pthread.threadInfoStruct]; + PThread.unusedWorkers.push(worker); + PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker), 1); + PThread.freeThreadData(worker.pthread); + worker.pthread = void 0; + }); + }, runWithoutMainThreadQueuedCalls: function(func2) { + GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 0; + try { + func2(); + } finally { + GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 1; + } + }, receiveObjectTransfer: function(data) { + }, loadWasmModuleToWorker: function(worker, onFinishedLoading) { + worker.onmessage = function(e) { + var d = e["data"]; + var cmd = d["cmd"]; + if (worker.pthread) + PThread.currentProxiedOperationCallerThread = worker.pthread.threadInfoStruct; + if (d["targetThread"] && d["targetThread"] != _pthread_self()) { + var thread = PThread.pthreads[d.targetThread]; + if (thread) { + thread.worker.postMessage(e.data, d["transferList"]); + } else { + console.error('Internal error! Worker sent a message "' + cmd + '" to target pthread ' + d["targetThread"] + ", but that thread no longer exists!"); + } + PThread.currentProxiedOperationCallerThread = void 0; + return; + } + if (cmd === "processQueuedMainThreadWork") { + _emscripten_main_thread_process_queued_calls(); + } else if (cmd === "spawnThread") { + spawnThread(e.data); + } else if (cmd === "cleanupThread") { + cleanupThread(d["thread"]); + } else if (cmd === "killThread") { + killThread(d["thread"]); + } else if (cmd === "cancelThread") { + cancelThread(d["thread"]); + } else if (cmd === "loaded") { + worker.loaded = true; + if (onFinishedLoading) + onFinishedLoading(worker); + if (worker.runPthread) { + worker.runPthread(); + delete worker.runPthread; + } + } else if (cmd === "print") { + out("Thread " + d["threadId"] + ": " + d["text"]); + } else if (cmd === "printErr") { + err("Thread " + d["threadId"] + ": " + d["text"]); + } else if (cmd === "alert") { + alert("Thread " + d["threadId"] + ": " + d["text"]); + } else if (cmd === "exit") { + var detached = worker.pthread && Atomics.load(GROWABLE_HEAP_U32(), worker.pthread.threadInfoStruct + 64 >> 2); + if (detached) { + PThread.returnWorkerToPool(worker); + } + } else if (cmd === "exitProcess") { + try { + exit(d["returnCode"]); + } catch (e2) { + if (e2 instanceof ExitStatus) + return; + throw e2; + } + } else if (cmd === "cancelDone") { + PThread.returnWorkerToPool(worker); + } else if (cmd === "objectTransfer") { + PThread.receiveObjectTransfer(e.data); + } else if (e.data.target === "setimmediate") { + worker.postMessage(e.data); + } else { + err("worker sent an unknown command " + cmd); + } + PThread.currentProxiedOperationCallerThread = void 0; + }; + worker.onerror = function(e) { + err("pthread sent an error! " + e.filename + ":" + e.lineno + ": " + e.message); + }; + if (ENVIRONMENT_IS_NODE) { + worker.on("message", function(data) { + worker.onmessage({ data }); + }); + worker.on("error", function(data) { + worker.onerror(data); + }); + worker.on("exit", function(data) { + }); + } + worker.postMessage({ "cmd": "load", "urlOrBlob": Module["mainScriptUrlOrBlob"] || _scriptDir, "wasmMemory": wasmMemory, "wasmModule": wasmModule }); + }, allocateUnusedWorker: function() { + var pthreadMainJs = locateFile("tfjs-backend-wasm-threaded-simd.worker.js"); + PThread.unusedWorkers.push(new Worker(pthreadMainJs)); + }, getNewWorker: function() { + if (PThread.unusedWorkers.length == 0) { + PThread.allocateUnusedWorker(); + PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0]); + } + if (PThread.unusedWorkers.length > 0) + return PThread.unusedWorkers.pop(); + else + return null; + }, busySpinWait: function(msecs) { + var t = performance.now() + msecs; + while (performance.now() < t) { + } + } }; + function establishStackSpace(stackTop, stackMax) { + _emscripten_stack_set_limits(stackTop, stackMax); + stackRestore(stackTop); + } + Module["establishStackSpace"] = establishStackSpace; + function getNoExitRuntime() { + return noExitRuntime; + } + Module["getNoExitRuntime"] = getNoExitRuntime; + function invokeEntryPoint(ptr, arg) { + return wasmTable.get(ptr)(arg); + } + Module["invokeEntryPoint"] = invokeEntryPoint; + function ___assert_fail(condition, filename, line, func2) { + abort("Assertion failed: " + UTF8ToString(condition) + ", at: " + [filename ? UTF8ToString(filename) : "unknown filename", line, func2 ? UTF8ToString(func2) : "unknown function"]); + } + function ___call_main(argc, argv) { + var returnCode = _main(argc, argv); + } + var _emscripten_get_now; + if (ENVIRONMENT_IS_NODE) { + _emscripten_get_now = function() { + var t = process["hrtime"](); + return t[0] * 1e3 + t[1] / 1e6; + }; + } else if (ENVIRONMENT_IS_PTHREAD) { + _emscripten_get_now = function() { + return performance.now() - Module["__performance_now_clock_drift"]; + }; + } else if (typeof dateNow !== "undefined") { + _emscripten_get_now = dateNow; + } else + _emscripten_get_now = function() { + return performance.now(); + }; + function setErrNo(value) { + GROWABLE_HEAP_I32()[___errno_location() >> 2] = value; + return value; + } + function _atexit(func2, arg) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(1, 1, func2, arg); + } + function __emscripten_notify_thread_queue(targetThreadId, mainThreadId) { + if (targetThreadId == mainThreadId) { + postMessage({ "cmd": "processQueuedMainThreadWork" }); + } else if (ENVIRONMENT_IS_PTHREAD) { + postMessage({ "targetThread": targetThreadId, "cmd": "processThreadQueue" }); + } else { + var pthread = PThread.pthreads[targetThreadId]; + var worker = pthread && pthread.worker; + if (!worker) { + return; + } + worker.postMessage({ "cmd": "processThreadQueue" }); + } + return 1; + } + function _abort() { + abort(); + } + function _emscripten_asm_const_int(code, sigPtr, argbuf) { + var args = readAsmConstArgs(sigPtr, argbuf); + return ASM_CONSTS[code].apply(null, args); + } + function _emscripten_conditional_set_current_thread_status(expectedStatus, newStatus) { + } + function _emscripten_futex_wait(addr, val, timeout) { + if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & true) + return -28; + if (!ENVIRONMENT_IS_WEB) { + var ret = Atomics.wait(GROWABLE_HEAP_I32(), addr >> 2, val, timeout); + if (ret === "timed-out") + return -73; + if (ret === "not-equal") + return -6; + if (ret === "ok") + return 0; + throw "Atomics.wait returned an unexpected value " + ret; + } else { + if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) { + return -6; + } + var tNow = performance.now(); + var tEnd = tNow + timeout; + var lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, addr); + while (1) { + tNow = performance.now(); + if (tNow > tEnd) { + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, 0); + return -73; + } + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, 0); + if (lastAddr == 0) { + break; + } + _emscripten_main_thread_process_queued_calls(); + if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) { + return -6; + } + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, addr); + } + return 0; + } + } + function _emscripten_memcpy_big(dest, src, num) { + GROWABLE_HEAP_U8().copyWithin(dest, src, src + num); + } + function _emscripten_num_logical_cores() { + if (ENVIRONMENT_IS_NODE) + return __require2("os").cpus().length; + return navigator["hardwareConcurrency"]; + } + function _emscripten_proxy_to_main_thread_js(index, sync) { + var numCallArgs = arguments.length - 2; + var stack2 = stackSave(); + var serializedNumCallArgs = numCallArgs; + var args = stackAlloc(serializedNumCallArgs * 8); + var b = args >> 3; + for (var i = 0; i < numCallArgs; i++) { + var arg = arguments[2 + i]; + GROWABLE_HEAP_F64()[b + i] = arg; + } + var ret = _emscripten_run_in_main_runtime_thread_js(index, serializedNumCallArgs, args, sync); + stackRestore(stack2); + return ret; + } + var _emscripten_receive_on_main_thread_js_callArgs = []; + var readAsmConstArgsArray = []; + function readAsmConstArgs(sigPtr, buf) { + readAsmConstArgsArray.length = 0; + var ch; + buf >>= 2; + while (ch = GROWABLE_HEAP_U8()[sigPtr++]) { + var double = ch < 105; + if (double && buf & 1) + buf++; + readAsmConstArgsArray.push(double ? GROWABLE_HEAP_F64()[buf++ >> 1] : GROWABLE_HEAP_I32()[buf]); + ++buf; + } + return readAsmConstArgsArray; + } + function _emscripten_receive_on_main_thread_js(index, numCallArgs, args) { + _emscripten_receive_on_main_thread_js_callArgs.length = numCallArgs; + var b = args >> 3; + for (var i = 0; i < numCallArgs; i++) { + _emscripten_receive_on_main_thread_js_callArgs[i] = GROWABLE_HEAP_F64()[b + i]; + } + var isEmAsmConst = index < 0; + var func2 = !isEmAsmConst ? proxiedFunctionTable[index] : ASM_CONSTS[-index - 1]; + return func2.apply(null, _emscripten_receive_on_main_thread_js_callArgs); + } + function _emscripten_get_heap_size() { + return GROWABLE_HEAP_U8().length; + } + function emscripten_realloc_buffer(size) { + try { + wasmMemory.grow(size - buffer2.byteLength + 65535 >>> 16); + updateGlobalBufferAndViews(wasmMemory.buffer); + return 1; + } catch (e) { + } + } + function _emscripten_resize_heap(requestedSize) { + var oldSize = _emscripten_get_heap_size(); + if (requestedSize <= oldSize) { + return false; + } + var maxHeapSize = 2147483648; + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = emscripten_realloc_buffer(newSize); + if (replacement) { + return true; + } + } + return false; + } + var JSEvents = { inEventHandler: 0, removeAllEventListeners: function() { + for (var i = JSEvents.eventHandlers.length - 1; i >= 0; --i) { + JSEvents._removeHandler(i); + } + JSEvents.eventHandlers = []; + JSEvents.deferredCalls = []; + }, registerRemoveEventListeners: function() { + if (!JSEvents.removeEventListenersRegistered) { + __ATEXIT__.push(JSEvents.removeAllEventListeners); + JSEvents.removeEventListenersRegistered = true; + } + }, deferredCalls: [], deferCall: function(targetFunction, precedence, argsList) { + function arraysHaveEqualContent(arrA, arrB) { + if (arrA.length != arrB.length) + return false; + for (var i2 in arrA) { + if (arrA[i2] != arrB[i2]) + return false; + } + return true; + } + for (var i in JSEvents.deferredCalls) { + var call = JSEvents.deferredCalls[i]; + if (call.targetFunction == targetFunction && arraysHaveEqualContent(call.argsList, argsList)) { + return; + } + } + JSEvents.deferredCalls.push({ targetFunction, precedence, argsList }); + JSEvents.deferredCalls.sort(function(x, y) { + return x.precedence < y.precedence; + }); + }, removeDeferredCalls: function(targetFunction) { + for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { + if (JSEvents.deferredCalls[i].targetFunction == targetFunction) { + JSEvents.deferredCalls.splice(i, 1); + --i; + } + } + }, canPerformEventHandlerRequests: function() { + return JSEvents.inEventHandler && JSEvents.currentEventHandler.allowsDeferredCalls; + }, runDeferredCalls: function() { + if (!JSEvents.canPerformEventHandlerRequests()) { + return; + } + for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { + var call = JSEvents.deferredCalls[i]; + JSEvents.deferredCalls.splice(i, 1); + --i; + call.targetFunction.apply(null, call.argsList); + } + }, eventHandlers: [], removeAllHandlersOnTarget: function(target, eventTypeString) { + for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { + if (JSEvents.eventHandlers[i].target == target && (!eventTypeString || eventTypeString == JSEvents.eventHandlers[i].eventTypeString)) { + JSEvents._removeHandler(i--); + } + } + }, _removeHandler: function(i) { + var h = JSEvents.eventHandlers[i]; + h.target.removeEventListener(h.eventTypeString, h.eventListenerFunc, h.useCapture); + JSEvents.eventHandlers.splice(i, 1); + }, registerOrRemoveHandler: function(eventHandler) { + var jsEventHandler = function jsEventHandler2(event) { + ++JSEvents.inEventHandler; + JSEvents.currentEventHandler = eventHandler; + JSEvents.runDeferredCalls(); + eventHandler.handlerFunc(event); + JSEvents.runDeferredCalls(); + --JSEvents.inEventHandler; + }; + if (eventHandler.callbackfunc) { + eventHandler.eventListenerFunc = jsEventHandler; + eventHandler.target.addEventListener(eventHandler.eventTypeString, jsEventHandler, eventHandler.useCapture); + JSEvents.eventHandlers.push(eventHandler); + JSEvents.registerRemoveEventListeners(); + } else { + for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { + if (JSEvents.eventHandlers[i].target == eventHandler.target && JSEvents.eventHandlers[i].eventTypeString == eventHandler.eventTypeString) { + JSEvents._removeHandler(i--); + } + } + } + }, queueEventHandlerOnThread_iiii: function(targetThread, eventHandlerFunc, eventTypeId, eventData, userData) { + var stackTop = stackSave(); + var varargs = stackAlloc(12); + GROWABLE_HEAP_I32()[varargs >> 2] = eventTypeId; + GROWABLE_HEAP_I32()[varargs + 4 >> 2] = eventData; + GROWABLE_HEAP_I32()[varargs + 8 >> 2] = userData; + __emscripten_call_on_thread(0, targetThread, 637534208, eventHandlerFunc, eventData, varargs); + stackRestore(stackTop); + }, getTargetThreadForEventCallback: function(targetThread) { + switch (targetThread) { + case 1: + return 0; + case 2: + return PThread.currentProxiedOperationCallerThread; + default: + return targetThread; + } + }, getNodeNameForTarget: function(target) { + if (!target) + return ""; + if (target == window) + return "#window"; + if (target == screen) + return "#screen"; + return target && target.nodeName ? target.nodeName : ""; + }, fullscreenEnabled: function() { + return document.fullscreenEnabled || document.webkitFullscreenEnabled; + } }; + function stringToNewUTF8(jsString) { + var length = lengthBytesUTF8(jsString) + 1; + var cString = _malloc(length); + stringToUTF8(jsString, cString, length); + return cString; + } + function _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height) { + var stackTop = stackSave(); + var varargs = stackAlloc(12); + var targetCanvasPtr = 0; + if (targetCanvas) { + targetCanvasPtr = stringToNewUTF8(targetCanvas); + } + GROWABLE_HEAP_I32()[varargs >> 2] = targetCanvasPtr; + GROWABLE_HEAP_I32()[varargs + 4 >> 2] = width; + GROWABLE_HEAP_I32()[varargs + 8 >> 2] = height; + __emscripten_call_on_thread(0, targetThread, 657457152, 0, targetCanvasPtr, varargs); + stackRestore(stackTop); + } + function _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, targetCanvas, width, height) { + targetCanvas = targetCanvas ? UTF8ToString(targetCanvas) : ""; + _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height); + } + function maybeCStringToJsString(cString) { + return cString > 2 ? UTF8ToString(cString) : cString; + } + var specialHTMLTargets = [0, typeof document !== "undefined" ? document : 0, typeof window !== "undefined" ? window : 0]; + function findEventTarget(target) { + target = maybeCStringToJsString(target); + var domElement = specialHTMLTargets[target] || (typeof document !== "undefined" ? document.querySelector(target) : void 0); + return domElement; + } + function findCanvasEventTarget(target) { + return findEventTarget(target); + } + function _emscripten_set_canvas_element_size_calling_thread(target, width, height) { + var canvas2 = findCanvasEventTarget(target); + if (!canvas2) + return -4; + if (canvas2.canvasSharedPtr) { + GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr >> 2] = width; + GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr + 4 >> 2] = height; + } + if (canvas2.offscreenCanvas || !canvas2.controlTransferredOffscreen) { + if (canvas2.offscreenCanvas) + canvas2 = canvas2.offscreenCanvas; + var autoResizeViewport = false; + if (canvas2.GLctxObject && canvas2.GLctxObject.GLctx) { + var prevViewport = canvas2.GLctxObject.GLctx.getParameter(2978); + autoResizeViewport = prevViewport[0] === 0 && prevViewport[1] === 0 && prevViewport[2] === canvas2.width && prevViewport[3] === canvas2.height; + } + canvas2.width = width; + canvas2.height = height; + if (autoResizeViewport) { + canvas2.GLctxObject.GLctx.viewport(0, 0, width, height); + } + } else if (canvas2.canvasSharedPtr) { + var targetThread = GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr + 8 >> 2]; + _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, target, width, height); + return 1; + } else { + return -4; + } + return 0; + } + function _emscripten_set_canvas_element_size_main_thread(target, width, height) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(2, 1, target, width, height); + return _emscripten_set_canvas_element_size_calling_thread(target, width, height); + } + function _emscripten_set_canvas_element_size(target, width, height) { + var canvas2 = findCanvasEventTarget(target); + if (canvas2) { + return _emscripten_set_canvas_element_size_calling_thread(target, width, height); + } else { + return _emscripten_set_canvas_element_size_main_thread(target, width, height); + } + } + function _emscripten_set_current_thread_status(newStatus) { + } + function _emscripten_set_thread_name(threadId, name6) { + } + function __webgl_enable_ANGLE_instanced_arrays(ctx) { + var ext = ctx.getExtension("ANGLE_instanced_arrays"); + if (ext) { + ctx["vertexAttribDivisor"] = function(index, divisor) { + ext["vertexAttribDivisorANGLE"](index, divisor); + }; + ctx["drawArraysInstanced"] = function(mode, first, count22, primcount) { + ext["drawArraysInstancedANGLE"](mode, first, count22, primcount); + }; + ctx["drawElementsInstanced"] = function(mode, count22, type, indices, primcount) { + ext["drawElementsInstancedANGLE"](mode, count22, type, indices, primcount); + }; + return 1; + } + } + function __webgl_enable_OES_vertex_array_object(ctx) { + var ext = ctx.getExtension("OES_vertex_array_object"); + if (ext) { + ctx["createVertexArray"] = function() { + return ext["createVertexArrayOES"](); + }; + ctx["deleteVertexArray"] = function(vao) { + ext["deleteVertexArrayOES"](vao); + }; + ctx["bindVertexArray"] = function(vao) { + ext["bindVertexArrayOES"](vao); + }; + ctx["isVertexArray"] = function(vao) { + return ext["isVertexArrayOES"](vao); + }; + return 1; + } + } + function __webgl_enable_WEBGL_draw_buffers(ctx) { + var ext = ctx.getExtension("WEBGL_draw_buffers"); + if (ext) { + ctx["drawBuffers"] = function(n, bufs) { + ext["drawBuffersWEBGL"](n, bufs); + }; + return 1; + } + } + function __webgl_enable_WEBGL_multi_draw(ctx) { + return !!(ctx.multiDrawWebgl = ctx.getExtension("WEBGL_multi_draw")); + } + var GL = { counter: 1, buffers: [], programs: [], framebuffers: [], renderbuffers: [], textures: [], uniforms: [], shaders: [], vaos: [], contexts: {}, offscreenCanvases: {}, timerQueriesEXT: [], programInfos: {}, stringCache: {}, unpackAlignment: 4, recordError: function recordError(errorCode) { + if (!GL.lastError) { + GL.lastError = errorCode; + } + }, getNewId: function(table) { + var ret = GL.counter++; + for (var i = table.length; i < ret; i++) { + table[i] = null; + } + return ret; + }, getSource: function(shader, count22, string, length) { + var source = ""; + for (var i = 0; i < count22; ++i) { + var len = length ? GROWABLE_HEAP_I32()[length + i * 4 >> 2] : -1; + source += UTF8ToString(GROWABLE_HEAP_I32()[string + i * 4 >> 2], len < 0 ? void 0 : len); + } + return source; + }, createContext: function(canvas2, webGLContextAttributes) { + var ctx = canvas2.getContext("webgl", webGLContextAttributes); + if (!ctx) + return 0; + var handle = GL.registerContext(ctx, webGLContextAttributes); + return handle; + }, registerContext: function(ctx, webGLContextAttributes) { + var handle = _malloc(8); + GROWABLE_HEAP_I32()[handle + 4 >> 2] = _pthread_self(); + var context = { handle, attributes: webGLContextAttributes, version: webGLContextAttributes.majorVersion, GLctx: ctx }; + if (ctx.canvas) + ctx.canvas.GLctxObject = context; + GL.contexts[handle] = context; + if (typeof webGLContextAttributes.enableExtensionsByDefault === "undefined" || webGLContextAttributes.enableExtensionsByDefault) { + GL.initExtensions(context); + } + return handle; + }, makeContextCurrent: function(contextHandle) { + GL.currentContext = GL.contexts[contextHandle]; + Module.ctx = GLctx = GL.currentContext && GL.currentContext.GLctx; + return !(contextHandle && !GLctx); + }, getContext: function(contextHandle) { + return GL.contexts[contextHandle]; + }, deleteContext: function(contextHandle) { + if (GL.currentContext === GL.contexts[contextHandle]) + GL.currentContext = null; + if (typeof JSEvents === "object") + JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas); + if (GL.contexts[contextHandle] && GL.contexts[contextHandle].GLctx.canvas) + GL.contexts[contextHandle].GLctx.canvas.GLctxObject = void 0; + _free(GL.contexts[contextHandle].handle); + GL.contexts[contextHandle] = null; + }, initExtensions: function(context) { + if (!context) + context = GL.currentContext; + if (context.initExtensionsDone) + return; + context.initExtensionsDone = true; + var GLctx2 = context.GLctx; + __webgl_enable_ANGLE_instanced_arrays(GLctx2); + __webgl_enable_OES_vertex_array_object(GLctx2); + __webgl_enable_WEBGL_draw_buffers(GLctx2); + GLctx2.disjointTimerQueryExt = GLctx2.getExtension("EXT_disjoint_timer_query"); + __webgl_enable_WEBGL_multi_draw(GLctx2); + var exts = GLctx2.getSupportedExtensions() || []; + exts.forEach(function(ext) { + if (ext.indexOf("lose_context") < 0 && ext.indexOf("debug") < 0) { + GLctx2.getExtension(ext); + } + }); + }, populateUniformTable: function(program) { + var p2 = GL.programs[program]; + var ptable = GL.programInfos[program] = { uniforms: {}, maxUniformLength: 0, maxAttributeLength: -1, maxUniformBlockNameLength: -1 }; + var utable = ptable.uniforms; + var numUniforms = GLctx.getProgramParameter(p2, 35718); + for (var i = 0; i < numUniforms; ++i) { + var u = GLctx.getActiveUniform(p2, i); + var name6 = u.name; + ptable.maxUniformLength = Math.max(ptable.maxUniformLength, name6.length + 1); + if (name6.slice(-1) == "]") { + name6 = name6.slice(0, name6.lastIndexOf("[")); + } + var loc = GLctx.getUniformLocation(p2, name6); + if (loc) { + var id = GL.getNewId(GL.uniforms); + utable[name6] = [u.size, id]; + GL.uniforms[id] = loc; + for (var j = 1; j < u.size; ++j) { + var n = name6 + "[" + j + "]"; + loc = GLctx.getUniformLocation(p2, n); + id = GL.getNewId(GL.uniforms); + GL.uniforms[id] = loc; + } + } + } + } }; + var __emscripten_webgl_power_preferences = ["default", "low-power", "high-performance"]; + function _emscripten_webgl_do_create_context(target, attributes) { + var a = attributes >> 2; + var powerPreference = GROWABLE_HEAP_I32()[a + (24 >> 2)]; + var contextAttributes = { "alpha": !!GROWABLE_HEAP_I32()[a + (0 >> 2)], "depth": !!GROWABLE_HEAP_I32()[a + (4 >> 2)], "stencil": !!GROWABLE_HEAP_I32()[a + (8 >> 2)], "antialias": !!GROWABLE_HEAP_I32()[a + (12 >> 2)], "premultipliedAlpha": !!GROWABLE_HEAP_I32()[a + (16 >> 2)], "preserveDrawingBuffer": !!GROWABLE_HEAP_I32()[a + (20 >> 2)], "powerPreference": __emscripten_webgl_power_preferences[powerPreference], "failIfMajorPerformanceCaveat": !!GROWABLE_HEAP_I32()[a + (28 >> 2)], majorVersion: GROWABLE_HEAP_I32()[a + (32 >> 2)], minorVersion: GROWABLE_HEAP_I32()[a + (36 >> 2)], enableExtensionsByDefault: GROWABLE_HEAP_I32()[a + (40 >> 2)], explicitSwapControl: GROWABLE_HEAP_I32()[a + (44 >> 2)], proxyContextToMainThread: GROWABLE_HEAP_I32()[a + (48 >> 2)], renderViaOffscreenBackBuffer: GROWABLE_HEAP_I32()[a + (52 >> 2)] }; + var canvas2 = findCanvasEventTarget(target); + if (!canvas2) { + return 0; + } + if (contextAttributes.explicitSwapControl) { + return 0; + } + var contextHandle = GL.createContext(canvas2, contextAttributes); + return contextHandle; + } + function _emscripten_webgl_create_context(a0, a12) { + return _emscripten_webgl_do_create_context(a0, a12); + } + var SYSCALLS = { mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) { + var buffer3 = SYSCALLS.buffers[stream]; + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0)); + buffer3.length = 0; + } else { + buffer3.push(curr); + } + }, varargs: void 0, get: function() { + SYSCALLS.varargs += 4; + var ret = GROWABLE_HEAP_I32()[SYSCALLS.varargs - 4 >> 2]; + return ret; + }, getStr: function(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, get64: function(low, high) { + return low; + } }; + function _fd_close(fd) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(3, 1, fd); + return 0; + } + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(4, 1, fd, offset_low, offset_high, whence, newOffset); + } + function _fd_write(fd, iov, iovcnt, pnum) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(5, 1, fd, iov, iovcnt, pnum); + var num = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = GROWABLE_HEAP_I32()[iov + i * 8 >> 2]; + var len = GROWABLE_HEAP_I32()[iov + (i * 8 + 4) >> 2]; + for (var j = 0; j < len; j++) { + SYSCALLS.printChar(fd, GROWABLE_HEAP_U8()[ptr + j]); + } + num += len; + } + GROWABLE_HEAP_I32()[pnum >> 2] = num; + return 0; + } + function _pthread_cleanup_pop(execute2) { + var routine = PThread.threadExitHandlers.pop(); + if (execute2) + routine(); + } + function _pthread_cleanup_push(routine, arg) { + PThread.threadExitHandlers.push(function() { + wasmTable.get(routine)(arg); + }); + } + function spawnThread(threadParams) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! spawnThread() can only ever be called from main application thread!"; + var worker = PThread.getNewWorker(); + if (worker.pthread !== void 0) + throw "Internal error!"; + if (!threadParams.pthread_ptr) + throw "Internal error, no pthread ptr!"; + PThread.runningWorkers.push(worker); + var tlsMemory = _malloc(128 * 4); + for (var i = 0; i < 128; ++i) { + GROWABLE_HEAP_I32()[tlsMemory + i * 4 >> 2] = 0; + } + var stackHigh = threadParams.stackBase + threadParams.stackSize; + var pthread = PThread.pthreads[threadParams.pthread_ptr] = { worker, stackBase: threadParams.stackBase, stackSize: threadParams.stackSize, allocatedOwnStack: threadParams.allocatedOwnStack, threadInfoStruct: threadParams.pthread_ptr }; + var tis = pthread.threadInfoStruct >> 2; + Atomics.store(GROWABLE_HEAP_U32(), tis + (64 >> 2), threadParams.detached); + Atomics.store(GROWABLE_HEAP_U32(), tis + (100 >> 2), tlsMemory); + Atomics.store(GROWABLE_HEAP_U32(), tis + (40 >> 2), pthread.threadInfoStruct); + Atomics.store(GROWABLE_HEAP_U32(), tis + (80 >> 2), threadParams.stackSize); + Atomics.store(GROWABLE_HEAP_U32(), tis + (76 >> 2), stackHigh); + Atomics.store(GROWABLE_HEAP_U32(), tis + (104 >> 2), threadParams.stackSize); + Atomics.store(GROWABLE_HEAP_U32(), tis + (104 + 8 >> 2), stackHigh); + Atomics.store(GROWABLE_HEAP_U32(), tis + (104 + 12 >> 2), threadParams.detached); + var global_libc = _emscripten_get_global_libc(); + var global_locale = global_libc + 40; + Atomics.store(GROWABLE_HEAP_U32(), tis + (172 >> 2), global_locale); + worker.pthread = pthread; + var msg = { "cmd": "run", "start_routine": threadParams.startRoutine, "arg": threadParams.arg, "threadInfoStruct": threadParams.pthread_ptr, "stackBase": threadParams.stackBase, "stackSize": threadParams.stackSize }; + worker.runPthread = function() { + msg.time = performance.now(); + worker.postMessage(msg, threadParams.transferList); + }; + if (worker.loaded) { + worker.runPthread(); + delete worker.runPthread; + } + } + function _pthread_create(pthread_ptr, attr, start_routine, arg) { + if (typeof SharedArrayBuffer === "undefined") { + err("Current environment does not support SharedArrayBuffer, pthreads are not available!"); + return 6; + } + if (!pthread_ptr) { + err("pthread_create called with a null thread pointer!"); + return 28; + } + var transferList = []; + var error = 0; + if (ENVIRONMENT_IS_PTHREAD && (transferList.length === 0 || error)) { + return _emscripten_sync_run_in_main_thread_4(687865856, pthread_ptr, attr, start_routine, arg); + } + if (error) + return error; + var stackSize = 0; + var stackBase = 0; + var detached = 0; + if (attr && attr != -1) { + stackSize = GROWABLE_HEAP_I32()[attr >> 2]; + stackSize += 81920; + stackBase = GROWABLE_HEAP_I32()[attr + 8 >> 2]; + detached = GROWABLE_HEAP_I32()[attr + 12 >> 2] !== 0; + } else { + stackSize = 2097152; + } + var allocatedOwnStack = stackBase == 0; + if (allocatedOwnStack) { + stackBase = _memalign(16, stackSize); + } else { + stackBase -= stackSize; + assert3(stackBase > 0); + } + var threadInfoStruct = _malloc(228); + for (var i = 0; i < 228 >> 2; ++i) + GROWABLE_HEAP_U32()[(threadInfoStruct >> 2) + i] = 0; + GROWABLE_HEAP_I32()[pthread_ptr >> 2] = threadInfoStruct; + GROWABLE_HEAP_I32()[threadInfoStruct + 12 >> 2] = threadInfoStruct; + var headPtr = threadInfoStruct + 152; + GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; + var threadParams = { stackBase, stackSize, allocatedOwnStack, detached, startRoutine: start_routine, pthread_ptr: threadInfoStruct, arg, transferList }; + if (ENVIRONMENT_IS_PTHREAD) { + threadParams.cmd = "spawnThread"; + postMessage(threadParams, transferList); + } else { + spawnThread(threadParams); + } + return 0; + } + function _sysconf(name6) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(6, 1, name6); + switch (name6) { + case 30: + return 16384; + case 85: + var maxHeapSize = 2147483648; + return maxHeapSize / 16384; + case 132: + case 133: + case 12: + case 137: + case 138: + case 15: + case 235: + case 16: + case 17: + case 18: + case 19: + case 20: + case 149: + case 13: + case 10: + case 236: + case 153: + case 9: + case 21: + case 22: + case 159: + case 154: + case 14: + case 77: + case 78: + case 139: + case 82: + case 68: + case 67: + case 164: + case 11: + case 29: + case 47: + case 48: + case 95: + case 52: + case 51: + case 46: + return 200809; + case 27: + case 246: + case 127: + case 128: + case 23: + case 24: + case 160: + case 161: + case 181: + case 182: + case 242: + case 183: + case 184: + case 243: + case 244: + case 245: + case 165: + case 178: + case 179: + case 49: + case 50: + case 168: + case 169: + case 175: + case 170: + case 171: + case 172: + case 97: + case 76: + case 32: + case 173: + case 35: + case 80: + case 81: + case 79: + return -1; + case 176: + case 177: + case 7: + case 155: + case 8: + case 157: + case 125: + case 126: + case 92: + case 93: + case 129: + case 130: + case 131: + case 94: + case 91: + return 1; + case 74: + case 60: + case 69: + case 70: + case 4: + return 1024; + case 31: + case 42: + case 72: + return 32; + case 87: + case 26: + case 33: + return 2147483647; + case 34: + case 1: + return 47839; + case 38: + case 36: + return 99; + case 43: + case 37: + return 2048; + case 0: + return 2097152; + case 3: + return 65536; + case 28: + return 32768; + case 44: + return 32767; + case 75: + return 16384; + case 39: + return 1e3; + case 89: + return 700; + case 71: + return 256; + case 40: + return 255; + case 2: + return 100; + case 180: + return 64; + case 25: + return 20; + case 5: + return 16; + case 6: + return 6; + case 73: + return 4; + case 84: { + if (typeof navigator === "object") + return navigator["hardwareConcurrency"] || 1; + return 1; + } + } + setErrNo(28); + return -1; + } + if (!ENVIRONMENT_IS_PTHREAD) + PThread.initMainThreadBlock(); + var GLctx; + var proxiedFunctionTable = [null, _atexit, _emscripten_set_canvas_element_size_main_thread, _fd_close, _fd_seek, _fd_write, _sysconf]; + var asmLibraryArg = { "e": ___assert_fail, "r": ___call_main, "x": __emscripten_notify_thread_queue, "b": _abort, "y": _emscripten_asm_const_int, "j": _emscripten_conditional_set_current_thread_status, "c": _emscripten_futex_wait, "d": _emscripten_futex_wake, "f": _emscripten_get_now, "p": _emscripten_memcpy_big, "z": _emscripten_num_logical_cores, "u": _emscripten_receive_on_main_thread_js, "q": _emscripten_resize_heap, "v": _emscripten_set_canvas_element_size, "i": _emscripten_set_current_thread_status, "t": _emscripten_set_thread_name, "w": _emscripten_webgl_create_context, "m": _fd_close, "n": _fd_seek, "g": _fd_write, "o": initPthreadsJS, "a": wasmMemory || Module["wasmMemory"], "k": _pthread_cleanup_pop, "l": _pthread_cleanup_push, "h": _pthread_create, "s": _sysconf }; + var asm = createWasm(); + var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { + return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["A"]).apply(null, arguments); + }; + var _init = Module["_init"] = function() { + return (_init = Module["_init"] = Module["asm"]["B"]).apply(null, arguments); + }; + var _register_tensor = Module["_register_tensor"] = function() { + return (_register_tensor = Module["_register_tensor"] = Module["asm"]["C"]).apply(null, arguments); + }; + var _dispose_data = Module["_dispose_data"] = function() { + return (_dispose_data = Module["_dispose_data"] = Module["asm"]["D"]).apply(null, arguments); + }; + var _dispose = Module["_dispose"] = function() { + return (_dispose = Module["_dispose"] = Module["asm"]["E"]).apply(null, arguments); + }; + var _Abs = Module["_Abs"] = function() { + return (_Abs = Module["_Abs"] = Module["asm"]["G"]).apply(null, arguments); + }; + var _Add = Module["_Add"] = function() { + return (_Add = Module["_Add"] = Module["asm"]["H"]).apply(null, arguments); + }; + var _AddN = Module["_AddN"] = function() { + return (_AddN = Module["_AddN"] = Module["asm"]["I"]).apply(null, arguments); + }; + var _All = Module["_All"] = function() { + return (_All = Module["_All"] = Module["asm"]["J"]).apply(null, arguments); + }; + var _Any = Module["_Any"] = function() { + return (_Any = Module["_Any"] = Module["asm"]["K"]).apply(null, arguments); + }; + var _ArgMax = Module["_ArgMax"] = function() { + return (_ArgMax = Module["_ArgMax"] = Module["asm"]["L"]).apply(null, arguments); + }; + var _AvgPool = Module["_AvgPool"] = function() { + return (_AvgPool = Module["_AvgPool"] = Module["asm"]["M"]).apply(null, arguments); + }; + var _BatchMatMul = Module["_BatchMatMul"] = function() { + return (_BatchMatMul = Module["_BatchMatMul"] = Module["asm"]["N"]).apply(null, arguments); + }; + var _Ceil = Module["_Ceil"] = function() { + return (_Ceil = Module["_Ceil"] = Module["asm"]["O"]).apply(null, arguments); + }; + var _ClipByValue = Module["_ClipByValue"] = function() { + return (_ClipByValue = Module["_ClipByValue"] = Module["asm"]["P"]).apply(null, arguments); + }; + var _Conv2D = Module["_Conv2D"] = function() { + return (_Conv2D = Module["_Conv2D"] = Module["asm"]["Q"]).apply(null, arguments); + }; + var _Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = function() { + return (_Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = Module["asm"]["R"]).apply(null, arguments); + }; + var _Cos = Module["_Cos"] = function() { + return (_Cos = Module["_Cos"] = Module["asm"]["S"]).apply(null, arguments); + }; + var _CropAndResize = Module["_CropAndResize"] = function() { + return (_CropAndResize = Module["_CropAndResize"] = Module["asm"]["T"]).apply(null, arguments); + }; + var _Cumsum = Module["_Cumsum"] = function() { + return (_Cumsum = Module["_Cumsum"] = Module["asm"]["U"]).apply(null, arguments); + }; + var _DepthToSpace = Module["_DepthToSpace"] = function() { + return (_DepthToSpace = Module["_DepthToSpace"] = Module["asm"]["V"]).apply(null, arguments); + }; + var _DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = function() { + return (_DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = Module["asm"]["W"]).apply(null, arguments); + }; + var _Equal = Module["_Equal"] = function() { + return (_Equal = Module["_Equal"] = Module["asm"]["X"]).apply(null, arguments); + }; + var _Exp = Module["_Exp"] = function() { + return (_Exp = Module["_Exp"] = Module["asm"]["Y"]).apply(null, arguments); + }; + var _FlipLeftRight = Module["_FlipLeftRight"] = function() { + return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["Z"]).apply(null, arguments); + }; + var _Floor = Module["_Floor"] = function() { + return (_Floor = Module["_Floor"] = Module["asm"]["_"]).apply(null, arguments); + }; + var _FloorDiv = Module["_FloorDiv"] = function() { + return (_FloorDiv = Module["_FloorDiv"] = Module["asm"]["$"]).apply(null, arguments); + }; + var _FusedBatchNorm = Module["_FusedBatchNorm"] = function() { + return (_FusedBatchNorm = Module["_FusedBatchNorm"] = Module["asm"]["aa"]).apply(null, arguments); + }; + var _FusedConv2D = Module["_FusedConv2D"] = function() { + return (_FusedConv2D = Module["_FusedConv2D"] = Module["asm"]["ba"]).apply(null, arguments); + }; + var _FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = function() { + return (_FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = Module["asm"]["ca"]).apply(null, arguments); + }; + var _Gather = Module["_Gather"] = function() { + return (_Gather = Module["_Gather"] = Module["asm"]["da"]).apply(null, arguments); + }; + var _GatherNd = Module["_GatherNd"] = function() { + return (_GatherNd = Module["_GatherNd"] = Module["asm"]["ea"]).apply(null, arguments); + }; + var _Greater = Module["_Greater"] = function() { + return (_Greater = Module["_Greater"] = Module["asm"]["fa"]).apply(null, arguments); + }; + var _GreaterEqual = Module["_GreaterEqual"] = function() { + return (_GreaterEqual = Module["_GreaterEqual"] = Module["asm"]["ga"]).apply(null, arguments); + }; + var _LeakyRelu = Module["_LeakyRelu"] = function() { + return (_LeakyRelu = Module["_LeakyRelu"] = Module["asm"]["ha"]).apply(null, arguments); + }; + var _Less = Module["_Less"] = function() { + return (_Less = Module["_Less"] = Module["asm"]["ia"]).apply(null, arguments); + }; + var _LessEqual = Module["_LessEqual"] = function() { + return (_LessEqual = Module["_LessEqual"] = Module["asm"]["ja"]).apply(null, arguments); + }; + var _Log = Module["_Log"] = function() { + return (_Log = Module["_Log"] = Module["asm"]["ka"]).apply(null, arguments); + }; + var _LogicalAnd = Module["_LogicalAnd"] = function() { + return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["la"]).apply(null, arguments); + }; + var _Max = Module["_Max"] = function() { + return (_Max = Module["_Max"] = Module["asm"]["ma"]).apply(null, arguments); + }; + var _MaxPool = Module["_MaxPool"] = function() { + return (_MaxPool = Module["_MaxPool"] = Module["asm"]["na"]).apply(null, arguments); + }; + var _Maximum = Module["_Maximum"] = function() { + return (_Maximum = Module["_Maximum"] = Module["asm"]["oa"]).apply(null, arguments); + }; + var _Mean = Module["_Mean"] = function() { + return (_Mean = Module["_Mean"] = Module["asm"]["pa"]).apply(null, arguments); + }; + var _Min = Module["_Min"] = function() { + return (_Min = Module["_Min"] = Module["asm"]["qa"]).apply(null, arguments); + }; + var _Minimum = Module["_Minimum"] = function() { + return (_Minimum = Module["_Minimum"] = Module["asm"]["ra"]).apply(null, arguments); + }; + var _MirrorPad = Module["_MirrorPad"] = function() { + return (_MirrorPad = Module["_MirrorPad"] = Module["asm"]["sa"]).apply(null, arguments); + }; + var _Multiply = Module["_Multiply"] = function() { + return (_Multiply = Module["_Multiply"] = Module["asm"]["ta"]).apply(null, arguments); + }; + var _Neg = Module["_Neg"] = function() { + return (_Neg = Module["_Neg"] = Module["asm"]["ua"]).apply(null, arguments); + }; + var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { + return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["va"]).apply(null, arguments); + }; + var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { + return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["wa"]).apply(null, arguments); + }; + var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { + return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["xa"]).apply(null, arguments); + }; + var _NotEqual = Module["_NotEqual"] = function() { + return (_NotEqual = Module["_NotEqual"] = Module["asm"]["ya"]).apply(null, arguments); + }; + var _OneHot = Module["_OneHot"] = function() { + return (_OneHot = Module["_OneHot"] = Module["asm"]["za"]).apply(null, arguments); + }; + var _PadV2 = Module["_PadV2"] = function() { + return (_PadV2 = Module["_PadV2"] = Module["asm"]["Aa"]).apply(null, arguments); + }; + var _Pow = Module["_Pow"] = function() { + return (_Pow = Module["_Pow"] = Module["asm"]["Ba"]).apply(null, arguments); + }; + var _Prelu = Module["_Prelu"] = function() { + return (_Prelu = Module["_Prelu"] = Module["asm"]["Ca"]).apply(null, arguments); + }; + var _Prod = Module["_Prod"] = function() { + return (_Prod = Module["_Prod"] = Module["asm"]["Da"]).apply(null, arguments); + }; + var _RealDiv = Module["_RealDiv"] = function() { + return (_RealDiv = Module["_RealDiv"] = Module["asm"]["Ea"]).apply(null, arguments); + }; + var _Relu = Module["_Relu"] = function() { + return (_Relu = Module["_Relu"] = Module["asm"]["Fa"]).apply(null, arguments); + }; + var _Relu6 = Module["_Relu6"] = function() { + return (_Relu6 = Module["_Relu6"] = Module["asm"]["Ga"]).apply(null, arguments); + }; + var _ResizeBilinear = Module["_ResizeBilinear"] = function() { + return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["Ha"]).apply(null, arguments); + }; + var _Reverse = Module["_Reverse"] = function() { + return (_Reverse = Module["_Reverse"] = Module["asm"]["Ia"]).apply(null, arguments); + }; + var _RotateWithOffset = Module["_RotateWithOffset"] = function() { + return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["Ja"]).apply(null, arguments); + }; + var _Round = Module["_Round"] = function() { + return (_Round = Module["_Round"] = Module["asm"]["Ka"]).apply(null, arguments); + }; + var _Rsqrt = Module["_Rsqrt"] = function() { + return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["La"]).apply(null, arguments); + }; + var _ScatterNd = Module["_ScatterNd"] = function() { + return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["Ma"]).apply(null, arguments); + }; + var _SelectV2 = Module["_SelectV2"] = function() { + return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["Na"]).apply(null, arguments); + }; + var _Sigmoid = Module["_Sigmoid"] = function() { + return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["Oa"]).apply(null, arguments); + }; + var _Sin = Module["_Sin"] = function() { + return (_Sin = Module["_Sin"] = Module["asm"]["Pa"]).apply(null, arguments); + }; + var _Softmax = Module["_Softmax"] = function() { + return (_Softmax = Module["_Softmax"] = Module["asm"]["Qa"]).apply(null, arguments); + }; + var _Sqrt = Module["_Sqrt"] = function() { + return (_Sqrt = Module["_Sqrt"] = Module["asm"]["Ra"]).apply(null, arguments); + }; + var _Square = Module["_Square"] = function() { + return (_Square = Module["_Square"] = Module["asm"]["Sa"]).apply(null, arguments); + }; + var _SquaredDifference = Module["_SquaredDifference"] = function() { + return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["Ta"]).apply(null, arguments); + }; + var _Step = Module["_Step"] = function() { + return (_Step = Module["_Step"] = Module["asm"]["Ua"]).apply(null, arguments); + }; + var _StridedSlice = Module["_StridedSlice"] = function() { + return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["Va"]).apply(null, arguments); + }; + var _Sub = Module["_Sub"] = function() { + return (_Sub = Module["_Sub"] = Module["asm"]["Wa"]).apply(null, arguments); + }; + var _Sum = Module["_Sum"] = function() { + return (_Sum = Module["_Sum"] = Module["asm"]["Xa"]).apply(null, arguments); + }; + var _Tan = Module["_Tan"] = function() { + return (_Tan = Module["_Tan"] = Module["asm"]["Ya"]).apply(null, arguments); + }; + var _Tanh = Module["_Tanh"] = function() { + return (_Tanh = Module["_Tanh"] = Module["asm"]["Za"]).apply(null, arguments); + }; + var _Tile = Module["_Tile"] = function() { + return (_Tile = Module["_Tile"] = Module["asm"]["_a"]).apply(null, arguments); + }; + var _TopK = Module["_TopK"] = function() { + return (_TopK = Module["_TopK"] = Module["asm"]["$a"]).apply(null, arguments); + }; + var _Transform = Module["_Transform"] = function() { + return (_Transform = Module["_Transform"] = Module["asm"]["ab"]).apply(null, arguments); + }; + var _Transpose = Module["_Transpose"] = function() { + return (_Transpose = Module["_Transpose"] = Module["asm"]["bb"]).apply(null, arguments); + }; + var __FusedMatMul = Module["__FusedMatMul"] = function() { + return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["cb"]).apply(null, arguments); + }; + var _malloc = Module["_malloc"] = function() { + return (_malloc = Module["_malloc"] = Module["asm"]["db"]).apply(null, arguments); + }; + var _free = Module["_free"] = function() { + return (_free = Module["_free"] = Module["asm"]["eb"]).apply(null, arguments); + }; + var ___errno_location = Module["___errno_location"] = function() { + return (___errno_location = Module["___errno_location"] = Module["asm"]["fb"]).apply(null, arguments); + }; + var _emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = function() { + return (_emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = Module["asm"]["gb"]).apply(null, arguments); + }; + var _pthread_self = Module["_pthread_self"] = function() { + return (_pthread_self = Module["_pthread_self"] = Module["asm"]["hb"]).apply(null, arguments); + }; + var ___pthread_tsd_run_dtors = Module["___pthread_tsd_run_dtors"] = function() { + return (___pthread_tsd_run_dtors = Module["___pthread_tsd_run_dtors"] = Module["asm"]["ib"]).apply(null, arguments); + }; + var _emscripten_main_thread_process_queued_calls = Module["_emscripten_main_thread_process_queued_calls"] = function() { + return (_emscripten_main_thread_process_queued_calls = Module["_emscripten_main_thread_process_queued_calls"] = Module["asm"]["jb"]).apply(null, arguments); + }; + var _emscripten_current_thread_process_queued_calls = Module["_emscripten_current_thread_process_queued_calls"] = function() { + return (_emscripten_current_thread_process_queued_calls = Module["_emscripten_current_thread_process_queued_calls"] = Module["asm"]["kb"]).apply(null, arguments); + }; + var _emscripten_register_main_browser_thread_id = Module["_emscripten_register_main_browser_thread_id"] = function() { + return (_emscripten_register_main_browser_thread_id = Module["_emscripten_register_main_browser_thread_id"] = Module["asm"]["lb"]).apply(null, arguments); + }; + var __emscripten_do_dispatch_to_thread = Module["__emscripten_do_dispatch_to_thread"] = function() { + return (__emscripten_do_dispatch_to_thread = Module["__emscripten_do_dispatch_to_thread"] = Module["asm"]["mb"]).apply(null, arguments); + }; + var _emscripten_sync_run_in_main_thread_4 = Module["_emscripten_sync_run_in_main_thread_4"] = function() { + return (_emscripten_sync_run_in_main_thread_4 = Module["_emscripten_sync_run_in_main_thread_4"] = Module["asm"]["nb"]).apply(null, arguments); + }; + var _emscripten_run_in_main_runtime_thread_js = Module["_emscripten_run_in_main_runtime_thread_js"] = function() { + return (_emscripten_run_in_main_runtime_thread_js = Module["_emscripten_run_in_main_runtime_thread_js"] = Module["asm"]["ob"]).apply(null, arguments); + }; + var __emscripten_call_on_thread = Module["__emscripten_call_on_thread"] = function() { + return (__emscripten_call_on_thread = Module["__emscripten_call_on_thread"] = Module["asm"]["pb"]).apply(null, arguments); + }; + var _emscripten_tls_init = Module["_emscripten_tls_init"] = function() { + return (_emscripten_tls_init = Module["_emscripten_tls_init"] = Module["asm"]["qb"]).apply(null, arguments); + }; + var __emscripten_thread_init = Module["__emscripten_thread_init"] = function() { + return (__emscripten_thread_init = Module["__emscripten_thread_init"] = Module["asm"]["rb"]).apply(null, arguments); + }; + var stackSave = Module["stackSave"] = function() { + return (stackSave = Module["stackSave"] = Module["asm"]["sb"]).apply(null, arguments); + }; + var stackRestore = Module["stackRestore"] = function() { + return (stackRestore = Module["stackRestore"] = Module["asm"]["tb"]).apply(null, arguments); + }; + var stackAlloc = Module["stackAlloc"] = function() { + return (stackAlloc = Module["stackAlloc"] = Module["asm"]["ub"]).apply(null, arguments); + }; + var _emscripten_stack_set_limits = Module["_emscripten_stack_set_limits"] = function() { + return (_emscripten_stack_set_limits = Module["_emscripten_stack_set_limits"] = Module["asm"]["vb"]).apply(null, arguments); + }; + var _memalign = Module["_memalign"] = function() { + return (_memalign = Module["_memalign"] = Module["asm"]["wb"]).apply(null, arguments); + }; + var __emscripten_allow_main_runtime_queued_calls = Module["__emscripten_allow_main_runtime_queued_calls"] = 9808; + var __emscripten_main_thread_futex = Module["__emscripten_main_thread_futex"] = 11432; + Module["cwrap"] = cwrap; + Module["PThread"] = PThread; + Module["PThread"] = PThread; + Module["wasmMemory"] = wasmMemory; + Module["ExitStatus"] = ExitStatus; + var calledRun; + function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; + } + dependenciesFulfilled = function runCaller() { + if (!calledRun) + run(); + if (!calledRun) + dependenciesFulfilled = runCaller; + }; + function run(args) { + args = args || arguments_; + if (runDependencies > 0) { + return; + } + if (ENVIRONMENT_IS_PTHREAD) { + readyPromiseResolve(Module); + initRuntime(); + postMessage({ "cmd": "loaded" }); + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) + return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) + return; + initRuntime(); + preMain(); + readyPromiseResolve(Module); + if (Module["onRuntimeInitialized"]) + Module["onRuntimeInitialized"](); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(function() { + setTimeout(function() { + Module["setStatus"](""); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + Module["run"] = run; + function exit(status, implicit) { + if (implicit && noExitRuntime && status === 0) { + return; + } + if (!implicit) { + if (ENVIRONMENT_IS_PTHREAD) { + postMessage({ "cmd": "exitProcess", "returnCode": status }); + throw new ExitStatus(status); + } else { + } + } + if (noExitRuntime) { + } else { + PThread.terminateAllThreads(); + EXITSTATUS = status; + exitRuntime(); + if (Module["onExit"]) + Module["onExit"](status); + ABORT = true; + } + quit_(status, new ExitStatus(status)); + } + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") + Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + if (ENVIRONMENT_IS_PTHREAD) { + noExitRuntime = false; + PThread.initWorker(); + } + run(); + return WasmBackendModuleThreadedSimd2.ready; + }; + }(); + if (typeof exports === "object" && typeof module6 === "object") + module6.exports = WasmBackendModuleThreadedSimd; + else if (typeof define === "function" && define["amd"]) + define([], function() { + return WasmBackendModuleThreadedSimd; + }); + else if (typeof exports === "object") + exports["WasmBackendModuleThreadedSimd"] = WasmBackendModuleThreadedSimd; + } +}); +var require_tfjs_backend_wasm = __commonJS({ + "node_modules/.pnpm/@tensorflow+tfjs-backend-wasm@3.6.0_@tensorflow+tfjs-core@3.6.0/node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"(exports, module6) { + var WasmBackendModule = function() { + var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0; + if (typeof __filename !== "undefined") + _scriptDir = _scriptDir || __filename; + return function(WasmBackendModule2) { + WasmBackendModule2 = WasmBackendModule2 || {}; + var Module = typeof WasmBackendModule2 !== "undefined" ? WasmBackendModule2 : {}; + var readyPromiseResolve, readyPromiseReject; + Module["ready"] = new Promise(function(resolve, reject) { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + var moduleOverrides = {}; + var key; + for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } + } + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = function(status, toThrow) { + throw toThrow; + }; + var ENVIRONMENT_IS_WEB = false; + var ENVIRONMENT_IS_WORKER = false; + var ENVIRONMENT_IS_NODE = false; + var ENVIRONMENT_IS_SHELL = false; + ENVIRONMENT_IS_WEB = typeof window === "object"; + ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; + ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string"; + ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + var scriptDirectory = ""; + function locateFile(path) { + if (Module["locateFile"]) { + return Module["locateFile"](path, scriptDirectory); + } + return scriptDirectory + path; + } + var read_, readAsync, readBinary, setWindowTitle; + var nodeFS; + var nodePath; + if (ENVIRONMENT_IS_NODE) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = require_path().dirname(scriptDirectory) + "/"; + } else { + scriptDirectory = __dirname + "/"; + } + read_ = function shell_read(filename, binary) { + if (!nodeFS) + nodeFS = __require2("fs"); + if (!nodePath) + nodePath = require_path(); + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert3(ret.buffer); + return ret; + }; + if (process["argv"].length > 1) { + thisProgram = process["argv"][1].replace(/\\/g, "/"); + } + arguments_ = process["argv"].slice(2); + process["on"]("uncaughtException", function(ex) { + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + process["on"]("unhandledRejection", abort); + quit_ = function(status) { + process["exit"](status); + }; + Module["inspect"] = function() { + return "[Emscripten Module object]"; + }; + } else if (ENVIRONMENT_IS_SHELL) { + if (typeof read != "undefined") { + read_ = function shell_read(f) { + return read(f); + }; + } + readBinary = function readBinary2(f) { + var data; + if (typeof readbuffer === "function") { + return new Uint8Array(readbuffer(f)); + } + data = read(f, "binary"); + assert3(typeof data === "object"); + return data; + }; + if (typeof scriptArgs != "undefined") { + arguments_ = scriptArgs; + } else if (typeof arguments != "undefined") { + arguments_ = arguments; + } + if (typeof quit === "function") { + quit_ = function(status) { + quit(status); + }; + } + if (typeof print !== "undefined") { + if (typeof console === "undefined") + console = {}; + console.log = print; + console.warn = console.error = typeof printErr !== "undefined" ? printErr : print; + } + } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = self.location.href; + } else if (typeof document !== "undefined" && document.currentScript) { + scriptDirectory = document.currentScript.src; + } + if (_scriptDir) { + scriptDirectory = _scriptDir; + } + if (scriptDirectory.indexOf("blob:") !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1); + } else { + scriptDirectory = ""; + } + { + read_ = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.send(null); + return xhr.responseText; + }; + if (ENVIRONMENT_IS_WORKER) { + readBinary = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return new Uint8Array(xhr.response); + }; + } + readAsync = function(url, onload, onerror) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + xhr.responseType = "arraybuffer"; + xhr.onload = function() { + if (xhr.status == 200 || xhr.status == 0 && xhr.response) { + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + }; + } + setWindowTitle = function(title) { + document.title = title; + }; + } else { + } + var out = Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.warn.bind(console); + for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } + } + moduleOverrides = null; + if (Module["arguments"]) + arguments_ = Module["arguments"]; + if (Module["thisProgram"]) + thisProgram = Module["thisProgram"]; + if (Module["quit"]) + quit_ = Module["quit"]; + var wasmBinary; + if (Module["wasmBinary"]) + wasmBinary = Module["wasmBinary"]; + var noExitRuntime = Module["noExitRuntime"] || true; + if (typeof WebAssembly !== "object") { + abort("no native wasm support detected"); + } + var wasmMemory; + var ABORT = false; + var EXITSTATUS; + function assert3(condition, text) { + if (!condition) { + abort("Assertion failed: " + text); + } + } + function getCFunc(ident) { + var func2 = Module["_" + ident]; + assert3(func2, "Cannot call unknown function " + ident + ", make sure it is exported"); + return func2; + } + function ccall(ident, returnType, argTypes, args, opts) { + var toC = { "string": function(str) { + var ret2 = 0; + if (str !== null && str !== void 0 && str !== 0) { + var len = (str.length << 2) + 1; + ret2 = stackAlloc(len); + stringToUTF8(str, ret2, len); + } + return ret2; + }, "array": function(arr) { + var ret2 = stackAlloc(arr.length); + writeArrayToMemory(arr, ret2); + return ret2; + } }; + function convertReturnValue(ret2) { + if (returnType === "string") + return UTF8ToString(ret2); + if (returnType === "boolean") + return Boolean(ret2); + return ret2; + } + var func2 = getCFunc(ident); + var cArgs = []; + var stack2 = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack2 === 0) + stack2 = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func2.apply(null, cArgs); + ret = convertReturnValue(ret); + if (stack2 !== 0) + stackRestore(stack2); + return ret; + } + function cwrap(ident, returnType, argTypes, opts) { + argTypes = argTypes || []; + var numericArgs = argTypes.every(function(type) { + return type === "number"; + }); + var numericRet = returnType !== "string"; + if (numericRet && numericArgs && !opts) { + return getCFunc(ident); + } + return function() { + return ccall(ident, returnType, argTypes, arguments, opts); + }; + } + var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : void 0; + function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heap[endPtr] && !(endPtr >= endIdx)) + ++endPtr; + if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { + return UTF8Decoder.decode(heap.subarray(idx, endPtr)); + } else { + var str = ""; + while (idx < endPtr) { + var u0 = heap[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heap[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode((u0 & 31) << 6 | u1); + continue; + } + var u2 = heap[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = (u0 & 15) << 12 | u1 << 6 | u2; + } else { + u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63; + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); + } + } + } + return str; + } + function UTF8ToString(ptr, maxBytesToRead) { + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; + } + function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) + return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = 65536 + ((u & 1023) << 10) | u1 & 1023; + } + if (u <= 127) { + if (outIdx >= endIdx) + break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) + break; + heap[outIdx++] = 192 | u >> 6; + heap[outIdx++] = 128 | u & 63; + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) + break; + heap[outIdx++] = 224 | u >> 12; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } else { + if (outIdx + 3 >= endIdx) + break; + heap[outIdx++] = 240 | u >> 18; + heap[outIdx++] = 128 | u >> 12 & 63; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + } + function stringToUTF8(str, outPtr, maxBytesToWrite) { + return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + } + function writeArrayToMemory(array2, buffer3) { + HEAP8.set(array2, buffer3); + } + function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - x % multiple; + } + return x; + } + var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; + function updateGlobalBufferAndViews(buf) { + buffer2 = buf; + Module["HEAP8"] = HEAP8 = new Int8Array(buf); + Module["HEAP16"] = HEAP16 = new Int16Array(buf); + Module["HEAP32"] = HEAP32 = new Int32Array(buf); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); + Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); + Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); + } + var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; + var wasmTable; + var __ATPRERUN__ = []; + var __ATINIT__ = []; + var __ATMAIN__ = []; + var __ATPOSTRUN__ = []; + var runtimeInitialized = false; + __ATINIT__.push({ func: function() { + ___wasm_call_ctors(); + } }); + function preRun() { + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") + Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + function initRuntime() { + runtimeInitialized = true; + callRuntimeCallbacks(__ATINIT__); + } + function preMain() { + callRuntimeCallbacks(__ATMAIN__); + } + function postRun() { + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") + Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + var runDependencies = 0; + var runDependencyWatcher = null; + var dependenciesFulfilled = null; + function addRunDependency(id) { + runDependencies++; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + } + function removeRunDependency(id) { + runDependencies--; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + Module["preloadedImages"] = {}; + Module["preloadedAudios"] = {}; + function abort(what) { + if (Module["onAbort"]) { + Module["onAbort"](what); + } + what += ""; + err(what); + ABORT = true; + EXITSTATUS = 1; + what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject(e); + throw e; + } + function hasPrefix(str, prefix) { + return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0; + } + var dataURIPrefix = "data:application/octet-stream;base64,"; + function isDataURI(filename) { + return hasPrefix(filename, dataURIPrefix); + } + var fileURIPrefix = "file://"; + function isFileURI(filename) { + return hasPrefix(filename, fileURIPrefix); + } + var wasmBinaryFile = "tfjs-backend-wasm.wasm"; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + function getBinary(file) { + try { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } catch (err2) { + abort(err2); + } + } + function getBinaryPromise() { + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch === "function" && !isFileURI(wasmBinaryFile)) { + return fetch(wasmBinaryFile, { credentials: "same-origin" }).then(function(response) { + if (!response["ok"]) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response["arrayBuffer"](); + }).catch(function() { + return getBinary(wasmBinaryFile); + }); + } else { + if (readAsync) { + return new Promise(function(resolve, reject) { + readAsync(wasmBinaryFile, function(response) { + resolve(new Uint8Array(response)); + }, reject); + }); + } + } + } + return Promise.resolve().then(function() { + return getBinary(wasmBinaryFile); + }); + } + function createWasm() { + var info2 = { "a": asmLibraryArg }; + function receiveInstance(instance, module7) { + var exports3 = instance.exports; + Module["asm"] = exports3; + wasmMemory = Module["asm"]["i"]; + updateGlobalBufferAndViews(wasmMemory.buffer); + wasmTable = Module["asm"]["o"]; + removeRunDependency("wasm-instantiate"); + } + addRunDependency("wasm-instantiate"); + function receiveInstantiatedSource(output) { + receiveInstance(output["instance"]); + } + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info2); + }).then(receiver, function(reason) { + err("failed to asynchronously prepare wasm: " + reason); + abort(reason); + }); + } + function instantiateAsync() { + if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === "function") { + return fetch(wasmBinaryFile, { credentials: "same-origin" }).then(function(response) { + var result = WebAssembly.instantiateStreaming(response, info2); + return result.then(receiveInstantiatedSource, function(reason) { + err("wasm streaming compile failed: " + reason); + err("falling back to ArrayBuffer instantiation"); + return instantiateArrayBuffer(receiveInstantiatedSource); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiatedSource); + } + } + if (Module["instantiateWasm"]) { + try { + var exports2 = Module["instantiateWasm"](info2, receiveInstance); + return exports2; + } catch (e) { + err("Module.instantiateWasm callback failed with error: " + e); + return false; + } + } + instantiateAsync().catch(readyPromiseReject); + return {}; + } + function callRuntimeCallbacks(callbacks2) { + while (callbacks2.length > 0) { + var callback = callbacks2.shift(); + if (typeof callback == "function") { + callback(Module); + continue; + } + var func2 = callback.func; + if (typeof func2 === "number") { + if (callback.arg === void 0) { + wasmTable.get(func2)(); + } else { + wasmTable.get(func2)(callback.arg); + } + } else { + func2(callback.arg === void 0 ? null : callback.arg); + } + } + } + function _abort() { + abort(); + } + function _emscripten_memcpy_big(dest, src, num) { + HEAPU8.copyWithin(dest, src, src + num); + } + function _emscripten_get_heap_size() { + return HEAPU8.length; + } + function emscripten_realloc_buffer(size) { + try { + wasmMemory.grow(size - buffer2.byteLength + 65535 >>> 16); + updateGlobalBufferAndViews(wasmMemory.buffer); + return 1; + } catch (e) { + } + } + function _emscripten_resize_heap(requestedSize) { + var oldSize = _emscripten_get_heap_size(); + var maxHeapSize = 2147483648; + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = emscripten_realloc_buffer(newSize); + if (replacement) { + return true; + } + } + return false; + } + var SYSCALLS = { mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) { + var buffer3 = SYSCALLS.buffers[stream]; + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0)); + buffer3.length = 0; + } else { + buffer3.push(curr); + } + }, varargs: void 0, get: function() { + SYSCALLS.varargs += 4; + var ret = HEAP32[SYSCALLS.varargs - 4 >> 2]; + return ret; + }, getStr: function(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, get64: function(low, high) { + return low; + } }; + function _fd_close(fd) { + return 0; + } + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + } + function _fd_write(fd, iov, iovcnt, pnum) { + var num = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[iov + i * 8 >> 2]; + var len = HEAP32[iov + (i * 8 + 4) >> 2]; + for (var j = 0; j < len; j++) { + SYSCALLS.printChar(fd, HEAPU8[ptr + j]); + } + num += len; + } + HEAP32[pnum >> 2] = num; + return 0; + } + function _pthread_create() { + return 6; + } + function setErrNo(value) { + HEAP32[___errno_location() >> 2] = value; + return value; + } + function _sysconf(name6) { + switch (name6) { + case 30: + return 16384; + case 85: + var maxHeapSize = 2147483648; + return maxHeapSize / 16384; + case 132: + case 133: + case 12: + case 137: + case 138: + case 15: + case 235: + case 16: + case 17: + case 18: + case 19: + case 20: + case 149: + case 13: + case 10: + case 236: + case 153: + case 9: + case 21: + case 22: + case 159: + case 154: + case 14: + case 77: + case 78: + case 139: + case 82: + case 68: + case 67: + case 164: + case 11: + case 29: + case 47: + case 48: + case 95: + case 52: + case 51: + case 46: + return 200809; + case 27: + case 246: + case 127: + case 128: + case 23: + case 24: + case 160: + case 161: + case 181: + case 182: + case 242: + case 183: + case 184: + case 243: + case 244: + case 245: + case 165: + case 178: + case 179: + case 49: + case 50: + case 168: + case 169: + case 175: + case 170: + case 171: + case 172: + case 97: + case 76: + case 32: + case 173: + case 35: + case 80: + case 81: + case 79: + return -1; + case 176: + case 177: + case 7: + case 155: + case 8: + case 157: + case 125: + case 126: + case 92: + case 93: + case 129: + case 130: + case 131: + case 94: + case 91: + return 1; + case 74: + case 60: + case 69: + case 70: + case 4: + return 1024; + case 31: + case 42: + case 72: + return 32; + case 87: + case 26: + case 33: + return 2147483647; + case 34: + case 1: + return 47839; + case 38: + case 36: + return 99; + case 43: + case 37: + return 2048; + case 0: + return 2097152; + case 3: + return 65536; + case 28: + return 32768; + case 44: + return 32767; + case 75: + return 16384; + case 39: + return 1e3; + case 89: + return 700; + case 71: + return 256; + case 40: + return 255; + case 2: + return 100; + case 180: + return 64; + case 25: + return 20; + case 5: + return 16; + case 6: + return 6; + case 73: + return 4; + case 84: { + if (typeof navigator === "object") + return navigator["hardwareConcurrency"] || 1; + return 1; + } + } + setErrNo(28); + return -1; + } + var asmLibraryArg = { "a": _abort, "d": _emscripten_memcpy_big, "e": _emscripten_resize_heap, "f": _fd_close, "c": _fd_seek, "b": _fd_write, "g": _pthread_create, "h": _sysconf }; + var asm = createWasm(); + var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { + return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["j"]).apply(null, arguments); + }; + var _init = Module["_init"] = function() { + return (_init = Module["_init"] = Module["asm"]["k"]).apply(null, arguments); + }; + var _register_tensor = Module["_register_tensor"] = function() { + return (_register_tensor = Module["_register_tensor"] = Module["asm"]["l"]).apply(null, arguments); + }; + var _dispose_data = Module["_dispose_data"] = function() { + return (_dispose_data = Module["_dispose_data"] = Module["asm"]["m"]).apply(null, arguments); + }; + var _dispose = Module["_dispose"] = function() { + return (_dispose = Module["_dispose"] = Module["asm"]["n"]).apply(null, arguments); + }; + var _Abs = Module["_Abs"] = function() { + return (_Abs = Module["_Abs"] = Module["asm"]["p"]).apply(null, arguments); + }; + var _Add = Module["_Add"] = function() { + return (_Add = Module["_Add"] = Module["asm"]["q"]).apply(null, arguments); + }; + var _AddN = Module["_AddN"] = function() { + return (_AddN = Module["_AddN"] = Module["asm"]["r"]).apply(null, arguments); + }; + var _All = Module["_All"] = function() { + return (_All = Module["_All"] = Module["asm"]["s"]).apply(null, arguments); + }; + var _Any = Module["_Any"] = function() { + return (_Any = Module["_Any"] = Module["asm"]["t"]).apply(null, arguments); + }; + var _ArgMax = Module["_ArgMax"] = function() { + return (_ArgMax = Module["_ArgMax"] = Module["asm"]["u"]).apply(null, arguments); + }; + var _AvgPool = Module["_AvgPool"] = function() { + return (_AvgPool = Module["_AvgPool"] = Module["asm"]["v"]).apply(null, arguments); + }; + var _BatchMatMul = Module["_BatchMatMul"] = function() { + return (_BatchMatMul = Module["_BatchMatMul"] = Module["asm"]["w"]).apply(null, arguments); + }; + var _Ceil = Module["_Ceil"] = function() { + return (_Ceil = Module["_Ceil"] = Module["asm"]["x"]).apply(null, arguments); + }; + var _ClipByValue = Module["_ClipByValue"] = function() { + return (_ClipByValue = Module["_ClipByValue"] = Module["asm"]["y"]).apply(null, arguments); + }; + var _Conv2D = Module["_Conv2D"] = function() { + return (_Conv2D = Module["_Conv2D"] = Module["asm"]["z"]).apply(null, arguments); + }; + var _Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = function() { + return (_Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = Module["asm"]["A"]).apply(null, arguments); + }; + var _Cos = Module["_Cos"] = function() { + return (_Cos = Module["_Cos"] = Module["asm"]["B"]).apply(null, arguments); + }; + var _CropAndResize = Module["_CropAndResize"] = function() { + return (_CropAndResize = Module["_CropAndResize"] = Module["asm"]["C"]).apply(null, arguments); + }; + var _Cumsum = Module["_Cumsum"] = function() { + return (_Cumsum = Module["_Cumsum"] = Module["asm"]["D"]).apply(null, arguments); + }; + var _DepthToSpace = Module["_DepthToSpace"] = function() { + return (_DepthToSpace = Module["_DepthToSpace"] = Module["asm"]["E"]).apply(null, arguments); + }; + var _DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = function() { + return (_DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = Module["asm"]["F"]).apply(null, arguments); + }; + var _Equal = Module["_Equal"] = function() { + return (_Equal = Module["_Equal"] = Module["asm"]["G"]).apply(null, arguments); + }; + var _Exp = Module["_Exp"] = function() { + return (_Exp = Module["_Exp"] = Module["asm"]["H"]).apply(null, arguments); + }; + var _FlipLeftRight = Module["_FlipLeftRight"] = function() { + return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["I"]).apply(null, arguments); + }; + var _Floor = Module["_Floor"] = function() { + return (_Floor = Module["_Floor"] = Module["asm"]["J"]).apply(null, arguments); + }; + var _FloorDiv = Module["_FloorDiv"] = function() { + return (_FloorDiv = Module["_FloorDiv"] = Module["asm"]["K"]).apply(null, arguments); + }; + var _FusedBatchNorm = Module["_FusedBatchNorm"] = function() { + return (_FusedBatchNorm = Module["_FusedBatchNorm"] = Module["asm"]["L"]).apply(null, arguments); + }; + var _FusedConv2D = Module["_FusedConv2D"] = function() { + return (_FusedConv2D = Module["_FusedConv2D"] = Module["asm"]["M"]).apply(null, arguments); + }; + var _FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = function() { + return (_FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = Module["asm"]["N"]).apply(null, arguments); + }; + var _Gather = Module["_Gather"] = function() { + return (_Gather = Module["_Gather"] = Module["asm"]["O"]).apply(null, arguments); + }; + var _GatherNd = Module["_GatherNd"] = function() { + return (_GatherNd = Module["_GatherNd"] = Module["asm"]["P"]).apply(null, arguments); + }; + var _Greater = Module["_Greater"] = function() { + return (_Greater = Module["_Greater"] = Module["asm"]["Q"]).apply(null, arguments); + }; + var _GreaterEqual = Module["_GreaterEqual"] = function() { + return (_GreaterEqual = Module["_GreaterEqual"] = Module["asm"]["R"]).apply(null, arguments); + }; + var _LeakyRelu = Module["_LeakyRelu"] = function() { + return (_LeakyRelu = Module["_LeakyRelu"] = Module["asm"]["S"]).apply(null, arguments); + }; + var _Less = Module["_Less"] = function() { + return (_Less = Module["_Less"] = Module["asm"]["T"]).apply(null, arguments); + }; + var _LessEqual = Module["_LessEqual"] = function() { + return (_LessEqual = Module["_LessEqual"] = Module["asm"]["U"]).apply(null, arguments); + }; + var _Log = Module["_Log"] = function() { + return (_Log = Module["_Log"] = Module["asm"]["V"]).apply(null, arguments); + }; + var _LogicalAnd = Module["_LogicalAnd"] = function() { + return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["W"]).apply(null, arguments); + }; + var _Max = Module["_Max"] = function() { + return (_Max = Module["_Max"] = Module["asm"]["X"]).apply(null, arguments); + }; + var _MaxPool = Module["_MaxPool"] = function() { + return (_MaxPool = Module["_MaxPool"] = Module["asm"]["Y"]).apply(null, arguments); + }; + var _Maximum = Module["_Maximum"] = function() { + return (_Maximum = Module["_Maximum"] = Module["asm"]["Z"]).apply(null, arguments); + }; + var _Mean = Module["_Mean"] = function() { + return (_Mean = Module["_Mean"] = Module["asm"]["_"]).apply(null, arguments); + }; + var _Min = Module["_Min"] = function() { + return (_Min = Module["_Min"] = Module["asm"]["$"]).apply(null, arguments); + }; + var _Minimum = Module["_Minimum"] = function() { + return (_Minimum = Module["_Minimum"] = Module["asm"]["aa"]).apply(null, arguments); + }; + var _MirrorPad = Module["_MirrorPad"] = function() { + return (_MirrorPad = Module["_MirrorPad"] = Module["asm"]["ba"]).apply(null, arguments); + }; + var _Multiply = Module["_Multiply"] = function() { + return (_Multiply = Module["_Multiply"] = Module["asm"]["ca"]).apply(null, arguments); + }; + var _Neg = Module["_Neg"] = function() { + return (_Neg = Module["_Neg"] = Module["asm"]["da"]).apply(null, arguments); + }; + var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { + return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["ea"]).apply(null, arguments); + }; + var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { + return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["fa"]).apply(null, arguments); + }; + var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { + return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["ga"]).apply(null, arguments); + }; + var _NotEqual = Module["_NotEqual"] = function() { + return (_NotEqual = Module["_NotEqual"] = Module["asm"]["ha"]).apply(null, arguments); + }; + var _OneHot = Module["_OneHot"] = function() { + return (_OneHot = Module["_OneHot"] = Module["asm"]["ia"]).apply(null, arguments); + }; + var _PadV2 = Module["_PadV2"] = function() { + return (_PadV2 = Module["_PadV2"] = Module["asm"]["ja"]).apply(null, arguments); + }; + var _Pow = Module["_Pow"] = function() { + return (_Pow = Module["_Pow"] = Module["asm"]["ka"]).apply(null, arguments); + }; + var _Prelu = Module["_Prelu"] = function() { + return (_Prelu = Module["_Prelu"] = Module["asm"]["la"]).apply(null, arguments); + }; + var _Prod = Module["_Prod"] = function() { + return (_Prod = Module["_Prod"] = Module["asm"]["ma"]).apply(null, arguments); + }; + var _RealDiv = Module["_RealDiv"] = function() { + return (_RealDiv = Module["_RealDiv"] = Module["asm"]["na"]).apply(null, arguments); + }; + var _Relu = Module["_Relu"] = function() { + return (_Relu = Module["_Relu"] = Module["asm"]["oa"]).apply(null, arguments); + }; + var _Relu6 = Module["_Relu6"] = function() { + return (_Relu6 = Module["_Relu6"] = Module["asm"]["pa"]).apply(null, arguments); + }; + var _ResizeBilinear = Module["_ResizeBilinear"] = function() { + return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["qa"]).apply(null, arguments); + }; + var _Reverse = Module["_Reverse"] = function() { + return (_Reverse = Module["_Reverse"] = Module["asm"]["ra"]).apply(null, arguments); + }; + var _RotateWithOffset = Module["_RotateWithOffset"] = function() { + return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["sa"]).apply(null, arguments); + }; + var _Round = Module["_Round"] = function() { + return (_Round = Module["_Round"] = Module["asm"]["ta"]).apply(null, arguments); + }; + var _Rsqrt = Module["_Rsqrt"] = function() { + return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["ua"]).apply(null, arguments); + }; + var _ScatterNd = Module["_ScatterNd"] = function() { + return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["va"]).apply(null, arguments); + }; + var _SelectV2 = Module["_SelectV2"] = function() { + return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["wa"]).apply(null, arguments); + }; + var _Sigmoid = Module["_Sigmoid"] = function() { + return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["xa"]).apply(null, arguments); + }; + var _Sin = Module["_Sin"] = function() { + return (_Sin = Module["_Sin"] = Module["asm"]["ya"]).apply(null, arguments); + }; + var _Softmax = Module["_Softmax"] = function() { + return (_Softmax = Module["_Softmax"] = Module["asm"]["za"]).apply(null, arguments); + }; + var _Sqrt = Module["_Sqrt"] = function() { + return (_Sqrt = Module["_Sqrt"] = Module["asm"]["Aa"]).apply(null, arguments); + }; + var _Square = Module["_Square"] = function() { + return (_Square = Module["_Square"] = Module["asm"]["Ba"]).apply(null, arguments); + }; + var _SquaredDifference = Module["_SquaredDifference"] = function() { + return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["Ca"]).apply(null, arguments); + }; + var _Step = Module["_Step"] = function() { + return (_Step = Module["_Step"] = Module["asm"]["Da"]).apply(null, arguments); + }; + var _StridedSlice = Module["_StridedSlice"] = function() { + return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["Ea"]).apply(null, arguments); + }; + var _Sub = Module["_Sub"] = function() { + return (_Sub = Module["_Sub"] = Module["asm"]["Fa"]).apply(null, arguments); + }; + var _Sum = Module["_Sum"] = function() { + return (_Sum = Module["_Sum"] = Module["asm"]["Ga"]).apply(null, arguments); + }; + var _Tan = Module["_Tan"] = function() { + return (_Tan = Module["_Tan"] = Module["asm"]["Ha"]).apply(null, arguments); + }; + var _Tanh = Module["_Tanh"] = function() { + return (_Tanh = Module["_Tanh"] = Module["asm"]["Ia"]).apply(null, arguments); + }; + var _Tile = Module["_Tile"] = function() { + return (_Tile = Module["_Tile"] = Module["asm"]["Ja"]).apply(null, arguments); + }; + var _TopK = Module["_TopK"] = function() { + return (_TopK = Module["_TopK"] = Module["asm"]["Ka"]).apply(null, arguments); + }; + var _Transform = Module["_Transform"] = function() { + return (_Transform = Module["_Transform"] = Module["asm"]["La"]).apply(null, arguments); + }; + var _Transpose = Module["_Transpose"] = function() { + return (_Transpose = Module["_Transpose"] = Module["asm"]["Ma"]).apply(null, arguments); + }; + var __FusedMatMul = Module["__FusedMatMul"] = function() { + return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["Na"]).apply(null, arguments); + }; + var _malloc = Module["_malloc"] = function() { + return (_malloc = Module["_malloc"] = Module["asm"]["Oa"]).apply(null, arguments); + }; + var _free = Module["_free"] = function() { + return (_free = Module["_free"] = Module["asm"]["Pa"]).apply(null, arguments); + }; + var ___errno_location = Module["___errno_location"] = function() { + return (___errno_location = Module["___errno_location"] = Module["asm"]["Qa"]).apply(null, arguments); + }; + var stackSave = Module["stackSave"] = function() { + return (stackSave = Module["stackSave"] = Module["asm"]["Ra"]).apply(null, arguments); + }; + var stackRestore = Module["stackRestore"] = function() { + return (stackRestore = Module["stackRestore"] = Module["asm"]["Sa"]).apply(null, arguments); + }; + var stackAlloc = Module["stackAlloc"] = function() { + return (stackAlloc = Module["stackAlloc"] = Module["asm"]["Ta"]).apply(null, arguments); + }; + Module["cwrap"] = cwrap; + var calledRun; + function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; + } + dependenciesFulfilled = function runCaller() { + if (!calledRun) + run(); + if (!calledRun) + dependenciesFulfilled = runCaller; + }; + function run(args) { + args = args || arguments_; + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) + return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) + return; + initRuntime(); + preMain(); + readyPromiseResolve(Module); + if (Module["onRuntimeInitialized"]) + Module["onRuntimeInitialized"](); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(function() { + setTimeout(function() { + Module["setStatus"](""); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + Module["run"] = run; + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") + Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + run(); + return WasmBackendModule2.ready; + }; + }(); + if (typeof exports === "object" && typeof module6 === "object") + module6.exports = WasmBackendModule; + else if (typeof define === "function" && define["amd"]) + define([], function() { + return WasmBackendModule; + }); + else if (typeof exports === "object") + exports["WasmBackendModule"] = WasmBackendModule; + } +}); +var require_alea2 = __commonJS({ + "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/alea.js"(exports, module6) { + (function(global2, module7, define2) { + function Alea(seed) { + var me = this, mash = Mash(); + me.next = function() { + var t = 2091639 * me.s0 + me.c * 23283064365386963e-26; + me.s0 = me.s1; + me.s1 = me.s2; + return me.s2 = t - (me.c = t | 0); + }; + me.c = 1; + me.s0 = mash(" "); + me.s1 = mash(" "); + me.s2 = mash(" "); + me.s0 -= mash(seed); + if (me.s0 < 0) { + me.s0 += 1; + } + me.s1 -= mash(seed); + if (me.s1 < 0) { + me.s1 += 1; + } + me.s2 -= mash(seed); + if (me.s2 < 0) { + me.s2 += 1; + } + mash = null; + } + function copy(f, t) { + t.c = f.c; + t.s0 = f.s0; + t.s1 = f.s1; + t.s2 = f.s2; + return t; + } + function impl(seed, opts) { + var xg = new Alea(seed), state = opts && opts.state, prng = xg.next; + prng.int32 = function() { + return xg.next() * 4294967296 | 0; + }; + prng.double = function() { + return prng() + (prng() * 2097152 | 0) * 11102230246251565e-32; + }; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + function Mash() { + var n = 4022871197; + var mash = function(data) { + data = String(data); + for (var i = 0; i < data.length; i++) { + n += data.charCodeAt(i); + var h = 0.02519603282416938 * n; + n = h >>> 0; + h -= n; + h *= n; + n = h >>> 0; + h -= n; + n += h * 4294967296; + } + return (n >>> 0) * 23283064365386963e-26; + }; + return mash; + } + if (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.alea = impl; + } + })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); + } +}); +var require_xor1282 = __commonJS({ + "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xor128.js"(exports, module6) { + (function(global2, module7, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.next = function() { + var t = me.x ^ me.x << 11; + me.x = me.y; + me.y = me.z; + me.z = me.w; + return me.w ^= me.w >>> 19 ^ t ^ t >>> 8; + }; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor128 = impl; + } + })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); + } +}); +var require_xorwow2 = __commonJS({ + "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xorwow.js"(exports, module6) { + (function(global2, module7, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var t = me.x ^ me.x >>> 2; + me.x = me.y; + me.y = me.z; + me.z = me.w; + me.w = me.v; + return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t ^ t << 1)) | 0; + }; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.v = 0; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + if (k == strseed.length) { + me.d = me.x << 10 ^ me.x >>> 4; + } + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + t.v = f.v; + t.d = f.d; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorwow = impl; + } + })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); + } +}); +var require_xorshift72 = __commonJS({ + "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xorshift7.js"(exports, module6) { + (function(global2, module7, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var X = me.x, i = me.i, t, v, w; + t = X[i]; + t ^= t >>> 7; + v = t ^ t << 24; + t = X[i + 1 & 7]; + v ^= t ^ t >>> 10; + t = X[i + 3 & 7]; + v ^= t ^ t >>> 3; + t = X[i + 4 & 7]; + v ^= t ^ t << 7; + t = X[i + 7 & 7]; + t = t ^ t << 13; + v ^= t ^ t << 9; + X[i] = v; + me.i = i + 1 & 7; + return v; + }; + function init2(me2, seed2) { + var j, w, X = []; + if (seed2 === (seed2 | 0)) { + w = X[0] = seed2; + } else { + seed2 = "" + seed2; + for (j = 0; j < seed2.length; ++j) { + X[j & 7] = X[j & 7] << 15 ^ seed2.charCodeAt(j) + X[j + 1 & 7] << 13; + } + } + while (X.length < 8) + X.push(0); + for (j = 0; j < 8 && X[j] === 0; ++j) + ; + if (j == 8) + w = X[7] = -1; + else + w = X[j]; + me2.x = X; + me2.i = 0; + for (j = 256; j > 0; --j) { + me2.next(); + } + } + init2(me, seed); + } + function copy(f, t) { + t.x = f.x.slice(); + t.i = f.i; + return t; + } + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.x) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorshift7 = impl; + } + })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); + } +}); +var require_xor40962 = __commonJS({ + "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xor4096.js"(exports, module6) { + (function(global2, module7, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var w = me.w, X = me.X, i = me.i, t, v; + me.w = w = w + 1640531527 | 0; + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + v = X[i] = v ^ t; + me.i = i; + return v + (w ^ w >>> 16) | 0; + }; + function init2(me2, seed2) { + var t, v, i, j, w, X = [], limit = 128; + if (seed2 === (seed2 | 0)) { + v = seed2; + seed2 = null; + } else { + seed2 = seed2 + "\0"; + v = 0; + limit = Math.max(limit, seed2.length); + } + for (i = 0, j = -32; j < limit; ++j) { + if (seed2) + v ^= seed2.charCodeAt((j + 32) % seed2.length); + if (j === 0) + w = v; + v ^= v << 10; + v ^= v >>> 15; + v ^= v << 4; + v ^= v >>> 13; + if (j >= 0) { + w = w + 1640531527 | 0; + t = X[j & 127] ^= v + w; + i = t == 0 ? i + 1 : 0; + } + } + if (i >= 128) { + X[(seed2 && seed2.length || 0) & 127] = -1; + } + i = 127; + for (j = 4 * 128; j > 0; --j) { + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + X[i] = v ^ t; + } + me2.w = w; + me2.X = X; + me2.i = i; + } + init2(me, seed); + } + function copy(f, t) { + t.i = f.i; + t.w = f.w; + t.X = f.X.slice(); + return t; + } + ; + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.X) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor4096 = impl; + } + })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); + } +}); +var require_tychei2 = __commonJS({ + "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/tychei.js"(exports, module6) { + (function(global2, module7, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var b = me.b, c = me.c, d = me.d, a = me.a; + b = b << 25 ^ b >>> 7 ^ c; + c = c - d | 0; + d = d << 24 ^ d >>> 8 ^ a; + a = a - b | 0; + me.b = b = b << 20 ^ b >>> 12 ^ c; + me.c = c = c - d | 0; + me.d = d << 16 ^ c >>> 16 ^ a; + return me.a = a - b | 0; + }; + me.a = 0; + me.b = 0; + me.c = 2654435769 | 0; + me.d = 1367130551; + if (seed === Math.floor(seed)) { + me.a = seed / 4294967296 | 0; + me.b = seed | 0; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 20; k++) { + me.b ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.a = f.a; + t.b = f.b; + t.c = f.c; + t.d = f.d; + return t; + } + ; + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.tychei = impl; + } + })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); + } +}); +var require_seedrandom3 = __commonJS({ + "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/seedrandom.js"(exports, module6) { + (function(global2, pool3, math) { + var width = 256, chunks = 6, digits = 52, rngname = "random", startdenom = math.pow(width, chunks), significance = math.pow(2, digits), overflow = significance * 2, mask = width - 1, nodecrypto; + function seedrandom5(seed, options2, callback) { + var key = []; + options2 = options2 == true ? { entropy: true } : options2 || {}; + var shortseed = mixkey(flatten4(options2.entropy ? [seed, tostring(pool3)] : seed == null ? autoseed() : seed, 3), key); + var arc4 = new ARC4(key); + var prng = function() { + var n = arc4.g(chunks), d = startdenom, x = 0; + while (n < significance) { + n = (n + x) * width; + d *= width; + x = arc4.g(1); + } + while (n >= overflow) { + n /= 2; + d /= 2; + x >>>= 1; + } + return (n + x) / d; + }; + prng.int32 = function() { + return arc4.g(4) | 0; + }; + prng.quick = function() { + return arc4.g(4) / 4294967296; + }; + prng.double = prng; + mixkey(tostring(arc4.S), pool3); + return (options2.pass || callback || function(prng2, seed2, is_math_call, state) { + if (state) { + if (state.S) { + copy(state, arc4); + } + prng2.state = function() { + return copy(arc4, {}); + }; + } + if (is_math_call) { + math[rngname] = prng2; + return seed2; + } else + return prng2; + })(prng, shortseed, "global" in options2 ? options2.global : this == math, options2.state); + } + function ARC4(key) { + var t, keylen = key.length, me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; + if (!keylen) { + key = [keylen++]; + } + while (i < width) { + s[i] = i++; + } + for (i = 0; i < width; i++) { + s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])]; + s[j] = t; + } + (me.g = function(count22) { + var t2, r = 0, i2 = me.i, j2 = me.j, s2 = me.S; + while (count22--) { + t2 = s2[i2 = mask & i2 + 1]; + r = r * width + s2[mask & (s2[i2] = s2[j2 = mask & j2 + t2]) + (s2[j2] = t2)]; + } + me.i = i2; + me.j = j2; + return r; + })(width); + } + function copy(f, t) { + t.i = f.i; + t.j = f.j; + t.S = f.S.slice(); + return t; + } + ; + function flatten4(obj, depth) { + var result = [], typ = typeof obj, prop; + if (depth && typ == "object") { + for (prop in obj) { + try { + result.push(flatten4(obj[prop], depth - 1)); + } catch (e) { + } + } + } + return result.length ? result : typ == "string" ? obj : obj + "\0"; + } + function mixkey(seed, key) { + var stringseed = seed + "", smear, j = 0; + while (j < stringseed.length) { + key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++); + } + return tostring(key); + } + function autoseed() { + try { + var out; + if (nodecrypto && (out = nodecrypto.randomBytes)) { + out = out(width); + } else { + out = new Uint8Array(width); + (global2.crypto || global2.msCrypto).getRandomValues(out); + } + return tostring(out); + } catch (e) { + var browser4 = global2.navigator, plugins = browser4 && browser4.plugins; + return [+new Date(), global2, plugins, global2.screen, tostring(pool3)]; + } + } + function tostring(a) { + return String.fromCharCode.apply(0, a); + } + mixkey(math.random(), pool3); + if (typeof module6 == "object" && module6.exports) { + module6.exports = seedrandom5; + try { + nodecrypto = require_crypto(); + } catch (ex) { + } + } else if (typeof define == "function" && define.amd) { + define(function() { + return seedrandom5; + }); + } else { + math["seed" + rngname] = seedrandom5; + } + })(typeof self !== "undefined" ? self : exports, [], Math); + } +}); +var require_seedrandom4 = __commonJS({ + "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/index.js"(exports, module6) { + var alea5 = require_alea2(); + var xor128 = require_xor1282(); + var xorwow = require_xorwow2(); + var xorshift7 = require_xorshift72(); + var xor4096 = require_xor40962(); + var tychei = require_tychei2(); + var sr = require_seedrandom3(); + sr.alea = alea5; + sr.xor128 = xor128; + sr.xorwow = xorwow; + sr.xorshift7 = xorshift7; + sr.xor4096 = xor4096; + sr.tychei = tychei; + module6.exports = sr; + } +}); +var require_string_decoder = __commonJS({ + "(disabled):node_modules/.pnpm/string_decoder@1.1.1/node_modules/string_decoder/lib/string_decoder.js"() { + } +}); +var package_exports = {}; +__export2(package_exports, { + bin: () => bin, + browser: () => browser, + default: () => package_default, + dependencies: () => dependencies, + description: () => description, + devDependencies: () => devDependencies, + jsdelivr: () => jsdelivr, + license: () => license, + main: () => main, + miniprogram: () => miniprogram, + module: () => module, + name: () => name, + private: () => private2, + repository: () => repository, + scripts: () => scripts, + types: () => types, + unpkg: () => unpkg, + version: () => version +}); +var name = "@tensorflow/tfjs"; +var version = "3.6.0"; +var description = "An open-source machine learning framework."; +var private2 = false; +var main = "dist/tf.node.js"; +var module = "dist/index.js"; +var jsdelivr = "dist/tf.min.js"; +var unpkg = "dist/tf.min.js"; +var types = "dist/index.d.ts"; +var miniprogram = "dist/miniprogram"; +var bin = { + "tfjs-custom-module": "dist/tools/custom_module/cli.js" +}; +var repository = { + type: "git", + url: "https://github.com/tensorflow/tfjs.git" +}; +var license = "Apache-2.0"; +var devDependencies = { + "@babel/core": "^7.9.0", + "@babel/polyfill": "^7.10.4", + "@babel/preset-env": "^7.9.5", + "@rollup/plugin-commonjs": "^11.0.2", + "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/plugin-typescript": "^3.0.0", + "@types/argparse": "^1.0.38", + "@types/jasmine": "2.8.7", + "@types/node": "~10.17.50", + "@types/shelljs": "^0.8.4", + "@types/yargs": "^15.0.7", + "clang-format": "~1.2.2", + commander: "~2.14.1", + jasmine: "3.1.0", + "jasmine-core": "~3.1.0", + karma: "~6.3.2", + "karma-browserstack-launcher": "~1.6.0", + "karma-chrome-launcher": "~2.2.0", + "karma-firefox-launcher": "~1.1.0", + "karma-jasmine": "~1.1.1", + "karma-typescript": "~5.5.1", + "karma-typescript-es6-transform": "^5.5.1", + "npm-run-all": "~4.1.3", + rimraf: "~2.6.2", + rollup: "~2.3.2", + "rollup-plugin-babel": "^4.4.0", + "rollup-plugin-terser": "~7.0.2", + "rollup-plugin-visualizer": "~4.2.2", + shelljs: "~0.8.1", + "ts-node": "~8.8.2", + tslint: "~5.11.0", + "tslint-no-circular-imports": "~0.5.0", + typescript: "3.5.3", + yalc: "1.0.0-pre.50" +}; +var scripts = { + build: "tsc && yarn build-cli && yarn bundle", + "build-ci": "tsc && yarn build-cli && yarn bundle-ci", + bundle: "rollup -c", + "bundle-ci": "rollup -c --ci", + "build-core": "cd ../tfjs-core && yarn && yarn build", + "build-core-ci": "cd ../tfjs-core && yarn && yarn build-ci", + "build-layers": "cd ../tfjs-layers && yarn && yarn build", + "build-layers-ci": "cd ../tfjs-layers && yarn && yarn build-ci", + "build-converter": "cd ../tfjs-converter && yarn && yarn build", + "build-converter-ci": "cd ../tfjs-converter && yarn && yarn build-ci", + "build-data": "cd ../tfjs-data && yarn && yarn build", + "build-data-ci": "cd ../tfjs-data && yarn && yarn build-ci", + "build-backend-cpu": "cd ../tfjs-backend-cpu && yarn && yarn build", + "build-backend-cpu-ci": "cd ../tfjs-backend-cpu && yarn && yarn build-ci", + "build-backend-webgl": "cd ../tfjs-backend-webgl && yarn && yarn build", + "build-backend-webgl-ci": "cd ../tfjs-backend-webgl && yarn && yarn build-ci", + "build-deps": "yarn build-core && yarn build-layers && yarn build-converter && yarn build-data && yarn build-backend-cpu && yarn build-backend-webgl", + "build-deps-ci": "yarn build-core-ci && yarn build-layers-ci && yarn build-converter-ci && yarn build-data-ci && yarn build-backend-cpu-ci && yarn build-backend-webgl-ci", + "build-cli": "tsc --project ./tools/custom_module/tsconfig.json && chmod +x ./dist/tools/custom_module/cli.js", + "run-custom-build": "ts-node -s ./tools/custom_module/cli.ts", + "build-npm": "./scripts/build-npm.sh", + "link-local": "yalc link", + "publish-local": "yarn build-npm && yalc push", + "publish-npm": "npm publish", + lint: "tslint -p . -t verbose", + coverage: "KARMA_COVERAGE=1 karma start --browsers='Chrome' --singleRun", + test: "yarn && yarn build-deps && yarn build && karma start", + "test-dev": "karma start", + "test-tools": "ts-node --project ./tools/custom_module/tsconfig.json run_tools_tests.ts", + "test-ci": "./scripts/test-ci.sh" +}; +var dependencies = { + "@tensorflow/tfjs-backend-cpu": "3.6.0", + "@tensorflow/tfjs-backend-webgl": "3.6.0", + "@tensorflow/tfjs-converter": "3.6.0", + "@tensorflow/tfjs-core": "3.6.0", + "@tensorflow/tfjs-data": "3.6.0", + "@tensorflow/tfjs-layers": "3.6.0", + argparse: "^1.0.10", + chalk: "^4.1.0", + "core-js": "3", + "regenerator-runtime": "^0.13.5", + yargs: "^16.0.3" +}; +var browser = { + "node-fetch": false, + util: false, + crypto: false +}; +var package_default = { + name, + version, + description, + private: private2, + main, + module, + jsdelivr, + unpkg, + types, + miniprogram, + bin, + repository, + license, + devDependencies, + scripts, + dependencies, + browser +}; +var package_exports2 = {}; +__export2(package_exports2, { + browser: () => browser2, + default: () => package_default2, + dependencies: () => dependencies2, + description: () => description2, + devDependencies: () => devDependencies2, + engines: () => engines, + jsdelivr: () => jsdelivr2, + "jsnext:main": () => jsnext_main, + license: () => license2, + main: () => main2, + miniprogram: () => miniprogram2, + module: () => module2, + name: () => name2, + private: () => private3, + repository: () => repository2, + scripts: () => scripts2, + sideEffects: () => sideEffects, + types: () => types2, + unpkg: () => unpkg2, + version: () => version2 +}); +var name2 = "@tensorflow/tfjs-core"; +var version2 = "3.6.0"; +var description2 = "Hardware-accelerated JavaScript library for machine intelligence"; +var private3 = false; +var main2 = "dist/tf-core.node.js"; +var jsdelivr2 = "dist/tf-core.min.js"; +var unpkg2 = "dist/tf-core.min.js"; +var types2 = "dist/index.d.ts"; +var jsnext_main = "dist/index.js"; +var module2 = "dist/index.js"; +var miniprogram2 = "dist/miniprogram"; +var engines = { + yarn: ">= 1.3.2" +}; +var repository2 = { + type: "git", + url: "https://github.com/tensorflow/tfjs-core.git" +}; +var license2 = "Apache-2.0"; +var devDependencies2 = { + "@bazel/bazelisk": "^1.3.0", + "@bazel/typescript": "^0.27.8", + "@rollup/plugin-commonjs": "^11.0.2", + "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/plugin-typescript": "^3.0.0", + "@tensorflow/tfjs-backend-cpu": "link:../tfjs-backend-cpu", + "@types/jasmine": "~3.0.0", + "@types/node": "~9.6.0", + "@types/node-fetch": "~2.1.2", + "clang-format": "~1.2.4", + jasmine: "~3.1.0", + "jasmine-core": "~3.1.0", + karma: "6.3.2", + "karma-browserstack-launcher": "~1.6.0", + "karma-chrome-launcher": "~3.1.0", + "karma-jasmine": "~4.0.1", + "karma-typescript": "~5.5.1", + "npm-run-all": "~4.1.3", + rimraf: "~2.6.2", + rollup: "~2.3.2", + "rollup-plugin-terser": "~5.3.0", + "rollup-plugin-visualizer": "~3.3.2", + shelljs: "~0.8.3", + "ts-node": "~8.8.2", + tslint: "~5.11.0", + "tslint-no-circular-imports": "~0.5.0", + typescript: "3.5.3", + yalc: "~1.0.0-pre.21", + yargs: "~13.2.2" +}; +var scripts2 = { + "build-ci": "./scripts/enumerate-tests.js --ci && tsc && yarn bundle-ci && yarn build-test-snippets", + build: "node ./scripts/enumerate-tests.js && tsc && yarn bundle", + bundle: "rollup -c", + "bundle-ci": "rollup -c --ci", + "build-npm": "./scripts/build-npm.sh", + "build-deps": "yarn build && yarn build-cpu-backend", + "build-cpu-backend": "cd ../tfjs-backend-cpu && yarn && yarn build", + "build-cpu-backend-ci": "cd ../tfjs-backend-cpu && yarn && yarn build-ci", + "build:bazel": "bazelisk build //...", + "build-test-snippets": "yarn tsc --project ./scripts/test_snippets/tsconfig.json", + "format-all": "clang-format -i -style=Google --glob=src/**/*.ts", + "link-local": "yalc link", + "publish-local": "rimraf dist/ && yarn build && rollup -c && yalc push", + "publish-npm": "npm publish", + lint: "tslint -p . -t verbose", + coverage: "KARMA_COVERAGE=1 karma start --browsers='Chrome' --singleRun", + test: "yarn && yarn build-deps && karma start", + "test-dev": "karma start", + "test-ci": "./scripts/test-ci.sh", + "test-webworker": "karma start --worker", + "run-browserstack": "karma start --browserstack", + "test-bundle-size": "./scripts/test-bundle-size.js", + "test-node": "rimraf dist/ && yarn build-deps && yarn build && ts-node --transpile-only --skip-ignore -P tsconfig.test.json dist/test_node.js", + "test-node-dev": "tsc && ts-node --transpile-only --skip-ignore -P tsconfig.test.json dist/test_node.js", + "test-node-ci": "ts-node --transpile-only -P tsconfig.test.json dist/test_node.js", + "test-async-backends": "rimraf dist/ && yarn build && ts-node --transpile-only -P tsconfig.test.json dist/test_async_backends.js", + "test-async-backends-ci": "ts-node --transpile-only -P tsconfig.test.json dist/test_async_backends.js", + "test-snippets": "yarn build && yarn build-cpu-backend && ts-node -P tsconfig.test.json ./scripts/test_snippets/test_snippets.ts", + "test-snippets-ci": "ts-node -P tsconfig.test.json ./scripts/test_snippets/test_snippets.ts" +}; +var dependencies2 = { + "@types/offscreencanvas": "~2019.3.0", + "@types/seedrandom": "2.4.27", + "@types/webgl-ext": "0.0.30", + "node-fetch": "~2.6.1", + seedrandom: "2.4.3" +}; +var browser2 = { + "node-fetch": false, + util: false, + crypto: false, + worker_threads: false +}; +var sideEffects = [ + "./dist/index.js", + "./dist/engine.js", + "./dist/tensor.js", + "./dist/base_side_effects.js", + "./dist/flags.js", + "./dist/platforms/*.js", + "./dist/register_all_gradients.js", + "./dist/public/chained_ops/*.js", + "./dist/io/*.js" +]; +var package_default2 = { + name: name2, + version: version2, + description: description2, + private: private3, + main: main2, + jsdelivr: jsdelivr2, + unpkg: unpkg2, + types: types2, + "jsnext:main": jsnext_main, + module: module2, + miniprogram: miniprogram2, + engines, + repository: repository2, + license: license2, + devDependencies: devDependencies2, + scripts: scripts2, + dependencies: dependencies2, + browser: browser2, + sideEffects +}; +var package_exports3 = {}; +__export2(package_exports3, { + browser: () => browser3, + default: () => package_default3, + dependencies: () => dependencies3, + description: () => description3, + devDependencies: () => devDependencies3, + jsdelivr: () => jsdelivr3, + "jsnext:main": () => jsnext_main2, + license: () => license3, + main: () => main3, + miniprogram: () => miniprogram3, + module: () => module3, + name: () => name3, + peerDependencies: () => peerDependencies, + private: () => private4, + scripts: () => scripts3, + types: () => types3, + unpkg: () => unpkg3, + version: () => version3 +}); +var name3 = "@tensorflow/tfjs-data"; +var version3 = "3.6.0"; +var description3 = "TensorFlow Data API in JavaScript"; +var private4 = false; +var main3 = "dist/tf-data.node.js"; +var jsdelivr3 = "dist/tf-data.min.js"; +var unpkg3 = "dist/tf-data.min.js"; +var types3 = "dist/index.d.ts"; +var jsnext_main2 = "dist/index.js"; +var module3 = "dist/index.js"; +var miniprogram3 = "dist/miniprogram"; +var license3 = "Apache-2.0"; +var devDependencies3 = { + "@rollup/plugin-commonjs": "^11.0.2", + "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/plugin-typescript": "^3.0.0", + "@tensorflow/tfjs-backend-cpu": "3.6.0", + "@tensorflow/tfjs-core": "3.6.0", + "@tensorflow/tfjs-layers": "3.6.0", + "@types/jasmine": "~2.5.53", + "@types/seedrandom": "^2.4.27", + "@types/utf8": "~2.1.6", + "clang-format": "~1.2.2", + "http-server": "~0.12.3", + jasmine: "3.1.0", + "jasmine-core": "~3.1.0", + karma: "~6.3.1", + "karma-chrome-launcher": "~2.2.0", + "karma-firefox-launcher": "~1.1.0", + "karma-jasmine": "~1.1.1", + "karma-typescript": "~5.5.1", + "karma-typescript-es6-transform": "^5.0.2", + nyc: "^15.1.0", + rimraf: "~2.6.2", + rollup: "~2.3.2", + "rollup-plugin-terser": "~7.0.2", + "rollup-plugin-visualizer": "~3.3.2", + "ts-node": "~7.0.0", + tslint: "~6.1.3", + "tslint-no-circular-imports": "^0.7.0", + typescript: "3.5.3", + yalc: "^1.0.0-pre.50" +}; +var scripts3 = { + build: "tsc && yarn bundle", + "build-ci": "tsc && yarn bundle-ci", + bundle: "rollup -c", + "bundle-ci": "rollup -c --ci", + "build-core": "cd ../tfjs-core && yarn && yarn build", + "build-core-ci": "cd ../tfjs-core && yarn && yarn build-ci", + "build-layers": "cd ../tfjs-layers && yarn && yarn build", + "build-backend-cpu": "cd ../tfjs-backend-cpu && yarn && yarn build", + "build-backend-cpu-ci": "cd ../tfjs-backend-cpu && yarn && yarn build-ci", + "build-layers-ci": "cd ../tfjs-layers && yarn && yarn build-ci", + "build-deps": "yarn build-core && yarn build-layers && yarn build-backend-cpu", + "build-deps-ci": "yarn build-core-ci && yarn build-layers-ci && yarn build-backend-cpu-ci", + "build-npm": "./scripts/build-npm.sh", + "link-local": "yalc link", + "publish-local": "rimraf dist/ && yarn build-npm && yalc push", + "publish-npm": "npm publish", + test: "yarn && yarn build-deps && yarn build && ts-node --transpile-only --project tsconfig.test.json src/test_node.ts", + "test-dev": "tsc && ts-node --transpile-only --project tsconfig.test.json src/test_node.ts", + "test-browsers": "karma start --browsers='Chrome,Firefox'", + "test-ci": "ts-node --transpile-only --skip-ignore -P tsconfig.test.json src/test_node.ts", + "test-snippets": "yarn && yarn build-deps && yarn build && ts-node --skip-ignore --project tsconfig.test.json ./scripts/test_snippets.ts", + "test-snippets-ci": "ts-node --skip-ignore --project tsconfig.test.json ./scripts/test_snippets.ts", + coverage: "yarn nyc yarn ts-node --transpile-only -P tsconfig.test.json src/test_node.ts", + lint: "tslint -p . -t verbose" +}; +var peerDependencies = { + "@tensorflow/tfjs-core": "3.6.0", + seedrandom: "~2.4.3" +}; +var dependencies3 = { + "@types/node-fetch": "^2.1.2", + "node-fetch": "~2.6.1" +}; +var browser3 = { + fs: false, + "node-fetch": false, + string_decoder: false, + crypto: false +}; +var package_default3 = { + name: name3, + version: version3, + description: description3, + private: private4, + main: main3, + jsdelivr: jsdelivr3, + unpkg: unpkg3, + types: types3, + "jsnext:main": jsnext_main2, + module: module3, + miniprogram: miniprogram3, + license: license3, + devDependencies: devDependencies3, + scripts: scripts3, + peerDependencies, + dependencies: dependencies3, + browser: browser3 +}; +var package_exports4 = {}; +__export2(package_exports4, { + default: () => package_default4, + description: () => description4, + devDependencies: () => devDependencies4, + jsdelivr: () => jsdelivr4, + "jsnext:main": () => jsnext_main3, + license: () => license4, + main: () => main4, + miniprogram: () => miniprogram4, + module: () => module4, + name: () => name4, + peerDependencies: () => peerDependencies2, + private: () => private5, + scripts: () => scripts4, + types: () => types4, + unpkg: () => unpkg4, + version: () => version4 +}); +var name4 = "@tensorflow/tfjs-layers"; +var version4 = "3.6.0"; +var description4 = "TensorFlow layers API in JavaScript"; +var license4 = "Apache-2.0 AND MIT"; +var private5 = false; +var main4 = "dist/tf-layers.node.js"; +var types4 = "dist/index.d.ts"; +var jsnext_main3 = "dist/index.js"; +var module4 = "dist/index.js"; +var jsdelivr4 = "dist/tf-layers.min.js"; +var unpkg4 = "dist/tf-layers.min.js"; +var miniprogram4 = "dist/miniprogram"; +var devDependencies4 = { + "@babel/polyfill": "^7.8.7", + "@rollup/plugin-commonjs": "^11.0.2", + "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/plugin-typescript": "^3.0.0", + "@tensorflow/tfjs-backend-cpu": "3.6.0", + "@tensorflow/tfjs-backend-webgl": "3.6.0", + "@tensorflow/tfjs-core": "3.6.0", + "@types/jasmine": "~2.5.53", + "clang-format": "~1.2.2", + "http-server": "~0.12.3", + jasmine: "~3.1.0", + "jasmine-core": "~3.1.0", + karma: "~6.3.1", + "karma-browserstack-launcher": "~1.6.0", + "karma-chrome-launcher": "~2.2.0", + "karma-firefox-launcher": "~1.1.0", + "karma-jasmine": "~1.1.1", + "karma-typescript": "~5.5.1", + "karma-typescript-es6-transform": "^5.0.2", + rimraf: "~2.6.2", + rollup: "~2.3.2", + "rollup-plugin-terser": "~7.0.2", + "rollup-plugin-visualizer": "~3.3.2", + "ts-node": "~8.8.2", + tslint: "~6.1.3", + "tslint-no-circular-imports": "^0.7.0", + typescript: "3.5.3", + yalc: "~1.0.0-pre.50" +}; +var scripts4 = { + prep: "yarn install && yarn build-ci", + build: "tsc && yarn bundle", + "build-ci": "tsc && yarn bundle-ci", + bundle: "rollup -c", + "bundle-ci": "rollup -c --ci", + "build-core": "cd ../tfjs-core && yarn && yarn build", + "build-backend-cpu": "cd ../tfjs-backend-cpu && yarn && yarn build", + "build-backend-cpu-ci": "cd ../tfjs-backend-cpu && yarn && yarn build-ci", + "build-backend-webgl": "cd ../tfjs-backend-webgl && yarn && yarn build", + "build-backend-webgl-ci": "cd ../tfjs-backend-webgl && yarn && yarn build-ci", + "build-core-ci": "cd ../tfjs-core && yarn && yarn build-ci", + "build-deps": "yarn build-core && yarn build-backend-cpu && yarn build-backend-webgl", + "build-deps-ci": "yarn build-core-ci && yarn build-backend-cpu-ci && yarn build-backend-webgl-ci", + "build-npm": "./scripts/build-npm.sh", + format: "./tools/clang_format_ts.sh", + "link-local": "yalc link", + "publish-local": "yarn build-npm && yalc push", + "publish-npm": "npm publish", + coverage: "KARMA_COVERAGE=1 karma start --browsers='Chrome' --singleRun", + test: "yarn && yarn build-deps && karma start", + "test-dev": "karma start", + "test-ci": "./scripts/test-ci.sh", + "test-snippets": "yarn && yarn build-deps && yarn build && ts-node --skip-ignore -s ./scripts/test_snippets.ts", + "test-snippets-ci": "ts-node --skip-ignore -s ./scripts/test_snippets.ts", + "run-browserstack": "karma start --browsers='bs_chrome_mac' --singleRun --reporters='dots,karma-typescript'", + lint: "tslint -p . -t verbose" +}; +var peerDependencies2 = { + "@tensorflow/tfjs-core": "3.6.0" +}; +var package_default4 = { + name: name4, + version: version4, + description: description4, + license: license4, + private: private5, + main: main4, + types: types4, + "jsnext:main": jsnext_main3, + module: module4, + jsdelivr: jsdelivr4, + unpkg: unpkg4, + miniprogram: miniprogram4, + devDependencies: devDependencies4, + scripts: scripts4, + peerDependencies: peerDependencies2 +}; +var package_exports5 = {}; +__export2(package_exports5, { + default: () => package_default5, + description: () => description5, + devDependencies: () => devDependencies5, + jsdelivr: () => jsdelivr5, + "jsnext:main": () => jsnext_main4, + license: () => license5, + main: () => main5, + miniprogram: () => miniprogram5, + module: () => module5, + name: () => name5, + peerDependencies: () => peerDependencies3, + repository: () => repository3, + scripts: () => scripts5, + types: () => types5, + unpkg: () => unpkg5, + version: () => version5 +}); +var name5 = "@tensorflow/tfjs-converter"; +var version5 = "3.6.0"; +var description5 = "Tensorflow model converter for javascript"; +var main5 = "dist/tf-converter.node.js"; +var jsnext_main4 = "dist/index.js"; +var module5 = "dist/index.js"; +var types5 = "dist/index.d.ts"; +var unpkg5 = "dist/tf-converter.min.js"; +var jsdelivr5 = "dist/tf-converter.min.js"; +var miniprogram5 = "dist/miniprogram"; +var repository3 = { + type: "git", + url: "https://github.com/tensorflow/tfjs-converter.git" +}; +var license5 = "Apache-2.0"; +var peerDependencies3 = { + "@tensorflow/tfjs-core": "3.6.0" +}; +var devDependencies5 = { + "@rollup/plugin-commonjs": "^11.0.2", + "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/plugin-replace": "^2.3.3", + "@rollup/plugin-typescript": "^3.0.0", + "@tensorflow/tfjs-backend-cpu": "3.6.0", + "@tensorflow/tfjs-core": "3.6.0", + "@types/argparse": "^1.0.38", + "@types/deep-equal": "^1.0.1", + "@types/jasmine": "~2.8.6", + "@types/long": "~3.0.32", + "@types/node-fetch": "1.6.9", + ajv: "~6.3.0", + argparse: "^1.0.10", + "babel-core": "~6.26.3", + "babel-plugin-external-helpers": "~6.22.0", + "babel-preset-env": "~1.7.0", + "clang-format": "~1.2.2", + copyfiles: "~1.2.0", + "deep-equal": "^1.0.1", + "jasmine-core": "~3.5.0", + "node-fetch": "~2.6.1", + opn: "~5.1.0", + protobufjs: "~6.8.6", + rimraf: "~2.6.2", + rollup: "~2.3.2", + "rollup-plugin-terser": "~7.0.2", + "rollup-plugin-visualizer": "~3.3.2", + "ts-morph": "^7.1.3", + "ts-node": "~8.8.2", + tslint: "~6.1.3", + "tslint-no-circular-imports": "~0.7.0", + typescript: "3.5.3", + yalc: "~1.0.0-pre.50" +}; +var scripts5 = { + build: "yarn gen-json --test && yarn gen-kernel2ops && tsc && yarn bundle", + "build-ci": "yarn gen-json --test && yarn gen-kernel2ops && tsc && yarn bundle-ci", + bundle: "rollup -c", + "bundle-ci": "rollup -c --ci", + "build-core": "cd ../tfjs-core && yarn && yarn build", + "build-backend-cpu": "cd ../tfjs-backend-cpu && yarn && yarn build", + "build-backend-cpu-ci": "cd ../tfjs-backend-cpu && yarn && yarn build-ci", + "build-core-ci": "cd ../tfjs-core && yarn && yarn build-ci", + "build-deps": "yarn build-core && yarn build-backend-cpu", + "build-deps-ci": "yarn build-core-ci && yarn build-backend-cpu", + "build-npm": "./scripts/build-npm.sh", + "link-local": "yalc link", + "publish-local": "yarn build-npm && yalc push", + "publish-npm": "npm publish", + test: "yarn && yarn build-deps && yarn build && yarn gen-json --test && yarn gen-kernel2ops && ts-node --transpile-only -P tsconfig.test.json src/run_tests.ts", + "test-ci": "ts-node --transpile-only --skip-ignore -P tsconfig.test.json src/run_tests.ts", + "test-dev": "tsc && ts-node --transpile-only -P tsconfig.test.json src/run_tests.ts", + "test-snippets": "yarn && yarn build-deps && yarn build && ts-node --skip-ignore -s ./scripts/test_snippets.ts", + "test-snippets-ci": "ts-node --skip-ignore -s ./scripts/test_snippets.ts", + lint: "tslint -p . -t verbose", + "make-version": "sh -c ./scripts/make-version", + "gen-doc": "ts-node -s ./scripts/gen_doc.ts", + "gen-json": "ts-node -s ./scripts/gen_json.ts", + "model-summary": "ts-node -s ./tools/model_summary.ts", + pb2json: "ts-node -s ./tools/pb2json_converter.ts", + "build-pip-package": "yarn gen-json --test && cd python && ./build-pip-package.sh --test /tmp/tfjs-pips", + "run-python-tests": "yarn gen-json --test && cd python && ./run-python-tests.sh", + "gen-kernel2ops": "ts-node -s scripts/kernels_to_ops.ts --out metadata/kernel2op.json" +}; +var package_default5 = { + name: name5, + version: version5, + description: description5, + main: main5, + "jsnext:main": jsnext_main4, + module: module5, + types: types5, + unpkg: unpkg5, + jsdelivr: jsdelivr5, + miniprogram: miniprogram5, + repository: repository3, + license: license5, + peerDependencies: peerDependencies3, + devDependencies: devDependencies5, + scripts: scripts5 +}; +var EPSILON_FLOAT32 = 1e-7; +var EPSILON_FLOAT16 = 1e-4; +var DataStorage = class { + constructor(backend22, dataMover) { + this.backend = backend22; + this.dataMover = dataMover; + this.data = new WeakMap(); + this.dataIdsCount = 0; + } + get(dataId) { + if (!this.data.has(dataId)) { + this.dataMover.moveData(this.backend, dataId); + } + return this.data.get(dataId); + } + set(dataId, value) { + this.dataIdsCount++; + this.data.set(dataId, value); + } + has(dataId) { + return this.data.has(dataId); + } + delete(dataId) { + this.dataIdsCount--; + return this.data.delete(dataId); + } + numDataIds() { + return this.dataIdsCount; + } +}; +var KernelBackend = class { + refCount(dataId) { + return notYetImplemented("refCount"); + } + incRef(dataId) { + return notYetImplemented("incRef"); + } + timerAvailable() { + return true; + } + time(f) { + return notYetImplemented("time"); + } + read(dataId) { + return notYetImplemented("read"); + } + readSync(dataId) { + return notYetImplemented("readSync"); + } + numDataIds() { + return notYetImplemented("numDataIds"); + } + disposeData(dataId, force) { + return notYetImplemented("disposeData"); + } + write(values, shape, dtype) { + return notYetImplemented("write"); + } + move(dataId, values, shape, dtype, refCount) { + return notYetImplemented("move"); + } + memory() { + return notYetImplemented("memory"); + } + floatPrecision() { + return notYetImplemented("floatPrecision"); + } + epsilon() { + return this.floatPrecision() === 32 ? EPSILON_FLOAT32 : EPSILON_FLOAT16; + } + dispose() { + return notYetImplemented("dispose"); + } +}; +function notYetImplemented(kernelName) { + throw new Error(`'${kernelName}' not yet implemented or not found in the registry. This kernel may not be supported by the tfjs backend you have chosen`); +} +function shuffle(array2) { + let counter = array2.length; + let temp = 0; + let index = 0; + while (counter > 0) { + index = Math.random() * counter | 0; + counter--; + temp = array2[counter]; + array2[counter] = array2[index]; + array2[index] = temp; + } +} +function shuffleCombo(array2, array22) { + if (array2.length !== array22.length) { + throw new Error(`Array sizes must match to be shuffled together First array length was ${array2.length}Second array length was ${array22.length}`); + } + let counter = array2.length; + let temp, temp2; + let index = 0; + while (counter > 0) { + index = Math.random() * counter | 0; + counter--; + temp = array2[counter]; + temp2 = array22[counter]; + array2[counter] = array2[index]; + array22[counter] = array22[index]; + array2[index] = temp; + array22[index] = temp2; + } +} +function clamp(min6, x, max6) { + return Math.max(min6, Math.min(x, max6)); +} +function nearestLargerEven(val) { + return val % 2 === 0 ? val : val + 1; +} +function sum(arr) { + let sum6 = 0; + for (let i = 0; i < arr.length; i++) { + sum6 += arr[i]; + } + return sum6; +} +function randUniform(a, b) { + const r = Math.random(); + return b * r + (1 - r) * a; +} +function distSquared(a, b) { + let result = 0; + for (let i = 0; i < a.length; i++) { + const diff = Number(a[i]) - Number(b[i]); + result += diff * diff; + } + return result; +} +function assert(expr, msg) { + if (!expr) { + throw new Error(typeof msg === "string" ? msg : msg()); + } +} +function assertShapesMatch(shapeA, shapeB, errorMessagePrefix = "") { + assert(arraysEqual(shapeA, shapeB), () => errorMessagePrefix + ` Shapes ${shapeA} and ${shapeB} must match`); +} +function assertNonNull(a) { + assert(a != null, () => `The input to the tensor constructor must be a non-null value.`); +} +function flatten(arr, result = [], skipTypedArray = false) { + if (result == null) { + result = []; + } + if (Array.isArray(arr) || isTypedArray(arr) && !skipTypedArray) { + for (let i = 0; i < arr.length; ++i) { + flatten(arr[i], result, skipTypedArray); + } + } else { + result.push(arr); + } + return result; +} +function sizeFromShape(shape) { + if (shape.length === 0) { + return 1; + } + let size = shape[0]; + for (let i = 1; i < shape.length; i++) { + size *= shape[i]; + } + return size; +} +function isScalarShape(shape) { + return shape.length === 0; +} +function arraysEqual(n1, n2) { + if (n1 === n2) { + return true; + } + if (n1 == null || n2 == null) { + return false; + } + if (n1.length !== n2.length) { + return false; + } + for (let i = 0; i < n1.length; i++) { + if (n1[i] !== n2[i]) { + return false; + } + } + return true; +} +function isInt(a) { + return a % 1 === 0; +} +function tanh(x) { + if (Math.tanh != null) { + return Math.tanh(x); + } + if (x === Infinity) { + return 1; + } else if (x === -Infinity) { + return -1; + } else { + const e2x = Math.exp(2 * x); + return (e2x - 1) / (e2x + 1); + } +} +function sizeToSquarishShape(size) { + const width = Math.ceil(Math.sqrt(size)); + return [width, Math.ceil(size / width)]; +} +function createShuffledIndices(n) { + const shuffledIndices = new Uint32Array(n); + for (let i = 0; i < n; ++i) { + shuffledIndices[i] = i; + } + shuffle(shuffledIndices); + return shuffledIndices; +} +function rightPad(a, size) { + if (size <= a.length) { + return a; + } + return a + " ".repeat(size - a.length); +} +function repeatedTry(checkFn, delayFn = (counter) => 0, maxCounter) { + return new Promise((resolve, reject) => { + let tryCount = 0; + const tryFn = () => { + if (checkFn()) { + resolve(); + return; + } + tryCount++; + const nextBackoff = delayFn(tryCount); + if (maxCounter != null && tryCount >= maxCounter) { + reject(); + return; + } + setTimeout(tryFn, nextBackoff); + }; + tryFn(); + }); +} +function inferFromImplicitShape(shape, size) { + let shapeProd = 1; + let implicitIdx = -1; + for (let i = 0; i < shape.length; ++i) { + if (shape[i] >= 0) { + shapeProd *= shape[i]; + } else if (shape[i] === -1) { + if (implicitIdx !== -1) { + throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${implicitIdx} and dim ${i}`); + } + implicitIdx = i; + } else if (shape[i] < 0) { + throw Error(`Shapes can not be < 0. Found ${shape[i]} at dim ${i}`); + } + } + if (implicitIdx === -1) { + if (size > 0 && size !== shapeProd) { + throw Error(`Size(${size}) must match the product of shape ${shape}`); + } + return shape; + } + if (shapeProd === 0) { + throw Error(`Cannot infer the missing size in [${shape}] when there are 0 elements`); + } + if (size % shapeProd !== 0) { + throw Error(`The implicit shape can't be a fractional number. Got ${size} / ${shapeProd}`); + } + const newShape = shape.slice(); + newShape[implicitIdx] = size / shapeProd; + return newShape; +} +function parseAxisParam(axis, shape) { + const rank = shape.length; + axis = axis == null ? shape.map((s, i) => i) : [].concat(axis); + assert(axis.every((ax) => ax >= -rank && ax < rank), () => `All values in axis param must be in range [-${rank}, ${rank}) but got axis ${axis}`); + assert(axis.every((ax) => isInt(ax)), () => `All values in axis param must be integers but got axis ${axis}`); + return axis.map((a) => a < 0 ? rank + a : a); +} +function squeezeShape(shape, axis) { + const newShape = []; + const keptDims = []; + const isEmptyArray = axis != null && Array.isArray(axis) && axis.length === 0; + const axes = axis == null || isEmptyArray ? null : parseAxisParam(axis, shape).sort(); + let j = 0; + for (let i = 0; i < shape.length; ++i) { + if (axes != null) { + if (axes[j] === i && shape[i] !== 1) { + throw new Error(`Can't squeeze axis ${i} since its dim '${shape[i]}' is not 1`); + } + if ((axes[j] == null || axes[j] > i) && shape[i] === 1) { + newShape.push(shape[i]); + keptDims.push(i); + } + if (axes[j] <= i) { + j++; + } + } + if (shape[i] !== 1) { + newShape.push(shape[i]); + keptDims.push(i); + } + } + return { newShape, keptDims }; +} +function getTypedArrayFromDType(dtype, size) { + let values = null; + if (dtype == null || dtype === "float32") { + values = new Float32Array(size); + } else if (dtype === "int32") { + values = new Int32Array(size); + } else if (dtype === "bool") { + values = new Uint8Array(size); + } else { + throw new Error(`Unknown data type ${dtype}`); + } + return values; +} +function getArrayFromDType(dtype, size) { + let values = null; + if (dtype == null || dtype === "float32") { + values = new Float32Array(size); + } else if (dtype === "int32") { + values = new Int32Array(size); + } else if (dtype === "bool") { + values = new Uint8Array(size); + } else if (dtype === "string") { + values = new Array(size); + } else { + throw new Error(`Unknown data type ${dtype}`); + } + return values; +} +function checkConversionForErrors(vals, dtype) { + for (let i = 0; i < vals.length; i++) { + const num = vals[i]; + if (isNaN(num) || !isFinite(num)) { + throw Error(`A tensor of type ${dtype} being uploaded contains ${num}.`); + } + } +} +function isValidDtype(dtype) { + return dtype === "bool" || dtype === "complex64" || dtype === "float32" || dtype === "int32" || dtype === "string"; +} +function hasEncodingLoss(oldType, newType) { + if (newType === "complex64") { + return false; + } + if (newType === "float32" && oldType !== "complex64") { + return false; + } + if (newType === "int32" && oldType !== "float32" && oldType !== "complex64") { + return false; + } + if (newType === "bool" && oldType === "bool") { + return false; + } + return true; +} +function isTypedArray(a) { + return a instanceof Float32Array || a instanceof Int32Array || a instanceof Uint8Array; +} +function bytesPerElement(dtype) { + if (dtype === "float32" || dtype === "int32") { + return 4; + } else if (dtype === "complex64") { + return 8; + } else if (dtype === "bool") { + return 1; + } else { + throw new Error(`Unknown dtype ${dtype}`); + } +} +function bytesFromStringArray(arr) { + if (arr == null) { + return 0; + } + let bytes = 0; + arr.forEach((x) => bytes += x.length); + return bytes; +} +function isString(value) { + return typeof value === "string" || value instanceof String; +} +function isBoolean(value) { + return typeof value === "boolean"; +} +function isNumber(value) { + return typeof value === "number"; +} +function inferDtype(values) { + if (Array.isArray(values)) { + return inferDtype(values[0]); + } + if (values instanceof Float32Array) { + return "float32"; + } else if (values instanceof Int32Array || values instanceof Uint8Array) { + return "int32"; + } else if (isNumber(values)) { + return "float32"; + } else if (isString(values)) { + return "string"; + } else if (isBoolean(values)) { + return "bool"; + } + return "float32"; +} +function isFunction(f) { + return !!(f && f.constructor && f.call && f.apply); +} +function nearestDivisor(size, start) { + for (let i = start; i < size; ++i) { + if (size % i === 0) { + return i; + } + } + return size; +} +function computeStrides(shape) { + const rank = shape.length; + if (rank < 2) { + return []; + } + const strides = new Array(rank - 1); + strides[rank - 2] = shape[rank - 1]; + for (let i = rank - 3; i >= 0; --i) { + strides[i] = strides[i + 1] * shape[i + 1]; + } + return strides; +} +function createNestedArray(offset, shape, a, isComplex = false) { + const ret = new Array(); + if (shape.length === 1) { + const d = shape[0] * (isComplex ? 2 : 1); + for (let i = 0; i < d; i++) { + ret[i] = a[offset + i]; + } + } else { + const d = shape[0]; + const rest = shape.slice(1); + const len = rest.reduce((acc, c) => acc * c) * (isComplex ? 2 : 1); + for (let i = 0; i < d; i++) { + ret[i] = createNestedArray(offset + i * len, rest, a, isComplex); + } + } + return ret; +} +function toNestedArray(shape, a, isComplex = false) { + if (shape.length === 0) { + return a[0]; + } + const size = shape.reduce((acc, c) => acc * c) * (isComplex ? 2 : 1); + if (size === 0) { + return []; + } + if (size !== a.length) { + throw new Error(`[${shape}] does not match the input size ${a.length}${isComplex ? " for a complex tensor" : ""}.`); + } + return createNestedArray(0, shape, a, isComplex); +} +function makeOnesTypedArray(size, dtype) { + const array2 = makeZerosTypedArray(size, dtype); + for (let i = 0; i < array2.length; i++) { + array2[i] = 1; + } + return array2; +} +function makeZerosTypedArray(size, dtype) { + if (dtype == null || dtype === "float32" || dtype === "complex64") { + return new Float32Array(size); + } else if (dtype === "int32") { + return new Int32Array(size); + } else if (dtype === "bool") { + return new Uint8Array(size); + } else { + throw new Error(`Unknown data type ${dtype}`); + } +} +function makeZerosNestedTypedArray(shape, dtype) { + const size = shape.reduce((prev, curr) => prev * curr, 1); + if (dtype == null || dtype === "float32") { + return toNestedArray(shape, new Float32Array(size)); + } else if (dtype === "int32") { + return toNestedArray(shape, new Int32Array(size)); + } else if (dtype === "bool") { + return toNestedArray(shape, new Uint8Array(size)); + } else { + throw new Error(`Unknown data type ${dtype}`); + } +} +function assertNonNegativeIntegerDimensions(shape) { + shape.forEach((dimSize) => { + assert(Number.isInteger(dimSize) && dimSize >= 0, () => `Tensor must have a shape comprised of positive integers but got shape [${shape}].`); + }); +} +function locToIndex(locs, rank, strides) { + if (rank === 0) { + return 0; + } else if (rank === 1) { + return locs[0]; + } + let index = locs[locs.length - 1]; + for (let i = 0; i < locs.length - 1; ++i) { + index += strides[i] * locs[i]; + } + return index; +} +function indexToLoc(index, rank, strides) { + if (rank === 0) { + return []; + } else if (rank === 1) { + return [index]; + } + const locs = new Array(rank); + for (let i = 0; i < locs.length - 1; ++i) { + locs[i] = Math.floor(index / strides[i]); + index -= locs[i] * strides[i]; + } + locs[locs.length - 1] = index; + return locs; +} +function isPromise(object2) { + return object2 && object2.then && typeof object2.then === "function"; +} +var TENSORFLOWJS_FLAGS_PREFIX = "tfjsflags"; +var Environment = class { + constructor(global2) { + this.global = global2; + this.flags = {}; + this.flagRegistry = {}; + this.urlFlags = {}; + this.getQueryParams = getQueryParams; + this.populateURLFlags(); + } + setPlatform(platformName, platform) { + if (this.platform != null) { + console.warn(`Platform ${this.platformName} has already been set. Overwriting the platform with ${platform}.`); + } + this.platformName = platformName; + this.platform = platform; + } + registerFlag(flagName, evaluationFn, setHook) { + this.flagRegistry[flagName] = { evaluationFn, setHook }; + if (this.urlFlags[flagName] != null) { + const flagValue = this.urlFlags[flagName]; + console.warn(`Setting feature override from URL ${flagName}: ${flagValue}.`); + this.set(flagName, flagValue); + } + } + async getAsync(flagName) { + if (flagName in this.flags) { + return this.flags[flagName]; + } + this.flags[flagName] = await this.evaluateFlag(flagName); + return this.flags[flagName]; + } + get(flagName) { + if (flagName in this.flags) { + return this.flags[flagName]; + } + const flagValue = this.evaluateFlag(flagName); + if (isPromise(flagValue)) { + throw new Error(`Flag ${flagName} cannot be synchronously evaluated. Please use getAsync() instead.`); + } + this.flags[flagName] = flagValue; + return this.flags[flagName]; + } + getNumber(flagName) { + return this.get(flagName); + } + getBool(flagName) { + return this.get(flagName); + } + getFlags() { + return this.flags; + } + get features() { + return this.flags; + } + set(flagName, value) { + if (this.flagRegistry[flagName] == null) { + throw new Error(`Cannot set flag ${flagName} as it has not been registered.`); + } + this.flags[flagName] = value; + if (this.flagRegistry[flagName].setHook != null) { + this.flagRegistry[flagName].setHook(value); + } + } + evaluateFlag(flagName) { + if (this.flagRegistry[flagName] == null) { + throw new Error(`Cannot evaluate flag '${flagName}': no evaluation function found.`); + } + return this.flagRegistry[flagName].evaluationFn(); + } + setFlags(flags) { + this.flags = Object.assign({}, flags); + } + reset() { + this.flags = {}; + this.urlFlags = {}; + this.populateURLFlags(); + } + populateURLFlags() { + if (typeof this.global === "undefined" || typeof this.global.location === "undefined" || typeof this.global.location.search === "undefined") { + return; + } + const urlParams = this.getQueryParams(this.global.location.search); + if (TENSORFLOWJS_FLAGS_PREFIX in urlParams) { + const keyValues = urlParams[TENSORFLOWJS_FLAGS_PREFIX].split(","); + keyValues.forEach((keyValue) => { + const [key, value] = keyValue.split(":"); + this.urlFlags[key] = parseValue(key, value); + }); + } + } +}; +function getQueryParams(queryString) { + const params = {}; + queryString.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g, (s, ...t) => { + decodeParam(params, t[0], t[1]); + return t.join("="); + }); + return params; +} +function decodeParam(params, name6, value) { + params[decodeURIComponent(name6)] = decodeURIComponent(value || ""); +} +function parseValue(flagName, value) { + value = value.toLowerCase(); + if (value === "true" || value === "false") { + return value === "true"; + } else if (`${+value}` === value) { + return +value; + } + throw new Error(`Could not parse value flag value ${value} for flag ${flagName}.`); +} +function env() { + return ENV; +} +var ENV = null; +function setEnvironmentGlobal(environment) { + ENV = environment; +} +var globalNameSpace; +function getGlobalNamespace() { + if (globalNameSpace == null) { + let ns; + if (typeof window !== "undefined") { + ns = window; + } else if (typeof global !== "undefined") { + ns = global; + } else if (typeof process !== "undefined") { + ns = process; + } else if (typeof self !== "undefined") { + ns = self; + } else { + throw new Error("Could not find a global object"); + } + globalNameSpace = ns; + } + return globalNameSpace; +} +function getGlobalMap() { + const ns = getGlobalNamespace(); + if (ns._tfGlobals == null) { + ns._tfGlobals = new Map(); + } + return ns._tfGlobals; +} +function getGlobal(key, init2) { + const globalMap = getGlobalMap(); + if (globalMap.has(key)) { + return globalMap.get(key); + } else { + const singleton = init2(); + globalMap.set(key, singleton); + return globalMap.get(key); + } +} +var Abs = "Abs"; +var Acos = "Acos"; +var Acosh = "Acosh"; +var Add = "Add"; +var AddN = "AddN"; +var All = "All"; +var Any = "Any"; +var ArgMax = "ArgMax"; +var ArgMin = "ArgMin"; +var Asin = "Asin"; +var Asinh = "Asinh"; +var Atan = "Atan"; +var Atanh = "Atanh"; +var Atan2 = "Atan2"; +var AvgPool = "AvgPool"; +var AvgPoolGrad = "AvgPoolGrad"; +var AvgPool3D = "AvgPool3D"; +var AvgPool3DGrad = "AvgPool3DGrad"; +var BatchMatMul = "BatchMatMul"; +var BatchToSpaceND = "BatchToSpaceND"; +var Bincount = "Bincount"; +var BroadcastTo = "BroadcastTo"; +var Cast = "Cast"; +var Ceil = "Ceil"; +var ClipByValue = "ClipByValue"; +var Complex = "Complex"; +var ComplexAbs = "ComplexAbs"; +var Concat = "Concat"; +var Conv2D = "Conv2D"; +var Conv2DBackpropFilter = "Conv2DBackpropFilter"; +var Conv2DBackpropInput = "Conv2DBackpropInput"; +var Conv3D = "Conv3D"; +var Conv3DBackpropFilterV2 = "Conv3DBackpropFilterV2"; +var Conv3DBackpropInputV2 = "Conv3DBackpropInputV2"; +var Cos = "Cos"; +var Cosh = "Cosh"; +var Cumsum = "Cumsum"; +var CropAndResize = "CropAndResize"; +var DenseBincount = "DenseBincount"; +var DepthToSpace = "DepthToSpace"; +var DepthwiseConv2dNative = "DepthwiseConv2dNative"; +var DepthwiseConv2dNativeBackpropFilter = "DepthwiseConv2dNativeBackpropFilter"; +var DepthwiseConv2dNativeBackpropInput = "DepthwiseConv2dNativeBackpropInput"; +var Diag = "Diag"; +var Dilation2D = "Dilation2D"; +var Dilation2DBackpropInput = "Dilation2DBackpropInput"; +var Dilation2DBackpropFilter = "Dilation2DBackpropFilter"; +var RealDiv = "RealDiv"; +var Einsum = "Einsum"; +var Elu = "Elu"; +var EluGrad = "EluGrad"; +var Erf = "Erf"; +var Equal = "Equal"; +var Exp = "Exp"; +var ExpandDims = "ExpandDims"; +var Expm1 = "Expm1"; +var FFT = "FFT"; +var Fill = "Fill"; +var FlipLeftRight = "FlipLeftRight"; +var Floor = "Floor"; +var FloorDiv = "FloorDiv"; +var FusedBatchNorm = "FusedBatchNorm"; +var GatherV2 = "GatherV2"; +var GatherNd = "GatherNd"; +var Greater = "Greater"; +var GreaterEqual = "GreaterEqual"; +var Identity = "Identity"; +var IFFT = "IFFT"; +var Imag = "Imag"; +var IsFinite = "IsFinite"; +var IsInf = "IsInf"; +var IsNan = "IsNan"; +var LeakyRelu = "LeakyRelu"; +var Less = "Less"; +var LessEqual = "LessEqual"; +var LinSpace = "LinSpace"; +var Log = "Log"; +var Log1p = "Log1p"; +var LogicalAnd = "LogicalAnd"; +var LogicalNot = "LogicalNot"; +var LogicalOr = "LogicalOr"; +var LogSoftmax = "LogSoftmax"; +var LRN = "LRN"; +var LRNGrad = "LRNGrad"; +var Max = "Max"; +var Maximum = "Maximum"; +var MaxPool = "MaxPool"; +var MaxPoolGrad = "MaxPoolGrad"; +var MaxPool3D = "MaxPool3D"; +var MaxPool3DGrad = "MaxPool3DGrad"; +var MaxPoolWithArgmax = "MaxPoolWithArgmax"; +var Mean = "Mean"; +var Min = "Min"; +var Minimum = "Minimum"; +var MirrorPad = "MirrorPad"; +var Mod = "Mod"; +var Multinomial = "Multinomial"; +var Multiply = "Multiply"; +var Neg = "Neg"; +var NotEqual = "NotEqual"; +var NonMaxSuppressionV3 = "NonMaxSuppressionV3"; +var NonMaxSuppressionV4 = "NonMaxSuppressionV4"; +var NonMaxSuppressionV5 = "NonMaxSuppressionV5"; +var OnesLike = "OnesLike"; +var OneHot = "OneHot"; +var Pack = "Pack"; +var PadV2 = "PadV2"; +var Pool = "Pool"; +var Pow = "Pow"; +var Prelu = "Prelu"; +var Prod = "Prod"; +var Range = "Range"; +var Real = "Real"; +var Reciprocal = "Reciprocal"; +var Relu = "Relu"; +var Reshape = "Reshape"; +var ResizeNearestNeighbor = "ResizeNearestNeighbor"; +var ResizeNearestNeighborGrad = "ResizeNearestNeighborGrad"; +var ResizeBilinear = "ResizeBilinear"; +var ResizeBilinearGrad = "ResizeBilinearGrad"; +var Relu6 = "Relu6"; +var Reverse = "Reverse"; +var Round = "Round"; +var Rsqrt = "Rsqrt"; +var ScatterNd = "ScatterNd"; +var Select = "Select"; +var Selu = "Selu"; +var Slice = "Slice"; +var Sin = "Sin"; +var Sinh = "Sinh"; +var Sign = "Sign"; +var Sigmoid = "Sigmoid"; +var Softplus = "Softplus"; +var Sqrt = "Sqrt"; +var Sum = "Sum"; +var SpaceToBatchND = "SpaceToBatchND"; +var SplitV = "SplitV"; +var Softmax = "Softmax"; +var SparseFillEmptyRows = "SparseFillEmptyRows"; +var SparseReshape = "SparseReshape"; +var SparseToDense = "SparseToDense"; +var SquaredDifference = "SquaredDifference"; +var Square = "Square"; +var StridedSlice = "StridedSlice"; +var Sub = "Sub"; +var Tan = "Tan"; +var Tanh = "Tanh"; +var Tile = "Tile"; +var TopK = "TopK"; +var Transform = "Transform"; +var Transpose = "Transpose"; +var Unique = "Unique"; +var Unpack = "Unpack"; +var UnsortedSegmentSum = "UnsortedSegmentSum"; +var ZerosLike = "ZerosLike"; +var Step = "Step"; +var FromPixels = "FromPixels"; +var RotateWithOffset = "RotateWithOffset"; +var _FusedMatMul = "_FusedMatMul"; +var FusedConv2D = "FusedConv2D"; +var FusedDepthwiseConv2D = "FusedDepthwiseConv2D"; +var kernelRegistry = getGlobal("kernelRegistry", () => new Map()); +var gradRegistry = getGlobal("gradRegistry", () => new Map()); +function getKernel(kernelName, backendName) { + const key = makeKey(kernelName, backendName); + return kernelRegistry.get(key); +} +function getGradient(kernelName) { + return gradRegistry.get(kernelName); +} +function getKernelsForBackend(backendName) { + const it = kernelRegistry.entries(); + const result = []; + while (true) { + const { done, value } = it.next(); + if (done) { + break; + } + const [key, config3] = value; + const [backend22] = key.split("_"); + if (backend22 === backendName) { + result.push(config3); + } + } + return result; +} +function registerKernel(config3) { + const { kernelName, backendName } = config3; + const key = makeKey(kernelName, backendName); + if (kernelRegistry.has(key)) { + console.warn(`The kernel '${kernelName}' for backend '${backendName}' is already registered`); + } + kernelRegistry.set(key, config3); +} +function registerGradient(config3) { + const { kernelName } = config3; + if (gradRegistry.has(kernelName)) { + if (env().getBool("DEBUG")) { + console.warn(`Overriding the gradient for '${kernelName}'`); + } + } + gradRegistry.set(kernelName, config3); +} +function unregisterKernel(kernelName, backendName) { + const key = makeKey(kernelName, backendName); + if (!kernelRegistry.has(key)) { + throw new Error(`The kernel '${kernelName}' for backend '${backendName}' is not registered`); + } + kernelRegistry.delete(key); +} +function unregisterGradient(kernelName) { + if (!gradRegistry.has(kernelName)) { + throw new Error(`The gradient '${kernelName}' for backend is not registered`); + } + gradRegistry.delete(kernelName); +} +function copyRegisteredKernels(registeredBackendName, newBackendName) { + const kernels = getKernelsForBackend(registeredBackendName); + kernels.forEach((kernelConfig) => { + const newKernelConfig = Object.assign({}, kernelConfig, { backendName: newBackendName }); + registerKernel(newKernelConfig); + }); +} +function makeKey(kernelName, backendName) { + return `${backendName}_${kernelName}`; +} +var util_exports = {}; +__export2(util_exports, { + arraysEqual: () => arraysEqual, + assert: () => assert, + assertNonNegativeIntegerDimensions: () => assertNonNegativeIntegerDimensions, + assertNonNull: () => assertNonNull, + assertShapesMatch: () => assertShapesMatch, + bytesFromStringArray: () => bytesFromStringArray, + bytesPerElement: () => bytesPerElement, + checkConversionForErrors: () => checkConversionForErrors, + clamp: () => clamp, + computeStrides: () => computeStrides, + createScalarValue: () => createScalarValue, + createShuffledIndices: () => createShuffledIndices, + decodeString: () => decodeString, + distSquared: () => distSquared, + encodeString: () => encodeString, + fetch: () => fetch2, + flatten: () => flatten, + getArrayFromDType: () => getArrayFromDType, + getTypedArrayFromDType: () => getTypedArrayFromDType, + hasEncodingLoss: () => hasEncodingLoss, + indexToLoc: () => indexToLoc, + inferDtype: () => inferDtype, + inferFromImplicitShape: () => inferFromImplicitShape, + isBoolean: () => isBoolean, + isFunction: () => isFunction, + isInt: () => isInt, + isNumber: () => isNumber, + isPromise: () => isPromise, + isScalarShape: () => isScalarShape, + isString: () => isString, + isTypedArray: () => isTypedArray, + isValidDtype: () => isValidDtype, + locToIndex: () => locToIndex, + makeOnesTypedArray: () => makeOnesTypedArray, + makeZerosNestedTypedArray: () => makeZerosNestedTypedArray, + makeZerosTypedArray: () => makeZerosTypedArray, + nearestDivisor: () => nearestDivisor, + nearestLargerEven: () => nearestLargerEven, + now: () => now2, + parseAxisParam: () => parseAxisParam, + randUniform: () => randUniform, + repeatedTry: () => repeatedTry, + rightPad: () => rightPad, + shuffle: () => shuffle, + shuffleCombo: () => shuffleCombo, + sizeFromShape: () => sizeFromShape, + sizeToSquarishShape: () => sizeToSquarishShape, + squeezeShape: () => squeezeShape, + sum: () => sum, + tanh: () => tanh, + toNestedArray: () => toNestedArray, + toTypedArray: () => toTypedArray +}); +function createScalarValue(value, dtype) { + if (dtype === "string") { + return encodeString(value); + } + return toTypedArray([value], dtype); +} +function noConversionNeeded(a, dtype) { + return a instanceof Float32Array && dtype === "float32" || a instanceof Int32Array && dtype === "int32" || a instanceof Uint8Array && dtype === "bool"; +} +function toTypedArray(a, dtype) { + if (dtype === "string") { + throw new Error("Cannot convert a string[] to a TypedArray"); + } + if (Array.isArray(a)) { + a = flatten(a); + } + if (env().getBool("DEBUG")) { + checkConversionForErrors(a, dtype); + } + if (noConversionNeeded(a, dtype)) { + return a; + } + if (dtype == null || dtype === "float32" || dtype === "complex64") { + return new Float32Array(a); + } else if (dtype === "int32") { + return new Int32Array(a); + } else if (dtype === "bool") { + const bool = new Uint8Array(a.length); + for (let i = 0; i < bool.length; ++i) { + if (Math.round(a[i]) !== 0) { + bool[i] = 1; + } + } + return bool; + } else { + throw new Error(`Unknown data type ${dtype}`); + } +} +function now2() { + return env().platform.now(); +} +function fetch2(path, requestInits) { + return env().platform.fetch(path, requestInits); +} +function encodeString(s, encoding = "utf-8") { + encoding = encoding || "utf-8"; + return env().platform.encode(s, encoding); +} +function decodeString(bytes, encoding = "utf-8") { + encoding = encoding || "utf-8"; + return env().platform.decode(bytes, encoding); +} +var Profiler = class { + constructor(backendTimer, logger) { + this.backendTimer = backendTimer; + this.logger = logger; + if (logger == null) { + this.logger = new Logger(); + } + } + profileKernel(kernelName, inputs, f) { + let outputs; + const holdResultWrapperFn = () => { + outputs = f(); + }; + let timer; + const start = now2(); + if (this.backendTimer.timerAvailable()) { + timer = this.backendTimer.time(holdResultWrapperFn); + } else { + holdResultWrapperFn(); + for (const output of outputs) { + output.dataSync(); + } + timer = Promise.resolve({ kernelMs: now2() - start }); + } + if (env().getBool("CHECK_COMPUTATION_FOR_ERRORS")) { + for (let i = 0; i < outputs.length; i++) { + const output = outputs[i]; + output.data().then((tensorVals) => { + checkComputationForErrors(tensorVals, output.dtype, kernelName); + }); + } + } + const kernelProfile = { + kernelName, + outputs, + inputs, + timeMs: timer.then((timing) => timing.kernelMs), + extraInfo: timer.then((timing) => timing.getExtraProfileInfo != null ? timing.getExtraProfileInfo() : "") + }; + return kernelProfile; + } + logKernelProfile(kernelProfile) { + const { kernelName, outputs, timeMs, inputs, extraInfo } = kernelProfile; + outputs.forEach((result) => { + Promise.all([result.data(), timeMs, extraInfo]).then((valueContainer) => { + this.logger.logKernelProfile(kernelName, result, valueContainer[0], valueContainer[1], inputs, valueContainer[2]); + }); + }); + } +}; +function checkComputationForErrors(vals, dtype, kernelName) { + if (dtype !== "float32") { + return false; + } + for (let i = 0; i < vals.length; i++) { + const num = vals[i]; + if (isNaN(num) || !isFinite(num)) { + console.warn(`Found ${num} in the result of '${kernelName}'`); + return true; + } + } + return false; +} +var Logger = class { + logKernelProfile(name6, result, vals, timeMs, inputs, extraInfo) { + const time2 = typeof timeMs === "number" ? rightPad(`${timeMs}ms`, 9) : timeMs["error"]; + const paddedName = rightPad(name6, 25); + const rank = result.rank; + const size = result.size; + const shape = rightPad(result.shape.toString(), 14); + let inputShapesDescription = ""; + for (const name7 in inputs) { + const input2 = inputs[name7]; + if (input2 != null) { + const inputShape = input2.shape || result.shape; + const inputRank = inputShape.length; + inputShapesDescription += `${name7}: ${inputRank}D ${inputRank > 0 ? inputShape : ""} `; + } + } + console.log(`%c${paddedName} %c${time2} %c${rank}D ${shape} %c${size} %c${inputShapesDescription} %c${extraInfo}`, "font-weight:bold", "color:red", "color:blue", "color: orange", "color: green", "color: steelblue"); + } +}; +function getFilteredNodesXToY(tape, xs, y) { + const tensorsFromX = {}; + const nodesFromX = {}; + for (let i = 0; i < xs.length; i++) { + tensorsFromX[xs[i].id] = true; + } + for (let i = 0; i < tape.length; i++) { + const node = tape[i]; + const nodeInputs = node.inputs; + for (const inputName in nodeInputs) { + const input2 = nodeInputs[inputName]; + let anyInputFromX = false; + for (let j = 0; j < xs.length; j++) { + if (tensorsFromX[input2.id]) { + node.outputs.forEach((output) => tensorsFromX[output.id] = true); + anyInputFromX = true; + nodesFromX[node.id] = true; + break; + } + } + if (anyInputFromX) { + break; + } + } + } + const tensorsLeadToY = {}; + tensorsLeadToY[y.id] = true; + const nodesToY = {}; + for (let i = tape.length - 1; i >= 0; i--) { + const node = tape[i]; + const nodeInputs = node.inputs; + for (let j = 0; j < node.outputs.length; j++) { + if (tensorsLeadToY[node.outputs[j].id]) { + for (const inputName in nodeInputs) { + tensorsLeadToY[nodeInputs[inputName].id] = true; + nodesToY[node.id] = true; + } + break; + } + } + } + const filteredTape = []; + for (let i = 0; i < tape.length; i++) { + const node = tape[i]; + if (nodesFromX[node.id] && nodesToY[node.id]) { + const prunedInputs = {}; + for (const inputName in node.inputs) { + const nodeInput = node.inputs[inputName]; + if (tensorsFromX[nodeInput.id]) { + prunedInputs[inputName] = nodeInput; + } + } + const prunedNode = Object.assign({}, node); + prunedNode.inputs = prunedInputs; + prunedNode.outputs = node.outputs; + filteredTape.push(prunedNode); + } + } + return filteredTape; +} +function backpropagateGradients(tensorAccumulatedGradientMap, filteredTape, tidy2, add5) { + for (let i = filteredTape.length - 1; i >= 0; i--) { + const node = filteredTape[i]; + const dys = []; + node.outputs.forEach((o) => { + const gradTensor = tensorAccumulatedGradientMap[o.id]; + if (gradTensor != null) { + dys.push(gradTensor); + } else { + dys.push(null); + } + }); + if (node.gradient == null) { + throw new Error(`Cannot compute gradient: gradient function not found for ${node.kernelName}.`); + } + const inputGradients = node.gradient(dys); + for (const inputName in node.inputs) { + if (!(inputName in inputGradients)) { + throw new Error(`Cannot backprop through input ${inputName}. Available gradients found: ${Object.keys(inputGradients)}.`); + } + const dx = tidy2(() => inputGradients[inputName]()); + if (dx.dtype !== "float32") { + throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input ${inputName} must have 'float32' dtype, but has '${dx.dtype}'`); + } + const x = node.inputs[inputName]; + if (!arraysEqual(dx.shape, x.shape)) { + throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input '${inputName}' has shape '${dx.shape}', which does not match the shape of the input '${x.shape}'`); + } + if (tensorAccumulatedGradientMap[x.id] == null) { + tensorAccumulatedGradientMap[x.id] = dx; + } else { + const curGradient = tensorAccumulatedGradientMap[x.id]; + tensorAccumulatedGradientMap[x.id] = add5(curGradient, dx); + curGradient.dispose(); + } + } + } +} +var FORMAT_LIMIT_NUM_VALS = 20; +var FORMAT_NUM_FIRST_LAST_VALS = 3; +var FORMAT_NUM_SIG_DIGITS = 7; +function tensorToString(vals, shape, dtype, verbose) { + const strides = computeStrides(shape); + const padPerCol = computeMaxSizePerColumn(vals, shape, dtype, strides); + const rank = shape.length; + const valsLines = subTensorToString(vals, shape, dtype, strides, padPerCol); + const lines2 = ["Tensor"]; + if (verbose) { + lines2.push(` dtype: ${dtype}`); + lines2.push(` rank: ${rank}`); + lines2.push(` shape: [${shape}]`); + lines2.push(` values:`); + } + lines2.push(valsLines.map((l) => " " + l).join("\n")); + return lines2.join("\n"); +} +function computeMaxSizePerColumn(vals, shape, dtype, strides) { + const n = sizeFromShape(shape); + const numCols = strides[strides.length - 1]; + const padPerCol = new Array(numCols).fill(0); + const rank = shape.length; + const valuesOrTuples = dtype === "complex64" ? createComplexTuples(vals) : vals; + if (rank > 1) { + for (let row = 0; row < n / numCols; row++) { + const offset = row * numCols; + for (let j = 0; j < numCols; j++) { + padPerCol[j] = Math.max(padPerCol[j], valToString(valuesOrTuples[offset + j], 0, dtype).length); + } + } + } + return padPerCol; +} +function valToString(val, pad3, dtype) { + let valStr; + if (Array.isArray(val)) { + valStr = `${parseFloat(val[0].toFixed(FORMAT_NUM_SIG_DIGITS))} + ${parseFloat(val[1].toFixed(FORMAT_NUM_SIG_DIGITS))}j`; + } else if (isString(val)) { + valStr = `'${val}'`; + } else if (dtype === "bool") { + valStr = boolNumToString(val); + } else { + valStr = parseFloat(val.toFixed(FORMAT_NUM_SIG_DIGITS)).toString(); + } + return rightPad(valStr, pad3); +} +function boolNumToString(v) { + return v === 0 ? "false" : "true"; +} +function subTensorToString(vals, shape, dtype, strides, padPerCol, isLast = true) { + const storagePerElement = dtype === "complex64" ? 2 : 1; + const size = shape[0]; + const rank = shape.length; + if (rank === 0) { + if (dtype === "complex64") { + const complexTuple = createComplexTuples(vals); + return [valToString(complexTuple[0], 0, dtype)]; + } + if (dtype === "bool") { + return [boolNumToString(vals[0])]; + } + return [vals[0].toString()]; + } + if (rank === 1) { + if (size > FORMAT_LIMIT_NUM_VALS) { + const firstValsSize = FORMAT_NUM_FIRST_LAST_VALS * storagePerElement; + let firstVals = Array.from(vals.slice(0, firstValsSize)); + let lastVals = Array.from(vals.slice((size - FORMAT_NUM_FIRST_LAST_VALS) * storagePerElement, size * storagePerElement)); + if (dtype === "complex64") { + firstVals = createComplexTuples(firstVals); + lastVals = createComplexTuples(lastVals); + } + return [ + "[" + firstVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(", ") + ", ..., " + lastVals.map((x, i) => valToString(x, padPerCol[size - FORMAT_NUM_FIRST_LAST_VALS + i], dtype)).join(", ") + "]" + ]; + } + const displayVals = dtype === "complex64" ? createComplexTuples(vals) : Array.from(vals); + return [ + "[" + displayVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(", ") + "]" + ]; + } + const subshape = shape.slice(1); + const substrides = strides.slice(1); + const stride = strides[0] * storagePerElement; + const lines2 = []; + if (size > FORMAT_LIMIT_NUM_VALS) { + for (let i = 0; i < FORMAT_NUM_FIRST_LAST_VALS; i++) { + const start = i * stride; + const end = start + stride; + lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, false)); + } + lines2.push("..."); + for (let i = size - FORMAT_NUM_FIRST_LAST_VALS; i < size; i++) { + const start = i * stride; + const end = start + stride; + lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1)); + } + } else { + for (let i = 0; i < size; i++) { + const start = i * stride; + const end = start + stride; + lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1)); + } + } + const sep = rank === 2 ? "," : ""; + lines2[0] = "[" + lines2[0] + sep; + for (let i = 1; i < lines2.length - 1; i++) { + lines2[i] = " " + lines2[i] + sep; + } + let newLineSep = ",\n"; + for (let i = 2; i < rank; i++) { + newLineSep += "\n"; + } + lines2[lines2.length - 1] = " " + lines2[lines2.length - 1] + "]" + (isLast ? "" : newLineSep); + return lines2; +} +function createComplexTuples(vals) { + const complexTuples = []; + for (let i = 0; i < vals.length; i += 2) { + complexTuples.push([vals[i], vals[i + 1]]); + } + return complexTuples; +} +var TensorBuffer = class { + constructor(shape, dtype, values) { + this.dtype = dtype; + this.shape = shape.slice(); + this.size = sizeFromShape(shape); + if (values != null) { + const n = values.length; + assert(n === this.size, () => `Length of values '${n}' does not match the size inferred by the shape '${this.size}'.`); + } + if (dtype === "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 = values || getArrayFromDType(dtype, this.size); + this.strides = computeStrides(shape); + } + set(value, ...locs) { + if (locs.length === 0) { + locs = [0]; + } + assert(locs.length === this.rank, () => `The number of provided coordinates (${locs.length}) must match the rank (${this.rank})`); + const index = this.locToIndex(locs); + this.values[index] = value; + } + get(...locs) { + if (locs.length === 0) { + locs = [0]; + } + let i = 0; + for (const loc of locs) { + if (loc < 0 || loc >= this.shape[i]) { + const msg = `Requested out of range element at ${locs}. Buffer shape=${this.shape}`; + throw new Error(msg); + } + i++; + } + let index = locs[locs.length - 1]; + for (let i2 = 0; i2 < locs.length - 1; ++i2) { + index += this.strides[i2] * locs[i2]; + } + return this.values[index]; + } + locToIndex(locs) { + if (this.rank === 0) { + return 0; + } else if (this.rank === 1) { + return locs[0]; + } + let index = locs[locs.length - 1]; + for (let i = 0; i < locs.length - 1; ++i) { + index += this.strides[i] * locs[i]; + } + return index; + } + indexToLoc(index) { + if (this.rank === 0) { + return []; + } else if (this.rank === 1) { + return [index]; + } + const locs = new Array(this.shape.length); + for (let i = 0; i < locs.length - 1; ++i) { + locs[i] = Math.floor(index / this.strides[i]); + index -= locs[i] * this.strides[i]; + } + locs[locs.length - 1] = index; + return locs; + } + get rank() { + return this.shape.length; + } + toTensor() { + return trackerFn().makeTensor(this.values, this.shape, this.dtype); + } +}; +var trackerFn = null; +var opHandler = null; +var deprecationWarningFn = null; +function setTensorTracker(fn) { + trackerFn = fn; +} +function setOpHandler(handler) { + opHandler = handler; +} +function setDeprecationWarningFn(fn) { + deprecationWarningFn = fn; +} +var Tensor = class { + constructor(shape, dtype, dataId, id) { + this.kept = false; + this.isDisposedInternal = false; + this.shape = shape.slice(); + this.dtype = dtype || "float32"; + this.size = sizeFromShape(shape); + this.strides = computeStrides(shape); + this.dataId = dataId; + this.id = id; + this.rankType = this.rank < 5 ? this.rank.toString() : "higher"; + } + get rank() { + return this.shape.length; + } + async buffer() { + const vals = await this.data(); + return opHandler.buffer(this.shape, this.dtype, vals); + } + bufferSync() { + return opHandler.buffer(this.shape, this.dtype, this.dataSync()); + } + async array() { + const vals = await this.data(); + return toNestedArray(this.shape, vals, this.dtype === "complex64"); + } + arraySync() { + return toNestedArray(this.shape, this.dataSync(), this.dtype === "complex64"); + } + async data() { + this.throwIfDisposed(); + const data = trackerFn().read(this.dataId); + if (this.dtype === "string") { + const bytes = await data; + try { + return bytes.map((b) => decodeString(b)); + } catch (_a) { + throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes()."); + } + } + return data; + } + dataSync() { + this.throwIfDisposed(); + const data = trackerFn().readSync(this.dataId); + if (this.dtype === "string") { + try { + return data.map((b) => decodeString(b)); + } catch (_a) { + throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes()."); + } + } + return data; + } + async bytes() { + this.throwIfDisposed(); + const data = await trackerFn().read(this.dataId); + if (this.dtype === "string") { + return data; + } else { + return new Uint8Array(data.buffer); + } + } + dispose() { + if (this.isDisposed) { + return; + } + trackerFn().disposeTensor(this); + this.isDisposedInternal = true; + } + get isDisposed() { + return this.isDisposedInternal; + } + throwIfDisposed() { + if (this.isDisposed) { + throw new Error(`Tensor is disposed.`); + } + } + print(verbose = false) { + return opHandler.print(this, verbose); + } + clone() { + this.throwIfDisposed(); + return opHandler.clone(this); + } + toString(verbose = false) { + const vals = this.dataSync(); + return tensorToString(vals, this.shape, this.dtype, verbose); + } + cast(dtype) { + this.throwIfDisposed(); + return opHandler.cast(this, dtype); + } + variable(trainable = true, name6, dtype) { + this.throwIfDisposed(); + return trackerFn().makeVariable(this, trainable, name6, dtype); + } +}; +Object.defineProperty(Tensor, Symbol.hasInstance, { + value: (instance) => { + return !!instance && instance.data != null && instance.dataSync != null && instance.throwIfDisposed != null; + } +}); +function getGlobalTensorClass() { + return getGlobal("Tensor", () => { + return Tensor; + }); +} +getGlobalTensorClass(); +var Variable = class extends Tensor { + constructor(initialValue, trainable, name6, tensorId) { + super(initialValue.shape, initialValue.dtype, initialValue.dataId, tensorId); + this.trainable = trainable; + this.name = name6; + } + assign(newValue) { + if (newValue.dtype !== this.dtype) { + throw new Error(`dtype of the new value (${newValue.dtype}) and previous value (${this.dtype}) must match`); + } + if (!arraysEqual(newValue.shape, this.shape)) { + throw new Error(`shape of the new value (${newValue.shape}) and previous value (${this.shape}) must match`); + } + trackerFn().disposeTensor(this); + this.dataId = newValue.dataId; + trackerFn().incRef(this, null); + } + dispose() { + trackerFn().disposeVariable(this); + this.isDisposedInternal = true; + } +}; +Object.defineProperty(Variable, Symbol.hasInstance, { + value: (instance) => { + return instance instanceof Tensor && instance.assign != null && instance.assign instanceof Function; + } +}); +var tensor_util_exports = {}; +__export2(tensor_util_exports, { + assertTypesMatch: () => assertTypesMatch, + getTensorsInContainer: () => getTensorsInContainer, + isTensorInList: () => isTensorInList, + makeTypesMatch: () => makeTypesMatch +}); +var Rank; +(function(Rank2) { + Rank2["R0"] = "R0"; + Rank2["R1"] = "R1"; + Rank2["R2"] = "R2"; + Rank2["R3"] = "R3"; + Rank2["R4"] = "R4"; + Rank2["R5"] = "R5"; + Rank2["R6"] = "R6"; +})(Rank || (Rank = {})); +var UpcastInt32AndMap; +(function(UpcastInt32AndMap2) { + UpcastInt32AndMap2["float32"] = "float32"; + UpcastInt32AndMap2["int32"] = "int32"; + UpcastInt32AndMap2["bool"] = "int32"; + UpcastInt32AndMap2["complex64"] = "complex64"; +})(UpcastInt32AndMap || (UpcastInt32AndMap = {})); +var UpcastBoolAndMap; +(function(UpcastBoolAndMap2) { + UpcastBoolAndMap2["float32"] = "float32"; + UpcastBoolAndMap2["int32"] = "int32"; + UpcastBoolAndMap2["bool"] = "bool"; + UpcastBoolAndMap2["complex64"] = "complex64"; +})(UpcastBoolAndMap || (UpcastBoolAndMap = {})); +var UpcastFloat32AndMap; +(function(UpcastFloat32AndMap2) { + UpcastFloat32AndMap2["float32"] = "float32"; + UpcastFloat32AndMap2["int32"] = "float32"; + UpcastFloat32AndMap2["bool"] = "float32"; + UpcastFloat32AndMap2["complex64"] = "complex64"; +})(UpcastFloat32AndMap || (UpcastFloat32AndMap = {})); +var UpcastComplex64AndMap; +(function(UpcastComplex64AndMap2) { + UpcastComplex64AndMap2["float32"] = "complex64"; + UpcastComplex64AndMap2["int32"] = "complex64"; + UpcastComplex64AndMap2["bool"] = "complex64"; + UpcastComplex64AndMap2["complex64"] = "complex64"; +})(UpcastComplex64AndMap || (UpcastComplex64AndMap = {})); +var upcastTypeMap = { + "float32": UpcastFloat32AndMap, + "int32": UpcastInt32AndMap, + "bool": UpcastBoolAndMap, + "complex64": UpcastComplex64AndMap +}; +function upcastType(typeA, typeB) { + if (typeA === "string" || typeB === "string") { + if (typeA === "string" && typeB === "string") { + return "string"; + } + throw new Error(`Can not upcast ${typeA} with ${typeB}`); + } + return upcastTypeMap[typeA][typeB]; +} +function sumOutType(type) { + return upcastType(type, "int32"); +} +function makeTypesMatch(a, b) { + if (a.dtype === b.dtype) { + return [a, b]; + } + const dtype = upcastType(a.dtype, b.dtype); + return [a.cast(dtype), b.cast(dtype)]; +} +function assertTypesMatch(a, b) { + assert(a.dtype === b.dtype, () => `The dtypes of the first(${a.dtype}) and second(${b.dtype}) input must match`); +} +function isTensorInList(tensor2, tensorList) { + return tensorList.some((x) => x.id === tensor2.id); +} +function getTensorsInContainer(result) { + const list = []; + const seen = new Set(); + walkTensorContainer(result, list, seen); + return list; +} +function walkTensorContainer(container, list, seen) { + if (container == null) { + return; + } + if (container instanceof Tensor) { + list.push(container); + return; + } + if (!isIterable(container)) { + return; + } + const iterable = container; + for (const k in iterable) { + const val = iterable[k]; + if (!seen.has(val)) { + seen.add(val); + walkTensorContainer(val, list, seen); + } + } +} +function isIterable(obj) { + return Array.isArray(obj) || typeof obj === "object"; +} +function isRegisteredKernelInvocation(kernelInvocation) { + return kernelInvocation.kernelName != null; +} +var EngineState = 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 = false; + this.activeProfile = { + newBytes: 0, + newTensors: 0, + peakBytes: 0, + kernels: [], + result: null, + get kernelNames() { + return Array.from(new Set(this.kernels.map((k) => k.name))); + } + }; + } + dispose() { + for (const variableName in this.registeredVariables) { + this.registeredVariables[variableName].dispose(); + } + } +}; +var Engine = class { + constructor(ENV5) { + this.ENV = ENV5; + this.registry = {}; + this.registryFactory = {}; + this.pendingBackendInitId = 0; + this.state = new EngineState(); + } + async ready() { + if (this.pendingBackendInit != null) { + return this.pendingBackendInit.then(() => { + }); + } + if (this.backendInstance != null) { + return; + } + const sortedBackends = this.getSortedBackends(); + for (let i = 0; i < sortedBackends.length; i++) { + const backendName = sortedBackends[i]; + const success = await this.initializeBackend(backendName).success; + if (success) { + await this.setBackend(backendName); + return; + } + } + throw new Error(`Could not initialize any backends, all backend initializations failed.`); + } + get backend() { + if (this.pendingBackendInit != null) { + throw new Error(`Backend '${this.backendName}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`); + } + if (this.backendInstance == null) { + const { name: name6, asyncInit } = this.initializeBackendsAndReturnBest(); + if (asyncInit) { + throw new Error(`The highest priority backend '${name6}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`); + } + this.setBackend(name6); + } + return this.backendInstance; + } + backendNames() { + return Object.keys(this.registryFactory); + } + findBackend(backendName) { + if (!(backendName in this.registry)) { + if (backendName in this.registryFactory) { + const { asyncInit } = this.initializeBackend(backendName); + if (asyncInit) { + return null; + } + } else { + return null; + } + } + return this.registry[backendName]; + } + findBackendFactory(backendName) { + if (!(backendName in this.registryFactory)) { + return null; + } + return this.registryFactory[backendName].factory; + } + registerBackend(backendName, factory, priority = 1) { + if (backendName in this.registryFactory) { + console.warn(`${backendName} backend was already registered. Reusing existing backend factory.`); + return false; + } + this.registryFactory[backendName] = { factory, priority }; + return true; + } + async setBackend(backendName) { + if (this.registryFactory[backendName] == null) { + throw new Error(`Backend name '${backendName}' not found in registry`); + } + this.backendName = backendName; + if (this.registry[backendName] == null) { + this.backendInstance = null; + const { success, asyncInit } = this.initializeBackend(backendName); + const result = asyncInit ? await success : success; + if (!result) { + return false; + } + } + this.backendInstance = this.registry[backendName]; + this.setupRegisteredKernels(); + this.profiler = new Profiler(this.backendInstance); + return true; + } + setupRegisteredKernels() { + const kernels = getKernelsForBackend(this.backendName); + kernels.forEach((kernel) => { + if (kernel.setupFunc != null) { + kernel.setupFunc(this.backendInstance); + } + }); + } + disposeRegisteredKernels(backendName) { + const kernels = getKernelsForBackend(backendName); + kernels.forEach((kernel) => { + if (kernel.disposeFunc != null) { + kernel.disposeFunc(this.registry[backendName]); + } + }); + } + initializeBackend(backendName) { + const registryFactoryEntry = this.registryFactory[backendName]; + if (registryFactoryEntry == null) { + throw new Error(`Cannot initialize backend ${backendName}, no registration found.`); + } + try { + const backend22 = registryFactoryEntry.factory(); + if (backend22 && !(backend22 instanceof KernelBackend) && typeof backend22.then === "function") { + const promiseId = ++this.pendingBackendInitId; + const success = backend22.then((backendInstance) => { + if (promiseId < this.pendingBackendInitId) { + return false; + } + this.registry[backendName] = backendInstance; + this.pendingBackendInit = null; + return true; + }).catch((err) => { + if (promiseId < this.pendingBackendInitId) { + return false; + } + this.pendingBackendInit = null; + console.warn(`Initialization of backend ${backendName} failed`); + console.warn(err.stack || err.message); + return false; + }); + this.pendingBackendInit = success; + return { success, asyncInit: true }; + } else { + this.registry[backendName] = backend22; + return { success: true, asyncInit: false }; + } + } catch (err) { + console.warn(`Initialization of backend ${backendName} failed`); + console.warn(err.stack || err.message); + return { success: false, asyncInit: false }; + } + } + removeBackend(backendName) { + if (!(backendName in this.registryFactory)) { + throw new Error(`${backendName} backend not found in registry`); + } + if (this.backendName === backendName && this.pendingBackendInit != null) { + this.pendingBackendInitId++; + } + if (backendName in this.registry) { + this.disposeRegisteredKernels(backendName); + this.registry[backendName].dispose(); + delete this.registry[backendName]; + } + delete this.registryFactory[backendName]; + if (this.backendName === backendName) { + this.pendingBackendInit = null; + this.backendName = null; + this.backendInstance = null; + } + } + getSortedBackends() { + if (Object.keys(this.registryFactory).length === 0) { + throw new Error("No backend found in registry."); + } + return Object.keys(this.registryFactory).sort((a, b) => { + return this.registryFactory[b].priority - this.registryFactory[a].priority; + }); + } + initializeBackendsAndReturnBest() { + const sortedBackends = this.getSortedBackends(); + for (let i = 0; i < sortedBackends.length; i++) { + const backendName = sortedBackends[i]; + const { success, asyncInit } = this.initializeBackend(backendName); + if (asyncInit || success) { + return { name: backendName, asyncInit }; + } + } + throw new Error(`Could not initialize any backends, all backend initializations failed.`); + } + moveData(backend22, dataId) { + const info2 = this.state.tensorInfo.get(dataId); + const srcBackend = info2.backend; + const values = this.readSync(dataId); + const refCount = srcBackend.refCount(dataId); + srcBackend.disposeData(dataId, true); + info2.backend = backend22; + backend22.move(dataId, values, info2.shape, info2.dtype, refCount); + if (this.shouldCheckForMemLeaks()) { + this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]++; + } + } + tidy(nameOrFn, fn) { + let name6 = null; + if (fn == null) { + if (typeof nameOrFn !== "function") { + throw new Error("Please provide a function to tidy()"); + } + fn = nameOrFn; + } else { + if (typeof nameOrFn !== "string" && !(nameOrFn instanceof String)) { + throw new Error("When calling with two arguments, the first argument to tidy() must be a string"); + } + if (typeof fn !== "function") { + throw new Error("When calling with two arguments, the 2nd argument to tidy() must be a function"); + } + name6 = nameOrFn; + } + let result; + return this.scopedRun(() => this.startScope(name6), () => this.endScope(result), () => { + result = fn(); + if (result instanceof Promise) { + console.error("Cannot return a Promise inside of tidy."); + } + return result; + }); + } + scopedRun(start, end, f) { + start(); + try { + const res = f(); + end(); + return res; + } catch (ex) { + end(); + throw ex; + } + } + nextTensorId() { + return Engine.nextTensorId++; + } + nextVariableId() { + return Engine.nextVariableId++; + } + clone(x) { + const y = ENGINE.runKernel(Identity, { x }); + const inputs = { x }; + const grad2 = (dy) => ({ + x: () => { + const dtype = "float32"; + const gradInputs = { x: dy }; + const attrs = { dtype }; + return ENGINE.runKernel(Cast, gradInputs, attrs); + } + }); + const saved = []; + this.addTapeNode(this.state.activeScope.name, inputs, [y], grad2, saved, {}); + return y; + } + runKernel(kernelName, inputs, attrs) { + const hasKernel = getKernel(kernelName, this.backendName) != null; + if (!hasKernel) { + throw new Error(`Kernel '${kernelName}' not registered for backend '${this.backendName}'`); + } + return this.runKernelFunc({ kernelName, inputs, attrs }); + } + shouldCheckForMemLeaks() { + return this.ENV.getBool("IS_TEST"); + } + checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos) { + const numDataIdsAfter = this.backend.numDataIds(); + let numOutputDataIds = 0; + outInfos.forEach((info2) => { + numOutputDataIds += info2.dtype === "complex64" ? 3 : 1; + }); + const numMoves = this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]; + const dataIdsLeaked = numDataIdsAfter - numDataIdsBefore - numOutputDataIds - numMoves; + if (dataIdsLeaked > 0) { + throw new Error(`Backend '${this.backendName}' has an internal memory leak (${dataIdsLeaked} data ids) after running '${kernelName}'`); + } + } + runKernelFunc(kernelParams) { + let outputs; + let saved = []; + const isTapeOn = this.isTapeOn(); + const startingBytecount = this.state.numBytes; + const startingNumTensors = this.state.numTensors; + if (this.shouldCheckForMemLeaks()) { + this.state.numDataMovesStack.push(0); + } + let kernelFunc3; + if (this.backendName == null) { + this.backend; + } + let out; + const kernelOrScopeName = isRegisteredKernelInvocation(kernelParams) ? kernelParams.kernelName : this.state.activeScope != null ? this.state.activeScope.name : ""; + if (isRegisteredKernelInvocation(kernelParams)) { + const { kernelName, inputs: inputs2, attrs: attrs2 } = kernelParams; + if (this.backendName == null) { + this.backend; + } + const kernel = getKernel(kernelName, this.backendName); + assert(kernel != null, () => `Cannot find registered kernel '${kernelName}' for backend '${this.backendName}'`); + kernelFunc3 = () => { + const numDataIdsBefore = this.backend.numDataIds(); + out = kernel.kernelFunc({ inputs: inputs2, attrs: attrs2, backend: this.backend }); + const outInfos = Array.isArray(out) ? out : [out]; + if (this.shouldCheckForMemLeaks()) { + this.checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos); + } + const outTensors = outInfos.map((outInfo) => { + if (outInfo.rank != null) { + return outInfo; + } + const { dataId, shape, dtype } = outInfo; + return this.makeTensorFromDataId(dataId, shape, dtype); + }); + if (isTapeOn) { + const tensorsToSave = this.getTensorsForGradient(kernelName, inputs2, outTensors); + saved = this.saveTensorsForBackwardMode(tensorsToSave); + } + return outTensors; + }; + } else { + const { forwardFunc } = kernelParams; + const saveFunc = (tensors) => { + if (!isTapeOn) { + return; + } + saved = tensors.map((tensor2) => this.keep(this.clone(tensor2))); + }; + kernelFunc3 = () => { + const numDataIdsBefore = this.backend.numDataIds(); + out = this.tidy(() => forwardFunc(this.backend, saveFunc)); + const outs = Array.isArray(out) ? out : [out]; + if (this.shouldCheckForMemLeaks()) { + this.checkKernelForMemLeak(kernelOrScopeName, numDataIdsBefore, outs); + } + return outs; + }; + } + const { inputs, attrs } = kernelParams; + const backwardsFunc = isRegisteredKernelInvocation(kernelParams) ? null : kernelParams.backwardsFunc; + let kernelProfile; + this.scopedRun(() => this.state.kernelDepth++, () => this.state.kernelDepth--, () => { + if (!this.ENV.getBool("DEBUG") && !this.state.profiling) { + outputs = kernelFunc3(); + } else { + kernelProfile = this.profiler.profileKernel(kernelOrScopeName, inputs, () => kernelFunc3()); + if (this.ENV.getBool("DEBUG")) { + this.profiler.logKernelProfile(kernelProfile); + } + outputs = kernelProfile.outputs; + } + }); + if (isTapeOn) { + this.addTapeNode(kernelOrScopeName, inputs, outputs, backwardsFunc, saved, attrs); + } + if (this.state.profiling) { + this.state.activeProfile.kernels.push({ + name: kernelOrScopeName, + bytesAdded: this.state.numBytes - startingBytecount, + totalBytesSnapshot: this.state.numBytes, + tensorsAdded: this.state.numTensors - startingNumTensors, + totalTensorsSnapshot: this.state.numTensors, + inputShapes: Object.keys(inputs).map((key) => inputs[key] != null ? inputs[key].shape : null), + outputShapes: outputs.map((item) => item.shape), + kernelTimeMs: kernelProfile.timeMs, + extraInfo: kernelProfile.extraInfo + }); + } + return Array.isArray(out) ? outputs : outputs[0]; + } + saveTensorsForBackwardMode(tensors) { + const saved = tensors.map((tensor2) => this.keep(this.clone(tensor2))); + return saved; + } + getTensorsForGradient(kernelName, inputs, outputs) { + const gradConfig = getGradient(kernelName); + if (gradConfig != null) { + const inputsToSave = gradConfig.inputsToSave || []; + const outputsToSave = gradConfig.outputsToSave || []; + let inputTensorsToSave; + if (gradConfig.saveAllInputs) { + assert(Array.isArray(inputs), () => "saveAllInputs is true, expected inputs to be an array."); + inputTensorsToSave = Object.keys(inputs).map((key) => inputs[key]); + } else { + inputTensorsToSave = inputsToSave.map((inputName) => inputs[inputName]); + } + const outputTensorsToSave = outputs.filter((_, i) => outputsToSave[i]); + return inputTensorsToSave.concat(outputTensorsToSave); + } + return []; + } + makeTensor(values, shape, dtype, backend22) { + if (values == null) { + throw new Error("Values passed to engine.makeTensor() are null"); + } + dtype = dtype || "float32"; + backend22 = backend22 || this.backend; + let backendVals = values; + if (dtype === "string" && isString(values[0])) { + backendVals = values.map((d) => encodeString(d)); + } + const dataId = backend22.write(backendVals, shape, dtype); + const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); + this.trackTensor(t, backend22); + if (dtype === "string") { + const info2 = this.state.tensorInfo.get(dataId); + const newBytes = bytesFromStringArray(backendVals); + this.state.numBytes += newBytes - info2.bytes; + info2.bytes = newBytes; + } + return t; + } + makeTensorFromDataId(dataId, shape, dtype, backend22) { + dtype = dtype || "float32"; + const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); + this.trackTensor(t, backend22); + return t; + } + makeVariable(initialValue, trainable = true, name6, dtype) { + name6 = name6 || this.nextVariableId().toString(); + if (dtype != null && dtype !== initialValue.dtype) { + initialValue = initialValue.cast(dtype); + } + const v = new Variable(initialValue, trainable, name6, this.nextTensorId()); + if (this.state.registeredVariables[v.name] != null) { + throw new Error(`Variable with name ${v.name} was already registered`); + } + this.state.registeredVariables[v.name] = v; + this.incRef(v, this.backend); + return v; + } + trackTensor(a, backend22) { + this.state.numTensors++; + if (a.dtype === "string") { + this.state.numStringTensors++; + } + let bytes = 0; + if (a.dtype !== "complex64" && a.dtype !== "string") { + bytes = a.size * bytesPerElement(a.dtype); + } + this.state.numBytes += bytes; + if (!this.state.tensorInfo.has(a.dataId)) { + this.state.numDataBuffers++; + this.state.tensorInfo.set(a.dataId, { + backend: backend22 || this.backend, + dtype: a.dtype, + shape: a.shape, + bytes + }); + } + if (!(a instanceof Variable)) { + this.track(a); + } + } + incRef(a, backend22) { + this.trackTensor(a, backend22); + this.backend.incRef(a.dataId); + } + removeDataId(dataId, backend22) { + if (this.state.tensorInfo.has(dataId) && this.state.tensorInfo.get(dataId).backend === backend22) { + this.state.tensorInfo.delete(dataId); + this.state.numDataBuffers--; + } + } + disposeTensor(a) { + if (!this.state.tensorInfo.has(a.dataId)) { + return; + } + const info2 = this.state.tensorInfo.get(a.dataId); + this.state.numTensors--; + if (a.dtype === "string") { + this.state.numStringTensors--; + this.state.numBytes -= info2.bytes; + } + if (a.dtype !== "complex64" && a.dtype !== "string") { + const bytes = a.size * bytesPerElement(a.dtype); + this.state.numBytes -= bytes; + } + if (info2.backend.disposeData(a.dataId)) { + this.removeDataId(a.dataId, info2.backend); + } + } + disposeVariables() { + for (const varName in this.state.registeredVariables) { + const v = this.state.registeredVariables[varName]; + this.disposeVariable(v); + } + } + disposeVariable(v) { + this.disposeTensor(v); + if (this.state.registeredVariables[v.name] != null) { + delete this.state.registeredVariables[v.name]; + } + } + memory() { + const info2 = this.backend.memory(); + info2.numTensors = this.state.numTensors; + info2.numDataBuffers = this.state.numDataBuffers; + info2.numBytes = this.state.numBytes; + if (this.state.numStringTensors > 0) { + info2.unreliable = true; + if (info2.reasons == null) { + info2.reasons = []; + } + info2.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)"); + } + return info2; + } + async profile(query) { + this.state.profiling = true; + const startBytes = this.state.numBytes; + const startNumTensors = this.state.numTensors; + this.state.activeProfile.kernels = []; + this.state.activeProfile.result = await query(); + this.state.profiling = false; + this.state.activeProfile.peakBytes = Math.max(...this.state.activeProfile.kernels.map((d) => d.totalBytesSnapshot)); + this.state.activeProfile.newBytes = this.state.numBytes - startBytes; + this.state.activeProfile.newTensors = this.state.numTensors - startNumTensors; + for (const kernel of this.state.activeProfile.kernels) { + kernel.kernelTimeMs = await kernel.kernelTimeMs; + kernel.extraInfo = await kernel.extraInfo; + } + return this.state.activeProfile; + } + isTapeOn() { + return this.state.gradientDepth > 0 && this.state.kernelDepth === 0; + } + addTapeNode(kernelName, inputs, outputs, gradientsFunc, saved, attrs) { + const tapeNode = { id: this.state.nextTapeNodeId++, kernelName, inputs, outputs, saved }; + const gradConfig = getGradient(kernelName); + if (gradConfig != null) { + gradientsFunc = gradConfig.gradFunc; + } + if (gradientsFunc != null) { + tapeNode.gradient = (dys) => { + dys = dys.map((dy, i) => { + if (dy == null) { + const output = outputs[i]; + const vals = makeZerosTypedArray(output.size, output.dtype); + return this.makeTensor(vals, output.shape, output.dtype); + } + return dy; + }); + return gradientsFunc(dys.length > 1 ? dys : dys[0], saved, attrs); + }; + } + this.state.activeTape.push(tapeNode); + } + keep(result) { + result.kept = true; + return result; + } + startTape() { + if (this.state.gradientDepth === 0) { + this.state.activeTape = []; + } + this.state.gradientDepth++; + } + endTape() { + this.state.gradientDepth--; + } + startScope(name6) { + const scopeInfo = { + track: [], + name: "unnamed scope", + id: this.state.nextScopeId++ + }; + if (name6) { + scopeInfo.name = name6; + } + this.state.scopeStack.push(scopeInfo); + this.state.activeScope = scopeInfo; + } + endScope(result) { + const tensorsToTrackInParent = getTensorsInContainer(result); + const tensorsToTrackInParentSet = new Set(tensorsToTrackInParent.map((t) => t.id)); + for (let i = 0; i < this.state.activeScope.track.length; i++) { + const tensor2 = this.state.activeScope.track[i]; + if (!tensor2.kept && !tensorsToTrackInParentSet.has(tensor2.id)) { + tensor2.dispose(); + } + } + const oldScope = this.state.scopeStack.pop(); + this.state.activeScope = this.state.scopeStack.length === 0 ? null : this.state.scopeStack[this.state.scopeStack.length - 1]; + tensorsToTrackInParent.forEach((tensor2) => { + if (!tensor2.kept && tensor2.scopeId === oldScope.id) { + this.track(tensor2); + } + }); + } + gradients(f, xs, dy, allowNoGradients = false) { + assert(xs.length > 0, () => "gradients() received an empty list of xs."); + if (dy != null && dy.dtype !== "float32") { + throw new Error(`dy must have 'float32' dtype, but has '${dy.dtype}'`); + } + const y = this.scopedRun(() => this.startTape(), () => this.endTape(), () => this.tidy("forward", f)); + assert(y instanceof Tensor, () => "The result y returned by f() must be a tensor."); + const filteredTape = getFilteredNodesXToY(this.state.activeTape, xs, y); + if (!allowNoGradients && filteredTape.length === 0 && xs.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", () => { + const accumulatedGradientMap = {}; + accumulatedGradientMap[y.id] = dy == null ? ones(y.shape) : dy; + backpropagateGradients(accumulatedGradientMap, filteredTape, (f2) => this.tidy(f2), add); + const grads2 = xs.map((x) => accumulatedGradientMap[x.id]); + if (this.state.gradientDepth === 0) { + this.state.activeTape.forEach((node) => { + for (const tensor2 of node.saved) { + tensor2.dispose(); + } + }); + this.state.activeTape = null; + } + return { value: y, grads: grads2 }; + }); + } + customGrad(f) { + assert(isFunction(f), () => "The f passed in customGrad(f) must be a function."); + return (...inputs) => { + assert(inputs.every((t) => t instanceof Tensor), () => "The args passed in customGrad(f)(x1, x2,...) must all be tensors"); + let res; + const inputMap = {}; + inputs.forEach((input2, i) => { + inputMap[i] = input2; + }); + const forwardFunc = (_, save) => { + res = f(...[...inputs, save]); + assert(res.value instanceof Tensor, () => "The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"); + assert(isFunction(res.gradFunc), () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."); + return res.value; + }; + const backwardsFunc = (dy, saved) => { + const gradRes = res.gradFunc(dy, saved); + const grads2 = Array.isArray(gradRes) ? gradRes : [gradRes]; + assert(grads2.length === inputs.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(...)."); + assert(grads2.every((t) => t instanceof Tensor), () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors."); + const gradMap = {}; + grads2.forEach((grad2, i) => { + gradMap[i] = () => grad2; + }); + return gradMap; + }; + return this.runKernelFunc({ + forwardFunc, + backwardsFunc, + inputs: inputMap + }); + }; + } + readSync(dataId) { + const info2 = this.state.tensorInfo.get(dataId); + return info2.backend.readSync(dataId); + } + read(dataId) { + const info2 = this.state.tensorInfo.get(dataId); + return info2.backend.read(dataId); + } + async time(query) { + const start = now2(); + const timingInfo = await this.backend.time(query); + timingInfo.wallMs = now2() - start; + return timingInfo; + } + track(result) { + if (this.state.activeScope != null) { + result.scopeId = this.state.activeScope.id; + this.state.activeScope.track.push(result); + } + return result; + } + get registeredVariables() { + return this.state.registeredVariables; + } + reset() { + this.pendingBackendInitId++; + this.state.dispose(); + this.ENV.reset(); + this.state = new EngineState(); + for (const backendName in this.registry) { + this.disposeRegisteredKernels(backendName); + this.registry[backendName].dispose(); + delete this.registry[backendName]; + } + this.backendName = null; + this.backendInstance = null; + this.pendingBackendInit = null; + } +}; +Engine.nextTensorId = 0; +Engine.nextVariableId = 0; +function ones(shape) { + const values = makeOnesTypedArray(sizeFromShape(shape), "float32"); + return ENGINE.makeTensor(values, shape, "float32"); +} +function getOrMakeEngine() { + const ns = getGlobalNamespace(); + if (ns._tfengine == null) { + const environment = new Environment(ns); + ns._tfengine = new Engine(environment); + } + setEnvironmentGlobal(ns._tfengine.ENV); + setTensorTracker(() => ns._tfengine); + return ns._tfengine; +} +var ENGINE = getOrMakeEngine(); +function add(a, b) { + const inputs = { a, b }; + return ENGINE.runKernel(Add, inputs); +} +var device_util_exports = {}; +__export2(device_util_exports, { + isBrowser: () => isBrowser, + isMobile: () => isMobile +}); +function _isNavigatorDefined() { + return typeof navigator !== "undefined" && navigator != null; +} +function isMobile(nav) { + if (nav || _isNavigatorDefined()) { + if (!nav) { + nav = navigator; + } + if (nav.product === "ReactNative") { + return true; + } + const a = nav.userAgent || nav.vendor || window.opera; + 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(a) || /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(a.substr(0, 4)); + } + return false; +} +function isBrowser() { + return typeof window !== "undefined" && window.document != null || typeof WorkerGlobalScope !== "undefined"; +} +var ENV2 = env(); +ENV2.registerFlag("DEBUG", () => false, (debugValue) => { + if (debugValue) { + 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."); + } +}); +ENV2.registerFlag("IS_BROWSER", () => isBrowser()); +ENV2.registerFlag("IS_NODE", () => typeof process !== "undefined" && typeof process.versions !== "undefined" && typeof process.versions.node !== "undefined"); +ENV2.registerFlag("IS_CHROME", () => typeof navigator !== "undefined" && navigator != null && navigator.userAgent != null && /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor)); +ENV2.registerFlag("PROD", () => false); +ENV2.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY", () => ENV2.getBool("DEBUG")); +ENV2.registerFlag("DEPRECATION_WARNINGS_ENABLED", () => true); +ENV2.registerFlag("IS_TEST", () => false); +ENV2.registerFlag("CHECK_COMPUTATION_FOR_ERRORS", () => true); +ENV2.registerFlag("WRAP_TO_IMAGEBITMAP", () => false); +function inferShape(val, dtype) { + let firstElem = val; + if (isTypedArray(val)) { + return dtype === "string" ? [] : [val.length]; + } + if (!Array.isArray(val)) { + return []; + } + const shape = []; + while (Array.isArray(firstElem) || isTypedArray(firstElem) && dtype !== "string") { + shape.push(firstElem.length); + firstElem = firstElem[0]; + } + if (Array.isArray(val) && env().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")) { + deepAssertShapeConsistency(val, shape, []); + } + return shape; +} +function deepAssertShapeConsistency(val, shape, indices) { + indices = indices || []; + if (!Array.isArray(val) && !isTypedArray(val)) { + assert(shape.length === 0, () => `Element arr[${indices.join("][")}] is a primitive, but should be an array/TypedArray of ${shape[0]} elements`); + return; + } + assert(shape.length > 0, () => `Element arr[${indices.join("][")}] should be a primitive, but is an array of ${val.length} elements`); + assert(val.length === shape[0], () => `Element arr[${indices.join("][")}] should have ${shape[0]} elements, but has ${val.length} elements`); + const subShape = shape.slice(1); + for (let i = 0; i < val.length; ++i) { + deepAssertShapeConsistency(val[i], subShape, indices.concat(i)); + } +} +function assertDtype(expectedDtype, actualDType, argName, functionName) { + if (expectedDtype === "string_or_numeric") { + return; + } + if (expectedDtype == null) { + throw new Error(`Expected dtype cannot be null.`); + } + if (expectedDtype !== "numeric" && expectedDtype !== actualDType || expectedDtype === "numeric" && actualDType === "string") { + throw new Error(`Argument '${argName}' passed to '${functionName}' must be ${expectedDtype} tensor, but got ${actualDType} tensor`); + } +} +function convertToTensor(x, argName, functionName, parseAsDtype = "numeric") { + if (x instanceof Tensor) { + assertDtype(parseAsDtype, x.dtype, argName, functionName); + return x; + } + let inferredDtype = inferDtype(x); + if (inferredDtype !== "string" && ["bool", "int32", "float32"].indexOf(parseAsDtype) >= 0) { + inferredDtype = parseAsDtype; + } + assertDtype(parseAsDtype, inferredDtype, argName, functionName); + if (x == null || !isTypedArray(x) && !Array.isArray(x) && typeof x !== "number" && typeof x !== "boolean" && typeof x !== "string") { + const type = x == null ? "null" : x.constructor.name; + throw new Error(`Argument '${argName}' passed to '${functionName}' must be a Tensor or TensorLike, but got '${type}'`); + } + const inferredShape = inferShape(x, inferredDtype); + if (!isTypedArray(x) && !Array.isArray(x)) { + x = [x]; + } + const skipTypedArray = true; + const values = inferredDtype !== "string" ? toTypedArray(x, inferredDtype) : flatten(x, [], skipTypedArray); + return ENGINE.makeTensor(values, inferredShape, inferredDtype); +} +function convertToTensorArray(arg, argName, functionName, parseAsDtype = "numeric") { + if (!Array.isArray(arg)) { + throw new Error(`Argument ${argName} passed to ${functionName} must be a \`Tensor[]\` or \`TensorLike[]\``); + } + const tensors = arg; + return tensors.map((t, i) => convertToTensor(t, `${argName}[${i}]`, functionName, parseAsDtype)); +} +var OP_SCOPE_SUFFIX = "__op"; +function op(f) { + const keys = Object.keys(f); + if (keys.length !== 1) { + throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${keys.length} keys.`); + } + let opName = keys[0]; + const fn = f[opName]; + if (opName.endsWith("_")) { + opName = opName.substring(0, opName.length - 1); + } + opName = opName + OP_SCOPE_SUFFIX; + const f2 = (...args) => { + ENGINE.startScope(opName); + try { + const result = fn(...args); + if (isPromise(result)) { + console.error("Cannot return a Promise inside of tidy."); + } + ENGINE.endScope(result); + return result; + } catch (ex) { + ENGINE.endScope(null); + throw ex; + } + }; + Object.defineProperty(f2, "name", { value: opName, configurable: true }); + return f2; +} +function complex_(real4, imag4) { + const $real = convertToTensor(real4, "real", "complex"); + const $imag = convertToTensor(imag4, "imag", "complex"); + assertShapesMatch($real.shape, $imag.shape, `real and imag shapes, ${$real.shape} and ${$imag.shape}, must match in call to tf.complex().`); + const inputs = { real: $real, imag: $imag }; + return ENGINE.runKernel(Complex, inputs); +} +var complex = op({ complex_ }); +function makeTensor(values, shape, inferredShape, dtype) { + if (dtype == null) { + dtype = inferDtype(values); + } + if (dtype === "complex64") { + throw new Error(`Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).`); + } + if (!isTypedArray(values) && !Array.isArray(values) && typeof values !== "number" && typeof values !== "boolean" && typeof values !== "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 (shape != null) { + assertNonNegativeIntegerDimensions(shape); + const providedSize = sizeFromShape(shape); + const inferredSize = sizeFromShape(inferredShape); + assert(providedSize === inferredSize, () => `Based on the provided shape, [${shape}], the tensor should have ${providedSize} values but has ${inferredSize}`); + for (let i = 0; i < inferredShape.length; ++i) { + const inferred = inferredShape[i]; + const flatDimsDontMatch = i === inferredShape.length - 1 ? inferred !== sizeFromShape(shape.slice(i)) : true; + assert(inferredShape[i] === shape[i] || !flatDimsDontMatch, () => `Error creating a new Tensor. Inferred shape (${inferredShape}) does not match the provided shape (${shape}). `); + } + } + if (!isTypedArray(values) && !Array.isArray(values)) { + values = [values]; + } + shape = shape || inferredShape; + values = dtype !== "string" ? toTypedArray(values, dtype) : flatten(values, [], true); + return ENGINE.makeTensor(values, shape, dtype); +} +function tensor(values, shape, dtype) { + const inferredShape = inferShape(values, dtype); + return makeTensor(values, shape, inferredShape, dtype); +} +var DTYPE_VALUE_SIZE_MAP = { + "float32": 4, + "float16": 2, + "int32": 4, + "uint16": 2, + "uint8": 1, + "bool": 1, + "complex64": 8 +}; +var NUM_BYTES_STRING_LENGTH = 4; +async function encodeWeights(tensors, group) { + const specs = []; + const dataPromises = []; + const names = Array.isArray(tensors) ? tensors.map((tensor2) => tensor2.name) : Object.keys(tensors); + for (let i = 0; i < names.length; ++i) { + const name6 = names[i]; + const t = Array.isArray(tensors) ? tensors[i].tensor : tensors[name6]; + if (t.dtype !== "float32" && t.dtype !== "int32" && t.dtype !== "bool" && t.dtype !== "string" && t.dtype !== "complex64") { + throw new Error(`Unsupported dtype in weight '${name6}': ${t.dtype}`); + } + const spec = { name: name6, shape: t.shape, dtype: t.dtype }; + if (t.dtype === "string") { + const utf8bytes = new Promise(async (resolve) => { + const vals = await t.bytes(); + const totalNumBytes = vals.reduce((p2, c) => p2 + c.length, 0) + NUM_BYTES_STRING_LENGTH * vals.length; + const bytes = new Uint8Array(totalNumBytes); + let offset = 0; + for (let i2 = 0; i2 < vals.length; i2++) { + const val = vals[i2]; + const bytesOfLength = new Uint8Array(new Uint32Array([val.length]).buffer); + bytes.set(bytesOfLength, offset); + offset += NUM_BYTES_STRING_LENGTH; + bytes.set(val, offset); + offset += val.length; + } + resolve(bytes); + }); + dataPromises.push(utf8bytes); + } else { + dataPromises.push(t.data()); + } + if (group != null) { + spec.group = group; + } + specs.push(spec); + } + const tensorValues = await Promise.all(dataPromises); + return { data: concatenateTypedArrays(tensorValues), specs }; +} +function decodeWeights(buffer2, specs) { + const out = {}; + let float16Decode; + let offset = 0; + for (const spec of specs) { + const name6 = spec.name; + const dtype = spec.dtype; + const shape = spec.shape; + const size = sizeFromShape(shape); + let values; + if ("quantization" in spec) { + const quantization = spec.quantization; + if (quantization.dtype === "uint8" || quantization.dtype === "uint16") { + if (!("min" in quantization && "scale" in quantization)) { + throw new Error(`Weight ${spec.name} with quantization ${quantization.dtype} doesn't have corresponding metadata min and scale.`); + } + } else if (quantization.dtype === "float16") { + if (dtype !== "float32") { + throw new Error(`Weight ${spec.name} is quantized with ${quantization.dtype} which only supports weights of type float32 not ${dtype}.`); + } + } else { + throw new Error(`Weight ${spec.name} has unknown quantization dtype ${quantization.dtype}. Supported quantization dtypes are: 'uint8', 'uint16', and 'float16'.`); + } + const quantizationSizeFactor = DTYPE_VALUE_SIZE_MAP[quantization.dtype]; + const byteBuffer = buffer2.slice(offset, offset + size * quantizationSizeFactor); + const quantizedArray = quantization.dtype === "uint8" ? new Uint8Array(byteBuffer) : new Uint16Array(byteBuffer); + if (dtype === "float32") { + if (quantization.dtype === "uint8" || quantization.dtype === "uint16") { + values = new Float32Array(quantizedArray.length); + for (let i = 0; i < quantizedArray.length; i++) { + const v = quantizedArray[i]; + values[i] = v * quantization.scale + quantization.min; + } + } else if (quantization.dtype === "float16") { + if (float16Decode === void 0) { + float16Decode = getFloat16Decoder(); + } + values = float16Decode(quantizedArray); + } else { + throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type float32.`); + } + } else if (dtype === "int32") { + if (quantization.dtype !== "uint8" && quantization.dtype !== "uint16") { + throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type int32.`); + } + values = new Int32Array(quantizedArray.length); + for (let i = 0; i < quantizedArray.length; i++) { + const v = quantizedArray[i]; + values[i] = Math.round(v * quantization.scale + quantization.min); + } + } else { + throw new Error(`Unsupported dtype in weight '${name6}': ${dtype}`); + } + offset += size * quantizationSizeFactor; + } else if (dtype === "string") { + const size2 = sizeFromShape(spec.shape); + values = []; + for (let i = 0; i < size2; i++) { + const byteLength = new Uint32Array(buffer2.slice(offset, offset + NUM_BYTES_STRING_LENGTH))[0]; + offset += NUM_BYTES_STRING_LENGTH; + const bytes = new Uint8Array(buffer2.slice(offset, offset + byteLength)); + values.push(bytes); + offset += byteLength; + } + } else { + const dtypeFactor = DTYPE_VALUE_SIZE_MAP[dtype]; + const byteBuffer = buffer2.slice(offset, offset + size * dtypeFactor); + if (dtype === "float32") { + values = new Float32Array(byteBuffer); + } else if (dtype === "int32") { + values = new Int32Array(byteBuffer); + } else if (dtype === "bool") { + values = new Uint8Array(byteBuffer); + } else if (dtype === "complex64") { + values = new Float32Array(byteBuffer); + const real4 = new Float32Array(values.length / 2); + const image3 = new Float32Array(values.length / 2); + for (let i = 0; i < real4.length; i++) { + real4[i] = values[i * 2]; + image3[i] = values[i * 2 + 1]; + } + const realTensor = tensor(real4, shape, "float32"); + const imageTensor = tensor(image3, shape, "float32"); + out[name6] = complex(realTensor, imageTensor); + realTensor.dispose(); + imageTensor.dispose(); + } else { + throw new Error(`Unsupported dtype in weight '${name6}': ${dtype}`); + } + offset += size * dtypeFactor; + } + if (dtype !== "complex64") { + out[name6] = tensor(values, shape, dtype); + } + } + return out; +} +function concatenateTypedArrays(xs) { + if (xs === null) { + throw new Error(`Invalid input value: ${JSON.stringify(xs)}`); + } + let totalByteLength = 0; + const normalizedXs = []; + xs.forEach((x) => { + totalByteLength += x.byteLength; + normalizedXs.push(x.byteLength === x.buffer.byteLength ? x : new x.constructor(x)); + if (!(x instanceof Float32Array || x instanceof Int32Array || x instanceof Uint8Array)) { + throw new Error(`Unsupported TypedArray subtype: ${x.constructor.name}`); + } + }); + const y = new Uint8Array(totalByteLength); + let offset = 0; + normalizedXs.forEach((x) => { + y.set(new Uint8Array(x.buffer), offset); + offset += x.byteLength; + }); + return y.buffer; +} +var useNodeBuffer = typeof Buffer !== "undefined" && (typeof Blob === "undefined" || typeof atob === "undefined" || typeof btoa === "undefined"); +function stringByteLength(str) { + if (useNodeBuffer) { + return Buffer.byteLength(str); + } + return new Blob([str]).size; +} +function arrayBufferToBase64String(buffer2) { + if (useNodeBuffer) { + return Buffer.from(buffer2).toString("base64"); + } + const buf = new Uint8Array(buffer2); + let s = ""; + for (let i = 0, l = buf.length; i < l; i++) { + s += String.fromCharCode(buf[i]); + } + return btoa(s); +} +function base64StringToArrayBuffer(str) { + if (useNodeBuffer) { + const buf = Buffer.from(str, "base64"); + return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + } + const s = atob(str); + const buffer2 = new Uint8Array(s.length); + for (let i = 0; i < s.length; ++i) { + buffer2.set([s.charCodeAt(i)], i); + } + return buffer2.buffer; +} +function concatenateArrayBuffers(buffers) { + if (buffers.length === 1) { + return buffers[0]; + } + let totalByteLength = 0; + buffers.forEach((buffer2) => { + totalByteLength += buffer2.byteLength; + }); + const temp = new Uint8Array(totalByteLength); + let offset = 0; + buffers.forEach((buffer2) => { + temp.set(new Uint8Array(buffer2), offset); + offset += buffer2.byteLength; + }); + return temp.buffer; +} +function basename(path) { + const SEPARATOR = "/"; + path = path.trim(); + while (path.endsWith(SEPARATOR)) { + path = path.slice(0, path.length - 1); + } + const items = path.split(SEPARATOR); + return items[items.length - 1]; +} +function getModelArtifactsInfoForJSON(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("Expected JSON model topology, received ArrayBuffer."); + } + return { + dateSaved: new Date(), + modelTopologyType: "JSON", + modelTopologyBytes: modelArtifacts.modelTopology == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.modelTopology)), + weightSpecsBytes: modelArtifacts.weightSpecs == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.weightSpecs)), + weightDataBytes: modelArtifacts.weightData == null ? 0 : modelArtifacts.weightData.byteLength + }; +} +function computeFloat16MantisaTable() { + const convertMantissa = (i) => { + let m = i << 13; + let e = 0; + while ((m & 8388608) === 0) { + e -= 8388608; + m <<= 1; + } + m &= ~8388608; + e += 947912704; + return m | e; + }; + const mantisaTable = new Uint32Array(2048); + mantisaTable[0] = 0; + for (let i = 1; i < 1024; i++) { + mantisaTable[i] = convertMantissa(i); + } + for (let i = 1024; i < 2048; i++) { + mantisaTable[i] = 939524096 + (i - 1024 << 13); + } + return mantisaTable; +} +function computeFloat16ExponentTable() { + const exponentTable = new Uint32Array(64); + exponentTable[0] = 0; + exponentTable[31] = 1199570944; + exponentTable[32] = 2147483648; + exponentTable[63] = 3347054592; + for (let i = 1; i < 31; i++) { + exponentTable[i] = i << 23; + } + for (let i = 33; i < 63; i++) { + exponentTable[i] = 2147483648 + (i - 32 << 23); + } + return exponentTable; +} +function computeFloat16OffsetTable() { + const offsetTable = new Uint32Array(64); + for (let i = 0; i < 64; i++) { + offsetTable[i] = 1024; + } + offsetTable[0] = offsetTable[32] = 0; + return offsetTable; +} +function getFloat16Decoder() { + const mantisaTable = computeFloat16MantisaTable(); + const exponentTable = computeFloat16ExponentTable(); + const offsetTable = computeFloat16OffsetTable(); + return (quantizedArray) => { + const buffer2 = new ArrayBuffer(4 * quantizedArray.length); + const bufferUint32View = new Uint32Array(buffer2); + for (let index = 0; index < quantizedArray.length; index++) { + const float16Bits = quantizedArray[index]; + const float32Bits = mantisaTable[offsetTable[float16Bits >> 10] + (float16Bits & 1023)] + exponentTable[float16Bits >> 10]; + bufferUint32View[index] = float32Bits; + } + return new Float32Array(buffer2); + }; +} +var IORouterRegistry = class { + constructor() { + this.saveRouters = []; + this.loadRouters = []; + } + static getInstance() { + if (IORouterRegistry.instance == null) { + IORouterRegistry.instance = new IORouterRegistry(); + } + return IORouterRegistry.instance; + } + static registerSaveRouter(saveRouter) { + IORouterRegistry.getInstance().saveRouters.push(saveRouter); + } + static registerLoadRouter(loadRouter) { + IORouterRegistry.getInstance().loadRouters.push(loadRouter); + } + static getSaveHandlers(url) { + return IORouterRegistry.getHandlers(url, "save"); + } + static getLoadHandlers(url, loadOptions) { + return IORouterRegistry.getHandlers(url, "load", loadOptions); + } + static getHandlers(url, handlerType, loadOptions) { + const validHandlers = []; + const routers = handlerType === "load" ? IORouterRegistry.getInstance().loadRouters : IORouterRegistry.getInstance().saveRouters; + routers.forEach((router) => { + const handler = router(url, loadOptions); + if (handler !== null) { + validHandlers.push(handler); + } + }); + return validHandlers; + } +}; +var registerSaveRouter = (loudRouter) => IORouterRegistry.registerSaveRouter(loudRouter); +var registerLoadRouter = (loudRouter) => IORouterRegistry.registerLoadRouter(loudRouter); +var getSaveHandlers = (url) => IORouterRegistry.getSaveHandlers(url); +var getLoadHandlers = (url, loadOptions) => IORouterRegistry.getLoadHandlers(url, loadOptions); +var DATABASE_NAME = "tensorflowjs"; +var DATABASE_VERSION = 1; +var MODEL_STORE_NAME = "models_store"; +var INFO_STORE_NAME = "model_info_store"; +function getIndexedDBFactory() { + if (!env().getBool("IS_BROWSER")) { + throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser."); + } + const theWindow = typeof window === "undefined" ? self : window; + const factory = theWindow.indexedDB || theWindow.mozIndexedDB || theWindow.webkitIndexedDB || theWindow.msIndexedDB || theWindow.shimIndexedDB; + if (factory == null) { + throw new Error("The current browser does not appear to support IndexedDB."); + } + return factory; +} +function setUpDatabase(openRequest) { + const db = openRequest.result; + db.createObjectStore(MODEL_STORE_NAME, { keyPath: "modelPath" }); + db.createObjectStore(INFO_STORE_NAME, { keyPath: "modelPath" }); +} +var BrowserIndexedDB = class { + constructor(modelPath) { + this.indexedDB = getIndexedDBFactory(); + if (modelPath == null || !modelPath) { + throw new Error("For IndexedDB, modelPath must not be null, undefined or empty."); + } + this.modelPath = modelPath; + } + async save(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet."); + } + return this.databaseAction(this.modelPath, modelArtifacts); + } + async load() { + return this.databaseAction(this.modelPath); + } + databaseAction(modelPath, modelArtifacts) { + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + if (modelArtifacts == null) { + const modelTx = db.transaction(MODEL_STORE_NAME, "readonly"); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const getRequest = modelStore.get(this.modelPath); + getRequest.onsuccess = () => { + if (getRequest.result == null) { + db.close(); + return reject(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`)); + } else { + resolve(getRequest.result.modelArtifacts); + } + }; + getRequest.onerror = (error) => { + db.close(); + return reject(getRequest.error); + }; + modelTx.oncomplete = () => db.close(); + } else { + const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts); + const infoTx = db.transaction(INFO_STORE_NAME, "readwrite"); + let infoStore = infoTx.objectStore(INFO_STORE_NAME); + const putInfoRequest = infoStore.put({ modelPath: this.modelPath, modelArtifactsInfo }); + let modelTx; + putInfoRequest.onsuccess = () => { + modelTx = db.transaction(MODEL_STORE_NAME, "readwrite"); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const putModelRequest = modelStore.put({ + modelPath: this.modelPath, + modelArtifacts, + modelArtifactsInfo + }); + putModelRequest.onsuccess = () => resolve({ modelArtifactsInfo }); + putModelRequest.onerror = (error) => { + infoStore = infoTx.objectStore(INFO_STORE_NAME); + const deleteInfoRequest = infoStore.delete(this.modelPath); + deleteInfoRequest.onsuccess = () => { + db.close(); + return reject(putModelRequest.error); + }; + deleteInfoRequest.onerror = (error2) => { + db.close(); + return reject(putModelRequest.error); + }; + }; + }; + putInfoRequest.onerror = (error) => { + db.close(); + return reject(putInfoRequest.error); + }; + infoTx.oncomplete = () => { + if (modelTx == null) { + db.close(); + } else { + modelTx.oncomplete = () => db.close(); + } + }; + } + }; + openRequest.onerror = (error) => reject(openRequest.error); + }); + } +}; +BrowserIndexedDB.URL_SCHEME = "indexeddb://"; +var indexedDBRouter = (url) => { + if (!env().getBool("IS_BROWSER")) { + return null; + } else { + if (!Array.isArray(url) && url.startsWith(BrowserIndexedDB.URL_SCHEME)) { + return browserIndexedDB(url.slice(BrowserIndexedDB.URL_SCHEME.length)); + } else { + return null; + } + } +}; +IORouterRegistry.registerSaveRouter(indexedDBRouter); +IORouterRegistry.registerLoadRouter(indexedDBRouter); +function browserIndexedDB(modelPath) { + return new BrowserIndexedDB(modelPath); +} +function maybeStripScheme(key) { + return key.startsWith(BrowserIndexedDB.URL_SCHEME) ? key.slice(BrowserIndexedDB.URL_SCHEME.length) : key; +} +var BrowserIndexedDBManager = class { + constructor() { + this.indexedDB = getIndexedDBFactory(); + } + async listModels() { + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + const tx = db.transaction(INFO_STORE_NAME, "readonly"); + const store = tx.objectStore(INFO_STORE_NAME); + const getAllInfoRequest = store.getAll(); + getAllInfoRequest.onsuccess = () => { + const out = {}; + for (const item of getAllInfoRequest.result) { + out[item.modelPath] = item.modelArtifactsInfo; + } + resolve(out); + }; + getAllInfoRequest.onerror = (error) => { + db.close(); + return reject(getAllInfoRequest.error); + }; + tx.oncomplete = () => db.close(); + }; + openRequest.onerror = (error) => reject(openRequest.error); + }); + } + async removeModel(path) { + path = maybeStripScheme(path); + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + const infoTx = db.transaction(INFO_STORE_NAME, "readwrite"); + const infoStore = infoTx.objectStore(INFO_STORE_NAME); + const getInfoRequest = infoStore.get(path); + let modelTx; + getInfoRequest.onsuccess = () => { + if (getInfoRequest.result == null) { + db.close(); + return reject(new Error(`Cannot find model with path '${path}' in IndexedDB.`)); + } else { + const deleteInfoRequest = infoStore.delete(path); + const deleteModelData = () => { + modelTx = db.transaction(MODEL_STORE_NAME, "readwrite"); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const deleteModelRequest = modelStore.delete(path); + deleteModelRequest.onsuccess = () => resolve(getInfoRequest.result.modelArtifactsInfo); + deleteModelRequest.onerror = (error) => reject(getInfoRequest.error); + }; + deleteInfoRequest.onsuccess = deleteModelData; + deleteInfoRequest.onerror = (error) => { + deleteModelData(); + db.close(); + return reject(getInfoRequest.error); + }; + } + }; + getInfoRequest.onerror = (error) => { + db.close(); + return reject(getInfoRequest.error); + }; + infoTx.oncomplete = () => { + if (modelTx == null) { + db.close(); + } else { + modelTx.oncomplete = () => db.close(); + } + }; + }; + openRequest.onerror = (error) => reject(openRequest.error); + }); + } +}; +var PATH_SEPARATOR = "/"; +var PATH_PREFIX = "tensorflowjs_models"; +var INFO_SUFFIX = "info"; +var MODEL_TOPOLOGY_SUFFIX = "model_topology"; +var WEIGHT_SPECS_SUFFIX = "weight_specs"; +var WEIGHT_DATA_SUFFIX = "weight_data"; +var MODEL_METADATA_SUFFIX = "model_metadata"; +function getModelKeys(path) { + return { + info: [PATH_PREFIX, path, INFO_SUFFIX].join(PATH_SEPARATOR), + topology: [PATH_PREFIX, path, MODEL_TOPOLOGY_SUFFIX].join(PATH_SEPARATOR), + weightSpecs: [PATH_PREFIX, path, WEIGHT_SPECS_SUFFIX].join(PATH_SEPARATOR), + weightData: [PATH_PREFIX, path, WEIGHT_DATA_SUFFIX].join(PATH_SEPARATOR), + modelMetadata: [PATH_PREFIX, path, MODEL_METADATA_SUFFIX].join(PATH_SEPARATOR) + }; +} +function getModelPathFromKey(key) { + const items = key.split(PATH_SEPARATOR); + if (items.length < 3) { + throw new Error(`Invalid key format: ${key}`); + } + return items.slice(1, items.length - 1).join(PATH_SEPARATOR); +} +function maybeStripScheme2(key) { + return key.startsWith(BrowserLocalStorage.URL_SCHEME) ? key.slice(BrowserLocalStorage.URL_SCHEME.length) : key; +} +var BrowserLocalStorage = class { + constructor(modelPath) { + if (!env().getBool("IS_BROWSER") || typeof window === "undefined" || typeof window.localStorage === "undefined") { + throw new Error("The current environment does not support local storage."); + } + this.LS = window.localStorage; + if (modelPath == null || !modelPath) { + throw new Error("For local storage, modelPath must not be null, undefined or empty."); + } + this.modelPath = modelPath; + this.keys = getModelKeys(this.modelPath); + } + async save(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet."); + } else { + const topology = JSON.stringify(modelArtifacts.modelTopology); + const weightSpecs = JSON.stringify(modelArtifacts.weightSpecs); + const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts); + try { + this.LS.setItem(this.keys.info, JSON.stringify(modelArtifactsInfo)); + this.LS.setItem(this.keys.topology, topology); + this.LS.setItem(this.keys.weightSpecs, weightSpecs); + this.LS.setItem(this.keys.weightData, arrayBufferToBase64String(modelArtifacts.weightData)); + const result = { + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy + }; + if (modelArtifacts.signature != null) { + result.signature = modelArtifacts.signature; + } + if (modelArtifacts.userDefinedMetadata != null) { + result.userDefinedMetadata = modelArtifacts.userDefinedMetadata; + } + if (modelArtifacts.modelInitializer != null) { + result.modelInitializer = modelArtifacts.modelInitializer; + } + this.LS.setItem(this.keys.modelMetadata, JSON.stringify(result)); + return { modelArtifactsInfo }; + } catch (err) { + this.LS.removeItem(this.keys.info); + this.LS.removeItem(this.keys.topology); + this.LS.removeItem(this.keys.weightSpecs); + this.LS.removeItem(this.keys.weightData); + this.LS.removeItem(this.keys.modelMetadata); + throw new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${modelArtifactsInfo.modelTopologyBytes}, weightSpecsBytes=${modelArtifactsInfo.weightSpecsBytes}, weightDataBytes=${modelArtifactsInfo.weightDataBytes}.`); + } + } + } + async load() { + const info2 = JSON.parse(this.LS.getItem(this.keys.info)); + if (info2 == null) { + throw new Error(`In local storage, there is no model with name '${this.modelPath}'`); + } + if (info2.modelTopologyType !== "JSON") { + throw new Error("BrowserLocalStorage does not support loading non-JSON model topology yet."); + } + const out = {}; + const topology = JSON.parse(this.LS.getItem(this.keys.topology)); + if (topology == null) { + throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`); + } + out.modelTopology = topology; + const weightSpecs = JSON.parse(this.LS.getItem(this.keys.weightSpecs)); + if (weightSpecs == null) { + throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`); + } + out.weightSpecs = weightSpecs; + const metadataString = this.LS.getItem(this.keys.modelMetadata); + if (metadataString != null) { + const metadata = JSON.parse(metadataString); + out.format = metadata["format"]; + out.generatedBy = metadata["generatedBy"]; + out.convertedBy = metadata["convertedBy"]; + if (metadata["signature"] != null) { + out.signature = metadata["signature"]; + } + if (metadata["userDefinedMetadata"] != null) { + out.userDefinedMetadata = metadata["userDefinedMetadata"]; + } + if (metadata["modelInitializer"] != null) { + out.modelInitializer = metadata["modelInitializer"]; + } + } + const weightDataBase64 = this.LS.getItem(this.keys.weightData); + if (weightDataBase64 == null) { + throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`); + } + out.weightData = base64StringToArrayBuffer(weightDataBase64); + return out; + } +}; +BrowserLocalStorage.URL_SCHEME = "localstorage://"; +var localStorageRouter = (url) => { + if (!env().getBool("IS_BROWSER")) { + return null; + } else { + if (!Array.isArray(url) && url.startsWith(BrowserLocalStorage.URL_SCHEME)) { + return browserLocalStorage(url.slice(BrowserLocalStorage.URL_SCHEME.length)); + } else { + return null; + } + } +}; +IORouterRegistry.registerSaveRouter(localStorageRouter); +IORouterRegistry.registerLoadRouter(localStorageRouter); +function browserLocalStorage(modelPath) { + return new BrowserLocalStorage(modelPath); +} +var BrowserLocalStorageManager = class { + constructor() { + assert(env().getBool("IS_BROWSER"), () => "Current environment is not a web browser"); + assert(typeof window === "undefined" || typeof window.localStorage !== "undefined", () => "Current browser does not appear to support localStorage"); + this.LS = window.localStorage; + } + async listModels() { + const out = {}; + const prefix = PATH_PREFIX + PATH_SEPARATOR; + const suffix = PATH_SEPARATOR + INFO_SUFFIX; + for (let i = 0; i < this.LS.length; ++i) { + const key = this.LS.key(i); + if (key.startsWith(prefix) && key.endsWith(suffix)) { + const modelPath = getModelPathFromKey(key); + out[modelPath] = JSON.parse(this.LS.getItem(key)); + } + } + return out; + } + async removeModel(path) { + path = maybeStripScheme2(path); + const keys = getModelKeys(path); + if (this.LS.getItem(keys.info) == null) { + throw new Error(`Cannot find model at path '${path}'`); + } + const info2 = JSON.parse(this.LS.getItem(keys.info)); + this.LS.removeItem(keys.info); + this.LS.removeItem(keys.topology); + this.LS.removeItem(keys.weightSpecs); + this.LS.removeItem(keys.weightData); + return info2; + } +}; +var URL_SCHEME_SUFFIX = "://"; +var ModelStoreManagerRegistry = class { + constructor() { + this.managers = {}; + } + static getInstance() { + if (ModelStoreManagerRegistry.instance == null) { + ModelStoreManagerRegistry.instance = new ModelStoreManagerRegistry(); + } + return ModelStoreManagerRegistry.instance; + } + static registerManager(scheme, manager) { + assert(scheme != null, () => "scheme must not be undefined or null."); + if (scheme.endsWith(URL_SCHEME_SUFFIX)) { + scheme = scheme.slice(0, scheme.indexOf(URL_SCHEME_SUFFIX)); + } + assert(scheme.length > 0, () => "scheme must not be an empty string."); + const registry = ModelStoreManagerRegistry.getInstance(); + assert(registry.managers[scheme] == null, () => `A model store manager is already registered for scheme '${scheme}'.`); + registry.managers[scheme] = manager; + } + static getManager(scheme) { + const manager = this.getInstance().managers[scheme]; + if (manager == null) { + throw new Error(`Cannot find model manager for scheme '${scheme}'`); + } + return manager; + } + static getSchemes() { + return Object.keys(this.getInstance().managers); + } +}; +function parseURL(url) { + if (url.indexOf(URL_SCHEME_SUFFIX) === -1) { + throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${ModelStoreManagerRegistry.getSchemes().join(",")}`); + } + return { + scheme: url.split(URL_SCHEME_SUFFIX)[0], + path: url.split(URL_SCHEME_SUFFIX)[1] + }; +} +async function cloneModelInternal(sourceURL, destURL, deleteSource = false) { + assert(sourceURL !== destURL, () => `Old path and new path are the same: '${sourceURL}'`); + const loadHandlers = IORouterRegistry.getLoadHandlers(sourceURL); + assert(loadHandlers.length > 0, () => `Copying failed because no load handler is found for source URL ${sourceURL}.`); + assert(loadHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) load handlers for source URL ${sourceURL}.`); + const loadHandler = loadHandlers[0]; + const saveHandlers = IORouterRegistry.getSaveHandlers(destURL); + assert(saveHandlers.length > 0, () => `Copying failed because no save handler is found for destination URL ${destURL}.`); + assert(saveHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) save handlers for destination URL ${destURL}.`); + const saveHandler = saveHandlers[0]; + const sourceScheme = parseURL(sourceURL).scheme; + const sourcePath = parseURL(sourceURL).path; + const sameMedium = sourceScheme === parseURL(sourceURL).scheme; + const modelArtifacts = await loadHandler.load(); + if (deleteSource && sameMedium) { + await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath); + } + const saveResult = await saveHandler.save(modelArtifacts); + if (deleteSource && !sameMedium) { + await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath); + } + return saveResult.modelArtifactsInfo; +} +async function listModels() { + const schemes = ModelStoreManagerRegistry.getSchemes(); + const out = {}; + for (const scheme of schemes) { + const schemeOut = await ModelStoreManagerRegistry.getManager(scheme).listModels(); + for (const path in schemeOut) { + const url = scheme + URL_SCHEME_SUFFIX + path; + out[url] = schemeOut[path]; + } + } + return out; +} +async function removeModel(url) { + const schemeAndPath = parseURL(url); + const manager = ModelStoreManagerRegistry.getManager(schemeAndPath.scheme); + return manager.removeModel(schemeAndPath.path); +} +async function copyModel(sourceURL, destURL) { + const deleteSource = false; + return cloneModelInternal(sourceURL, destURL, deleteSource); +} +async function moveModel(sourceURL, destURL) { + const deleteSource = true; + return cloneModelInternal(sourceURL, destURL, deleteSource); +} +var PlatformBrowser = class { + fetch(path, init2) { + return fetch(path, init2); + } + now() { + return performance.now(); + } + encode(text, encoding) { + if (encoding !== "utf-8" && encoding !== "utf8") { + throw new Error(`Browser's encoder only supports utf-8, but got ${encoding}`); + } + if (this.textEncoder == null) { + this.textEncoder = new TextEncoder(); + } + return this.textEncoder.encode(text); + } + decode(bytes, encoding) { + return new TextDecoder(encoding).decode(bytes); + } +}; +if (env().get("IS_BROWSER")) { + env().setPlatform("browser", new PlatformBrowser()); + try { + ModelStoreManagerRegistry.registerManager(BrowserLocalStorage.URL_SCHEME, new BrowserLocalStorageManager()); + } catch (err) { + } + try { + ModelStoreManagerRegistry.registerManager(BrowserIndexedDB.URL_SCHEME, new BrowserIndexedDBManager()); + } catch (err) { + } +} +var getNodeFetch = { + importFetch: () => require_browser() +}; +var systemFetch; +var PlatformNode = class { + constructor() { + this.util = __require2("util"); + this.textEncoder = new this.util.TextEncoder(); + } + fetch(path, requestInits) { + if (env().global.fetch != null) { + return env().global.fetch(path, requestInits); + } + if (systemFetch == null) { + systemFetch = getNodeFetch.importFetch(); + } + return systemFetch(path, requestInits); + } + now() { + const time2 = process.hrtime(); + return time2[0] * 1e3 + time2[1] / 1e6; + } + encode(text, encoding) { + if (encoding !== "utf-8" && encoding !== "utf8") { + throw new Error(`Node built-in encoder only supports utf-8, but got ${encoding}`); + } + return this.textEncoder.encode(text); + } + decode(bytes, encoding) { + if (bytes.length === 0) { + return ""; + } + return new this.util.TextDecoder(encoding).decode(bytes); + } +}; +if (env().get("IS_NODE")) { + env().setPlatform("node", new PlatformNode()); +} +function buffer(shape, dtype = "float32", values) { + dtype = dtype || "float32"; + assertNonNegativeIntegerDimensions(shape); + return new TensorBuffer(shape, dtype, values); +} +function cast_(x, dtype) { + const $x = convertToTensor(x, "x", "cast"); + if (!isValidDtype(dtype)) { + throw new Error(`Failed to cast to unknown dtype ${dtype}`); + } + if (dtype === "string" && $x.dtype !== "string" || dtype !== "string" && $x.dtype === "string") { + throw new Error("Only strings can be casted to strings"); + } + const inputs = { x: $x }; + const attrs = { dtype }; + return ENGINE.runKernel(Cast, inputs, attrs); +} +var cast = op({ cast_ }); +function clone_(x) { + const $x = convertToTensor(x, "x", "clone", "string_or_numeric"); + const inputs = { x: $x }; + return ENGINE.runKernel(Identity, inputs); +} +var clone = op({ clone_ }); +function print2(x, verbose = false) { + console.log(x.toString(verbose)); +} +getOrMakeEngine(); +var opHandler2 = { + buffer, + cast, + clone, + print: print2 +}; +setOpHandler(opHandler2); +var io_exports = {}; +__export2(io_exports, { + browserFiles: () => browserFiles, + browserHTTPRequest: () => browserHTTPRequest, + concatenateArrayBuffers: () => concatenateArrayBuffers, + copyModel: () => copyModel, + decodeWeights: () => decodeWeights, + encodeWeights: () => encodeWeights, + fromMemory: () => fromMemory, + getLoadHandlers: () => getLoadHandlers, + getModelArtifactsInfoForJSON: () => getModelArtifactsInfoForJSON, + getSaveHandlers: () => getSaveHandlers, + http: () => http, + isHTTPScheme: () => isHTTPScheme, + listModels: () => listModels, + loadWeights: () => loadWeights, + moveModel: () => moveModel, + registerLoadRouter: () => registerLoadRouter, + registerSaveRouter: () => registerSaveRouter, + removeModel: () => removeModel, + weightsLoaderFactory: () => weightsLoaderFactory, + withSaveHandler: () => withSaveHandler +}); +var DEFAULT_FILE_NAME_PREFIX = "model"; +var DEFAULT_JSON_EXTENSION_NAME = ".json"; +var DEFAULT_WEIGHT_DATA_EXTENSION_NAME = ".weights.bin"; +function defer(f) { + return new Promise((resolve) => setTimeout(resolve)).then(f); +} +var BrowserDownloads = class { + constructor(fileNamePrefix) { + if (!env().getBool("IS_BROWSER")) { + throw new Error("browserDownloads() cannot proceed because the current environment is not a browser."); + } + if (fileNamePrefix.startsWith(BrowserDownloads.URL_SCHEME)) { + fileNamePrefix = fileNamePrefix.slice(BrowserDownloads.URL_SCHEME.length); + } + if (fileNamePrefix == null || fileNamePrefix.length === 0) { + fileNamePrefix = DEFAULT_FILE_NAME_PREFIX; + } + this.modelTopologyFileName = fileNamePrefix + DEFAULT_JSON_EXTENSION_NAME; + this.weightDataFileName = fileNamePrefix + DEFAULT_WEIGHT_DATA_EXTENSION_NAME; + } + async save(modelArtifacts) { + if (typeof document === "undefined") { + throw new Error("Browser downloads are not supported in this environment since `document` is not present"); + } + const weightsURL = window.URL.createObjectURL(new Blob([modelArtifacts.weightData], { type: "application/octet-stream" })); + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserDownloads.save() does not support saving model topology in binary formats yet."); + } else { + const weightsManifest = [{ + paths: ["./" + this.weightDataFileName], + weights: modelArtifacts.weightSpecs + }]; + const modelTopologyAndWeightManifest = { + modelTopology: modelArtifacts.modelTopology, + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy, + weightsManifest + }; + if (modelArtifacts.signature != null) { + modelTopologyAndWeightManifest.signature = modelArtifacts.signature; + } + if (modelArtifacts.userDefinedMetadata != null) { + modelTopologyAndWeightManifest.userDefinedMetadata = modelArtifacts.userDefinedMetadata; + } + if (modelArtifacts.modelInitializer != null) { + modelTopologyAndWeightManifest.modelInitializer = modelArtifacts.modelInitializer; + } + const modelTopologyAndWeightManifestURL = window.URL.createObjectURL(new Blob([JSON.stringify(modelTopologyAndWeightManifest)], { type: "application/json" })); + const jsonAnchor = this.jsonAnchor == null ? document.createElement("a") : this.jsonAnchor; + jsonAnchor.download = this.modelTopologyFileName; + jsonAnchor.href = modelTopologyAndWeightManifestURL; + await defer(() => jsonAnchor.dispatchEvent(new MouseEvent("click"))); + if (modelArtifacts.weightData != null) { + const weightDataAnchor = this.weightDataAnchor == null ? document.createElement("a") : this.weightDataAnchor; + weightDataAnchor.download = this.weightDataFileName; + weightDataAnchor.href = weightsURL; + await defer(() => weightDataAnchor.dispatchEvent(new MouseEvent("click"))); + } + return { modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts) }; + } + } +}; +BrowserDownloads.URL_SCHEME = "downloads://"; +var BrowserFiles = class { + constructor(files) { + if (files == null || files.length < 1) { + throw new Error(`When calling browserFiles, at least 1 file is required, but received ${files}`); + } + this.files = files; + } + async load() { + const jsonFile = this.files[0]; + const weightFiles = this.files.slice(1); + return new Promise((resolve, reject) => { + const jsonReader = new FileReader(); + jsonReader.onload = (event) => { + const modelJSON = JSON.parse(event.target.result); + const modelTopology = modelJSON.modelTopology; + if (modelTopology == null) { + reject(new Error(`modelTopology field is missing from file ${jsonFile.name}`)); + return; + } + if (weightFiles.length === 0) { + resolve({ modelTopology }); + } + const weightsManifest = modelJSON.weightsManifest; + if (weightsManifest == null) { + reject(new Error(`weightManifest field is missing from file ${jsonFile.name}`)); + return; + } + let pathToFile; + try { + pathToFile = this.checkManifestAndWeightFiles(weightsManifest, weightFiles); + } catch (err) { + reject(err); + return; + } + const weightSpecs = []; + const paths = []; + const perFileBuffers = []; + weightsManifest.forEach((weightsGroup) => { + weightsGroup.paths.forEach((path) => { + paths.push(path); + perFileBuffers.push(null); + }); + weightSpecs.push(...weightsGroup.weights); + }); + weightsManifest.forEach((weightsGroup) => { + weightsGroup.paths.forEach((path) => { + const weightFileReader = new FileReader(); + weightFileReader.onload = (event2) => { + const weightData = event2.target.result; + const index = paths.indexOf(path); + perFileBuffers[index] = weightData; + if (perFileBuffers.indexOf(null) === -1) { + const result = { + modelTopology, + weightSpecs, + weightData: concatenateArrayBuffers(perFileBuffers), + format: modelJSON.format, + generatedBy: modelJSON.generatedBy, + convertedBy: modelJSON.convertedBy + }; + if (modelJSON.signature != null) { + result.signature = modelJSON.signature; + } + if (modelJSON.userDefinedMetadata != null) { + result.userDefinedMetadata = modelJSON.userDefinedMetadata; + } + if (modelJSON.modelInitializer != null) { + result.modelInitializer = modelJSON.modelInitializer; + } + resolve(result); + } + }; + weightFileReader.onerror = (error) => reject(`Failed to weights data from file of path '${path}'.`); + weightFileReader.readAsArrayBuffer(pathToFile[path]); + }); + }); + }; + jsonReader.onerror = (error) => reject(`Failed to read model topology and weights manifest JSON from file '${jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`); + jsonReader.readAsText(jsonFile); + }); + } + checkManifestAndWeightFiles(manifest, files) { + const basenames = []; + const fileNames = files.map((file) => basename(file.name)); + const pathToFile = {}; + for (const group of manifest) { + group.paths.forEach((path) => { + const pathBasename = basename(path); + if (basenames.indexOf(pathBasename) !== -1) { + throw new Error(`Duplicate file basename found in weights manifest: '${pathBasename}'`); + } + basenames.push(pathBasename); + if (fileNames.indexOf(pathBasename) === -1) { + throw new Error(`Weight file with basename '${pathBasename}' is not provided.`); + } else { + pathToFile[path] = files[fileNames.indexOf(pathBasename)]; + } + }); + } + if (basenames.length !== files.length) { + throw new Error(`Mismatch in the number of files in weights manifest (${basenames.length}) and the number of weight files provided (${files.length}).`); + } + return pathToFile; + } +}; +var browserDownloadsRouter = (url) => { + if (!env().getBool("IS_BROWSER")) { + return null; + } else { + if (!Array.isArray(url) && url.startsWith(BrowserDownloads.URL_SCHEME)) { + return browserDownloads(url.slice(BrowserDownloads.URL_SCHEME.length)); + } else { + return null; + } + } +}; +IORouterRegistry.registerSaveRouter(browserDownloadsRouter); +function browserDownloads(fileNamePrefix = "model") { + return new BrowserDownloads(fileNamePrefix); +} +function browserFiles(files) { + return new BrowserFiles(files); +} +function monitorPromisesProgress(promises, onProgress, startFraction, endFraction) { + checkPromises(promises); + startFraction = startFraction == null ? 0 : startFraction; + endFraction = endFraction == null ? 1 : endFraction; + checkFraction(startFraction, endFraction); + let resolvedPromise = 0; + const registerMonitor = (promise) => { + promise.then((value) => { + const fraction = startFraction + ++resolvedPromise / promises.length * (endFraction - startFraction); + onProgress(fraction); + return value; + }); + return promise; + }; + function checkPromises(promises2) { + assert(promises2 != null && Array.isArray(promises2) && promises2.length > 0, () => "promises must be a none empty array"); + } + function checkFraction(startFraction2, endFraction2) { + assert(startFraction2 >= 0 && startFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got startFraction ${startFraction2}`); + assert(endFraction2 >= 0 && endFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got endFraction ${endFraction2}`); + assert(endFraction2 >= startFraction2, () => `startFraction must be no more than endFraction, but got startFraction ${startFraction2} and endFraction ${endFraction2}`); + } + return Promise.all(promises.map(registerMonitor)); +} +async function loadWeightsAsArrayBuffer(fetchURLs, loadOptions) { + if (loadOptions == null) { + loadOptions = {}; + } + const fetchFunc = loadOptions.fetchFunc == null ? env().platform.fetch : loadOptions.fetchFunc; + const requests = fetchURLs.map((fetchURL) => fetchFunc(fetchURL, loadOptions.requestInit, { isBinary: true })); + const fetchStartFraction = 0; + const fetchEndFraction = 0.5; + const responses = loadOptions.onProgress == null ? await Promise.all(requests) : await monitorPromisesProgress(requests, loadOptions.onProgress, fetchStartFraction, fetchEndFraction); + const bufferPromises = responses.map((response) => response.arrayBuffer()); + const bufferStartFraction = 0.5; + const bufferEndFraction = 1; + const buffers = loadOptions.onProgress == null ? await Promise.all(bufferPromises) : await monitorPromisesProgress(bufferPromises, loadOptions.onProgress, bufferStartFraction, bufferEndFraction); + return buffers; +} +async function loadWeights(manifest, filePathPrefix = "", weightNames, requestInit) { + const fetchWeights = (fetchUrls) => loadWeightsAsArrayBuffer(fetchUrls, { requestInit }); + const loadWeights2 = weightsLoaderFactory(fetchWeights); + return loadWeights2(manifest, filePathPrefix, weightNames); +} +function weightsLoaderFactory(fetchWeightsFunction) { + return async (manifest, filePathPrefix = "", weightNames) => { + const groupIndicesToFetchMap = manifest.map(() => false); + const groupWeightsToFetch = {}; + const weightsFound = weightNames != null ? weightNames.map(() => false) : []; + const allManifestWeightNames = []; + manifest.forEach((manifestGroupConfig, groupIndex) => { + let groupOffset = 0; + manifestGroupConfig.weights.forEach((weightsEntry) => { + const rawDtype = "quantization" in weightsEntry ? weightsEntry.quantization.dtype : weightsEntry.dtype; + const weightsBytes = DTYPE_VALUE_SIZE_MAP[rawDtype] * sizeFromShape(weightsEntry.shape); + const enqueueWeightsForFetchingFn = () => { + groupIndicesToFetchMap[groupIndex] = true; + if (groupWeightsToFetch[groupIndex] == null) { + groupWeightsToFetch[groupIndex] = []; + } + groupWeightsToFetch[groupIndex].push({ + manifestEntry: weightsEntry, + groupOffset, + sizeBytes: weightsBytes + }); + }; + if (weightNames != null) { + weightNames.forEach((weightName, weightIndex) => { + if (weightName === weightsEntry.name) { + enqueueWeightsForFetchingFn(); + weightsFound[weightIndex] = true; + } + }); + } else { + enqueueWeightsForFetchingFn(); + } + allManifestWeightNames.push(weightsEntry.name); + groupOffset += weightsBytes; + }); + }); + if (!weightsFound.every((found) => found)) { + const weightsNotFound = weightNames.filter((_, i) => !weightsFound[i]); + throw new Error(`Could not find weights in manifest with names: ${weightsNotFound.join(", ")}. +Manifest JSON has weights with names: ${allManifestWeightNames.join(", ")}.`); + } + const groupIndicesToFetch = groupIndicesToFetchMap.reduce((accumulator, shouldFetch, i) => { + if (shouldFetch) { + accumulator.push(i); + } + return accumulator; + }, []); + const fetchUrls = []; + groupIndicesToFetch.forEach((i) => { + manifest[i].paths.forEach((filepath) => { + const fetchUrl = filePathPrefix + (!filePathPrefix.endsWith("/") ? "/" : "") + filepath; + fetchUrls.push(fetchUrl); + }); + }); + const buffers = await fetchWeightsFunction(fetchUrls); + const weightsTensorMap = {}; + let bufferIndexOffset = 0; + groupIndicesToFetch.forEach((i) => { + const numBuffers = manifest[i].paths.length; + let groupBytes = 0; + for (let i2 = 0; i2 < numBuffers; i2++) { + groupBytes += buffers[bufferIndexOffset + i2].byteLength; + } + const groupBuffer = new ArrayBuffer(groupBytes); + const groupByteBuffer = new Uint8Array(groupBuffer); + let groupBufferOffset = 0; + for (let i2 = 0; i2 < numBuffers; i2++) { + const buffer2 = new Uint8Array(buffers[bufferIndexOffset + i2]); + groupByteBuffer.set(buffer2, groupBufferOffset); + groupBufferOffset += buffer2.byteLength; + } + const weightsEntries = groupWeightsToFetch[i]; + weightsEntries.forEach((weightsEntry) => { + const byteBuffer = groupBuffer.slice(weightsEntry.groupOffset, weightsEntry.groupOffset + weightsEntry.sizeBytes); + const nameToTensorMap = decodeWeights(byteBuffer, [weightsEntry.manifestEntry]); + for (const name6 in nameToTensorMap) { + weightsTensorMap[name6] = nameToTensorMap[name6]; + } + }); + bufferIndexOffset += numBuffers; + }); + return weightsTensorMap; + }; +} +var OCTET_STREAM_MIME_TYPE = "application/octet-stream"; +var JSON_TYPE = "application/json"; +var HTTPRequest = class { + constructor(path, loadOptions) { + this.DEFAULT_METHOD = "POST"; + if (loadOptions == null) { + loadOptions = {}; + } + this.weightPathPrefix = loadOptions.weightPathPrefix; + this.onProgress = loadOptions.onProgress; + this.weightUrlConverter = loadOptions.weightUrlConverter; + if (loadOptions.fetchFunc != null) { + assert(typeof loadOptions.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 = loadOptions.fetchFunc; + } else { + this.fetch = env().platform.fetch; + } + assert(path != null && path.length > 0, () => "URL path for http must not be null, undefined or empty."); + if (Array.isArray(path)) { + assert(path.length === 2, () => `URL paths for http must have a length of 2, (actual length is ${path.length}).`); + } + this.path = path; + if (loadOptions.requestInit != null && loadOptions.requestInit.body != null) { + throw new Error("requestInit is expected to have no pre-existing body, but has one."); + } + this.requestInit = loadOptions.requestInit || {}; + } + async save(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet."); + } + const init2 = Object.assign({ method: this.DEFAULT_METHOD }, this.requestInit); + init2.body = new FormData(); + const weightsManifest = [{ + paths: ["./model.weights.bin"], + weights: modelArtifacts.weightSpecs + }]; + const modelTopologyAndWeightManifest = { + modelTopology: modelArtifacts.modelTopology, + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy, + weightsManifest + }; + if (modelArtifacts.signature != null) { + modelTopologyAndWeightManifest.signature = modelArtifacts.signature; + } + if (modelArtifacts.userDefinedMetadata != null) { + modelTopologyAndWeightManifest.userDefinedMetadata = modelArtifacts.userDefinedMetadata; + } + if (modelArtifacts.modelInitializer != null) { + modelTopologyAndWeightManifest.modelInitializer = modelArtifacts.modelInitializer; + } + init2.body.append("model.json", new Blob([JSON.stringify(modelTopologyAndWeightManifest)], { type: JSON_TYPE }), "model.json"); + if (modelArtifacts.weightData != null) { + init2.body.append("model.weights.bin", new Blob([modelArtifacts.weightData], { type: OCTET_STREAM_MIME_TYPE }), "model.weights.bin"); + } + const response = await this.fetch(this.path, init2); + if (response.ok) { + return { + modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts), + responses: [response] + }; + } else { + throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${response.status}.`); + } + } + async load() { + const modelConfigRequest = await this.fetch(this.path, this.requestInit); + if (!modelConfigRequest.ok) { + throw new Error(`Request to ${this.path} failed with status code ${modelConfigRequest.status}. Please verify this URL points to the model JSON of the model to load.`); + } + let modelConfig; + try { + modelConfig = await modelConfigRequest.json(); + } catch (e) { + let message = `Failed to parse model JSON of response from ${this.path}.`; + if (this.path.endsWith(".pb")) { + message += " 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."; + } else { + message += " Please make sure the server is serving valid JSON for this request."; + } + throw new Error(message); + } + const modelTopology = modelConfig.modelTopology; + const weightsManifest = modelConfig.weightsManifest; + const generatedBy = modelConfig.generatedBy; + const convertedBy = modelConfig.convertedBy; + const format = modelConfig.format; + const signature = modelConfig.signature; + const userDefinedMetadata = modelConfig.userDefinedMetadata; + if (modelTopology == null && weightsManifest == null) { + throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`); + } + let weightSpecs; + let weightData; + if (weightsManifest != null) { + const results = await this.loadWeights(weightsManifest); + [weightSpecs, weightData] = results; + } + const artifacts = { + modelTopology, + weightSpecs, + weightData, + generatedBy, + convertedBy, + format + }; + if (signature != null) { + artifacts.signature = signature; + } + if (userDefinedMetadata != null) { + artifacts.userDefinedMetadata = userDefinedMetadata; + } + const initializer = modelConfig.modelInitializer; + if (initializer) { + artifacts.modelInitializer = initializer; + } + return artifacts; + } + async loadWeights(weightsManifest) { + const weightPath = Array.isArray(this.path) ? this.path[1] : this.path; + const [prefix, suffix] = parseUrl(weightPath); + const pathPrefix = this.weightPathPrefix || prefix; + const weightSpecs = []; + for (const entry of weightsManifest) { + weightSpecs.push(...entry.weights); + } + const fetchURLs = []; + const urlPromises = []; + for (const weightsGroup of weightsManifest) { + for (const path of weightsGroup.paths) { + if (this.weightUrlConverter != null) { + urlPromises.push(this.weightUrlConverter(path)); + } else { + fetchURLs.push(pathPrefix + path + suffix); + } + } + } + if (this.weightUrlConverter) { + fetchURLs.push(...await Promise.all(urlPromises)); + } + const buffers = await loadWeightsAsArrayBuffer(fetchURLs, { + requestInit: this.requestInit, + fetchFunc: this.fetch, + onProgress: this.onProgress + }); + return [weightSpecs, concatenateArrayBuffers(buffers)]; + } +}; +HTTPRequest.URL_SCHEME_REGEX = /^https?:\/\//; +function parseUrl(url) { + const lastSlash = url.lastIndexOf("/"); + const lastSearchParam = url.lastIndexOf("?"); + const prefix = url.substring(0, lastSlash); + const suffix = lastSearchParam > lastSlash ? url.substring(lastSearchParam) : ""; + return [prefix + "/", suffix]; +} +function isHTTPScheme(url) { + return url.match(HTTPRequest.URL_SCHEME_REGEX) != null; +} +var httpRouter = (url, loadOptions) => { + if (typeof fetch === "undefined" && (loadOptions == null || loadOptions.fetchFunc == null)) { + return null; + } else { + let isHTTP = true; + if (Array.isArray(url)) { + isHTTP = url.every((urlItem) => isHTTPScheme(urlItem)); + } else { + isHTTP = isHTTPScheme(url); + } + if (isHTTP) { + return http(url, loadOptions); + } + } + return null; +}; +IORouterRegistry.registerSaveRouter(httpRouter); +IORouterRegistry.registerLoadRouter(httpRouter); +function http(path, loadOptions) { + return new HTTPRequest(path, loadOptions); +} +function browserHTTPRequest(path, loadOptions) { + return http(path, loadOptions); +} +var PassthroughLoader = class { + constructor(modelArtifacts) { + this.modelArtifacts = modelArtifacts; + } + async load() { + return this.modelArtifacts; + } +}; +var PassthroughSaver = class { + constructor(saveHandler) { + this.saveHandler = saveHandler; + } + async save(modelArtifacts) { + return this.saveHandler(modelArtifacts); + } +}; +function fromMemory(modelArtifacts, weightSpecs, weightData, trainingConfig) { + if (arguments.length === 1) { + const isModelArtifacts = modelArtifacts.modelTopology != null || modelArtifacts.weightSpecs != null; + if (isModelArtifacts) { + return new PassthroughLoader(modelArtifacts); + } else { + 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."); + return new PassthroughLoader({ modelTopology: modelArtifacts }); + } + } else { + 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."); + return new PassthroughLoader({ + modelTopology: modelArtifacts, + weightSpecs, + weightData, + trainingConfig + }); + } +} +function withSaveHandler(saveHandler) { + return new PassthroughSaver(saveHandler); +} +var math_exports = {}; +__export2(math_exports, { + confusionMatrix: () => confusionMatrix +}); +function matMul_(a, b, transposeA = false, transposeB = false) { + let $a = convertToTensor(a, "a", "matMul"); + let $b = convertToTensor(b, "b", "matMul"); + [$a, $b] = makeTypesMatch($a, $b); + const inputs = { a: $a, b: $b }; + const attrs = { transposeA, transposeB }; + return ENGINE.runKernel(BatchMatMul, inputs, attrs); +} +var matMul = op({ matMul_ }); +function oneHot_(indices, depth, onValue = 1, offValue = 0) { + if (depth < 2) { + throw new Error(`Error in oneHot: depth must be >=2, but it is ${depth}`); + } + const $indices = convertToTensor(indices, "indices", "oneHot", "int32"); + const inputs = { indices: $indices }; + const attrs = { depth, onValue, offValue }; + return ENGINE.runKernel(OneHot, inputs, attrs); +} +var oneHot = op({ oneHot_ }); +function transpose_(x, perm) { + const $x = convertToTensor(x, "x", "transpose"); + if (perm == null) { + perm = $x.shape.map((s, i) => i).reverse(); + } + assert($x.rank === perm.length, () => `Error in transpose: rank of input ${$x.rank} must match length of perm ${perm}.`); + perm.forEach((axis) => { + assert(axis >= 0 && axis < $x.rank, () => `All entries in 'perm' must be between 0 and ${$x.rank - 1} but got ${perm}`); + }); + if ($x.rank <= 1) { + return $x.clone(); + } + const inputs = { x: $x }; + const attrs = { perm }; + return ENGINE.runKernel(Transpose, inputs, attrs); +} +var transpose = op({ transpose_ }); +function confusionMatrix_(labels2, predictions, numClasses) { + const $labels = convertToTensor(labels2, "labels", "confusionMatrix"); + const $predictions = convertToTensor(predictions, "predictions", "confusionMatrix"); + assert(numClasses == null || numClasses > 0 && Number.isInteger(numClasses), () => `If provided, numClasses must be a positive integer, but got ${numClasses}`); + assert($labels.rank === 1, () => `Expected the rank of labels to be 1, but got ${$labels.rank}`); + assert($predictions.rank === 1, () => `Expected the rank of predictions to be 1, but got ${$predictions.rank}`); + assert($labels.shape[0] === $predictions.shape[0], () => `Mismatch in the number of examples: ${$labels.shape[0]} vs. ${$predictions.shape[0]}. Labels and predictions should have the same number of elements.`); + assert(numClasses > 0 && Number.isInteger(numClasses), () => `numClasses is required to be a positive integer, but got ${numClasses}`); + const oneHotLabels = oneHot(cast($labels, "int32"), numClasses); + const oneHotPredictions = oneHot(cast($predictions, "int32"), numClasses); + const oneHotLabelsT = transpose(oneHotLabels); + const product = matMul(oneHotLabelsT, oneHotPredictions); + return cast(product, "int32"); +} +var confusionMatrix = op({ confusionMatrix_ }); +var browser_exports = {}; +__export2(browser_exports, { + fromPixels: () => fromPixels, + fromPixelsAsync: () => fromPixelsAsync, + toPixels: () => toPixels +}); +function tensor3d(values, shape, dtype) { + assertNonNull(values); + if (shape != null && shape.length !== 3) { + throw new Error("tensor3d() requires shape to have three numbers"); + } + const inferredShape = inferShape(values, dtype); + if (inferredShape.length !== 3 && inferredShape.length !== 1) { + throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray"); + } + if (inferredShape.length === 1 && shape == null) { + throw new Error("tensor3d() requires shape to be provided when `values` are a flat array"); + } + return makeTensor(values, shape, inferredShape, dtype); +} +var fromPixels2DContext; +function fromPixels_(pixels, numChannels = 3) { + if (numChannels > 4) { + throw new Error("Cannot construct Tensor with more than 4 channels from pixels."); + } + if (pixels == null) { + throw new Error("pixels passed to tf.browser.fromPixels() can not be null"); + } + let isPixelData2 = false; + let isImageData = false; + let isVideo = false; + let isImage = false; + let isCanvasLike = false; + let isImageBitmap = false; + if (pixels.data instanceof Uint8Array) { + isPixelData2 = true; + } else if (typeof ImageData !== "undefined" && pixels instanceof ImageData) { + isImageData = true; + } else if (typeof HTMLVideoElement !== "undefined" && pixels instanceof HTMLVideoElement) { + isVideo = true; + } else if (typeof HTMLImageElement !== "undefined" && pixels instanceof HTMLImageElement) { + isImage = true; + } else if (pixels.getContext != null) { + isCanvasLike = true; + } else if (typeof ImageBitmap !== "undefined" && pixels instanceof ImageBitmap) { + isImageBitmap = true; + } 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 ${pixels.constructor.name}`); + } + if (isVideo) { + const HAVE_CURRENT_DATA_READY_STATE = 2; + if (isVideo && pixels.readyState < HAVE_CURRENT_DATA_READY_STATE) { + throw new Error("The video element has not loaded data yet. Please wait for `loadeddata` event on the